UNPKG

orator-dbus

Version:

Orator DBUS queue for RabbitMQ fanout exchange

147 lines (127 loc) 4.34 kB
/** * Orator DBUS Module * * @license All Rights Reserved * * @author Jason Hillier <jason.hillier@paviasystems.com> * @module OratorDBUS */ /** * The Orator DBUS Module * * @class OratorDBUS * @constructor */ var OratorDBUS = function() { function createNew(pFable, pRoutingKey) { // If a valid fable object isn't passed in, return a constructor if ((typeof(pFable) !== 'object') || (!pFable.hasOwnProperty('fable'))) return {new: createNew}; var _Fable = pFable; var _Log = pFable.log; var _Settings = pFable.settings; var _CommonServices = pFable; var libAmqp = require('amqp'); var _RabbitConnection = null; var _RabbitDBUSExchange = null; var _RabbitConnected = false; var _onMessage_Handler = null; if (!pRoutingKey) pRoutingKey = 'base'; var initializeRabbitMq = function() { _Log.trace('Connecting to DBUS RabbitMQ at ' + _Settings.RabbitUrl); _RabbitConnection = libAmqp.createConnection({url: _Settings.RabbitUrl}, {reconnect: true}); _RabbitConnection.on('ready', function(hub) { _RabbitConnected = true; _Log.trace('Connected to DBUS RabbitMQ'); //setup an exchange to send DBUS messages _RabbitDBUSExchange = _RabbitConnection.exchange('DBUS', options={type: 'fanout', durable:true, autoDelete:false}); //setup queue to receive messages _RabbitConnection.queue('', function(q) { // Catch DBUS messages. (Note: RoutingKey is not used by RabbitMQ in fanout exchanges) q.bind('DBUS', pRoutingKey); // Receive messages q.subscribe(onDBUS_Message); }); }); } var Publish = function(pFromAddress, pDestinationAddress, pSignal) { if (!pDestinationAddress || typeof(pDestinationAddress) !== 'string') { _Log.trace('[DBUS] Invalid destination!'); return; } if (_RabbitConnected) { var tmpMessage = { From: `${pRoutingKey}.${pFromAddress}`, Destination: pDestinationAddress, Signal: pSignal }; _RabbitDBUSExchange.publish(pDestinationAddress, JSON.stringify(tmpMessage), {}, function(err) { if (err) _Log.trace('[DBUS] Error sending message', tmpMessage); else _Log.trace('[DBUS] Sent message', tmpMessage); }); } } var onDBUS_Message = function(pMessage, pHeaders, pDeliveryInfo) { //only handle messages addressed to our route, or global route if (pDeliveryInfo.routingKey !== '' && pDeliveryInfo.routingKey.indexOf(pRoutingKey)!==0) return; //parse utf8 try { pMessage = pMessage.data.toString('utf8'); pMessage = JSON.parse(pMessage) } catch (ex) { _Log.error('[DBUS] Message parsing exception!', ex); return; } //console.log(pDeliveryInfo.routingKey); _Log.trace('[DBUS] Received message', pMessage); if (_onMessage_Handler) { var tmpDestinationNode = pDeliveryInfo.routingKey.replace(pRoutingKey + '.', ''); return _onMessage_Handler(tmpDestinationNode, pMessage); } } // ### Automatically connect the Routes if this is an orator if (typeof(pFable.webServer) === 'object') { initializeRabbitMq(); } /** * Container Object for our Factory Pattern */ var tmpOratorDBUS = ( { new: createNew, Publish: Publish }); /** * CommonServices * * @property CommonServices */ Object.defineProperty(tmpOratorDBUS, 'onMessage', { get: function() { return _onMessage_Handler; }, set: function(fMessageHandler) { _onMessage_Handler = fMessageHandler; }, enumerable: false }); return tmpOratorDBUS; } return createNew(); }; module.exports = new OratorDBUS();