Skip to content

Commit d449638

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

2 files changed

Lines changed: 50 additions & 30 deletions

File tree

lib/events.js

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ function EventEmitter(opts) {
221221
EventEmitter.init.call(this, opts);
222222
}
223223
module.exports = EventEmitter;
224-
module.exports.addAbortListener = addAbortListener;
224+
module.exports.addAbortListener = require('internal/events/abort_listener').addAbortListener;
225225
module.exports.once = once;
226226
module.exports.on = on;
227227
module.exports.getEventListeners = getEventListeners;
@@ -1227,32 +1227,3 @@ function listenersController() {
12271227
},
12281228
};
12291229
}
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: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
const {
3+
validateAbortSignal,
4+
validateFunction,
5+
} = require('internal/validators');
6+
const {
7+
codes: {
8+
ERR_INVALID_ARG_TYPE,
9+
},
10+
} = require('internal/errors');
11+
12+
let queueMicrotask;
13+
let kResistStopPropagation;
14+
15+
/**
16+
* @param {AbortSignal} signal
17+
* @param {EventListener} listener
18+
* @returns {Disposable}
19+
*/
20+
function addAbortListener(signal, listener) {
21+
if (signal === undefined) {
22+
throw new ERR_INVALID_ARG_TYPE('signal', 'AbortSignal', signal);
23+
}
24+
validateAbortSignal(signal, 'signal');
25+
validateFunction(listener, 'listener');
26+
27+
let removeEventListener;
28+
if (signal.aborted) {
29+
queueMicrotask ??= require('internal/process/task_queues').queueMicrotask;
30+
queueMicrotask(() => listener());
31+
} else {
32+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
33+
// TODO(atlowChemi) add { subscription: true } and return directly
34+
signal.addEventListener('abort', listener, { __proto__: null, once: true, [kResistStopPropagation]: true });
35+
removeEventListener = () => {
36+
signal.removeEventListener('abort', listener);
37+
};
38+
}
39+
return {
40+
__proto__: null,
41+
[SymbolDispose]() {
42+
removeEventListener?.();
43+
},
44+
};
45+
}
46+
47+
module.exports = {
48+
addAbortListener,
49+
};

0 commit comments

Comments
 (0)