export async function raceWithAbort( pending: Promise, signal: AbortSignal ): Promise { signal.throwIfAborted() return await new Promise((resolve, reject) => { const onAbort = (): void => { cleanup() reject(signal.reason) } const cleanup = (): void => { signal.removeEventListener('abort', onAbort) } signal.addEventListener('abort', onAbort, { once: true }) void pending.then( (value) => { cleanup() resolve(value) }, (error: unknown) => { cleanup() reject(error) } ) }) } export function closeServer(server: { close(callback: (error?: Error) => void): unknown }): Promise { return new Promise((resolve, reject) => { try { server.close((error) => { if (error === undefined) { resolve() } else { reject(error) } }) } catch (error) { if ( isNodeError(error) && error.code === 'ERR_SERVER_NOT_RUNNING' ) { resolve() } else { reject(error) } } }) } export async function settleWithin( pending: Promise, timeoutMs: number ): Promise { let timeout: ReturnType | undefined try { await Promise.race([ pending, new Promise((resolve) => { timeout = setTimeout(resolve, timeoutMs) timeout.unref?.() }) ]) } finally { if (timeout !== undefined) { clearTimeout(timeout) } } } export function boundedInteger( value: number, minimum: number, maximum: number, label: string ): number { if ( !Number.isSafeInteger(value) || value < minimum || value > maximum ) { throw new RangeError(`${label} is invalid`) } return value } export function isNodeError( error: unknown ): error is NodeJS.ErrnoException { return error instanceof Error && 'code' in error }