/
server.js
117 lines (105 loc) · 3.98 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
var WebSocketServer = require('websocket').server;
var http = require('http');
var connections = [];
var server = http.createServer(function(request, response) {
//process HTTP request. Since we're writing just WebSockets server
// we don't have to implement anything.
});
server.listen(1337,function(){});
wsServer = new WebSocketServer({
httpServer: server
});
wsServer.on('request', function(request) {
var connection = request.accept(null, request.origin);
connections.push({id: '', pseu: '', socket: connection});
console.log("Server: New peer is connected!");
//we'll handle all messages from users here
connection.on('message', function(message) {
if (message.type === 'utf8') {
var msg = JSON.parse(message.utf8Data);
var caller = msg.caller;
var callee = msg.callee;
var callerpseu = msg.callerpseu;
if(msg.data.type === 'join') {
for(var i=0; i<connections.length; i++) {
// Associate Socket <-> ID
if(connections[i].socket === connection) {
connections[i].id = caller;
connections[i].pseu = callerpseu;
console.log("Server: <"+ caller +"> has been associated to a socket");
}
// Send information about other peer connected
else {
console.log("Server: Inform <" + connections[i].id + "> about new peer <" + caller + ">");
connections[i].socket.send(message.utf8Data);
console.log("Server: Inform <" + caller + "> about connected <" + connections[i].id + ">");
//Send to this peer all others connections
var msg = {
data: {
type: 'already_joined'
},
callee: caller,
caller: connections[i].id,
callerpseu: connections[i].pseu
};
connection.send(JSON.stringify(msg));
}
}
}
else {
//Send a message to a specific user
if(callee !== 'all') {
for (var i = 0; i < connections.length; i++) {
if(connections[i].id === callee) {
console.log("Server: Send message <"+ msg.data.type +"> to <" + connections[i].id + ">");
connections[i].socket.send(message.utf8Data);
break;
}
}
}
else {
//send message to all others users except the issuer
console.log("Server: Dispatch message for all connections: " + connections.length);
for (var i = 0;i < connections.length; i++) {
if(connections[i].socket !== connection) {
console.log("Server: Send message <" + msg.data.type + "> to <" + connections[i].id + ">");
connections[i].socket.send(message.utf8Data);
}
}
console.log("Server: Dispatch end");
}
}
}
else {
console.log("RECEIVED OTHER:" + evt.binaryData);
}
});
connection.on('close', function(evt) {
console.log("Server: One peer lost...");
var index = -1;
for (var i = 0;i < connections.length; i++) {
if(connections[i].socket === connection) {
index = i;
}
}
if(index > -1) {
var old = connections.splice(index, 1);
console.log("Server: remove item " + old[0].id);
console.log("Server: " + connections.length + " connections still remains");
//Inform others peer about the disconnection
for (var i = 0;i < connections.length; i++) {
if(connections[i].socket !== connection) {
var toSend = {
data: {
type:'release'
},
callee: 'all',
caller:old[0].id
};
connections[i].socket.send(JSON.stringify(toSend));
}
}
old = null;
}
});
});