@smartface/emulator-dispatcher
Version:
Handles Emulator Dispatcher Part of SmartfaceCloud
137 lines (122 loc) • 3.97 kB
JavaScript
module.exports = function (express, app, options) {
options = options || {
logToConsole: false
};
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const https = require('https');
const rauTokenStore = {};
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(bodyParser.json());
app.use(bodyParser.text());
app.use(cookieParser());
// For CORS
app.use((req, res, next) => {
const 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('/', (req, res) => {
res.status(200).send('Smartface dispatcher is up and running').end();
});
const rauTokenRequestOptions = {
host: process.env.SMARTFACE_DASHBOARD_HOST,
path: '/api/ide/token',
method: 'GET'
};
function getSmartfaceAuthCookies(cookies) {
let res = '';
Object
.keys(cookies)
.forEach((cookie) => {
if (/SmartfaceAuth/ig.test(cookie)) {
res += `${cookie}=${cookies[cookie]};`;
}
});
return res;
}
function setToken(req, res, next) {
const { secret } = req.params;
const { server } = req.params;
let port;
server && (port = server.match(/:\d+/));
const options = {
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(":", "");
} */
}
const rauTokenRequest = https.request(options, rauTokenRequestCallback);
rauTokenRequest.on('error', (e) => {
res.status(500)
.header('Content-Type', 'text/plain; charset=us-ascii')
.send(e.message)
.end();
});
rauTokenRequest.end();
function rauTokenRequestCallback(response) {
let str = '';
response.on('data', (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', (req, res, next) => {
// TODO: later for security, accept clients only from local host
const { secret } = req.params;
const token = rauTokenStore[secret];
const status = token ? 200 : 404;
const 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', (req, res, next) => {
let txt = '<html><head><title>List of Connected Sockets</title></head><body><h1>Device WebSockets</h1><p><ul>';
const { allWebsockets } = global.shared;
const { allUIWebsockets } = global.shared;
let key; let
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);
};