hermesjs-mqtt
Version:
MQTT adapter for HermesJS
82 lines (67 loc) • 1.97 kB
JavaScript
const mqtt = require('mqtt');
const { Adapter, Message } = require('hermesjs');
class MqttAdapter extends Adapter {
name () {
return 'MQTT adapter'
}
async connect () {
return this._connect();
}
async send (message, options) {
return this._send(message, options);
}
_connect () {
return new Promise((resolve) => {
var host = this.options.url || 'mqtt://localhost';
var config = this.options.config;
this.client = mqtt.connect(host, config);
this.client.on('connect', () => {
this.emit('connect', { name: 'MQTT adapter', adapter: this });
if (Array.isArray(this.options.topics)) {
this.options.topics.forEach((topic) => {
this.client.subscribe(topic || '#', {
qos: this.options.qos || 0
});
});
} else if (typeof this.options.topics === 'string') {
this.client.subscribe(this.options.topics || '#', {
qos: this.options.qos || 0
});
}
this.client.on('message', (topic, message, packet) => {
const msg = this._createMessage(packet);
this.emit('message', msg);
});
resolve(this);
});
this.client.on('error', (error) => {
this.emit('error', error);
});
});
}
_send (message, options) {
return new Promise((resolve, reject) => {
this.client.publish(message.topic, message.payload, options || {
qos: this.options.qos || 0,
retain: this.options.retain || false
}, (err) => {
if (err) {
reject(err);
return;
}
resolve();
});
});
}
_createMessage (packet) {
const headers = {
cmd: packet.cmd,
retain: packet.retain,
qos: packet.qos,
dup: packet.dup,
length: packet.length
};
return new Message(this.hermes, packet.payload, headers, packet.topic);
}
}
module.exports = MqttAdapter;