summaryrefslogtreecommitdiff
path: root/source/helpers/abort-controller.ts
blob: 11d48b433695c4d0e2534760dbb906f5de13a5e1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
export function callHandle(handle: DeinitHandle): void {
	if ('disconnect' in handle) { // Browser observers
		handle.disconnect();
	} else if ('abort' in handle) {
		handle.abort();
	} else if (typeof handle === 'function') {
		handle();
	}
}

export default function onAbort(abort: AbortController | AbortSignal, ...callbacks: DeinitHandle[]): void {
	const signal = abort instanceof AbortController ? abort.signal : abort;
	signal.addEventListener('abort', () => {
		for (const callback of callbacks) {
			callHandle(callback);
		}
	});
}