3
3
// SPDX-License-Identifier: Apache-2.0
4
4
5
5
// Prepare for web server
6
- var fs = require ( "fs" ) ;
7
- var path = require ( " path" ) ;
6
+ var fs = require ( 'fs' ) ;
7
+ var path = require ( ' path' ) ;
8
8
var url = require ( 'url' ) ;
9
9
var config = require ( './config' ) ;
10
10
var account = require ( './vendormodule' ) ;
@@ -17,19 +17,80 @@ var httpsOptions = {
17
17
18
18
var app = require ( 'express' ) ( ) ;
19
19
var 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 ) ;
21
21
var io = require ( 'socket.io' ) . listen ( server ) ;
22
22
var ios = require ( 'socket.io' ) . listen ( servers ) ;
23
23
24
24
var 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
+ }
25
86
26
87
// Check user's token from partner
27
88
function validateUser ( token , successCallback , failureCallback ) {
28
89
// TODO: Should check token first, replace this block when engagement with different partners.
29
90
if ( token ) {
30
- account . authentication ( token , function ( uid ) {
91
+ account . authentication ( token , function ( uid ) {
31
92
successCallback ( uid ) ;
32
- } , function ( ) {
93
+ } , function ( ) {
33
94
console . log ( 'Account system return false.' ) ;
34
95
failureCallback ( 0 ) ;
35
96
} ) ;
@@ -39,11 +100,11 @@ function validateUser(token, successCallback, failureCallback){
39
100
}
40
101
41
102
function disconnectClient ( uid ) {
42
- if ( sessionMap [ uid ] !== undefined ) {
43
- var session = sessionMap [ uid ] ;
103
+ if ( sessionMap [ uid ] !== undefined ) {
104
+ var session = sessionMap [ uid ] ;
44
105
session . emit ( 'server-disconnect' ) ;
45
106
session . disconnect ( ) ;
46
- console . log ( 'Force disconnected ' + uid ) ;
107
+ console . log ( 'Force disconnected ' + uid ) ;
47
108
}
48
109
}
49
110
@@ -56,7 +117,7 @@ function createUuid(){
56
117
57
118
function emitChatEvent ( targetUid , eventName , message , successCallback , failureCallback ) {
58
119
if ( sessionMap [ targetUid ] ) {
59
- sessionMap [ targetUid ] . emit ( eventName , message ) ;
120
+ sessionMap [ targetUid ] . emit ( eventName , message ) ;
60
121
if ( successCallback )
61
122
successCallback ( ) ;
62
123
}
@@ -66,66 +127,113 @@ function emitChatEvent(targetUid, eventName, message, successCallback, failureCa
66
127
}
67
128
68
129
function 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
+ }
73
139
switch ( clientVersion ) {
74
140
case '4.2' :
75
141
case '4.2.1' :
76
142
case '4.3' :
77
143
// socket.user stores session related information.
78
144
if ( token ) {
79
145
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.
84
155
console . log ( 'Authentication failed.' ) ;
85
156
next ( ) ;
86
157
} ) ;
87
158
} 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 ) ;
91
162
}
92
163
next ( ) ;
93
164
break ;
94
165
default :
95
166
next ( new Error ( '2103' ) ) ;
96
- console . log ( 'Unsupported client. Client version: ' + query . clientVersion ) ;
167
+ console . log ( 'Unsupported client. Client version: ' + query . clientVersion ) ;
97
168
break ;
98
169
}
99
170
}
100
171
101
172
function onConnection ( socket ) {
102
173
// 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 ;
104
176
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
+ }
108
186
109
- socket . on ( 'disconnect' , function ( ) {
187
+ socket . on ( 'disconnect' , function ( ) {
110
188
if ( socket . user ) {
111
- var uid = socket . user . id ;
189
+ var uid = socket . user . id ;
190
+ var isClient = socket . user . isClient ;
112
191
// Delete session
113
- if ( socket === sessionMap [ socket . user . id ] ) {
192
+ if ( socket === sessionMap [ socket . user . id ] ) {
114
193
delete sessionMap [ socket . user . id ] ;
115
194
}
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.' ) ;
117
220
}
118
221
} ) ;
119
222
120
223
// 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 ) {
124
227
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
+ }
127
235
delete data . to ;
128
- emitChatEvent ( to , forwardEvents [ i ] , data , function ( ) {
236
+ emitChatEvent ( to , forwardEvents [ i ] , data , function ( ) {
129
237
if ( ackCallback )
130
238
ackCallback ( ) ;
131
239
} , function ( errorCode ) {
@@ -139,7 +247,7 @@ function onConnection(socket){
139
247
140
248
function listen ( io ) {
141
249
io . use ( authorization ) ;
142
- io . on ( 'connection' , onConnection ) ;
250
+ io . on ( 'connection' , onConnection ) ;
143
251
}
144
252
145
253
listen ( io ) ;
0 commit comments