amqp-model
Version:
Model for connecting to Amqp and simply publish or subscribe messages.
358 lines (292 loc) • 12.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _amqp = require('amqp');
var _amqp2 = _interopRequireDefault(_amqp);
var _connection = require('amqp/lib/connection');
var _connection2 = _interopRequireDefault(_connection);
var _async = require('async');
var _async2 = _interopRequireDefault(_async);
var _AmqpModelError = require('./AmqpModelError');
var _AmqpModelError2 = _interopRequireDefault(_AmqpModelError);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var defaultQueueOptions = {
durable: true,
autoDelete: false
};
var defaultExchangeOptions = {
autoDelete: false,
durable: true,
confirm: true
};
var IAmqpModel = function () {
/**
*
* @param connection
* @param exchangeOptions
* @param queueOptions
* @param subscribeOptions
* @param queueName
* @param exchangeName
* @param bind
* @param onReady
* @param onError
* @param routingKey
* @param publishOptions
*/
function IAmqpModel(_ref) {
var connection = _ref.connection,
_ref$exchangeOptions = _ref.exchangeOptions,
exchangeOptions = _ref$exchangeOptions === undefined ? {} : _ref$exchangeOptions,
_ref$queueOptions = _ref.queueOptions,
queueOptions = _ref$queueOptions === undefined ? {} : _ref$queueOptions,
_ref$subscribeOptions = _ref.subscribeOptions,
subscribeOptions = _ref$subscribeOptions === undefined ? {
ack: true
} : _ref$subscribeOptions,
_ref$queueName = _ref.queueName,
queueName = _ref$queueName === undefined ? null : _ref$queueName,
_ref$exchangeName = _ref.exchangeName,
exchangeName = _ref$exchangeName === undefined ? null : _ref$exchangeName,
_ref$bind = _ref.bind,
bind = _ref$bind === undefined ? false : _ref$bind,
_ref$onReady = _ref.onReady,
onReady = _ref$onReady === undefined ? function () {} : _ref$onReady,
_ref$onError = _ref.onError,
onError = _ref$onError === undefined ? function () {} : _ref$onError,
_ref$routingKey = _ref.routingKey,
routingKey = _ref$routingKey === undefined ? '#' : _ref$routingKey,
_ref$publishOptions = _ref.publishOptions,
publishOptions = _ref$publishOptions === undefined ? {
contentType: 'application/json'
} : _ref$publishOptions;
_classCallCheck(this, IAmqpModel);
this._queueName = queueName;
this._exchangeName = exchangeName;
this._bind = bind;
this._queueOptions = _extends({}, defaultQueueOptions, queueOptions);
this._exchangeOptions = _extends({}, defaultExchangeOptions, exchangeOptions);
this._subscribeOptions = subscribeOptions;
this._routingKey = routingKey;
this._publishOptions = publishOptions;
this._queue = null;
this._exchange = null;
this._consumerTags = [];
this._publishWaitingList = [];
this._subscribeWaitingList = [];
this._initConnection(connection, onReady, onError);
}
_createClass(IAmqpModel, [{
key: '_initConnection',
value: async function _initConnection(connection, onReady) {
var _this = this;
var onError = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
if (connection instanceof _connection2.default) {
this._connection = connection;
await this._afterConnect();
} else {
this._connection = _amqp2.default.createConnection(connection);
this._connection.on('ready', async function () {
await _this._afterConnect();
if (typeof onReady === 'function') {
await onReady();
}
});
}
if (typeof onError === 'function') {
this._connection.on('error', onError);
}
}
}, {
key: '_afterConnect',
value: async function _afterConnect() {
await this._initQueue(this._queueName);
await this._initExchange(this._exchangeName);
await this._initBind(this._bind);
await this._handleWaitingLists();
}
}, {
key: '_initQueue',
value: function _initQueue(queueName) {
var _this2 = this;
return new Promise(function (resolve, reject) {
if (!queueName) {
return resolve();
}
_this2._connection.queue(queueName, _this2._queueOptions, function (queue) {
if (!queue) {
return reject('Queue initialization failed');
}
_this2._queue = queue;
resolve();
});
});
}
}, {
key: '_initExchange',
value: function _initExchange(exchangeName) {
var _this3 = this;
return new Promise(function (resolve, reject) {
if (!exchangeName) {
return resolve();
}
_this3._connection.exchange(exchangeName, _this3._exchangeOptions, function (exchange) {
if (!exchange) {
return reject('Exchange initialization failed');
}
_this3._exchange = exchange;
resolve();
});
});
}
}, {
key: '_initBind',
value: function _initBind(bind) {
var _this4 = this;
return new Promise(function (resolve, reject) {
if (!bind) {
return resolve();
}
_this4._queue.bind(_this4._exchange.name, _this4._routingKey, function () {
resolve();
});
});
}
}, {
key: '_handleWaitingLists',
value: function _handleWaitingLists() {
var _this5 = this;
var runWaitingItem = function runWaitingItem(item, next) {
var f = item[0];
var res = item[1];
var rej = item[2];
f(function () {
res.apply(arguments);
next();
}, function () {
rej.apply(arguments);
next();
});
};
var handleList = function handleList(list) {
return function (cb) {
_async2.default.each(list, runWaitingItem, cb);
};
};
return new Promise(function (resolve, reject) {
_async2.default.waterfall([handleList(_this5._subscribeWaitingList), handleList(_this5._publishWaitingList)], function (err) {
if (err) {
return reject(err);
}
resolve();
});
});
}
/**
* Publish message to exchange
*
* @param message
* @param options
* @param routingKey
* @return {Promise}
*/
}, {
key: 'publish',
value: function publish(message) {
var _this6 = this;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var routingKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this._routingKey;
if (!this._exchangeName) {
throw new _AmqpModelError2.default('Exchange is not set.');
}
var publishOptions = _extends({}, this._publishOptions, options);
var publishMessage = function publishMessage(resolve, reject) {
var publishCallback = !_this6._exchangeOptions.confirm ? null : function (isError, err) {
if (isError) {
return reject(err);
}
resolve();
};
_this6._exchange.publish(routingKey, message, publishOptions, publishCallback);
if (!_this6._exchangeOptions.confirm) {
resolve();
}
};
return new Promise(function (resolve, reject) {
if (!_this6._exchange) {
return _this6._publishWaitingList.push([publishMessage, resolve, reject]);
}
publishMessage(resolve, reject);
});
}
/**
*
* @param fn
* @param subscribeOptions
*/
}, {
key: 'queueByOne',
value: function queueByOne(fn) {
var _this7 = this;
var subscribeOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (!this._queueName) {
throw new _AmqpModelError2.default('Queue is not set.');
}
var next = function next() {
_this7._queue.shift();
};
var options = _extends({}, this._subscribeOptions, subscribeOptions);
var subscribeQueue = function subscribeQueue(resolve, reject) {
_this7._queue.subscribe(options, function (message, headers, deliveryInfo, messageObject) {
fn(message, next);
}).addCallback(function (ok) {
_this7._consumerTags.push(ok.consumerTag);
resolve(ok.consumerTag);
});
};
return new Promise(function (resolve, reject) {
if (!_this7._queue) {
return _this7._subscribeWaitingList.push([subscribeQueue, resolve, reject]);
}
subscribeQueue(resolve, reject);
});
}
}, {
key: 'disconnect',
value: function disconnect() {
return this._connection.disconnect();
}
}, {
key: 'unsubscribe',
value: function unsubscribe(cTag) {
var _this8 = this;
return new Promise(function (resolve, reject) {
_this8._queue.unsubscribe(cTag).addCallback(function () {
_this8._consumerTags.splice(_this8._consumerTags.indexOf(cTag), 1);
resolve();
});
});
}
}, {
key: 'unsubscribeAll',
value: function unsubscribeAll() {
var _this9 = this;
return new Promise(function (resolve, reject) {
_async2.default.each(_this9._consumerTags, async function (cTag) {
await _this9.unsubscribe(cTag);
}, function (err) {
if (err) {
return reject(err);
}
resolve();
});
});
}
}]);
return IAmqpModel;
}();
exports.default = IAmqpModel;