fix: report exceptions from nextTick (#26579)

Fixes: https://github.com/denoland/deno/issues/24713
Fixes: https://github.com/denoland/deno/issues/25855
This commit is contained in:
snek 2024-10-28 18:16:43 +01:00 committed by GitHub
parent f61af864df
commit 4e38fbd0a3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 72 additions and 4 deletions

View File

@ -62,6 +62,8 @@ export function processTicksAndRejections() {
callback(...args);
}
}
} catch (e) {
reportError(e);
} finally {
// FIXME(bartlomieju): Deno currently doesn't support async hooks
// if (destroyHooksExist())

View File

@ -212,3 +212,7 @@ itest!(unhandled_rejection_web_process {
envs: env_vars_for_npm_tests(),
http_server: true,
});
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// The itest macro is deprecated. Please move your new test to ~/tests/specs.
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

View File

@ -43,9 +43,6 @@
// TODO(littledivy): windows ipc streams not yet implemented
"test-child-process-fork-ref.js",
"test-child-process-fork-ref2.js",
// TODO(bartlomieju): this test is very flaky on CI
// https://github.com/denoland/deno/issues/25855
// "test-child-process-ipc-next-tick.js",
"test-child-process-ipc.js",
"test-child-process-spawnsync-env.js",
"test-child-process-stdio-inherit.js",
@ -240,6 +237,7 @@
"test-child-process-execfilesync-maxbuf.js",
"test-child-process-execsync-maxbuf.js",
"test-child-process-flush-stdio.js",
"test-child-process-ipc-next-tick.js",
"test-child-process-kill.js",
"test-child-process-set-blocking.js",
"test-child-process-spawn-args.js",

View File

@ -280,7 +280,6 @@ NOTE: This file should not be manually edited. Please edit `tests/node_compat/co
- [parallel/test-child-process-fork3.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-fork3.js)
- [parallel/test-child-process-http-socket-leak.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-http-socket-leak.js)
- [parallel/test-child-process-internal.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-internal.js)
- [parallel/test-child-process-ipc-next-tick.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-ipc-next-tick.js)
- [parallel/test-child-process-ipc.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-ipc.js)
- [parallel/test-child-process-no-deprecation.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-no-deprecation.js)
- [parallel/test-child-process-pipe-dataflow.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-pipe-dataflow.js)

View File

@ -0,0 +1,46 @@
// deno-fmt-ignore-file
// deno-lint-ignore-file
// Copyright Joyent and Node contributors. All rights reserved. MIT license.
// Taken from Node 18.12.1
// This file is automatically generated by `tests/node_compat/runner/setup.ts`. Do not modify this file manually.
'use strict';
const common = require('../common');
const assert = require('assert');
const cp = require('child_process');
const NUM_MESSAGES = 10;
const values = [];
for (let i = 0; i < NUM_MESSAGES; ++i) {
values[i] = i;
}
if (process.argv[2] === 'child') {
const received = values.map(() => { return false; });
process.on('uncaughtException', common.mustCall((err) => {
received[err] = true;
const done = received.every((element) => { return element === true; });
if (done)
process.disconnect();
}, NUM_MESSAGES));
process.on('message', (msg) => {
// If messages are handled synchronously, throwing should break the IPC
// message processing.
throw msg;
});
process.send('ready');
} else {
const child = cp.fork(__filename, ['child']);
child.on('message', common.mustCall((msg) => {
assert.strictEqual(msg, 'ready');
values.forEach((value) => {
child.send(value);
});
}));
}

View File

@ -0,0 +1,4 @@
{
"args": "run main.ts",
"output": "main.out"
}

View File

@ -0,0 +1,2 @@
caught Error: thrown from next tick
at file:///[WILDCARD]/specs/node/next_tick_uncaught_exception/main.ts:4:15

View File

@ -0,0 +1,13 @@
import process from "node:process";
import { strictEqual } from "node:assert";
const error = new Error("thrown from next tick");
process.on("uncaughtException", (caught) => {
strictEqual(caught, error);
console.log("caught", caught);
});
process.nextTick(() => {
throw error;
});