-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathleader.node.js
More file actions
137 lines (114 loc) · 3.85 KB
/
Copy pathleader.node.js
File metadata and controls
137 lines (114 loc) · 3.85 KB
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
* Leader server
* Server for message-passing implementation
*
* USEAGE: >> node leader.node.js <port number> <num nodes>
* Defaults to port 12345, two nodes
*/
// Required libraries
var net = require('net');
// Read in command line arguments
var args = process.argv;
var port = 12345;
var nNodes = 2;
if (args.length == 4) {
port = args[2];
nNodes = args[3];
} else {
console.log ('Invalid cmd line arguments - \
USEAGE: node leader.node.js <port number> <num nodes> - \
using default args');
}
// Initialize shared state JSON Array
var sharedState = [];
for (var i=0; i<nNodes; i++) {
sharedState[i] = [];
for (var j=0; j<nNodes; j++) {
sharedState[i][j]=[];
}
}
// Initialize connection server
var server = net.createServer(function(socket) {
console.log('server connected');
socket.on('end', function() {
console.log('server disconnected');
});
socket.on('data', function(data) {
console.log('received data: ' + data);
var dataString = data.toString();
var JSONdata = JSON.parse(dataString);
var sender, receiver, data;
// process 'send' request
if (JSONdata["send"] != null) {
console.log("received a send request");
processSendReq(JSONdata, socket);
// process 'receive request'
} else if (JSONdata["receive"] != null) {
console.log("received a receive request");
processRecvReq(JSONdata, socket);
// error - malformed request
} else {
console.log("received malformed request - not send or receive");
}
});
});
// listen on port
server.listen(port, "localhost", 10, function() {
console.log('server bound to port: ' + port);
});
// process a send request: update the shared state Array, reply with status
function processSendReq(JSONdata, socket) {
// make sure we have a JSON array with the expected fields
if (JSONdata["sender"] == null || JSONdata["receiver"] == null
|| JSONdata["message"] == null) {
console.log('received malformed send request - missing fields');
socket.write("{'Error':'Malformed send request'");
return;
}
var sender = JSONdata["sender"];
var receiver = JSONdata["receiver"];
var message = JSONdata["message"].toString();
// check if sender/receiver exceed shared state bounds
if (!validBounds(sender, receiver)) {
console.log('received malformed send request - out of bounds');
socket.write("{'Error':'Malformed send request'");
return;
}
// update shared state array
console.log('successfully received send message request');
(sharedState[receiver][sender]).push(message);
console.log('shared state updated:' + sharedState);
socket.write("{'Message': 'Success!'}");
return;
}
// process a receive request: send requested data to the socket
function processRecvReq(JSONdata, socket) {
// make sure we have a JSON array with the expected fields
if (JSONdata["sender"] == null || JSONdata["receiver"] == null) {
console.log('received malformed send request - missing fields');
socket.write("{'Error':'Malformed send request'}");
return;
}
var sender = JSONdata["sender"];
var receiver = JSONdata["receiver"];
var message = "";
// check if sender/receiver exceed shared state bounds
if (!validBounds(sender, receiver)) {
console.log('received malformed send request - out of bounds');
socket.write("{'Error':'Malformed send request'}");
return;
}
// update with reply
if (sharedState[receiver][sender].length > 0) {
// splice(0,1) is equivalent to removing the first element
message = ((sharedState[receiver][sender]).splice(0,1))[0];
console.log('outgoing message:' + message.toString());
socket.write("{'Message':" + message + "}" )
}
}
// ------------------------ Utility Functions -----------------------------
// checkBounds: checks if receiver and sender are within bounds of the
// number of nodes
function validBounds(sender, receiver) {
return (sender >= 0 && sender < nNodes) || !(receiver >= 0 && receiver < nNodes)
}