# マルチ転送フィルター機能

## 概要

マルチ転送フィルター機能は、転送フィルターに名前 (`name`) と優先度 (`priority`) を指定することで、
1 チャネルや 1 コネクションに複数の転送フィルターを設定できる機能です。

## 認証接続時と認証成功時・セッション生成時の払い出しの注意点

- `forwarding_filters` で `name` が重複した場合はエラーになります
- `forwarding_filters` で `name` と `priority` が未指定の場合は `default` と `32767` として扱われます- ただし未指定が複数ある場合は `name` の `default` が重複していると判断されエラーになります

## 仕様

- マルチ転送フィルターは 1 チャネルや 1 コネクションに対して複数の転送フィルターを設定できる機能です
- 複数の転送フィルターを設定する場合は、 `name` と `priority` を指定して転送フィルターを追加します- `name` はすでに設定済みの転送フィルターと重複することはできません
  - `name` と `priority` のどちらかだけを指定することはできません
- 転送フィルターは転送を判定するタイミングで、指定されている全ての転送フィルターを判定します- ただし判定するタイミングで、優先度が高いものから判定します
- 転送フィルター追加時に名前 (`name`) と優先度 (`priority`) を指定することができます
- 転送フィルター更新時に名前 (`name`) と優先度 (`priority`) を指定することができます
- 転送フィルター削除時に名前 (`name`) を指定して削除することができます
- 名前は任意の文字列 (最大 255 バイト) が指定できます
- 名前は重複できません- `channel_id` または `connection_id` 単位で一意な名前が必要
  - 名前が重複している場合はエラーになります
- 優先度は 0-32767 (16#7FFF) の間で指定してください
- 優先度が一番高いのは 0 で、数値が大きいほど優先度が低くなります
- 優先度は重複できます- 優先度が同じ場合は `allow` が優先されます
  - `block` のみの場合は OR で判定します
  - `allow` のみの場合は OR で判定します
  - `block` / `block` / `allow` なら `allow` のみで判定します
- `name` と `priority` を指定しない場合はデフォルト値が設定されます- `name` は `"default"` です
  - `priority` は `32767` です

## 性能

1 チャネルや 1 コネクションに対して数千個などのフィルターを設定しない限り、性能が劣化することはありません。


## 認証成功時の払い出し

```javascript
forwarding_filters: [
   {
      "name": "client-id-carol-allow",
      "priority": 0,
      "action": "allow",
      "rules": [
         [
            {
               "field": "client_id",
               "operator": "is_in",
               "values": [
                  "carol"
               ]
            }
         ]
      ]
   },
   {
      "name": "default",
      "priority": 32767,
      "action": "block",
      "rules": [
         [
            {
               "field": "kind",
               "operator": "is_in",
               "values": [
                  "audio",
                  "video"
               ]
            }
         ]
      ]
   }
]
```


## セッション生成時の払い出し

```javascript
forwarding_filters: [
   {
      "action": "block",
      "name": "client-id-alice-block",
      "priority": 0,
      "rules": [
         [
            {
               "field": "client_id",
               "operator": "is_in",
               "values": [
                  "alice"
               ]
            }
         ]
      ]
   },
   {
      "action": "block",
      "name": "client-id-bob-block",
      "priority": 0,
      "rules": [
         [
            {
               "field": "client_id",
               "operator": "is_in",
               "values": [
                  "bob"
               ]
            }
         ]
      ]
   },
   {
      "action": "block",
      "name": "default",
      "priority": 32767,
      "rules": [
         [
            {
               "field": "kind",
               "operator": "is_in",
               "values": [
                  "audio"
               ]
            }
         ]
      ]
   }
]
```
