Skip to content

Commit a31583a

Browse files
committed
lib: remove settled dependant signals when they are GCed
1 parent 4988bb5 commit a31583a

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

lib/internal/abort_controller.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ function lazyMessageChannel() {
8484
}
8585

8686
const clearTimeoutRegistry = new SafeFinalizationRegistry(clearTimeout);
87+
const finalizers = new SafeFinalizationRegistry((signal) => {
88+
signal[kDependantSignals].forEach(ref => {
89+
if (!ref.deref()) {
90+
signal[kDependantSignals].delete(ref);
91+
}
92+
});
93+
});
8794
const gcPersistentSignals = new SafeSet();
8895

8996
const kAborted = Symbol('kAborted');
@@ -235,13 +242,17 @@ class AbortSignal extends EventTarget {
235242
}
236243
const resultSignalWeakRef = new SafeWeakRef(resultSignal);
237244
resultSignal[kSourceSignals] = new SafeSet();
245+
246+
238247
for (let i = 0; i < signalsArray.length; i++) {
239248
const signal = signalsArray[i];
249+
finalizers.register(resultSignal, signal);
240250
if (signal.aborted) {
241251
abortSignal(resultSignal, signal.reason);
242252
return resultSignal;
243253
}
244254
signal[kDependantSignals] ??= new SafeSet();
255+
245256
if (!signal[kComposite]) {
246257
resultSignal[kSourceSignals].add(new SafeWeakRef(signal));
247258
signal[kDependantSignals].add(resultSignalWeakRef);

0 commit comments

Comments
 (0)