@slowvoid.dev/express
Version:
node decorators - decorators for express library
69 lines • 8.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.errorMiddlewareHandler = exports.ERROR_MIDDLEWARE = exports.middlewareHandler = void 0;
const di_1 = require("@slowvoid.dev/di");
const container_1 = require("./container");
/**
* Create request middleware handler that uses class or function provided as middleware
*/
function middlewareHandler(middleware) {
return (req, res, next) => {
invokeMiddleware(middleware, [req, res, next]).catch(next);
};
}
exports.middlewareHandler = middlewareHandler;
/**
* Error Middleware class registration DI token
*/
exports.ERROR_MIDDLEWARE = new di_1.InjectionToken('ERROR_MIDDLEWARE');
/**
* Add error middleware to the app
*/
function errorMiddlewareHandler() {
return (error, req, res, next) => {
invokeMiddleware(exports.ERROR_MIDDLEWARE, [error, req, res, next]).catch(next);
};
}
exports.errorMiddlewareHandler = errorMiddlewareHandler;
/**
* Instantiate middleware and invoke it with arguments
*/
async function invokeMiddleware(middleware, args) {
var _a;
const next = args[args.length - 1];
try {
const instance = await getMiddlewareInstance(middleware);
if (!instance) {
return next();
}
const handler = (_a = instance === null || instance === void 0 ? void 0 : instance.use) !== null && _a !== void 0 ? _a : instance;
const result = typeof handler === 'function' ? handler.apply(instance, args) : instance;
if (result instanceof Promise) {
result.catch(next);
}
}
catch (err) {
next(err);
}
}
async function getMiddlewareInstance(middleware) {
var _a, _b;
try {
if (!container_1.Container.has(middleware) && ((_a = middleware.prototype) === null || _a === void 0 ? void 0 : _a.use)) {
container_1.Container.provide([{
provide: middleware,
useClass: middleware,
}]);
}
return await container_1.Container.get(middleware);
}
catch (e) {
if (typeof middleware === 'function') {
return ((_b = middleware.prototype) === null || _b === void 0 ? void 0 : _b.use)
? new middleware()
: middleware;
}
return null;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUFrRDtBQUVsRCwyQ0FBd0M7QUFleEM7O0dBRUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxVQUFzQjtJQUN0RCxPQUFPLENBQUMsR0FBWSxFQUFFLEdBQWEsRUFBRSxJQUFrQixFQUFFLEVBQUU7UUFDekQsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBSkQsOENBSUM7QUFFRDs7R0FFRztBQUNVLFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSxtQkFBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFdkU7O0dBRUc7QUFDSCxTQUFnQixzQkFBc0I7SUFDcEMsT0FBTyxDQUFDLEtBQVksRUFBRSxHQUFZLEVBQUUsR0FBYSxFQUFFLElBQWtCLEVBQUUsRUFBRTtRQUN2RSxnQkFBZ0IsQ0FBQyx3QkFBZ0IsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFKRCx3REFJQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLGdCQUFnQixDQUM3QixVQUF5RCxFQUN6RCxJQUEwRTs7SUFFMUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFpQixDQUFDO0lBRW5ELElBQUk7UUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixPQUFPLElBQUksRUFBRSxDQUFDO1NBQ2Y7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFDLFFBQW1ELGFBQW5ELFFBQVEsdUJBQVIsUUFBUSxDQUE2QyxHQUFHLG1DQUFJLFFBQVEsQ0FBQztRQUN0RixNQUFNLE1BQU0sR0FBRyxPQUFPLE9BQU8sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFFeEYsSUFBSSxNQUFNLFlBQVksT0FBTyxFQUFFO1lBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEI7S0FDRjtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ1g7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLHFCQUFxQixDQUFDLFVBQXlEOztJQUM1RixJQUFJO1FBQ0YsSUFBSSxDQUFDLHFCQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFJLE1BQUMsVUFBbUIsQ0FBQyxTQUFTLDBDQUFFLEdBQUcsQ0FBQSxFQUFFO1lBQ3JFLHFCQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2pCLE9BQU8sRUFBRSxVQUFVO29CQUNuQixRQUFRLEVBQUUsVUFBa0I7aUJBQzdCLENBQUMsQ0FBQyxDQUFDO1NBQ0w7UUFFRCxPQUFPLE1BQU0scUJBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDeEM7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLElBQUksT0FBTyxVQUFVLEtBQUssVUFBVSxFQUFFO1lBQ3BDLE9BQU8sQ0FBQSxNQUFBLFVBQVUsQ0FBQyxTQUFTLDBDQUFFLEdBQUc7Z0JBQzlCLENBQUMsQ0FBQyxJQUFLLFVBQTJELEVBQUU7Z0JBQ3BFLENBQUMsQ0FBQyxVQUFVLENBQUM7U0FDaEI7UUFFRCxPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24sIFJlcXVlc3RIYW5kbGVyLCBFcnJvclJlcXVlc3RIYW5kbGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAc2xvd3ZvaWQuZGV2L2RpXCI7XG5cbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgTWlkZGxld2FyZUZ1bmN0aW9uID0gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkO1xuZXhwb3J0IGludGVyZmFjZSBNaWRkbGV3YXJlQ2xhc3Mge1xuICB1c2U6IE1pZGRsZXdhcmVGdW5jdGlvbjtcbn1cbmV4cG9ydCB0eXBlIE1pZGRsZXdhcmUgPSBNaWRkbGV3YXJlRnVuY3Rpb24gfCBUeXBlPE1pZGRsZXdhcmVDbGFzcz47XG5cbmV4cG9ydCB0eXBlIEVycm9yTWlkZGxld2FyZUZ1bmN0aW9uID0gKGVycm9yOiBFcnJvciwgcmVxdWVzdDogUmVxdWVzdCwgcmVzcG9uc2U6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHZvaWQ7XG5leHBvcnQgaW50ZXJmYWNlIEVycm9yTWlkZGxld2FyZUNsYXNzIHtcbiAgdXNlOiBFcnJvck1pZGRsZXdhcmVGdW5jdGlvbjtcbn1cbmV4cG9ydCB0eXBlIEVycm9yTWlkZGxld2FyZSA9IEVycm9yTWlkZGxld2FyZUZ1bmN0aW9uIHwgVHlwZTxFcnJvck1pZGRsZXdhcmVDbGFzcz47XG5cbi8qKlxuICogQ3JlYXRlIHJlcXVlc3QgbWlkZGxld2FyZSBoYW5kbGVyIHRoYXQgdXNlcyBjbGFzcyBvciBmdW5jdGlvbiBwcm92aWRlZCBhcyBtaWRkbGV3YXJlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaWRkbGV3YXJlSGFuZGxlcihtaWRkbGV3YXJlOiBNaWRkbGV3YXJlKTogUmVxdWVzdEhhbmRsZXIge1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgaW52b2tlTWlkZGxld2FyZShtaWRkbGV3YXJlLCBbcmVxLCByZXMsIG5leHRdKS5jYXRjaChuZXh0KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBFcnJvciBNaWRkbGV3YXJlIGNsYXNzIHJlZ2lzdHJhdGlvbiBESSB0b2tlblxuICovXG5leHBvcnQgY29uc3QgRVJST1JfTUlERExFV0FSRSA9IG5ldyBJbmplY3Rpb25Ub2tlbignRVJST1JfTUlERExFV0FSRScpO1xuXG4vKipcbiAqIEFkZCBlcnJvciBtaWRkbGV3YXJlIHRvIHRoZSBhcHBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWlkZGxld2FyZUhhbmRsZXIoKTogRXJyb3JSZXF1ZXN0SGFuZGxlciB7XG4gIHJldHVybiAoZXJyb3I6IEVycm9yLCByZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIGludm9rZU1pZGRsZXdhcmUoRVJST1JfTUlERExFV0FSRSwgW2Vycm9yLCByZXEsIHJlcywgbmV4dF0pLmNhdGNoKG5leHQpO1xuICB9O1xufVxuXG4vKipcbiAqIEluc3RhbnRpYXRlIG1pZGRsZXdhcmUgYW5kIGludm9rZSBpdCB3aXRoIGFyZ3VtZW50c1xuICovXG5hc3luYyBmdW5jdGlvbiBpbnZva2VNaWRkbGV3YXJlKFxuICBtaWRkbGV3YXJlOiBJbmplY3Rpb25Ub2tlbiB8IE1pZGRsZXdhcmUgfCBFcnJvck1pZGRsZXdhcmUsXG4gIGFyZ3M6IFBhcmFtZXRlcnM8TWlkZGxld2FyZUZ1bmN0aW9uPiB8IFBhcmFtZXRlcnM8RXJyb3JNaWRkbGV3YXJlRnVuY3Rpb24+LFxuKSB7XG4gIGNvbnN0IG5leHQgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gYXMgTmV4dEZ1bmN0aW9uO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBnZXRNaWRkbGV3YXJlSW5zdGFuY2UobWlkZGxld2FyZSk7XG5cbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXIgPSAoaW5zdGFuY2UgYXMgTWlkZGxld2FyZUNsYXNzIHwgRXJyb3JNaWRkbGV3YXJlQ2xhc3MpPy51c2UgPz8gaW5zdGFuY2U7XG4gICAgY29uc3QgcmVzdWx0ID0gdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicgPyBoYW5kbGVyLmFwcGx5KGluc3RhbmNlLCBhcmdzKSA6IGluc3RhbmNlO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIHJlc3VsdC5jYXRjaChuZXh0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG5leHQoZXJyKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNaWRkbGV3YXJlSW5zdGFuY2UobWlkZGxld2FyZTogSW5qZWN0aW9uVG9rZW4gfCBNaWRkbGV3YXJlIHwgRXJyb3JNaWRkbGV3YXJlKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFDb250YWluZXIuaGFzKG1pZGRsZXdhcmUpICYmIChtaWRkbGV3YXJlIGFzIFR5cGUpLnByb3RvdHlwZT8udXNlKSB7XG4gICAgICBDb250YWluZXIucHJvdmlkZShbe1xuICAgICAgICBwcm92aWRlOiBtaWRkbGV3YXJlLFxuICAgICAgICB1c2VDbGFzczogbWlkZGxld2FyZSBhcyBUeXBlLFxuICAgICAgfV0pO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBDb250YWluZXIuZ2V0KG1pZGRsZXdhcmUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHR5cGVvZiBtaWRkbGV3YXJlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWlkZGxld2FyZS5wcm90b3R5cGU/LnVzZVxuICAgICAgICA/IG5ldyAobWlkZGxld2FyZSBhcyBUeXBlPE1pZGRsZXdhcmVDbGFzcyB8IEVycm9yTWlkZGxld2FyZUNsYXNzPikoKVxuICAgICAgICA6IG1pZGRsZXdhcmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==