@atomiqlabs/base
Version:
Base classes and interfaces for atomiq protocol
52 lines (49 loc) • 1.9 kB
text/typescript
/**
* Returns a promise that resolves after given amount seconds
*
* @param timeout how many milliseconds to wait for
* @param abortSignal
*
* @internal
*/
export function timeoutPromise(timeout: number, abortSignal?: AbortSignal): Promise<void> {
return new Promise<void>((resolve, reject) => {
if (abortSignal != null && abortSignal.aborted) {
reject(abortSignal.reason);
return;
}
let abortSignalListener: () => void;
let timeoutHandle: any | null = setTimeout(() => {
if (abortSignalListener != null && abortSignal != null) abortSignal.removeEventListener("abort", abortSignalListener);
resolve();
}, timeout);
if (abortSignal != null) {
abortSignal.addEventListener("abort", abortSignalListener = () => {
if (timeoutHandle != null) clearTimeout(timeoutHandle);
timeoutHandle = null;
reject(abortSignal.reason);
});
}
});
}
/**
* Returns an abort signal that aborts after a specified timeout in milliseconds
*
* @param timeout Milliseconds to wait
* @param abortReason Abort with this abort reason
* @param abortSignal Abort signal to extend
*
* @internal
*/
export function timeoutSignal(timeout: number, abortReason?: any, abortSignal?: AbortSignal): AbortSignal {
if (timeout == null) throw new Error("Timeout seconds cannot be null!");
const abortController = new AbortController();
const timeoutHandle = setTimeout(() => abortController.abort(abortReason || new Error("Timed out")), timeout);
if (abortSignal != null) {
abortSignal.addEventListener("abort", () => {
clearTimeout(timeoutHandle);
abortController.abort(abortSignal.reason);
});
}
return abortController.signal;
}