All files / packages/abortable/src signals.ts

100% Statements 16/16
100% Branches 4/4
100% Functions 5/5
100% Lines 14/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39          81542x 214447x   81542x 152225x 6x   6x             81536x   81536x 152216x     81536x     70654x 130452x     70654x 17807x          
export interface LinkedSignal extends Disposable {
	signal: AbortSignal
}
 
export function linkSignals(...signals: (AbortSignal | undefined)[]): LinkedSignal {
	let ac = new AbortController()
	let activeSignals = signals.filter((s): s is AbortSignal => !!s)
 
	for (let signal of activeSignals) {
		if (signal.aborted) {
			ac.abort(signal.reason)
 
			return {
				signal: ac.signal,
				[Symbol.dispose]: () => {},
			}
		}
	}
 
	let onAbort = (e: Event) => ac.abort((e.target as AbortSignal).reason)
 
	for (let signal of activeSignals) {
		signal.addEventListener('abort', onAbort, { once: true })
	}
 
	return {
		signal: ac.signal,
		[Symbol.dispose]() {
			for (let signal of activeSignals) {
				signal.removeEventListener('abort', onAbort)
			}
 
			if (!ac.signal.aborted) {
				ac.abort()
			}
		},
	}
}