Skip to content

Commit 5156800

Browse files
committed
When state says you've left ongoing call, rejoin
When receiving a state change that says you are no longer a member of a RTC session that you are actually still participating in, send another state event to put yourself back in the session membership. This can happen when an administrator overwrites your call membership event (which is allowed even with MSC3757's restrictions on state), or if your delayed disconnection event (via MSC4140) timed out before your client could send a heartbeat to delay it further.
1 parent 66c8094 commit 5156800

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

src/matrixrtc/MatrixRTCSession.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,14 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
772772
if (changed) {
773773
logger.info(`Memberships for call in room ${this.room.roomId} have changed: emitting`);
774774
this.emit(MatrixRTCSessionEvent.MembershipsChanged, oldMemberships, this.memberships);
775+
776+
if (this.isJoined() && !this.memberships.some(this.isMyMembership)) {
777+
logger.warn("Missing own membership: force re-join");
778+
// TODO: Should this be awaited? And is there anything to tell the focus?
779+
this.triggerCallMembershipEventUpdate();
780+
// TODO: Is this needed?
781+
this.emit(MatrixRTCSessionEvent.JoinStateChanged, true);
782+
}
775783
}
776784

777785
if (this.manageMediaKeys && this.isJoined() && this.makeNewKeyTimeout === undefined) {
@@ -816,13 +824,18 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
816824
this.setExpiryTimer();
817825
};
818826

827+
<<<<<<< HEAD
819828
private storeLastMembershipFingerprints(): void {
820829
this.lastMembershipFingerprints = new Set(
821830
this.memberships
822831
.filter((m) => !this.isMyMembership(m))
823832
.map((m) => `${getParticipantIdFromMembership(m)}:${m.membershipID}:${m.createdTs()}`),
824833
);
825834
}
835+
=======
836+
private isMyMembership = (m: CallMembership): boolean =>
837+
m.sender === this.client.getUserId() && m.deviceId === this.client.getDeviceId();
838+
>>>>>>> cd25b8972 (When state says you've left ongoing call, rejoin)
826839

827840
/**
828841
* Constructs our own membership
@@ -942,6 +955,7 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
942955
}
943956

944957
private triggerCallMembershipEventUpdate = async (): Promise<void> => {
958+
// TODO: Should this await on a shared promise?
945959
if (this.updateCallMembershipRunning) {
946960
this.needCallMembershipUpdate = true;
947961
return;
@@ -1025,7 +1039,6 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
10251039
);
10261040
} else {
10271041
try {
1028-
// TODO: If delayed event times out, re-join!
10291042
const res = await this.client._unstable_sendDelayedStateEvent(
10301043
this.room.roomId,
10311044
{

0 commit comments

Comments
 (0)