Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit 0bb77f6

Browse files
committed
Maintain an available instance list.
1 parent a243922 commit 0bb77f6

File tree

1 file changed

+144
-36
lines changed

1 file changed

+144
-36
lines changed

peerserver.js

Lines changed: 144 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
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');
88
var url = require('url');
99
var config = require('./config');
1010
var account = require('./vendormodule');
@@ -17,19 +17,80 @@ var httpsOptions = {
1717

1818
var app = require('express')();
1919
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);
2121
var io = require('socket.io').listen(server);
2222
var ios = require('socket.io').listen(servers);
2323

2424
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+
}
2586

2687
// Check user's token from partner
2788
function 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

41102
function 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

57118
function 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

68129
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+
}
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

101172
function 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

140248
function listen(io) {
141249
io.use(authorization);
142-
io.on('connection',onConnection);
250+
io.on('connection', onConnection);
143251
}
144252

145253
listen(io);

0 commit comments

Comments
 (0)