events: fix addAbortListener for aborted signals · nodejs/node@215639d · GitHub
Skip to content

Commit 215639d

Browse files
lazergaduh95
authored andcommitted
events: fix addAbortListener for aborted signals
Signed-off-by: Lazizbek Ergashev <lazerg2@gmail.com> PR-URL: #65640 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Robert Nagy <ronagy@icloud.com>
1 parent f39916a commit 215639d

4 files changed

Lines changed: 43 additions & 1 deletion

File tree

‎doc/api/events.md‎

Lines changed: 7 additions & 0 deletions

‎lib/internal/event_target.js‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,6 +1243,8 @@ module.exports = {
12431243
kTrustEvent,
12441244
kRemoveListener,
12451245
kEvents,
1246+
kIsBeingDispatched,
1247+
kTarget,
12461248
kWeakHandler,
12471249
kResistStopPropagation,
12481250
isEventTarget,

‎lib/internal/events/abort_listener.js‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const {
1717
let queueMicrotask;
1818
let kResistStopPropagation;
1919
let abortListenerOptions;
20+
let eventTarget;
2021

2122
/**
2223
* @param {AbortSignal} signal
@@ -33,7 +34,20 @@ function addAbortListener(signal, listener) {
3334
let removeEventListener;
3435
if (signal.aborted) {
3536
queueMicrotask ??= require('internal/process/task_queues').queueMicrotask;
36-
queueMicrotask(() => listener());
37+
eventTarget ??= require('internal/event_target');
38+
let disposed = false;
39+
queueMicrotask(() => {
40+
if (disposed) return;
41+
const { Event, kIsBeingDispatched, kTarget, kTrustEvent } = eventTarget;
42+
const event = new Event('abort', { [kTrustEvent]: true });
43+
event[kTarget] = signal;
44+
event[kIsBeingDispatched] = true;
45+
listener(event);
46+
event[kIsBeingDispatched] = false;
47+
});
48+
removeEventListener = () => {
49+
disposed = true;
50+
};
3751
} else {
3852
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
3953
abortListenerOptions ??= ObjectFreeze({ __proto__: null, once: true, [kResistStopPropagation]: true });

‎test/parallel/test-events-add-abort-listener.mjs‎

Lines changed: 19 additions & 0 deletions

0 commit comments

Comments
 (0)