-
Notifications
You must be signed in to change notification settings - Fork 69
/
Copy pathindex.js
145 lines (122 loc) · 3.38 KB
/
index.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
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
138
139
140
141
142
143
144
145
'use strict';
//
// Load in every server flavor, so all server tests have the same initial memory
// consumption.
//
var WebSocketServer = require('ws').Server
, https = require('https')
, http = require('http')
, spdy = require('spdy');
//
// Cluster all the things.
//
var workers = +process.argv[3] || require('os').cpus().length
, cluster = require('cluster')
, master = cluster.isMaster;
if (master && workers > 1) {
console.log('Starting with %d worker processes', workers);
while (workers--) {
cluster.fork();
}
} else {
//
// Select the server based on the flavor env variable.
//
// FLAVOR=spdy node index.js # Start a spdy server.
// FLAVOR=https node index.js # Start a https server.
// FLAVOR=http node index.js # Start a regular server.
// node index.js # Also starts a regular server.
//
var flavor = (process.env.FLAVOR || 'http').toLowerCase()
, secure = !!~flavor.indexOf('s')
, server = flavor === 'spdy' ? spdy : (flavor === 'https' ? https : http);
//
// Initialize the SSL
//
var fs = require('fs')
, options = {
cert: fs.readFileSync(__dirname +'/ssl/server.crt', 'utf8')
, key: fs.readFileSync(__dirname +'/ssl/server.key', 'utf8')
};
//
// Setup the WebSocket server.
//
var app = new WebSocketServer({
server: !secure
? server.createServer(fourohfour)
: server.createServer(options, fourohfour)
});
/**
* Handle plain HTTP requests, we are only interested in HTTP requests.
*
* @param {Request} req HTTP request
* @param {Response} res HTTP response
* @api private
*/
function fourohfour(req, res) {
res.statusCode = 404;
res.end('ENOTFOUNDNUBCAKE');
}
//
// Start listening to WebSocket requests and send a message once in a while.
//
var connections = 0
, disconnection = 0
, messages = 0
, failures = 0
, send = 0;
app.on('connection', function connection(socket) {
++connections;
if (connections % 100 === 0) {
console.log('Received %d connections', connections);
}
socket.on('message', function message(data) {
++messages;
if (messages % 100 === 0) {
console.log(' - Received %d messages', messages);
}
socket.send(data, function sending(err) {
send++;
if (!err) return;
++failures;
console.error('Error: Failed to send due to reasons: ', err.message);
});
});
socket.on('error', function fucked(err) {
console.error('Error: Failure on the socket', err.message);
});
socket.on('close', function close() {
++disconnection;
});
});
//
// Output some server information.
//
function stats() {
console.log('');
console.log('Statistics:');
console.log(' - Connections established %d', connections);
console.log(' - Connections disconnected %d', disconnection);
console.log(' - Messages received %d', messages);
console.log(' - Messages send %d', send);
console.log(' - Messages failed %d', failures);
console.log('');
}
process.once('exit', stats);
process.once('SIGINT', process.exit);
//
// Everything is configured, listen
//
var port = +process.argv[2] || 8080
, backlog = 3000;
app._server.listen(port, backlog, function listening(err) {
if (!err) {
return console.log(
'BalancerBattleApp (flavor: %s) is listening on port %d', flavor, port
);
}
console.error('Failed to listen on port 8080, due to reasons');
console.error(' - '+ err.message);
process.exit(1);
});
}