cloudcms-server 0.9.256 → 0.9.257
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/broadcast/providers/redis.js +24 -49
- package/clients/nrp.js +117 -0
- package/clients/redis.js +48 -0
- package/locks/providers/redis.js +17 -25
- package/middleware/admin/admin.js +2 -2
- package/middleware/awareness/providers/redis.js +224 -179
- package/middleware/cache/providers/redis.js +125 -64
- package/package.json +1 -2
- package/server/index.js +13 -18
- package/util/redis.js +51 -1
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
var
|
|
1
|
+
var redisClientFactory = require("../../clients/redis");
|
|
2
|
+
var redisHelper = require("../../util/redis");
|
|
2
3
|
|
|
3
|
-
var NRP = require(
|
|
4
|
-
|
|
5
|
-
var logFactory = require("../../util/logger");
|
|
4
|
+
var NRP = require("../../clients/nrp");
|
|
6
5
|
|
|
7
6
|
/**
|
|
8
7
|
* Redis broadcast provider.
|
|
@@ -12,55 +11,31 @@ var logFactory = require("../../util/logger");
|
|
|
12
11
|
exports = module.exports = function(broadcastConfig)
|
|
13
12
|
{
|
|
14
13
|
var nrp = null;
|
|
15
|
-
|
|
16
|
-
var logger =
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
// allow for global redis default
|
|
20
|
-
// allow for redis broadcast specific
|
|
21
|
-
// otherwise default to "error"
|
|
22
|
-
if (typeof(process.env.CLOUDCMS_REDIS_DEBUG_LEVEL) !== "undefined") {
|
|
23
|
-
logger.setLevel(("" + process.env.CLOUDCMS_REDIS_DEBUG_LEVEL).toLowerCase(), true);
|
|
24
|
-
}
|
|
25
|
-
else if (typeof(process.env.CLOUDCMS_BROADCAST_REDIS_DEBUG_LEVEL) !== "undefined") {
|
|
26
|
-
logger.setLevel(("" + process.env.CLOUDCMS_BROADCAST_REDIS_DEBUG_LEVEL).toLowerCase(), true);
|
|
27
|
-
}
|
|
28
|
-
|
|
14
|
+
|
|
15
|
+
var logger = redisHelper.redisLogger("REDIS_BROADCAST", "CLOUDCMS_BROADCAST_", "error")
|
|
16
|
+
|
|
29
17
|
var r = {};
|
|
30
18
|
|
|
31
19
|
r.start = function(callback)
|
|
32
20
|
{
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
var nrpConfig = {
|
|
54
|
-
"port": redisPort,
|
|
55
|
-
"host": redisEndpoint,
|
|
56
|
-
"scope": "broadcast_cache"
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
logger.info("using config = " + nrpConfig);
|
|
60
|
-
|
|
61
|
-
nrp = new NRP(nrpConfig);
|
|
62
|
-
|
|
63
|
-
callback();
|
|
21
|
+
redisClientFactory.create(broadcastConfig, function(err, client) {
|
|
22
|
+
|
|
23
|
+
if (err) {
|
|
24
|
+
return callback(err);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var nrpConfig = {
|
|
28
|
+
"client": client,
|
|
29
|
+
"scope": "broadcast_cache"
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
logger.info("using config = " + nrpConfig);
|
|
33
|
+
|
|
34
|
+
nrp = new NRP(nrpConfig);
|
|
35
|
+
nrp.connect(function(err) {
|
|
36
|
+
callback(err);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
64
39
|
};
|
|
65
40
|
|
|
66
41
|
r.publish = function(topic, message, callback)
|
package/clients/nrp.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// a revision of
|
|
2
|
+
// https://raw.githubusercontent.com/louischatriot/node-redis-pubsub/master/lib/node-redis-pubsub.js
|
|
3
|
+
// that works with Redis 6+
|
|
4
|
+
|
|
5
|
+
"use strict";
|
|
6
|
+
var redis = require('redis');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Create a new NodeRedisPubsub instance that can subscribe to channels and publish messages
|
|
10
|
+
* @param {Object} options Options for the client creations:
|
|
11
|
+
* client - a connected Redis client
|
|
12
|
+
* scope - Optional, two NodeRedisPubsubs with different scopes will not share messages
|
|
13
|
+
*/
|
|
14
|
+
function NodeRedisPubsub(options)
|
|
15
|
+
{
|
|
16
|
+
if (!(this instanceof NodeRedisPubsub)){ return new NodeRedisPubsub(options); }
|
|
17
|
+
|
|
18
|
+
options || (options = {});
|
|
19
|
+
|
|
20
|
+
this.emitter = options.client.duplicate();
|
|
21
|
+
this.emitter.setMaxListeners(0);
|
|
22
|
+
this.receiver = options.client.duplicate();
|
|
23
|
+
this.receiver.setMaxListeners(0);
|
|
24
|
+
|
|
25
|
+
this.prefix = options.scope ? options.scope + ':' : '';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
NodeRedisPubsub.prototype.connect = function(callback)
|
|
29
|
+
{
|
|
30
|
+
var self = this;
|
|
31
|
+
|
|
32
|
+
(async function() {
|
|
33
|
+
await self.emitter.connect();
|
|
34
|
+
await self.receiver.connect();
|
|
35
|
+
callback();
|
|
36
|
+
})();
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Subscribe to a channel
|
|
41
|
+
* @param {String} channel The channel to subscribe to, can be a pattern e.g. 'user.*'
|
|
42
|
+
* @param {Function} handler Function to call with the received message.
|
|
43
|
+
* @param {Function} cb Optional callback to call once the handler is registered.
|
|
44
|
+
*/
|
|
45
|
+
NodeRedisPubsub.prototype.on = NodeRedisPubsub.prototype.subscribe = function(channel, handler, callback)
|
|
46
|
+
{
|
|
47
|
+
if (!callback)
|
|
48
|
+
{
|
|
49
|
+
callback = function(){};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
var self = this;
|
|
53
|
+
|
|
54
|
+
if (channel === "error")
|
|
55
|
+
{
|
|
56
|
+
self.errorHandler = handler;
|
|
57
|
+
self.emitter.on("error", handler);
|
|
58
|
+
self.receiver.on("error", handler);
|
|
59
|
+
return callback();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
var listener = function(self, handler)
|
|
63
|
+
{
|
|
64
|
+
return function(message, channel) {
|
|
65
|
+
|
|
66
|
+
var jsonmsg = message;
|
|
67
|
+
try{
|
|
68
|
+
jsonmsg = JSON.parse(message);
|
|
69
|
+
} catch (ex){
|
|
70
|
+
if(typeof self.errorHandler === 'function'){
|
|
71
|
+
return self.errorHandler("Invalid JSON received! Channel: " + self.prefix + channel + " Message: " + message);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return handler(jsonmsg, channel);
|
|
75
|
+
}
|
|
76
|
+
}(self, handler);
|
|
77
|
+
|
|
78
|
+
(async function() {
|
|
79
|
+
await self.receiver.pSubscribe(self.prefix + channel, listener);
|
|
80
|
+
})();
|
|
81
|
+
|
|
82
|
+
callback();
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Emit an event
|
|
87
|
+
* @param {String} channel Channel on which to emit the message
|
|
88
|
+
* @param {Object} message
|
|
89
|
+
*/
|
|
90
|
+
NodeRedisPubsub.prototype.emit = NodeRedisPubsub.prototype.publish = function (channel, message)
|
|
91
|
+
{
|
|
92
|
+
var self = this;
|
|
93
|
+
|
|
94
|
+
(async function() {
|
|
95
|
+
return await self.emitter.publish(self.prefix + channel, JSON.stringify(message));
|
|
96
|
+
})();
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Safely close the redis connections 'soon'
|
|
101
|
+
*/
|
|
102
|
+
NodeRedisPubsub.prototype.quit = function()
|
|
103
|
+
{
|
|
104
|
+
this.emitter.quit();
|
|
105
|
+
this.receiver.quit();
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Dangerously close the redis connections immediately
|
|
110
|
+
*/
|
|
111
|
+
NodeRedisPubsub.prototype.end = function()
|
|
112
|
+
{
|
|
113
|
+
this.emitter.end(true);
|
|
114
|
+
this.receiver.end(true);
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
module.exports = NodeRedisPubsub;
|
package/clients/redis.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
var redis = require("redis");
|
|
2
|
+
var redisHelper = require("../util/redis");
|
|
3
|
+
|
|
4
|
+
var clients = {};
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Redis client factory.
|
|
8
|
+
*
|
|
9
|
+
* @type {*}
|
|
10
|
+
*/
|
|
11
|
+
exports = module.exports = {};
|
|
12
|
+
|
|
13
|
+
var create = exports.create = function(config, callback)
|
|
14
|
+
{
|
|
15
|
+
if (typeof(config) === "function") {
|
|
16
|
+
callback = config;
|
|
17
|
+
config = {};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (!config) {
|
|
21
|
+
config = {};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
var redisOptions = redisHelper.redisOptions(config);
|
|
25
|
+
var url = redisOptions.url;
|
|
26
|
+
|
|
27
|
+
// cached client?
|
|
28
|
+
var client = clients[url];
|
|
29
|
+
if (client) {
|
|
30
|
+
return callback(null, client);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// connect
|
|
34
|
+
(async function() {
|
|
35
|
+
await redisHelper.createAndConnect(redisOptions, function(err, client) {
|
|
36
|
+
|
|
37
|
+
if (err) {
|
|
38
|
+
return callback(err);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// cache it
|
|
42
|
+
clients[url] = client;
|
|
43
|
+
|
|
44
|
+
// return
|
|
45
|
+
return callback(null, client);
|
|
46
|
+
});
|
|
47
|
+
})();
|
|
48
|
+
};
|
package/locks/providers/redis.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
var path = require("path");
|
|
2
|
-
var redis = require("redis");
|
|
3
1
|
var logFactory = require("../../util/logger");
|
|
4
|
-
var redisHelper = require("../../util/redis");
|
|
2
|
+
//var redisHelper = require("../../util/redis");
|
|
3
|
+
|
|
4
|
+
var redisClientFactory = require("../../clients/redis");
|
|
5
|
+
const redisHelper = require("../../util/redis");
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Redis lock service.
|
|
@@ -17,33 +18,24 @@ exports = module.exports = function(locksConfig)
|
|
|
17
18
|
delay: 50
|
|
18
19
|
});
|
|
19
20
|
|
|
20
|
-
var nrp = null;
|
|
21
21
|
var client = null;
|
|
22
|
-
|
|
23
|
-
var logger =
|
|
24
|
-
|
|
25
|
-
// allow for global redis default
|
|
26
|
-
// allow for redis broadcast specific
|
|
27
|
-
// otherwise default to error
|
|
28
|
-
if (typeof(process.env.CLOUDCMS_REDIS_DEBUG_LEVEL) !== "undefined") {
|
|
29
|
-
logger.setLevel(("" + process.env.CLOUDCMS_REDIS_DEBUG_LEVEL).toLowerCase(), true);
|
|
30
|
-
}
|
|
31
|
-
else if (typeof(process.env.CLOUDCMS_LOCKS_REDIS_DEBUG_LEVEL) !== "undefined") {
|
|
32
|
-
logger.setLevel(("" + process.env.CLOUDCMS_LOCKS_REDIS_DEBUG_LEVEL).toLowerCase(), true);
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
logger.setLevel("error");
|
|
36
|
-
}
|
|
37
|
-
|
|
22
|
+
|
|
23
|
+
var logger = redisHelper.redisLogger("REDIS_LOCKS", "CLOUDCMS_LOCKS_", "error")
|
|
24
|
+
|
|
38
25
|
var r = {};
|
|
39
26
|
|
|
40
27
|
r.init = function(callback)
|
|
41
28
|
{
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
29
|
+
redisClientFactory.create(locksConfig, function(err, _client) {
|
|
30
|
+
|
|
31
|
+
if (err) {
|
|
32
|
+
return callback(err);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
client = _client;
|
|
36
|
+
|
|
37
|
+
return callback();
|
|
38
|
+
});
|
|
47
39
|
};
|
|
48
40
|
|
|
49
41
|
r.lock = function(key, fn)
|
|
@@ -18,7 +18,7 @@ exports = module.exports = function()
|
|
|
18
18
|
{
|
|
19
19
|
var z = ref.indexOf("://");
|
|
20
20
|
|
|
21
|
-
var type = ref.substring(0, z
|
|
21
|
+
var type = ref.substring(0, z);
|
|
22
22
|
var identifier = ref.substring(z + 3);
|
|
23
23
|
|
|
24
24
|
var parts = identifier.split("/").reverse();
|
|
@@ -132,7 +132,7 @@ exports = module.exports = function()
|
|
|
132
132
|
{
|
|
133
133
|
assertAuthenticated(req, res, function() {
|
|
134
134
|
|
|
135
|
-
doResetCache(req.virtualHost, req.ref, function(err) {
|
|
135
|
+
doResetCache(req.virtualHost, req.query.ref, function(err) {
|
|
136
136
|
completionFn(req.virtualHost, res, err);
|
|
137
137
|
});
|
|
138
138
|
|
|
@@ -1,132 +1,152 @@
|
|
|
1
1
|
var AbstractAsyncProvider = require("./abstract-async");
|
|
2
2
|
|
|
3
|
-
var redis = require("redis");
|
|
3
|
+
//var redis = require("redis");
|
|
4
4
|
var async = require("async");
|
|
5
5
|
|
|
6
6
|
var logFactory = require("../../../util/logger");
|
|
7
|
-
var redisHelper = require("../../../util/redis");
|
|
7
|
+
//var redisHelper = require("../../../util/redis");
|
|
8
|
+
|
|
9
|
+
var redisClientFactory = require("../../../clients/redis");
|
|
10
|
+
const redisHelper = require("../../../util/redis");
|
|
8
11
|
|
|
9
12
|
class RedisProvider extends AbstractAsyncProvider
|
|
10
13
|
{
|
|
11
14
|
constructor(config)
|
|
12
15
|
{
|
|
13
16
|
super(config);
|
|
14
|
-
|
|
15
|
-
this.logger =
|
|
16
|
-
|
|
17
|
-
// allow for global redis default
|
|
18
|
-
// allow for redis broadcast specific
|
|
19
|
-
// otherwise default to error
|
|
20
|
-
if (typeof(process.env.CLOUDCMS_REDIS_DEBUG_LEVEL) !== "undefined") {
|
|
21
|
-
this.logger.setLevel(("" + process.env.CLOUDCMS_REDIS_DEBUG_LEVEL).toLowerCase(), true);
|
|
22
|
-
}
|
|
23
|
-
else if (typeof(process.env.CLOUDCMS_AWARENESS_REDIS_DEBUG_LEVEL) !== "undefined") {
|
|
24
|
-
this.logger.setLevel(("" + process.env.CLOUDCMS_AWARENESS_REDIS_DEBUG_LEVEL).toLowerCase(), true);
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
this.logger.setLevel("error");
|
|
28
|
-
}
|
|
17
|
+
|
|
18
|
+
this.logger = redisHelper.redisLogger("REDIS_AWARENESS", "CLOUDCMS_AWARENESS_", "error")
|
|
29
19
|
}
|
|
30
20
|
|
|
31
21
|
init(callback)
|
|
32
22
|
{
|
|
33
23
|
var self = this;
|
|
24
|
+
|
|
25
|
+
redisClientFactory.create(config, function(err, _client) {
|
|
26
|
+
|
|
27
|
+
if (err) {
|
|
28
|
+
return callback(err);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
self.client = _client;
|
|
32
|
+
|
|
33
|
+
return callback();
|
|
34
|
+
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
(async function() {
|
|
38
|
+
var redisOptions = redisHelper.redisOptions(this.config, "CLOUDCMS_AWARENESS");
|
|
39
|
+
await redisHelper.createAndConnect(redisOptions, function(err, _client) {
|
|
34
40
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
this.client = redis.createClient(redisOptions);
|
|
38
|
-
|
|
39
|
-
callback();
|
|
41
|
+
});
|
|
42
|
+
})();
|
|
40
43
|
}
|
|
41
44
|
|
|
42
45
|
readOrCreateChannel(channelId, callback)
|
|
43
46
|
{
|
|
44
47
|
var self = this;
|
|
48
|
+
|
|
49
|
+
(async function() {
|
|
45
50
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (err) {
|
|
49
|
-
return callback(err);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (channelJsonText)
|
|
53
|
-
{
|
|
54
|
-
var channel = JSON.parse("" + channelJsonText);
|
|
55
|
-
return callback(null, channel);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
var channel = {};
|
|
59
|
-
self.client.set("channel-" + channelId, JSON.stringify(channel), function(err) {
|
|
60
|
-
|
|
51
|
+
await self.client.get("channel-" + channelId, function(err, channelJsonText) {
|
|
52
|
+
|
|
61
53
|
if (err) {
|
|
62
54
|
return callback(err);
|
|
63
55
|
}
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
|
|
57
|
+
if (channelJsonText)
|
|
58
|
+
{
|
|
59
|
+
var channel = JSON.parse("" + channelJsonText);
|
|
60
|
+
return callback(null, channel);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
(async function() {
|
|
64
|
+
var channel = {};
|
|
65
|
+
await self.client.set("channel-" + channelId, JSON.stringify(channel), function (err) {
|
|
66
|
+
|
|
67
|
+
if (err) {
|
|
68
|
+
return callback(err);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
callback(null, channel);
|
|
72
|
+
});
|
|
73
|
+
})();
|
|
66
74
|
});
|
|
67
|
-
|
|
75
|
+
|
|
76
|
+
})();
|
|
68
77
|
};
|
|
69
78
|
|
|
70
79
|
readChannel(channelId, callback)
|
|
71
80
|
{
|
|
72
81
|
var self = this;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
82
|
+
|
|
83
|
+
(async function() {
|
|
84
|
+
|
|
85
|
+
await self.client.get("channel-" + channelId, function(err, channelJsonText) {
|
|
86
|
+
|
|
87
|
+
if (err) {
|
|
88
|
+
return callback(err);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (channelJsonText)
|
|
92
|
+
{
|
|
93
|
+
var channel = JSON.parse("" + channelJsonText);
|
|
94
|
+
return callback(null, channel);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
callback();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
})();
|
|
88
101
|
};
|
|
89
102
|
|
|
90
103
|
writeChannel(channelId, channel, callback)
|
|
91
104
|
{
|
|
92
105
|
var self = this;
|
|
106
|
+
|
|
107
|
+
(async function() {
|
|
93
108
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
109
|
+
await self.client.set("channel-" + channelId, JSON.stringify(channel), function(err) {
|
|
110
|
+
|
|
111
|
+
if (err) {
|
|
112
|
+
return callback(err);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
callback();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
})();
|
|
102
119
|
};
|
|
103
120
|
|
|
104
121
|
listChannelIds(callback)
|
|
105
122
|
{
|
|
106
123
|
var self = this;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
var
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
124
|
+
|
|
125
|
+
(async function() {
|
|
126
|
+
|
|
127
|
+
// fetch all keys for channels
|
|
128
|
+
await self.client.keys("channel-*", function(err, channelKeys) {
|
|
129
|
+
|
|
130
|
+
if (err)
|
|
131
|
+
{
|
|
132
|
+
return callback(err);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (!channelKeys || channelKeys.length === 0)
|
|
136
|
+
{
|
|
137
|
+
return callback(null, []);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
var channelIds = [];
|
|
141
|
+
for (var i = 0; i < channelKeys.length; i++)
|
|
142
|
+
{
|
|
143
|
+
var channelId = channelKeys[i].substring(channelKeys[i].indexOf("-") + 1);
|
|
144
|
+
channelIds.push(channelId);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
callback(null, channelIds);
|
|
148
|
+
});
|
|
149
|
+
})();
|
|
130
150
|
};
|
|
131
151
|
|
|
132
152
|
/**
|
|
@@ -221,106 +241,126 @@ class RedisProvider extends AbstractAsyncProvider
|
|
|
221
241
|
readLock(lockId, callback)
|
|
222
242
|
{
|
|
223
243
|
var self = this;
|
|
244
|
+
|
|
245
|
+
(async function() {
|
|
224
246
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
247
|
+
await self.client.get("lock-" + lockId, function(err, lockJsonText) {
|
|
248
|
+
|
|
249
|
+
if (err) {
|
|
250
|
+
return callback(err);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (lockJsonText)
|
|
254
|
+
{
|
|
255
|
+
var lock = JSON.parse("" + lockJsonText);
|
|
256
|
+
return callback(null, lock);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
callback();
|
|
260
|
+
});
|
|
261
|
+
})();
|
|
239
262
|
};
|
|
240
263
|
|
|
241
264
|
writeLock(lockId, lock, callback)
|
|
242
265
|
{
|
|
243
266
|
var self = this;
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
267
|
+
|
|
268
|
+
(async function() {
|
|
269
|
+
|
|
270
|
+
await self.client.set("lock-" + lockId, JSON.stringify(lock), function(err) {
|
|
271
|
+
|
|
272
|
+
if (err) {
|
|
273
|
+
return callback(err);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
callback();
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
})();
|
|
253
280
|
};
|
|
254
281
|
|
|
255
282
|
deleteLock(lockId, callback)
|
|
256
283
|
{
|
|
257
284
|
var self = this;
|
|
285
|
+
|
|
286
|
+
(async function() {
|
|
287
|
+
|
|
288
|
+
await self.client.del("lock-" + lockId, function(err) {
|
|
258
289
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
});
|
|
290
|
+
if (err) {
|
|
291
|
+
return callback(err);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
callback();
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
})();
|
|
267
298
|
};
|
|
268
299
|
|
|
269
300
|
listLockIds(callback)
|
|
270
301
|
{
|
|
271
302
|
var self = this;
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
var
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
303
|
+
|
|
304
|
+
(async function() {
|
|
305
|
+
|
|
306
|
+
// fetch all keys for locks
|
|
307
|
+
await self.client.keys("lock-*", function(err, lockKeys) {
|
|
308
|
+
|
|
309
|
+
if (err)
|
|
310
|
+
{
|
|
311
|
+
return callback(err);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (!lockKeys || lockKeys.length === 0)
|
|
315
|
+
{
|
|
316
|
+
return callback(null, []);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
var lockIds = [];
|
|
320
|
+
for (var i = 0; i < lockKeys.length; i++)
|
|
321
|
+
{
|
|
322
|
+
var lockId = lockKeys[i].substring(0, lockKeys[i].indexOf("-"));
|
|
323
|
+
lockIds.push(lockId);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
callback(null, lockIds);
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
})();
|
|
295
330
|
};
|
|
296
331
|
|
|
297
332
|
acquireSession(sessionId, callback)
|
|
298
333
|
{
|
|
299
334
|
var self = this;
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
if (sessionJsonText)
|
|
308
|
-
{
|
|
309
|
-
var session = JSON.parse("" + sessionJsonText);
|
|
310
|
-
return callback(null, session);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// create a new session
|
|
314
|
-
var session = {};
|
|
315
|
-
self.client.set("session-" + sessionId, JSON.stringify(session), function(err) {
|
|
316
|
-
|
|
335
|
+
|
|
336
|
+
(async function() {
|
|
337
|
+
|
|
338
|
+
await self.client.get("session-" + sessionId, function(err, sessionJsonText) {
|
|
339
|
+
|
|
317
340
|
if (err) {
|
|
318
341
|
return callback(err);
|
|
319
342
|
}
|
|
320
|
-
|
|
321
|
-
|
|
343
|
+
|
|
344
|
+
if (sessionJsonText)
|
|
345
|
+
{
|
|
346
|
+
var session = JSON.parse("" + sessionJsonText);
|
|
347
|
+
return callback(null, session);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// create a new session
|
|
351
|
+
(async function() {
|
|
352
|
+
var session = {};
|
|
353
|
+
await self.client.set("session-" + sessionId, JSON.stringify(session), function(err) {
|
|
354
|
+
|
|
355
|
+
if (err) {
|
|
356
|
+
return callback(err);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
callback(null, session);
|
|
360
|
+
});
|
|
361
|
+
})();
|
|
322
362
|
});
|
|
323
|
-
});
|
|
363
|
+
})();
|
|
324
364
|
}
|
|
325
365
|
|
|
326
366
|
updateSession(sessionId, session, callback)
|
|
@@ -330,30 +370,35 @@ class RedisProvider extends AbstractAsyncProvider
|
|
|
330
370
|
if (!session) {
|
|
331
371
|
session = {};
|
|
332
372
|
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
373
|
+
|
|
374
|
+
(async function() {
|
|
375
|
+
|
|
376
|
+
// create a new session
|
|
377
|
+
await self.client.set("session-" + sessionId, JSON.stringify(session), function (err) {
|
|
378
|
+
|
|
379
|
+
if (err) {
|
|
380
|
+
return callback(err);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
callback(null, session);
|
|
384
|
+
});
|
|
385
|
+
})();
|
|
343
386
|
}
|
|
344
387
|
|
|
345
388
|
deleteSession(sessionId, callback)
|
|
346
389
|
{
|
|
347
390
|
var self = this;
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
391
|
+
|
|
392
|
+
(async function() {
|
|
393
|
+
await self.client.del("session-" + sessionId, function (err) {
|
|
394
|
+
|
|
395
|
+
if (err) {
|
|
396
|
+
return callback(err);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
callback();
|
|
400
|
+
});
|
|
401
|
+
})();
|
|
357
402
|
}
|
|
358
403
|
|
|
359
404
|
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
var path = require("path");
|
|
1
|
+
//var path = require("path");
|
|
2
2
|
|
|
3
|
-
var redis = require("redis");
|
|
3
|
+
//var redis = require("redis");
|
|
4
4
|
var logFactory = require("../../../util/logger");
|
|
5
|
+
//const redisHelper = require("../../../util/redis");
|
|
6
|
+
|
|
7
|
+
var redisClientFactory = require("../../../clients/redis");
|
|
5
8
|
const redisHelper = require("../../../util/redis");
|
|
6
9
|
|
|
7
10
|
/**
|
|
@@ -12,103 +15,161 @@ const redisHelper = require("../../../util/redis");
|
|
|
12
15
|
exports = module.exports = function(cacheConfig)
|
|
13
16
|
{
|
|
14
17
|
var client = null;
|
|
15
|
-
|
|
16
|
-
var logger =
|
|
17
|
-
logger.setLevel("error");
|
|
18
|
-
|
|
19
|
-
// allow for global redis default
|
|
20
|
-
// allow for redis broadcast specific
|
|
21
|
-
// otherwise default to error
|
|
22
|
-
if (typeof(process.env.CLOUDCMS_REDIS_DEBUG_LEVEL) !== "undefined") {
|
|
23
|
-
logger.setLevel(("" + process.env.CLOUDCMS_REDIS_DEBUG_LEVEL).toLowerCase(), true);
|
|
24
|
-
}
|
|
25
|
-
else if (typeof(process.env.CLOUDCMS_CACHE_REDIS_DEBUG_LEVEL) !== "undefined") {
|
|
26
|
-
logger.setLevel(("" + process.env.CLOUDCMS_CACHE_REDIS_DEBUG_LEVEL).toLowerCase(), true);
|
|
27
|
-
}
|
|
18
|
+
|
|
19
|
+
var logger = redisHelper.redisLogger("REDIS_CACHE", "CLOUDCMS_CACHE_", "error")
|
|
28
20
|
|
|
29
21
|
var r = {};
|
|
30
22
|
|
|
31
23
|
r.init = function(callback)
|
|
32
24
|
{
|
|
33
|
-
|
|
25
|
+
redisClientFactory.create(cacheConfig, function(err, _client) {
|
|
34
26
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
27
|
+
if (err) {
|
|
28
|
+
return callback(err);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
client = _client;
|
|
32
|
+
|
|
33
|
+
return callback();
|
|
34
|
+
|
|
35
|
+
});
|
|
40
36
|
};
|
|
41
37
|
|
|
42
38
|
r.write = function(key, value, seconds, callback)
|
|
43
39
|
{
|
|
44
|
-
|
|
45
|
-
{
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
logger.info('write, key = ' + key + ', value = ' + value + '', seconds = ' + seconds');
|
|
41
|
+
(async function() {
|
|
42
|
+
|
|
43
|
+
var reply = null;
|
|
44
|
+
var err = null;
|
|
45
|
+
|
|
46
|
+
try
|
|
47
|
+
{
|
|
48
|
+
if (seconds <= -1)
|
|
49
|
+
{
|
|
50
|
+
reply = await client.set([key, JSON.stringify(value)]);
|
|
49
51
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
else
|
|
55
|
-
{
|
|
56
|
-
client.set([key, JSON.stringify(value), "EX", seconds], function(err, reply) {
|
|
57
|
-
if (err) {
|
|
58
|
-
logger.error("write.ex error. key: " + key + " value: " + JSON.stringify(value) + ". error:" + err);
|
|
52
|
+
else
|
|
53
|
+
{
|
|
54
|
+
reply = await client.set([key, JSON.stringify(value), "EX", seconds]);
|
|
59
55
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
56
|
+
}
|
|
57
|
+
catch (e)
|
|
58
|
+
{
|
|
59
|
+
err = e;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (reply) {
|
|
63
|
+
logger.info("write -> reply = " + reply);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (err) {
|
|
67
|
+
logger.error("write error. key: " + key + " value: " + JSON.stringify(value) + ". error:" + err);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
callback(err, reply);
|
|
71
|
+
|
|
72
|
+
})();
|
|
64
73
|
};
|
|
65
74
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
75
|
+
r.read = function(key, callback)
|
|
76
|
+
{
|
|
77
|
+
logger.info('read, key = ' + key);
|
|
69
78
|
|
|
79
|
+
(async function() {
|
|
80
|
+
|
|
81
|
+
var err = null;
|
|
82
|
+
var reply = null;
|
|
83
|
+
|
|
84
|
+
try
|
|
85
|
+
{
|
|
86
|
+
reply = await client.get([key]);
|
|
87
|
+
}
|
|
88
|
+
catch (e)
|
|
89
|
+
{
|
|
90
|
+
err = e;
|
|
91
|
+
}
|
|
92
|
+
|
|
70
93
|
if (err) {
|
|
71
94
|
logger.error("read error. key: " + key + ". error:" + err);
|
|
72
95
|
}
|
|
73
|
-
|
|
74
|
-
|
|
96
|
+
|
|
97
|
+
if (reply) {
|
|
98
|
+
logger.info("read. key: " + key + " -> reply = " + reply);
|
|
99
|
+
}
|
|
100
|
+
|
|
75
101
|
var result = null;
|
|
76
|
-
|
|
102
|
+
try
|
|
77
103
|
{
|
|
78
|
-
|
|
79
|
-
|
|
104
|
+
result = JSON.parse(reply);
|
|
105
|
+
}
|
|
80
106
|
catch (ex)
|
|
81
107
|
{
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
108
|
+
result = null;
|
|
109
|
+
err = ex;
|
|
110
|
+
|
|
111
|
+
if (err)
|
|
112
|
+
{
|
|
85
113
|
logger.error("error parsing reply. key: " + key + ". error:" + err);
|
|
86
114
|
}
|
|
87
|
-
|
|
88
|
-
|
|
115
|
+
}
|
|
116
|
+
|
|
89
117
|
callback(err, result);
|
|
90
|
-
|
|
91
|
-
|
|
118
|
+
})();
|
|
119
|
+
};
|
|
92
120
|
|
|
93
121
|
r.remove = function(key, callback)
|
|
94
122
|
{
|
|
95
|
-
logger.info(
|
|
96
|
-
|
|
123
|
+
logger.info('remove, key = ' + key);
|
|
124
|
+
|
|
125
|
+
(async function() {
|
|
126
|
+
|
|
127
|
+
var err = null;
|
|
128
|
+
|
|
129
|
+
try
|
|
130
|
+
{
|
|
131
|
+
await client.del([key]);
|
|
132
|
+
logger.info("remove. key: " + key);
|
|
133
|
+
}
|
|
134
|
+
catch (e)
|
|
135
|
+
{
|
|
136
|
+
err = e;
|
|
137
|
+
}
|
|
138
|
+
|
|
97
139
|
callback(err);
|
|
98
|
-
});
|
|
140
|
+
})();
|
|
99
141
|
};
|
|
100
142
|
|
|
101
143
|
r.keys = function(prefix, callback)
|
|
102
|
-
|
|
103
|
-
logger.info('keys
|
|
104
|
-
|
|
144
|
+
{
|
|
145
|
+
logger.info('keys, prefix = ' + prefix);
|
|
146
|
+
|
|
147
|
+
(async function() {
|
|
148
|
+
|
|
149
|
+
var err = null;
|
|
150
|
+
var reply = null;
|
|
151
|
+
|
|
152
|
+
try
|
|
153
|
+
{
|
|
154
|
+
reply = await client.keys([prefix + '*']);
|
|
155
|
+
}
|
|
156
|
+
catch (e)
|
|
157
|
+
{
|
|
158
|
+
err = e;
|
|
159
|
+
}
|
|
160
|
+
|
|
105
161
|
if (err) {
|
|
106
162
|
logger.error("error reading prefix: " + prefix + ". error:" + err);
|
|
107
163
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
164
|
+
|
|
165
|
+
if (reply) {
|
|
166
|
+
logger.info("[keys -> reply = " + reply);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
callback(err, reply);
|
|
170
|
+
|
|
171
|
+
})();
|
|
172
|
+
};
|
|
112
173
|
|
|
113
174
|
return r;
|
|
114
175
|
};
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
},
|
|
7
7
|
"name": "cloudcms-server",
|
|
8
8
|
"description": "Cloud CMS Application Server Module",
|
|
9
|
-
"version": "0.9.
|
|
9
|
+
"version": "0.9.257",
|
|
10
10
|
"repository": {
|
|
11
11
|
"type": "git",
|
|
12
12
|
"url": "git://github.com/gitana/cloudcms-server.git"
|
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"mkdirp": "^0.5.1",
|
|
52
52
|
"moment": "^2.24.0",
|
|
53
53
|
"morgan": "^1.9.1",
|
|
54
|
-
"node-redis-pubsub": "^5.0.0",
|
|
55
54
|
"object-hash": "^1.3.1",
|
|
56
55
|
"object-merge": "^2.5.1",
|
|
57
56
|
"on-headers": "^1.0.2",
|
package/server/index.js
CHANGED
|
@@ -671,25 +671,20 @@ var startSlave = function(config, afterStartFn)
|
|
|
671
671
|
}
|
|
672
672
|
else if (process.configuration.session.type === "redis")
|
|
673
673
|
{
|
|
674
|
-
|
|
675
|
-
var redisHost = process.env.CLOUDCMS_REDIS_ENDPOINT;
|
|
676
|
-
|
|
677
|
-
if (!redisPort)
|
|
678
|
-
{
|
|
679
|
-
console.error("Cannot configure session for Redis storage because CLOUDCMS_REDIS_PORT is not defined");
|
|
680
|
-
}
|
|
681
|
-
else if (!redisHost)
|
|
682
|
-
{
|
|
683
|
-
console.error("Cannot configure session for Redis storage because CLOUDCMS_REDIS_ENDPOINT is not defined");
|
|
684
|
-
}
|
|
685
|
-
else
|
|
686
|
-
{
|
|
674
|
+
(async function() {
|
|
687
675
|
var redisOptions = redisHelper.redisOptions();
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
676
|
+
redisHelper.createAndConnect(redisOptions, function(err, redisClient) {
|
|
677
|
+
|
|
678
|
+
if (err) {
|
|
679
|
+
console.error(err);
|
|
680
|
+
}
|
|
681
|
+
else
|
|
682
|
+
{
|
|
683
|
+
var RedisStore = connectRedis(session);
|
|
684
|
+
sessionConfig.store = new RedisStore({ client: redisClient });
|
|
685
|
+
}
|
|
686
|
+
});
|
|
687
|
+
})();
|
|
693
688
|
}
|
|
694
689
|
else if (process.configuration.session.type === "memory" || !process.configuration.session.type)
|
|
695
690
|
{
|
package/util/redis.js
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
|
+
var redis = require("redis");
|
|
2
|
+
const logFactory = require("./logger");
|
|
3
|
+
|
|
1
4
|
exports = module.exports;
|
|
2
5
|
|
|
6
|
+
var redisLogger = exports.redisLogger = function(name, prefix, defaultLevel)
|
|
7
|
+
{
|
|
8
|
+
if (!defaultLevel) {
|
|
9
|
+
defaultLevel = "error";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
var level = null;
|
|
13
|
+
|
|
14
|
+
// allow for global redis default
|
|
15
|
+
// allow for prefix specific
|
|
16
|
+
if (typeof(process.env["CLOUDCMS_REDIS_DEBUG_LEVEL"]) !== "undefined") {
|
|
17
|
+
level = "" + process.env["CLOUDCMS_REDIS_DEBUG_LEVEL"].toLowerCase();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (!level && prefix)
|
|
21
|
+
{
|
|
22
|
+
if (typeof(process.env[prefix + "REDIS_DEBUG_LEVEL"]) !== "undefined") {
|
|
23
|
+
level = "" + process.env[prefix + "REDIS_DEBUG_LEVEL"].toLowerCase();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (!level) {
|
|
28
|
+
level = defaultLevel;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
var logger = logFactory(name);
|
|
32
|
+
logger.setLevel(level);
|
|
33
|
+
|
|
34
|
+
return logger;
|
|
35
|
+
}
|
|
36
|
+
|
|
3
37
|
var redisOptions = exports.redisOptions = function(config, prefix)
|
|
4
38
|
{
|
|
5
39
|
if (!config) {
|
|
@@ -57,7 +91,23 @@ var redisOptions = exports.redisOptions = function(config, prefix)
|
|
|
57
91
|
|
|
58
92
|
var redisOptions = {};
|
|
59
93
|
redisOptions.url = redisUrl;
|
|
60
|
-
redisOptions.legacyMode = true;
|
|
61
94
|
|
|
62
95
|
return redisOptions;
|
|
63
96
|
}
|
|
97
|
+
|
|
98
|
+
var createAndConnect = exports.createAndConnect = async function(redisOptions, callback)
|
|
99
|
+
{
|
|
100
|
+
var client = redis.createClient(redisOptions);
|
|
101
|
+
|
|
102
|
+
var connectErr = null;
|
|
103
|
+
client.on('error', function(err) {
|
|
104
|
+
console.log('Redis Client Error', err);
|
|
105
|
+
connectErr = err;
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// connect
|
|
109
|
+
await client.connect();
|
|
110
|
+
//console.log("Connected to redis, options: " + JSON.stringify(redisOptions, null, 2) + ", err: " + connectErr + ", client: " + client);
|
|
111
|
+
|
|
112
|
+
return callback(connectErr, client);
|
|
113
|
+
}
|