From 026d6307f6040469f5a2dea252e4557b92098c69 Mon Sep 17 00:00:00 2001 From: Timo K Date: Thu, 9 Oct 2025 17:39:42 +0200 Subject: [PATCH 1/4] Small improvements Signed-off-by: Timo K --- src/matrixrtc/MembershipManager.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/matrixrtc/MembershipManager.ts b/src/matrixrtc/MembershipManager.ts index 533f9adfc4..def3754712 100644 --- a/src/matrixrtc/MembershipManager.ts +++ b/src/matrixrtc/MembershipManager.ts @@ -1062,12 +1062,12 @@ export class StickyEventMembershipManager extends MembershipManager { ); }; - private static nameMap = new Map([ - ["sendStateEvent", "_unstable_sendStickyEvent"], - ["sendDelayedStateEvent", "_unstable_sendStickyDelayedEvent"], - ]); protected actionUpdateFromErrors(e: unknown, t: MembershipActionType, m: string): ActionUpdate | undefined { - return super.actionUpdateFromErrors(e, t, StickyEventMembershipManager.nameMap.get(m) ?? "unknown"); + const mappedMethod = new Map([ + ["sendStateEvent", "_unstable_sendStickyEvent"], + ["_unstable_sendDelayedStateEvent", "_unstable_sendStickyDelayedEvent"], + ]).get(m); + return super.actionUpdateFromErrors(e, t, mappedMethod ?? "unknown method"); } protected makeMyMembership(expires: number): SessionMembershipData | RtcMembershipData { From d32a1d1593bb54cd905929cee22446a9951fc816 Mon Sep 17 00:00:00 2001 From: Timo K Date: Thu, 9 Oct 2025 17:57:14 +0200 Subject: [PATCH 2/4] review Signed-off-by: Timo K --- src/matrixrtc/MembershipManager.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/matrixrtc/MembershipManager.ts b/src/matrixrtc/MembershipManager.ts index def3754712..533f9adfc4 100644 --- a/src/matrixrtc/MembershipManager.ts +++ b/src/matrixrtc/MembershipManager.ts @@ -1062,12 +1062,12 @@ export class StickyEventMembershipManager extends MembershipManager { ); }; + private static nameMap = new Map([ + ["sendStateEvent", "_unstable_sendStickyEvent"], + ["sendDelayedStateEvent", "_unstable_sendStickyDelayedEvent"], + ]); protected actionUpdateFromErrors(e: unknown, t: MembershipActionType, m: string): ActionUpdate | undefined { - const mappedMethod = new Map([ - ["sendStateEvent", "_unstable_sendStickyEvent"], - ["_unstable_sendDelayedStateEvent", "_unstable_sendStickyDelayedEvent"], - ]).get(m); - return super.actionUpdateFromErrors(e, t, mappedMethod ?? "unknown method"); + return super.actionUpdateFromErrors(e, t, StickyEventMembershipManager.nameMap.get(m) ?? "unknown"); } protected makeMyMembership(expires: number): SessionMembershipData | RtcMembershipData { From ed121952a797b31474a46624c8673d0a58205780 Mon Sep 17 00:00:00 2001 From: Timo K Date: Sat, 11 Oct 2025 10:20:43 +0200 Subject: [PATCH 3/4] Make membership manager only be responsible for sessions starts Signed-off-by: Timo K --- .../matrixrtc/MatrixRTCSessionManager.spec.ts | 12 ++- spec/unit/matrixrtc/mocks.ts | 33 +++++-- src/matrixrtc/MatrixRTCSession.ts | 18 +++- src/matrixrtc/MatrixRTCSessionManager.ts | 94 +++++++++---------- 4 files changed, 89 insertions(+), 68 deletions(-) diff --git a/spec/unit/matrixrtc/MatrixRTCSessionManager.spec.ts b/spec/unit/matrixrtc/MatrixRTCSessionManager.spec.ts index a6d862cb0b..1db8d0d53b 100644 --- a/spec/unit/matrixrtc/MatrixRTCSessionManager.spec.ts +++ b/spec/unit/matrixrtc/MatrixRTCSessionManager.spec.ts @@ -19,6 +19,7 @@ import { RoomStateEvent } from "../../../src/models/room-state"; import { MatrixRTCSessionManager, MatrixRTCSessionManagerEvents } from "../../../src/matrixrtc/MatrixRTCSessionManager"; import { makeMockRoom, type MembershipData, membershipTemplate, mockRoomState, mockRTCEvent } from "./mocks"; import { logger } from "../../../src/logger"; +import { RoomStickyEventsEvent } from "../../../src/models/room-sticky-events"; describe.each([{ eventKind: "sticky" }, { eventKind: "memberState" }])( "MatrixRTCSessionManager ($eventKind)", @@ -30,10 +31,15 @@ describe.each([{ eventKind: "sticky" }, { eventKind: "memberState" }])( mockRoomState(room, [{ user_id: membershipTemplate.user_id }]); const roomState = room.getLiveTimeline().getState(EventTimeline.FORWARDS)!; const membEvent = roomState.getStateEvents("org.matrix.msc3401.call.member")[0]; - client.emit(RoomStateEvent.Events, membEvent, roomState, null); + roomState.emit(RoomStateEvent.Events, membEvent, roomState, null); } else { - membershipData.splice(0, 1, { user_id: membershipTemplate.user_id }); - client.emit(ClientEvent.Event, mockRTCEvent(membershipData[0], room.roomId, 10000)); + const previousData = membershipData.splice(0, 1, { + user_id: membershipTemplate.user_id, + msc4354_sticky_key: membershipTemplate.msc4354_sticky_key, + })[0]; + const current = mockRTCEvent(membershipData[0], room.roomId, 10000); + const previous = mockRTCEvent(previousData, room.roomId, 10000); + room.emit(RoomStickyEventsEvent.Update, [], [{ current, previous }], []); } } diff --git a/spec/unit/matrixrtc/mocks.ts b/spec/unit/matrixrtc/mocks.ts index 24982afe25..af0beabf6e 100644 --- a/spec/unit/matrixrtc/mocks.ts +++ b/spec/unit/matrixrtc/mocks.ts @@ -14,12 +14,20 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { EventEmitter } from "stream"; import { type Mocked } from "jest-mock"; -import { EventType, type Room, RoomEvent, type MatrixClient, type MatrixEvent } from "../../../src"; +import { + EventType, + type Room, + RoomEvent, + type MatrixClient, + type MatrixEvent, + Direction, + TypedEventEmitter, +} from "../../../src"; import { CallMembership, type SessionMembershipData } from "../../../src/matrixrtc/CallMembership"; import { secureRandomString } from "../../../src/randomstring"; +import { type StickyMatrixEvent } from "../../../src/models/room-sticky-events"; export type MembershipData = (SessionMembershipData | {}) & { user_id: string }; @@ -81,7 +89,7 @@ export function makeMockRoom( // Caching roomState here so it does not get recreated when calling `getLiveTimeline.getState()` const roomState = makeMockRoomState(useStickyEvents ? [] : membershipData, roomId); const ts = Date.now(); - const room = Object.assign(new EventEmitter(), { + const room = Object.assign(new TypedEventEmitter(), { roomId: roomId, hasMembershipState: jest.fn().mockReturnValue(true), getLiveTimeline: jest.fn().mockReturnValue({ @@ -102,14 +110,13 @@ export function makeMockRoom( function makeMockRoomState(membershipData: MembershipData[], roomId: string) { const events = membershipData.map((m) => mockRTCEvent(m, roomId)); + const keysAndEvents = events.map((e) => { const data = e.getContent() as SessionMembershipData; return [`_${e.sender?.userId}_${data.device_id}`]; }); - return { - on: jest.fn(), - off: jest.fn(), + return Object.assign(new TypedEventEmitter(), { getStateEvents: (_: string, stateKey: string) => { if (stateKey !== undefined) return keysAndEvents.find(([k]) => k === stateKey)?.[1]; return events; @@ -128,11 +135,17 @@ function makeMockRoomState(membershipData: MembershipData[], roomId: string) { }, ], ]), - }; + }); } export function mockRoomState(room: Room, membershipData: MembershipData[]): void { - room.getLiveTimeline().getState = jest.fn().mockReturnValue(makeMockRoomState(membershipData, room.roomId)); + const prevState = room.getLiveTimeline().getState(Direction.Forward)!; + const newState = makeMockRoomState(membershipData, room.roomId); + room.getLiveTimeline().getState = jest + .fn() + .mockReturnValue( + Object.assign(prevState, { events: newState.events, getStateEvents: newState.getStateEvents }), + ); } export function makeMockEvent( @@ -160,7 +173,7 @@ export function mockRTCEvent( roomId: string, stickyDuration?: number, timestamp?: number, -): MatrixEvent { +): StickyMatrixEvent { return { ...makeMockEvent( stickyDuration !== undefined ? EventType.RTCMembership : EventType.GroupCallMemberPrefix, @@ -171,7 +184,7 @@ export function mockRTCEvent( !stickyDuration && "device_id" in membershipData ? `_${sender}_${membershipData.device_id}` : "", ), unstableStickyExpiresAt: stickyDuration, - } as unknown as MatrixEvent; + } as unknown as StickyMatrixEvent; } export function mockCallMembership(membershipData: MembershipData, roomId: string): CallMembership { diff --git a/src/matrixrtc/MatrixRTCSession.ts b/src/matrixrtc/MatrixRTCSession.ts index 63bc8adf68..a07426dcdf 100644 --- a/src/matrixrtc/MatrixRTCSession.ts +++ b/src/matrixrtc/MatrixRTCSession.ts @@ -70,6 +70,7 @@ export type MatrixRTCSessionEventHandlerMap = { [MatrixRTCSessionEvent.MembershipsChanged]: ( oldMemberships: CallMembership[], newMemberships: CallMembership[], + session: MatrixRTCSession, ) => void; [MatrixRTCSessionEvent.JoinStateChanged]: (isJoined: boolean) => void; [MatrixRTCSessionEvent.EncryptionKeyChanged]: ( @@ -488,11 +489,14 @@ export class MatrixRTCSession extends TypedEventEmitter< * this class. * Outside of tests this most likely will be a full room, however. * @deprecated Relying on a full Room object being available here is an anti-pattern. You should be tracking - * the room object in your own code and passing it in when needed. + * the room object in your own code and passing it in when needed. use roomId instead. */ public get room(): Room { return this.roomSubset as Room; } + public get roomId(): string { + return this.roomSubset.roomId; + } /** * This constructs a room session. When using MatrixRTC inside the js-sdk this is expected @@ -537,8 +541,8 @@ export class MatrixRTCSession extends TypedEventEmitter< super(); this.logger = rootLogger.getChild(`[MatrixRTCSession ${roomSubset.roomId}]`); const roomState = this.roomSubset.getLiveTimeline().getState(EventTimeline.FORWARDS); - // TODO: double check if this is actually needed. Should be covered by refreshRoom in MatrixRTCSessionManager roomState?.on(RoomStateEvent.Members, this.onRoomMemberUpdate); + roomState?.on(RoomStateEvent.Events, this.onRoomStateUpdate); this.roomSubset.on(RoomStickyEventsEvent.Update, this.onStickyEventUpdate); this.setExpiryTimer(); @@ -562,6 +566,7 @@ export class MatrixRTCSession extends TypedEventEmitter< } const roomState = this.roomSubset.getLiveTimeline().getState(EventTimeline.FORWARDS); roomState?.off(RoomStateEvent.Members, this.onRoomMemberUpdate); + roomState?.off(RoomStateEvent.Events, this.onRoomStateUpdate); this.roomSubset.off(RoomStickyEventsEvent.Update, this.onStickyEventUpdate); } @@ -855,6 +860,13 @@ export class MatrixRTCSession extends TypedEventEmitter< this.recalculateSessionMembers(); } }; + /** + * Call this when a sticky event update has occured. + */ + private readonly onRoomStateUpdate = (event: MatrixEvent): void => { + if (event.getType() !== EventType.GroupCallMemberPrefix) return; + this.recalculateSessionMembers(); + }; /** * Call this when something changed that may impacts the current MatrixRTC members in this session. @@ -883,7 +895,7 @@ export class MatrixRTCSession extends TypedEventEmitter< `Memberships for call in room ${this.roomSubset.roomId} have changed: emitting (${this.memberships.length} members)`, ); logDurationSync(this.logger, "emit MatrixRTCSessionEvent.MembershipsChanged", () => { - this.emit(MatrixRTCSessionEvent.MembershipsChanged, oldMemberships, this.memberships); + this.emit(MatrixRTCSessionEvent.MembershipsChanged, oldMemberships, this.memberships, this); }); void this.membershipManager?.onRTCSessionMemberUpdate(this.memberships); diff --git a/src/matrixrtc/MatrixRTCSessionManager.ts b/src/matrixrtc/MatrixRTCSessionManager.ts index a103b39db9..802c160e2b 100644 --- a/src/matrixrtc/MatrixRTCSessionManager.ts +++ b/src/matrixrtc/MatrixRTCSessionManager.ts @@ -20,8 +20,9 @@ import { TypedEventEmitter } from "../models/typed-event-emitter.ts"; import { type Room } from "../models/room.ts"; import { RoomStateEvent } from "../models/room-state.ts"; import { type MatrixEvent } from "../models/event.ts"; -import { MatrixRTCSession, type SlotDescription } from "./MatrixRTCSession.ts"; +import { MatrixRTCSession, MatrixRTCSessionEvent, type SlotDescription } from "./MatrixRTCSession.ts"; import { EventType } from "../@types/event.ts"; +import { type CallMembership } from "./CallMembership.ts"; export enum MatrixRTCSessionManagerEvents { // A member has joined the MatrixRTC session, creating an active session in a room where there wasn't previously @@ -66,10 +67,7 @@ export class MatrixRTCSessionManager extends TypedEventEmitter 0) { - this.roomSessions.set(room.roomId, session); - } + this.createSessionIfNeeded(room); } this.client.on(ClientEvent.Room, this.onRoom); @@ -79,10 +77,10 @@ export class MatrixRTCSessionManager extends TypedEventEmitter { - this.refreshRoom(room); + private createRoomSession(room: Room): MatrixRTCSession { + const sess = MatrixRTCSession.sessionForSlot(this.client, room, this.slotDescription); + this.roomSessions.set(room.roomId, sess); + + sess.on(MatrixRTCSessionEvent.MembershipsChanged, this.onRtcMembershipChange); + this.logger.trace(`Session started for ${room.roomId} (${sess.memberships.length} members)`); + if (sess.memberships.length > 0) this.emit(MatrixRTCSessionManagerEvents.SessionStarted, room.roomId, sess); + return sess; + } + + private readonly onRtcMembershipChange = ( + oldM: CallMembership[], + newM: CallMembership[], + session: MatrixRTCSession, + ): void => { + if (oldM.length > 0 && newM.length === 0) { + this.logger.trace(`Session ended for ${session.roomId}`); + this.emit(MatrixRTCSessionManagerEvents.SessionEnded, session.roomId, session); + } else if (oldM.length === 0 && newM.length > 0) { + this.logger.trace(`Session started for ${session.roomId}`); + this.emit(MatrixRTCSessionManagerEvents.SessionStarted, session.roomId, session); + } }; + // Possible cases in which we need to create a session if one doesn't already exist: + private createSessionIfNeeded(room: Room): void { + if (!this.roomSessions.has(room.roomId)) this.createRoomSession(room); + } + private onRoom = (room: Room): void => { + this.createSessionIfNeeded(room); + }; private readonly onEvent = (event: MatrixEvent): void => { - if (!event.unstableStickyExpiresAt) return; // Not sticky, not interested. - if (event.getType() !== EventType.RTCMembership) return; + if (!event.unstableStickyExpiresAt) return; // Not sticky, not interested. const room = this.client.getRoom(event.getRoomId()); if (!room) return; - this.refreshRoom(room); + this.createSessionIfNeeded(room); }; - private readonly onRoomState = (event: MatrixEvent): void => { - if (event.getType() !== EventType.GroupCallMemberPrefix) { - return; - } - const room = this.client.getRoom(event.getRoomId()); - if (!room) { - this.logger.error(`Got room state event for unknown room ${event.getRoomId()}!`); - return; - } + if (event.getType() !== EventType.GroupCallMemberPrefix) return; - this.refreshRoom(room); + const room = this.client.getRoom(event.getRoomId()); + if (!room) return; + this.createSessionIfNeeded(room); }; - - private refreshRoom(room: Room): void { - const isNewSession = !this.roomSessions.has(room.roomId); - const session = this.getRoomSession(room); - - const wasActiveAndKnown = session.memberships.length > 0 && !isNewSession; - // This needs to be here and the event listener cannot be setup in the MatrixRTCSession, - // because we need the update to happen between: - // wasActiveAndKnown = session.memberships.length > 0 and - // nowActive = session.memberships.length - // Alternatively we would need to setup some event emission when the RTC session ended. - session.onRTCSessionMemberUpdate(); - - const nowActive = session.memberships.length > 0; - - if (wasActiveAndKnown && !nowActive) { - this.logger.trace(`Session ended for ${room.roomId} (${session.memberships.length} members)`); - this.emit(MatrixRTCSessionManagerEvents.SessionEnded, room.roomId, this.roomSessions.get(room.roomId)!); - } else if (!wasActiveAndKnown && nowActive) { - this.logger.trace(`Session started for ${room.roomId} (${session.memberships.length} members)`); - this.emit(MatrixRTCSessionManagerEvents.SessionStarted, room.roomId, this.roomSessions.get(room.roomId)!); - } - } } From 50f911eaee5323dbc04615393ebfb21b74535e58 Mon Sep 17 00:00:00 2001 From: Timo K Date: Sat, 11 Oct 2025 10:36:41 +0200 Subject: [PATCH 4/4] remove `onRTCSessionMemberUpdate` Signed-off-by: Timo K --- spec/unit/matrixrtc/MatrixRTCSession.spec.ts | 37 ++++++++++---------- src/matrixrtc/MatrixRTCSession.ts | 14 ++++---- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/spec/unit/matrixrtc/MatrixRTCSession.spec.ts b/spec/unit/matrixrtc/MatrixRTCSession.spec.ts index 8eb11ecdd1..00db7cbd34 100644 --- a/spec/unit/matrixrtc/MatrixRTCSession.spec.ts +++ b/spec/unit/matrixrtc/MatrixRTCSession.spec.ts @@ -568,7 +568,7 @@ describe("MatrixRTCSession", () => { sess!.joinRoomSession([mockFocus], mockFocus, { notificationType: "ring" }); await Promise.race([sentStateEvent, new Promise((resolve) => setTimeout(resolve, 5000))]); mockRoomState(mockRoom, [{ ...membershipTemplate, user_id: client.getUserId()! }]); - sess!.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); const ownMembershipId = sess?.memberships[0].eventId; expect(client.sendEvent).toHaveBeenCalledWith(mockRoom!.roomId, EventType.RTCNotification, { @@ -638,7 +638,7 @@ describe("MatrixRTCSession", () => { }, ]); - sess!.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); const ownMembershipId = sess?.memberships[0].eventId; expect(sess!.getConsensusCallIntent()).toEqual("audio"); @@ -689,13 +689,13 @@ describe("MatrixRTCSession", () => { it("doesn't send a notification when joining an existing call", async () => { // Add another member to the call so that it is considered an existing call mockRoomState(mockRoom, [membershipTemplate]); - sess!.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); // Simulate a join, including the update to the room state sess!.joinRoomSession([mockFocus], mockFocus, { notificationType: "ring" }); await Promise.race([sentStateEvent, new Promise((resolve) => setTimeout(resolve, 5000))]); mockRoomState(mockRoom, [membershipTemplate, { ...membershipTemplate, user_id: client.getUserId()! }]); - sess!.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); expect(client.sendEvent).not.toHaveBeenCalled(); }); @@ -707,9 +707,9 @@ describe("MatrixRTCSession", () => { // But this time we want to simulate a race condition in which we receive a state event // from someone else, starting the call before our own state event has been sent mockRoomState(mockRoom, [membershipTemplate]); - sess!.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); mockRoomState(mockRoom, [membershipTemplate, { ...membershipTemplate, user_id: client.getUserId()! }]); - sess!.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); // We assume that the responsibility to send a notification, if any, lies with the other // participant that won the race @@ -724,7 +724,7 @@ describe("MatrixRTCSession", () => { const onMembershipsChanged = jest.fn(); sess.on(MatrixRTCSessionEvent.MembershipsChanged, onMembershipsChanged); - sess.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); expect(onMembershipsChanged).not.toHaveBeenCalled(); }); @@ -737,7 +737,7 @@ describe("MatrixRTCSession", () => { sess.on(MatrixRTCSessionEvent.MembershipsChanged, onMembershipsChanged); mockRoomState(mockRoom, []); - sess.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); expect(onMembershipsChanged).toHaveBeenCalled(); }); @@ -921,14 +921,14 @@ describe("MatrixRTCSession", () => { // member2 leaves triggering key rotation mockRoomState(mockRoom, [membershipTemplate]); - sess.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); // member2 re-joins which should trigger an immediate re-send const keysSentPromise2 = new Promise((resolve) => { sendEventMock.mockImplementation((_roomId, _evType, payload) => resolve(payload)); }); mockRoomState(mockRoom, [membershipTemplate, member2]); - sess.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); // but, that immediate resend is throttled so we need to wait a bit jest.advanceTimersByTime(1000); const { keys } = await keysSentPromise2; @@ -979,7 +979,7 @@ describe("MatrixRTCSession", () => { }); mockRoomState(mockRoom, [membershipTemplate, member2]); - sess.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); await keysSentPromise2; @@ -1026,7 +1026,7 @@ describe("MatrixRTCSession", () => { sendEventMock.mockClear(); // these should be a no-op: - sess.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); expect(sendEventMock).toHaveBeenCalledTimes(0); expect(sess!.statistics.counters.roomEventEncryptionKeysSent).toEqual(1); } finally { @@ -1071,7 +1071,7 @@ describe("MatrixRTCSession", () => { sendEventMock.mockClear(); // this should be a no-op: - sess.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); expect(sendEventMock).toHaveBeenCalledTimes(0); // advance time to avoid key throttling @@ -1086,7 +1086,7 @@ describe("MatrixRTCSession", () => { }); // this should re-send the key - sess.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); await keysSentPromise2; @@ -1144,7 +1144,7 @@ describe("MatrixRTCSession", () => { }); mockRoomState(mockRoom, [membershipTemplate]); - sess.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); jest.advanceTimersByTime(KEY_DELAY); expect(sendKeySpy).toHaveBeenCalledTimes(1); @@ -1211,7 +1211,7 @@ describe("MatrixRTCSession", () => { mockRoomState(mockRoom, members.slice(0, membersToTest - i)); } - sess!.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); // advance time to avoid key throttling jest.advanceTimersByTime(10000); @@ -1250,7 +1250,7 @@ describe("MatrixRTCSession", () => { }); mockRoomState(mockRoom, [membershipTemplate, member2]); - sess.onRTCSessionMemberUpdate(); + (sess as any).recalculateSessionMembers(); await new Promise((resolve) => { realSetTimeout(resolve); @@ -1277,7 +1277,8 @@ describe("MatrixRTCSession", () => { manageMediaKeys: true, useExperimentalToDeviceTransport: true, }); - sess.onRTCSessionMemberUpdate(); + + (sess as any).recalculateSessionMembers(); await keySentPromise; diff --git a/src/matrixrtc/MatrixRTCSession.ts b/src/matrixrtc/MatrixRTCSession.ts index a07426dcdf..6f21d9aff3 100644 --- a/src/matrixrtc/MatrixRTCSession.ts +++ b/src/matrixrtc/MatrixRTCSession.ts @@ -775,7 +775,7 @@ export class MatrixRTCSession extends TypedEventEmitter< } if (soonestExpiry != undefined) { - this.expiryTimeout = setTimeout(this.onRTCSessionMemberUpdate, soonestExpiry); + this.expiryTimeout = setTimeout(this.recalculateSessionMembers, soonestExpiry); } } @@ -868,12 +868,12 @@ export class MatrixRTCSession extends TypedEventEmitter< this.recalculateSessionMembers(); }; - /** - * Call this when something changed that may impacts the current MatrixRTC members in this session. - */ - public onRTCSessionMemberUpdate = (): void => { - this.recalculateSessionMembers(); - }; + // /** + // * Call this when something changed that may impacts the current MatrixRTC members in this session. + // */ + // public onRTCSessionMemberUpdate = (): void => { + // this.recalculateSessionMembers(); + // }; /** * Call this when anything that could impact rtc memberships has changed: Room Members or RTC members.