( pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>, deadlineMs: number, timeoutMs: number, )
| 316 | }; |
| 317 | |
| 318 | const waitForDeferreds = async ( |
| 319 | pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>, |
| 320 | deadlineMs: number, |
| 321 | timeoutMs: number, |
| 322 | ): Promise<void> => { |
| 323 | const remainingMs = deadlineMs - Date.now(); |
| 324 | if (remainingMs <= 0) { |
| 325 | throw new Error(timeoutMessage(timeoutMs)); |
| 326 | } |
| 327 | |
| 328 | let timer: ReturnType<typeof setTimeout> | undefined; |
| 329 | try { |
| 330 | await Promise.race([ |
| 331 | Promise.race([...pendingDeferreds].map((deferred) => deferred.settled)), |
| 332 | new Promise<never>((_, reject) => { |
| 333 | timer = setTimeout(() => reject(new Error(timeoutMessage(timeoutMs))), remainingMs); |
| 334 | }), |
| 335 | ]); |
| 336 | } finally { |
| 337 | if (timer !== undefined) { |
| 338 | clearTimeout(timer); |
| 339 | } |
| 340 | } |
| 341 | }; |
| 342 | |
| 343 | const drainAsync = async ( |
| 344 | context: QuickJSContext, |
no test coverage detected