From 7df973d56998af27b181a67d5490ab33e4c8c393 Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Tue, 24 Jan 2023 11:36:31 +0100 Subject: [PATCH] Fix ongoing broadcast recording after connection error (#9974) Co-authored-by: Andy Balaam --- .../audio/VoiceBroadcastRecorder.ts | 8 ++++++-- .../models/VoiceBroadcastRecording.ts | 6 +++--- .../audio/VoiceBroadcastRecorder-test.ts | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/voice-broadcast/audio/VoiceBroadcastRecorder.ts b/src/voice-broadcast/audio/VoiceBroadcastRecorder.ts index e8771b94fb..3d64a5ddc3 100644 --- a/src/voice-broadcast/audio/VoiceBroadcastRecorder.ts +++ b/src/voice-broadcast/audio/VoiceBroadcastRecorder.ts @@ -65,14 +65,18 @@ export class VoiceBroadcastRecorder this.voiceRecording.liveData.onUpdate((data: IRecordingUpdate) => { this.setCurrentChunkLength(data.timeSeconds - this.previousChunkEndTimePosition); }); - return; } /** * Stops the recording and returns the remaining chunk (if any). */ public async stop(): Promise> { - await this.voiceRecording.stop(); + try { + await this.voiceRecording.stop(); + } catch { + // Ignore if the recording raises any error. + } + // forget about that call, so that we can stop it again later Singleflight.forgetAllFor(this.voiceRecording); const chunk = this.extractChunk(); diff --git a/src/voice-broadcast/models/VoiceBroadcastRecording.ts b/src/voice-broadcast/models/VoiceBroadcastRecording.ts index 410621808a..af69b7b710 100644 --- a/src/voice-broadcast/models/VoiceBroadcastRecording.ts +++ b/src/voice-broadcast/models/VoiceBroadcastRecording.ts @@ -333,7 +333,7 @@ export class VoiceBroadcastRecording * It sets the connection error state and stops the recorder. */ private async onConnectionError(): Promise { - await this.stopRecorder(); + await this.stopRecorder(false); this.setState("connection_error"); } @@ -418,14 +418,14 @@ export class VoiceBroadcastRecording } } - private async stopRecorder(): Promise { + private async stopRecorder(emit = true): Promise { if (!this.recorder) { return; } try { const lastChunk = await this.recorder.stop(); - if (lastChunk) { + if (lastChunk && emit) { await this.onChunkRecorded(lastChunk); } } catch (err) { diff --git a/test/voice-broadcast/audio/VoiceBroadcastRecorder-test.ts b/test/voice-broadcast/audio/VoiceBroadcastRecorder-test.ts index b88ef41bbc..a2848b4857 100644 --- a/test/voice-broadcast/audio/VoiceBroadcastRecorder-test.ts +++ b/test/voice-broadcast/audio/VoiceBroadcastRecorder-test.ts @@ -205,6 +205,22 @@ describe("VoiceBroadcastRecorder", () => { }); }); }); + + describe("and calling stop() with recording.stop error)", () => { + let stopPayload: ChunkRecordedPayload; + + beforeEach(async () => { + mocked(voiceRecording.stop).mockRejectedValue("Error"); + stopPayload = await voiceBroadcastRecorder.stop(); + }); + + it("should return the remaining chunk", () => { + expect(stopPayload).toEqual({ + buffer: concat(headers1, headers2, chunk1), + length: 23, + }); + }); + }); }); describe("when some chunks have been received", () => {