UNPKG

@cashfarm/plow

Version:

Library for validating input data and parameters

48 lines 2.25 kB
"use strict"; 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