aboutsummaryrefslogtreecommitdiff
path: root/src/cdp
diff options
context:
space:
mode:
Diffstat (limited to 'src/cdp')
-rw-r--r--src/cdp/session.ts8
-rw-r--r--src/cdp/transport.ts3
2 files changed, 10 insertions, 1 deletions
diff --git a/src/cdp/session.ts b/src/cdp/session.ts
index fffa241..b1ae71c 100644
--- a/src/cdp/session.ts
+++ b/src/cdp/session.ts
@@ -45,7 +45,13 @@ export const createCdpSession = (transport: CdpTransport): CdpSession => {
};
const restartConsumer = (): void => {
- activeConsumer = activeConsumer.then(() => consumeEvents()).catch(() => undefined);
+ activeConsumer = activeConsumer.then(() => consumeEvents()).catch((e: unknown) => {
+ // The .then() chain calls consumeEvents() which iterates the transport's
+ // events() AsyncIterable. The iterable resolves cleanly on close (returns
+ // {done:true}); any rejection here is an unexpected bug in the event
+ // handler, not a normal termination. Surface it on stderr so it's not lost.
+ console.warn("[pi-browser-harness] CDP event consumer crashed:", e);
+ });
};
restartConsumer();
diff --git a/src/cdp/transport.ts b/src/cdp/transport.ts
index 6da25fa..c5a5a41 100644
--- a/src/cdp/transport.ts
+++ b/src/cdp/transport.ts
@@ -156,6 +156,9 @@ export const createCdpTransport = (): CdpTransport => {
clearTimeout(timer);
ws = null;
cleanup("WebSocket closed");
+ // If onopen already settled the connect promise, this settle is a no-op
+ // (guarded by `settled`). cleanup() above still runs unconditionally so
+ // pending requests are rejected and the event queue is rotated.
settle(err(cdpError("transport_closed", "CDP WebSocket closed")));
};
});