Skip to content

Commit b4abbfc

Browse files
committed
introduce updateTs and connectedTs to fix expiration logic (+ fix tests)
Signed-off-by: Timo K <[email protected]>
1 parent fb23833 commit b4abbfc

File tree

2 files changed

+39
-6
lines changed

2 files changed

+39
-6
lines changed

spec/unit/matrixrtc/CallMembership.spec.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,12 +337,18 @@ describe("CallMembership", () => {
337337
const now = Date.now();
338338
const startEv = makeMockEvent(now - DEFAULT_EXPIRE_DURATION - 100, membershipTemplate);
339339
const membershipWithRel = new CallMembership(
340-
//update 1100 ms later (so the update is still after expiry)
341-
makeMockEvent(now - DEFAULT_EXPIRE_DURATION + 1000, membershipTemplate),
340+
//update 50 ms later (so the update is still expired)
341+
makeMockEvent(now - DEFAULT_EXPIRE_DURATION - 50, membershipTemplate),
342+
startEv,
343+
);
344+
const membershipWithRelUnexpired = new CallMembership(
345+
//update 200 ms later (due to the update the member is NOT expired)
346+
makeMockEvent(now - DEFAULT_EXPIRE_DURATION + 100, membershipTemplate),
342347
startEv,
343348
);
344349
const membershipWithoutRel = new CallMembership(startEv);
345350
expect(membershipWithRel.isExpired()).toEqual(true);
351+
expect(membershipWithRelUnexpired.isExpired()).toEqual(false);
346352
expect(membershipWithoutRel.isExpired()).toEqual(true);
347353
expect(membershipWithoutRel.createdTs()).toEqual(membershipWithRel.createdTs());
348354
});

src/matrixrtc/CallMembership.ts

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,19 @@ export class CallMembership {
394394
}
395395
}
396396

397-
public createdTs(): number {
397+
/**
398+
* The last update to this membership.
399+
* @returns The timestamp when this membership was last updated.
400+
*/
401+
public updatedTs(): number {
402+
return this.matrixEvent.getTs();
403+
}
404+
405+
/**
406+
* The ts of the initial connection of this membership.
407+
* @returns The timestamp when this membership was initially connected.
408+
*/
409+
public connectedTs(): number {
398410
const { kind, data } = this.membershipData;
399411
switch (kind) {
400412
case "rtc":
@@ -405,19 +417,34 @@ export class CallMembership {
405417
}
406418
}
407419

420+
/** @deprecated use connectedTs instead */
421+
public createdTs(): number {
422+
return this.connectedTs();
423+
}
424+
408425
/**
409426
* Gets the absolute expiry timestamp of the membership.
427+
*
428+
* The absolute expiry based on DEFAULT_EXPIRE_DURATION and `sessionData.expires`.
429+
*
430+
* ### Note:
431+
* This concept is not required for m.rtc.member sticky events anymore. the sticky timeout serves takes care of
432+
* this logic automatically (removing member events that have were missed to get removed manually or via delayed events)
433+
* So this is mostly relevant for legacy m.call.member events.
434+
* It is planned to remove manual expiration logic entirely once m.rtc.member is widely adopted.
435+
*
410436
* @returns The absolute expiry time of the membership as a unix timestamp in milliseconds or undefined if not applicable
411437
*/
412438
public getAbsoluteExpiry(): number | undefined {
413439
const { kind, data } = this.membershipData;
414440
switch (kind) {
415441
case "rtc":
416-
return this.createdTs() + DEFAULT_EXPIRE_DURATION;
442+
// Rtc events do not have an data.expires field that gets updated
443+
// Instead the sticky event is resent.
444+
return this.updatedTs() + DEFAULT_EXPIRE_DURATION;
417445
case "session":
418446
default:
419-
// TODO: calculate this from the MatrixRTCSession join configuration directly
420-
return this.createdTs() + (data.expires ?? DEFAULT_EXPIRE_DURATION);
447+
return this.connectedTs() + (data.expires ?? DEFAULT_EXPIRE_DURATION);
421448
}
422449
}
423450

0 commit comments

Comments
 (0)