# シグナリング通知

## 概要

シグナリング通知は、Sora がシグナリングの接続で利用する WebSocket やデータチャネルを利用して、
自身の状態や、他のコネクションの状態をリアルタイムに通知する機能です

## シグナリング通知を利用することで実現できること

- 配信されているストリームに対してユーザー名を表示する
- 新しくチャネルに参加したクライアントのユーザー名を通知する
- 現在のネットワークの状態をクライアント画面に表示する
- 離脱したユーザーの名前を表示する
- 録画の開始や停止をクライアントに通知する
- スポットライト機能を利用した場合に、配信が切り替わったことをクライアントに通知する

## シグナリング通知の利用が向いていないこと

- 片方向配信で視聴者が多い

## シグナリング通知の有効 / 無効について

シグナリング通知はデフォルトで有効になっています。

シグナリング通知を無効にした場合はシグナリング通知が送られてこなくなります。

無効にするには、 `sora.conf` でシグナリング通知の無効を指定するか、または、認証ウェブフックの戻り値で無効を指定する必要があります。

### sora.conf での指定

`sora.conf` でシグナリング通知の有無を指定する方法です。

`sora.conf` で `signaling_notify = false` を指定することで、シグナリング通知が無効になります。

ただし、この値は認証ウェブフックの戻り値で上書きできます。


### 認証ウェブフックの戻り値での指定

認証ウェブフックの戻り値を利用して、クライアントごとに signaling_notify の true / false を指定する方法です。

認証ウェブフックの戻り値に `{"signaling_notify": false}` を指定することで、そのクライアントに対して signaling_notify を無効にできます。

```javascript
{
    "allowed": true,
    "signaling_notify": false
}
```

認証ウェブフックの戻り値に signaling_notify の指定が無い場合は、sora.conf の signaling_notify の値が採用されます。

**表 1. sora.conf と認証ウェブフックの戻り値の signaling_notify の組み合わせによるクライアントの signaling_notify の採用値**

* - sora.conf の signaling_notify
  - 認証ウェブフックの戻り値の signaling_notify
  - クライアントの signaling_notify の採用値
* - true
  - 指定なし
  - true
* - true
  - false
  - false
* - true
  - true
  - true
* - false
  - 指定なし
  - false
* - false
  - false
  - false
* - false
  - true
  - true

## sora.conf によるシグナリング通知関連の共通設定

### signaling_notify_client_id

**デフォルト**: true

`sora.conf` で `signaling_notify_client_id = false` を指定することで、シグナリング通知時にクライアント ID を含まなくなります。
ただし [スポットライト機能のシグナリング通知](SIGNALING_NOTIFY.html#dcfbb9) には常にクライアント ID が含まれます。

### signaling_notify_bundle_id

**デフォルト**: true

`sora.conf` で `signaling_notify_bundle_id = false` を指定することで、シグナリング通知時にバンドル ID を含まなくなります。
ただし [スポットライト機能のシグナリング通知](SIGNALING_NOTIFY.html#dcfbb9) には常にバンドル ID が含まれます。

### signaling_notify_connection_id

**デフォルト**: true

`sora.conf` で `signaling_notify_connection_id = false` を指定することで、シグナリング通知時にコネクション ID を含まなくなります。
ただし [サイマルキャスト機能のシグナリング通知](SIGNALING_NOTIFY.html#3807dd) 、 [スポットライト機能のシグナリング通知](SIGNALING_NOTIFY.html#dcfbb9) 、 [転送フィルターのシグナリング通知](SIGNALING_NOTIFY.html#efa550)  には常にコネクション ID が含まれます。

### signaling_notify_connection_created_timestamp

**デフォルト**: true

これは `event_type` が `connection.created` の時のみ有効になります。

`sora.conf` で `signaling_notify_connection_created_timestamp = false` を指定することで、シグナリング通知時にコネクション生成時刻を含まなくなります。

### signaling_notify_media

**デフォルト**: true

`sora.conf` で `signaling_notify_media = false` を指定することで、シグナリング通知時に音声や映像の情報を含まなくなります。
ただし [スポットライト機能のシグナリング通知](SIGNALING_NOTIFY.html#dcfbb9) には常に音声や映像の情報が含まれます。

### signaling_notify_metadata

**デフォルト**: true

`signaling_notify_metadata` は、ユーザーが参加や離脱したときに送られるシグナリング通知に含まれるメタデータです。

シグナリング通知メタデータの詳細は [シグナリング通知メタデータ](SIGNALING_NOTIFY_METADATA.html) をご確認ください。

`sora.conf` で `signaling_notify_metadata = false` を指定すると [コネクションのシグナリング通知](SIGNALING_NOTIFY.html#5b6b0a) でシグナリング通知メタデータおよびシグナリング通知メタデータ拡張の情報を含まなくなります。

### signaling_notify_metadata_ext

**デフォルト**: false

`signaling_notify_metadata_ext` は、ユーザーが参加や離脱したときに送られるシグナリング通知に含まれるメタデータを、API 経由で自由に変更できるようにします。

シグナリング通知メタデータ拡張の詳細は [シグナリング通知メタデータ拡張機能](SIGNALING_NOTIFY_METADATA_EXT.html) をご確認ください。

### signaling_notify_ice_connection_state

**デフォルト**: false

`signaling_notify_ice_connection_state`  は、ICE 接続の状態が変化したときに送られるシグナリング通知に含まれるメタデータです。
自分を含むセッション参加者全員に通知されます。

ICE コネクションステートの詳細は [ICE コネクションステート機能](ICE_CONNECTION_STATE.html) をご確認ください。


## コネクションのシグナリング通知

### クライアントに送信される JSON の仕様

- event_type- string
  - `connection.created` 、 `connection.updated` 、 `connection.destroyed` の 3 つの内のいずれかが入ります
  - `connection.created` と `connection.destroyed` は、全員に通知されます
  - `connection.updated` は、自身に通知されます
- timestamp- string
  - RFC3339 (マイクロ秒)
  - `connection.created` の時に、コネクション生成時間が含まれます
- role- string
  - `sendrecv` / `sendonly` / `recvonly` が入ります
- minutes- integer
  - その接続の接続経過時間 (分) が入ります
- channel_connections- integer
  - そのチャネルの接続数が入ります
- channel_sendonly_connections- integer
  - そのチャネルの sendonly 接続数が入ります
- channel_recvonly_connections- integer
  - そのチャネルの recvonly 接続数が入ります
- channel_sendrecv_connections- integer
  - そのチャネルの sendrecv 接続数が入ります
- client_id- string
  - `connection.created` の場合は、参加してきたクライアントのクライアント ID が入ります
  - `connection.destroyed` の場合は、離脱したクライアントのクライアント ID が入ります
  - `connection.updated` の場合は、自身のクライアント ID が入ります
  - `sora.conf` で、 `signaling_notify_client_id` を `false` にすることでこの値は含まれなくなります
- bundle_id- string
  - `connection.created` の場合は、参加してきたクライアントのバンドル ID が入ります
  - `connection.destroyed` の場合は、離脱したクライアントのバンドル ID が入ります
  - `connection.updated` の場合は、自身のバンドル ID が入ります
  - `sora.conf` で、 `signaling_notify_bundle_id` を `false` にすることでこの値は含まれなくなります
- connection_id- string
  - `connection.created` の場合は、参加してきたクライアントのコネクション ID が入ります
  - `connection.destroyed` の場合は、離脱したクライアントのコネクション ID が入ります
  - `connection.updated` の場合は、自身のコネクション ID が入ります
  - `sora.conf` で、 `signaling_notify_connection_id` を `false` にすることでこの値は含まれなくなります
- audio- boolean
  - `connection.created` の場合は、参加してきたクライアントの audio が有効かどうかが入ります
  - `connection.destroyed` の場合は、離脱したクライアントの audio が有効かどうかが入ります
  - `connection.updated` の場合は、自身の audio が有効かどうかが入ります
  - `sora.conf` で、 `signaling_notify_media` を `false` にすることでこの値は含まれなくなります
- video- boolean
  - `connection.created` の場合は、参加してきたクライアントの video が有効かどうかが入ります
  - `connection.destroyed` の場合は、離脱したクライアントの video が有効かどうかが入ります
  - `connection.updated` の場合は、自身の video が有効かどうかが入ります
  - `sora.conf` で、 `signaling_notify_media` を `false` にすることでこの値は含まれなくなります
- metadata, authz_metadata, authn_metadata- json
  - [シグナリング通知メタデータ](SIGNALING_NOTIFY_METADATA.html) で利用する項目です。
  - `sora.conf` で、 `signaling_notify_metadata` を `false` にすることでこの値は含まれなくなります
- data- json 型のリスト- json 型の中身は、以下の sora.conf の設定により変化します- [signaling_notify_client_id](SORA_CONF.html#fc78ca)
      - [signaling_notify_bundle_id](SORA_CONF.html#f2a58f)
      - [signaling_notify_connection_id](SORA_CONF.html#7882d6)
      - [signaling_notify_connection_created_timestamp](SORA_CONF.html#7fe7b3)
      - [signaling_notify_metadata](SORA_CONF.html#2d9340)
    - 上記の設定が全て `false` になり、通知する値がなくなった場合、この値は含まれなくなります
    - 設定値による json 型の中身は、 [sora.conf の設定内容と connection.created 出力の例](SIGNALING_NOTIFY.html#2729eb) をご確認ください
  - 新規でチャネルに接続した際に、すでにチャネルに参加している接続一覧の情報がはいります- チャネル内で 1 つめの接続である場合は、この値は空のリストになります
  - 接続を開始して初回の `connection.created` の場合のみこの値が入ります


## sora.conf の設定内容と connection.created 出力の例

`data` に含まれる項目を例に sora.conf の設定内容と `connection.created` 出力の例を示します。

### デフォルト

デフォルトでは全て `true` であり、値が通知されます。

```ini
# 全てコメントアウトされているため、デフォルト値が適用される
# signaling_notify_client_id = false
# signaling_notify_bundle_id = false
# signaling_notify_connection_id = false
# signaling_notify_connection_created_timestamp = false
# signaling_notify_metadata = false
```

**一部項目を省略しています**

```javascript
{
  "type": "notify",
  "event_type": "connection.created",
  "session_id": "P24NZ0AX2D6FX15VFHEGBXGMEW",
  "bundle_id": "WHSSBG91XS7NXEVYY0F51YFEEW",
  "client_id": "client3",
  "connection_id": "WHSSBG91XS7NXEVYY0F51YFEEW",
  "timestamp": "2023-12-18T07:12:11.876287Z",
  "authn_metadata": {"spam": "egg"},
  "authz_metadata": "bacon",
  "metadata": "bacon",
  "data": [
    {
      "bundle_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
      "client_id": "client1",
      "connection_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
      "timestamp": "2023-12-18T07:11:56.585769Z",
      "authn_metadata": 10,
      "authz_metadata": {"authz": true},
      "metadata": {"authz": true}
    },
    {
      "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
      "client_id": "client2",
      "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0",
      "timestamp": "2023-12-18T07:11:58.685769Z",
      "authn_metadata": 10,
      "metadata": 10
    }
  ]
}
```

### client_id を通知しない

`signaling_notify_client_id = false` を指定すると、client_id が含まれなくなります。

```ini
signaling_notify_client_id = false
# signaling_notify_bundle_id = false
# signaling_notify_connection_id = false
# signaling_notify_connection_created_timestamp = false
# signaling_notify_metadata = false
```

**一部項目を省略しています**

```javascript
{
  "type": "notify",
  "event_type": "connection.created",
  "timestamp": "2023-12-18T07:12:11.876287Z",
  "session_id": "P24NZ0AX2D6FX15VFHEGBXGMEW",
  "bundle_id": "WHSSBG91XS7NXEVYY0F51YFEEW",
  "connection_id": "WHSSBG91XS7NXEVYY0F51YFEEW",
  "authn_metadata": {"spam": "egg"},
  "authz_metadata": "bacon",
  "metadata": "bacon",
  "data": [
    {
      "bundle_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
      "connection_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
      "timestamp": "2023-12-18T07:11:56.585769Z",
      "authn_metadata": 10,
      "authz_metadata": {"authz": true},
      "metadata": {"authz": true}
    },
    {
      "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
      "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0",
      "timestamp": "2023-12-18T07:11:58.685769Z",
      "authn_metadata": 10,
      "metadata": 10
    }
  ]
}
```

### metadata を通知しない

`signaling_notify_metadata = false` を指定すると `metadata`, `authz_metadata`, `authn_metadata` が含まれなくなります。

```ini
# signaling_notify_client_id = false
# signaling_notify_bundle_id = false
# signaling_notify_connection_id = false
# signaling_notify_connection_created_timestamp = false
signaling_notify_metadata = false
```

**一部項目を省略しています**

```javascript
{
  "type": "notify",
  "event_type": "connection.created",
  "session_id": "P24NZ0AX2D6FX15VFHEGBXGMEW",
  "bundle_id": "WHSSBG91XS7NXEVYY0F51YFEEW",
  "connection_id": "WHSSBG91XS7NXEVYY0F51YFEEW",
  "timestamp": "2023-12-18T07:12:11.876287Z",
  "data": [
    {
      "bundle_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
      "connection_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
      "timestamp": "2023-12-18T07:11:56.585769Z"
    },
    {
      "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
      "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0",
      "timestamp": "2023-12-18T07:11:58.685769Z"
    }
  ]
}
```

### client_id と bundle_id と connection_id を通知しない

通知が不要のものを複数指定することができます。

```ini
signaling_notify_client_id = false
signaling_notify_bundle_id = false
signaling_notify_connection_id = false
# signaling_notify_connection_created_timestamp = false
# signaling_notify_metadata = false
```

**一部項目を省略しています**

```javascript
{
  "type": "notify",
  "event_type": "connection.created",
  "session_id": "P24NZ0AX2D6FX15VFHEGBXGMEW",
  "timestamp": "2023-12-18T07:12:11.876287Z",
  "authn_metadata": {"spam": "egg"},
  "authz_metadata": "bacon",
  "metadata": "bacon",
  "data": [
    {
      "timestamp": "2023-12-18T07:11:56.585769Z",
      "authn_metadata": 10,
      "authz_metadata": {"authz": true},
      "metadata": {"authz": true}
    },
    {
      "timestamp": "2023-12-18T07:11:58.685769Z",
      "authn_metadata": 10,
      "metadata": 10
    }
  ]
}
```

### data 内の項目全てを通知しない

```ini
signaling_notify_client_id = false
signaling_notify_bundle_id = false
signaling_notify_connection_id = false
signaling_notify_connection_created_timestamp = false
signaling_notify_metadata = false
```

`data` 項目に関する通知を不要に設定すると、 `data` 項目自体が送信されなくなります。

**一部項目を省略しています**

```javascript
{
  "type": "notify",
  "event_type": "connection.created",
  "session_id": "P24NZ0AX2D6FX15VFHEGBXGMEW"
}
```

### "event_type": "connection.created"

この event_type は、参加しているチャネルに接続があった場合に、 `signaling_notify` を有効にしている自分を含む全員に通知されます。

この通知を利用することで、他のクライアントが接続してきたことをクライアント側で把握できます。

新規接続クライアントと bundle_id が等しいクライアントに対しては、このイベントは通知されません。
また通知 JSON の data の中身からも bundle_id が等しいクライアントは除外されます。

### "event_type": "connection.updated"

この event_type は、クライアントごとに異なり、 1 分間隔で通知されます。

この通知を利用することで、現在クライアントの累計接続時間をクライアント側で把握できます。

### "event_type": "connection.destroyed"

この event_type は、参加しているチャネルに切断があった場合に、 `signaling_notify` を有効にしている自分以外の全員に通知されます。

この通知を利用することで、他のクライアントが切断したことをクライアント側で把握できます。

切断クライアントと bundle_id が等しいクライアントに対しては、このイベントは通知されません。


## サイマルキャスト機能のシグナリング通知

サイマルキャスト機能を利用した場合のシグナリング通知は上記の `connection.*` とは別に `simulcast.switched` が通知されます。

- event_type- string
  - `simulcast.switched` は、映像ストリームの rid が切り替わった場合に通知されます
- timestamp- string
  - RFC3339 (マイクロ秒)
- sender_connection_id- string
  - どの接続のストリームが切り替わったかが入ります
- priority- string
  - `higher` / `lower` のいずれかで、切り替わったストリームの優先度が入ります
  - `simulcast_request_rid` に `auto` が指定されている場合 `priority` が `higher` はよりビットレートが **低い** rid のストリームに切り替わったことを示します
  - `simulcast_request_rid` に `auto` が指定されている場合 `priority` が `lower` はよりビットレートが **高い** rid のストリームに切り替わったことを示します
- trigger - string
  - `api` / `rpc` /  `sender` / `receiver` のいずれかで切り替わりのトリガーを指定できます
  - `api` は [RequestSimulcastRid](API_SIMULCAST.html#7d26ab) API による切り替え
  - `rpc` は [2025.2.0/RequestSimulcastRid](RPC.html#07fda8) RPC による切り替え
  - `sender` は映像送信側のストリームが増えたり減ったりしたことによる切り替え
  - `receiver` は映像視聴者側の環境に合わせた切り替え- このトリガーは `simulcast_auto_rids` を指定している場合にのみ含まれます
- rpc_rids- string[none | r0 | r1 | r2, ...]
  - データチャネル経由の RPC 機能で利用できる rid のリスト
  - [2025.2.0/RequestSimulcastRid](RPC.html#07fda8) RPC で指定できる rid が入ります
  - `["none", "r0", "r1"]` を指定した場合、Sora は `r2` のストリームを配信しません
  - `["r0", "r1"]` を指定した場合、どんなに環境に余裕がなくても `none` でのストリーム停止を行いません
- auto_rids- string[none | r0 | r1 | r2, ...]
  - 視聴側の環境に合わせた自動切り替えに利用する rid のリストが入ります- リストが空の場合は自動切り替え機能は無効です
- request_rid- string (none | r0 | r1 | r2)
  - 自身が期待するストリームの rid が入ります
- current_rid- string (none | r0 | r1 | r2)
  - 現在利用しているストリームの rid が入ります
- previous_rid- string (none | r0 | r1 | r2)
  - 以前利用していたストリームの rid が入ります

```javascript
{
  "type": "notify",
  "timestamp": "2024-06-10T12:34:56.789012Z",
  "event_type": "simulcast.switched",
  "sender_connection_id": "4D40YWH56N5S99QHJV6GAPNHB0",
  "priority": "higher",
  "trigger": "sender",
  "rpc_rids": ["none", "r0", "r1"],
  "auto_rids": ["r0", "r1"],
  "request_rid": "r1",
  "current_rid": "r1",
  "previous_rid": "r0"
}
```

### 設定

この通知は `sora.conf` の [signaling_notify_simulcast_switched](SORA_CONF.html#022113) で有効 / 無効を指定できます。デフォルトは `true` で有効です。


## スポットライト機能のシグナリング通知

スポットライト機能を利用した場合のシグナリング通知は上記の `connection.*` とは別に `spotlight.*` が通知されます。

### "event_type": "spotlight.focused"

この event_type は、参加しているチャネルの配信がフォーカスされた場合に、 `signaling_notify` を有効にしている全員に通知されます。

この通知を利用することで、配信が切り替わったことをクライアントが気付くことができるようになります。

フォーカスされたクライアントと bundle_id が等しいクライアントに対しては、このイベントは通知されません。

> **重要**
>
> 新規にチャネルに参加したクライアントには `connection.created` の後に `spotlight.focused` が通知され、
> 既に参加しているどのクライアントがスポットライト機能でフォーカスされているのかを知ることができます。

### "event_type": "spotlight.unfocused"

この event_type は、参加しているチャネルの配信からフォーカスが外れた場合に、 `signaling_notify` を有効にしている全員に通知されます。

この通知を利用することで、配信が切り替わったことをクライアントが気付くことができるようになります。

フォーカスが外れたクライアントと bundle_id が等しいクライアントに対しては、このイベントは通知されません。

### クライアントに送信される JSON の仕様

- event_type- string
  - `spotlight.focused` または `spotlight.unfocused` が入ります
- channel_id- string
  - 現在利用しているチャネル ID が入ります
- client_id- string
  - どのクライアントに配信が切り替わったかが入ります
- bundle_id- string
  - 切り替わった配信のバンドル ID が入ります
- connection_id- string
  - どの接続に配信が切り替わったかが入ります
- spotlight_number- integer
  - 現在のスポットライト数が入ります
- audio- boolean
  - 切り替わった配信の audio が有効かどうかが入ります
- video- boolean
  - 切り替わった配信の video が有効かどうかが入ります
- fixed- boolean
  - 切り替わった配信が固定されているかどうかが入ります

```javascript
{
  "type": "notify",
  "event_type": "spotlight.focused",
  "client_id": "4D40YWH56N5S99QHJV6GAPNHB0",
  "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
  "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0",
  "spotlight_number": 3,
  "audio": true,
  "video": true,
  "fixed": false
}
```

```javascript
{
  "type": "notify",
  "event_type": "spotlight.unfocused",
  "client_id": "4D40YWH56N5S99QHJV6GAPNHB0",
  "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
  "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0",
  "spotlight_number": 3,
  "audio": true,
  "video": true,
  "fixed": false
}
```


## 録画のシグナリング通知

録画のシグナリング通知は録画開始時には `recording.started` 、録画終了時には `recording.stopped` が通知されます。

> **ヒント**
>
> `role` が `recvonly` のクライアントには通知されません。

### sora.conf の設定

`sora.conf` の `signaling_notify_recording` で通知するかどうかを指定できます。デフォルトは `true` で通知します。

```ini
signaling_notify_recording = false
```


### "event_type": "recording.started"

録画開始時に通知されます。

接続前にセッションウェブフック `session.created` で `"recording": true` や `StartRecording` API によって録画が開始されていた場合、
`connection.created` の後に通知されます。

```javascript
{
  "type": "notify",
  "event_type": "recording.started",
  "client_id": "4D40YWH56N5S99QHJV6GAPNHB0",
  "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
  "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0"
}
```


### "event_type": "recording.stopped"

録画終了時に通知されます。

`StopRecording` API が実行されたタイミング、または期限が切れたタイミングで通知されます。

```javascript
{
  "type": "notify",
  "event_type": "recording.stopped",
  "client_id": "4D40YWH56N5S99QHJV6GAPNHB0",
  "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
  "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0"
}
```


## 転送フィルターのシグナリング通知


### "event_type": "forwarding.blocked"

```javascript
{
    "type": "notify",
    "event_type": "forwarding.blocked",
    "kind": "video",
    "destination_connection_id": "FCX8X05SJS3Y18RD5MYFZS62RR",
    "source_connection_id": "SM7WDVYRTH739BB47ZSPQQ2BT4"
}
```


### "event_type": "forwarding.allowed"

```javascript
{
  "type": "notify",
  "event_type": "forwarding.allowed",
  "kind": "video",
  "destination_connection_id": "FCX8X05SJS3Y18RD5MYFZS62RR",
  "source_connection_id": "SM7WDVYRTH739BB47ZSPQQ2BT4"
}
```

## 音声ストリーミング

### "event_type": "audio-streaming.failed"

```javascript
{
  "type": "notify",
  "event_type": "audio-streaming.failed",
  "failed_connection_id": "4D40YWH56N5S99QHJV6GAPNHB0"
}
```

## ICE コネクションステートのシグナリング通知

**これは実験的機能です**

### "event_type": "ice-connection-state.changed"

```javascript
{
  "type": "notify",
  "event_type": "ice-connection-state.changed",
  "connection_id": "MV7VSJTA092V70F4796DCS9BAR",
  "timestamp": "2024-12-06T03:32:58.091149Z",
  "current_state": "connected",
  "previous_state": "checking"
}
```


## ネットワークのシグナリング通知

**これは実験的機能です**

ネットワークのシグナリング通知は、上記の `connection.*` とは別に `network.*` が通知されます。

### "event_type": "network.status"

このシグナリング通知は [signaling_notify_network](SORA_CONF.html#c449d7) が `true` の場合に通知されます。

この通知を利用することで、ネットワークの状態をクライアントが把握できるようになります。

#### 通知間隔の変更

`sora.conf` の [signaling_notify_network_status_interval](SORA_CONF.html#e0f78e) で通知間隔を設定できます。デフォルトは `10 s` です。

### 帯域推定結果の通知

Sora が帯域推定を行った結果を通知します。

#### 通知する条件

`role` が `sendrecv` または `recvonly` の場合に通知します

#### JSON の仕様

- event_type- string
  - `network.status` が入ります
- estimated_bandwidth- integer
  - 帯域推定結果が入ります
  - 単位はバイトです
- unix_timestamp_ms- integer
  - 通知時の UNIX タイムスタンプ (ミリ秒) が入ります
- total_sent_rtp_byte_size- integer
  - 通知時の RTP (音声と映像) 送信合計バイトサイズが入ります
- previous_unix_timestamp_ms- integer
  - 前回通知時の UNIX タイムスタンプ (ミリ秒) が入ります
  - **初回の通知時は 0 が入ります**
- previous_estimated_bandwidth- integer
  - 前回通知時の帯域推定の値が入ります
  - **初回の通知時は 0 が入ります**
- previous_total_sent_rtp_byte_size- integer
  - 前回通知時の RTP (音声と映像) 送信合計バイトサイズが入ります
  - **初回の通知時は 0 が入ります**

```javascript
// 初回通知時
{
    "type": "notify",
    "event_type": "network.status",
    "timestamp": "2024-05-28T03:32:58.091149Z",
    "unix_timestamp_ms": 1716854400000,
    "estimated_bandwidth": 1000000,
    "total_rtp_sent_byte_size": 1000000,
    "previous_unix_timestamp_ms": 0,
    "previous_estimated_bandwidth": 0,
    "previous_total_rtp_sent_byte_size": 0,
}
```

## シーケンス図

### コネクション関連の通知

```mermaid
sequenceDiagram
    participant C1 as クライアント1
    participant C2 as クライアント2
    participant S as Sora
    participant A as アプリケーションサーバー
    C1 ->>+ S: type: "connect"<br>client_id: "client1"
    S ->>+ A: 認証ウェブフック
    A -->>- S: 200 OK
    S ->>+ A: セッションウェブフック
    A -->>- S: 200 OK
    S -->>- C1: type: "offer"
    C1 -) S: type: "answer"
    note over C1, S: WebRTC 確立
    par
        S ->>+ A: イベントウェブフック<br/>"type": "connection.created"
        A -->>- S: 200 OK 
    and
        S -) C1: type: "notify"<br>event_type: "connection.created"<br>client_id: "client1"
    end
    note over C1, S: 1 分経過
    par
        S ->>+ A: イベントウェブフック<br/>"type": "connection.updated"
        A -->>- S: 200 OK 
    and
    S -) C1: type: "notify"<br>event_type: "connection.updated"<br>client_id: "client1"
    end
    C2 ->>+ S: type: "connect"<br>client_id: "client2"
    S ->>+ A: 認証ウェブフック
    A -->>- S: 200 OK
    S -->>- C2: type: "offer"
    C2 -) S: type: "answer"
    note over C2, S: WebRTC 確立
    par
        S ->>+ A: イベントウェブフック<br/>"type": "connection.created"
        A -->>- S: 200 OK 
    and
        S -) C2: type: "notify"<br>event_type: "connection.created"<br>client_id: "client2"
    and
        S -) C1: type: "notify"<br>event_type: "connection.created"<br>client_id: "client2"
    end
    C1 ->> S: type: "disconnect"
    note over C1, S: 切断
    par
        S ->>+ A: イベントウェブフック<br/>"type": "connection.destroyed"
        A -->>- S: 200 OK 
    and
        S -) C2: type: "notify"<br>event_type: "connection.destroyred"<br>client_id: "client1"
    end
```

録画関連の通知
------------------------

```mermaid
sequenceDiagram
    participant C as クライアント
    participant S as Sora
    participant A as アプリケーションサーバー
    C ->>+ S: type: "connect"<br>client_id: "client1"
    S ->>+ A: 認証ウェブフック
    A -->>- S: 200 OK
    S ->>+ A: セッションウェブフック
    A -->>- S: 200 OK<br>recording: true
    S -->>- C: type: "offer"
    C -) S: type: "answer"
    note over C, S: WebRTC 確立
    par
        S ->>+ A: イベントウェブフック<br/>"type": "connection.created"
        A -->>- S: 200 OK 
    and
        S -) C: type: "notify"<br>event_type: "connection.created"<br>client_id: "client1"
        S -) C: type: "notify"<br>event_type: "recording.started"<br>client_id: "client1"
    end
    A ->>+ S: StopRecording API
    S -->>- A: 200 OK
    S -) C: type: "notify"<br>event_type: "recording.stopped"<br>client_id: "client1"
    S ->>+ A: イベントウェブフック<br/>"type": "archive.available"
    A -->>- S: 200 OK 
    S ->>+ A: イベントウェブフック<br/>"type": "recording.report"
    A -->>- S: 200 OK
```
