前言¶
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