UNPKG

balena-cli

Version:

The official balena Command Line Interface

95 lines 3.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LoginServer = void 0; const bodyParser = require("body-parser"); const events_1 = require("events"); const express = require("express"); const path = require("path"); const utils = require("./utils"); const errors_1 = require("../errors"); class LoginServer extends events_1.EventEmitter { constructor() { super(...arguments); this.serverSockets = []; this.loginPath = '/auth'; } async start({ host = '127.0.0.1', port = 0 } = {}) { this.once('error', (err) => { this.firstError = err; }); this.on('token', (token) => { this.token = token; }); const app = (this.expressApp = express()); app.use(bodyParser.urlencoded({ extended: true, })); app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'pages')); this.server = await new Promise((resolve, reject) => { const callback = (err) => { if (err) { this.emit('error', err); reject(err); } else { resolve(server); } }; const server = app.listen(port, host, callback); server.on('connection', (socket) => this.serverSockets.push(socket)); }); this.expressApp.post(this.loginPath, async (request, response) => { var _a; this.server.close(); try { const token = (_a = request.body.token) === null || _a === void 0 ? void 0 : _a.trim(); if (!token) { throw new errors_1.ExpectedError('No token'); } const loggedIn = await utils.loginIfTokenValid(token); if (!loggedIn) { throw new errors_1.ExpectedError('Invalid token'); } this.emit('token', token); response.status(200).render('success'); } catch (error) { this.emit('error', error); response.status(401).render('error'); } }); this.expressApp.use((_request, response) => { this.server.close(); this.emit('error', new Error('Unknown path or verb')); response.status(404).send('Not found'); }); return this.getAddress(); } getAddress() { const info = this.server.address(); return { host: info.address, port: info.port, urlPath: this.loginPath, }; } shutdown() { this.serverSockets.forEach((s) => s.unref()); this.serverSockets.splice(0); } async awaitForToken() { if (this.firstError) { throw this.firstError; } if (this.token) { return this.token; } return new Promise((resolve, reject) => { this.on('error', reject); this.on('token', resolve); }); } } exports.LoginServer = LoginServer; //# sourceMappingURL=server.js.map