@@ -244,35 +244,64 @@ describe("MatrixRTCSession", () => {
244244 foci_preferred : [ mockFocus ] ,
245245 } ;
246246
247- function testSession (
247+ let sendStateEventMock : jest . Mock ;
248+ let sendStateFutureMock : jest . Mock ;
249+
250+ let sentStateEvent : Promise < void > ;
251+ let sentStateFuture : Promise < void > ;
252+
253+ beforeEach ( ( ) => {
254+ sentStateEvent = new Promise ( ( resolve ) => {
255+ sendStateEventMock = jest . fn ( resolve ) ;
256+ } ) ;
257+ sentStateFuture = new Promise ( ( resolve ) => {
258+ sendStateFutureMock = jest . fn ( ( ) => {
259+ resolve ( ) ;
260+ return {
261+ future_group_id : "g" ,
262+ send_token : "s" ,
263+ cancel_token : "c" ,
264+ refresh_token : "r" ,
265+ } ;
266+ } ) ;
267+ } ) ;
268+ client . sendStateEvent = sendStateEventMock ;
269+ client . _unstable_sendStateFuture = sendStateFutureMock ;
270+ } ) ;
271+
272+ async function testSession (
248273 membershipData : CallMembershipData [ ] | SessionMembershipData ,
249274 shouldUseLegacy : boolean ,
250- ) : void {
275+ ) : Promise < void > {
251276 sess = MatrixRTCSession . roomSessionForRoom ( client , makeMockRoom ( membershipData ) ) ;
252277
253278 const makeNewLegacyMembershipsMock = jest . spyOn ( sess as any , "makeNewLegacyMemberships" ) ;
254279 const makeNewMembershipMock = jest . spyOn ( sess as any , "makeNewMembership" ) ;
255280
256281 sess . joinRoomSession ( [ mockFocus ] , mockFocus , joinSessionConfig ) ;
282+ await Promise . race ( [ sentStateEvent , new Promise ( ( resolve ) => setTimeout ( resolve , 500 ) ) ] ) ;
257283
258284 expect ( makeNewLegacyMembershipsMock ) . toHaveBeenCalledTimes ( shouldUseLegacy ? 1 : 0 ) ;
259285 expect ( makeNewMembershipMock ) . toHaveBeenCalledTimes ( shouldUseLegacy ? 0 : 1 ) ;
286+
287+ await Promise . race ( [ sentStateFuture , new Promise ( ( resolve ) => setTimeout ( resolve , 500 ) ) ] ) ;
288+ expect ( client . _unstable_sendStateFuture ) . toHaveBeenCalledTimes ( shouldUseLegacy ? 0 : 1 ) ;
260289 }
261290
262- it ( "uses legacy events if there are any active legacy calls" , ( ) => {
263- testSession ( [ expiredLegacyMembershipData , legacyMembershipData , sessionMembershipData ] , true ) ;
291+ it ( "uses legacy events if there are any active legacy calls" , async ( ) => {
292+ await testSession ( [ expiredLegacyMembershipData , legacyMembershipData , sessionMembershipData ] , true ) ;
264293 } ) ;
265294
266- it ( 'uses legacy events if a non-legacy call is in a "memberships" array' , ( ) => {
267- testSession ( [ sessionMembershipData ] , true ) ;
295+ it ( 'uses legacy events if a non-legacy call is in a "memberships" array' , async ( ) => {
296+ await testSession ( [ sessionMembershipData ] , true ) ;
268297 } ) ;
269298
270- it ( "uses non-legacy events if all legacy calls are expired" , ( ) => {
271- testSession ( [ expiredLegacyMembershipData ] , false ) ;
299+ it ( "uses non-legacy events if all legacy calls are expired" , async ( ) => {
300+ await testSession ( [ expiredLegacyMembershipData ] , false ) ;
272301 } ) ;
273302
274- it ( "uses non-legacy events if there are only non-legacy calls" , ( ) => {
275- testSession ( sessionMembershipData , false ) ;
303+ it ( "uses non-legacy events if there are only non-legacy calls" , async ( ) => {
304+ await testSession ( sessionMembershipData , false ) ;
276305 } ) ;
277306 } ) ;
278307
@@ -350,12 +379,30 @@ describe("MatrixRTCSession", () => {
350379 describe ( "joining" , ( ) => {
351380 let mockRoom : Room ;
352381 let sendStateEventMock : jest . Mock ;
382+ let sendStateFutureMock : jest . Mock ;
353383 let sendEventMock : jest . Mock ;
354384
385+ let sentStateEvent : Promise < void > ;
386+ let sentStateFuture : Promise < void > ;
387+
355388 beforeEach ( ( ) => {
356- sendStateEventMock = jest . fn ( ) ;
389+ sentStateEvent = new Promise ( ( resolve ) => {
390+ sendStateEventMock = jest . fn ( resolve ) ;
391+ } ) ;
392+ sentStateFuture = new Promise ( ( resolve ) => {
393+ sendStateFutureMock = jest . fn ( ( ) => {
394+ resolve ( ) ;
395+ return {
396+ future_group_id : "g" ,
397+ send_token : "s" ,
398+ cancel_token : "c" ,
399+ refresh_token : "r" ,
400+ } ;
401+ } ) ;
402+ } ) ;
357403 sendEventMock = jest . fn ( ) ;
358404 client . sendStateEvent = sendStateEventMock ;
405+ client . _unstable_sendStateFuture = sendStateFutureMock ;
359406 client . sendEvent = sendEventMock ;
360407
361408 mockRoom = makeMockRoom ( [ ] ) ;
@@ -376,9 +423,11 @@ describe("MatrixRTCSession", () => {
376423 expect ( sess ! . isJoined ( ) ) . toEqual ( true ) ;
377424 } ) ;
378425
379- it ( "sends a membership event when joining a call" , ( ) => {
426+ it ( "sends a membership event when joining a call" , async ( ) => {
427+ const realSetTimeout = setTimeout ;
380428 jest . useFakeTimers ( ) ;
381429 sess ! . joinRoomSession ( [ mockFocus ] , mockFocus ) ;
430+ await Promise . race ( [ sentStateEvent , new Promise ( ( resolve ) => realSetTimeout ( resolve , 500 ) ) ] ) ;
382431 expect ( client . sendStateEvent ) . toHaveBeenCalledWith (
383432 mockRoom ! . roomId ,
384433 EventType . GroupCallMemberPrefix ,
@@ -399,20 +448,24 @@ describe("MatrixRTCSession", () => {
399448 } ,
400449 "@alice:example.org" ,
401450 ) ;
451+ await Promise . race ( [ sentStateFuture , new Promise ( ( resolve ) => realSetTimeout ( resolve , 500 ) ) ] ) ;
452+ expect ( client . _unstable_sendStateFuture ) . toHaveBeenCalledTimes ( 0 ) ;
402453 jest . useRealTimers ( ) ;
403454 } ) ;
404455
405456 describe ( "non-legacy calls" , ( ) => {
406457 const activeFocusConfig = { type : "livekit" , livekit_service_url : "https://active.url" } ;
407458 const activeFocus = { type : "livekit" , focus_selection : "oldest_membership" } ;
408459
409- function testJoin ( useOwnedStateEvents : boolean ) : void {
460+ async function testJoin ( useOwnedStateEvents : boolean ) : Promise < void > {
461+ const realSetTimeout = setTimeout ;
410462 if ( useOwnedStateEvents ) {
411463 mockRoom . getVersion = jest . fn ( ) . mockReturnValue ( "org.matrix.msc3779.default" ) ;
412464 }
413465
414466 jest . useFakeTimers ( ) ;
415467 sess ! . joinRoomSession ( [ activeFocusConfig ] , activeFocus , { useLegacyMemberEvents : false } ) ;
468+ await Promise . race ( [ sentStateEvent , new Promise ( ( resolve ) => realSetTimeout ( resolve , 500 ) ) ] ) ;
416469 expect ( client . sendStateEvent ) . toHaveBeenCalledWith (
417470 mockRoom ! . roomId ,
418471 EventType . GroupCallMemberPrefix ,
@@ -426,15 +479,17 @@ describe("MatrixRTCSession", () => {
426479 } satisfies SessionMembershipData ,
427480 `${ ! useOwnedStateEvents ? "_" : "" } @alice:example.org_AAAAAAA` ,
428481 ) ;
482+ await Promise . race ( [ sentStateFuture , new Promise ( ( resolve ) => realSetTimeout ( resolve , 500 ) ) ] ) ;
483+ expect ( client . _unstable_sendStateFuture ) . toHaveBeenCalledTimes ( 1 ) ;
429484 jest . useRealTimers ( ) ;
430485 }
431486
432- it ( "sends a membership event with session payload when joining a non-legacy call" , ( ) => {
433- testJoin ( false ) ;
487+ it ( "sends a membership event with session payload when joining a non-legacy call" , async ( ) => {
488+ await testJoin ( false ) ;
434489 } ) ;
435490
436- it ( "does not prefix the state key with _ for rooms that support user-owned state events" , ( ) => {
437- testJoin ( true ) ;
491+ it ( "does not prefix the state key with _ for rooms that support user-owned state events" , async ( ) => {
492+ await testJoin ( true ) ;
438493 } ) ;
439494 } ) ;
440495
0 commit comments