@allgemein/eventbus
Version:
129 lines • 4.38 kB
JavaScript
"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