Fix removing members in handleCallMemberEvent
This commit is contained in:
parent
e2621015e1
commit
21065791a8
1 changed files with 14 additions and 8 deletions
|
@ -40,11 +40,15 @@ export type Options = Omit<GroupCallOptions, "emitUpdate" | "createTimeout"> & {
|
||||||
clock: Clock
|
clock: Clock
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function getRoomMemberKey(roomId: string, userId: string) {
|
||||||
|
return JSON.stringify(roomId)+`,`+JSON.stringify(userId);
|
||||||
|
}
|
||||||
|
|
||||||
export class CallHandler {
|
export class CallHandler {
|
||||||
// group calls by call id
|
// group calls by call id
|
||||||
private readonly _calls: ObservableMap<string, GroupCall> = new ObservableMap<string, GroupCall>();
|
private readonly _calls: ObservableMap<string, GroupCall> = new ObservableMap<string, GroupCall>();
|
||||||
// map of userId to set of conf_id's they are in
|
// map of `"roomId","userId"` to set of conf_id's they are in
|
||||||
private memberToCallIds: Map<string, Set<string>> = new Map();
|
private roomMemberToCallIds: Map<string, Set<string>> = new Map();
|
||||||
private groupCallOptions: GroupCallOptions;
|
private groupCallOptions: GroupCallOptions;
|
||||||
private sessionId = makeId("s");
|
private sessionId = makeId("s");
|
||||||
|
|
||||||
|
@ -98,7 +102,7 @@ export class CallHandler {
|
||||||
// }
|
// }
|
||||||
const callsMemberEvents = await txn.roomState.getAllForType(roomId, EventType.GroupCallMember);
|
const callsMemberEvents = await txn.roomState.getAllForType(roomId, EventType.GroupCallMember);
|
||||||
for (const entry of callsMemberEvents) {
|
for (const entry of callsMemberEvents) {
|
||||||
this.handleCallMemberEvent(entry.event, log);
|
this.handleCallMemberEvent(entry.event, roomId, log);
|
||||||
}
|
}
|
||||||
// TODO: we should be loading the other members as well at some point
|
// TODO: we should be loading the other members as well at some point
|
||||||
}));
|
}));
|
||||||
|
@ -149,7 +153,7 @@ export class CallHandler {
|
||||||
// then update members
|
// then update members
|
||||||
for (const event of events) {
|
for (const event of events) {
|
||||||
if (event.type === EventType.GroupCallMember) {
|
if (event.type === EventType.GroupCallMember) {
|
||||||
this.handleCallMemberEvent(event, log);
|
this.handleCallMemberEvent(event, room.id, log);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -194,8 +198,9 @@ export class CallHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleCallMemberEvent(event: StateEvent, log: ILogItem) {
|
private handleCallMemberEvent(event: StateEvent, roomId: string, log: ILogItem) {
|
||||||
const userId = event.state_key;
|
const userId = event.state_key;
|
||||||
|
const roomMemberKey = getRoomMemberKey(roomId, userId)
|
||||||
const calls = event.content["m.calls"] ?? [];
|
const calls = event.content["m.calls"] ?? [];
|
||||||
for (const call of calls) {
|
for (const call of calls) {
|
||||||
const callId = call["m.call_id"];
|
const callId = call["m.call_id"];
|
||||||
|
@ -204,7 +209,8 @@ export class CallHandler {
|
||||||
groupCall?.updateMembership(userId, call, log);
|
groupCall?.updateMembership(userId, call, log);
|
||||||
};
|
};
|
||||||
const newCallIdsMemberOf = new Set<string>(calls.map(call => call["m.call_id"]));
|
const newCallIdsMemberOf = new Set<string>(calls.map(call => call["m.call_id"]));
|
||||||
let previousCallIdsMemberOf = this.memberToCallIds.get(userId);
|
let previousCallIdsMemberOf = this.roomMemberToCallIds.get(roomMemberKey);
|
||||||
|
|
||||||
// remove user as member of any calls not present anymore
|
// remove user as member of any calls not present anymore
|
||||||
if (previousCallIdsMemberOf) {
|
if (previousCallIdsMemberOf) {
|
||||||
for (const previousCallId of previousCallIdsMemberOf) {
|
for (const previousCallId of previousCallIdsMemberOf) {
|
||||||
|
@ -215,9 +221,9 @@ export class CallHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (newCallIdsMemberOf.size === 0) {
|
if (newCallIdsMemberOf.size === 0) {
|
||||||
this.memberToCallIds.delete(userId);
|
this.roomMemberToCallIds.delete(roomMemberKey);
|
||||||
} else {
|
} else {
|
||||||
this.memberToCallIds.set(userId, newCallIdsMemberOf);
|
this.roomMemberToCallIds.set(roomMemberKey, newCallIdsMemberOf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue