@methodus/server
Version:
dynamic rpc components
98 lines • 6.41 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const debug = require('debug')('tmla:methodus:mq');
require("reflect-metadata");
const fp_1 = require("../../fp");
const amqp_1 = require("./amqp");
const log_1 = require("../../log");
const domain = require("domain");
function registerWorkers(proto, options) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
let foundEvents = false;
if (proto.methodus._workevents && Object.keys(proto.methodus._workevents).length > 0) {
log_1.logger.log(this, 'registering events bus for:', Object.keys(proto.methodus._workevents));
var dom = domain.create();
dom.on('error', () => {
registerWorkers(proto, options);
});
foundEvents = true;
dom.run(() => {
amqp_1.AMQP.connect(options).then((conn) => {
conn.createChannel().then((ch) => {
let exchangeArr = fp_1.fp.unique(Object.keys(proto.methodus._workevents).map(event => proto.methodus._workevents[event].exchange));
if (exchangeArr.length === 0) {
exchangeArr = ['event-bus'];
}
exchangeArr.forEach(exchange => {
// let exchange = proto.methodus.exchange || 'event-bus';
ch.assertQueue(proto.methodus.workQueueName, { exclusive: false, durable: true }).then((q) => {
Object.keys(proto.methodus._workevents).forEach(event => {
ch.bindQueue(q.queue, exchange, proto.methodus._workevents[event].name);
});
ch.prefetch(1);
ch.consume(q.queue, (msg) => __awaiter(this, void 0, void 0, function* () {
if (msg && msg.content) {
log_1.logger.log(this, ' [x] %s', msg.content.toString());
log_1.logger.log(this, 'event message has arrived', msg.fields.routingKey);
log_1.logger.log(this, 'msg string is', msg.content.toString());
//parse message
try {
let parsedMessage = fp_1.fp.maybeJson(msg.content.toString());
if (proto.methodus._workevents[parsedMessage.name]) {
let pkey = proto.methodus._workevents[parsedMessage.name].propertyKey;
if (proto[pkey]) {
const taskStatus = yield proto[pkey](parsedMessage.value, parsedMessage.name);
if (taskStatus) {
ch.ack(msg);
}
}
}
else {
//perform a wild card search
Object.keys(proto.methodus._workevents).forEach((eventName) => __awaiter(this, void 0, void 0, function* () {
let eventNameWithoutStar = eventName.replace(/\*/g, '');
if (parsedMessage.name.indexOf(eventNameWithoutStar) === 0) {
let pkey = proto.methodus._workevents[eventName].propertyKey;
if (proto[pkey]) {
const taskStatus = yield proto[pkey](parsedMessage.value, parsedMessage.name);
if (taskStatus) {
ch.ack(msg);
}
}
}
}));
}
}
catch (error) {
log_1.logger.error(this, error);
}
}
else {
log_1.logger.error(this, `recieved empty message`);
this.registerEvents(proto);
}
}), { noAck: false });
resolve();
});
});
});
});
});
}
if (!foundEvents) {
resolve();
}
});
});
}
exports.registerWorkers = registerWorkers;
//# sourceMappingURL=event-worker.js.map