Skip to content

Commit e263946

Browse files
atlowCheminodejs-github-bot
authored andcommitted
events: extract addAbortListener for safe internal use
Refs: #48596 PR-URL: #52081 Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
1 parent ba06c5c commit e263946

File tree

3 files changed

+56
-29
lines changed

3 files changed

+56
-29
lines changed

lib/events.js

+1-29
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ const {
8484
validateObject,
8585
validateString,
8686
} = require('internal/validators');
87+
const { addAbortListener } = require('internal/events/abort_listener');
8788

8889
const kCapture = Symbol('kCapture');
8990
const kErrorMonitor = Symbol('events.errorMonitor');
@@ -1222,32 +1223,3 @@ function listenersController() {
12221223
},
12231224
};
12241225
}
1225-
1226-
let queueMicrotask;
1227-
1228-
function addAbortListener(signal, listener) {
1229-
if (signal === undefined) {
1230-
throw new ERR_INVALID_ARG_TYPE('signal', 'AbortSignal', signal);
1231-
}
1232-
validateAbortSignal(signal, 'signal');
1233-
validateFunction(listener, 'listener');
1234-
1235-
let removeEventListener;
1236-
if (signal.aborted) {
1237-
queueMicrotask ??= require('internal/process/task_queues').queueMicrotask;
1238-
queueMicrotask(() => listener());
1239-
} else {
1240-
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
1241-
// TODO(atlowChemi) add { subscription: true } and return directly
1242-
signal.addEventListener('abort', listener, { __proto__: null, once: true, [kResistStopPropagation]: true });
1243-
removeEventListener = () => {
1244-
signal.removeEventListener('abort', listener);
1245-
};
1246-
}
1247-
return {
1248-
__proto__: null,
1249-
[SymbolDispose]() {
1250-
removeEventListener?.();
1251-
},
1252-
};
1253-
}

lib/internal/events/abort_listener.js

+54
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

+1
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)