############################## イベントウェブフック ############################## 概要 ==== Sora は、予め設定しておいた URL に、シグナリングの接続や切断、 録画の終了といった様々なイベントを HTTP リクエストとして送信するウェブフックの機能を持っています。 この機能を使うことで、Sora のイベントをアプリケーション側と簡単に連携できます。 注意 ==== ``sora.conf`` の :ref:`event_webhook_url` を有効にしない場合でも ``log/event_webhook.jsonl`` は生成されます。 設定 ==== event_webhook_url ------------------ :デフォルト: 未設定 イベントウェブフックリクエスト送信先の URL です。イベントウェブフック機能を利用する場合は指定してください。 この URL には HTTPS の URL を指定することもできます。 HTTPS の URL を指定する場合、リクエスト送信先のアプリケーションについて基本的には正規の認証局から発行された証明書を利用してください。 独自の証明書を利用する場合は :ref:`webhook-self-signed-certificate` をご確認ください。 HTTP のレスポンスは 200 OK 等の 200 番台のステータスコードの必要があります。 connection_updated_webhook_interval ------------------------------------------ :デフォルト: ``1 min`` イベントウェブフック ``connection.updated`` の送信間隔を設定します。設定は分単位 (min) のみで行えます。 詳細は :ref:`sora_conf-connection_updated_webhook_interval` をご確認ください。 ignore_connection_updated_webhook ------------------------------------------ :デフォルト: false イベントウェブフック ``connection.updated`` の送信有無を設定します。 詳細は :ref:`sora_conf-ignore_connection_updated_webhook` をご確認ください。 HTTP ヘッダー ======================= .. warning:: この機能は :doc:`実験的機能 ` のため、正式版では仕様が変更される可能性があります .. note:: JSON のパース時の判断などに利用してください。 sora-event-webhook-type ------------------------------- .. attention:: ``x-sora-event-webhook-type`` は非推奨です、 ``sora-event-webhook-type`` を利用してください イベントウェブフックの HTTP ヘッダー に ``sora-event-webhook-type`` と ``x-sora-event-webhook-type`` というヘッダー名でイベントウェブフックのタイプが入ってきます。 ``type`` が ``connection.created`` の場合は ``sora-event-webhook-type: connection.created`` と ``x-sora-event-webhook-type: connection.created`` のように値が入ってきます。 sora-session-id ----------------------------------- イベントウェブフックの HTTP ヘッダー に ``sora-session-id`` というヘッダー名でセッション ID が入ってきます。 セッション ID が ``46NNAV9S0X3TD778A1JBYYCBS8`` の場合は ``sora-session-id: 46NNAV9S0X3TD778A1JBYYCBS8`` のように値が入ってきます。 sora-connection-id ----------------------------------- イベントウェブフックの HTTP ヘッダー に ``sora-connection-id`` というヘッダー名でコネクション ID が入ってきます。 セッション ID が ``7WSWCM0Z2H0614W5PJERR3F5WR`` の場合は ``sora-connection-id: 7WSWCM0Z2H0614W5PJERR3F5WR`` のように値が入ってきます。 接続イベント ============ - ``connection.created`` と ``connection.destroyed`` はセットです。 - ``connection.created`` がリクエスト送信されずに ``connection.destroyed`` がリクエスト送信されることはありません。 - ``connection.created`` がリクエスト送信された場合、 ``connection.destroyed`` が **必ず** リクエスト送信されます。 - ``connection.created`` の後に ``connection.destroyed`` がリクエスト送信されます。順番は保証されます。 共通項目 -------- - id - イベントごとの ID です - version - Sora のバージョンが ``文字列`` で入ってきます - label - sora.conf の label で指定した値が入ってきます - node_name - Sora のノード名が入ってきます - log_written - イベントウェブフックログの書き込みが成功したかどうかが入ってきます - 書き込みが成功した場合は ``true`` が入ってきます - minutes - 接続経過時間 (分) が入ってきます - created_time - connection.created 時の時間が UNIX 時間形式で入ってきます - created_timestamp - connection.created 時の時間が RFC 3339 UTC 形式 (マイクロ秒) で入ってきます - total_received_bytes - Sora がクライアントから受信したパケットの合計数です - total_sent_bytes - Sora がクライアントへ送信したパケットの合計数です - turn_transport_type - udp か tcp が入ってきます - TURN-UDP または TURN-TCP (TURN-TLS 含む) のどちらを使用したかがわかります - audio - ``true`` または ``false`` が入ってきます - ``false`` の場合は ``audio`` を使用しません - audio_codec_type - **この項目はオプションです** - ``audio`` が ``false`` の場合は含まれません - コーデックの種類は ``OPUS`` または ``LYRA`` です - audio_bit_rate - **この項目はオプションです** - ``audio`` が ``false`` やクライアントが送ってこない場合、含まれません - この設定は ``audio_codec_type`` が ``OPUS`` の時のみ有効です - :ref:`default_audio_bit_rate` に値を指定していた場合はその値が利用されます - 最小が 6 で、最大が 510 です - 単位は ``kbps`` です - video - ``true`` または ``false`` が入ってきます - ``false`` の場合は ``video`` を使用しません - video_codec_type - **この項目はオプションです** - ``video`` が ``false`` の場合は含まれません - コーデックはクライアントが送ってこない場合はデフォルトで ``VP9`` が使用されます - コーデックの種類は ``VP8``、 ``VP9``、 ``AV1``、 ``H264``、 ``H265`` です - video_bit_rate - **この項目はオプションです** - ``video`` が ``false`` の場合は含まれません - ビットレートはクライアントが送ってこない場合は ``sora.conf`` の :ref:`default_video_bit_rate` が使用されます - デフォルトは 500 です - 最小が 1 で、最大が 30000 です - 15000 より大きい値は現時点でサポート範囲外です - 単位は ``kbps`` です - video_vp9_params - **この項目はオプションです** - ``video`` が ``false`` の場合は含まれません - 詳細は :ref:`signaling-vp9-params` をご確認ください - video_av1_params - **この項目はオプションです** - ``video`` が ``false`` の場合は含まれません - 詳細は :ref:`signaling-av1-params` をご確認ください - video_h264_params - **この項目はオプションです** - ``video`` が ``false`` の場合は含まれません - 詳細は :ref:`signaling-h264-params` をご確認ください - video_h265_params - **この項目はオプションです** - ``video`` が ``false`` の場合は含まれません - 詳細は :ref:`signaling-h265-params` をご確認ください - multistream - true の場合はマルチストリームが有効な接続です - simulcast - true の場合はサイマルキャストが有効な接続です - spotlight - true の場合はスポットライトが有効な接続です - role - ``sendrecv`` (送受信) / ``sendonly`` (送信のみ) / ``recvonly`` (受信のみ) - event_metadata - この項目はオプションです - サーバーが定義を自由にできる値です - 認証サーバーから event_metadata を返した値が含まれます - 詳細は :ref:`event_metadata の払い出し` をご確認ください - channel_id - コネクションが接続しているチャネル ID です - session_id - コネクションが接続しているチャネル の現在のセッションの ID です - UUIDv4 を Base32 でエンコードした 26 バイトの文字列です - client_id - コネクションに割り当てられたクライアント ID です - bundle_id - コネクションに割り当てられたバンドル ID です - connection_id - コネクションに割り当てられたユニークな ID です - UUIDv4 を Base32 でエンコードした 26 バイトの文字列です - ice_connection_state - total_checking_duration_ms - ICE 接続の状態が ``checking`` になった時間の合計 (ミリ秒) です - total_disconnected_duration_ms - ICE 接続の状態が ``disconnected`` になった時間の合計 (ミリ秒) です - recording_block - 録画(セッション単位)時に録画をブロックするかどうかが入ってきます - ``true`` であれば録画をブロックします - ``false`` であれば録画をブロックしません .. _event-webhook-connection.created: connection.created ------------------ **接続** シグナリングの接続が成功して、WebRTC としての通信が開始できるようになった時の状態を送信します。 - data.channel_connections - 現在そのチャネルに接続しているクライアントの接続数です - 自分は含まれます - data.channel_sendrecv_connections - 現在そのチャネルで送受信している配信者の接続数です - 自分は含まれます - data.channel_sendonly_connections - 現在そのチャネルを送信のみしている配信者の接続数です - 自分は含まれます - data.channel_recvonly_connections - 現在そのチャネルを受信のみしている視聴者の接続数です - 自分は含まれます .. code-block:: javascript { "type": "connection.created", "channel_id": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "timestamp": "", "event_metadata": "", "data": { "ice_connection_state": { "total_checking_duration_ms": "", "total_disconnected_duration_ms": "" }, "recording_block": "", "created_time": "", "created_timestamp": "", "audio": "", "audio_codec_type": "", "channel_connections": "", "channel_recvonly_connections": "", "channel_sendonly_connections": "", "channel_sendrecv_connections": "", "minutes": "", "total_received_bytes": "", "total_sent_bytes": "", "turn_transport_type": "", "video": "", "video_bit_rate": "", "video_codec_type": "" }, "id": "", "label": "", "node_name": "", "log_written": "", "role": "", "multistream": "", "simulcast": "", "spotlight": "", "version": "" } .. _event-webhook-connection.destroyed: connection.destroyed -------------------- **切断** シグナリングの接続が切断した時に送信します。 - data.type_disconnect_reason - ``"type": "disconnect"`` 送信時に ``"reason"`` に指定した **文字列** が入ります - ``"reason"`` を指定していなかった場合、この項目は含まれません - data.disconnect_api_reason - DisconnectChannel API または Disconnect API を利用して切断した際、オプションの ``"reason"`` に指定した **JSON オブジェクト** がこの ``"reason"`` に含まれます - ``"reason"`` を指定していなかった場合、この項目は含まれません - data.reason - 基本的には ``data.disconnect_api_reason`` と同様です - ただし ``"reason"`` を指定していなかった場合に、項目が省略されるのではなく、値に null が入る点が異なっています - data.channel_connections - 現在そのチャネルに接続しているクライアントの接続数です - 自分は含まれません - data.channel_sendrecv_connections - 現在そのチャネルで送受信している配信者の接続数です - 自分は含まれません - data.channel_sendonly_connections - 現在そのチャネルを送信のみしている配信者の接続数です - 自分は含まれません - data.channel_recvonly_connections - 現在そのチャネルを受信のみしている視聴者の接続数です - 自分は含まれません - data.destroyed_time - connection.destroyed 時の時間が UNIX 時間形式で入ってきます - data.destroyed_timestamp - connection.destroyed 時の時間が RFC 3339 UTC 形式 (マイクロ秒) で入ってきます .. code-block:: javascript { "type": "connection.destroyed", "channel_id": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "timestamp": "", "event_metadata": "", "data": { "ice_connection_state": { "total_checking_duration_ms": "", "total_disconnected_duration_ms": "" }, "recording_block": "", "created_time": "", "created_timestamp": "", "destroyed_time": "", "destroyed_timestamp": "", "audio": "", "audio_codec_type": "", "channel_connections": "", "channel_recvonly_connections": "", "channel_sendonly_connections": "", "channel_sendrecv_connections": "", "minutes": "", "reason": "", "type_disconnect_reason": "", "total_received_bytes": "", "total_sent_bytes": "", "turn_transport_type": "", "video": "", "video_bit_rate": "", "video_codec_type": "" }, "id": "", "label": "", "node_name": "", "log_written": "", "role": "", "multistream": "", "simulcast": "", "spotlight": "", "version": "" } .. _event-webhook-connection.updated: connection.updated ------------------ **接続状態更新** .. note:: このウェブフックリクエストの送信を停止することができます。 ``sora.conf`` の :ref:`sora_conf-ignore_connection_updated_webhook` を ``true`` にしてください。 ``connection.created`` を送信したタイミングから、クライアントごとの接続状態が、それぞれ一定間隔で送信されます。 送信間隔はデフォルトで 1 分です。 :ref:`sora_conf-connection_updated_webhook_interval` で送信間隔を変更できます。 - data.channel_connections - 現在そのチャネルに接続しているクライアントの接続数です - 自分が含まれます - data.channel_sendrecv_connections - 現在そのチャネルで送受信している配信者の接続数です - 自分が含まれます - data.channel_sendonly_connections - 現在そのチャネルを送信のみしている配信者の接続数です - 自分が含まれます - data.channel_recvonly_connections - 現在そのチャネルを受信のみしている視聴者の接続数です - 自分が含まれます .. code-block:: javascript { "type": "connection.updated", "channel_id": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "timestamp": "", "event_metadata": "", "data": { "ice_connection_state": { "total_checking_duration_ms": "", "total_disconnected_duration_ms": "" }, "recording_block": "", "audio": "", "audio_codec_type": "", "channel_connections": , "channel_recvonly_connections": "", "channel_sendonly_connections": "", "channel_sendrecv_connections": "", "created_time": "", "created_timestamp": "", "minutes": "", "total_received_bytes": "", "total_sent_bytes": "", "turn_transport_type": "", "video": "", "video_bit_rate": "", "video_codec_type": "" }, "id": "", "label": "", "node_name": "", "log_written": "", "role": "", "multistream": "", "simulcast": "", "spotlight": "", "version": "" } .. _event-webhook-connection.failed: connection.failed ----------------- **接続失敗** .. important:: このイベントを受信する場合は、 ``sora.conf`` にて :ref:`ignore_connection_failed_webhook` を無効にする必要があります。 シグナリング接続 **成功前** に失敗や異常が起きたりした場合に送信されます。 シグナリング接続成功後に失敗や異常が起きた場合は、 :ref:`connection.destroyed ` が送信されます。 .. code-block:: javascript { "type": "connection.failed", "id": "", "role": "", "channel_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "timestamp": "", "data": { "message": "", "channel_connections": "", "channel_sendrecv_connections": "", "channel_sendonly_connections": "", "channel_recvonly_connections": "", "total_received_bytes": "", "total_sent_bytes": "" }, "label": "", "node_name": "", "log_written": "", "multistream": "", "simulcast": "", "spotlight": "", "version": "" } 録画・録音イベント ================== .. _event-webhook-recording.started: recording.started ------------------- .. important:: このイベントには ``event_metadata`` は含まれません **録画開始** - data.start_timestamp - :ref:`20161101.StartRecording` API を実行したタイムスタンプが入ります - data.expire_time - :ref:`20161101.StartRecording` API で指定した expire_time が入ります - data.expired_at - :ref:`20161101.StartRecording` API で指定した expire_time から計算した有効期限が入ります - data.split_duration - **この項目はオプションです** - :ref:`20161101.StartRecording` API で指定した split_duration が入ります - 指定していない場合は ``split_duration`` の項目が入ってきません - data.split_only - **この項目はオプションです** - :ref:`20161101.StartRecording` API で指定した split_only が入ります - 指定していない場合は ``false`` が入ります - data.metadata - **この項目はオプションです** - :ref:`20161101.StartRecording` API で指定した metadata が入ります - 指定していない場合は ``metadata`` の項目が入ってきません .. code-block:: javascript { "type": "recording.started", "id": "", "version": "", "label": "", "node_name": "", "log_written": "", "channel_id": "", "timestamp": "", "data": { "channel_id": "", "recording_id": "", "metadata": "", "split_only": "", "created_at": "", "expire_time": "", "expired_at": "", "start_timestamp": "", "split_duration": "" } } .. _event-webhook-recording.report: recording.report ---------------- .. important:: このイベントには ``event_metadata`` は含まれません **録画結果報告** - data.archives[].start_time_offset - :ref:`20161101.StartRecording` API を叩いてから何秒経過した後にこの録画が開始したかを表しています - data.archives[].stop_time_offset - :ref:`20161101.StartRecording` API を叩いてから何秒経過した後にこの録画が終了したかを表しています - data.metadata - :ref:`20161101.StartRecording` API で指定した metadata が入ります - 指定していない場合は ``metadata`` の項目が入ってきません - data.expired_at - 期限が切れた日時を UNIX Time で返します 一括録画時 recording.report ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: javascript { "type": "recording.report", "id": "", "version": "", "label": "", "node_name": "", "log_written": "", "channel_id": "", "timestamp": "", "data": { "channel_id": "", "recording_id": "", "metadata": "", "split_only": "", "created_at": "", "expire_time": "", "expired_at": "", "file_path": "", "filename": "", "file_written": "", "start_timestamp": "", "stop_timestamp": "", "archives": [ { "label": "", "node_name": "", "client_id": "", "bundle_id": "", "connection_id": "", "file_path": "", "filename": "", "metadata_file_path": "", "metadata_filename": "", "start_time_offset": "", "start_timestamp": "", "stop_time_offset": "", "stop_timestamp": "", "size": "" }, { "label": "", "node_name": "", "client_id": "", "bundle_id": "", "connection_id": "", "file_path": "", "filename": "", "metadata_file_path": "", "metadata_filename": "", "start_time_offset": "", "start_timestamp": "", "stop_time_offset": "", "stop_timestamp": "", "size": "" } ], "failed_archives": [ { "label": "", "node_name": "", "client_id": "", "bundle_id": "", "connection_id": "" }, { "label": "", "node_name": "", "client_id": "", "bundle_id": "", "connection_id": "" } ] } } 分割録画時 recording.report ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: javascript { "type": "recording.report", "id": "", "version": "", "label": "", "node_name": "", "log_written": "", "channel_id": "", "timestamp": "", "data": { "channel_id": "", "recording_id": "", "metadata": "", "split_only": "", "split_duration": "", "created_at": "", "expire_time": "", "expired_at": "", "file_path": "", "filename": "", "file_written": "", "start_timestamp": "", "stop_timestamp": "", "archives": [ { "label": "", "node_name": "", "client_id": "", "bundle_id": "", "connection_id": "", "start_time_offset": "", "start_timestamp": "", "stop_time_offset": "", "stop_timestamp": "", "split_last_index": "" }, { "label": "", "node_name": "", "client_id": "", "bundle_id": "", "connection_id": "", "start_time_offset": "", "start_timestamp": "", "stop_time_offset": "", "stop_timestamp": "", "split_last_index": "" } ], "failed_archives": [ { "label": "", "node_name": "", "client_id": "", "bundle_id": "", "connection_id": "" }, { "label": "", "node_name": "", "client_id": "", "bundle_id": "", "connection_id": "" } ] } } 録画・録音保存イベント ====================== .. _event-webhook-archive.started: archive.started ----------------- **録画ファイル保存開始** - data.start_timestamp - この録画が開始された時間 (UTC) を RFC 3339 形式 (マイクロ秒) で表しています .. code-block:: javascript { "type": "archive.started", "id": "", "version": "", "label": "", "node_name": "", "log_written": "", "channel_id": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "timestamp": "", "event_metadata": "", "data": { "channel_id": "", "recording_id": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "created_at": "", "audio": true, "audio_codec_type": "", "video": true, "video_codec_type": "", "video_bit_rate": "", "start_time": "", "start_time_offset": "", "start_timestamp": "" } } .. _event-webhook-archive.available: archive.available ----------------- **録画保存ファイル出力** - data.start_timestamp - この録画が開始された時間 (UTC) を RFC 3339 形式 (マイクロ秒) で表しています - data.stop_timestamp - この録画が終了した時間(UTC) を RFC 3339 形式 (マイクロ秒) で表しています - data.start_time - この録画が開始された時間を UNIX 時間形式で表しています - data.stop_time - この録画が終了した時間を UNIX 時間形式で表しています - data.start_time_offset - :ref:`20161101.StartRecording` API を叩いてから何秒経過した後にこの録画が開始したかを表しています - data.stop_time_offset - :ref:`20161101.StartRecording` API を叩いてから何秒経過した後にこの録画が終了したかを表しています - data.stats - サポート向けに、録画に使用したパケット情報の統計を格納しています - 内部向け情報のため、予告なく変更されることがあります .. code-block:: javascript { "type": "archive.available", "id": "", "version": "", "label": "", "node_name": "", "log_written": "", "channel_id": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "timestamp": "", "event_metadata": "", "data": { "channel_id": "", "recording_id": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "created_at": "", "file_path": "", "filename": "", "metadata_file_path": "", "metadata_filename": "", "size": "", "audio": true, "audio_codec_type": "", "video": true, "video_codec_type": "", "video_bit_rate": "", "video_height": "", "video_width": "", "stats": {}, "start_time": "", "start_time_offset": "", "start_timestamp": "", "stop_time": "", "stop_time_offset": "", "stop_timestamp": "", } } .. _event-webhook-split-archive.available: split-archive.available ------------------------------------ **分割録画ファイル出力** - data.split_index - 分割された録画ファイルのインデックス - 0001 から始まり 9999 までいったら、その後は 10000, 10001 と増えていきます - data.start_timestamp - 分割して出力された録画ファイルを開始された時間 (UTC) を RFC 3339 形式 (マイクロ秒) で表しています - data.stop_timestamp - 分割して出力された録画ファイルを終了した時間 (UTC) を RFC 3339 形式 (マイクロ秒) で表しています - data.start_time - 分割して出力された録画ファイルを開始した時間を UNIX 時間形式で表しています - data.stop_time - 分割して出力された録画ファイルを終了した時間を UNIX 時間形式で表しています - data.start_time_offset - この分割して出力された録画が、StartRecording API を叩いてから何秒経過した後に開始したかを表しています - data.stop_time_offset - この分割して出力された録画が、StartRecording API を叩いてから何秒経過した後に終了したかを表しています - data.stats - サポート向けに、録画に使用したパケット情報の統計を格納しています - 内部向け情報のため、予告なく変更されることがあります .. code-block:: javascript { "type": "split-archive.available", "id": "", "version": "", "label": "", "node_name": "", "log_written": "", "channel_id": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "timestamp": "", "event_metadata": "", "data": { "channel_id": "", "recording_id": "", "split_index": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "created_at": "", "file_path": "", "filename": "", "metadata_file_path": "", "metadata_filename": "", "size": "", "audio": true, "audio_codec_type": "", "video": true, "video_codec_type": "", "video_bit_rate": "", "video_height": "", "video_width": "", "stats": { }, "start_time": "", "start_time_offset": "", "start_timestamp": "", "stop_time": "", "stop_time_offset": "", "stop_timestamp": "", } } .. note:: stats は省略しています .. _event-webhook-split-archive.end: split-archive.end --------------------- **分割録画終了** - data.start_time - 録画を開始した UNIX 時間形式で表しています - data.stop_time - 録画を終了した UNIX 時間形式で表しています - data.start_timestamp - 録画を開始した時間 (UTC) を RFC 3339 形式 (マイクロ秒) で表しています - data.stop_timestamp - 録画を終了した時間 (UTC) を RFC 3339 形式 (マイクロ秒) で表しています - data.stats - サポート向けに、録画に使用したパケット情報の統計を格納しています - 内部向け情報のため、予告なく変更されることがあります .. code-block:: javascript { "type": "split-archive.end", "id": "", "version": "", "label": "", "node_name": "", "log_written": "", "channel_id": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "timestamp": "", "event_metadata": "", "data": { "split_last_index": "", "recording_id": "", "channel_id": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "audio": true, "audio_codec_type": "", "video": true, "video_codec_type": "", "video_bit_rate": "", "file_path": "", "filename": "", "stats": {}, "start_time": "", "start_time_offset": "", "start_timestamp": "", "stop_time": "", "stop_time_offset": "", "stop_timestamp": "", } } .. _event-webhook-archive.failed: archive.failed -------------- **録画ファイル保存失敗** .. code-block:: javascript { "type": "archive.failed", "id": "", "version": "", "label": "", "node_name": "", "log_written": "", "timestamp": "", "channel_id": "", "session_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "event_metadata": "", "data": { "recording_id": "", "session_id": "", "file_path": "", "filename": "", "audio": true, "audio_codec_type": "", "video": true, "video_codec_type": "", "video_bit_rate": "", "video_height": "", "video_width": "", "stats": {}, "start_time": "", "start_timestamp": "", "stop_time": "", "stop_timestamp": "", } } スポットライト機能 ================== .. _event-webhook-spotlight.focused: spotlight.focused ----------------- **フォーカス設定** フォーカスされた際にウェブフックが飛びます。 .. code-block:: javascript { "type": "spotlight.focused", "channel_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "timestamp": "", "spotlight_number:": "", "fixed": "", "id": "", "label": "", "version": "", "node_name": "", "log_written": "", "audio": "", "video": "" } .. _event-webhook-spotlight.unfocused: spotlight.unfocused ------------------- **フォーカス解除** フォーカスが外れた際にウェブフックが飛びます。 .. code-block:: javascript { "type": "spotlight.unfocused", "channel_id": "", "client_id": "", "bundle_id": "", "connection_id": "", "timestamp": "", "spotlight_number:": "", "audio": "", "id": "", "label": "", "version": "", "node_name": "", "log_written": "", "audio": "", "video": "" } .. _mermaid-event-webhook: シーケンス図 ============== .. _mermaid-event-webhook-connection: connection.* ---------------- .. mermaid:: sequenceDiagram participant C as クライアント participant S as WebRTC SFU S participant A as アプリケーションサーバー note over C,A: 認証成功 S->>C: "type": "offer" C->>S: "type": "answer" note over C,S: WebRTC 確立 S->>+A: イベントウェブフック
"type": "connection.created" A-->>-S: 200 OK note over C,S: 接続から 1 分経過 S->>+A: イベントウェブフック
"type": "connection.updated" A-->>-S: 200 OK C->>S: "type": "disconnect" S->>+A: イベントウェブフック
"type": "connection.destroyed" A-->-S: 200 OK S->>C: WebSocket Close .. _mermaid-event-webhook-event-metadata: event_metadata -------------------------- .. mermaid:: sequenceDiagram participant C as クライアント participant S as WebRTC SFU S participant A as アプリケーションサーバー C->>+S: "type": "connect" S->>+A: 認証ウェブフック A-->>-S: 200 OK
"allowed: true,
"event_metadata": {"pk": 1} S->>C: "type": "offer" C->>S: "type": "answer" note over C,S: WebRTC 確立 S->>+A: イベントウェブフック
"type": "connection.created",
"event_metadata": {"pk": 1} A-->>-S: 200 OK note over C,S: 接続から 1 分経過 S->>+A: イベントウェブフック
"type": "connection.updated",
"event_metadata": {"pk": 1} A-->>-S: 200 OK C->>S: "type": "disconnect" S->>+A: イベントウェブフック
"type": "connection.destroyed",
"event_metadata": {"pk": 1} A-->-S: 200 OK S->>C: WebSocket Close