tqcq/dsh-auto-reconnect

dsh-auto-reconnect

Client-only auto-reconnect for the DSH web client.

待分类dshdsh-plugin-marketdsh-plugins

dsh-auto-reconnect

English | 中文

DSH 网页客户端的自动重连插件。官方连接控制器自带退避重连,但有两种场景会睡死,本插件负责唤醒。纯客户端插件,零构建,不改任何官方包。

安装 / 卸载

dsh plugin --profile web add github:tqcq/dsh-auto-reconnect

然后重启 dsh-web——增删插件必须重启,只刷新浏览器不够。

升级(重跑 add 不会移动已解析的 commit,用 update 重新解析):

dsh plugin --profile web update dsh-auto-reconnect

卸载:

dsh plugin --profile web remove dsh-auto-reconnect

运行时调整,无需重装(改完刷新页面):

localStorage["dsh-auto-reconnect"] = JSON.stringify({ minIntervalMs: 3000, retryDelayMs: 3000, maxAutoRetries: 20, log: true });

官方控制器的两个盲区(源码取证)

对照实际加载的 @deepseek-ai/dsh-client-connection 0.1.2-rc.1:

  1. 终态 disconnected 永久休眠。官方退避(500ms→10s)打满后进入终态,只等浏览器 online 事件或手动点重连。手机休眠唤醒全程 navigator.onLine === true,online 永不触发,所以每次唤醒都得手动点。
  2. 僵死 connected。官方客户端没有 visibilitychange / focus 监听,也没有心跳。TCP 被静默掐断后 WebSocket 停在 OPEN,状态仍报 connected。

本插件做什么

监听 visibilitychange(→visible)、focus、pointerdown、keydown、pageshow(persisted),并订阅连接状态流:

  • 事件唤醒:状态 ≠ connected 时才调 connection.reconnect()(重置退避、立即重试),绝不打断健康连接。
  • bfcache 恢复(persisted):套接字必死,无条件重连。
  • 状态滑入终态 disconnected:延迟自动重试(默认 3s),连续预算 20 次,回到 connected 即复位。覆盖"页面已可见已聚焦、之后再也没有浏览器事件"的场景(2026-09-11 实报:宿主重启后硬刷新落终态,仍需手动点)。

每次触发都打 [dsh-auto-reconnect] 前缀日志(DevTools console 可取证),默认 3s 节流。

兼容性

  • 宿主 @deepseek-ai/dsh 0.1.5-rc.2 实机运行(boot 激活断言全绿)。
  • 客户端契约对照 dsh-client-connection 0.1.2-rc.1 源码取证。
  • ctx.connection 形状不符时只警告并闲置,不炸页面:API 漂移时优雅降级。

局限(挂账)

僵死 connected 的一般形态(后台标签被 NAT 掐断、无 OS 休眠)客户端探测不了:RPC 单播走独立 HTTP 通道,探测成功不代表 WebSocket 活着。根治需要宿主侧心跳 + 死连接清扫(思路参考已废弃的 enterhalf/dsh-web-network-optimizer),需要时另立插件。

测试

node tests/client_test.js   # 14 组,vm 沙箱模拟 DOM/连接句柄,无需浏览器

二次开发注记

  • 包内 cordis.patch.yml 恒为 []:只写注释会解析成 null,直接炸 profile 启动。
  • 只改客户端代码则浏览器硬刷新即可,无需重启 dsh-web。

License: MIT(见 LICENSE)。