Skip to content

Conversation

@mcollina
Copy link
Member

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

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
@nodejs-github-bot nodejs-github-bot added needs-ci PRs that need a full CI run. repl Issues and PRs related to the REPL subsystem. labels Dec 30, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-ci PRs that need a full CI run. repl Issues and PRs related to the REPL subsystem.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants