From 503b149e55eb29df61106a03743ae9a74dd4ca2e Mon Sep 17 00:00:00 2001 From: RMidhunSuresh Date: Thu, 12 Jan 2023 12:33:38 +0530 Subject: [PATCH] Buffer toDevice messages --- src/matrix/calls/CallHandler.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/matrix/calls/CallHandler.ts b/src/matrix/calls/CallHandler.ts index 2b914a2f..0caab67f 100644 --- a/src/matrix/calls/CallHandler.ts +++ b/src/matrix/calls/CallHandler.ts @@ -44,6 +44,12 @@ export type Options = Omit; + userId: string; + deviceId: string; +} + function getRoomMemberKey(roomId: string, userId: string): string { return JSON.stringify(roomId)+`,`+JSON.stringify(userId); } @@ -51,6 +57,7 @@ function getRoomMemberKey(roomId: string, userId: string): string { export class CallHandler implements RoomStateHandler { // group calls by call id private readonly _calls: ObservableMap = new ObservableMap(); + private _bufferedDeviceMessages = new Map>(); // map of `"roomId","userId"` to set of conf_id's they are in private roomMemberToCallIds: Map> = new Map(); private groupCallOptions: GroupCallOptions; @@ -190,6 +197,17 @@ export class CallHandler implements RoomStateHandler { handleDeviceMessage(message: SignallingMessage, userId: string, deviceId: string, log: ILogItem) { // TODO: buffer messages for calls we haven't received the state event for yet? const call = this._calls.get(message.content.conf_id); + if (!call) { + const id = message.content.conf_id; + const set = this._bufferedDeviceMessages.get(id); + const buffer = { message, userId, deviceId }; + if (set) { + set.add(buffer); + } + else { + this._bufferedDeviceMessages.set(id, new Set([buffer])); + } + } call?.handleDeviceMessage(message, userId, deviceId, log); } @@ -213,6 +231,18 @@ export class CallHandler implements RoomStateHandler { roomId: roomId }); } + this.applyBufferedMessagesToCall(call, log); + } + + private applyBufferedMessagesToCall(call: GroupCall, log: ILogItem) { + const id = call.id; + const buffers = this._bufferedDeviceMessages.get(id); + if (buffers) { + for (const buffer of buffers) { + const { message, userId, deviceId } = buffer; + call.handleDeviceMessage(message, userId, deviceId, log); + } + } } private handleCallMemberEvent(event: StateEvent, member: RoomMember, roomId: string, log: ILogItem) {