Skip to content

fix: make websocket cleanup cancellation-safe - #20

Merged
typefield merged 3 commits into
open-dingtalk:mainfrom
typefield:agent/fix-stream-lifecycle
Jul 30, 2026
Merged

fix: make websocket cleanup cancellation-safe#20
typefield merged 3 commits into
open-dingtalk:mainfrom
typefield:agent/fix-stream-lifecycle

Conversation

@typefield

@typefield typefield commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Summary

在已合并 #17 的重连风暴修复之上,补齐连接清理、handler 背压、重复消息和包兼容性问题:

  • disconnect/replacement 会终止并 settle 正在 CONNECTING 的 WebSocket
  • socket handler 始终绑定来源 socket,旧连接事件不能修改替代连接状态
  • 清理旧 socket、heartbeat、reconnect timer 和 AbortController,避免端口/句柄泄漏
  • 单一 active connect promise 防止 endpoint lookup 期间的 reconnect 请求丢失
  • EVENT/CALLBACK handler 默认分别最多 100 个;EVENT 过载回复 LATER
  • EVENT 按 messageId 合并并发重复处理,成功 ACK 使用有界 TTL cache
  • async EVENT 会被 await;async CALLBACK rejection 被捕获,不产生 unhandled rejection
  • callback response 使用 AsyncLocalStorage 写回来源 socket
  • callback wrapper 保留原 listener identity,off(topic, originalCallback) 继续有效
  • server disconnect 先 ACK 来源 socket,再关闭并进入正常重连
  • HTTP 请求增加 timeout,debug 日志不输出 secret/ticket
  • 修复 Node 20+ 示例启动、package main、lockfile、CJS/ESM pack 导入
  • 版本升级至 v2.1.7-beta.1
  • CI 覆盖 Linux Node 18/20/22/24 与 Windows 20/24

Related issues and PRs

Closes #12.
Refs #13.
Closes #16.
Closes #18.
Follow-up to #17; also covers the async handler use case from closed/unmerged #9.

Validation

  • Node 18/20/22/24 lifecycle and reconnect suites
  • lifecycle suite连续 50 轮,至少 1,250 次真实本地连接/断开
  • npm testnpm run typecheck
  • node --trace-warnings test/lifecycle-mock.mjs
  • packed artifact CJS/ESM installation imports
  • actionlintgit diff --check

@wxianfeng

Copy link
Copy Markdown

CR 结论:LGTM,未发现本 PR 引入的阻断项。

已核对提交 b9f1aa3122c50d(head)。重点审查了 connect 去重与取消、socket 所有权隔离、重连退避、EVENT/CALLBACK 并发上限、AbortSignal、来源连接 ACK、事件去重缓存、AsyncLocalStorage callback 上下文,以及 CJS/ESM 打包和公开 npm registry lockfile。

本地验证(macOS / Node 22.15.0):

  • npm cinpm run typecheck 通过
  • lifecycle/reconnect 测试全部通过
  • npm pack --dry-run 通过,CJS/ESM/types 均包含在包内

GitHub CI:6/6 通过。

非阻断 follow-up:当前生产依赖的 npm audit 报告 1 critical、2 high、1 moderate(axios / ws / form-data / follow-redirects);核对后这些精确锁定版本与 PR base 相同,并非本 PR 引入。建议另开依赖升级 PR 处理。

@typefield
typefield marked this pull request as ready for review July 30, 2026 12:15
@typefield
typefield merged commit b38b32f into open-dingtalk:main Jul 30, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants