diff --git a/src/voice-broadcast/models/VoiceBroadcastPlayback.ts b/src/voice-broadcast/models/VoiceBroadcastPlayback.ts index 0cb9e3214f..2c4054a825 100644 --- a/src/voice-broadcast/models/VoiceBroadcastPlayback.ts +++ b/src/voice-broadcast/models/VoiceBroadcastPlayback.ts @@ -18,6 +18,7 @@ import { EventType, MatrixClient, MatrixEvent, + MatrixEventEvent, MsgType, RelationType, } from "matrix-js-sdk/src/matrix"; @@ -88,6 +89,7 @@ export class VoiceBroadcastPlayback ) { super(); this.addInfoEvent(this.infoEvent); + this.infoEvent.on(MatrixEventEvent.BeforeRedaction, this.onBeforeRedaction); this.setUpRelationsHelper(); } @@ -169,6 +171,14 @@ export class VoiceBroadcastPlayback this.setInfoState(state); }; + private onBeforeRedaction = () => { + if (this.getState() !== VoiceBroadcastPlaybackState.Stopped) { + this.stop(); + // destroy cleans up everything + this.destroy(); + } + }; + private async enqueueChunks(): Promise { const promises = this.chunkEvents.getEvents().reduce((promises, event: MatrixEvent) => { if (!this.playbacks.has(event.getId() || "")) { diff --git a/test/voice-broadcast/models/VoiceBroadcastPlayback-test.ts b/test/voice-broadcast/models/VoiceBroadcastPlayback-test.ts index c93b81628c..64fb2f095f 100644 --- a/test/voice-broadcast/models/VoiceBroadcastPlayback-test.ts +++ b/test/voice-broadcast/models/VoiceBroadcastPlayback-test.ts @@ -126,6 +126,7 @@ describe("VoiceBroadcastPlayback", () => { const mkPlayback = async () => { const playback = new VoiceBroadcastPlayback(infoEvent, client); jest.spyOn(playback, "removeAllListeners"); + jest.spyOn(playback, "destroy"); playback.on(VoiceBroadcastPlaybackEvent.StateChanged, onStateChanged); await flushPromises(); return playback; @@ -273,6 +274,7 @@ describe("VoiceBroadcastPlayback", () => { startPlayback(); it("should play the last chunk", () => { + expect(playback.getState()).toBe(VoiceBroadcastPlaybackState.Playing); // assert that the last chunk is played first expect(chunk2Playback.play).toHaveBeenCalled(); expect(chunk1Playback.play).not.toHaveBeenCalled(); @@ -299,6 +301,17 @@ describe("VoiceBroadcastPlayback", () => { }); }); }); + + describe("and the info event is deleted", () => { + beforeEach(() => { + infoEvent.makeRedacted(new MatrixEvent({})); + }); + + it("should stop and destroy the playback", () => { + expect(playback.getState()).toBe(VoiceBroadcastPlaybackState.Stopped); + expect(playback.destroy).toHaveBeenCalled(); + }); + }); }); });