iamqp
Version:
RabbitMQ wrapper for NodeJS with several produce(reply)/consume scenarios
214 lines (183 loc) • 11.4 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>rpc/rpc_client.js - Documentation</title>
<script src="scripts/prettify/prettify.js"></script>
<script src="scripts/prettify/lang-css.js"></script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
<label for="nav-trigger" class="navicon-button x">
<div class="navicon"></div>
</label>
<label for="nav-trigger" class="overlay"></label>
<nav>
<li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Classes</li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="Common.html">Common</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="Common.html#_commonPublishPreparations">_commonPublishPreparations</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="Common.html#_emitAndDispatchError">_emitAndDispatchError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="Common.html#_logData">_logData</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="Common.html#_messageDispatcherWrapper">_messageDispatcherWrapper</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="Common.html#_parseConsumedMessage">_parseConsumedMessage</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="Common.html#_preparePublishingMessage">_preparePublishingMessage</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="Common.html#closeConnection">closeConnection</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="Common.html#getEventer">getEventer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="Common.html#isReady">isReady</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="Common.html#openConnection">openConnection</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="Common.html#toString">toString</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="ConsoleLogger.html">ConsoleLogger</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ConsoleLogger.html#error">error</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ConsoleLogger.html#info">info</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ConsoleLogger.html#log">log</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ConsoleLogger.html#warn">warn</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="FanoutConsumer.html">FanoutConsumer</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="FanoutProducer.html">FanoutProducer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="FanoutProducer.html#fanout">fanout</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="PlainConsumer.html">PlainConsumer</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="PlainProducer.html">PlainProducer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="PlainProducer.html#publish">publish</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="RpcClient.html">RpcClient</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="RpcClient.html#callRemote">callRemote</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="RpcServer.html">RpcServer</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="RpcServer.html#respond">respond</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="UUIDv4.html">UUIDv4</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="UUIDv4.html#generate">generate</a></span></li><li class="nav-heading"><a href="global.html">Globals</a></li>
</nav>
<div id="main">
<h1 class="page-title">rpc/rpc_client.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>const UUIDv4 = require('../uuid_v4')
const MESSAGES = require('../internal').MESSAGES
const _isNull = require('lodash/isNull')
const _get = require('lodash/get')
/**
* RPC client. Init example:
* <pre>
* const iamqp = require('iamqp');
* const amqpUri = 'amqp://localhost';
* const rpcChannel = 'rpc-channel-a';
* let rpcClient = new iamqp.RPCClient(amqpUri, rpcChannel);
*
* // This needs to be done or the errors will bubble up.
* rpcClient.getEventer().on('error', (err) => {
* console.log('RPC client error:' + err.message);
* });
*
* // For when the connection is established.
* rpcClient.getEventer().on('connected', () => {
* console.log('RPC client connected');
* });
*
* rpcClient.getEventer().on('reply', (reply, correlationId) => {
* console.log('RPC client got a reply (' + correlationId + '): ' + reply);
* });
*
* // Open the connection - this takes some time and is not sync
* rpcClient.openConnection();
*
* // ...
*
* // Call the RPC server with some data.
* // The correlation ID strings are to be used to distinguish replies to answers.
* let correlationIdA = rpcClient.callRemote({'a': 5});
* let correlationIdB = rpcClient.callRemote({'b': 5});
* if (correlationIdA === false) {
* console.log('call not performed on A');
* } else {
* console.log('correlationID on A: ' + correlationIdA);
* }
*
* if (correlationIdB === false) {
* console.log('call not performed on B');
* } else {
* console.log('correlationID on B: ' + correlationIdB);
* }
*
* // ...
*
* // Close the connection
* if (rpcClient.closeConnection()) {
* console.log('RPC client connection closing ...');
* }
* </pre>
* ...
*/
class RpcClient extends require('../common') {
/**
* @param {AmqpURI} amqpUri
* @param {ChannelName} channelName
* @param {Configuration} [configuration]
*/
constructor (amqpUri, channelName, configuration) {
super(amqpUri, channelName, configuration)
this._uidGenerator = new UUIDv4()
this._correlationIDStorage = {}
this._name = `RPC-CLIENT: ${this._configuration.channelName}`
this._messageDispatcherWrapper('info', MESSAGES.INIT)
this._E.on('connected', () => {
this._createChannel()
})
}
/**
* Perform the "server" call with some data.
* @param {number | string | boolean | Object | Array} contentToPublish
* @returns {boolean | string} the correlation ID of the call.
* The user can use this as to distinguish between multiple answers.
* If something went wrong, false will be returned.
*/
callRemote (contentToPublish) {
const data = this._commonPublishPreparations(contentToPublish)
if (!_isNull(data)) {
const thisCorrelationId = this._uidGenerator.generate()
this._correlationIDStorage[thisCorrelationId] = true
this._amqp.channel.sendToQueue(this._configuration.channelName, data, {
replyTo: this._amqp.queue,
correlationId: thisCorrelationId
})
return thisCorrelationId
}
return false
}
/**
* Create the channel.
* @private
*/
_createChannel () {
this._amqp.connection.createChannel((channelCreatingErr, createdChannel) => {
if (channelCreatingErr) {
this._emitAndDispatchError(`${MESSAGES.CHANNEL_ERROR} -> ${channelCreatingErr.message}`)
return
}
this._messageDispatcherWrapper('info', MESSAGES.CHANNEL_READY)
this._amqp.channel = createdChannel
this._assertQueue()
})
}
/**
* Assert the queue and bind the consumer function.
* @private
*/
_assertQueue () {
this._amqp.channel.assertQueue('', {
exclusive: true,
arguments: _get(this._configuration, 'configuration.queueArguments', {})
}, (channelAssertErr, asserted) => {
if (channelAssertErr) {
this._emitAndDispatchError(`${MESSAGES.CHANNEL_ERROR} -> ${channelAssertErr.message}`)
} else {
this._messageDispatcherWrapper('info', MESSAGES.CONSUMING)
this._amqp.queue = asserted.queue
this._amqp.channel.consume(this._amqp.queue, (data) => {
if (
!data ||
!data.properties ||
!data.properties.correlationId ||
!Object.prototype.hasOwnProperty.call(this._correlationIDStorage, data.properties.correlationId)
) {
this._emitAndDispatchError(MESSAGES.INVALID_DATA)
return
}
this._logData(data.content, 'consume')
const replied = this._parseConsumedMessage(data)
delete this._correlationIDStorage[data.properties.correlationId]
this._E.emit('reply', replied, data.properties.correlationId)
}, {
noAck: true
})
}
})
}
}
module.exports = RpcClient
</code></pre>
</article>
</section>
</div>
<br class="clear">
<footer>
Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.2</a> on Sun Aug 04 2019 22:10:47 GMT+0200 (Central European Summer Time) using the Minami theme.
</footer>
<script>prettyPrint();</script>
<script src="scripts/linenumber.js"></script>
</body>
</html>