balena-cli
Version:
The official balena Command Line Interface
95 lines • 3.2 kB
JavaScript
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
;