Skip to content

Commit e57dc01

Browse files
atlowChemimarco-ippolito
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 9b277dc commit e57dc01

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
@@ -83,6 +83,7 @@ const {
8383
validateNumber,
8484
validateString,
8585
} = require('internal/validators');
86+
const { addAbortListener } = require('internal/events/abort_listener');
8687

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

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
@@ -98,6 +98,7 @@ expected.beforePreExec = new Set([
9898
'Internal Binding module_wrap',
9999
'NativeModule internal/modules/cjs/loader',
100100
'Internal Binding wasm_web_api',
101+
'NativeModule internal/events/abort_listener',
101102
]);
102103

103104
expected.atRunTime = new Set([

0 commit comments

Comments
 (0)