summaryrefslogtreecommitdiff
path: root/runtime/js/99_main.js
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2023-05-24 15:40:41 +0200
committerGitHub <noreply@github.com>2023-05-24 15:40:41 +0200
commit0bb5bbc7a0ff7565a4c7fa4ebc8c69e02f76e6b5 (patch)
treea5ab85f34d7984428288cb8d221cf09851d333bd /runtime/js/99_main.js
parent787e1f0f92e81f025ec0dfdce2acff15900267fc (diff)
fix(node): fire 'unhandledrejection' event when using node: or npm: imports (#19235)
This commit fixes emitting "unhandledrejection" event when there are "node:" or "npm:" imports. Before this commit the Node "unhandledRejection" event was emitted using a regular listener for Web "unhandledrejection" event. This listener was installed before any user listener had a chance to be installed which effectively prevent emitting "unhandledrejection" events to user code. Closes https://github.com/denoland/deno/issues/16928
Diffstat (limited to 'runtime/js/99_main.js')
-rw-r--r--runtime/js/99_main.js12
1 files changed, 11 insertions, 1 deletions
diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js
index f0c63df74..91d34272f 100644
--- a/runtime/js/99_main.js
+++ b/runtime/js/99_main.js
@@ -346,7 +346,8 @@ function promiseRejectCallback(type, promise, reason) {
}
return !!globalThis_.onunhandledrejection ||
- event.listenerCount(globalThis_, "unhandledrejection") > 0;
+ event.listenerCount(globalThis_, "unhandledrejection") > 0 ||
+ typeof internals.nodeProcessUnhandledRejectionCallback !== "undefined";
}
function promiseRejectMacrotaskCallback() {
@@ -383,6 +384,15 @@ function promiseRejectMacrotaskCallback() {
globalThis_.dispatchEvent(rejectionEvent);
globalThis_.removeEventListener("error", errorEventCb);
+ // If event was not yet prevented, try handing it off to Node compat layer
+ // (if it was initialized)
+ if (
+ !rejectionEvent.defaultPrevented &&
+ typeof internals.nodeProcessUnhandledRejectionCallback !== "undefined"
+ ) {
+ internals.nodeProcessUnhandledRejectionCallback(rejectionEvent);
+ }
+
// If event was not prevented (or "unhandledrejection" listeners didn't
// throw) we will let Rust side handle it.
if (rejectionEvent.defaultPrevented) {