Skip to content

Commit 9d508d9

Browse files
committed
fs: use kResistStopPropagation
PR-URL: nodejs/node#48521 Backport-PR-URL: nodejs/node#49618 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Moshe Atlow <moshe@atlow.co.il>
1 parent 692d6c3 commit 9d508d9

File tree

7 files changed

+54
-15
lines changed

7 files changed

+54
-15
lines changed

graal-nodejs/lib/fs.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ let ReadStream;
160160
let WriteStream;
161161
let rimraf;
162162
let rimrafSync;
163+
let kResistStopPropagation;
163164

164165
// These have to be separate because of how graceful-fs happens to do it's
165166
// monkeypatching.
@@ -2435,7 +2436,8 @@ function watch(filename, options, listener) {
24352436
process.nextTick(() => watcher.close());
24362437
} else {
24372438
const listener = () => watcher.close();
2438-
options.signal.addEventListener('abort', listener);
2439+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
2440+
options.signal.addEventListener('abort', listener, { __proto__: null, [kResistStopPropagation]: true });
24392441
watcher.once('close', () => {
24402442
options.signal.removeEventListener('abort', listener);
24412443
});

graal-nodejs/lib/internal/fs/recursive_watch.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ function lazyLoadFsSync() {
4242
internalSync ??= require('fs');
4343
return internalSync;
4444
}
45+
let kResistStopPropagation;
4546

4647
async function traverse(dir, files = new SafeMap(), symbolicLinks = new SafeSet()) {
4748
const { opendir } = lazyLoadFsPromises();
@@ -265,7 +266,8 @@ class FSWatcher extends EventEmitter {
265266
} : (resolve, reject) => {
266267
const onAbort = () => reject(new AbortError(undefined, { cause: signal.reason }));
267268
if (signal.aborted) return onAbort();
268-
signal.addEventListener('abort', onAbort, { __proto__: null, once: true });
269+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
270+
signal.addEventListener('abort', onAbort, { __proto__: null, once: true, [kResistStopPropagation]: true });
269271
this.once('change', (eventType, filename) => {
270272
signal.removeEventListener('abort', onAbort);
271273
resolve({ __proto__: null, value: { eventType, filename } });

graal-nodejs/lib/internal/fs/watchers.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,8 @@ ObjectDefineProperty(FSEvent.prototype, 'owner', {
299299
set(v) { return this[owner_symbol] = v; },
300300
});
301301

302+
let kResistStopPropagation;
303+
302304
async function* watch(filename, options = kEmptyObject) {
303305
const path = toNamespacedPath(getValidatedPath(filename));
304306
validateObject(options, 'options');
@@ -330,7 +332,10 @@ async function* watch(filename, options = kEmptyObject) {
330332
};
331333

332334
try {
333-
signal?.addEventListener('abort', oncancel, { once: true });
335+
if (signal) {
336+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
337+
signal.addEventListener('abort', oncancel, { __proto__: null, once: true, [kResistStopPropagation]: true });
338+
}
334339
handle.onchange = (status, eventType, filename) => {
335340
if (status < 0) {
336341
const error = uvException({

graal-nodejs/lib/internal/test_runner/mock/mock_timers.js

+15-7
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ const nodeTimers = require('timers');
3232
const nodeTimersPromises = require('timers/promises');
3333
const EventEmitter = require('events');
3434

35+
let kResistStopPropagation;
36+
3537
function compareTimersLists(a, b) {
3638
return (a.runAt - b.runAt) || (a.id - b.id);
3739
}
@@ -100,17 +102,19 @@ class MockTimers {
100102
if (options?.signal) {
101103
validateAbortSignal(options.signal, 'options.signal');
102104

103-
if (options.signal?.aborted) {
105+
if (options.signal.aborted) {
104106
throw abortIt(options.signal);
105107
}
106108

107109
const onAbort = (reason) => {
108110
emitter.emit('data', { __proto__: null, aborted: true, reason });
109111
};
110112

111-
options.signal?.addEventListener('abort', onAbort, {
113+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
114+
options.signal.addEventListener('abort', onAbort, {
112115
__proto__: null,
113116
once: true,
117+
[kResistStopPropagation]: true,
114118
});
115119
}
116120

@@ -161,7 +165,7 @@ class MockTimers {
161165
return reject(err);
162166
}
163167

164-
if (options.signal?.aborted) {
168+
if (options.signal.aborted) {
165169
return reject(abortIt(options.signal));
166170
}
167171
}
@@ -175,10 +179,14 @@ class MockTimers {
175179
return resolve(result || id);
176180
}, ms);
177181

178-
options?.signal?.addEventListener('abort', onabort, {
179-
__proto__: null,
180-
once: true,
181-
});
182+
if (options?.signal) {
183+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
184+
options.signal.addEventListener('abort', onabort, {
185+
__proto__: null,
186+
once: true,
187+
[kResistStopPropagation]: true,
188+
});
189+
}
182190
});
183191
}
184192

graal-nodejs/lib/internal/test_runner/runner.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ const kDiagnosticsFilterArgs = ['tests', 'suites', 'pass', 'fail', 'cancelled',
7676
const kCanceledTests = new SafeSet()
7777
.add(kCancelledByParent).add(kAborted).add(kTestTimeoutFailure);
7878

79+
let kResistStopPropagation;
80+
7981
// TODO(cjihrig): Replace this with recursive readdir once it lands.
8082
function processPath(path, testFiles, options) {
8183
const stats = statSync(path);
@@ -441,7 +443,14 @@ function watchFiles(testFiles, root, inspectPort, signal, testNamePatterns) {
441443
triggerUncaughtException(error, true /* fromPromise */);
442444
}));
443445
});
444-
signal?.addEventListener('abort', () => root.postRun(), { __proto__: null, once: true });
446+
if (signal) {
447+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
448+
signal.addEventListener(
449+
'abort',
450+
() => root.postRun(),
451+
{ __proto__: null, once: true, [kResistStopPropagation]: true },
452+
);
453+
}
445454

446455
return filesWatcher;
447456
}

graal-nodejs/lib/internal/test_runner/test.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ const kUnwrapErrors = new SafeSet()
7272
.add(kTestCodeFailure).add(kHookFailure)
7373
.add('uncaughtException').add('unhandledRejection');
7474
const { testNamePatterns, testOnlyFlag } = parseCommandLine();
75+
let kResistStopPropagation;
7576

7677
function stopTest(timeout, signal) {
7778
if (timeout === kDefaultTimeout) {
@@ -266,7 +267,15 @@ class Test extends AsyncResource {
266267
this.signal = this.#abortController.signal;
267268

268269
validateAbortSignal(signal, 'options.signal');
269-
this.#outerSignal?.addEventListener('abort', this.#abortHandler);
270+
if (signal) {
271+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
272+
}
273+
274+
this.#outerSignal?.addEventListener(
275+
'abort',
276+
this.#abortHandler,
277+
{ __proto__: null, [kResistStopPropagation]: true },
278+
);
270279

271280
this.fn = fn;
272281
this.harness = null; // Configured on the root test by the test harness.

graal-nodejs/lib/timers/promises.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ const {
4040
} = require('internal/util');
4141

4242
const kScheduler = Symbol('kScheduler');
43+
let kResistStopPropagation;
4344

4445
function cancelListenerHandler(clear, reject, signal) {
4546
if (!this._destroyed) {
@@ -81,7 +82,8 @@ function setTimeout(after, value, options = kEmptyObject) {
8182
if (signal) {
8283
oncancel = FunctionPrototypeBind(cancelListenerHandler,
8384
timeout, clearTimeout, reject, signal);
84-
signal.addEventListener('abort', oncancel);
85+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
86+
signal.addEventListener('abort', oncancel, { __proto__: null, [kResistStopPropagation]: true });
8587
}
8688
});
8789
return oncancel !== undefined ?
@@ -123,7 +125,8 @@ function setImmediate(value, options = kEmptyObject) {
123125
oncancel = FunctionPrototypeBind(cancelListenerHandler,
124126
immediate, clearImmediate, reject,
125127
signal);
126-
signal.addEventListener('abort', oncancel);
128+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
129+
signal.addEventListener('abort', oncancel, { __proto__: null, [kResistStopPropagation]: true });
127130
}
128131
});
129132
return oncancel !== undefined ?
@@ -164,7 +167,8 @@ async function* setInterval(after, value, options = kEmptyObject) {
164167
callback = undefined;
165168
}
166169
};
167-
signal.addEventListener('abort', onCancel, { once: true });
170+
kResistStopPropagation ??= require('internal/event_target').kResistStopPropagation;
171+
signal.addEventListener('abort', onCancel, { __proto__: null, once: true, [kResistStopPropagation]: true });
168172
}
169173

170174
while (!signal?.aborted) {

0 commit comments

Comments
 (0)