diff --git a/spec/unit/webrtc/groupCall.spec.ts b/spec/unit/webrtc/groupCall.spec.ts index e9a9c8a93..f83de56e5 100644 --- a/spec/unit/webrtc/groupCall.spec.ts +++ b/spec/unit/webrtc/groupCall.spec.ts @@ -23,7 +23,7 @@ import { Room, RoomMember, } from '../../../src'; -import { GroupCall, GroupCallEvent } from "../../../src/webrtc/groupCall"; +import { GroupCall, GroupCallEvent, GroupCallState } from "../../../src/webrtc/groupCall"; import { MatrixClient } from "../../../src/client"; import { installWebRTCMocks, @@ -174,6 +174,13 @@ describe('Group Call', function() { groupCall.leave(); }); + it("stops initializing local call feed when leaving", async () => { + const initPromise = groupCall.initLocalCallFeed(); + groupCall.leave(); + await expect(initPromise).rejects.toBeDefined(); + expect(groupCall.state).toBe(GroupCallState.LocalCallFeedUninitialized); + }); + it("sends state event to room when creating", async () => { await groupCall.create(); diff --git a/src/webrtc/groupCall.ts b/src/webrtc/groupCall.ts index 5b3bb1ee0..cb73b7183 100644 --- a/src/webrtc/groupCall.ts +++ b/src/webrtc/groupCall.ts @@ -257,13 +257,26 @@ export class GroupCall extends TypedEventEmitter< let stream: MediaStream; + let disposed = false; + const onState = (state: GroupCallState) => { + if (state === GroupCallState.LocalCallFeedUninitialized) { + disposed = true; + } + }; + this.on(GroupCallEvent.GroupCallStateChanged, onState); + try { stream = await this.client.getMediaHandler().getUserMediaStream(true, this.type === GroupCallType.Video); } catch (error) { this.setState(GroupCallState.LocalCallFeedUninitialized); throw error; + } finally { + this.off(GroupCallEvent.GroupCallStateChanged, onState); } + // The call could've been disposed while we were waiting + if (disposed) throw new Error("Group call disposed"); + const userId = this.client.getUserId()!; const callFeed = new CallFeed({