prisme-flow
Version:
prisme platform flow engine
94 lines (86 loc) • 2.73 kB
JavaScript
/**
* Created by prisme.io on 09/06/2017.
*/
module.exports = function (RED) {
'use strict'
var redis = require('redis')
var hashFieldRE = /^([^=]+)=(.*)$/
var redisConnectionPool = (function () {
var connections = {}
var obj = {
get: function (host, port) {
var id = host + ':' + port
if (!connections[id]) {
connections[id] = redis.createClient(port, host)
connections[id].on('error', function (err) {
RED.log.error(err)
})
connections[id]._id = id
connections[id]._nodeCount = 0
}
connections[id]._nodeCount += 1
return connections[id]
},
close: function (connection) {
connection._nodeCount -= 1
if (connection._nodeCount === 0) {
if (connection) {
clearTimeout(connection.retry_timer)
connection.end()
}
delete connections[connection._id]
}
}
}
return obj
}())
function RedisOutNode (n) {
RED.nodes.createNode(this, n)
this.port = n.port || '6379'
this.hostname = n.hostname || '127.0.0.1'
this.key = n.key
this.structtype = n.structtype
this.client = redisConnectionPool.get(this.hostname, this.port)
if (this.client.connected) {
this.status({fill: 'green', shape: 'dot', text: 'connected'})
} else {
this.status({fill: 'red', shape: 'ring', text: 'disconnected'}, true)
}
var node = this
this.client.on('end', function () {
node.status({fill: 'red', shape: 'ring', text: 'disconnected'})
})
this.client.on('connect', function () {
node.status({fill: 'green', shape: 'dot', text: 'connected'})
})
this.on('input', function (msg) {
var k = this.key || msg.topic
if (k) {
if (this.structtype == 'string') {
this.client.set(k, RED.util.ensureString(msg.payload))
} else if (this.structtype == 'hash') {
if (typeof msg.payload === 'object') {
this.client.hmset(k, msg.payload)
} else {
var r = hashFieldRE.exec(msg.payload)
if (r) {
this.client.hset(k, r[1], r[2])
} else {
this.warn(RED._('Invalid payload for redis hash'))
}
}
} else if (this.structtype == 'set') {
this.client.sadd(k, msg.payload)
} else if (this.structtype == 'list') {
this.client.rpush(k, msg.payload)
}
} else {
this.warn(RED._('No key or topic set'))
}
})
this.on('close', function () {
redisConnectionPool.close(node.client)
})
}
RED.nodes.registerType('redis out', RedisOutNode)
}