* Wait for messages to arrive
(abortSignal?: AbortSignal)
| 387 | * Wait for messages to arrive |
| 388 | */ |
| 389 | private waitForMessages(abortSignal?: AbortSignal): Promise<boolean> { |
| 390 | return new Promise((resolve) => { |
| 391 | let settled = false; |
| 392 | let abortHandler: (() => void) | null = null; |
| 393 | let waiterFunc: (hasMessages: boolean) => void; |
| 394 | |
| 395 | const finish = (hasMessages: boolean) => { |
| 396 | if (settled) { |
| 397 | return; |
| 398 | } |
| 399 | settled = true; |
| 400 | if (this.waiter === waiterFunc) { |
| 401 | this.waiter = null; |
| 402 | } |
| 403 | // Clean up abort handler |
| 404 | if (abortHandler && abortSignal) { |
| 405 | abortSignal.removeEventListener('abort', abortHandler); |
| 406 | } |
| 407 | resolve(hasMessages); |
| 408 | }; |
| 409 | |
| 410 | waiterFunc = (hasMessages: boolean) => { |
| 411 | finish(hasMessages); |
| 412 | }; |
| 413 | |
| 414 | // Set up abort handler |
| 415 | if (abortSignal) { |
| 416 | abortHandler = () => { |
| 417 | logger.debug('[MessageQueue2] Wait aborted'); |
| 418 | finish(false); |
| 419 | }; |
| 420 | abortSignal.addEventListener('abort', abortHandler); |
| 421 | } |
| 422 | |
| 423 | // Set the waiter before checking the queue to avoid missed notifications |
| 424 | this.waiter = waiterFunc; |
| 425 | |
| 426 | // Check again in case messages arrived or queue closed while setting up |
| 427 | if (this.queue.length > 0) { |
| 428 | finish(true); |
| 429 | return; |
| 430 | } |
| 431 | |
| 432 | if (this.closed || abortSignal?.aborted) { |
| 433 | finish(false); |
| 434 | return; |
| 435 | } |
| 436 | |
| 437 | logger.debug('[MessageQueue2] Waiting for messages...'); |
| 438 | }); |
| 439 | } |
| 440 | } |
no test coverage detected