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