diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2023-05-24 15:40:41 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-24 15:40:41 +0200 |
commit | 0bb5bbc7a0ff7565a4c7fa4ebc8c69e02f76e6b5 (patch) | |
tree | a5ab85f34d7984428288cb8d221cf09851d333bd /runtime/js/99_main.js | |
parent | 787e1f0f92e81f025ec0dfdce2acff15900267fc (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.js | 12 |
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) { |