2019-01-19 09:53:09 +00:00
|
|
|
/**
|
|
|
|
* Connections sockets management
|
|
|
|
*
|
|
|
|
* @author Pierre HUBERT
|
|
|
|
*/
|
|
|
|
|
|
|
|
let SocketsList = [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Send a message to the socket
|
|
|
|
*
|
|
|
|
* @param socket The target socket
|
|
|
|
* @param {Object} message The message to send to the socket
|
|
|
|
*/
|
|
|
|
function SendMessageToSocket(socket, message){
|
|
|
|
socket.send(JSON.stringify(message));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add a socket to the list
|
|
|
|
*
|
|
|
|
* @param {String} id The ID of the socket
|
|
|
|
* @param socket The socket to add
|
|
|
|
*/
|
|
|
|
function AddSocketToList(id, socket){
|
|
|
|
|
|
|
|
SocketsList.push({
|
|
|
|
id: id,
|
|
|
|
socket: socket
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove the socket from the list
|
|
|
|
*
|
|
|
|
* @param socket Socket to remove
|
|
|
|
*/
|
|
|
|
function RemoveSocketFromList(socket){
|
|
|
|
|
|
|
|
for(let i = 0; i < SocketsList.length; i++){
|
|
|
|
|
|
|
|
if(SocketsList[i].socket == socket){
|
|
|
|
SocketsList.splice(i, 1);
|
|
|
|
i--;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2019-01-19 12:10:28 +00:00
|
|
|
/**
|
2019-01-25 09:47:42 +00:00
|
|
|
* Send message to a target to inform that source is ready to establish
|
|
|
|
* a connection
|
|
|
|
*
|
|
|
|
* @param {String} source_id The ID of the source of the message
|
|
|
|
* @param {String} target_id The ID of the target of the message
|
|
|
|
*/
|
|
|
|
function SendReadyMessageToClient(source_id, target_id){
|
|
|
|
|
|
|
|
let count = 0;
|
|
|
|
|
|
|
|
SocketsList.forEach(info => {
|
|
|
|
|
|
|
|
if(info.id == target_id){
|
|
|
|
SendMessageToSocket(info.socket, {
|
|
|
|
ready_msg: true,
|
|
|
|
source_id: source_id
|
|
|
|
});
|
|
|
|
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Send a signal to several clients
|
|
|
|
*
|
2019-01-19 12:10:28 +00:00
|
|
|
* @param {String} content The content of the signal
|
|
|
|
* @param {String} source_id The ID of the source of the message
|
|
|
|
* @param {String} target_id The ID of the target client
|
|
|
|
* @return {Number} The number of sockets to which the message was sent
|
|
|
|
*/
|
|
|
|
function SendSignalToClient(content, source_id, target_id){
|
|
|
|
|
|
|
|
let count = 0;
|
|
|
|
|
|
|
|
SocketsList.forEach(info => {
|
|
|
|
|
|
|
|
if(info.id == target_id){
|
|
|
|
SendMessageToSocket(info.socket, {
|
|
|
|
signal: content,
|
|
|
|
source_id: source_id
|
|
|
|
});
|
|
|
|
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
return count;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2019-01-19 09:53:09 +00:00
|
|
|
/**
|
|
|
|
* Add a socket to the list of active sockets
|
|
|
|
*
|
|
|
|
* This method is called when the server handles a new connection
|
|
|
|
*
|
|
|
|
* @param socket
|
|
|
|
*/
|
|
|
|
exports.addSocket = function(socket){
|
|
|
|
|
|
|
|
console.log("New socket connection detected!");
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This variable will contains the ID of the client
|
|
|
|
* as soon as the client will send it
|
|
|
|
*/
|
|
|
|
let client_id = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* We listen to socket messages
|
|
|
|
*/
|
|
|
|
socket.on("message", message => {
|
|
|
|
|
2019-01-19 12:10:28 +00:00
|
|
|
//Make sure the message is not too heavy
|
|
|
|
if(message.length > 10000){
|
|
|
|
SendMessageToSocket(socket, {
|
|
|
|
error: "Your request is too heavy for this server!"
|
|
|
|
})
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-01-19 09:53:09 +00:00
|
|
|
//Decode message
|
|
|
|
let data;
|
|
|
|
try {
|
|
|
|
data = JSON.parse(message);
|
|
|
|
}
|
|
|
|
catch (err) {
|
|
|
|
console.error("Invalid message received from socket!");
|
|
|
|
SendMessageToSocket(socket, {
|
|
|
|
error: "Message could not be parsed!"
|
|
|
|
})
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
|
|
|
if(!client_id){
|
|
|
|
|
|
|
|
//Check if the client ID was specified or not in the request
|
|
|
|
if(!data.client_id){
|
|
|
|
SendMessageToSocket(socket, {
|
|
|
|
error: "Please specify your client ID!"
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(typeof data.client_id != "string"){
|
|
|
|
SendMessageToSocket(socket, {
|
|
|
|
error: "Invalid client ID specified!"
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Save client ID
|
|
|
|
client_id = data.client_id;
|
|
|
|
AddSocketToList(client_id, socket);
|
|
|
|
console.log("New connection from client ID " + client_id);
|
|
|
|
SendMessageToSocket(socket, {
|
|
|
|
success: "Client ID successfully set."
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-01-25 09:47:42 +00:00
|
|
|
//Check if the client wants to send a ready signal to another client
|
|
|
|
else if(data.ready_msg, data.target_id){
|
|
|
|
|
|
|
|
if(typeof data.target_id !== "string"){
|
|
|
|
SendMessageToSocket(socket, {
|
|
|
|
error: "Unsecure request!"
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Send the signal to the target client
|
|
|
|
let number_target = SendReadyMessageToClient(client_id, data.target_id);
|
|
|
|
|
|
|
|
SendMessageToSocket(socket, {
|
|
|
|
ready_message_sent: true,
|
|
|
|
target_id: data.target_id,
|
|
|
|
number_of_targets: number_target
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2019-01-19 12:10:28 +00:00
|
|
|
//Check if the client wants to send a signal to another client
|
|
|
|
else if(data.signal && data.target_id) {
|
2019-01-19 09:53:09 +00:00
|
|
|
|
2019-01-19 12:10:28 +00:00
|
|
|
if(typeof data.signal !== "string" || typeof data.target_id !== "string"){
|
|
|
|
SendMessageToSocket(socket, {
|
|
|
|
error: "Unsecure request!"
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2019-01-19 09:53:09 +00:00
|
|
|
|
2019-01-19 12:10:28 +00:00
|
|
|
//Send the signal to the target client
|
|
|
|
let number_target = SendSignalToClient(data.signal, client_id, data.target_id);
|
2019-01-19 09:53:09 +00:00
|
|
|
|
2019-01-19 12:10:28 +00:00
|
|
|
SendMessageToSocket(socket, {
|
|
|
|
signal_sent: true,
|
|
|
|
number_of_targets: number_target
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
//Message not understood
|
|
|
|
else {
|
|
|
|
SendMessageToSocket(socket, {
|
|
|
|
error: "Could not understand your request!"
|
|
|
|
});
|
2019-01-19 09:53:09 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
socket.on("close", () => {
|
|
|
|
if(client_id) {
|
|
|
|
console.log("Connection from " + client_id + " closed.");
|
|
|
|
RemoveSocketFromList(socket);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|