UNPKG

@methodus/server

Version:
98 lines 6.41 kB
"use strict"; 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