前言¶
DeepSeek Harness(DSH)的 /api/remote.mux 使用 WebSocket 傳輸會話回放。在非本地網絡(如 Tailscale、VPN、公網反向代理)中,鏈路存在延遲或丟包時,會話會反覆重傳同一份 transcript,導致帶寬佔用較高。同時 DSH 的 web 服務器只提供 HTTP gzip,不覆蓋流式 WebSocket。dsh-ws-deflate 在不修改 DSH 安裝樹的前提下,爲 WebSocket 傳輸開啓 permessage-deflate,實測可減少約 70.9% 的傳輸字節數。
這是什麼¶
這是一個 DSH 插件,用於在 DSH web 進程運行時爲 WebSocket 傳輸開啓 permessage-deflate。插件通過運行時 monkey-patch WebSocketServer.prototype.handleUpgrade,在握手階段設置 this.options.perMessageDeflate,使 DSH 的 gateway 已經構建的 WebSocketServer({ noServer: true }) 使用壓縮。插件以內存方式生效,不改變磁盤文件,因此卸載後無需恢復。
核心功能¶
- 爲
/api/remote.mux的 WebSocket 握手啓用permessage-deflate,無需修改 DSH 安裝目錄。 - 在內存中對
dsh進程的ws模塊進行 patch,設置壓縮選項。 - 壓縮閾值爲 1 KiB,低於此大小的幀不壓縮(median 事件約 800 B)。
- 壓縮級別默認爲 6,可配置;獨立 deflate stream(
noContextTakeover: true)。 - 插件激活時執行自檢:在本地 loopback 端口建立
WebSocketServer({ noServer: true })並完成握手,驗證當前進程與ws副本支持permessage-deflate。 - 日誌可配置成功協商次數上限(
maxLog),默認 5。
安裝與啓用¶
dsh plugin --profile web add dsh-ws-deflate
安裝後需要重啓 dsh web 才能生效,因爲插件列表在啓動時讀取。如果不想重啓,可以編輯 cordis.patch.yml 並讓配置熱重載(.volatile() 字段)。
典型用法¶
在 dsh web 運行後,日誌中應出現以下三行(示例):
[dsh-ws-deflate] permessage-deflate enabled -> …/node_modules/ws [ws 8.22.0] via path (level 6, threshold 1024 B, noContextTakeover on)
[dsh-ws-deflate] self test OK: this process negotiates permessage-deflate
[dsh-ws-deflate] negotiated permessage-deflate with Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) …
瀏覽器端可在 DevTools 的 Network → remote.mux 請求中查看 Response Headers,應包含類似:
Sec-WebSocket-Extensions: permessage-deflate; …
適用場景與注意¶
適合在非本地環境使用 dsh web 時安裝,如通過 Tailscale/VPN、公網反向代理等存在延遲或丟包的場景。僅在 localhost 或局域網內使用時,壓縮收益有限,可不必安裝。
注意事項:
- 插件是運行時 monkey-patch,非官方擴展點;每次 DSH 升級後,需要確認 patch 仍然有效。
- 插件以當前
dsh進程的權限運行,安裝前建議查看源碼與許可證(MIT)。 - 插件不會修改 DSH 安裝樹中的文件,卸載後無需恢復任何配置或文件。
短結尾¶
dsh-ws-deflate 通過內存中的 wrapper 設置 perMessageDeflate,在不修改 DSH 安裝樹的前提下減少 WebSocket 傳輸字節數。適合在非本地環境使用 dsh web 的場景。目錄頁:https://www.skillhub.cn/plugins/Wanderingss/dsh-ws-deflate;GitHub:https://github.com/Wanderingss/dsh-ws-deflate