@@ -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