UNPKG

rocket.chat.mqtt

Version:

It's a MQTT Server, using redis to scale horizontally.

104 lines (84 loc) 2.13 kB
'use strict' var mqtt = require('mqtt-connection') var through = require('through2') var aedes = require('../') var duplexify = require('duplexify') var parseStream = mqtt.parseStream var generateStream = mqtt.generateStream var clients = 0 function setup (broker, autoClose) { var inStream = generateStream() var outStream = parseStream() var conn = duplexify(outStream, inStream) broker = broker || aedes() broker.handle(conn) if (autoClose === undefined || autoClose) { setTimeout(function () { broker.close() }, autoClose || 200) } return { conn: conn, inStream: inStream, outStream: outStream, broker: broker } } function connect (s, opts, connected) { s = Object.create(s) s.outStream = s.outStream.pipe(through.obj(filter)) opts = opts || {} opts.cmd = 'connect' opts.protocolId = 'MQTT' opts.version = 4 opts.clean = !!opts.clean opts.clientId = opts.clientId || 'my-client-' + clients++ opts.keepalive = opts.keepalive || 0 s.inStream.write(opts) return s function filter (packet, enc, cb) { if (packet.cmd !== 'publish') { delete packet.topic delete packet.payload } // using setImmediate to wait for connected to be fired // setup also needs to return first if (packet.cmd !== 'connack') { setImmediate(this.push.bind(this, packet)) } else if (connected) { setImmediate(connected, packet) } cb() } } function noError (s, t) { s.broker.on('clientError', function (client, err) { if (err) throw err t.notOk(err, 'must not error') }) return s } function subscribe (t, subscriber, topic, qos, done) { subscriber.inStream.write({ cmd: 'subscribe', messageId: 24, subscriptions: [{ topic: topic, qos: qos }] }) subscriber.outStream.once('data', function (packet) { t.equal(packet.cmd, 'suback') t.deepEqual(packet.granted, [qos]) t.equal(packet.messageId, 24) if (done) { done(null, packet) } }) } module.exports = { setup: setup, connect: connect, noError: noError, subscribe: subscribe }