@@ -554,37 +554,43 @@ describe("TwilioProvider", () => {
|
554 | 554 | }); |
555 | 555 | |
556 | 556 | it("fails stream playback when all audio sends and completion mark are dropped", async () => { |
557 | | -const provider = createProvider(); |
558 | | -provider.registerCallStream("CA-dropped", "MZ-dropped"); |
| 557 | +vi.useFakeTimers(); |
| 558 | +try { |
| 559 | +const provider = createProvider(); |
| 560 | +provider.registerCallStream("CA-dropped", "MZ-dropped"); |
559 | 561 | |
560 | | -const sendAudio = vi.fn(() => ({ sent: false })); |
561 | | -const sendMark = vi.fn(() => ({ sent: false })); |
562 | | -const mediaStreamHandler = { |
563 | | -queueTts: async ( |
564 | | -_streamSid: string, |
565 | | -playFn: (signal: AbortSignal) => Promise<void>, |
566 | | -): Promise<void> => { |
567 | | -await playFn(new AbortController().signal); |
568 | | -}, |
569 | | - sendAudio, |
570 | | - sendMark, |
571 | | -}; |
| 562 | + const sendAudio = vi.fn(() => ({ sent: false })); |
| 563 | + const sendMark = vi.fn(() => ({ sent: false })); |
| 564 | + const mediaStreamHandler = { |
| 565 | + queueTts: async ( |
| 566 | + _streamSid: string, |
| 567 | + playFn: (signal: AbortSignal) => Promise<void>, |
| 568 | + ): Promise<void> => { |
| 569 | + await playFn(new AbortController().signal); |
| 570 | + }, |
| 571 | + sendAudio, |
| 572 | + sendMark, |
| 573 | + }; |
572 | 574 | |
573 | | -provider.setMediaStreamHandler(mediaStreamHandler as never); |
574 | | -provider.setTTSProvider({ |
575 | | -synthesisTimeoutMs: 5000, |
576 | | -synthesizeForTelephony: async () => Buffer.alloc(320), |
577 | | -}); |
| 575 | + provider.setMediaStreamHandler(mediaStreamHandler as never); |
| 576 | + provider.setTTSProvider({ |
| 577 | + synthesisTimeoutMs: 5000, |
| 578 | + synthesizeForTelephony: async () => Buffer.alloc(320), |
| 579 | + }); |
578 | 580 | |
579 | | -await expect( |
580 | | -provider.playTts({ |
| 581 | +const playback = provider.playTts({ |
581 | 582 | callId: "call-dropped", |
582 | 583 | providerCallId: "CA-dropped", |
583 | 584 | text: "Dropped audio", |
584 | | -}), |
585 | | -).rejects.toThrow("Telephony stream playback failed"); |
586 | | -expect(sendAudio).toHaveBeenCalled(); |
587 | | -expect(sendMark).toHaveBeenCalledTimes(1); |
| 585 | +}); |
| 586 | +const playExpectation = expect(playback).rejects.toThrow("Telephony stream playback failed"); |
| 587 | +await vi.advanceTimersByTimeAsync(100); |
| 588 | +await playExpectation; |
| 589 | +expect(sendAudio).toHaveBeenCalled(); |
| 590 | +expect(sendMark).toHaveBeenCalledTimes(1); |
| 591 | +} finally { |
| 592 | +vi.useRealTimers(); |
| 593 | +} |
588 | 594 | }); |
589 | 595 | |
590 | 596 | it("fails stream playback when telephony synthesis returns empty audio", async () => { |
|