Sleep that rejects promptly if the signal aborts.
(ms: number, signal?: AbortSignal)
| 50 | |
| 51 | /** Sleep that rejects promptly if the signal aborts. */ |
| 52 | function abortableSleep(ms: number, signal?: AbortSignal): Promise<void> { |
| 53 | return new Promise((resolve, reject) => { |
| 54 | if (signal?.aborted) return reject(new Error('aborted')); |
| 55 | const t = setTimeout(() => { |
| 56 | cleanup(); |
| 57 | resolve(); |
| 58 | }, ms); |
| 59 | const onAbort = () => { |
| 60 | cleanup(); |
| 61 | reject(new Error('aborted')); |
| 62 | }; |
| 63 | const cleanup = () => { |
| 64 | clearTimeout(t); |
| 65 | signal?.removeEventListener('abort', onAbort); |
| 66 | }; |
| 67 | signal?.addEventListener('abort', onAbort, { once: true }); |
| 68 | }); |
| 69 | } |
| 70 | |
| 71 | /** Pull an HTTP-ish status code out of whatever error shape the SDK/fetch threw. */ |
| 72 | export function statusOf(err: any): number | undefined { |