smartfacecloud-emulator-dispatcher
Version:
Handles Emulator Dispatcher Part of SmartfaceCloud
137 lines (121 loc) • 4.52 kB
JavaScript
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);
};