forked from statusdashboard/statusdashboard
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
107 lines (93 loc) · 3.33 KB
/
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
var util = require('util');
var http = require('http');
var journey = require('journey');
var router = new(journey.Router)();
var paperboy = require('paperboy');
var url = require('url');
var _ = require('underscore')._;
process.on('exit', function () {
util.log('Bye bye Statusdashboard.');
});
process.on('uncaughtException', function(err) {
util.log(err);
});
String.prototype.startsWith = function(str) {
return (this.indexOf(str) === 0);
}
// settings
var settings = require('./settings').create();
var api = require('./api');
// router
router.get(/^\/api\/services$/).bind(api.services);
router.get(/^\/api\/services\/([a-z\-]+)$/).bind(api.servicesElement);
router.get(/^\/api\/summarize$/).bind(api.summarize);
router.get(/^\/api\/config\/client$/).bind(api.configClient);
router.get(/^\/api\/plugins\/client$/).bind(api.pluginsClient);
router.get(/^\/api\/uptime$/).bind(api.uptime);
// static
var docRoot = __dirname + '/public';
var pluginsDocRoot = [];
// server
var server = http.createServer(function(req, res) {
var body = '';
req.on('data', function(chunk) {
body += chunk;
});
req.on('end', function() {
router.handle(req, body, function (route) {
if (route.status === 404) {
paperboy.deliver(docRoot, req, res).otherwise(function(err) {
var pathname = url.parse(req.url).pathname;
var pluginDocRootSelect = _.select(pluginsDocRoot, function(data) { return pathname.toString().startsWith(data.prefix); });
if (pluginDocRootSelect && pluginDocRootSelect[0]) {
var pluginDocRoot = pluginDocRootSelect[0];
req.url = pathname.toString().replace(pluginDocRoot.prefix, "");
paperboy.deliver(pluginDocRoot.docRoot, req, res).otherwise(function(err) {
res.writeHead(404);
res.end('File not found.');
});
} else {
res.writeHead(route.status, route.headers);
res.end(route.body);
}
});
} else {
res.writeHead(route.status, route.headers);
res.end(route.body);
}
});
});
});
server.listen(settings.port, settings.hostname);
var count = 0;
var io = require('socket.io').listen(server);
// https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO
io.enable('browser client minification');
io.enable('browser client etag');
io.set('log level', 1);
io.sockets.on('connection', function(socket) {
count++;
util.log('New client connected! (' + count + ')');
socket.emit('title', settings.title);
socket.emit('status', api.getStatus());
socket.broadcast.emit('count', count);
socket.on('disconnect', function() {
count--;
util.log('Client disconnect! (' + count + ')');
socket.broadcast.emit('count', count);
});
api.on("refresh", function(status) {
socket.emit('status', status);
});
});
api.on("routeContribution", function(route) {
router.route(route.method, route.path).bind(route.binding);
});
api.on("staticContribution", function(plugin) {
util.log("Add static contribution: " + plugin);
var docRoot = __dirname + '/plugins/' + plugin + '/public';
pluginsDocRoot.push( { prefix: "/api/" + plugin, docRoot: docRoot });
util.log("Add static contribution: " + util.inspect(pluginsDocRoot));
});
util.log('Server started.');
util.log('Server running at http://' + settings.hostname + ':' + settings.port);