UNPKG

@dfeidao/send-msg

Version:

消息总线

109 lines (108 loc) 4.11 kB
var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; (function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define(["require", "exports", "mqtt", "../utils/global"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.listen = exports.push = void 0; const mqtt_1 = require("mqtt"); const global_1 = __importDefault(require("../utils/global")); function get_client(logger) { return new Promise((resolve) => { if (global_1.default.mqtt_client) { resolve(global_1.default.mqtt_client); } else { const uri = global_1.default.mqtt_uri; const client = (0, mqtt_1.connect)(uri); client.on('connect', () => { logger.info('MQTT connected'); resolve(global_1.default.mqtt_client = client); }); client.on('error', (err) => { logger.info('MQTT Error: [' + err.name + ']' + err.message); }); } }); } async function on(topic, callback, logger) { async function listener(_topic, message) { if (topic === _topic) { const msg = message.toString('utf8'); logger.debug('Message comming: topic=[' + _topic + '],msg=' + msg); callback(msg); } } const client = await get_client(logger); client.subscribe(topic); client.addListener('message', listener); return { remove() { client.unsubscribe(topic); client.removeListener('message', listener); } }; } /** * Push message to any mqtt client */ async function push(topic, body, logger) { const client = await get_client(logger); logger.info(`pushing message, topic=[${topic}], msg = ${body}`); client.publish(topic, body); } exports.push = push; /** * Listen mqtt message */ function listen(topic, callback, logger) { logger.info(`start listening to mqtt, topic=[${topic}]`); return on(topic, async (msg) => { try { await callback(msg); } catch (err) { logger.error('Failling sendding message.' + err.message); } }, logger); } exports.listen = listen; function publish(topic, response_topic, msg, timeout, logger) { return new Promise(async (resolve, reject) => { const handler = await on(response_topic, (_msg) => { clearTimeout(timmer); handler.remove(); try { const m = JSON.parse(_msg); if (m && m.err_code !== 1) { reject(new Error(JSON.stringify({ msg: m.err_msg, detail: m.msg }))); } else { resolve(m.msg); } } catch (e) { logger.trace(e); reject(new Error(JSON.stringify({ msg: e.message, detail: e.stack }))); } }, logger); const timmer = setTimeout(() => { handler.remove(); logger.error(`Timeout, topic = ${topic}, msg = ${msg}`); reject(new Error(JSON.stringify({ msg: 'Timeout', detail: `Timeout while sendding message:${msg}.` }))); }, timeout); logger.debug(`Calling message, topic=[${topic}], msg = ${msg}`); const client = await get_client(logger); client.publish(topic, msg); }); } exports.default = publish; });