dsh-client-connection:history 等大载荷 RPC 受全局 30s 超时限制,Web 端报「历史加载失败:signal timed out (internal)」—— timeoutPolicy 钩子已存在但无人接线 #7143
Replies: 1 comment
|
你的根因判断在 0.1.1-rc.2 上成立,链路还能再补完整一点:这 30s 来自当时的 链路(行号均为 tag
三处修正/补充:
用户侧确实没有入口: 现状:这个 30s 已经不在代码里了。 未验证: (同一份报告还有 #7144。) |
Uh oh!
There was an error while loading. Please reload this page.
环境:@deepseek-ai/dsh 0.1.1-rc.2(依赖 @deepseek-ai/dsh-client-connection 0.1.1-rc.2)· Windows 11 · Web 面板。
现象:Web 端加载较长会话的历史时报「历史加载失败:signal timed out (internal)」。错误来自 AbortSignal.timeout() 到期被掐断。
复现条件:会话历史较大(长会话、记录数百 KB 级)且宿主正忙(前端同时在生成/压缩)时稳定出现;小会话或空闲宿主不复现。
根因(lib/client.js,0.1.1-rc.2 行号实测):
timeoutPolicy 钩子已存在且已贯通到 HTTP 层,但没有任何调用方传非 "default" 策略;this.timeoutMs 默认 DEFAULT_TIMEOUT_MS = 3e4(30s,@6124,仅作构造默认值,唯一构造点不透传 timeoutMs)。history 这类大载荷 RPC 因此与普通 RPC 共用同一 30s 上限,忙宿主下跑不满即被掐断。另注意:@6188 的非 "default" 分支不构造任何库侧超时,请求信号直接采用调用方传入的 signal —— 若调用方只传一个策略字符串而 signal 缺省(undefined),该请求将完全没有超时。
建议修法:让 history(及同类大载荷 RPC)的调用方传非 "default" 的 timeoutPolicy,并自带更长的 AbortSignal(如 AbortSignal.timeout(3e5));或由库新增具名策略(如 "long" ≈ 300s)并在该分支构造对应超时(调用方无需自造 signal);或按载荷大小自适应放宽超时。钩子已在,改动面很小。
临时缓解(本机已用):把 lib/client.js 里 DEFAULT_TIMEOUT_MS 由 3e4 改 3e5(单字节改动)。注意它在 node_modules 里,升级/重装会静默还原;且构造点不透传 timeoutMs,用户侧没有任何配置入口 —— 若能提供配置项或让调用方自带策略更佳。
影响面:若只全局调大默认值,「真卡死的宿主」要多等 5 分钟才报错;按策略/按载荷放宽不影响快速失败语义。
All reactions