Skip to content

Commit 21481d5

Browse files
committed
events: extract addAbortListener for safe internal use
Refs: nodejs#48596
1 parent 639c096 commit 21481d5

File tree

3 files changed

+56
-31
lines changed

3 files changed

+56
-31
lines changed

lib/events.js

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ const {
4848
Symbol,
4949
SymbolFor,
5050
SymbolAsyncIterator,
51-
SymbolDispose,
5251
} = primordials;
5352
const kRejection = SymbolFor('nodejs.rejection');
5453

@@ -221,7 +220,7 @@ function EventEmitter(opts) {
221220
EventEmitter.init.call(this, opts);
222221
}
223222
module.exports = EventEmitter;
224-
module.exports.addAbortListener = addAbortListener;
223+
module.exports.addAbortListener = require('internal/events/abort_listener').addAbortListener;
225224
module.exports.once = once;
226225
module.exports.on = on;
227226
module.exports.getEventListeners = getEventListeners;
@@ -1227,32 +1226,3 @@ function listenersController() {
12271226
},
12281227
};
12291228
}
1230-
1231-
let queueMicrotask;
1232-
1233-
function addAbortListener(signal, listener) {
1234-
if (signal === undefined) {
1235-
throw new ERR_INVALID_ARG_TYPE('signal', 'AbortSignal', signal);
1236-
}
1237-
validateAbortSignal(signal, 'signal');
1238-
validateFunction(listener, 'listener');
1239-
1240-
let removeEventListener;
1241-
if (signal.aborted) {
1242-
queueMicrotask ??= require('internal/process/task_queues').queueMicrotask;
1243-
queueMicrotask(() => listener());
1244-
} else {
1245-
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
1246-
// TODO(atlowChemi) add { subscription: true } and return directly
1247-
signal.addEventListener('abort', listener, { __proto__: null, once: true, [kResistStopPropagation]: true });
1248-
removeEventListener = () => {
1249-
signal.removeEventListener('abort', listener);
1250-
};
1251-
}
1252-
return {
1253-
__proto__: null,
1254-
[SymbolDispose]() {
1255-
removeEventListener?.();
1256-
},
1257-
};
1258-
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
'use strict';
2+
3+
const {
4+
SymbolDispose,
5+
} = primordials;
6+
const {
7+
validateAbortSignal,
8+
validateFunction,
9+
} = require('internal/validators');
10+
const {
11+
codes: {
12+
ERR_INVALID_ARG_TYPE,
13+
},
14+
} = require('internal/errors');
15+
16+
let queueMicrotask;
17+
let kResistStopPropagation;
18+
19+
/**
20+
* @param {AbortSignal} signal
21+
* @param {EventListener} listener
22+
* @returns {Disposable}
23+
*/
24+
function addAbortListener(signal, listener) {
25+
if (signal === undefined) {
26+
throw new ERR_INVALID_ARG_TYPE('signal', 'AbortSignal', signal);
27+
}
28+
validateAbortSignal(signal, 'signal');
29+
validateFunction(listener, 'listener');
30+
31+
let removeEventListener;
32+
if (signal.aborted) {
33+
queueMicrotask ??= require('internal/process/task_queues').queueMicrotask;
34+
queueMicrotask(() => listener());
35+
} else {
36+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
37+
// TODO(atlowChemi) add { subscription: true } and return directly
38+
signal.addEventListener('abort', listener, { __proto__: null, once: true, [kResistStopPropagation]: true });
39+
removeEventListener = () => {
40+
signal.removeEventListener('abort', listener);
41+
};
42+
}
43+
return {
44+
__proto__: null,
45+
[SymbolDispose]() {
46+
removeEventListener?.();
47+
},
48+
};
49+
}
50+
51+
module.exports = {
52+
__proto__: null,
53+
addAbortListener,
54+
};

test/parallel/test-bootstrap-modules.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ expected.beforePreExec = new Set([
9999
'Internal Binding module_wrap',
100100
'NativeModule internal/modules/cjs/loader',
101101
'Internal Binding wasm_web_api',
102+
'NativeModule internal/events/abort_listener',
102103
]);
103104

104105
expected.atRunTime = new Set([

0 commit comments

Comments
 (0)