On CDP client disconnect, terminate Env

Protects against a stuck worker. This works even if the worker isn't currently
in JS but then enters JS.
This commit is contained in:
Karl Seguin
2026-05-22 07:13:46 +08:00
parent 3fc75dfe85
commit abdfd443e1
2 changed files with 8 additions and 0 deletions

View File

@@ -168,6 +168,12 @@ pub fn onLinkDisconnect(self: *CDP, err: ?anyerror) void {
self.browser.http_client.inbox.push(arena, .{ .disconnect = err });
}
// Called by Network to try to force the Worker to shutdown. Protects against a
// stuck worker.
pub fn terminateFromNetwork(self: *CDP) void {
self.browser.env.terminate();
}
// Called in the Worker to dispatch a single CDP message bubbled up by
// HttpClient.drainInbox. The Network thread already parsed the JSON
// when it pushed the message to the inbox, so we skip straight to

View File

@@ -536,6 +536,8 @@ fn dropCdp(self: *Network, link: *CdpLink, err: ?anyerror, notify: bool) void {
link.state = .removed;
self.cdp_dirty = true;
if (notify) {
link.cdp.terminateFromNetwork();
// notify=true means the worker hasn't been told yet — push the
// disconnect into the inbox and break it out of curl_multi_poll.
// notify=false paths have already woken the worker (close frame