UNPKG

@gabliam/web-core

Version:
102 lines (101 loc) 3.66 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getGlobalInterceptors = exports.extractInterceptors = exports.createInterceptorResolver = exports.isInterceptor = void 0; const core_1 = require("@gabliam/core"); const errors_1 = require("../errors"); const metadatas_1 = require("../metadatas"); const utils_1 = require("../utils"); const web_configuration_1 = require("../web-configuration"); function isInterceptor(value) { return value && typeof value.intercept === 'function'; } exports.isInterceptor = isInterceptor; const createInterceptorResolver = (container) => function interceptorResolver(interceptor) { if (isInterceptor(interceptor)) { return interceptor; } try { // test if the interceptor is a ServiceIdentifier return container.get(interceptor); } catch (_a) { try { // test if interceptor is constructable const t = new interceptor(); if (!isInterceptor(t)) { throw new errors_1.BadInterceptorError(t); } container .bind(interceptor) .to(interceptor) .inSingletonScope(); return container.get(interceptor); } catch (e) { if (e instanceof errors_1.BadInterceptorError) { throw e; } else { throw new errors_1.BadInterceptorError(interceptor); } } } }; exports.createInterceptorResolver = createInterceptorResolver; /** * Get interceptors metadata. * If key is undefined, return the list of interceptors for a class (target) * else return the list of interceptors for a method (key) of a class (target) * @param {Container} container * @param {Object} target * @param {string} key? * @returns express.RequestHandler[] */ function extractInterceptors(container, target, key) { let metadataList = []; let metas; if (!key) { metas = core_1.reflection.annotationsOfDecorator(target, metadatas_1.UseInterceptors) || []; } else { metas = core_1.reflection.propMetadataOfDecorator(target, metadatas_1.UseInterceptors)[key] || []; } metadataList = metas.reduce((prev, current) => { prev.push(...current.ids); return prev; }, metadataList); const interceptorResolver = (0, exports.createInterceptorResolver)(container); const interceptors = []; for (const metadata of metadataList) { const interceptor = interceptorResolver(metadata); if (isInterceptor(interceptor)) { interceptors.push({ instance: interceptor, extractArgs: (0, utils_1.getExtractArgs)(container, interceptor, 'intercept', true), }); } } return interceptors; } exports.extractInterceptors = extractInterceptors; /** * Get globals interceptors */ const getGlobalInterceptors = (container) => { const webConfiguration = container.get(web_configuration_1.WebConfiguration); const interceptors = []; const interceptorResolver = (0, exports.createInterceptorResolver)(container); for (const interceptorId of webConfiguration.globalInterceptors) { const interceptor = interceptorResolver(interceptorId); if (isInterceptor(interceptor)) { interceptors.push({ instance: interceptor, extractArgs: (0, utils_1.getExtractArgs)(container, interceptor, 'intercept', true), }); } } return interceptors; }; exports.getGlobalInterceptors = getGlobalInterceptors;