@gabliam/web-core
Version:
Gabliam plugin for add web-core
102 lines (101 loc) • 3.66 kB
JavaScript
;
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;