vulcain-corejs
Version:
Vulcain micro-service framework
94 lines (92 loc) • 3.46 kB
JavaScript
const vulcain_configurationsjs_1 = require('vulcain-configurationsjs');
class EventHandlerFactory {
constructor() {
this.handlers = new Map();
}
*allHandlers() {
for (let [vk, v] of this.handlers) {
for (let [sk, s] of v) {
for (let i of s)
yield i;
}
}
}
register(container, domain, target, actions, handlerMetadata) {
let domainName = domain.name;
handlerMetadata = handlerMetadata || {};
if (handlerMetadata.schema) {
// test if exists
let tmp = domain.getSchema(handlerMetadata.schema);
handlerMetadata.schema = tmp.name;
}
for (const action in actions) {
let actionMetadata = actions[action];
actionMetadata = actionMetadata || {};
if (actionMetadata.subscribeToSchema) {
// test if exists
let tmp = domain.getSchema(actionMetadata.subscribeToSchema);
actionMetadata.subscribeToSchema = tmp.name;
}
let keys = [domainName];
let schema = actionMetadata.subscribeToSchema || handlerMetadata.schema || "*";
actionMetadata.subscribeToSchema = schema;
actionMetadata.subscribeToAction = actionMetadata.subscribeToAction || "*";
keys.push(actionMetadata.subscribeToAction);
let handlerKey = keys.join('.').toLowerCase();
let byActions = this.handlers.get(handlerKey);
if (!byActions) {
byActions = new Map();
this.handlers.set(handlerKey, byActions);
}
let bySchemas = byActions.get(schema);
if (!bySchemas) {
bySchemas = [];
byActions.set(schema, bySchemas);
}
// Merge metadata
let item = {
methodName: action,
metadata: Object.assign({}, handlerMetadata, actionMetadata),
handler: target
};
bySchemas.push(item);
vulcain_configurationsjs_1.System.log.info(null, "Event handler registered for domain %s action %s schema %s", domainName, actionMetadata.subscribeToAction, schema);
}
}
getFilteredHandlers(domain, schema, action) {
let d = domain && domain.toLowerCase() + ".";
let a = (action && action.toLowerCase()) || "*";
let s = (schema && schema.toLowerCase()) || "*";
let items = [];
let key = d + a;
let infos = this.handlers.get(key);
if (infos) {
let tmp = infos.get(s);
if (tmp)
items = items.concat(tmp);
if (s !== "*") {
tmp = infos.get("*");
if (tmp)
items = items.concat(tmp);
}
}
if (a !== "*") {
key = d + "*";
infos = this.handlers.get(key);
if (infos) {
let tmp = infos.get(s);
if (tmp)
items = items.concat(tmp);
if (s !== "*") {
tmp = infos.get("*");
if (tmp)
items = items.concat(tmp);
}
}
}
return items;
}
}
exports.EventHandlerFactory = EventHandlerFactory;
//# sourceMappingURL=eventHandlerFactory.js.map
;