WebSocketシグナリング エンドポイント
役割
WebRTCのシグナリング(SDP・ICE候補交換)を WebSocket経由で中継する。
エンドポイント
認証失敗時(A7)
セッション Cookie が無効または未ログインの場合、WebSocket upgrade は行わず HTTP 401 を返す。
{ "error": "unauthorized" }
接続フロー
- 送信者:
POST /v1/files/watchwordでルーム作成・合言葉取得(Valkey に TTL 10 分で保存) - 送信者: ws 接続 →
{ "action": "create", "passphrase": "合言葉" }送信 - 受信者: ws 接続 →
{ "action": "join", "passphrase": "合言葉" }送信 - 送信者が
{ "action": "offer", ... }を送信(A3: offer の起点は送信者) - 受信者が offer を受信 →
{ "action": "answer", ... }を送信 - 双方が
{ "action": "ice", ... }で ICE candidate を交換(サーバーが相手へ中継) - P2P 確立後、ws 接続は切断してよい(サーバーは切断を強制しない)
シーケンス(A3)
送信者(A) サーバー 受信者(B)
| | |
|-- create ------->| |
|<-- ok -----------| |
| |<----- join ------|
| |------ ok ------->|
|-- offer -------->|-- offer relay -->|
| |<----- answer ----|
|<-- answer relay -| |
|-- ice ---------->|-- ice relay ---->|
|<-- ice relay ----|<----- ice -------|
ルーム満員時(A8)
ルームには creator(送信者)と joiner(受信者)の 最大 2 接続まで。
3 人目が join した場合:
{ "error": "room_full" }
エラー送信後、サーバーは当該 WebSocket 接続を閉じる。
メッセージ フォーマット
{
"action": "create|join|offer|answer|ice",
"passphrase": "合言葉",
"data": {
"sdp": "...",
"candidate": "..."
}
}
メッセージ フィールド
成功応答
create / join 成功時:
{ "action": "create|join", "status": "ok" }