domotz-remote-pawn
Version:
Domotz Agent
115 lines (95 loc) • 3.12 kB
JavaScript
/**
*
* Created by Andrea Azzarà <a.azzara@domotz.com> on 17/10/16.
*/
;
var MODULE = 'WS: ';
function wsServer(ws) {
var webSocket = ws;
var port = null;
var server = null;
function onDataReceived(data, conn) {
var message;
try {
message = JSON.parse(data);
} catch(err) {
console.alert(MODULE + "error parsing command" + err);
return;
}
var id = message.id || null;
if (id == 'speed-test') {
try {
console.silly(MODULE + "Received " + data);
var size = message.payload.size;
var chunks = message.payload.chunks;
var chunk = new Buffer(size / chunks);
var mod = new Buffer(size % chunks);
} catch (err) {
console.error(MODULE + "data parsing error" + JSON.stringify(err));
return;
}
var left = JSON.parse(JSON.stringify(size));
var sendData = function () {
try {
if (left > 0) {
console.info(MODULE + "left " + left);
if (left >= chunk.length) {
left -= chunk.length;
conn.sendBinary(chunk, sendData);
} else {
left = 0;
conn.sendBinary(new Buffer(mod), sendData);
}
}
} catch (err) {
console.alert(MODULE + "error sending data: " + JSON.stringify(err));
}
};
sendData();
} else {
console.info(MODULE + "unknown command id");
}
}
function create() {
server = webSocket.createServer(function (conn) {
conn.on("text", function (data) {
onDataReceived(data, conn);
});
conn.on("close", function (code, reason) {
console.info(MODULE + "Connection closed");
});
conn.on("connect", function () {
console.info(MODULE + "on connect");
});
conn.on("error", function () {
console.info(MODULE + "on error");
});
});
var socketErrorHandler = function (error) {
console.alert(MODULE + "socket error: " + error);
};
server.listen(0, function () {
/* listen on a random port */
port = server.socket.address().port;
server.socket.on('error', socketErrorHandler)
});
}
function getPort() {
return port;
}
function close() {
if (!server) {
console.info(MODULE + "unable to close connection: server not available");
return;
}
server.close(function () {
server = null;
});
}
return {
create: create,
getPort: getPort,
close: close
}
}
module.exports.wsServer = wsServer;