SuperNodeStorage/src/server.js
2021-07-23 20:58:29 +00:00

81 lines
2.8 KiB
JavaScript

const http = require('http');
const WebSocket = require('ws');
const url = require('url');
module.exports = function Server(port, client, intra) {
var refresher; //container for refresher
const server = http.createServer((req, res) => {
if (req.method === "GET") {
//GET: requesting data
let u = url.parse(req.url, true);
if (!u.search)
return res.end("");
console.log("GET:", u.search);
client.processRequestFromUser(u.query)
.then(result => res.end(JSON.stringify(result[0])))
.catch(error => res.end(error.toString()));
} else if (req.method === "POST") {
//POST: All data processing (required JSON input)
let data = '';
req.on('data', chunk => data += chunk);
req.on('end', () => {
console.log("POST:", data);
//process the data storing
client.processIncomingData(data).then(result => {
res.end(JSON.stringify(result[0]));
if (result[1]) {
refresher.countdown;
if (result[1] === 'DATA')
sendToLiveRequests(result[0]);
intra.forwardToNextNode(result[1], result[0]);
};
}).catch(error => res.end(error.toString()));
});
};
});
server.listen(port, (err) => {
if (!err)
console.log(`Server running at port ${port}`);
});
const wsServer = new WebSocket.Server({
server
});
wsServer.on('connection', function connection(ws) {
ws.onmessage = function(evt) {
let message = evt.data;
if (message.startsWith(intra.SUPERNODE_INDICATOR))
intra.processTaskFromSupernode(message, ws);
else {
var request = JSON.parse(message);
client.processRequestFromUser(request)
.then(result => {
ws.send(JSON.stringify(result[0]));
ws._liveReq = request;
}).catch(error => {
if (floGlobals.sn_config.errorFeedback)
ws.send(error.toString());
});
};
};
});
function sendToLiveRequests(data) {
wsServer.clients.forEach(ws => {
if (client.checkIfRequestSatisfy(ws._liveReq, data))
ws.send(JSON.stringify(data));
});
};
Object.defineProperty(this, "http", {
get: () => server
});
Object.defineProperty(this, "webSocket", {
get: () => wsServer
});
Object.defineProperty(this, "refresher", {
set: (r) => refresher = r
});
};