@@ -20,18 +20,16 @@ import { EventTimeline } from "../models/event-timeline.ts";
2020import { Room } from "../models/room.ts" ;
2121import { MatrixClient } from "../client.ts" ;
2222import { EventType } from "../@types/event.ts" ;
23- import { UpdateDelayedEventAction } from "../@types/requests.ts" ;
24- import { CallMembership , DEFAULT_EXPIRE_DURATION , SessionMembershipData } from "./CallMembership.ts" ;
23+ import { CallMembership } from "./CallMembership.ts" ;
2524import { RoomStateEvent } from "../models/room-state.ts" ;
2625import { Focus } from "./focus.ts" ;
2726import { secureRandomBase64Url } from "../randomstring.ts" ;
2827import { EncryptionKeysEventContent } from "./types.ts" ;
2928import { decodeBase64 , encodeUnpaddedBase64 } from "../base64.ts" ;
3029import { KnownMembership } from "../@types/membership.ts" ;
31- import { HTTPError , MatrixError , safeGetRetryAfterMs } from "../http-api/errors.ts" ;
30+ import { MatrixError , safeGetRetryAfterMs } from "../http-api/errors.ts" ;
3231import { MatrixEvent } from "../models/event.ts" ;
33- import { isLivekitFocusActive } from "./LivekitFocus.ts" ;
34- import { sleep } from "../utils.ts" ;
32+ import { MyMembershipManager } from "./MatrixRTCMyMembershipManager.ts" ;
3533
3634const logger = rootLogger . getChild ( "MatrixRTCSession" ) ;
3735
@@ -294,22 +292,19 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
294292 * This is determined by checking if the relativeExpiry has been set.
295293 */
296294 public isJoined ( ) : boolean {
297- return this . relativeExpiry !== undefined ;
295+ return this . myMembershipManager ?. isJoined ( ) ?? false ;
298296 }
299297
300298 /**
301299 * Performs cleanup & removes timers for client shutdown
302300 */
303301 public async stop ( ) : Promise < void > {
304- await this . leaveRoomSession ( 1000 ) ;
302+ await this . myMembershipManager ?. leaveRoomSession ( 1000 ) ;
305303 if ( this . expiryTimeout ) {
306304 clearTimeout ( this . expiryTimeout ) ;
307305 this . expiryTimeout = undefined ;
308306 }
309- if ( this . memberEventTimeout ) {
310- clearTimeout ( this . memberEventTimeout ) ;
311- this . memberEventTimeout = undefined ;
312- }
307+ this . myMembershipManager ?. stop ( ) ;
313308 const roomState = this . room . getLiveTimeline ( ) . getState ( EventTimeline . FORWARDS ) ;
314309 roomState ?. off ( RoomStateEvent . Members , this . onMembershipUpdate ) ;
315310 }
@@ -332,22 +327,19 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
332327 if ( this . isJoined ( ) ) {
333328 logger . info ( `Already joined to session in room ${ this . room . roomId } : ignoring join call` ) ;
334329 return ;
330+ } else {
331+ this . myMembershipManager = new MyMembershipManager ( joinConfig , this . room , this . client , ( ) =>
332+ this . getOldestMembership ( ) ,
333+ ) ;
335334 }
336-
337- this . ownFocusActive = fociActive ;
338- this . ownFociPreferred = fociPreferred ;
339335 this . joinConfig = joinConfig ;
340- this . relativeExpiry = this . membershipExpiryTimeout ;
341336 this . manageMediaKeys = joinConfig ?. manageMediaKeys ?? this . manageMediaKeys ;
342-
343- logger . info ( `Joining call session in room ${ this . room . roomId } with manageMediaKeys=${ this . manageMediaKeys } ` ) ;
337+ this . myMembershipManager . setJoined ( fociPreferred , fociActive ) ;
344338 if ( joinConfig ?. manageMediaKeys ) {
345339 this . makeNewSenderKey ( ) ;
346340 this . requestSendCurrentKey ( ) ;
347341 }
348- // We don't wait for this, mostly because it may fail and schedule a retry, so this
349- // function returning doesn't really mean anything at all.
350- this . triggerCallMembershipEventUpdate ( ) ;
342+ this . myMembershipManager . joinRoomSession ( ) ;
351343 this . emit ( MatrixRTCSessionEvent . JoinStateChanged , true ) ;
352344 }
353345
@@ -389,35 +381,14 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
389381
390382 logger . info ( `Leaving call session in room ${ this . room . roomId } ` ) ;
391383 this . joinConfig = undefined ;
392- this . relativeExpiry = undefined ;
393- this . ownFocusActive = undefined ;
384+ this . myMembershipManager ! . setLeft ( ) ;
394385 this . manageMediaKeys = false ;
395386 this . emit ( MatrixRTCSessionEvent . JoinStateChanged , false ) ;
396-
397- if ( timeout ) {
398- // The sleep promise returns the string 'timeout' and the membership update void
399- // A success implies that the membership update was quicker then the timeout.
400- const raceResult = await Promise . race ( [ this . triggerCallMembershipEventUpdate ( ) , sleep ( timeout , "timeout" ) ] ) ;
401- return raceResult !== "timeout" ;
402- } else {
403- await this . triggerCallMembershipEventUpdate ( ) ;
404- return true ;
405- }
387+ return await this . myMembershipManager ! . leaveRoomSession ( timeout ) ;
406388 }
407389
408390 public getActiveFocus ( ) : Focus | undefined {
409- if ( this . ownFocusActive && isLivekitFocusActive ( this . ownFocusActive ) ) {
410- // A livekit active focus
411- if ( this . ownFocusActive . focus_selection === "oldest_membership" ) {
412- const oldestMembership = this . getOldestMembership ( ) ;
413- return oldestMembership ?. getPreferredFoci ( ) [ 0 ] ;
414- }
415- } else {
416- // We do not understand the membership format (could be legacy). We default to oldestMembership
417- // Once there are other methods this is a hard error!
418- const oldestMembership = this . getOldestMembership ( ) ;
419- return oldestMembership ?. getPreferredFoci ( ) [ 0 ] ;
420- }
391+ return this . myMembershipManager ?. getActiveFocus ( ) ;
421392 }
422393
423394 /**
@@ -794,7 +765,7 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
794765 if ( this . isJoined ( ) && ! this . memberships . some ( this . isMyMembership ) ) {
795766 logger . warn ( "Missing own membership: force re-join" ) ;
796767 // TODO: Should this be awaited? And is there anything to tell the focus?
797- this . triggerCallMembershipEventUpdate ( ) ;
768+ this . myMembershipManager ?. triggerCallMembershipEventUpdate ( ) ;
798769 }
799770 }
800771
0 commit comments