@yhiot/utils
Version:
279 lines (239 loc) • 8.55 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createMqReceiver = createMqReceiver;
exports.createMqTransmitter = createMqTransmitter;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _amqplib = _interopRequireDefault(require("amqplib"));
var _debug2 = _interopRequireDefault(require("debug"));
/**
* websocket收发服务器,接收来自processor的消息,通过websocket发送给客户端.
* 监听 im.transceiver.<serverid>
*/
var debug = (0, _debug2.default)('app:amq');
function createMqReceiver() {
return _createMqReceiver.apply(this, arguments);
}
function _createMqReceiver() {
_createMqReceiver = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6() {
var opts,
url,
exchange,
key,
processor,
conn,
channel,
queue,
consumer,
_args6 = arguments;
return _regenerator.default.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
opts = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : {
url: 'localhost',
exchange: '<none_exchange>',
key: '<none_key>',
processor: null
};
url = opts.url, exchange = opts.exchange, key = opts.key, processor = opts.processor;
if (!(!url || !exchange || !key || !processor)) {
_context6.next = 5;
break;
}
debug('error params!', opts);
throw new Error('params missing!');
case 5:
_context6.next = 7;
return _amqplib.default.connect(url);
case 7:
conn = _context6.sent;
conn.on('close', /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() {
return _regenerator.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
debug('event close!');
case 1:
case "end":
return _context4.stop();
}
}
}, _callee4);
})));
_context6.next = 11;
return conn.createChannel();
case 11:
channel = _context6.sent;
_context6.next = 14;
return channel.assertExchange(exchange, 'topic', {
durable: false
});
case 14:
_context6.next = 16;
return channel.assertQueue('', {
exclusive: true
});
case 16:
queue = _context6.sent;
_context6.next = 19;
return channel.bindQueue(queue.queue, exchange, key);
case 19:
_context6.next = 21;
return channel.consume(queue.queue, /*#__PURE__*/function () {
var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(msg) {
var strmsg;
return _regenerator.default.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
strmsg = msg.content.toString();
debug('consume:', strmsg);
if (!processor) {
_context5.next = 5;
break;
}
_context5.next = 5;
return processor(strmsg);
case 5:
case "end":
return _context5.stop();
}
}
}, _callee5);
}));
return function (_x3) {
return _ref3.apply(this, arguments);
};
}(), {
noAck: true
});
case 21:
consumer = _context6.sent;
debug('createMqReceiver ok!', opts, consumer);
return _context6.abrupt("return", {
conn: conn,
channel: channel,
consumer: consumer
});
case 24:
case "end":
return _context6.stop();
}
}
}, _callee6);
}));
return _createMqReceiver.apply(this, arguments);
}
function createMqTransmitter() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
url: 'localhost',
exchange: '<none_exchange>'
};
var conn_channel = null;
/**
* 创建发送器,发往MQ.
* @param {json} opts
*/
function createConnChannel() {
return _createConnChannel.apply(this, arguments);
}
/**
* 发送msg到key
* key为'im.processor','im.transceiver.[serverId]'
*/
function _createConnChannel() {
_createConnChannel = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
var opts,
url,
exchange,
conn,
channel,
_args3 = arguments;
return _regenerator.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
opts = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {
url: 'localhost',
exchange: '<none_exchange>'
};
url = opts.url, exchange = opts.exchange;
_context3.next = 4;
return _amqplib.default.connect(url);
case 4:
conn = _context3.sent;
conn.on('close', /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
debug('event close! need restart after 10 sencods?');
conn_channel = null;
case 2:
case "end":
return _context2.stop();
}
}
}, _callee2);
})));
_context3.next = 8;
return conn.createChannel();
case 8:
channel = _context3.sent;
channel.assertExchange(exchange, 'topic', {
durable: false
});
debug('createMqTransmitter ok!', opts);
return _context3.abrupt("return", {
conn: conn,
channel: channel
});
case 12:
case "end":
return _context3.stop();
}
}
}, _callee3);
}));
return _createConnChannel.apply(this, arguments);
}
return /*#__PURE__*/function () {
var _send = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(msg, key) {
var strmsg, result;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (conn_channel) {
_context.next = 4;
break;
}
_context.next = 3;
return createConnChannel(opts);
case 3:
conn_channel = _context.sent;
case 4:
strmsg = JSON.stringify(msg);
_context.next = 7;
return conn_channel.channel.publish(opts.exchange, key, Buffer.from(strmsg));
case 7:
result = _context.sent;
debug('+send:', key, strmsg, result);
return _context.abrupt("return", true);
case 10:
case "end":
return _context.stop();
}
}
}, _callee);
}));
function send(_x, _x2) {
return _send.apply(this, arguments);
}
return send;
}();
}