From 6cb285751398b6f4ad2702a93cb212f3c383b187 Mon Sep 17 00:00:00 2001 From: Timo K Date: Tue, 31 Oct 2023 14:53:31 +0100 Subject: [PATCH 1/4] Age fallback using origin_server_ts instead of 0 Signed-off-by: Timo K --- src/matrixrtc/CallMembership.ts | 6 +++++- src/models/event.ts | 17 +++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/matrixrtc/CallMembership.ts b/src/matrixrtc/CallMembership.ts index d304c9df4d9..ebb8de63970 100644 --- a/src/matrixrtc/CallMembership.ts +++ b/src/matrixrtc/CallMembership.ts @@ -90,8 +90,12 @@ export class CallMembership { return this.getLocalExpiry() - Date.now(); } + public getAbsoluteMsUntilExpiry(): number { + return this.getAbsoluteExpiry() - Date.now(); + } + public isExpired(): boolean { - return this.getAbsoluteExpiry() < this.parentEvent.getTs() + this.parentEvent.getLocalAge(); + return this.getAbsoluteMsUntilExpiry() < 0; } public getActiveFoci(): Focus[] { diff --git a/src/models/event.ts b/src/models/event.ts index d2044eec970..3aa9c4b54fd 100644 --- a/src/models/event.ts +++ b/src/models/event.ts @@ -392,7 +392,7 @@ export class MatrixEvent extends TypedEventEmitter Date: Tue, 31 Oct 2023 14:57:06 +0100 Subject: [PATCH 2/4] use getMsUntilExpiry for isExpired Signed-off-by: Timo K --- src/matrixrtc/CallMembership.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/matrixrtc/CallMembership.ts b/src/matrixrtc/CallMembership.ts index ebb8de63970..1918df78d72 100644 --- a/src/matrixrtc/CallMembership.ts +++ b/src/matrixrtc/CallMembership.ts @@ -90,12 +90,8 @@ export class CallMembership { return this.getLocalExpiry() - Date.now(); } - public getAbsoluteMsUntilExpiry(): number { - return this.getAbsoluteExpiry() - Date.now(); - } - public isExpired(): boolean { - return this.getAbsoluteMsUntilExpiry() < 0; + return this.getMsUntilExpiry() < 0; } public getActiveFoci(): Focus[] { From dd0e67c2282f5df749bde4a96e98624dc2d2e68d Mon Sep 17 00:00:00 2001 From: Timo K Date: Tue, 31 Oct 2023 18:12:51 +0100 Subject: [PATCH 3/4] fix tests tests now also rely on localTimestamp. So this need to be mocked as well Signed-off-by: Timo K --- spec/unit/matrixrtc/MatrixRTCSession.spec.ts | 13 +++++++++++-- spec/unit/matrixrtc/mocks.ts | 15 +++++++++++---- src/matrixrtc/CallMembership.ts | 4 +++- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/spec/unit/matrixrtc/MatrixRTCSession.spec.ts b/spec/unit/matrixrtc/MatrixRTCSession.spec.ts index f8c229c9a7f..2e0a55a7e54 100644 --- a/spec/unit/matrixrtc/MatrixRTCSession.spec.ts +++ b/spec/unit/matrixrtc/MatrixRTCSession.spec.ts @@ -65,7 +65,11 @@ describe("MatrixRTCSession", () => { const expiredMembership = Object.assign({}, membershipTemplate); expiredMembership.expires = 1000; expiredMembership.device_id = "EXPIRED"; - const mockRoom = makeMockRoom([membershipTemplate, expiredMembership], () => 10000); + const mockRoom = makeMockRoom( + [membershipTemplate, expiredMembership], + () => 10000, + () => Date.now() - 10000, + ); sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom); expect(sess?.memberships.length).toEqual(1); @@ -307,7 +311,11 @@ describe("MatrixRTCSession", () => { let eventAge = 0; const membership = Object.assign({}, membershipTemplate); - const mockRoom = makeMockRoom([membership], () => eventAge); + const mockRoom = makeMockRoom( + [membership], + () => eventAge, + () => Date.now() - eventAge, + ); sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom); const membershipObject = sess.memberships[0]; @@ -338,6 +346,7 @@ describe("MatrixRTCSession", () => { }), ], () => eventAge, + () => Date.now() - eventAge, ); sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom); diff --git a/spec/unit/matrixrtc/mocks.ts b/spec/unit/matrixrtc/mocks.ts index fa7d948e620..aab57a89626 100644 --- a/spec/unit/matrixrtc/mocks.ts +++ b/spec/unit/matrixrtc/mocks.ts @@ -21,20 +21,26 @@ import { randomString } from "../../../src/randomstring"; export function makeMockRoom( memberships: CallMembershipData[], getLocalAge: (() => number) | undefined = undefined, + localTimestamp: (() => number) | undefined = undefined, ): Room { const roomId = randomString(8); return { roomId: roomId, getLiveTimeline: jest.fn().mockReturnValue({ - getState: jest.fn().mockReturnValue(makeMockRoomState(memberships, roomId, getLocalAge)), + getState: jest.fn().mockReturnValue(makeMockRoomState(memberships, roomId, getLocalAge, localTimestamp)), }), } as unknown as Room; } -function makeMockRoomState(memberships: CallMembershipData[], roomId: string, getLocalAge: (() => number) | undefined) { +function makeMockRoomState( + memberships: CallMembershipData[], + roomId: string, + getLocalAge: (() => number) | undefined, + localTimestamp: (() => number) |undefined = undefined, +) { return { getStateEvents: (_: string, stateKey: string) => { - const event = mockRTCEvent(memberships, roomId, getLocalAge); + const event = mockRTCEvent(memberships, roomId, getLocalAge, localTimestamp); if (stateKey !== undefined) return event; return [event]; @@ -46,6 +52,7 @@ export function mockRTCEvent( memberships: CallMembershipData[], roomId: string, getLocalAge: (() => number) | undefined, + localTimestamp: (() => number) | undefined = undefined, ): MatrixEvent { const getLocalAgeFn = getLocalAge ?? (() => 10); @@ -57,7 +64,7 @@ export function mockRTCEvent( getSender: jest.fn().mockReturnValue("@mock:user.example"), getTs: jest.fn().mockReturnValue(1000), getLocalAge: getLocalAgeFn, - localTimestamp: Date.now(), + localTimestamp: localTimestamp ? localTimestamp() : Date.now(), getRoomId: jest.fn().mockReturnValue(roomId), sender: { userId: "@mock:user.example", diff --git a/src/matrixrtc/CallMembership.ts b/src/matrixrtc/CallMembership.ts index 1918df78d72..cbb5f54a97c 100644 --- a/src/matrixrtc/CallMembership.ts +++ b/src/matrixrtc/CallMembership.ts @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import { logger } from "../logger"; import { MatrixEvent } from "../matrix"; import { deepCompare } from "../utils"; import { Focus } from "./focus"; @@ -91,7 +92,8 @@ export class CallMembership { } public isExpired(): boolean { - return this.getMsUntilExpiry() < 0; + logger.log("this.getMsUntilExpiry", this.getMsUntilExpiry()); + return this.getMsUntilExpiry() <= 0; } public getActiveFoci(): Focus[] { From 0df1c3dee2ff048258da37ca4cfe850f048d55ea Mon Sep 17 00:00:00 2001 From: Timo K Date: Fri, 3 Nov 2023 15:14:02 +0100 Subject: [PATCH 4/4] better fallback for unavailable unsigned Signed-off-by: Timo K --- spec/unit/matrixrtc/CallMembership.spec.ts | 4 +++- spec/unit/matrixrtc/MatrixRTCSession.spec.ts | 13 ++----------- spec/unit/matrixrtc/mocks.ts | 11 ++++------- src/matrixrtc/CallMembership.ts | 2 -- src/models/event.ts | 10 ++++++---- 5 files changed, 15 insertions(+), 25 deletions(-) diff --git a/spec/unit/matrixrtc/CallMembership.spec.ts b/spec/unit/matrixrtc/CallMembership.spec.ts index 4bc5492e06d..eb4b1232a18 100644 --- a/spec/unit/matrixrtc/CallMembership.spec.ts +++ b/spec/unit/matrixrtc/CallMembership.spec.ts @@ -85,7 +85,9 @@ describe("CallMembership", () => { it("considers memberships expired when local age large", () => { const fakeEvent = makeMockEvent(1000); - fakeEvent.getLocalAge = jest.fn().mockReturnValue(6000); + const evAge = 6000; + fakeEvent.getLocalAge = jest.fn().mockReturnValue(evAge); + fakeEvent.localTimestamp = Date.now() - evAge; const membership = new CallMembership(fakeEvent, membershipTemplate); expect(membership.isExpired()).toEqual(true); }); diff --git a/spec/unit/matrixrtc/MatrixRTCSession.spec.ts b/spec/unit/matrixrtc/MatrixRTCSession.spec.ts index af01c3afaad..046dea947a1 100644 --- a/spec/unit/matrixrtc/MatrixRTCSession.spec.ts +++ b/spec/unit/matrixrtc/MatrixRTCSession.spec.ts @@ -65,11 +65,7 @@ describe("MatrixRTCSession", () => { const expiredMembership = Object.assign({}, membershipTemplate); expiredMembership.expires = 1000; expiredMembership.device_id = "EXPIRED"; - const mockRoom = makeMockRoom( - [membershipTemplate, expiredMembership], - () => 10000, - () => Date.now() - 10000, - ); + const mockRoom = makeMockRoom([membershipTemplate, expiredMembership], () => 10000); sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom); expect(sess?.memberships.length).toEqual(1); @@ -495,11 +491,7 @@ describe("MatrixRTCSession", () => { let eventAge = 0; const membership = Object.assign({}, membershipTemplate); - const mockRoom = makeMockRoom( - [membership], - () => eventAge, - () => Date.now() - eventAge, - ); + const mockRoom = makeMockRoom([membership], () => eventAge); sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom); const membershipObject = sess.memberships[0]; @@ -530,7 +522,6 @@ describe("MatrixRTCSession", () => { }), ], () => eventAge, - () => Date.now() - eventAge, ); sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom); diff --git a/spec/unit/matrixrtc/mocks.ts b/spec/unit/matrixrtc/mocks.ts index aab57a89626..c373cdf9dc4 100644 --- a/spec/unit/matrixrtc/mocks.ts +++ b/spec/unit/matrixrtc/mocks.ts @@ -21,26 +21,24 @@ import { randomString } from "../../../src/randomstring"; export function makeMockRoom( memberships: CallMembershipData[], getLocalAge: (() => number) | undefined = undefined, - localTimestamp: (() => number) | undefined = undefined, ): Room { const roomId = randomString(8); return { roomId: roomId, getLiveTimeline: jest.fn().mockReturnValue({ - getState: jest.fn().mockReturnValue(makeMockRoomState(memberships, roomId, getLocalAge, localTimestamp)), + getState: jest.fn().mockReturnValue(makeMockRoomState(memberships, roomId, getLocalAge)), }), } as unknown as Room; } -function makeMockRoomState( +export function makeMockRoomState( memberships: CallMembershipData[], roomId: string, getLocalAge: (() => number) | undefined, - localTimestamp: (() => number) |undefined = undefined, ) { return { getStateEvents: (_: string, stateKey: string) => { - const event = mockRTCEvent(memberships, roomId, getLocalAge, localTimestamp); + const event = mockRTCEvent(memberships, roomId, getLocalAge); if (stateKey !== undefined) return event; return [event]; @@ -52,7 +50,6 @@ export function mockRTCEvent( memberships: CallMembershipData[], roomId: string, getLocalAge: (() => number) | undefined, - localTimestamp: (() => number) | undefined = undefined, ): MatrixEvent { const getLocalAgeFn = getLocalAge ?? (() => 10); @@ -64,7 +61,7 @@ export function mockRTCEvent( getSender: jest.fn().mockReturnValue("@mock:user.example"), getTs: jest.fn().mockReturnValue(1000), getLocalAge: getLocalAgeFn, - localTimestamp: localTimestamp ? localTimestamp() : Date.now(), + localTimestamp: Date.now() - getLocalAgeFn(), getRoomId: jest.fn().mockReturnValue(roomId), sender: { userId: "@mock:user.example", diff --git a/src/matrixrtc/CallMembership.ts b/src/matrixrtc/CallMembership.ts index cbb5f54a97c..d24b32adda8 100644 --- a/src/matrixrtc/CallMembership.ts +++ b/src/matrixrtc/CallMembership.ts @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { logger } from "../logger"; import { MatrixEvent } from "../matrix"; import { deepCompare } from "../utils"; import { Focus } from "./focus"; @@ -92,7 +91,6 @@ export class CallMembership { } public isExpired(): boolean { - logger.log("this.getMsUntilExpiry", this.getMsUntilExpiry()); return this.getMsUntilExpiry() <= 0; } diff --git a/src/models/event.ts b/src/models/event.ts index 3aa9c4b54fd..8768c0cd906 100644 --- a/src/models/event.ts +++ b/src/models/event.ts @@ -664,14 +664,16 @@ export class MatrixEvent extends TypedEventEmitter