From 67e44e25e892039883825571078587f472df2b0f Mon Sep 17 00:00:00 2001 From: Kai Tamkun <13513421+heimskr@users.noreply.github.com> Date: Mon, 18 Aug 2025 20:32:46 -0700 Subject: [PATCH] Call JSC::VM::notifyNeedTermination on process.exit in a Web Worker (#21962) ### What does this PR do? Calling `process.exit` inside a Web Worker now immediately notifies the VM that it needs to terminate. Previously, `napi_call_function` would return success in a Web Worker even if the JS code called `process.exit`. Now it'll return `napi_pending_exception`. ### How did you verify your code works? Ran Node's NAPI tests (`node-api/test_worker_terminate/test.js` now passes) in addition to our own NAPI tests. --- src/bun.js/bindings/napi.cpp | 4 ++++ src/bun.js/web_worker.zig | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp index fb56166da8..c2c496e776 100644 --- a/src/bun.js/bindings/napi.cpp +++ b/src/bun.js/bindings/napi.cpp @@ -2763,6 +2763,10 @@ extern "C" napi_status napi_call_function(napi_env env, napi_value recv, JSValue res = AsyncContextFrame::call(globalObject, funcValue, thisValue, args); + if (env->isVMTerminating()) { + return napi_set_last_error(env, napi_pending_exception); + } + if (result) { if (res.isEmpty()) { *result = toNapi(JSC::jsUndefined(), globalObject); diff --git a/src/bun.js/web_worker.zig b/src/bun.js/web_worker.zig index b3b80b8aae..7200c7ac7b 100644 --- a/src/bun.js/web_worker.zig +++ b/src/bun.js/web_worker.zig @@ -555,7 +555,7 @@ pub fn notifyNeedTermination(this: *WebWorker) callconv(.c) void { if (this.vm) |vm| { vm.eventLoop().wakeup(); - // TODO(@190n) notifyNeedTermination + vm.global.requestTermination(); } // TODO(@190n) delete