From 75420ba12a6419dd0aa86805ac41e04172e4358f Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Wed, 8 May 2024 19:51:39 -0700 Subject: [PATCH] Implement `process.hasUncaughtExceptionCaptureCallback()` (#10937) --- docs/runtime/nodejs-apis.md | 2 +- src/bun.js/bindings/BunProcess.cpp | 16 ++++++++++++++++ test/js/node/process/process.test.js | 8 ++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/runtime/nodejs-apis.md b/docs/runtime/nodejs-apis.md index 57f3f15780ac1..9f0384595b8ee 100644 --- a/docs/runtime/nodejs-apis.md +++ b/docs/runtime/nodejs-apis.md @@ -341,7 +341,7 @@ The table below lists all globals implemented by Node.js and Bun's current compa ### [`process`](https://nodejs.org/api/process.html) -🟡 Missing `domain` `hasUncaughtExceptionCaptureCallback` `initgroups` `setUncaughtExceptionCaptureCallback` `setegid` `seteuid` `setgid` `setgroups` `setuid` `allowedNodeEnvironmentFlags` `getActiveResourcesInfo` `setActiveResourcesInfo` `moduleLoadList` `setSourceMapsEnabled` `channel`. `process.binding` is partially implemented. +🟡 Missing `domain` `hasUncaughtExceptionCaptureCallback` `initgroups` `setegid` `seteuid` `setgid` `setgroups` `setuid` `allowedNodeEnvironmentFlags` `getActiveResourcesInfo` `setActiveResourcesInfo` `moduleLoadList` `setSourceMapsEnabled` `channel`. `process.binding` is partially implemented. ### [`queueMicrotask()`](https://developer.mozilla.org/en-US/docs/Web/API/queueMicrotask) diff --git a/src/bun.js/bindings/BunProcess.cpp b/src/bun.js/bindings/BunProcess.cpp index 18444f371d42e..ba053a6073ed6 100644 --- a/src/bun.js/bindings/BunProcess.cpp +++ b/src/bun.js/bindings/BunProcess.cpp @@ -499,6 +499,21 @@ JSC_DEFINE_HOST_FUNCTION(Process_setUncaughtExceptionCaptureCallback, return JSC::JSValue::encode(jsUndefined()); } +JSC_DEFINE_HOST_FUNCTION(Process_hasUncaughtExceptionCaptureCallback, + (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + auto* zigGlobal = jsDynamicCast(globalObject); + if (UNLIKELY(!zigGlobal)) { + zigGlobal = Bun__getDefaultGlobal(); + } + JSValue cb = jsCast(zigGlobal->processObject())->getUncaughtExceptionCaptureCallback(); + if (cb.isEmpty() || !cb.isCell()) { + return JSValue::encode(jsBoolean(false)); + } + + return JSValue::encode(jsBoolean(true)); +} + extern "C" uint64_t Bun__readOriginTimer(void*); JSC_DEFINE_HOST_FUNCTION(Process_functionHRTime, @@ -2787,6 +2802,7 @@ extern "C" void Process__emitDisconnectEvent(Zig::GlobalObject* global) exitCode processExitCode CustomAccessor features constructFeatures PropertyCallback getActiveResourcesInfo Process_stubFunctionReturningArray Function 0 + hasUncaughtExceptionCaptureCallback Process_hasUncaughtExceptionCaptureCallback Function 0 hrtime constructProcessHrtimeObject PropertyCallback isBun constructIsBun PropertyCallback kill Process_functionKill Function 2 diff --git a/test/js/node/process/process.test.js b/test/js/node/process/process.test.js index 4ac6d45fe059d..e0c65dd7b55ad 100644 --- a/test/js/node/process/process.test.js +++ b/test/js/node/process/process.test.js @@ -603,3 +603,11 @@ it("aborts when the uncaughtExceptionCaptureCallback throws", async () => { expect(await proc.exited).toBe(1); expect(await new Response(proc.stderr).text()).toContain("bar"); }); + +it("process.hasUncaughtExceptionCaptureCallback", () => { + process.setUncaughtExceptionCaptureCallback(null); + expect(process.hasUncaughtExceptionCaptureCallback()).toBe(false); + process.setUncaughtExceptionCaptureCallback(() => {}); + expect(process.hasUncaughtExceptionCaptureCallback()).toBe(true); + process.setUncaughtExceptionCaptureCallback(null); +});