@@ -66,6 +66,8 @@ const state = {
66
66
} ,
67
67
inCall : {
68
68
} ,
69
+ joiningCall : {
70
+ } ,
69
71
connecting : {
70
72
} ,
71
73
connectionFailed : {
@@ -93,6 +95,10 @@ const getters = {
93
95
return ! ! ( state . inCall [ token ] && Object . keys ( state . inCall [ token ] ) . length > 0 )
94
96
} ,
95
97
98
+ isJoiningCall : ( state ) => ( token ) => {
99
+ return ! ! ( state . joiningCall [ token ] && Object . keys ( state . joiningCall [ token ] ) . length > 0 )
100
+ } ,
101
+
96
102
isConnecting : ( state ) => ( token ) => {
97
103
return ! ! ( state . connecting [ token ] && Object . keys ( state . connecting [ token ] ) . length > 0 )
98
104
} ,
@@ -354,6 +360,19 @@ const mutations = {
354
360
Vue . delete ( state . connectionFailed , token )
355
361
} ,
356
362
363
+ joiningCall ( state , { token, sessionId, flags } ) {
364
+ if ( ! state . joiningCall [ token ] ) {
365
+ Vue . set ( state . joiningCall , token , { } )
366
+ }
367
+ Vue . set ( state . joiningCall [ token ] , sessionId , flags )
368
+ } ,
369
+
370
+ finishedJoiningCall ( state , { token, sessionId } ) {
371
+ if ( state . joiningCall [ token ] && state . joiningCall [ token ] [ sessionId ] ) {
372
+ Vue . delete ( state . joiningCall [ token ] , sessionId )
373
+ }
374
+ } ,
375
+
357
376
connecting ( state , { token, sessionId, flags } ) {
358
377
if ( ! state . connecting [ token ] ) {
359
378
Vue . set ( state . connecting , token , { } )
@@ -811,10 +830,24 @@ const actions = {
811
830
return false
812
831
} ,
813
832
814
- async joinCall ( { commit, getters } , { token, participantIdentifier, flags, silent, recordingConsent } ) {
815
- commit ( 'connecting' , { token, sessionId : participantIdentifier . sessionId , flags } )
833
+ async joinCall ( { commit, getters, state } , { token, participantIdentifier, flags, silent, recordingConsent } ) {
834
+ // SUMMARY: join call process
835
+ // There are 2 main steps to join a call:
836
+ // 1. Join the call (signaling-join-call)
837
+ // 2A. Wait for the users list (signaling-users-in-room) INTERNAL server event
838
+ // 2B. Wait for the users list (signaling-users-changed) EXTERNAL server event
839
+ // In case of failure, we receive a signaling-join-call-failed event
816
840
817
- if ( ! participantIdentifier ?. sessionId ) {
841
+ // Exception 1: We may receive the users list before the signaling-join-call event
842
+ // In this case, we use the isParticipantsListReceived flag to handle this case
843
+
844
+ // Exception 2: We may receive the users list in a second event of signaling-users-changed or signaling-users-in-room
845
+ // In this case, we always check if the list is the updated one (it has the current participant in the call)
846
+
847
+ const { sessionId } = participantIdentifier
848
+ let isParticipantsListReceived = null
849
+
850
+ if ( ! sessionId ) {
818
851
console . error ( 'Trying to join call without sessionId' )
819
852
return
820
853
}
@@ -825,20 +858,62 @@ const actions = {
825
858
return
826
859
}
827
860
828
- // Preparing the event listener for the signaling-join-call event
829
- EventBus . once ( 'signaling-join-call' , ( ) => {
830
- commit ( 'setInCall' , {
831
- token,
832
- sessionId : participantIdentifier . sessionId ,
833
- flags,
834
- } )
835
- commit ( 'finishedConnecting' , { token, sessionId : participantIdentifier . sessionId } )
836
- } )
861
+ commit ( 'joiningCall' , { token, sessionId, flags } )
837
862
838
- // Preparing the event listener for the signaling-join-call-failed event
839
- EventBus . once ( 'signaling-join-call-failed' , ( ) => {
840
- commit ( 'finishedConnecting' , { token, sessionId : participantIdentifier . sessionId } )
841
- } )
863
+ const handleJoinCall = ( ) => {
864
+ commit ( 'setInCall' , { token, sessionId, flags } )
865
+ commit ( 'finishedJoiningCall' , { token, sessionId } )
866
+
867
+ if ( isParticipantsListReceived ) {
868
+ isParticipantsListReceived = null
869
+ commit ( 'finishedConnecting' , { token, sessionId } )
870
+ } else {
871
+ commit ( 'connecting' , { token, sessionId, flags } )
872
+ }
873
+ }
874
+
875
+ const handleJoinCallFailed = ( ) => {
876
+ commit ( 'finishedJoiningCall' , { token, sessionId } )
877
+ isParticipantsListReceived = null
878
+ }
879
+
880
+ const handleUsersInRoom = ( payload ) => {
881
+ const participant = payload [ 0 ] . find ( p => p . sessionId === sessionId )
882
+ if ( participant && participant . inCall !== PARTICIPANT . CALL_FLAG . DISCONNECTED ) {
883
+ if ( state . joiningCall [ token ] ?. [ sessionId ] ) {
884
+ isParticipantsListReceived = true
885
+ commit ( 'connecting' , { token, sessionId, flags } )
886
+ return
887
+ }
888
+ commit ( 'finishedConnecting' , { token, sessionId } )
889
+ EventBus . off ( 'signaling-users-in-room' , handleUsersInRoom )
890
+ }
891
+ }
892
+
893
+ const handleUsersChanged = ( payload ) => {
894
+ const participant = payload [ 0 ] . find ( p => p . nextcloudSessionId === sessionId )
895
+ if ( participant && participant . inCall !== PARTICIPANT . CALL_FLAG . DISCONNECTED ) {
896
+ if ( state . joiningCall [ token ] ?. [ sessionId ] ) {
897
+ isParticipantsListReceived = true
898
+ commit ( 'connecting' , { token, sessionId, flags } )
899
+ return
900
+ }
901
+ commit ( 'finishedConnecting' , { token, sessionId } )
902
+ EventBus . off ( 'signaling-users-changed' , handleUsersChanged )
903
+ }
904
+ }
905
+
906
+ // Fallback in case we never receive the users list after joining the call
907
+ setTimeout ( ( ) => {
908
+ // If, by accident, we never receive a users list, just switch to
909
+ // "Waiting for others to join the call …" after some seconds.
910
+ commit ( 'finishedConnecting' , { token, sessionId } )
911
+ } , 10000 )
912
+
913
+ EventBus . once ( 'signaling-join-call' , handleJoinCall )
914
+ EventBus . once ( 'signaling-join-call-failed' , handleJoinCallFailed )
915
+ EventBus . on ( 'signaling-users-in-room' , handleUsersInRoom )
916
+ EventBus . on ( 'signaling-users-changed' , handleUsersChanged )
842
917
843
918
try {
844
919
const actualFlags = await joinCall ( token , flags , silent , recordingConsent )
0 commit comments