-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsocket_server.js
90 lines (83 loc) · 2.51 KB
/
socket_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
var net = require('net');
var parser = require('http-string-parser');
var _ = require('lodash'); //Just cherry pick array methods
var querystring = require('querystring');
var arr = [];
var conObj = function(id,socket,timeout){
this.id = id;
this.socket = socket;
this.completed = false;
this.start = new Date().getTime();
this.duration = timeout*1000;
this.sendResponse = function(){
this.completed = true;
this.socket.end(JSON.stringify({status: "ok"}));
}
this.timer = setTimeout(_.bind(this.sendResponse, this), timeout*1000);
}
function clean(){
//Removes completed requests from queue
_.remove(arr, function(n) {
return n.completed == true;
});
}
function findSocket(id){
var matches = arr.filter(function(conn){
return (conn.id == id) && (conn.completed == false);
});
return matches;
}
var server = net.createServer(function(socket) {
//socket = new JsonSocket(socket);
socket.on('data', function(data) {
clean(); //Remove finished sockets
//Parse request data better
var request = parser.parseRequest(data.toString());
if(request.method == "GET" && request.uri.startsWith("/api/request")){
var query = request.uri.split("?")[1];
var params = querystring.parse(query);
var id = params.connId;
var timeout = params.timeout;
var matches = findSocket(id);
if(matches.length === 0)
{
arr.push(new conObj(id,socket,timeout));
}
else
{
socket.end(JSON.stringify({status: "Connection with id: "+id+ " already exists"}));
}
}
else if(request.method == "PUT" && request.uri == "/api/kill"){
var body = JSON.parse(request.body);
var id = body.connId;
var matches = findSocket(id);
if(matches.length === 0)
{
socket.end(JSON.stringify({status: "Invalid connection Id: "+id})); //Request doesn't exist
}
else{
//Destroy time out send response
var conn = matches[0]; //Assuming unique connection ids
clearTimeout(conn.timer);
conn.completed = true;
conn.socket.end(JSON.stringify({status:"killed"}));
socket.end(JSON.stringify({status:"ok"}));
}
}
else if(request.method == "GET" && request.uri == "/api/status"){
var endTime = new Date().getTime();
var result = arr.map(function(conn){
var rObj = {};
rObj[conn.id] = (conn.start + conn.duration - endTime)/1000;
return rObj;
});
socket.end(JSON.stringify(result));
}
else{
socket.end("Invalid request");
}
});
socket.on('error', function (err) { console.log('err ' + err)});
});
server.listen(3000, '127.0.0.1');