@@ -34,19 +34,28 @@ export enum GroupCallEventHandlerEvent {
3434 Incoming = "GroupCall.incoming" ,
3535 Ended = "GroupCall.ended" ,
3636 Participants = "GroupCall.participants" ,
37- Room = "GroupCall.Room" ,
3837}
3938
4039export type GroupCallEventHandlerEventHandlerMap = {
4140 [ GroupCallEventHandlerEvent . Incoming ] : ( call : GroupCall ) => void ;
4241 [ GroupCallEventHandlerEvent . Ended ] : ( call : GroupCall ) => void ;
4342 [ GroupCallEventHandlerEvent . Participants ] : ( participants : RoomMember [ ] , call : GroupCall ) => void ;
44- [ GroupCallEventHandlerEvent . Room ] : ( room : Room ) => void ;
4543} ;
4644
45+ interface RoomDeferred {
46+ prom : Promise < void > ;
47+ resolve ?: ( ) => void ;
48+ }
49+
4750export class GroupCallEventHandler {
4851 public groupCalls = new Map < string , GroupCall > ( ) ; // roomId -> GroupCall
4952
53+ // All rooms we know about and whether we've seen a 'Room' event
54+ // for them. The promise will be fulfilled once we've processed that
55+ // event which means we're "up to date" on what calls are in a room
56+ // and get
57+ private roomDeferreds = new Map < string , RoomDeferred > ( ) ;
58+
5059 constructor ( private client : MatrixClient ) { }
5160
5261 public async start ( ) : Promise < void > {
@@ -82,6 +91,26 @@ export class GroupCallEventHandler {
8291 this . client . removeListener ( RoomStateEvent . Events , this . onRoomStateChanged ) ;
8392 }
8493
94+ private getRoomDeferred ( roomId : string ) : RoomDeferred {
95+ let deferred : RoomDeferred = this . roomDeferreds . get ( roomId ) ;
96+ if ( deferred === undefined ) {
97+ let resolveFunc : ( ) => void ;
98+ deferred = {
99+ prom : new Promise < void > ( resolve => {
100+ resolveFunc = resolve ;
101+ } ) ,
102+ } ;
103+ deferred . resolve = resolveFunc ;
104+ this . roomDeferreds . set ( roomId , deferred ) ;
105+ }
106+
107+ return deferred ;
108+ }
109+
110+ public waitUntilRoomReadyForGroupCalls ( roomId : string ) : Promise < void > {
111+ return this . getRoomDeferred ( roomId ) . prom ;
112+ }
113+
85114 public getGroupCallById ( groupCallId : string ) : GroupCall {
86115 return [ ...this . groupCalls . values ( ) ] . find ( ( groupCall ) => groupCall . groupCallId === groupCallId ) ;
87116 }
@@ -98,9 +127,11 @@ export class GroupCallEventHandler {
98127 }
99128
100129 this . createGroupCallFromRoomStateEvent ( callEvent ) ;
101- this . client . emit ( GroupCallEventHandlerEvent . Room , room ) ;
102130 break ;
103131 }
132+
133+ logger . info ( "Group call event handler processed room" , room ) ;
134+ this . getRoomDeferred ( room . roomId ) . resolve ( ) ;
104135 }
105136
106137 private createGroupCallFromRoomStateEvent ( event : MatrixEvent ) : GroupCall | undefined {
0 commit comments