# Sora クライアント要求仕様

## 概要

Sora SDK や Sora クライアントの開発者に向けた資料です。

## クライアント側の終了処理条件

### RTCPeerConnectionState が failed になる

全ての接続において [RTCPeerConnectionState](https://www.w3.org/TR/webrtc/#dom-rtcpeerconnectionstate) が [failed](https://www.w3.org/TR/webrtc/#dom-rtcpeerconnectionstate-failed) になったタイミングで `"type": "disconnect"` は送らず、
クライアント側で終了処理をしてください。

### WebSocket のみ

- RTCPeerConnectionState が failed になった- 終了処理に入る
- WebSocket onclose が上がった - 終了処理に入る
- WebSocket onerror が上がった- 終了処理に入る

### WebSocket と DataChannel

- RTCPeerConnectionState が failed になった- 終了処理に入る
- WebSocket onclose が上がった - `"type": "switched"` が送られてきていない- 終了処理に入る
  - `"type": "switched", "ignore_disconnect_websocket": true` が送られてきていた- 何もしない
  - `"type": "switched", "ignore_disconnect_websocket": false` が送られてきていて、 RTCPeerConnectionState が failed になっている- 終了処理に入る
  - `"type": "switched", "ignore_disconnect_websocket": false` が送られてきていて、 RTCPeerConnectionState が failed になっていない- DataChanel で `"type": "disconnect", reason: "WEBSOCKET-ONCLOSE"` を送ることを試みる
    - 終了処理に入る
- WebSocket onerror が上がった- `"type": "switched"` が送られてきていない- 終了処理に入る
  - `"type": "switched", "ignore_disconnect_websocket": true` が送られてきていた- 何もしない
  - `"type": "switched", "ignore_disconnect_websocket": false` が送られてきていて、 RTCPeerConnectionState が failed になっている- 終了処理に入る
  - `"type": "switched", "ignore_disconnect_websocket": false` が送られてきていて、 RTCPeerConnectionState が failed になっていない- DataChanel で `"type": "disconnect", reason: "WEBSOCKET-ONERROR"` を送ることを試みる
    - 終了処理に入る

### DataChannel のみ

- RTCPeerConnectionState が failed になった- 終了処理に入る

### DataChannel の終了

Sora SDK の切断タイムアウトのデフォルト値は 3000 ミリ秒です。

- RTCDataChannel [onclose](https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-onclose) が上がった- RTCDataChannel [onerror](https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-onerror) にコールバックをセットしている場合- 終了処理に入る、または切断タイマーを開始し、全ての RTCDataChannel の [readyState](https://www.w3.org/TR/webrtc/#dom-datachannel-readystate) がすべて [closed](https://www.w3.org/TR/webrtc/#dom-rtcdatachannelstate-closed) にならずタイムアウトした場合は終了処理にはいる
  - RTCDataChannel onerror にコールバックをセットしていない場合- 終了処理に入る
- RTCDataChannel onerror が上がった- 終了処理に入る

## アプリケーション経由の "type": "disconnect" 送信後の終了処理

Sora SDK の切断タイムアウトのデフォルト値は 3000 ミリ秒です。

### WebSocket のみ

`data_channel_signaling: false` の場合。

- WebSocket 経由で `"type": "disconnect", reason: "NO-ERROR"` を送る- 終了処理に入る、または切断タイマーを開始し、WebSocket onclose が上がらずタイムアウトした場合は終了処理に入る

### WebSocket と DataChannel

`data_channel_signaling: true` で `ignore_disconnect_websocket: false` の場合。

- `"type": "switched"` が送られて来ていない- WebSocket 経由で `"type": "disconnect", reason: "NO-ERROR"` を送る
  - 終了処理にはいる、または切断タイマーを開始し、WebSocket onclose が上がらずタイムアウトした場合は終了処理にはいる
- `"type": "switched", "ignore_disconnect_websocket": false` が送られてきていて、 WebSocket は切断していない- DataChannel 経由で `"type": "disconnect", reason: "NO-ERROR"` を送る
  - [RTCDataChannel](https://www.w3.org/TR/webrtc/#dom-rtcdatachannel) [onerror](https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-onerror) にコールバックをセットしている場合- 終了処理に入る、または切断タイマーを開始し、WebSocket の onclose かつ、全ての RTCDataChannel の [readyState](https://www.w3.org/TR/webrtc/#dom-datachannel-readystate) がすべて [closed](https://www.w3.org/TR/webrtc/#dom-rtcdatachannelstate-closed) にならずタイムアウトした場合は終了処理にはいる
  - [RTCDataChannel](https://www.w3.org/TR/webrtc/#dom-rtcdatachannel) [onerror](https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-onerror) にコールバックをセットしていない場合- 終了処理に入る

### DataChannel のみ

`data_channel_signaling: true` で `ignore_disconnect_websocket: true` の場合。

- `"type": "switched"` が送られて来ていない- WebSocket 経由で `"type": "disconnect", reason: "NO-ERROR"` を送る
  - 切断タイマーを開始する
  - WebSocket onclose が上がらずタイムアウトした場合は終了処理に入る
- `"type": "switched", "ignore_disconnect_websocket": true` が送られてきていて、 WebSocket も切断している- DataChannel 経由で `"type": "disconnect", reason: "NO-ERROR"` を送る
  - RTCDataChannel [onerror](https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-onerror) にコールバックをセットしている場合- 終了処理に入る、または切断タイマーを開始し、全ての RTCDataChannel の [readyState](https://www.w3.org/TR/webrtc/#dom-datachannel-readystate) がすべて [closed](https://www.w3.org/TR/webrtc/#dom-rtcdatachannelstate-closed) にならずタイムアウトした場合は終了処理にはいる
  - RTCDataChannel onerror にコールバックをセットしていない場合- 終了処理に入る

## 異常発生による終了

### シグナリングの異常

終了処理に入ってください。

### シグナリング以外の異常

`"type": "disconnect", reason: "INTERNAL-ERROR"` を送り、終了処理に入って下さい。

## RTCPeerConnectionState が定義されていない場合

> **注釈**
>
> ブラウザでは Firefox が RTCPeerConnectionState が定義されていません

[RTCDtlsTransprot](https://www.w3.org/TR/webrtc/#dom-rtcdtlstransport) が実装されていない場合 RTCPeerConnectionState が正常に動作しないため、
[RTCIceConnectionState](https://www.w3.org/TR/webrtc/#dom-rtciceconnectionstate) を利用してください。

RTCIceConnectionState が [disconnect](https://www.w3.org/TR/webrtc/#dom-rtciceconnectionstate-disconnected) になった場合、切断タイマーを開始し、
タイムアウトした場合 disconnect から変化がなければ切断してください。

Sora SDK の RTCIceConnectionState 用の切断タイマーはデフォルトで 10 秒です。
