( object: T, getSignal: () => AbortSignal, onCancelled: VoidFunction, )
| 489 | } |
| 490 | |
| 491 | export function addConsumeAwareSignal<T>( |
| 492 | object: T, |
| 493 | getSignal: () => AbortSignal, |
| 494 | onCancelled: VoidFunction, |
| 495 | ): T & { signal: AbortSignal } { |
| 496 | let consumed = false |
| 497 | let signal: AbortSignal | undefined |
| 498 | |
| 499 | Object.defineProperty(object, 'signal', { |
| 500 | enumerable: true, |
| 501 | get: () => { |
| 502 | signal ??= getSignal() |
| 503 | if (consumed) { |
| 504 | return signal |
| 505 | } |
| 506 | |
| 507 | consumed = true |
| 508 | if (signal.aborted) { |
| 509 | onCancelled() |
| 510 | } else { |
| 511 | signal.addEventListener('abort', onCancelled, { once: true }) |
| 512 | } |
| 513 | |
| 514 | return signal |
| 515 | }, |
| 516 | }) |
| 517 | |
| 518 | return object as T & { signal: AbortSignal } |
| 519 | } |
no outgoing calls
no test coverage detected