@methodus/server
Version:
dynamic rpc components
91 lines • 5.83 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 registerHandlers(proto, options) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
let foundEvents = false;
if (proto.methodus._events && Object.keys(proto.methodus._events).length > 0) {
log_1.logger.log(this, 'registering events bus for:', Object.keys(proto.methodus._events));
var dom = domain.create();
foundEvents = true;
dom.on('error', () => {
registerHandlers(proto, options);
});
dom.run(() => {
amqp_1.AMQP.connect(options).then((conn) => {
conn.createChannel().then((ch) => {
let exchangeArr = fp_1.fp.unique(Object.keys(proto.methodus._events).map(event => proto.methodus._events[event].exchange));
if (exchangeArr.length === 0) {
exchangeArr = ['event-bus'];
}
log_1.logger.log(this, exchangeArr);
exchangeArr.forEach(exchange => {
// let exchange = proto.methodus.exchange || 'event-bus';
ch.assertQueue('', { exclusive: true, durable: true }).then((q) => {
Object.keys(proto.methodus._events).forEach(event => {
ch.bindQueue(q.queue, exchange, proto.methodus._events[event].name);
});
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._events[parsedMessage.name]) {
let pkey = proto.methodus._events[parsedMessage.name].propertyKey;
if (proto[pkey]) {
yield proto[pkey](parsedMessage.value, parsedMessage.name); //no results for an event
}
}
else {
//perform a wild card search
Object.keys(proto.methodus._events).forEach((eventName) => __awaiter(this, void 0, void 0, function* () {
let eventNameWithoutStar = eventName.replace(/\*/g, '');
if (parsedMessage.name.indexOf(eventNameWithoutStar) === 0) {
let pkey = proto.methodus._events[eventName].propertyKey;
if (proto[pkey]) {
yield proto[pkey](parsedMessage.value, parsedMessage.name);
}
}
}));
}
}
catch (error) {
log_1.logger.error(this, error);
}
}
else {
log_1.logger.error(this, `recieved empty message`);
}
}), { noAck: true });
resolve();
});
});
});
});
});
}
if (!foundEvents) {
resolve();
}
});
});
}
exports.registerHandlers = registerHandlers;
//# sourceMappingURL=event-handler.js.map