Minetrack/lib/server.js
Cryptkeeper 798dda8f12 Fix frontend not updating publicConfig.json
This changes the handshake sequence to use “bootTime” (a unique key
based off the time) to make sure the frontend configuration matches the
current one. If not, the client pulls the update and validates before
requesting the listing.
2016-02-06 18:26:29 -06:00

104 lines
2.4 KiB
JavaScript

var http = require('http');
var fs = require('fs');
var url = require('url');
var mime = require('mime');
var io = require('socket.io');
var util = require('./util');
var logger = require('./logger');
var config = require('../config.json');
var servers = require('../servers.json');
var urlMapping = [];
function setupRoutes() {
var routeKeys = Object.keys(config.routes);
// Map the (static) routes from our config.
for (var i = 0; i < routeKeys.length; i++) {
urlMapping[routeKeys[i]] = config.routes[routeKeys[i]];
}
logger.log('info', 'Routes: %s', routeKeys);
}
function handleRequest(req, res) {
var requestUrl = url.parse(req.url).pathname;
logger.log('info', '%s requested: %s', req.connection.remoteAddress, requestUrl);
if (requestUrl === '/status.json') {
res.setHeader('Content-Type', 'text/plain');
res.write(JSON.stringify({
error: true,
message: 'API deprecated.'
}));
res.end();
} else if (requestUrl === '/publicConfig.json') {
res.setHeader('Content-Type', 'application/javascript');
var categories = config.serverCategories;
// Legacy support for people without categories configured.
if (!categories) {
categories = {
'default': 'All Networks'
};
}
for (var i = 0; i < servers.length; i++) {
var entry = servers[i];
if (!entry.category) {
entry.category = 'default';
logger.warn('%s has no category, defaulting!', entry.name);
} else if (!categories[entry.category]) {
logger.warn('%s has an unknown category (%s), defaulting!', entry.name, entry.category);
entry.category = 'default';
}
}
var publicConfig = {
categories: categories,
graphDuration: config.graphDuration,
servers: servers,
bootTime: util.getBootTime()
};
res.write('setPublicConfig(' + JSON.stringify(publicConfig) + ');');
res.end();
} else if (requestUrl in urlMapping) {
var file = urlMapping[requestUrl];
res.setHeader('Content-Type', mime.lookup(file));
fs.createReadStream(file).pipe(res);
} else {
res.statusCode = 404;
res.write('404');
res.end();
}
}
exports.start = function() {
setupRoutes();
// Create our tiny little HTTP server.
var server = http.createServer(handleRequest);
server.listen(config.site.port, config.site.ip);
// I don't like this. But it works, I think.
exports.io = io.listen(server);
// Since everything is loaded, let's celebrate!
logger.log('info', 'Started on %s:%d', config.site.ip, config.site.port);
};