forked from hubotio/hubot-redis-brain
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathredis-brain.js
112 lines (93 loc) · 3.07 KB
/
redis-brain.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
'use strict'
// Description:
// Persist hubot's brain to redis
//
// Configuration:
// REDISTOGO_URL or REDISCLOUD_URL or BOXEN_REDIS_URL or REDIS_URL.
// URL format: redis://<host>:<port>[/<brain_prefix>]
// URL format (UNIX socket): redis://<socketpath>[?<brain_prefix>]
// If not provided, '<brain_prefix>' will default to 'hubot'.
// REDIS_NO_CHECK - set this to avoid ready check (for exampel when using Twemproxy)
//
// Commands:
// None
const URL = require('url').URL
const Redis = require('redis')
module.exports = function (robot) {
let client, prefix
const redisUrlEnv = getRedisEnv()
const redisUrl = process.env[redisUrlEnv] || 'redis://localhost:6379'
if (redisUrlEnv) {
robot.logger.info(`hubot-redis-brain: Discovered redis from ${redisUrlEnv} environment variable`)
} else {
robot.logger.info('hubot-redis-brain: Using default redis on localhost:6379')
}
if (process.env.REDIS_NO_CHECK) {
robot.logger.info('Turning off redis ready checks')
}
const info = new URL(redisUrl)
if (info.hostname === '') {
client = Redis.createClient(info.pathname)
prefix = (info.query ? info.query.toString() : undefined) || 'hubot'
} else {
client = (info.auth || process.env.REDIS_NO_CHECK)
? Redis.createClient(info.port, info.hostname, { no_ready_check: true })
: Redis.createClient(info.port, info.hostname)
prefix = (info.path ? info.path.replace('/', '') : undefined) || 'hubot'
}
robot.brain.setAutoSave(false)
const getData = () =>
client.get(`${prefix}:storage`, function (err, reply) {
if (err) {
throw err
} else if (reply) {
robot.logger.info(`hubot-redis-brain: Data for ${prefix} brain retrieved from Redis`)
robot.brain.mergeData(JSON.parse(reply.toString()))
robot.brain.emit('connected')
} else {
robot.logger.info(`hubot-redis-brain: Initializing new data for ${prefix} brain`)
robot.brain.mergeData({})
robot.brain.emit('connected')
}
robot.brain.setAutoSave(true)
})
if (info.auth) {
client.auth(info.auth.split(':')[1], function (err) {
if (err) {
return robot.logger.error('hubot-redis-brain: Failed to authenticate to Redis')
}
robot.logger.info('hubot-redis-brain: Successfully authenticated to Redis')
getData()
})
}
client.on('error', function (err) {
if (!/ECONNREFUSED/.test(err.message)) {
robot.logger.error(err.stack)
}
})
client.on('connect', function () {
robot.logger.debug('hubot-redis-brain: Successfully connected to Redis')
if (!info.auth) { getData() }
})
robot.brain.on('save', (data) => {
if (!data) {
data = {}
}
client.set(`${prefix}:storage`, JSON.stringify(data))
})
robot.brain.on('close', () => client.quit())
}
function getRedisEnv () {
if (process.env.REDISTOGO_URL) {
return 'REDISTOGO_URL'
}
if (process.env.REDISCLOUD_URL) {
return 'REDISCLOUD_URL'
}
if (process.env.BOXEN_REDIS_URL) {
return 'BOXEN_REDIS_URL'
}
if (process.env.REDIS_URL) {
return 'REDIS_URL'
}
}