( pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>, deadlineMs: number, timeoutMs: number, )
| 326 | }; |
| 327 | |
| 328 | const waitForDeferreds = async ( |
| 329 | pendingDeferreds: ReadonlySet<QuickJSDeferredPromise>, |
| 330 | deadlineMs: number, |
| 331 | timeoutMs: number, |
| 332 | ): Promise<void> => { |
| 333 | const remainingMs = deadlineMs - Date.now(); |
| 334 | if (remainingMs <= 0) { |
| 335 | throw new Error(timeoutMessage(timeoutMs)); |
| 336 | } |
| 337 | |
| 338 | let timer: ReturnType<typeof setTimeout> | undefined; |
| 339 | try { |
| 340 | await Promise.race([ |
| 341 | Promise.race([...pendingDeferreds].map((deferred) => deferred.settled)), |
| 342 | new Promise<never>((_, reject) => { |
| 343 | timer = setTimeout(() => reject(new Error(timeoutMessage(timeoutMs))), remainingMs); |
| 344 | }), |
| 345 | ]); |
| 346 | } finally { |
| 347 | if (timer !== undefined) { |
| 348 | clearTimeout(timer); |
| 349 | } |
| 350 | } |
| 351 | }; |
| 352 | |
| 353 | const drainAsync = async ( |
| 354 | context: QuickJSContext, |
no test coverage detected