* Race a promise against a timeout. Cleans up the timer regardless of outcome * to avoid unhandled rejections from orphaned setTimeout callbacks.
( promise: Promise<T>, ms: number, message: string, )
| 497 | * to avoid unhandled rejections from orphaned setTimeout callbacks. |
| 498 | */ |
| 499 | function withTimeout<T>( |
| 500 | promise: Promise<T>, |
| 501 | ms: number, |
| 502 | message: string, |
| 503 | ): Promise<T> { |
| 504 | let timer: ReturnType<typeof setTimeout> |
| 505 | const timeoutPromise = new Promise<never>((_, reject) => { |
| 506 | timer = setTimeout((rej, msg) => rej(new Error(msg)), ms, reject, message) |
| 507 | }) |
| 508 | return Promise.race([promise, timeoutPromise]).finally(() => |
| 509 | clearTimeout(timer!), |
| 510 | ) |
| 511 | } |