@hmcts/rpx-xui-node-lib
Version:
Common nodejs library components for XUI
132 lines • 6.51 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.xuiNode = exports.XuiNode = void 0;
const events_1 = require("events");
const express_1 = require("express");
const util_1 = require("../util");
class XuiNode extends events_1.EventEmitter {
constructor(router = (0, express_1.Router)({ mergeParams: true }),
// deliberately done it this way as we need session first
middlewares = ['session', 'auth'], logger = (0, util_1.getLogger)('common:XuiNode')) {
super();
this.authenticate = (req, res, next) => {
const authMiddleware = this.authenticateMiddleware ? this.authenticateMiddleware : this.authenticateDefault;
this.logger.info('authenticate: authMiddleware = ', authMiddleware.name);
authMiddleware(req, res, next);
this.logger.log('authenticate: end');
};
/**
* the proxied authenticate method which is publicly exposed
* what constitutes a user being unauthenticated?
* @see https://github.com/jaredhanson/passport/blob/597e289d6fa27a2c35d16dd411de284123e3817e/lib/http/request.js#L92
* @param req
* @param res
* @param next
*/
this.authenticateDefault = (req, res, next) => {
var _a;
if (req.isUnauthenticated()) {
this.logger.log('request is unauthenticated');
res.statusCode = 401;
res.statusMessage = 'Unauthorized';
res.status(401).send({ message: 'Unauthorized' });
}
else {
this.logger.log('user is authenticated ' + ((_a = req === null || req === void 0 ? void 0 : req.user) === null || _a === void 0 ? void 0 : _a.toString()));
}
next();
};
this.configure = (options) => {
this.middlewares.forEach((middleware) => __awaiter(this, void 0, void 0, function* () { return yield this.applyMiddleware(middleware, options); }));
return this.router;
};
/**
* Import a middleware layer.
*
* @param {string} middleware - ie. 's2s'
* @return {Promise<any>}
*/
this.importMiddleware = (middleware) => __awaiter(this, void 0, void 0, function* () {
switch (middleware) {
case 'auth':
return yield Promise.resolve().then(() => __importStar(require(/* webpackChunkName: "xuiNodeAuth" */ '../../auth')));
case 'session':
return yield Promise.resolve().then(() => __importStar(require(/* webpackChunkName: "xuiNodeSession" */ '../../session')));
default:
this.logger.error('unknown middleware: ' + middleware);
throw new Error('unknown middleware');
}
});
this.applyMiddleware = (middleware, options) => __awaiter(this, void 0, void 0, function* () {
if ((0, util_1.hasKey)(options, middleware)) {
const middlewareLayerOptions = options[middleware];
const middlewareLayer = yield this.importMiddleware(middleware);
this.applyMiddlewareLayer(middlewareLayer, middlewareLayerOptions);
}
});
this.applyMiddlewareLayer = (middlewareLayer, options) => {
for (const [key, value] of Object.entries(options)) {
if ((0, util_1.hasKey)(middlewareLayer, key)) {
const middleware = middlewareLayer[key];
this.proxyEvents(middleware);
if ((0, util_1.hasKey)(middleware, 'authenticate')) {
this.logger.log('using authenticate middleware from ', middleware.constructor.name);
this.authenticateMiddleware = middleware.authenticate;
}
this.router.use(middleware.configure(value));
}
}
};
/**
* helper method to proxy any listened events onto the correct middleware
* @param middleware - any middleware layer e.g s2s, oidc, fileStore etc this typically extends EventEmitter
*/
this.proxyEvents = (middleware) => {
const events = middleware.getEvents();
events.forEach((event) => {
if (this.listenerCount(event)) {
this.logger.log('proxying event ', event);
middleware.on(event, (...args) => this.emit(event, ...args));
}
});
};
this.router = router;
this.middlewares = middlewares;
this.logger = logger;
}
}
exports.XuiNode = XuiNode;
exports.xuiNode = new XuiNode();
//# sourceMappingURL=xuiNode.class.js.map