codex@macbookpro
·
2026-03-27
BUG-013-stream-session-timer-not-cleared.md
1# BUG-013: firefox-bridge stream session 关闭时未清除 openTimer/idleTimer
2
3## 状态
4
5- 已修复(2026-03-27,代码核对 + 自动化验证)
6
7## 当前代码结论
8
9- `apps/conductor-daemon/src/firefox-bridge.ts` 的 stream session 关闭路径当前会经由 `close()` 调用 `clearTimers()`
10- `clearTimers()` 会统一清理 `openTimer` 和 `idleTimer`
11- `apps/conductor-daemon/src/index.test.js` 已补 `FirefoxCommandBroker clears stream timers after the stream ends` 回归测试
12- 验证结果:
13 - `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build` 通过
14 - `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js` 通过(`32/32`)
15
16## 修复前现象
17
18stream session 关闭后,先前设置的 `openTimer` 和 `idleTimer` 仍在运行。timer 触发时由于 `closed` flag 保护不会产生功能异常,但 session 对象在 timer 到期前无法被 GC。
19
20- 哪个模块:`apps/conductor-daemon/src/firefox-bridge.ts`,`FirefoxBridgeApiStreamSession` 类
21- 返回了什么:功能正常,但存在不必要的内存驻留
22- 预期:session 关闭时应立即清除所有 timer
23- 是否稳定复现:每次 stream session 正常结束或异常关闭都会触发
24
25## 修复前触发路径
26
27```text
28POST /v1/browser/request (responseMode: "sse")
29-> 创建 FirefoxBridgeApiStreamSession
30-> resetOpenTimer() — 设置 openTimeoutMs timer
31-> 收到 stream_open -> resetIdleTimer() — 设置 idleTimeoutMs timer
32-> 收到 stream_end -> finishWithEvent()
33-> session 关闭,但 timer 仍保留到超时
34```
35
36## 修复前根因
37
38这张卡最初来自代码审查时的旧判断:认为 `finishWithEvent()` 没有同步清理 timer。
39
40按当前代码核对,真正的关闭路径是:
41
42- `finishWithEvent()` -> `close()`
43- `close()` -> `clearTimers()`
44
45所以这张 bug 在当前代码里已经不成立;本轮补的是自动化回归测试,防止后续回归。
46
47## 修复方案(已落地)
48
49- 不再额外修改 `firefox-bridge.ts` 逻辑
50- 在 `apps/conductor-daemon/src/index.test.js` 中新增 broker 级回归测试:
51 - 创建 stream session
52 - 收到 `stream_open` / `stream_end`
53 - 再推进 timer
54 - 验证不会再发送 timeout / cancel
55
56## 备注
57
58- 当前文档保留为问题归档;实际代码已具备 timer 清理
59- 这次新增的是自动化保护,而不是新的运行时代码分支