MINARA

通過多路複用 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>

頻道

ChannelKeyReplaySource
chatsession_idyesPOST /v1/chat/stream
notifications""nonotification bus
prefs""noruntime preferences
depositchain:asset:addressyesdeposit watch
withdrawoperationIdyeswithdraw watch
workflowinstanceIdyesworkflow run bus
data-studiosession_idyesData Studio preview

chatdepositwithdrawworkflowdata-studio 支持重放;notificationsprefs 只發送訂閱後產生的實時事件。按需頻道會在首個訂閱者加入時啟動上游,並在最後一個訂閱者離開時停止。

客戶端到服務端幀

發送 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 單調遞增,typedata 保留頻道事件的原始結構。

{ "channel": "chat", "key": "chat_abc", "seq": 12, "type": "text_delta", "data": { "text": "…" }

控制幀

__error 表示訂閱被拒絕或沒有實時流;__truncated 表示重放緩衝區已溢出並丟棄更早事件。這兩種幀的 seq 都為 0,不參與重放。

重連與恢復

斷線後,參考客戶端使用指數退避重連,並從每個頻道已見過的最高 seq 恢復。緩衝區只存在於當前進程,網關重啟後不會保留。重試預算耗盡時,每個實時訂閱的錯誤處理器會觸發一次,同時客戶端仍按封頂退避繼續嘗試。

保活

網關會按固定間隔向每個打開的套接字發送 ping。瀏覽器會自動 pong,從而避免代理關閉空閒連接,包括當前沒有活動訂閱的連接。

本頁目錄