@cashfarm/plow
Version:
Library for validating input data and parameters
48 lines • 2.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const lang_1 = require("@cashfarm/lang");
const domain_1 = require("../domain");
const symbols_1 = require("../symbols");
const class_transformer_1 = require("class-transformer");
const debug = require('debug')('plow:events');
class EventBus {
constructor(serviceName, transport) {
this.serviceName = serviceName;
this.transport = transport;
// subscribe this instance to ALL events
// this way the local microservice can choose
// to listen to any event
// bus.subscribe('#', (message: any) => this.fanout(event));
}
subscribeToTopic(topic, handler) {
debug(`Registering handler for ${topic}:`, handler.constructor ?
handler.constructor.name : handler.toString());
this.transport.subscribe(topic, (message) => handler(message.type, message.data));
}
subscribe(evtClass, handler) {
const evtName = evtClass.name;
debug(`Registering handler for ${evtName}:`, handler.constructor ?
handler.constructor.name : handler.toString());
if (typeof handler[domain_1.Handle(evtClass)] !== 'function') {
throw new lang_1.Exception(`Can't subscribe ${handler.constructor.name} to ${evtClass.name} ` +
`because it has not defined a method \`public [Handle(${evtClass.name})](evt: ${evtClass.name})`);
}
this.transport.subscribe(`${this.serviceName}.${evtName}`, (name, event) => {
console.log(class_transformer_1.plainToClass(evtClass, event.content.data));
handler[domain_1.Handle(evtClass)].apply(handler, [class_transformer_1.plainToClass(evtClass, event.content.data)]);
});
}
unsubscribe(evtClass, handler) {
throw new lang_1.Exception('not implemented');
}
publish(evt) {
const evtName = this.getEventName(evt);
debug(`Publishing event ${evtName}`);
this.transport.publish(`${this.serviceName}.${evtName}`, evt);
}
getEventName(evt) {
return Reflect.getMetadata(symbols_1.Symbols.EventName, evt.constructor) || evt.constructor.name;
}
}
exports.EventBus = EventBus;
//# sourceMappingURL=eventBus.js.map