diff --git a/spec/unit/matrixrtc/MatrixRTCSession.spec.ts b/spec/unit/matrixrtc/MatrixRTCSession.spec.ts index c1faa5ac0c3..2c40e9a2230 100644 --- a/spec/unit/matrixrtc/MatrixRTCSession.spec.ts +++ b/spec/unit/matrixrtc/MatrixRTCSession.spec.ts @@ -74,6 +74,13 @@ describe("MatrixRTCSession", () => { expect(sess?.memberships[0].deviceId).toEqual("AAAAAAA"); }); + it("ignores memberships events of members not in the room", () => { + const mockRoom = makeMockRoom([membershipTemplate]); + mockRoom.hasMembershipState = (state) => state === "join"; + sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom); + expect(sess?.memberships.length).toEqual(0); + }); + it("honours created_ts", () => { const expiredMembership = Object.assign({}, membershipTemplate); expiredMembership.created_ts = 500; @@ -91,9 +98,12 @@ describe("MatrixRTCSession", () => { it("safely ignores events with no memberships section", () => { const mockRoom = { + ...makeMockRoom([]), roomId: randomString(8), getLiveTimeline: jest.fn().mockReturnValue({ getState: jest.fn().mockReturnValue({ + on: jest.fn(), + off: jest.fn(), getStateEvents: (_type: string, _stateKey: string) => [ { getType: jest.fn().mockReturnValue(EventType.GroupCallMemberPrefix), @@ -112,9 +122,12 @@ describe("MatrixRTCSession", () => { it("safely ignores events with junk memberships section", () => { const mockRoom = { + ...makeMockRoom([]), roomId: randomString(8), getLiveTimeline: jest.fn().mockReturnValue({ getState: jest.fn().mockReturnValue({ + on: jest.fn(), + off: jest.fn(), getStateEvents: (_type: string, _stateKey: string) => [ { getType: jest.fn().mockReturnValue(EventType.GroupCallMemberPrefix), diff --git a/spec/unit/matrixrtc/mocks.ts b/spec/unit/matrixrtc/mocks.ts index e342eb2dc63..84496e657da 100644 --- a/spec/unit/matrixrtc/mocks.ts +++ b/spec/unit/matrixrtc/mocks.ts @@ -24,6 +24,7 @@ export function makeMockRoom(memberships: CallMembershipData[], localAge: number const roomState = makeMockRoomState(memberships, roomId, localAge); return { roomId: roomId, + hasMembershipState: jest.fn().mockReturnValue(true), getLiveTimeline: jest.fn().mockReturnValue({ getState: jest.fn().mockReturnValue(roomState), }), @@ -33,6 +34,8 @@ export function makeMockRoom(memberships: CallMembershipData[], localAge: number export function makeMockRoomState(memberships: CallMembershipData[], roomId: string, localAge: number | null = null) { const event = mockRTCEvent(memberships, roomId, localAge); return { + on: jest.fn(), + off: jest.fn(), getStateEvents: (_: string, stateKey: string) => { if (stateKey !== undefined) return event; return [event]; diff --git a/src/matrixrtc/MatrixRTCSession.ts b/src/matrixrtc/MatrixRTCSession.ts index b8ee6626fd0..99e2c561193 100644 --- a/src/matrixrtc/MatrixRTCSession.ts +++ b/src/matrixrtc/MatrixRTCSession.ts @@ -21,6 +21,7 @@ import { Room } from "../models/room"; import { MatrixClient } from "../client"; import { EventType } from "../@types/event"; import { CallMembership, CallMembershipData } from "./CallMembership"; +import { RoomStateEvent } from "../models/room-state"; import { Focus } from "./focus"; import { MatrixError, MatrixEvent } from "../matrix"; import { randomString, secureRandomBase64Url } from "../randomstring"; @@ -152,9 +153,11 @@ export class MatrixRTCSession extends TypedEventEmitter