Skip to content

Commit 6e34ca6

Browse files
authored
[MatrixRTC] Fix delayId not resetting on leave (#5156)
* reset delay id to undefined after sucessfully sending it. * add tests * setAndEmitDelayId signature dont allow implicit undefined
1 parent 4a7a699 commit 6e34ca6

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

spec/unit/matrixrtc/MembershipManager.spec.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,8 +416,9 @@ describe("MembershipManager", () => {
416416
await manager.leave();
417417
expect(client._unstable_sendScheduledDelayedEvent).toHaveBeenLastCalledWith("id");
418418
expect(client.sendStateEvent).toHaveBeenCalled();
419+
expect(manager.delayId).toBe(undefined);
419420
});
420-
it("send leave event when leave is called and resolving delayed leave fails", async () => {
421+
it("send leave event when leave is called and resolving delayed leave fails unknown error", async () => {
421422
const manager = new MembershipManager({}, room, client, callSession);
422423
manager.join([focus]);
423424
await vi.advanceTimersByTimeAsync(1);
@@ -431,6 +432,27 @@ describe("MembershipManager", () => {
431432
{},
432433
"_@alice:example.org_AAAAAAA_m.call",
433434
);
435+
// If there is a unknown error, we do not reset the delayId
436+
// The delayed event might still be around and we track it.
437+
expect(manager.delayId).not.toBe(undefined);
438+
});
439+
it("send leave event when leave is called and resolving delayed leave fails not found error", async () => {
440+
const manager = new MembershipManager({}, room, client, callSession);
441+
manager.join([focus]);
442+
await vi.advanceTimersByTimeAsync(1);
443+
(client._unstable_sendScheduledDelayedEvent as Mock<any>).mockRejectedValue(
444+
new MatrixError({ errcode: "M_NOT_FOUND" }, 404),
445+
);
446+
await manager.leave();
447+
448+
// We send a normal leave event since we failed using sendScheduledDelayedEvent.
449+
expect(client.sendStateEvent).toHaveBeenLastCalledWith(
450+
room.roomId,
451+
"org.matrix.msc3401.call.member",
452+
{},
453+
"_@alice:example.org_AAAAAAA_m.call",
454+
);
455+
expect(manager.delayId).toBe(undefined);
434456
});
435457
it("does nothing if not joined", async () => {
436458
const manager = new MembershipManager({}, room, client, callSession);

src/matrixrtc/MembershipManager.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ export class MembershipManager
584584
this.emit(MembershipManagerEvent.ProbablyLeft, this.state.probablyLeft);
585585
}
586586

587-
private setAndEmitDelayId(delayId?: string): void {
587+
private setAndEmitDelayId(delayId: string | undefined): void {
588588
if (this.state.delayId === delayId) return;
589589

590590
this.state.delayId = delayId;
@@ -654,6 +654,7 @@ export class MembershipManager
654654
._unstable_sendScheduledDelayedEvent(delayId)
655655
.then(() => {
656656
this.state.hasMemberStateEvent = false;
657+
this.setAndEmitDelayId(undefined);
657658
this.resetRateLimitCounter(MembershipActionType.SendScheduledDelayedLeaveEvent);
658659

659660
return { replace: [] };

0 commit comments

Comments
 (0)