UNPKG

@allgemein/eventbus

Version:
129 lines 4.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.NsqdEventBusAdapter = void 0; const NsqdObject_1 = require("./NsqdObject"); const AbstractEventBusAdapter_1 = require("../AbstractEventBusAdapter"); const logging_1 = require("@allgemein/logging"); const Serializer_1 = require("../../utils/Serializer"); const lodash_1 = require("lodash"); class NsqdEventBusAdapter extends AbstractEventBusAdapter_1.AbstractEventBusAdapter { constructor(nodeId, name, clazz, options) { super(nodeId, name, clazz, options); this._connecting = false; this._ready = false; this.loadDependencies(); this.getEmitter().on('connect', this.connect.bind(this)); } loadDependencies() { try { require('nsqjs'); NsqdEventBusAdapter.NsqdReader = require('./NsqdReader').NsqdReader; NsqdEventBusAdapter.NsqdWriter = require('./NsqdWriter').NsqdWriter; } catch (err) { const msg = 'EventBus adapter nsqjs can\'t be loaded, because modul nsqjs is not installed. :('; logging_1.Logger.warn(msg); throw new Error(msg); } } async connect() { if (!this._connecting) { this._connecting = true; } else { return; } const sub = await this.getSubscriber(); const pub = await this.getPublisher(); try { await Promise.all([sub.open(), pub.open()]); } catch (err) { logging_1.Logger.error(err.message); throw err; } this.getEmitter().emit('ready'); this._ready = true; } async open() { if (!this._connecting) { this.getEmitter().emit('connect'); } if (this._ready) { return null; } return new Promise((resolve, reject) => { this.getEmitter().once('ready', resolve); }); } async getSubscriber() { if (this.reader) { return this.reader; } this.reader = Reflect.construct(NsqdEventBusAdapter.NsqdReader, [this.name, this.nodeId, this.options.extra.reader]); this.reader.on('message', this.onMessage.bind(this)); return this.reader; } async getPublisher() { if (this.writer) { return this.writer; } this.writer = Reflect.construct(NsqdEventBusAdapter.NsqdWriter, [this.options.extra.writer.host, this.options.extra.writer.port]); return this.writer; } onMessage(message) { const data = message.body; if ((0, lodash_1.has)(data, 'status')) { if (data.status === 'work') { this.getEmitter().emit(this.eventID(), data.uuid, data); } else if (data.status === 'done') { this.getEmitter().emit([this.eventID(), data.uuid, 'done'].join('_'), data.error, data.result); } } else if ((0, lodash_1.has)(data, 'source')) { } } async publish(object) { await this.open(); const obj = new NsqdObject_1.NsqdObject(this, this.eventID(), object); await obj.fire(); return obj; } unsubscribe() { this.getEmitter().removeAllListeners(this.eventID()); this._subscribed = false; } async subscribe(fn) { await this.open(); this._subscribed = true; this.getEmitter().on(this.eventID(), async (uuid, data) => { let res = null; let err = null; try { res = await fn(data.object); } catch (err2) { err = err2; } const writer = await this.getPublisher(); const _msp = { source: this.nodeId, dest: data.source, status: 'done', uuid: uuid, event: data.event, result: res, error: err }; const msg = { topic: this.name, message: Serializer_1.Serializer.serialize(_msp) }; await writer.publish(msg); }); } } exports.NsqdEventBusAdapter = NsqdEventBusAdapter; NsqdEventBusAdapter.ADAPTER_NAME = 'nsq'; //# sourceMappingURL=NsqdEventBusAdapter.js.map