# DataChannel 経由のシグナリング

## 概要

Sora Flutter SDK における Sora の DataChannel をどのようにシグナリングや通知に利用するかを説明します。

## DataChannel 経由のシグナリングとは

Sora Flutter SDK は、 `dataChannelSignaling: true` を指定した場合、接続の開始時点では WebSocket を利用し、その後の状態によって DataChannel ベースのシグナリングへ切り替えます。
また Sora は、 DataChannel をシグナリングだけでなく、通知やプッシュ、統計、RPC 機能にも利用します。

Sora 接続におけるシグナリングの切り替わりは以下のような流れになります。

1. 接続開始時は WebSocket 経由でシグナリングする
2. `dataChannelSignaling: true` を指定している場合、Sora 側の条件が揃うと `switched` メッセージが届く
3. 以後のシグナリングや通知の一部は DataChannel ベースで扱われる
4. `ignore_disconnect_websocket` が有効な構成では、切り替え後に WebSocket を閉じる

> **注釈**
>
> DataChannel 経由のシグナリングの詳細については Sora のドキュメントの [DataChannel 経由のシグナリング](https://sora-doc.shiguredo.jp/DATA_CHANNEL_SIGNALING)  をご確認ください。

## DataChannel 経由のシグナリングに関する設定

### dataChannelSignaling

WebSocket の後段で DataChannel 経由のシグナリングを利用する場合に `true` を指定します。
デフォルトは `null` (未指定) で、この場合は Sora 側の設定が使われます。

`dataChannelSignaling` は接続時の要求値です。 `true` を指定した場合でも切り替わりは保証されません。
実際に切り替わったかどうかは `SoraSwitchedEvent` で確認します。

```dart
final config = SoraConnectionConfig(
  signalingUrls: <String>['wss://example.com/signaling'],
  channelId: 'example-channel',
  role: SoraRole.sendrecv,
  video: true,
  audio: true,
  dataChannelSignaling: true,
);
```

#### シグナリング切り替え時に発火するイベント

DataChannel 経由のシグナリングに切り替わると `SoraSwitchedEvent` イベントが発火します。

```dart
conn.events.listen((event) {
  if (event case SoraSwitchedEvent(:final message)) {
    print(message);
  }
});
```

`message` には、 `ignore_disconnect_websocket` のような switched メッセージの内容が含まれています。

イベントの詳細については [イベント](event.html) をご確認ください。

### ignoreDisconnectWebSocket

DataChannel 経由のシグナリングへ切り替わった後、WebSocket 切断を無視する構成にしたい場合に `true` を指定します。
デフォルトは `null` (未指定) で、この場合は Sora 側の設定が使われます。

この値は connect メッセージの `ignore_disconnect_websocket` として Sora に渡されます。
SDK 側では、 `switched` メッセージに `ignore_disconnect_websocket: true` が含まれていた場合に、WebSocket を閉じます。

```dart
final config = SoraConnectionConfig(
  signalingUrls: <String>['wss://example.com/signaling'],
  channelId: 'example-channel',
  role: SoraRole.sendrecv,
  dataChannelSignaling: true,
  ignoreDisconnectWebSocket: true,
);
```

## 関連ページ

- [シグナリング設定](signaling.html)
- [リアルタイムメッセージング機能](messaging.html)
- [RPC 機能](rpc.html)
- [イベント](event.html)
