33// SPDX-License-Identifier: Apache-2.0 
44
55// Prepare for web server 
6- var  fs  =  require ( "fs" ) ; 
7- var  path  =  require ( " path" ) ; 
6+ var  fs  =  require ( 'fs' ) ; 
7+ var  path  =  require ( ' path' ) ; 
88var  url  =  require ( 'url' ) ; 
99var  config  =  require ( './config' ) ; 
1010var  account  =  require ( './vendormodule' ) ; 
@@ -17,19 +17,80 @@ var httpsOptions = {
1717
1818var  app  =  require ( 'express' ) ( ) ; 
1919var  server  =  app . listen ( config . port . plain ) ; 
20- var  servers  =  require ( " https" ) . createServer ( httpsOptions ,  app ) . listen ( config . port . secured ) ; 
20+ var  servers  =  require ( ' https' ) . createServer ( httpsOptions ,  app ) . listen ( config . port . secured ) ; 
2121var  io  =  require ( 'socket.io' ) . listen ( server ) ; 
2222var  ios  =  require ( 'socket.io' ) . listen ( servers ) ; 
2323
2424var  sessionMap  =  { } ;   // Key is uid, and value is session object. 
25+ var  instanceList  =  new  Array ( ) ; 
26+ var  clientId  =  1000 ; 
27+ 
28+ function  addInstance ( uid ) { 
29+   var  i  =  0 ; 
30+   while ( i  <  instanceList . length  &&  instanceList [ i ]  !=  uid ) { 
31+     ++ i ; 
32+   } 
33+   if ( i  ==  instanceList . length ) { 
34+     instanceList . push ( { uid :uid ,  available :1 } ) ; 
35+   } 
36+ } 
37+ 
38+ function  deleteInstance ( uid ) { 
39+   for ( var  i  =  0 ;  i  <  instanceList . length ;  ++ i ) { 
40+     if ( instanceList  &&  instanceList [ i ] . uid  ==  uid ) { 
41+       instanceList . splice ( i ,  1 ) ; 
42+       return ; 
43+     } 
44+   } 
45+ } 
46+ 
47+ function  changeToIdle ( uid ) { 
48+   for ( var  i  =  0 ;  i  <  instanceList . length ;  ++ i ) { 
49+     if ( instanceList  &&  instanceList [ i ] . uid  ==  uid ) { 
50+       instanceList [ i ] . available  =  1 ; 
51+       return ; 
52+     } 
53+   } 
54+ } 
55+ 
56+ function  changeToOccupy ( uid ,  state ) { 
57+   for ( var  i  =  0 ;  i  <  instanceList . length ;  ++ i ) { 
58+     if ( instanceList  &&  instanceList [ i ] . uid  ==  uid ) { 
59+       instanceList [ i ] . available  =  0 ; 
60+       return ; 
61+     } 
62+   } 
63+ } 
64+ 
65+ function  isExist ( uid ) { 
66+   if ( ! instanceList ) { 
67+     return  - 1 ; 
68+   } 
69+   for ( var  i  =  0 ;  i  <  instanceList . length ;  ++ i ) { 
70+     if ( instanceList [ i ] . uid  ==  uid ) { 
71+       if ( instanceList [ i ] . available  ==  1 ) { 
72+         return  1 ; 
73+       } else { 
74+         return  2 ; 
75+       } 
76+     } 
77+   } 
78+   return  0 ; 
79+ } 
80+ 
81+ function  logNumber ( ) { 
82+   var  sessionMapkeys  =  Object . keys ( sessionMap ) ; 
83+   var  clientNum  =  sessionMapkeys . length  -  instanceList . length ; 
84+   console . log ( 'Client number: '  +  clientNum  +  ' ; Instance number: '  +  instanceList . length ) ; 
85+ } 
2586
2687// Check user's token from partner 
2788function  validateUser ( token ,  successCallback ,  failureCallback ) { 
2889  // TODO: Should check token first, replace this block when engagement with different partners. 
2990  if ( token ) { 
30-     account . authentication ( token , function ( uid ) { 
91+     account . authentication ( token ,   function ( uid ) { 
3192      successCallback ( uid ) ; 
32-     } , function ( ) { 
93+     } ,   function ( ) { 
3394      console . log ( 'Account system return false.' ) ; 
3495      failureCallback ( 0 ) ; 
3596    } ) ; 
@@ -39,11 +100,11 @@ function validateUser(token, successCallback, failureCallback){
39100} 
40101
41102function  disconnectClient ( uid ) { 
42-   if ( sessionMap [ uid ] !== undefined ) { 
43-     var  session = sessionMap [ uid ] ; 
103+   if ( sessionMap [ uid ]   !==   undefined ) { 
104+     var  session   =   sessionMap [ uid ] ; 
44105    session . emit ( 'server-disconnect' ) ; 
45106    session . disconnect ( ) ; 
46-     console . log ( 'Force disconnected ' + uid ) ; 
107+     console . log ( 'Force disconnected '   +   uid ) ; 
47108  } 
48109} 
49110
@@ -56,7 +117,7 @@ function createUuid(){
56117
57118function  emitChatEvent ( targetUid ,  eventName ,  message ,  successCallback ,  failureCallback ) { 
58119  if ( sessionMap [ targetUid ] ) { 
59-     sessionMap [ targetUid ] . emit ( eventName , message ) ; 
120+     sessionMap [ targetUid ] . emit ( eventName ,   message ) ; 
60121    if ( successCallback ) 
61122      successCallback ( ) ; 
62123  } 
@@ -66,66 +127,113 @@ function emitChatEvent(targetUid, eventName, message, successCallback, failureCa
66127} 
67128
68129function  authorization ( socket ,  next ) { 
69-   var  query = url . parse ( socket . request . url , true ) . query ; 
70-   var  token = query . token ; 
71-   var  clientVersion = query . clientVersion ; 
72-   var  clientType = query . clientType ; 
130+   var  query  =  url . parse ( socket . request . url ,  true ) . query ; 
131+   var  clientVersion  =  query . clientVersion ; 
132+   var  clientType  =  query . clientType ; 
133+   var  isClient  =  query . isClient ; 
134+   if ( isClient ) { 
135+     token  =  ( clientId ++ )  +  '' ; 
136+   } else { 
137+     token  =  query . token ; 
138+   } 
73139  switch ( clientVersion ) { 
74140    case  '4.2' :
75141    case  '4.2.1' :
76142    case  '4.3' :
77143      // socket.user stores session related information. 
78144      if ( token ) { 
79145        validateUser ( token ,  function ( uid ) {   // Validate user's token successfully. 
80-           socket . user = { id :uid } ; 
81-           console . log ( uid + ' authentication passed.' ) ; 
82-         } , function ( error ) { 
83-             // Invalid login. 
146+           socket . user  =  { id :uid ,  isClient :isClient ,  instanceId :null } ; 
147+           if ( ! isClient ) { 
148+             console . log ( 'Instance '  +  uid  +  ' authentication passed.' ) ; 
149+             addInstance ( uid ) ; 
150+           } else { 
151+             console . log ( 'Client '  +  uid  +  ' authentication passed.' ) ; 
152+           } 
153+         } ,  function ( error ) { 
154+           // Invalid login. 
84155            console . log ( 'Authentication failed.' ) ; 
85156            next ( ) ; 
86157        } ) ; 
87158      } else { 
88-         socket . user = new  Object ( ) ; 
89-         socket . user . id = createUuid ( ) + '@anonymous' ; 
90-         console . log ( 'Anonymous user: ' + socket . user . id ) ; 
159+         socket . user   =   new  Object ( ) ; 
160+         socket . user . id   =   createUuid ( )   +   '@anonymous' ; 
161+         console . log ( 'Anonymous user: '   +   socket . user . id ) ; 
91162      } 
92163      next ( ) ; 
93164      break ; 
94165    default :
95166      next ( new  Error ( '2103' ) ) ; 
96-       console . log ( 'Unsupported client. Client version: ' + query . clientVersion ) ; 
167+       console . log ( 'Unsupported client. Client version: '   +   query . clientVersion ) ; 
97168      break ; 
98169  } 
99170} 
100171
101172function  onConnection ( socket ) { 
102173  // Disconnect previous session if this user already signed in. 
103-   var  uid = socket . user . id ; 
174+   var  uid  =  socket . user . id ; 
175+   var  isClient  =  socket . user . isClient ; 
104176  disconnectClient ( uid ) ; 
105-   sessionMap [ uid ] = socket ; 
106-   socket . emit ( 'server-authenticated' , { uid :uid } ) ;   // Send current user's id to client. 
107-   console . log ( 'A new client has connected. Online user number: ' + Object . keys ( sessionMap ) . length ) ; 
177+   sessionMap [ uid ]  =  socket ; 
178+   socket . emit ( 'server-authenticated' ,  { uid :uid } ) ;   // Send current user's id to client. 
179+   logNumber ( ) ; 
180+   if ( isClient ) { 
181+     socket . on ( 'disconnect-instance' ,  function  ( data )  { 
182+       console . log ( 'Client '  +  uid  +  ' disconnect with instance '  +  data . to ) ; 
183+       changeToIdle ( data . to ) ; 
184+     } ) ; 
185+   } 
108186
109-   socket . on ( 'disconnect' , function ( ) { 
187+   socket . on ( 'disconnect' ,   function ( ) { 
110188    if ( socket . user ) { 
111-       var  uid = socket . user . id ; 
189+       var  uid  =  socket . user . id ; 
190+       var  isClient  =  socket . user . isClient ; 
112191      // Delete session 
113-       if ( socket === sessionMap [ socket . user . id ] ) { 
192+       if ( socket   ===   sessionMap [ socket . user . id ] ) { 
114193        delete  sessionMap [ socket . user . id ] ; 
115194      } 
116-       console . log ( uid + ' has disconnected. Online user number: ' + Object . keys ( sessionMap ) . length ) ; 
195+       if ( isClient ) { 
196+         console . log ( 'Client '  +  uid  +  ' disconnect with server.' ) ; 
197+         if ( socket . user . instanceId  !=  null ) { 
198+           changeToIdle ( socket . user . instanceId ) ; 
199+         } 
200+       } else { 
201+         console . log ( 'Instance '  +  uid  +  ' disconnect with server.' ) ; 
202+         deleteInstance ( uid ) ; 
203+       } 
204+       logNumber ( ) ; 
205+     } 
206+   } ) ; 
207+ 
208+   socket . on ( 'build-p2p-connect' ,  function ( data ,  callback ) { 
209+     var  m  =  isExist ( data . to ) ; 
210+     callback ( false ,  m ) ; 
211+     if ( m  ==  - 1 ) { 
212+       console . log ( 'Error: instanceList does not exist.' ) ; 
213+     } else  if ( m  ==  0 ) { 
214+       console . log ( 'Instance '  +  data . to  +  ' does not exist.' ) ; 
215+     } else  if ( m  ==  1 ) { 
216+       console . log ( 'Instance '  +  data . to  +  ' is available.' ) ; 
217+       changeToOccupy ( data . to ) ; 
218+     } else  if ( m  ==  2 ) { 
219+       console . log ( 'Instance '  +  data . to  +  ' is occupied.' ) ; 
117220    } 
118221  } ) ; 
119222
120223  // Forward events 
121-   var  forwardEvents = [ 'owt-message' ] ; 
122-   for   ( var  i = 0 ; i < forwardEvents . length ; i ++ ) { 
123-     socket . on ( forwardEvents [ i ] , ( function ( i ) { 
224+   var  forwardEvents   =   [ 'owt-message' ] ; 
225+   for ( var  i   =   0 ;   i   <   forwardEvents . length ;   i ++ ) { 
226+     socket . on ( forwardEvents [ i ] ,   ( function ( i ) { 
124227      return  function ( data ,  ackCallback ) { 
125-         data . from = socket . user . id ; 
126-         var  to = data . to ; 
228+         console . log ( 'Received '  +  forwardEvents [ i ]  +  ' : '  +  JSON . stringify ( data ) ) ; 
229+         data . from  =  socket . user . id ; 
230+         var  to  =  data . to ; 
231+         var  judge  =  data . data ; 
232+         if ( socket . user . isClient  &&  judge . indexOf ( 'chat-started' )  !=  - 1 ) { 
233+           socket . user . instanceId  =  to ; 
234+         } 
127235        delete  data . to ; 
128-         emitChatEvent ( to , forwardEvents [ i ] , data , function ( ) { 
236+         emitChatEvent ( to ,   forwardEvents [ i ] ,   data ,   function ( ) { 
129237          if ( ackCallback ) 
130238            ackCallback ( ) ; 
131239        } , function ( errorCode ) { 
@@ -139,7 +247,7 @@ function onConnection(socket){
139247
140248function  listen ( io )  { 
141249  io . use ( authorization ) ; 
142-   io . on ( 'connection' , onConnection ) ; 
250+   io . on ( 'connection' ,   onConnection ) ; 
143251} 
144252
145253listen ( io ) ; 
0 commit comments