# シグナリング通知メタデータ

## 概要

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

シグナリング接続時、または認証ウェブフック成功の戻り値に `signaling_notify_metadata` で JSON を指定することで利用できるようになります。

新しく参加したときにはすでに参加しているクライアントの `signaling_notify_metadata` の値がリストで送られます。

## 注意

[シグナリング通知メタデータ拡張機能](SIGNALING_NOTIFY_METADATA_EXT.html) を有効にしている場合、
`metadata` ではなく `authz_metadata` のみに値が入るよう挙動が変わります。

## sora.conf の指定

`sora.conf` で `signaling_notify_metadata = false` を指定することで、
シグナリング通知時に `metadata` や `data` を含まなくなります。

`data` の内容は `signaling_notify_client_id` や `signaling_notify_bundle_id` 、 `signaling_notify_connection_id` の設定により変化します。

> - 設定による data の出力内容の違いは [table-signaling-notify-client-id-bundle-id-connection-id](SIGNALING_NOTIFY.html#table-signaling-notify-client-id-bundle-id-connection-id) をご確認ください
> - 設定を行ったときの出力例は [sora.conf の設定内容とシグナリング通知メタデータ出力の例](SIGNALING_NOTIFY_METADATA.html#a608ef) をご確認ください

## シグナリング接続時での指定

`"type": "connect"` 接続時に `signaling_notify_metadata` で JSON 型の好きな値を指定できます。

```json
{
    "type": "connect",
    "role": "sendonly",
    "channel_id": "bacon",
    "signaling_notify_metadata": {"spam": "egg"}
}
```

シグナリング接続時に指定した値は、通知時に `metadata` として通知されます。

```json
{
    "type": "notify",
    "event_type": "connection.created",
    "authn_metadata": {"spam": "egg"},
    "metadata": {"spam": "egg"},
    "data": [
        {
            "client_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
            "bundle_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
            "connection_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
            "authn_metadata": {"spam": "egg"},
            "metadata": {"spam": "egg"}
        },
        {
            "client_id": "4D40YWH56N5S99QHJV6GAPNHB0",
            "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
            "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0",
            "authn_metadata": 10,
            "metadata": 10
        }
    ]
}
```

また `auth_metadata` としても通知されます。

### シグナリング接続時に指定できるシグナリング通知メタデータのサイズ制限

> **重要**
>
> シグナリング接続時に指定できるシグナリング通知メタデータのサイズは最大 64 KiB (65536 バイト) です。

メタデータのサイズはメタデータ拡張機能をエンコード済みの JSON 、つまり文字列としてサイズを計算します。

例えば `{"a":"b"}` の場合は 9 バイトで、 `{"a":"b","c":1200}` は 18 バイトです。

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

```json
{
    "allowed": true,
    "signaling_notify_metadata": 10
}
```

認証ウェブフックの戻り値で指定した値は、通知時に `authz_metadata` としても通知されます。

```json
{
    "type": "notify",
    "event_type": "connection.created",
    "authn_metadata": {"spam": "egg"},
    "authz_metadata": "bacon",
    "metadata": "bacon",
    "data": [
        {
            "authz_metadata": {"spam": "egg"},
            "client_id": "🐗🐗🐗🐗",
            "bundle_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
            "connection_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
            "metadata": {"spam": "egg"}
        },
        {
            "authz_metadata": 10,
            "client_id": "🐹🐹🐹🐹",
            "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
            "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0",
            "metadata": 10
        }
    ]
}
```

すでに参加しており、他のクライアントが参加してきた場合や離脱した場合は以下の通りになります。

```json
{
    "type": "notify",
    "metadata": 10
}
```

### 認証成功時払い出しのシグナリング通知メタデータのサイズ制限

制限はありません。


## sora.conf の設定内容とシグナリング通知メタデータ出力の例

sora.conf

- `signaling_notify_client_id = true`
- `signaling_notify_bundle_id = true`
- `signaling_notify_connection_id = true`

```json
{
    "type": "notify",
    "event_type": "connection.created",
    "authn_metadata": {"spam": "egg"},
    "authz_metadata": "bacon",
    "metadata": "bacon",
    "data": [
        {
            "authz_metadata": {"spam": "egg"},
            "client_id": "🐗🐗🐗🐗",
            "bundle_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
            "connection_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
            "metadata": {"spam": "egg"}
        },
        {
            "authz_metadata": 10,
            "client_id": "🐹🐹🐹🐹",
            "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
            "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0",
            "metadata": 10
        }
    ]
}
```

- `signaling_notify_client_id = false`
- `signaling_notify_bundle_id = true`
- `signaling_notify_connection_id = true`

```json
{
    "type": "notify",
    "event_type": "connection.created",
    "authn_metadata": {"spam": "egg"},
    "authz_metadata": "bacon",
    "metadata": "bacon",
    "data": [
        {
            "authz_metadata": {"spam": "egg"},
            "bundle_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
            "connection_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
            "metadata": {"spam": "egg"}
        },
        {
            "authz_metadata": 10,
            "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
            "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0",
            "metadata": 10
        }
    ]
}
```

- `signaling_notify_client_id = true`
- `signaling_notify_bundle_id = false`
- `signaling_notify_connection_id = true`

```json
{
    "type": "notify",
    "event_type": "connection.created",
    "authn_metadata": {"spam": "egg"},
    "authz_metadata": "bacon",
    "metadata": "bacon",
    "data": [
        {
            "authz_metadata": {"spam": "egg"},
            "client_id": "🐗🐗🐗🐗",
            "connection_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
            "metadata": {"spam": "egg"}
        },
        {
            "authz_metadata": 10,
            "client_id": "🐹🐹🐹🐹",
            "connection_id": "4D40YWH56N5S99QHJV6GAPNHB0",
            "metadata": 10
        }
    ]
}
```

- `signaling_notify_client_id = true`
- `signaling_notify_bundle_id = true`
- `signaling_notify_connection_id = false`

```json
{
    "type": "notify",
    "event_type": "connection.created",
    "authn_metadata": {"spam": "egg"},
    "authz_metadata": "bacon",
    "metadata": "bacon",
    "data": [
        {
            "authz_metadata": {"spam": "egg"},
            "client_id": "🐗🐗🐗🐗",
            "bundle_id": "KKBFZTQXDD6H7FD2NYCQX8S474",
            "metadata": {"spam": "egg"}
        },
        {
            "authz_metadata": 10,
            "client_id": "🐹🐹🐹🐹",
            "bundle_id": "4D40YWH56N5S99QHJV6GAPNHB0",
            "metadata": 10
        }
    ]
}
```

- `signaling_notify_client_id = false`
- `signaling_notify_bundle_id = false`
- `signaling_notify_connection_id = false`

```json
{
    "type": "notify",
    "event_type": "connection.created",
    "authn_metadata": {"spam": "egg"},
    "authz_metadata": "bacon",
    "metadata": "bacon",
    "data": [
        {
            "authz_metadata": {"spam": "egg"},
            "metadata": {"spam": "egg"}
        },
        {
            "authz_metadata": 10,
            "metadata": 10
        }
    ]
}
```
