(ms: number, signal?: AbortSignal)
| 74 | } |
| 75 | |
| 76 | function sleep(ms: number, signal?: AbortSignal) { |
| 77 | return new Promise<void>((resolve, reject) => { |
| 78 | if (signal?.aborted) { |
| 79 | reject(signal.reason ?? new Error("Aborted")) |
| 80 | return |
| 81 | } |
| 82 | |
| 83 | let timer: NodeJS.Timeout | undefined |
| 84 | |
| 85 | const done = () => { |
| 86 | signal?.removeEventListener("abort", abort) |
| 87 | resolve() |
| 88 | } |
| 89 | |
| 90 | const abort = () => { |
| 91 | if (timer) { |
| 92 | clearTimeout(timer) |
| 93 | } |
| 94 | signal?.removeEventListener("abort", abort) |
| 95 | reject(signal?.reason ?? new Error("Aborted")) |
| 96 | } |
| 97 | |
| 98 | signal?.addEventListener("abort", abort, { once: true }) |
| 99 | timer = setTimeout(done, ms) |
| 100 | }) |
| 101 | } |
| 102 | |
| 103 | function jitter(ms: number) { |
| 104 | const j = Math.floor(ms * 0.3) |
no test coverage detected