UNPKG

berserker

Version:

Web-based frontend for Aria2-JSONRPC

106 lines (94 loc) 3.52 kB
//Required modules var util = require('./util'), router = require('router'), http = require('http'), fs = require('fs'), mime = require('mime'), WebSocketServer = require('websocket').server; function init(config, conn) { //Routes var route = router(); route.get('/aria-options', function ariaOptions(req, res) { res.setHeader('Content-Type', 'application/json'); res.writeHead(200); res.end(JSON.stringify(require('./aria2c_options.json'))); }); route.post('/command/{cmd}', function command(req, res) { var goptions = { method: req.params.cmd }; req.content = ''; req.on("data", function(chunk) { req.content += chunk; }); req.on("end", function() { if (req.content) { goptions.params = JSON.parse(req.content); } conn.send(goptions, function(result) { if (result.err) { console.error('ERROR: %s', result.err); res.writeHead(500, result.err); res.end(); return; } util.eventEmitter.emit(req.params.cmd, goptions.params); res.setHeader('Content-Type', 'application/json'); res.writeHead(200); res.end(JSON.stringify(result.obj)); }); }); }); //IMP: This is a catch-all route. Must be placed last. route.get(/(.*)/, function sendFile(req, res) { var filename = (req.params[0] === '/') ? __dirname + '/../ng/app/index.html' : __dirname + '/../ng/app/' + req.params[0]; fs.readFile(filename, function(err, data) { if (err) { res.writeHead(500, err); res.end(); return; } var mimetype = mime.lookup(filename); res.setHeader('Content-Type', mimetype); res.writeHead(200); res.end(data); }); }); //Start web server var server = http.createServer(route); server.listen(config.berserker.server_port, function() { console.log('INFO: Berserker server listening at http://localhost:%d', config.berserker.server_port); }); var wsServer = new WebSocketServer({ httpServer: server, autoAcceptConnections: false }); function originIsAllowed(origin) { return true; } wsServer.on('request', function(request) { if (!originIsAllowed(request.origin)) { // Make sure we only accept requests from an allowed origin request.reject(); console.log('INFO: Connection from origin ' + request.origin + ' rejected.'); return; } var connection = request.accept('echo-protocol', request.origin); console.log('INFO: Connection accepted.'); connection.on('message', function(message) { if (message.type === 'utf8') { connection.sendUTF(message.utf8Data); } else if (message.type === 'binary') { connection.sendBytes(message.binaryData); } }); connection.on('close', function(reasonCode, description) { console.log('INFO: Peer ' + connection.remoteAddress + ' disconnected.'); }); }); } // Functions which will be available to external callers module.exports = init;