Replace the domain-based error handling with AsyncLocalStorage and setUncaughtExceptionCaptureCallback. This removes the REPL's dependency on the deprecated domain module while preserving all existing behavior: - Synchronous errors during eval are caught and displayed - Async errors (setTimeout, promises, etc.) are caught via the uncaught exception capture callback - Top-level await errors are caught and displayed - The REPL continues operating after errors - Multiple REPL instances can coexist with errors routed correctly Changes: - Use AsyncLocalStorage to track which REPL instance owns an async context, replacing domain's automatic async tracking - Add setupExceptionCapture() to install setUncaughtExceptionCaptureCallback for catching async errors and routing them to the correct REPL - Extract error handling logic into REPLServer.prototype._handleError() - Wrap eval execution in replContext.run() for async context tracking - Update newListener protection to check AsyncLocalStorage context - Throw ERR_INVALID_ARG_VALUE if options.domain is passed PR-URL: https://github.com/nodejs/node/pull/61227 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
32 lines
905 B
JavaScript
32 lines
905 B
JavaScript
'use strict';
|
|
|
|
const common = require('../common');
|
|
const fixtures = require('../common/fixtures');
|
|
const assert = require('assert');
|
|
const { startNewREPLServer } = require('../common/repl');
|
|
|
|
let found = false;
|
|
|
|
process.on('exit', () => {
|
|
assert.strictEqual(found, true);
|
|
});
|
|
|
|
const { input, output } = startNewREPLServer();
|
|
|
|
output.write = (data) => {
|
|
// Matching only on a minimal piece of the stack because the string will vary
|
|
// greatly depending on the JavaScript engine. V8 includes `;` because it
|
|
// displays the line of code (`var foo bar;`) that is causing a problem.
|
|
// ChakraCore does not display the line of code but includes `;` in the phrase
|
|
// `Expected ';' `.
|
|
if (/;/.test(data))
|
|
found = true;
|
|
};
|
|
|
|
let file = fixtures.path('syntax', 'bad_syntax');
|
|
|
|
if (common.isWindows)
|
|
file = file.replace(/\\/g, '\\\\');
|
|
|
|
input.run(['.clear']);
|
|
input.run([`require('${file}');`]);
|