prisme-flow
Version:
prisme platform flow engine
96 lines (84 loc) • 2.32 kB
JavaScript
/**
* Created by prisme.io on 09/06/2017.
*/
var RED = require(process.env.NODE_RED_HOME + '/red/red')
var mosca = require('mosca')
function MQTTInNode (n) {
RED.nodes.createNode(this, n)
this.dburl = n.dburl ? n.dburl.toString() : ''
this.mqtt_port = parseInt(n.mqtt_port)
this.mqtt_ws_port = parseInt(n.mqtt_ws_port)
var moscaSettings = {
interfaces: []
}
if (this.mqtt_port) { moscaSettings.interfaces.push({type: 'mqtt', port: this.mqtt_port}) }
if (this.mqtt_ws_port) { moscaSettings.interfaces.push({type: 'http', port: this.mqtt_ws_port}) }
// TODO: read https://github.com/mcollina/mosca/blob/master/lib/server.js and add support of mqtts and wss
var node = this
node.log('Binding mosca mqtt server on port: ' + this.port)
var server = new mosca.Server(moscaSettings, function (err) {
if (err) {
err.msg = 'Error binding mosca mqtt server, cause: ' + err.toString()
node.error(err)
}
})
server.on('clientConnected', function (client) {
var msg = {
topic: 'clientConnected',
payload: client
}
node.send(msg)
})
server.on('clientDisconnected', function (client) {
var msg = {
topic: 'clientDisconnected',
payload: client
}
node.send(msg)
})
server.on('published', function (packet, client) {
var msg = {
topic: 'published',
payload: {
packet: packet,
client: client
}
}
node.send(msg)
})
server.on('subscribed', function (topic, client) {
var msg = {
topic: 'subscribed',
payload: {
topic: topic,
client: client
}
}
node.send(msg)
})
server.on('unsubscribed', function (topic, client) {
var msg = {
topic: 'unsubscribed',
payload: {
topic: topic,
client: client
}
}
node.send(msg)
})
this.on('close', function () {
node.log('Unbinding mosca mqtt server from port: ' + this.port)
server.close()
})
if (this.dburl) {
var onPersistenceReady = function () {
node.log('Persistence Ready')
persistence.wire(server)
}
var persistenceOpts = {
url: this.dburl
}
var persistence = mosca.persistence.Mongo(persistenceOpts, onPersistenceReady)
}
}
RED.nodes.registerType('MQTTInNode', MQTTInNode)