通過多路複用 WebSocket 進行流式傳輸
單個 WebSocket 承載聊天、通知、偏好設置、充提監控、工作流和 Data Studio 預覽,並支持逐頻道序列號與斷線重放。
GET /v1/stream (WebSocket)
網關的所有長連接服務端推送流都複用同一個 WebSocket。這樣可以避免佔滿瀏覽器每個來源約六條 HTTP/1.1 連接的限制,也不會因某個標籤頁中的繁忙或阻塞流影響其他普通請求。
| 方法 | GET (HTTP Upgrade: websocket) |
| 路徑 | /v1/stream |
| 認證 | ?token=<GATEWAY_AUTH_TOKEN> |
連接
連接 /v1/stream,並根據網關來源使用 ws:// 或 wss://。啟用 GATEWAY_AUTH_TOKEN 時追加 ?token=<token>;錯誤或缺失的 token 會在握手時以 401 拒絕。頻道表示流類型,鍵用於限定頻道內的一項訂閱。
wss://<gateway-host>/v1/stream?token=<GATEWAY_AUTH_TOKEN>頻道
| Channel | Key | Replay | Source |
|---|---|---|---|
chat | session_id | yes | POST /v1/chat/stream |
notifications | "" | no | notification bus |
prefs | "" | no | runtime preferences |
deposit | chain:asset:address | yes | deposit watch |
withdraw | operationId | yes | withdraw watch |
workflow | instanceId | yes | workflow run bus |
data-studio | session_id | yes | Data Studio preview |
chat、deposit、withdraw、workflow 與 data-studio 支持重放;notifications 與 prefs 只發送訂閱後產生的實時事件。按需頻道會在首個訂閱者加入時啟動上游,並在最後一個訂閱者離開時停止。
客戶端到服務端幀
發送 JSON 控制幀來訂閱或取消訂閱。同一 (channel, key) 的再次訂閱會替換舊連接。fromSeq 是重連游標;服務端只重放序列號嚴格大於它的緩衝事件。
{ "op": "subscribe", "channel": "chat", "key": "chat_abc", "fromSeq": 0 }{ "op": "unsubscribe", "channel": "chat", "key": "chat_abc" }服務端到客戶端幀
每個事件都是一個 JSON 幀。seq 在每個 (channel, key) 內從 1 單調遞增,type 與 data 保留頻道事件的原始結構。
{ "channel": "chat", "key": "chat_abc", "seq": 12, "type": "text_delta", "data": { "text": "…" }控制幀
__error 表示訂閱被拒絕或沒有實時流;__truncated 表示重放緩衝區已溢出並丟棄更早事件。這兩種幀的 seq 都為 0,不參與重放。
重連與恢復
斷線後,參考客戶端使用指數退避重連,並從每個頻道已見過的最高 seq 恢復。緩衝區只存在於當前進程,網關重啟後不會保留。重試預算耗盡時,每個實時訂閱的錯誤處理器會觸發一次,同時客戶端仍按封頂退避繼續嘗試。
保活
網關會按固定間隔向每個打開的套接字發送 ping。瀏覽器會自動 pong,從而避免代理關閉空閒連接,包括當前沒有活動訂閱的連接。