(signal, reason)
| 490 | |
| 491 | // https://dom.spec.whatwg.org/#dom-abortsignal-abort |
| 492 | function abortSignal(signal, reason) { |
| 493 | // 1. If signal is aborted, then return. |
| 494 | if (signal[kAborted]) return; |
| 495 | |
| 496 | // 2. Set signal's abort reason to reason if it is given; |
| 497 | // otherwise to a new "AbortError" DOMException. |
| 498 | signal[kAborted] = true; |
| 499 | signal[kReason] = reason; |
| 500 | |
| 501 | // 3. Let dependentSignalsToAbort be a new list. |
| 502 | const dependentSignalsToAbort = ObjectSetPrototypeOf([], null); |
| 503 | |
| 504 | // 4. For each dependentSignal of signal's dependent signals: |
| 505 | signal[kDependantSignals]?.forEach((s) => { |
| 506 | const dependentSignal = s.deref(); |
| 507 | // 1. If dependentSignal is not aborted, then: |
| 508 | if (dependentSignal && !dependentSignal[kAborted]) { |
| 509 | // 1. Set dependentSignal's abort reason to signal's abort reason. |
| 510 | dependentSignal[kReason] = reason; |
| 511 | dependentSignal[kAborted] = true; |
| 512 | // 2. Append dependentSignal to dependentSignalsToAbort. |
| 513 | ArrayPrototypePush(dependentSignalsToAbort, dependentSignal); |
| 514 | } |
| 515 | }); |
| 516 | |
| 517 | // 5. Run the abort steps for signal |
| 518 | runAbort(signal); |
| 519 | |
| 520 | // 6. For each dependentSignal of dependentSignalsToAbort, |
| 521 | // run the abort steps for dependentSignal. |
| 522 | for (let i = 0; i < dependentSignalsToAbort.length; i++) { |
| 523 | const dependentSignal = dependentSignalsToAbort[i]; |
| 524 | runAbort(dependentSignal); |
| 525 | } |
| 526 | |
| 527 | // Clean up the signal from gcPersistentSignals |
| 528 | gcPersistentSignals.delete(signal); |
| 529 | |
| 530 | // If this is a composite signal, also remove all of its source signals from gcPersistentSignals |
| 531 | // when they get dereferenced from the signal's kSourceSignals set |
| 532 | if (signal[kComposite] && signal[kSourceSignals]) { |
| 533 | signal[kSourceSignals].forEach((sourceWeakRef) => { |
| 534 | const sourceSignal = sourceWeakRef.deref(); |
| 535 | if (sourceSignal) { |
| 536 | gcPersistentSignals.delete(sourceSignal); |
| 537 | } |
| 538 | }); |
| 539 | } |
| 540 | } |
| 541 | |
| 542 | // To run the abort steps for an AbortSignal signal |
| 543 | function runAbort(signal) { |
no test coverage detected
searching dependent graphs…