@decorators/express
Version:
node decorators - decorators for express library
69 lines • 8.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.errorMiddlewareHandler = exports.ERROR_MIDDLEWARE = exports.middlewareHandler = void 0;
const di_1 = require("@decorators/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;
try {
if (!container_1.Container.has(middleware) && middleware.prototype.use) {
container_1.Container.provide([{
provide: middleware,
useClass: middleware,
}]);
}
return await container_1.Container.get(middleware);
}
catch (e) {
if (typeof middleware === 'function') {
return ((_a = middleware.prototype) === null || _a === void 0 ? void 0 : _a.use)
? new middleware()
: middleware;
}
return null;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHVDQUFnRDtBQUVoRCwyQ0FBd0M7QUFleEM7O0dBRUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxVQUFzQjtJQUN0RCxPQUFPLENBQUMsR0FBWSxFQUFFLEdBQWEsRUFBRSxJQUFrQixFQUFFLEVBQUU7UUFDekQsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBSkQsOENBSUM7QUFFRDs7R0FFRztBQUNVLFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSxtQkFBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFdkU7O0dBRUc7QUFDSCxTQUFnQixzQkFBc0I7SUFDcEMsT0FBTyxDQUFDLEtBQVksRUFBRSxHQUFZLEVBQUUsR0FBYSxFQUFFLElBQWtCLEVBQUUsRUFBRTtRQUN2RSxnQkFBZ0IsQ0FBQyx3QkFBZ0IsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFKRCx3REFJQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLGdCQUFnQixDQUM3QixVQUF5RCxFQUN6RCxJQUEwRTs7SUFFMUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFpQixDQUFDO0lBRW5ELElBQUk7UUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixPQUFPLElBQUksRUFBRSxDQUFDO1NBQ2Y7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFDLFFBQW1ELGFBQW5ELFFBQVEsdUJBQVIsUUFBUSxDQUE2QyxHQUFHLG1DQUFJLFFBQVEsQ0FBQztRQUN0RixNQUFNLE1BQU0sR0FBRyxPQUFPLE9BQU8sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFFeEYsSUFBSSxNQUFNLFlBQVksT0FBTyxFQUFFO1lBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEI7S0FDRjtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ1g7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLHFCQUFxQixDQUFDLFVBQXlEOztJQUM1RixJQUFJO1FBQ0YsSUFBSSxDQUFDLHFCQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFLLFVBQW1CLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNwRSxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNqQixPQUFPLEVBQUUsVUFBVTtvQkFDbkIsUUFBUSxFQUFFLFVBQWtCO2lCQUM3QixDQUFDLENBQUMsQ0FBQztTQUNMO1FBRUQsT0FBTyxNQUFNLHFCQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ3hDO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixJQUFJLE9BQU8sVUFBVSxLQUFLLFVBQVUsRUFBRTtZQUNwQyxPQUFPLENBQUEsTUFBQSxVQUFVLENBQUMsU0FBUywwQ0FBRSxHQUFHO2dCQUM5QixDQUFDLENBQUMsSUFBSyxVQUEyRCxFQUFFO2dCQUNwRSxDQUFDLENBQUMsVUFBVSxDQUFDO1NBQ2hCO1FBRUQsT0FBTyxJQUFJLENBQUM7S0FDYjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uLCBSZXF1ZXN0SGFuZGxlciwgRXJyb3JSZXF1ZXN0SGFuZGxlciB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAZGVjb3JhdG9ycy9kaSc7XG5cbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgTWlkZGxld2FyZUZ1bmN0aW9uID0gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkO1xuZXhwb3J0IGludGVyZmFjZSBNaWRkbGV3YXJlQ2xhc3Mge1xuICB1c2U6IE1pZGRsZXdhcmVGdW5jdGlvbjtcbn1cbmV4cG9ydCB0eXBlIE1pZGRsZXdhcmUgPSBNaWRkbGV3YXJlRnVuY3Rpb24gfCBUeXBlPE1pZGRsZXdhcmVDbGFzcz47XG5cbmV4cG9ydCB0eXBlIEVycm9yTWlkZGxld2FyZUZ1bmN0aW9uID0gKGVycm9yOiBFcnJvciwgcmVxdWVzdDogUmVxdWVzdCwgcmVzcG9uc2U6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHZvaWQ7XG5leHBvcnQgaW50ZXJmYWNlIEVycm9yTWlkZGxld2FyZUNsYXNzIHtcbiAgdXNlOiBFcnJvck1pZGRsZXdhcmVGdW5jdGlvbjtcbn1cbmV4cG9ydCB0eXBlIEVycm9yTWlkZGxld2FyZSA9IEVycm9yTWlkZGxld2FyZUZ1bmN0aW9uIHwgVHlwZTxFcnJvck1pZGRsZXdhcmVDbGFzcz47XG5cbi8qKlxuICogQ3JlYXRlIHJlcXVlc3QgbWlkZGxld2FyZSBoYW5kbGVyIHRoYXQgdXNlcyBjbGFzcyBvciBmdW5jdGlvbiBwcm92aWRlZCBhcyBtaWRkbGV3YXJlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaWRkbGV3YXJlSGFuZGxlcihtaWRkbGV3YXJlOiBNaWRkbGV3YXJlKTogUmVxdWVzdEhhbmRsZXIge1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgaW52b2tlTWlkZGxld2FyZShtaWRkbGV3YXJlLCBbcmVxLCByZXMsIG5leHRdKS5jYXRjaChuZXh0KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBFcnJvciBNaWRkbGV3YXJlIGNsYXNzIHJlZ2lzdHJhdGlvbiBESSB0b2tlblxuICovXG5leHBvcnQgY29uc3QgRVJST1JfTUlERExFV0FSRSA9IG5ldyBJbmplY3Rpb25Ub2tlbignRVJST1JfTUlERExFV0FSRScpO1xuXG4vKipcbiAqIEFkZCBlcnJvciBtaWRkbGV3YXJlIHRvIHRoZSBhcHBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWlkZGxld2FyZUhhbmRsZXIoKTogRXJyb3JSZXF1ZXN0SGFuZGxlciB7XG4gIHJldHVybiAoZXJyb3I6IEVycm9yLCByZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIGludm9rZU1pZGRsZXdhcmUoRVJST1JfTUlERExFV0FSRSwgW2Vycm9yLCByZXEsIHJlcywgbmV4dF0pLmNhdGNoKG5leHQpO1xuICB9O1xufVxuXG4vKipcbiAqIEluc3RhbnRpYXRlIG1pZGRsZXdhcmUgYW5kIGludm9rZSBpdCB3aXRoIGFyZ3VtZW50c1xuICovXG5hc3luYyBmdW5jdGlvbiBpbnZva2VNaWRkbGV3YXJlKFxuICBtaWRkbGV3YXJlOiBJbmplY3Rpb25Ub2tlbiB8IE1pZGRsZXdhcmUgfCBFcnJvck1pZGRsZXdhcmUsXG4gIGFyZ3M6IFBhcmFtZXRlcnM8TWlkZGxld2FyZUZ1bmN0aW9uPiB8IFBhcmFtZXRlcnM8RXJyb3JNaWRkbGV3YXJlRnVuY3Rpb24+LFxuKSB7XG4gIGNvbnN0IG5leHQgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gYXMgTmV4dEZ1bmN0aW9uO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBnZXRNaWRkbGV3YXJlSW5zdGFuY2UobWlkZGxld2FyZSk7XG5cbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXIgPSAoaW5zdGFuY2UgYXMgTWlkZGxld2FyZUNsYXNzIHwgRXJyb3JNaWRkbGV3YXJlQ2xhc3MpPy51c2UgPz8gaW5zdGFuY2U7XG4gICAgY29uc3QgcmVzdWx0ID0gdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicgPyBoYW5kbGVyLmFwcGx5KGluc3RhbmNlLCBhcmdzKSA6IGluc3RhbmNlO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIHJlc3VsdC5jYXRjaChuZXh0KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG5leHQoZXJyKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNaWRkbGV3YXJlSW5zdGFuY2UobWlkZGxld2FyZTogSW5qZWN0aW9uVG9rZW4gfCBNaWRkbGV3YXJlIHwgRXJyb3JNaWRkbGV3YXJlKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFDb250YWluZXIuaGFzKG1pZGRsZXdhcmUpICYmIChtaWRkbGV3YXJlIGFzIFR5cGUpLnByb3RvdHlwZS51c2UpIHtcbiAgICAgIENvbnRhaW5lci5wcm92aWRlKFt7XG4gICAgICAgIHByb3ZpZGU6IG1pZGRsZXdhcmUsXG4gICAgICAgIHVzZUNsYXNzOiBtaWRkbGV3YXJlIGFzIFR5cGUsXG4gICAgICB9XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IENvbnRhaW5lci5nZXQobWlkZGxld2FyZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodHlwZW9mIG1pZGRsZXdhcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBtaWRkbGV3YXJlLnByb3RvdHlwZT8udXNlXG4gICAgICAgID8gbmV3IChtaWRkbGV3YXJlIGFzIFR5cGU8TWlkZGxld2FyZUNsYXNzIHwgRXJyb3JNaWRkbGV3YXJlQ2xhc3M+KSgpXG4gICAgICAgIDogbWlkZGxld2FyZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19