diff --git a/lib/events.js b/lib/events.js index 996658e1d3f565..9bb22059c1fd9a 100644 --- a/lib/events.js +++ b/lib/events.js @@ -84,6 +84,7 @@ const { validateObject, validateString, } = require('internal/validators'); +const { addAbortListener } = require('internal/events/abort_listener'); const kCapture = Symbol('kCapture'); const kErrorMonitor = Symbol('events.errorMonitor'); @@ -1222,32 +1223,3 @@ function listenersController() { }, }; } - -let queueMicrotask; - -function addAbortListener(signal, listener) { - if (signal === undefined) { - throw new ERR_INVALID_ARG_TYPE('signal', 'AbortSignal', signal); - } - validateAbortSignal(signal, 'signal'); - validateFunction(listener, 'listener'); - - let removeEventListener; - if (signal.aborted) { - queueMicrotask ??= require('internal/process/task_queues').queueMicrotask; - queueMicrotask(() => listener()); - } else { - kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation; - // TODO(atlowChemi) add { subscription: true } and return directly - signal.addEventListener('abort', listener, { __proto__: null, once: true, [kResistStopPropagation]: true }); - removeEventListener = () => { - signal.removeEventListener('abort', listener); - }; - } - return { - __proto__: null, - [SymbolDispose]() { - removeEventListener?.(); - }, - }; -} diff --git a/lib/internal/events/abort_listener.js b/lib/internal/events/abort_listener.js new file mode 100644 index 00000000000000..033cbf7b250fe0 --- /dev/null +++ b/lib/internal/events/abort_listener.js @@ -0,0 +1,54 @@ +'use strict'; + +const { + SymbolDispose, +} = primordials; +const { + validateAbortSignal, + validateFunction, +} = require('internal/validators'); +const { + codes: { + ERR_INVALID_ARG_TYPE, + }, +} = require('internal/errors'); + +let queueMicrotask; +let kResistStopPropagation; + +/** + * @param {AbortSignal} signal + * @param {EventListener} listener + * @returns {Disposable} + */ +function addAbortListener(signal, listener) { + if (signal === undefined) { + throw new ERR_INVALID_ARG_TYPE('signal', 'AbortSignal', signal); + } + validateAbortSignal(signal, 'signal'); + validateFunction(listener, 'listener'); + + let removeEventListener; + if (signal.aborted) { + queueMicrotask ??= require('internal/process/task_queues').queueMicrotask; + queueMicrotask(() => listener()); + } else { + kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation; + // TODO(atlowChemi) add { subscription: true } and return directly + signal.addEventListener('abort', listener, { __proto__: null, once: true, [kResistStopPropagation]: true }); + removeEventListener = () => { + signal.removeEventListener('abort', listener); + }; + } + return { + __proto__: null, + [SymbolDispose]() { + removeEventListener?.(); + }, + }; +} + +module.exports = { + __proto__: null, + addAbortListener, +}; diff --git a/test/parallel/test-bootstrap-modules.js b/test/parallel/test-bootstrap-modules.js index 124e106067640f..6327fbeb2e7e1b 100644 --- a/test/parallel/test-bootstrap-modules.js +++ b/test/parallel/test-bootstrap-modules.js @@ -99,6 +99,7 @@ expected.beforePreExec = new Set([ 'Internal Binding module_wrap', 'NativeModule internal/modules/cjs/loader', 'Internal Binding wasm_web_api', + 'NativeModule internal/events/abort_listener', ]); expected.atRunTime = new Set([