@dfeidao/send-msg
Version:
消息总线
109 lines (108 loc) • 4.11 kB
JavaScript
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;
});