@@ -97,8 +97,21 @@ const dependantSignalsCleanupRegistry = new SafeFinalizationRegistry((signalWeak
9797 }
9898 } ) ;
9999} ) ;
100+
100101const gcPersistentSignals = new SafeSet ( ) ;
101102
103+ const sourceSignalsCleanupRegistry = new SafeFinalizationRegistry ( ( { sourceSignalRef, composedSignalRef } ) => {
104+ const composedSignal = composedSignalRef . deref ( ) ;
105+ if ( composedSignal !== undefined ) {
106+ composedSignal [ kSourceSignals ] . delete ( sourceSignalRef ) ;
107+
108+ if ( composedSignal [ kSourceSignals ] . size === 0 ) {
109+ // This signal will no longer abort. There's no need to keep it in the gcPersistentSignals set.
110+ gcPersistentSignals . delete ( composedSignal ) ;
111+ }
112+ }
113+ } ) ;
114+
102115const kAborted = Symbol ( 'kAborted' ) ;
103116const kReason = Symbol ( 'kReason' ) ;
104117const kCloneData = Symbol ( 'kCloneData' ) ;
@@ -261,6 +274,10 @@ class AbortSignal extends EventTarget {
261274 resultSignal [ kSourceSignals ] . add ( signalWeakRef ) ;
262275 signal [ kDependantSignals ] . add ( resultSignalWeakRef ) ;
263276 dependantSignalsCleanupRegistry . register ( resultSignal , signalWeakRef ) ;
277+ sourceSignalsCleanupRegistry . register ( signal , {
278+ sourceSignalRef : signalWeakRef ,
279+ composedSignalRef : resultSignalWeakRef ,
280+ } ) ;
264281 } else if ( ! signal [ kSourceSignals ] ) {
265282 continue ;
266283 } else {
@@ -278,6 +295,10 @@ class AbortSignal extends EventTarget {
278295 resultSignal [ kSourceSignals ] . add ( sourceSignalWeakRef ) ;
279296 sourceSignal [ kDependantSignals ] . add ( resultSignalWeakRef ) ;
280297 dependantSignalsCleanupRegistry . register ( resultSignal , sourceSignalWeakRef ) ;
298+ sourceSignalsCleanupRegistry . register ( signal , {
299+ sourceSignalRef : sourceSignalWeakRef ,
300+ composedSignalRef : resultSignalWeakRef ,
301+ } ) ;
281302 }
282303 }
283304 }
@@ -434,6 +455,7 @@ class AbortController {
434455 */
435456 get signal ( ) {
436457 this . #signal ??= new AbortSignal ( kDontThrowSymbol ) ;
458+
437459 return this . #signal;
438460 }
439461
0 commit comments