orator-dbus
Version:
Orator DBUS queue for RabbitMQ fanout exchange
147 lines (127 loc) • 4.34 kB
JavaScript
/**
* 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();