UNPKG

smartfacecloud-emulator-dispatcher

Version:

Handles Emulator Dispatcher Part of SmartfaceCloud

137 lines (121 loc) 4.52 kB
module.exports = function(express, app, options) { options = options || { logToConsole: false }; var bodyParser = require('body-parser'); var cookieParser = require('cookie-parser'); var https = require('https'); var rauTokenStore = {}; app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(bodyParser.text()); app.use(cookieParser()); // For CORS app.use(function(req, res, next) { var origin = req.get("origin"); origin && res.header("Access-Control-Allow-Origin", req.header("origin")); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); res.header("Access-Control-Allow-Credentials", true); next(); }); app.get('/', function(req, res) { res.status(200).send('Smartface dispatcher is up and running').end(); }); var rauTokenRequestOptions = { host: process.env.SMARTFACE_DASHBOARD_HOST, path: '/api/ide/token', method: 'GET' }; function getSmartfaceAuthCookies(cookies) { var res = ""; Object .keys(cookies) .forEach(cookie => { if (/SmartfaceAuth/ig.test(cookie)) { res += cookie + "=" + cookies[cookie] + ";"; } }); return res; } function setToken(req, res, next) { var secret = req.params.secret; var server = req.params.server; var port; server && (port = server.match(/:\d+/)); var options = Object.assign({ headers: { "Accept": "text/plain; charset=us-ascii", "Cookie": getSmartfaceAuthCookies(req.cookies) } }, rauTokenRequestOptions); if (server) {/* port = server.match(/:\d+/); options.host = server.replace(/:\d+/, ""); if (port && port.length === 1) { options.port = port[0].replace(":", ""); }*/ } var rauTokenRequest = https.request(options, rauTokenRequestCallback); rauTokenRequest.on("error", function(e) { res.status(500) .header("Content-Type", "text/plain; charset=us-ascii") .send(e.message) .end(); }); rauTokenRequest.end(); function rauTokenRequestCallback(response) { var str = ''; response.on('data', function(chunk) { str += chunk; }); response.on('end', function() { res.status(this.statusCode).end(); if (this.statusCode) rauTokenStore[secret] = str; }); response.on("error", function() { console.dir(arguments); }); } } app.post("/token/:secret/:server", setToken); app.post("/token/:secret", setToken); app.get("/token/:secret", function(req, res, next) { //TODO: later for security, accept clients only from local host var secret = req.params.secret; var token = rauTokenStore[secret]; var status = token ? 200 : 404; var message = token ? "Bearer " + token : "Token for secret not found"; res.status(status) .header("Content-Type", "text/plain; charset=us-ascii") .send(message) .end(); token && (delete rauTokenStore[secret]); }); app.get("/sockets", function(req, res, next) { var txt = '<html><head><title>List of Connected Sockets</title></head><body><h1>Device WebSockets</h1><p><ul>'; var allWebsockets = global.shared.allWebsockets; var allUIWebsockets = global.shared.allUIWebsockets; var key, ws; for (key in allWebsockets) { ws = allWebsockets[key].ws; if (ws.readyState === 1) { txt += "<li>" + key + "</li>"; } } txt += "</ul></p><h1>UI WebSockets</h1><p><ul>"; for (key in allUIWebsockets) { ws = allUIWebsockets[key].ws; if (ws.readyState === 1) { txt += "<li>" + key + "</li>"; } } txt += "</ul></p></body>"; res.status(200).send(txt).end(); }); require("./logging/log").init(app, options); require("./image-serve/image-serve")(app, options); require("./file-serve/file-serve")(express, app, options); };