File size: 1,306 Bytes
7a1ad33 | 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 40 41 42 43 44 45 46 47 48 49 | /**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/**
* Factory to create a standard abort error for delay helpers.
*/
export function createAbortError(): Error {
const abortError = new Error('Aborted');
abortError.name = 'AbortError';
return abortError;
}
/**
* Returns a promise that resolves after the provided duration unless aborted.
*
* @param ms Delay duration in milliseconds.
* @param signal Optional abort signal to cancel the wait early.
*/
export function delay(ms: number, signal?: AbortSignal): Promise<void> {
// If no abort signal is provided, set simple delay
if (!signal) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
// Immediately reject if signal has already been aborted
if (signal.aborted) {
return Promise.reject(createAbortError());
}
// remove abort and timeout listeners to prevent memory-leaks
return new Promise((resolve, reject) => {
const onAbort = () => {
clearTimeout(timeoutId);
signal.removeEventListener('abort', onAbort);
reject(createAbortError());
};
const timeoutId = setTimeout(() => {
signal.removeEventListener('abort', onAbort);
resolve();
}, ms);
signal.addEventListener('abort', onAbort, { once: true });
});
}
|