UNPKG

@thumbmarkjs/thumbmarkjs

Version:

![GitHub package.json dynamic](https://img.shields.io/github/package-json/version/ilkkapeltola/thumbmarkjs) ![NPM Version](https://img.shields.io/npm/v/@thumbmarkjs/thumbmarkjs) ![NPM Downloads](https://img.shields.io/npm/dm/%40thumbmarkjs%2Fthumbmarkjs

60 lines (49 loc) 1.65 kB
type DelayedPromise<T> = Promise<T>; export function delay<T>(t: number, val: T): DelayedPromise<T> { return new Promise<T>((resolve) => { setTimeout(() => resolve(val), t); }); } export interface RaceResult<T> { value: T; elapsed?: number; error?: string; } export function raceAllPerformance<T>( promises: Promise<T>[], timeoutTime: number, timeoutVal: T ): Promise<RaceResult<T>[]> { return Promise.all( promises.map((p) => { const startTime = performance.now(); let timeoutId: ReturnType<typeof setTimeout> | undefined; const resultPromise = p.then((value) => { if (timeoutId !== undefined) clearTimeout(timeoutId); return { value, elapsed: performance.now() - startTime }; }).catch((err: unknown) => { if (timeoutId !== undefined) clearTimeout(timeoutId); return { value: timeoutVal, elapsed: performance.now() - startTime, error: err instanceof Error ? err.message : String(err), }; }); const timeoutPromise = new Promise<RaceResult<T>>((resolve) => { timeoutId = setTimeout(() => { resolve({ value: timeoutVal, elapsed: performance.now() - startTime, error: 'timeout', }); }, timeoutTime); }); return Promise.race([resultPromise, timeoutPromise]); }) ); } export function raceAll<T>(promises: Promise<T>[], timeoutTime: number, timeoutVal: T): Promise<(T | undefined)[]> { return Promise.all(promises.map((p) => { return Promise.race([p.catch(() => timeoutVal), delay(timeoutTime, timeoutVal)]); })); }