(signal)
| 157 | } |
| 158 | |
| 159 | function followCompositeSignal(signal) { |
| 160 | if (signal[kFollowing] || signal[kAborted] || !signal[kSourceSignals]?.size) { |
| 161 | return; |
| 162 | } |
| 163 | |
| 164 | const resultSignalWeakRef = signal[kResultSignalWeakRef] ??= new SafeWeakRef(signal); |
| 165 | |
| 166 | for (const sourceSignalWeakRef of signal[kSourceSignals]) { |
| 167 | const sourceSignal = sourceSignalWeakRef.deref(); |
| 168 | if (sourceSignal === undefined) { |
| 169 | signal[kSourceSignals].delete(sourceSignalWeakRef); |
| 170 | continue; |
| 171 | } |
| 172 | |
| 173 | if (sourceSignal.aborted) { |
| 174 | abortSignal(signal, sourceSignal.reason); |
| 175 | return; |
| 176 | } |
| 177 | |
| 178 | sourceSignal[kDependantSignals] ??= new SafeSet(); |
| 179 | sourceSignal[kDependantSignals].add(resultSignalWeakRef); |
| 180 | dependantSignalsCleanupRegistry.register(signal, { |
| 181 | sourceSignalRef: sourceSignalWeakRef, |
| 182 | dependantSignalRef: resultSignalWeakRef, |
| 183 | sourceSignalsCleanupToken: sourceSignalWeakRef, |
| 184 | }); |
| 185 | sourceSignalsCleanupRegistry.register(sourceSignal, { |
| 186 | sourceSignalRef: sourceSignalWeakRef, |
| 187 | composedSignalRef: resultSignalWeakRef, |
| 188 | }, sourceSignalWeakRef); |
| 189 | } |
| 190 | |
| 191 | signal[kFollowing] = true; |
| 192 | } |
| 193 | |
| 194 | // Because the AbortSignal timeout cannot be canceled, we don't want the |
| 195 | // presence of the timer alone to keep the AbortSignal from being garbage |
no test coverage detected
searching dependent graphs…