Skip to content

Commit 76b255b

Browse files
committed
Don't expose calls on GroupCall
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
1 parent 0af2f79 commit 76b255b

File tree

4 files changed

+53
-11
lines changed

4 files changed

+53
-11
lines changed

spec/unit/webrtc/groupCall.spec.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ describe('Group Call', function() {
515515

516516
it("sends metadata updates before unmuting in PTT mode", async () => {
517517
const mockCall = new MockCall(FAKE_ROOM_ID, groupCall.groupCallId);
518-
groupCall.calls.set(
518+
(groupCall as any).calls.set(
519519
mockCall.getOpponentMember() as RoomMember,
520520
new Map([[mockCall.getOpponentDeviceId(), mockCall.typed()]]),
521521
);
@@ -540,7 +540,7 @@ describe('Group Call', function() {
540540

541541
it("sends metadata updates after muting in PTT mode", async () => {
542542
const mockCall = new MockCall(FAKE_ROOM_ID, groupCall.groupCallId);
543-
groupCall.calls.set(
543+
(groupCall as any).calls.set(
544544
mockCall.getOpponentMember() as RoomMember,
545545
new Map([[mockCall.getOpponentDeviceId(), mockCall.typed()]]),
546546
);
@@ -698,7 +698,7 @@ describe('Group Call', function() {
698698

699699
expect(client1.sendToDevice).toHaveBeenCalled();
700700

701-
const oldCall = groupCall1.calls.get(
701+
const oldCall = (groupCall1 as any).calls.get(
702702
groupCall1.room.getMember(client2.userId)!,
703703
)!.get(client2.deviceId)!;
704704
oldCall.emit(CallEvent.Hangup, oldCall!);
@@ -719,7 +719,7 @@ describe('Group Call', function() {
719719
// to even be created...
720720
let newCall: MatrixCall | undefined;
721721
while (
722-
(newCall = groupCall1.calls.get(
722+
(newCall = (groupCall1 as any).calls.get(
723723
groupCall1.room.getMember(client2.userId)!,
724724
)?.get(client2.deviceId)) === undefined
725725
|| newCall.peerConn === undefined
@@ -763,7 +763,7 @@ describe('Group Call', function() {
763763
groupCall1.setMicrophoneMuted(false);
764764
groupCall1.setLocalVideoMuted(false);
765765

766-
const call = groupCall1.calls.get(
766+
const call = (groupCall1 as any).calls.get(
767767
groupCall1.room.getMember(client2.userId)!,
768768
)!.get(client2.deviceId)!;
769769
call.isMicrophoneMuted = jest.fn().mockReturnValue(true);
@@ -874,7 +874,9 @@ describe('Group Call', function() {
874874
// It takes a bit of time for the calls to get created
875875
await sleep(10);
876876

877-
const call = groupCall.calls.get(groupCall.room.getMember(FAKE_USER_ID_2)!)!.get(FAKE_DEVICE_ID_2)!;
877+
const call = (groupCall as any).calls
878+
.get(groupCall.room.getMember(FAKE_USER_ID_2)!)!
879+
.get(FAKE_DEVICE_ID_2)!;
878880
call.getOpponentMember = () => ({ userId: call.invitee }) as RoomMember;
879881
// @ts-ignore Mock
880882
call.pushRemoteFeed(new MockMediaStream("stream", [
@@ -897,7 +899,9 @@ describe('Group Call', function() {
897899
// It takes a bit of time for the calls to get created
898900
await sleep(10);
899901

900-
const call = groupCall.calls.get(groupCall.room.getMember(FAKE_USER_ID_2)!)!.get(FAKE_DEVICE_ID_2)!;
902+
const call = (groupCall as any).calls
903+
.get(groupCall.room.getMember(FAKE_USER_ID_2)!)!
904+
.get(FAKE_DEVICE_ID_2)!;
901905
call.getOpponentMember = () => ({ userId: call.invitee }) as RoomMember;
902906
// @ts-ignore Mock
903907
call.pushRemoteFeed(new MockMediaStream("stream", [
@@ -972,7 +976,7 @@ describe('Group Call', function() {
972976

973977
expect(mockCall.reject).not.toHaveBeenCalled();
974978
expect(mockCall.answerWithCallFeeds).toHaveBeenCalled();
975-
expect(groupCall.calls).toEqual(new Map([[
979+
expect((groupCall as any).calls).toEqual(new Map([[
976980
groupCall.room.getMember(FAKE_USER_ID_1)!,
977981
new Map([[FAKE_DEVICE_ID_1, mockCall]]),
978982
]]));
@@ -989,7 +993,7 @@ describe('Group Call', function() {
989993

990994
expect(oldMockCall.hangup).toHaveBeenCalled();
991995
expect(newMockCall.answerWithCallFeeds).toHaveBeenCalled();
992-
expect(groupCall.calls).toEqual(new Map([[
996+
expect((groupCall as any).calls).toEqual(new Map([[
993997
groupCall.room.getMember(FAKE_USER_ID_1)!,
994998
new Map([[FAKE_DEVICE_ID_1, newMockCall]]),
995999
]]));
@@ -1072,7 +1076,9 @@ describe('Group Call', function() {
10721076
// It takes a bit of time for the calls to get created
10731077
await sleep(10);
10741078

1075-
const call = groupCall.calls.get(groupCall.room.getMember(FAKE_USER_ID_2)!)!.get(FAKE_DEVICE_ID_2)!;
1079+
const call = (groupCall as any).calls
1080+
.get(groupCall.room.getMember(FAKE_USER_ID_2)!)!
1081+
.get(FAKE_DEVICE_ID_2)!;
10761082
call.getOpponentMember = () => ({ userId: call.invitee }) as RoomMember;
10771083
call.onNegotiateReceived({
10781084
getContent: () => ({

src/webrtc/call.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,7 @@ export class MatrixCall extends TypedEventEmitter<CallEvent, CallEventHandlerMap
656656

657657
this.feeds.push(new CallFeed({
658658
client: this.client,
659+
call: this,
659660
roomId: this.roomId,
660661
userId,
661662
deviceId: this.getOpponentDeviceId(),
@@ -699,6 +700,7 @@ export class MatrixCall extends TypedEventEmitter<CallEvent, CallEventHandlerMap
699700

700701
this.feeds.push(new CallFeed({
701702
client: this.client,
703+
call: this,
702704
roomId: this.roomId,
703705
audioMuted: false,
704706
videoMuted: false,

src/webrtc/callFeed.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { MatrixClient } from "../client";
2020
import { RoomMember } from "../models/room-member";
2121
import { logger } from "../logger";
2222
import { TypedEventEmitter } from "../models/typed-event-emitter";
23+
import { CallEvent, CallState, MatrixCall } from "./call";
2324

2425
const POLLING_INTERVAL = 200; // ms
2526
export const SPEAKING_THRESHOLD = -60; // dB
@@ -40,13 +41,18 @@ export interface ICallFeedOpts {
4041
* Whether or not the remote SDPStreamMetadata says video is muted
4142
*/
4243
videoMuted: boolean;
44+
/**
45+
* The MatrixCall which is the source of this CallFeed
46+
*/
47+
call?: MatrixCall;
4348
}
4449

4550
export enum CallFeedEvent {
4651
NewStream = "new_stream",
4752
MuteStateChanged = "mute_state_changed",
4853
LocalVolumeChanged = "local_volume_changed",
4954
VolumeChanged = "volume_changed",
55+
ConnectedChanged = "connected_changed",
5056
Speaking = "speaking",
5157
Disposed = "disposed",
5258
}
@@ -56,6 +62,7 @@ type EventHandlerMap = {
5662
[CallFeedEvent.MuteStateChanged]: (audioMuted: boolean, videoMuted: boolean) => void;
5763
[CallFeedEvent.LocalVolumeChanged]: (localVolume: number) => void;
5864
[CallFeedEvent.VolumeChanged]: (volume: number) => void;
65+
[CallFeedEvent.ConnectedChanged]: (connected: boolean) => void;
5966
[CallFeedEvent.Speaking]: (speaking: boolean) => void;
6067
[CallFeedEvent.Disposed]: () => void;
6168
};
@@ -69,6 +76,7 @@ export class CallFeed extends TypedEventEmitter<CallFeedEvent, EventHandlerMap>
6976
public speakingVolumeSamples: number[];
7077

7178
private client: MatrixClient;
79+
private call?: MatrixCall;
7280
private roomId?: string;
7381
private audioMuted: boolean;
7482
private videoMuted: boolean;
@@ -81,11 +89,13 @@ export class CallFeed extends TypedEventEmitter<CallFeedEvent, EventHandlerMap>
8189
private speaking = false;
8290
private volumeLooperTimeout?: ReturnType<typeof setTimeout>;
8391
private _disposed = false;
92+
private _connected = false;
8493

8594
public constructor(opts: ICallFeedOpts) {
8695
super();
8796

8897
this.client = opts.client;
98+
this.call = opts.call;
8999
this.roomId = opts.roomId;
90100
this.userId = opts.userId;
91101
this.deviceId = opts.deviceId;
@@ -101,6 +111,21 @@ export class CallFeed extends TypedEventEmitter<CallFeedEvent, EventHandlerMap>
101111
if (this.hasAudioTrack) {
102112
this.initVolumeMeasuring();
103113
}
114+
115+
if (opts.call) {
116+
opts.call.addListener(CallEvent.State, this.onCallState);
117+
this.onCallState(opts.call.state);
118+
}
119+
}
120+
121+
public get connected(): boolean {
122+
// Local feeds are always considered connected
123+
return this.isLocal() || this._connected;
124+
}
125+
126+
private set connected(connected: boolean) {
127+
this._connected = connected;
128+
this.emit(CallFeedEvent.ConnectedChanged, connected);
104129
}
105130

106131
private get hasAudioTrack(): boolean {
@@ -145,6 +170,14 @@ export class CallFeed extends TypedEventEmitter<CallFeedEvent, EventHandlerMap>
145170
this.emit(CallFeedEvent.NewStream, this.stream);
146171
};
147172

173+
private onCallState = (state: CallState): void => {
174+
if (state === CallState.Connected) {
175+
this.connected = true;
176+
} else if (state === CallState.Connecting) {
177+
this.connected = false;
178+
}
179+
};
180+
148181
/**
149182
* Returns callRoom member
150183
* @returns member of the callRoom
@@ -297,6 +330,7 @@ export class CallFeed extends TypedEventEmitter<CallFeedEvent, EventHandlerMap>
297330
public dispose(): void {
298331
clearTimeout(this.volumeLooperTimeout);
299332
this.stream?.removeEventListener("addtrack", this.onAddTrack);
333+
this.call?.removeListener(CallEvent.State, this.onCallState);
300334
if (this.audioContext) {
301335
this.audioContext = undefined;
302336
this.analyser = undefined;

src/webrtc/groupCall.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,11 @@ export class GroupCall extends TypedEventEmitter<
168168
public localCallFeed?: CallFeed;
169169
public localScreenshareFeed?: CallFeed;
170170
public localDesktopCapturerSourceId?: string;
171-
public readonly calls = new Map<RoomMember, Map<string, MatrixCall>>();
172171
public readonly userMediaFeeds: CallFeed[] = [];
173172
public readonly screenshareFeeds: CallFeed[] = [];
174173
public groupCallId: string;
175174

175+
private readonly calls = new Map<RoomMember, Map<string, MatrixCall>>(); // RoomMember -> device ID -> MatrixCall
176176
private callHandlers = new Map<string, Map<string, ICallHandlers>>(); // User ID -> device ID -> handlers
177177
private activeSpeakerLoopInterval?: ReturnType<typeof setTimeout>;
178178
private retryCallLoopInterval?: ReturnType<typeof setTimeout>;

0 commit comments

Comments
 (0)