From d7e7832e9f193f2cd1711908da1186b2deb91a7b Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Tue, 2 Sep 2025 18:19:28 +0800 Subject: [PATCH] Log unhandled promise rejection --- build.zig.zon | 4 ++-- src/runtime/js.zig | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index dd64b6e2..554951dd 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -5,8 +5,8 @@ .fingerprint = 0xda130f3af836cea0, .dependencies = .{ .v8 = .{ - .url = "https://github.com/lightpanda-io/zig-v8-fork/archive/e62726800663d0397d8766f7185040d8b8b69402.tar.gz", - .hash = "v8-0.0.0-xddH69zDAwD5i0hGhAsv3SPeihlj5fXGpJyO15KqBWOn", + .url = "https://github.com/lightpanda-io/zig-v8-fork/archive/efb353230f05c96d5ad96298f8b0b444de615644.tar.gz", + .hash = "v8-0.0.0-xddH6xHEAwCo_OGkWshjXdYHGk18oSG3XZPYtf4tvF0P", }, //.v8 = .{ .path = "../zig-v8-fork" } }, diff --git a/src/runtime/js.zig b/src/runtime/js.zig index ca16305e..0a82b6d5 100644 --- a/src/runtime/js.zig +++ b/src/runtime/js.zig @@ -197,6 +197,7 @@ pub fn Env(comptime State: type, comptime WebApis: type) type { // This is the callback that runs whenever a module is dynamically imported. isolate.setHostImportModuleDynamicallyCallback(JsContext.dynamicModuleCallback); + isolate.setPromiseRejectCallback(promiseRejectCallback); isolate.enter(); errdefer isolate.exit(); @@ -328,6 +329,20 @@ pub fn Env(comptime State: type, comptime WebApis: type) type { self.isolate.lowMemoryNotification(); } + fn promiseRejectCallback(v8_msg: v8.C_PromiseRejectMessage) callconv(.c) void { + const msg = v8.PromiseRejectMessage.initFromC(v8_msg); + const isolate = msg.getPromise().toObject().getIsolate(); + const v8_context = isolate.getCurrentContext(); + const context: *JsContext = @ptrFromInt(v8_context.getEmbedderData(1).castTo(v8.BigInt).getUint64()); + + const value = + if (msg.getValue()) |v8_value| valueToString(context.call_arena, v8_value, isolate, v8_context) catch |err| @errorName(err) + else "no value"; + + log.debug(.js, "unhandled rejection", .{.value =value}); + } + + // ExecutionWorld closely models a JS World. // https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/core/v8/V8BindingDesign.md#World // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/ExecutionWorld