From 6fbf5dbf29400283a533644acd7e99c5e8522dad Mon Sep 17 00:00:00 2001 From: green3sf <222944370+green3sf@users.noreply.github.com> Date: Wed, 19 Aug 2026 17:57:32 +0800 Subject: [PATCH] fix(browser): reject pending calls on invalidation --- packages/bcode-browser/src/cdp/session.ts | 2 ++ packages/bcode-browser/test/cdp-session.test.ts | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/bcode-browser/src/cdp/session.ts b/packages/bcode-browser/src/cdp/session.ts index 1eceb2615..6ea3ec8ad 100644 --- a/packages/bcode-browser/src/cdp/session.ts +++ b/packages/bcode-browser/src/cdp/session.ts @@ -206,6 +206,8 @@ export class Session implements Transport { const ws = this.ws; this.ws = undefined; this.activeSessionId = undefined; + for (const [, pending] of this.pending) pending.reject(error); + this.pending.clear(); try { ws?.close(); } catch { /* ignore */ } } diff --git a/packages/bcode-browser/test/cdp-session.test.ts b/packages/bcode-browser/test/cdp-session.test.ts index e6250cbf2..4db7ccc34 100644 --- a/packages/bcode-browser/test/cdp-session.test.ts +++ b/packages/bcode-browser/test/cdp-session.test.ts @@ -14,7 +14,8 @@ const server = Bun.serve({ ws.subscribe(channel) }, message(ws, message) { - const request = JSON.parse(String(message)) as { id?: number } + const request = JSON.parse(String(message)) as { id?: number; method?: string } + if (request.method === "Test.pending") return if (typeof request.id === "number") ws.send(JSON.stringify({ id: request.id, result: {} })) }, }, @@ -160,3 +161,13 @@ test("invalidate while the socket is connecting closes it and rejects", async () await expect(s._call("Runtime.evaluate", { expression: "1" })).rejects.toThrow("retired by test") await expect(s.connect({ wsUrl: `ws://127.0.0.1:${server.port}/` })).rejects.toThrow("retired by test") }) + +test("invalidate rejects in-flight CDP calls", async () => { + const s = new Session() + await s.connect({ wsUrl: `ws://127.0.0.1:${server.port}/` }) + const pending = s._call("Test.pending", {}) + + s.invalidate(new Error("retired with a pending call")) + + await expect(pending).rejects.toThrow("retired with a pending call") +})