@@ -16,7 +16,7 @@ limitations under the License.
16
16
17
17
import { encodeBase64 , EventType , MatrixClient , MatrixError , MatrixEvent , Room } from "../../../src" ;
18
18
import { KnownMembership } from "../../../src/@types/membership" ;
19
- import { SessionMembershipData } from "../../../src/matrixrtc/CallMembership" ;
19
+ import { SessionMembershipData , DEFAULT_EXPIRE_DURATION } from "../../../src/matrixrtc/CallMembership" ;
20
20
import { MatrixRTCSession , MatrixRTCSessionEvent } from "../../../src/matrixrtc/MatrixRTCSession" ;
21
21
import { EncryptionKeysEventContent } from "../../../src/matrixrtc/types" ;
22
22
import { randomString } from "../../../src/randomstring" ;
@@ -57,21 +57,19 @@ describe("MatrixRTCSession", () => {
57
57
expect ( sess ?. callId ) . toEqual ( "" ) ;
58
58
} ) ;
59
59
60
- // TODO: re-enable this test when expiry is implemented
61
- // eslint-disable-next-line jest/no-commented-out-tests
62
- // it("ignores expired memberships events", () => {
63
- // jest.useFakeTimers();
64
- // const expiredMembership = Object.assign({}, membershipTemplate);
65
- // expiredMembership.expires = 1000;
66
- // expiredMembership.device_id = "EXPIRED";
67
- // const mockRoom = makeMockRoom([membershipTemplate, expiredMembership]);
68
-
69
- // jest.advanceTimersByTime(2000);
70
- // sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
71
- // expect(sess?.memberships.length).toEqual(1);
72
- // expect(sess?.memberships[0].deviceId).toEqual("AAAAAAA");
73
- // jest.useRealTimers();
74
- // });
60
+ it ( "ignores expired memberships events" , ( ) => {
61
+ jest . useFakeTimers ( ) ;
62
+ const expiredMembership = Object . assign ( { } , membershipTemplate ) ;
63
+ expiredMembership . expires = 1000 ;
64
+ expiredMembership . device_id = "EXPIRED" ;
65
+ const mockRoom = makeMockRoom ( [ membershipTemplate , expiredMembership ] ) ;
66
+
67
+ jest . advanceTimersByTime ( 2000 ) ;
68
+ sess = MatrixRTCSession . roomSessionForRoom ( client , mockRoom ) ;
69
+ expect ( sess ?. memberships . length ) . toEqual ( 1 ) ;
70
+ expect ( sess ?. memberships [ 0 ] . deviceId ) . toEqual ( "AAAAAAA" ) ;
71
+ jest . useRealTimers ( ) ;
72
+ } ) ;
75
73
76
74
it ( "ignores memberships events of members not in the room" , ( ) => {
77
75
const mockRoom = makeMockRoom ( membershipTemplate ) ;
@@ -80,19 +78,17 @@ describe("MatrixRTCSession", () => {
80
78
expect ( sess ?. memberships . length ) . toEqual ( 0 ) ;
81
79
} ) ;
82
80
83
- // TODO: re-enable this test when expiry is implemented
84
- // eslint-disable-next-line jest/no-commented-out-tests
85
- // it("honours created_ts", () => {
86
- // jest.useFakeTimers();
87
- // jest.setSystemTime(500);
88
- // const expiredMembership = Object.assign({}, membershipTemplate);
89
- // expiredMembership.created_ts = 500;
90
- // expiredMembership.expires = 1000;
91
- // const mockRoom = makeMockRoom([expiredMembership]);
92
- // sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
93
- // expect(sess?.memberships[0].getAbsoluteExpiry()).toEqual(1500);
94
- // jest.useRealTimers();
95
- // });
81
+ it ( "honours created_ts" , ( ) => {
82
+ jest . useFakeTimers ( ) ;
83
+ jest . setSystemTime ( 500 ) ;
84
+ const expiredMembership = Object . assign ( { } , membershipTemplate ) ;
85
+ expiredMembership . created_ts = 500 ;
86
+ expiredMembership . expires = 1000 ;
87
+ const mockRoom = makeMockRoom ( [ expiredMembership ] ) ;
88
+ sess = MatrixRTCSession . roomSessionForRoom ( client , mockRoom ) ;
89
+ expect ( sess ?. memberships [ 0 ] . getAbsoluteExpiry ( ) ) . toEqual ( 1500 ) ;
90
+ jest . useRealTimers ( ) ;
91
+ } ) ;
96
92
97
93
it ( "returns empty session if no membership events are present" , ( ) => {
98
94
const mockRoom = makeMockRoom ( [ ] ) ;
@@ -273,6 +269,55 @@ describe("MatrixRTCSession", () => {
273
269
} ) ;
274
270
} ) ;
275
271
272
+ describe ( "getsActiveFocus" , ( ) => {
273
+ const firstPreferredFocus = {
274
+ type : "livekit" ,
275
+ livekit_service_url : "https://active.url" ,
276
+ livekit_alias : "!active:active.url" ,
277
+ } ;
278
+ it ( "gets the correct active focus with oldest_membership" , ( ) => {
279
+ jest . useFakeTimers ( ) ;
280
+ jest . setSystemTime ( 3000 ) ;
281
+ const mockRoom = makeMockRoom ( [
282
+ Object . assign ( { } , membershipTemplate , {
283
+ device_id : "foo" ,
284
+ created_ts : 500 ,
285
+ foci_preferred : [ firstPreferredFocus ] ,
286
+ } ) ,
287
+ Object . assign ( { } , membershipTemplate , { device_id : "old" , created_ts : 1000 } ) ,
288
+ Object . assign ( { } , membershipTemplate , { device_id : "bar" , created_ts : 2000 } ) ,
289
+ ] ) ;
290
+
291
+ sess = MatrixRTCSession . roomSessionForRoom ( client , mockRoom ) ;
292
+
293
+ sess . joinRoomSession ( [ { type : "livekit" , livekit_service_url : "htts://test.org" } ] , {
294
+ type : "livekit" ,
295
+ focus_selection : "oldest_membership" ,
296
+ } ) ;
297
+ expect ( sess . getActiveFocus ( ) ) . toBe ( firstPreferredFocus ) ;
298
+ jest . useRealTimers ( ) ;
299
+ } ) ;
300
+ it ( "does not provide focus if the selection method is unknown" , ( ) => {
301
+ const mockRoom = makeMockRoom ( [
302
+ Object . assign ( { } , membershipTemplate , {
303
+ device_id : "foo" ,
304
+ created_ts : 500 ,
305
+ foci_preferred : [ firstPreferredFocus ] ,
306
+ } ) ,
307
+ Object . assign ( { } , membershipTemplate , { device_id : "old" , created_ts : 1000 } ) ,
308
+ Object . assign ( { } , membershipTemplate , { device_id : "bar" , created_ts : 2000 } ) ,
309
+ ] ) ;
310
+
311
+ sess = MatrixRTCSession . roomSessionForRoom ( client , mockRoom ) ;
312
+
313
+ sess . joinRoomSession ( [ { type : "livekit" , livekit_service_url : "htts://test.org" } ] , {
314
+ type : "livekit" ,
315
+ focus_selection : "unknown" ,
316
+ } ) ;
317
+ expect ( sess . getActiveFocus ( ) ) . toBe ( undefined ) ;
318
+ } ) ;
319
+ } ) ;
320
+
276
321
describe ( "joining" , ( ) => {
277
322
let mockRoom : Room ;
278
323
let sendStateEventMock : jest . Mock ;
@@ -323,6 +368,68 @@ describe("MatrixRTCSession", () => {
323
368
expect ( sess ! . isJoined ( ) ) . toEqual ( true ) ;
324
369
} ) ;
325
370
371
+ it ( "sends a membership event when joining a call" , async ( ) => {
372
+ const realSetTimeout = setTimeout ;
373
+ jest . useFakeTimers ( ) ;
374
+ sess ! . joinRoomSession ( [ mockFocus ] , mockFocus ) ;
375
+ await Promise . race ( [ sentStateEvent , new Promise ( ( resolve ) => realSetTimeout ( resolve , 500 ) ) ] ) ;
376
+ expect ( client . sendStateEvent ) . toHaveBeenCalledWith (
377
+ mockRoom ! . roomId ,
378
+ EventType . GroupCallMemberPrefix ,
379
+ {
380
+ application : "m.call" ,
381
+ scope : "m.room" ,
382
+ call_id : "" ,
383
+ device_id : "AAAAAAA" ,
384
+ expires : DEFAULT_EXPIRE_DURATION ,
385
+ foci_preferred : [ mockFocus ] ,
386
+ focus_active : {
387
+ focus_selection : "oldest_membership" ,
388
+ type : "livekit" ,
389
+ } ,
390
+ } ,
391
+ "_@alice:example.org_AAAAAAA" ,
392
+ ) ;
393
+ await Promise . race ( [ sentDelayedState , new Promise ( ( resolve ) => realSetTimeout ( resolve , 500 ) ) ] ) ;
394
+ // Because we actually want to send the state
395
+ expect ( client . sendStateEvent ) . toHaveBeenCalledTimes ( 1 ) ;
396
+ // For checking if the delayed event is still there or got removed while sending the state.
397
+ expect ( client . _unstable_updateDelayedEvent ) . toHaveBeenCalledTimes ( 1 ) ;
398
+ // For scheduling the delayed event
399
+ expect ( client . _unstable_sendDelayedStateEvent ) . toHaveBeenCalledTimes ( 1 ) ;
400
+ // This returns no error so we do not check if we reschedule the event again. this is done in another test.
401
+
402
+ jest . useRealTimers ( ) ;
403
+ } ) ;
404
+
405
+ it ( "uses membershipExpiryTimeout from join config" , async ( ) => {
406
+ const realSetTimeout = setTimeout ;
407
+ jest . useFakeTimers ( ) ;
408
+ sess ! . joinRoomSession ( [ mockFocus ] , mockFocus , { membershipExpiryTimeout : 60000 } ) ;
409
+ await Promise . race ( [ sentStateEvent , new Promise ( ( resolve ) => realSetTimeout ( resolve , 500 ) ) ] ) ;
410
+ expect ( client . sendStateEvent ) . toHaveBeenCalledWith (
411
+ mockRoom ! . roomId ,
412
+ EventType . GroupCallMemberPrefix ,
413
+ {
414
+ application : "m.call" ,
415
+ scope : "m.room" ,
416
+ call_id : "" ,
417
+ device_id : "AAAAAAA" ,
418
+ expires : 60000 ,
419
+ foci_preferred : [ mockFocus ] ,
420
+ focus_active : {
421
+ focus_selection : "oldest_membership" ,
422
+ type : "livekit" ,
423
+ } ,
424
+ } ,
425
+
426
+ "_@alice:example.org_AAAAAAA" ,
427
+ ) ;
428
+ await Promise . race ( [ sentDelayedState , new Promise ( ( resolve ) => realSetTimeout ( resolve , 500 ) ) ] ) ;
429
+ expect ( client . _unstable_sendDelayedStateEvent ) . toHaveBeenCalledTimes ( 1 ) ;
430
+ jest . useRealTimers ( ) ;
431
+ } ) ;
432
+
326
433
describe ( "calls" , ( ) => {
327
434
const activeFocusConfig = { type : "livekit" , livekit_service_url : "https://active.url" } ;
328
435
const activeFocus = { type : "livekit" , focus_selection : "oldest_membership" } ;
0 commit comments