From 3bd126a3c57926341db554b6533f1e705a4ac851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 16 Oct 2021 07:51:35 +0200 Subject: [PATCH 1/4] Add group call events to EventType MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/@types/event.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/@types/event.ts b/src/@types/event.ts index f23d7e76727..56c0025089b 100644 --- a/src/@types/event.ts +++ b/src/@types/event.ts @@ -87,6 +87,10 @@ export enum EventType { RoomKeyRequest = "m.room_key_request", ForwardedRoomKey = "m.forwarded_room_key", Dummy = "m.dummy", + + // Group call events + GroupCallPrefix = "org.matrix.msc3401.call", + GroupCallMemberPrefix = "org.matrix.msc3401.call.member", } export enum RelationType { From e9a4a57b4631d342eff50842b38e955bd58399d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 16 Oct 2021 07:53:12 +0200 Subject: [PATCH 2/4] Use EventType instead of a const MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/webrtc/groupCall.ts | 20 ++++++++++---------- src/webrtc/groupCallEventHandler.ts | 9 ++++----- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/webrtc/groupCall.ts b/src/webrtc/groupCall.ts index 98a0b536b1a..bba45ff3949 100644 --- a/src/webrtc/groupCall.ts +++ b/src/webrtc/groupCall.ts @@ -10,9 +10,7 @@ import { SDPStreamMetadataPurpose } from "./callEventTypes"; import { createNewMatrixCall } from "./call"; import { ISendEventResponse } from "../@types/requests"; import { MatrixEvent } from "../models/event"; - -export const GROUP_CALL_ROOM_EVENT = "org.matrix.msc3401.call"; -export const GROUP_CALL_MEMBER_EVENT = "org.matrix.msc3401.call.member"; +import { EventType } from "../@types/event"; export enum GroupCallIntent { Ring = "m.ring", @@ -129,7 +127,7 @@ export class GroupCall extends EventEmitter { this.sessionId = genCallID(); const roomState = this.room.currentState; - const memberStateEvents = roomState.getStateEvents(GROUP_CALL_MEMBER_EVENT); + const memberStateEvents = roomState.getStateEvents(EventType.GroupCallMemberPrefix); logger.log("Processing initial members", memberStateEvents); @@ -143,7 +141,7 @@ export class GroupCall extends EventEmitter { await this.client.sendStateEvent( this.room.roomId, - GROUP_CALL_ROOM_EVENT, + EventType.GroupCallPrefix, { "m.intent": this.intent, "m.type": this.type, @@ -247,7 +245,7 @@ export class GroupCall extends EventEmitter { // Set up participants for the members currently in the room. // Other members will be picked up by the RoomState.members event. const roomState = this.room.currentState; - const memberStateEvents = roomState.getStateEvents(GROUP_CALL_MEMBER_EVENT); + const memberStateEvents = roomState.getStateEvents(EventType.GroupCallMemberPrefix); logger.log("Processing initial members"); @@ -307,11 +305,13 @@ export class GroupCall extends EventEmitter { this.client.groupCallEventHandler.groupCalls.delete(this.room.roomId); if (emitStateEvent) { - const existingStateEvent = this.room.currentState.getStateEvents(GROUP_CALL_ROOM_EVENT, this.groupCallId); + const existingStateEvent = this.room.currentState.getStateEvents( + EventType.GroupCallPrefix, this.groupCallId, + ); await this.client.sendStateEvent( this.room.roomId, - GROUP_CALL_ROOM_EVENT, + EventType.GroupCallPrefix, { ...existingStateEvent.getContent(), ["m.terminated"]: GroupCallTerminationReason.CallEnded, @@ -502,7 +502,7 @@ export class GroupCall extends EventEmitter { private async updateMemberCallState(memberCallState?: IGroupCallRoomMemberCallState): Promise { const localUserId = this.client.getUserId(); - const currentStateEvent = this.room.currentState.getStateEvents(GROUP_CALL_MEMBER_EVENT, localUserId); + const currentStateEvent = this.room.currentState.getStateEvents(EventType.GroupCallMemberPrefix, localUserId); const calls = currentStateEvent?.getContent()["m.calls"] || []; @@ -516,7 +516,7 @@ export class GroupCall extends EventEmitter { calls.splice(existingCallIndex, 1); } - return this.client.sendStateEvent(this.room.roomId, GROUP_CALL_MEMBER_EVENT, { + return this.client.sendStateEvent(this.room.roomId, EventType.GroupCallMemberPrefix, { "m.calls": calls, }, localUserId); } diff --git a/src/webrtc/groupCallEventHandler.ts b/src/webrtc/groupCallEventHandler.ts index 196d3c0fdde..fd76299b0ea 100644 --- a/src/webrtc/groupCallEventHandler.ts +++ b/src/webrtc/groupCallEventHandler.ts @@ -17,8 +17,6 @@ limitations under the License. import { MatrixEvent } from '../models/event'; import { MatrixClient } from '../client'; import { - GROUP_CALL_ROOM_EVENT, - GROUP_CALL_MEMBER_EVENT, GroupCall, GroupCallIntent, GroupCallType, @@ -27,6 +25,7 @@ import { import { Room } from "../models/room"; import { RoomState } from "../models/room-state"; import { logger } from '../logger'; +import { EventType } from "../@types/event"; export class GroupCallEventHandler { public groupCalls = new Map(); // roomId -> GroupCall @@ -53,7 +52,7 @@ export class GroupCallEventHandler { } private createGroupCallForRoom(room: Room): GroupCall | undefined { - const callEvents = room.currentState.getStateEvents(GROUP_CALL_ROOM_EVENT); + const callEvents = room.currentState.getStateEvents(EventType.GroupCallPrefix); const sortedCallEvents = callEvents.sort((a, b) => b.getTs() - a.getTs()); for (const callEvent of sortedCallEvents) { @@ -125,7 +124,7 @@ export class GroupCallEventHandler { private onRoomStateChanged = (event: MatrixEvent, state: RoomState): void => { const eventType = event.getType(); - if (eventType === GROUP_CALL_ROOM_EVENT) { + if (eventType === EventType.GroupCallPrefix) { const groupCallId = event.getStateKey(); const content = event.getContent(); @@ -146,7 +145,7 @@ export class GroupCallEventHandler { logger.warn(`Multiple group calls detected for room: ${ state.roomId}. Multiple group calls are currently unsupported.`); } - } else if (eventType === GROUP_CALL_MEMBER_EVENT) { + } else if (eventType === EventType.GroupCallMemberPrefix) { const groupCall = this.groupCalls.get(state.roomId); if (!groupCall) { From 934d72f81d2077fa98b6fc59914376bf3f0fe17d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 16 Oct 2021 08:49:31 +0200 Subject: [PATCH 3/4] Make logging around sending group call member state event a bit better MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/webrtc/groupCall.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/webrtc/groupCall.ts b/src/webrtc/groupCall.ts index bba45ff3949..6fad09ff66c 100644 --- a/src/webrtc/groupCall.ts +++ b/src/webrtc/groupCall.ts @@ -224,8 +224,6 @@ export class GroupCall extends EventEmitter { await this.initLocalCallFeed(); } - logger.log(`Sending member state event with current call.`); - this.sendEnteredMemberStateEvent(); this.activeSpeaker = null; @@ -516,9 +514,11 @@ export class GroupCall extends EventEmitter { calls.splice(existingCallIndex, 1); } - return this.client.sendStateEvent(this.room.roomId, EventType.GroupCallMemberPrefix, { + const content = { "m.calls": calls, - }, localUserId); + }; + logger.log("Sending group call member state event", content); + return this.client.sendStateEvent(this.room.roomId, EventType.GroupCallMemberPrefix, content, localUserId); } public onMemberStateChanged = (event: MatrixEvent) => { From b853517c614d8b94b0f77681b71f6e223c8a174d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 16 Oct 2021 09:08:46 +0200 Subject: [PATCH 4/4] Fix m.calls elements being null MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/webrtc/groupCall.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/webrtc/groupCall.ts b/src/webrtc/groupCall.ts index 6fad09ff66c..b3355480058 100644 --- a/src/webrtc/groupCall.ts +++ b/src/webrtc/groupCall.ts @@ -501,10 +501,16 @@ export class GroupCall extends EventEmitter { const localUserId = this.client.getUserId(); const currentStateEvent = this.room.currentState.getStateEvents(EventType.GroupCallMemberPrefix, localUserId); + const memberStateEvent = currentStateEvent?.getContent(); - const calls = currentStateEvent?.getContent()["m.calls"] || []; - - const existingCallIndex = calls.findIndex((call) => call["m.call_id"] === this.groupCallId); + let calls: IGroupCallRoomMemberCallState[] = []; + let existingCallIndex: number; + if (memberCallState) { + calls = memberStateEvent["m.calls"] || []; + existingCallIndex = calls.findIndex((call) => call && call["m.call_id"] === this.groupCallId); + } else { + existingCallIndex = 0; + } if (existingCallIndex === -1) { calls.push(memberCallState);