@@ -96,8 +96,21 @@ const dependantSignalsCleanupRegistry = new SafeFinalizationRegistry((signalWeak
96
96
}
97
97
} ) ;
98
98
} ) ;
99
+
99
100
const gcPersistentSignals = new SafeSet ( ) ;
100
101
102
+ const sourceSignalsCleanupRegistry = new SafeFinalizationRegistry ( ( { sourceSignalRef, composedSignalRef } ) => {
103
+ const composedSignal = composedSignalRef . deref ( ) ;
104
+ if ( composedSignal !== undefined ) {
105
+ composedSignal [ kSourceSignals ] . delete ( sourceSignalRef ) ;
106
+
107
+ if ( composedSignal [ kSourceSignals ] . size === 0 ) {
108
+ // This signal will no longer abort. There's no need to keep it in the gcPersistentSignals set.
109
+ gcPersistentSignals . delete ( composedSignal ) ;
110
+ }
111
+ }
112
+ } ) ;
113
+
101
114
const kAborted = Symbol ( 'kAborted' ) ;
102
115
const kReason = Symbol ( 'kReason' ) ;
103
116
const kCloneData = Symbol ( 'kCloneData' ) ;
@@ -260,6 +273,10 @@ class AbortSignal extends EventTarget {
260
273
resultSignal [ kSourceSignals ] . add ( signalWeakRef ) ;
261
274
signal [ kDependantSignals ] . add ( resultSignalWeakRef ) ;
262
275
dependantSignalsCleanupRegistry . register ( resultSignal , signalWeakRef ) ;
276
+ sourceSignalsCleanupRegistry . register ( signal , {
277
+ sourceSignalRef : signalWeakRef ,
278
+ composedSignalRef : resultSignalWeakRef ,
279
+ } ) ;
263
280
} else if ( ! signal [ kSourceSignals ] ) {
264
281
continue ;
265
282
} else {
@@ -277,6 +294,10 @@ class AbortSignal extends EventTarget {
277
294
resultSignal [ kSourceSignals ] . add ( sourceSignalWeakRef ) ;
278
295
sourceSignal [ kDependantSignals ] . add ( resultSignalWeakRef ) ;
279
296
dependantSignalsCleanupRegistry . register ( resultSignal , sourceSignalWeakRef ) ;
297
+ sourceSignalsCleanupRegistry . register ( signal , {
298
+ sourceSignalRef : sourceSignalWeakRef ,
299
+ composedSignalRef : resultSignalWeakRef ,
300
+ } ) ;
280
301
}
281
302
}
282
303
}
@@ -436,6 +457,7 @@ class AbortController {
436
457
*/
437
458
get signal ( ) {
438
459
this . #signal ??= new AbortSignal ( kDontThrowSymbol ) ;
460
+
439
461
return this . #signal;
440
462
}
441
463
0 commit comments