Socket
Socket
Sign inDemoInstall

redis-clustr

Package Overview
Dependencies
Maintainers
4
Versions
23
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

redis-clustr - npm Package Compare versions

Comparing version 1.3.0 to 1.4.0

config/commandsConfig.js

996

config/commands.js

@@ -0,491 +1,835 @@

// Generated using tools/commands.js and config/commandsConfig.js on Sun, 22 Nov 2015 23:03:06 GMT
module.exports = {
"lindex": {
"readOnly": true
lindex: {
multiKey: false,
interval: 1,
readOnly: true
},
"zrank": {
"readOnly": true
zrank: {
multiKey: false,
interval: 1,
readOnly: true
},
"zinterstore": {
"readOnly": false
zinterstore: {
multiKey: false,
interval: 0,
readOnly: false
},
"persist": {
"readOnly": false
persist: {
multiKey: false,
interval: 1,
readOnly: false
},
"getrange": {
"readOnly": true
getrange: {
multiKey: false,
interval: 1,
readOnly: true
},
"brpoplpush": {
"readOnly": false
brpoplpush: {
multiKey: false,
interval: 1,
readOnly: false
},
"zscore": {
"readOnly": true
zscore: {
multiKey: false,
interval: 1,
readOnly: true
},
"zrevrangebylex": {
"readOnly": true
zrevrangebylex: {
multiKey: false,
interval: 1,
readOnly: true
},
"replconf": {
"readOnly": true
replconf: {
multiKey: false,
interval: 0,
readOnly: true
},
"sadd": {
"readOnly": false
sadd: {
multiKey: false,
interval: 1,
readOnly: false
},
"pfadd": {
"readOnly": false
pfadd: {
multiKey: false,
interval: 1,
readOnly: false
},
"getbit": {
"readOnly": true
getbit: {
multiKey: false,
interval: 1,
readOnly: true
},
"zincrby": {
"readOnly": false
zincrby: {
multiKey: false,
interval: 1,
readOnly: false
},
"hgetall": {
"readOnly": true
hgetall: {
multiKey: false,
interval: 1,
readOnly: true
},
"zremrangebyscore": {
"readOnly": false
zremrangebyscore: {
multiKey: false,
interval: 1,
readOnly: false
},
"type": {
"readOnly": true
type: {
multiKey: false,
interval: 1,
readOnly: true
},
"cluster": {
"readOnly": true
cluster: {
multiKey: false,
interval: 0,
readOnly: true
},
"zrange": {
"readOnly": true
zrange: {
multiKey: false,
interval: 1,
readOnly: true
},
"debug": {
"readOnly": false
debug: {
multiKey: false,
interval: 0,
readOnly: false
},
"bitcount": {
"readOnly": true
bitcount: {
multiKey: false,
interval: 1,
readOnly: true
},
"flushdb": {
"readOnly": false
flushdb: {
multiKey: false,
interval: 0,
readOnly: false
},
"sunionstore": {
"readOnly": false
sunionstore: {
multiKey: true,
interval: 1,
readOnly: false
},
"smove": {
"readOnly": false
smove: {
multiKey: false,
interval: 1,
readOnly: false
},
"rpushx": {
"readOnly": false
rpushx: {
multiKey: false,
interval: 1,
readOnly: false
},
"zrangebylex": {
"readOnly": true
zrangebylex: {
multiKey: false,
interval: 1,
readOnly: true
},
"multi": {
"readOnly": true
multi: {
multiKey: false,
interval: 0,
readOnly: true
},
"sdiff": {
"readOnly": true
sdiff: {
multiKey: true,
interval: 1,
readOnly: true
},
"hscan": {
"readOnly": true
hscan: {
multiKey: false,
interval: 1,
readOnly: true
},
"zrevrank": {
"readOnly": true
zrevrank: {
multiKey: false,
interval: 1,
readOnly: true
},
"punsubscribe": {
"readOnly": true
punsubscribe: {
multiKey: false,
interval: 0,
readOnly: true
},
"lset": {
"readOnly": false
lset: {
multiKey: false,
interval: 1,
readOnly: false
},
"psetex": {
"readOnly": false
psetex: {
multiKey: false,
interval: 1,
readOnly: false
},
"hvals": {
"readOnly": true
hvals: {
multiKey: false,
interval: 1,
readOnly: true
},
"zrem": {
"readOnly": false
zrem: {
multiKey: false,
interval: 1,
readOnly: false
},
"smembers": {
"readOnly": true
smembers: {
multiKey: false,
interval: 1,
readOnly: true
},
"zscan": {
"readOnly": true
zscan: {
multiKey: false,
interval: 1,
readOnly: true
},
"dbsize": {
"readOnly": true
dbsize: {
multiKey: false,
interval: 0,
readOnly: true
},
"sinterstore": {
"readOnly": false
sinterstore: {
multiKey: true,
interval: 1,
readOnly: false
},
"lastsave": {
"readOnly": true
lastsave: {
multiKey: false,
interval: 0,
readOnly: true
},
"evalsha": {
"readOnly": false
evalsha: {
multiKey: false,
interval: 0,
readOnly: false
},
"scan": {
"readOnly": true
scan: {
multiKey: false,
interval: 0,
readOnly: true
},
"unsubscribe": {
"readOnly": true
unsubscribe: {
multiKey: false,
interval: 0,
readOnly: true
},
"setex": {
"readOnly": false
setex: {
multiKey: false,
interval: 1,
readOnly: false
},
"scard": {
"readOnly": true
scard: {
multiKey: false,
interval: 1,
readOnly: true
},
"ping": {
"readOnly": true
ping: {
multiKey: false,
interval: 0,
readOnly: true
},
"bitpos": {
"readOnly": true
bitpos: {
multiKey: false,
interval: 1,
readOnly: true
},
"role": {
"readOnly": false
role: {
multiKey: false,
interval: 0,
readOnly: false
},
"psubscribe": {
"readOnly": true
psubscribe: {
multiKey: false,
interval: 0,
readOnly: true
},
"wait": {
"readOnly": true
wait: {
multiKey: false,
interval: 0,
readOnly: true
},
"config": {
"readOnly": true
config: {
multiKey: false,
interval: 0,
readOnly: true
},
"publish": {
"readOnly": true
publish: {
multiKey: false,
interval: 0,
readOnly: true
},
"sdiffstore": {
"readOnly": false
sdiffstore: {
multiKey: true,
interval: 1,
readOnly: false
},
"lrange": {
"readOnly": true
lrange: {
multiKey: false,
interval: 1,
readOnly: true
},
"hsetnx": {
"readOnly": false
hsetnx: {
multiKey: false,
interval: 1,
readOnly: false
},
"asking": {
"readOnly": true
asking: {
multiKey: false,
interval: 0,
readOnly: true
},
"decr": {
"readOnly": false
decr: {
multiKey: false,
interval: 1,
readOnly: false
},
"client": {
"readOnly": true
client: {
multiKey: false,
interval: 0,
readOnly: true
},
"linsert": {
"readOnly": false
linsert: {
multiKey: false,
interval: 1,
readOnly: false
},
"spop": {
"readOnly": false
spop: {
multiKey: false,
interval: 1,
readOnly: false
},
"subscribe": {
"readOnly": true
subscribe: {
multiKey: false,
interval: 0,
readOnly: true
},
"lpushx": {
"readOnly": false
lpushx: {
multiKey: false,
interval: 1,
readOnly: false
},
"ltrim": {
"readOnly": false
ltrim: {
multiKey: false,
interval: 1,
readOnly: false
},
"migrate": {
"readOnly": false
migrate: {
multiKey: false,
interval: 0,
readOnly: false
},
"llen": {
"readOnly": true
llen: {
multiKey: false,
interval: 1,
readOnly: true
},
"zlexcount": {
"readOnly": true
zlexcount: {
multiKey: false,
interval: 1,
readOnly: true
},
"psync": {
"readOnly": true
psync: {
multiKey: false,
interval: 0,
readOnly: true
},
"restore-asking": {
"readOnly": false
'restore-asking': {
multiKey: false,
interval: 1,
readOnly: false
},
"save": {
"readOnly": true
save: {
multiKey: false,
interval: 0,
readOnly: true
},
"latency": {
"readOnly": true
latency: {
multiKey: false,
interval: 0,
readOnly: true
},
"setnx": {
"readOnly": false
setnx: {
multiKey: false,
interval: 1,
readOnly: false
},
"auth": {
"readOnly": true
auth: {
multiKey: false,
interval: 0,
readOnly: true
},
"hmget": {
"readOnly": true
hmget: {
multiKey: false,
interval: 1,
readOnly: true
},
"sinter": {
"readOnly": true
sinter: {
multiKey: true,
interval: 1,
readOnly: true
},
"watch": {
"readOnly": true
watch: {
multiKey: true,
interval: 1,
readOnly: true
},
"strlen": {
"readOnly": true
strlen: {
multiKey: false,
interval: 1,
readOnly: true
},
"sync": {
"readOnly": true
sync: {
multiKey: false,
interval: 0,
readOnly: true
},
"zrangebyscore": {
"readOnly": true
zrangebyscore: {
multiKey: false,
interval: 1,
readOnly: true
},
"bitop": {
"readOnly": false
bitop: {
multiKey: true,
interval: 1,
readOnly: false
},
"msetnx": {
"readOnly": false
msetnx: {
multiKey: true,
interval: 2,
readOnly: false
},
"hmset": {
"readOnly": false
hmset: {
multiKey: false,
interval: 1,
readOnly: false
},
"pfmerge": {
"readOnly": false
pfmerge: {
multiKey: true,
interval: 1,
readOnly: false
},
"readwrite": {
"readOnly": true
readwrite: {
multiKey: false,
interval: 0,
readOnly: true
},
"sort": {
"readOnly": false
sort: {
multiKey: false,
interval: 1,
readOnly: false
},
"monitor": {
"readOnly": true
monitor: {
multiKey: false,
interval: 0,
readOnly: true
},
"randomkey": {
"readOnly": true
randomkey: {
multiKey: false,
interval: 0,
readOnly: true
},
"incr": {
"readOnly": false
incr: {
multiKey: false,
interval: 1,
readOnly: false
},
"mget": {
"readOnly": true
mget: {
group: function(resp) {
return resp.map(function(r) {
if (!r) return r;
return r[0];
});
},
multiKey: true,
interval: 1,
readOnly: true
},
"hincrby": {
"readOnly": false
hincrby: {
multiKey: false,
interval: 1,
readOnly: false
},
"srandmember": {
"readOnly": true
srandmember: {
multiKey: false,
interval: 1,
readOnly: true
},
"zremrangebyrank": {
"readOnly": false
zremrangebyrank: {
multiKey: false,
interval: 1,
readOnly: false
},
"script": {
"readOnly": true
script: {
multiKey: false,
interval: 0,
readOnly: true
},
"srem": {
"readOnly": false
srem: {
multiKey: false,
interval: 1,
readOnly: false
},
"setrange": {
"readOnly": false
setrange: {
multiKey: false,
interval: 1,
readOnly: false
},
"mset": {
"readOnly": false
mset: {
group: function() {
return 'OK';
},
multiKey: true,
interval: 2,
readOnly: false
},
"flushall": {
"readOnly": false
flushall: {
multiKey: false,
interval: 0,
readOnly: false
},
"blpop": {
"readOnly": false
blpop: {
multiKey: false,
interval: 1,
readOnly: false
},
"renamenx": {
"readOnly": false
renamenx: {
multiKey: false,
interval: 1,
readOnly: false
},
"select": {
"readOnly": true
select: {
multiKey: false,
interval: 0,
readOnly: true
},
"bgrewriteaof": {
"readOnly": true
bgrewriteaof: {
multiKey: false,
interval: 0,
readOnly: true
},
"zcount": {
"readOnly": true
zcount: {
multiKey: false,
interval: 1,
readOnly: true
},
"substr": {
"readOnly": true
substr: {
multiKey: false,
interval: 1,
readOnly: true
},
"sismember": {
"readOnly": true
sismember: {
multiKey: false,
interval: 1,
readOnly: true
},
"incrby": {
"readOnly": false
incrby: {
multiKey: false,
interval: 1,
readOnly: false
},
"hget": {
"readOnly": true
hget: {
multiKey: false,
interval: 1,
readOnly: true
},
"zrevrangebyscore": {
"readOnly": true
zrevrangebyscore: {
multiKey: false,
interval: 1,
readOnly: true
},
"setbit": {
"readOnly": false
setbit: {
multiKey: false,
interval: 1,
readOnly: false
},
"time": {
"readOnly": true
time: {
multiKey: false,
interval: 0,
readOnly: true
},
"slaveof": {
"readOnly": false
slaveof: {
multiKey: false,
interval: 0,
readOnly: false
},
"hset": {
"readOnly": false
hset: {
multiKey: false,
interval: 1,
readOnly: false
},
"dump": {
"readOnly": true
dump: {
multiKey: false,
interval: 1,
readOnly: true
},
"move": {
"readOnly": false
move: {
multiKey: false,
interval: 1,
readOnly: false
},
"sscan": {
"readOnly": true
sscan: {
multiKey: false,
interval: 1,
readOnly: true
},
"append": {
"readOnly": false
append: {
multiKey: false,
interval: 1,
readOnly: false
},
"discard": {
"readOnly": true
discard: {
multiKey: false,
interval: 0,
readOnly: true
},
"lpop": {
"readOnly": false
lpop: {
multiKey: false,
interval: 1,
readOnly: false
},
"pexpire": {
"readOnly": false
pexpire: {
multiKey: false,
interval: 1,
readOnly: false
},
"pfdebug": {
"readOnly": false
pfdebug: {
multiKey: false,
interval: 0,
readOnly: false
},
"readonly": {
"readOnly": true
readonly: {
multiKey: false,
interval: 0,
readOnly: true
},
"get": {
"readOnly": true
get: {
multiKey: false,
interval: 1,
readOnly: true
},
"zadd": {
"readOnly": false
zadd: {
multiKey: false,
interval: 1,
readOnly: false
},
"hkeys": {
"readOnly": true
hkeys: {
multiKey: false,
interval: 1,
readOnly: true
},
"restore": {
"readOnly": false
restore: {
multiKey: false,
interval: 1,
readOnly: false
},
"exec": {
"readOnly": false
exec: {
multiKey: false,
interval: 0,
readOnly: false
},
"eval": {
"readOnly": false
eval: {
multiKey: false,
interval: 0,
readOnly: false
},
"set": {
"readOnly": false
set: {
multiKey: false,
interval: 1,
readOnly: false
},
"expire": {
"readOnly": false
expire: {
multiKey: false,
interval: 1,
readOnly: false
},
"zremrangebylex": {
"readOnly": false
zremrangebylex: {
multiKey: false,
interval: 1,
readOnly: false
},
"pubsub": {
"readOnly": true
pubsub: {
multiKey: false,
interval: 0,
readOnly: true
},
"zcard": {
"readOnly": true
zcard: {
multiKey: false,
interval: 1,
readOnly: true
},
"object": {
"readOnly": true
object: {
multiKey: false,
interval: 2,
readOnly: true
},
"unwatch": {
"readOnly": true
unwatch: {
multiKey: false,
interval: 0,
readOnly: true
},
"keys": {
"readOnly": true
keys: {
multiKey: false,
interval: 0,
readOnly: true
},
"hdel": {
"readOnly": false
hdel: {
multiKey: false,
interval: 1,
readOnly: false
},
"echo": {
"readOnly": true
echo: {
multiKey: false,
interval: 0,
readOnly: true
},
"pfselftest": {
"readOnly": true
pfselftest: {
multiKey: false,
interval: 0,
readOnly: true
},
"brpop": {
"readOnly": false
brpop: {
multiKey: false,
interval: 1,
readOnly: false
},
"pttl": {
"readOnly": true
pttl: {
multiKey: false,
interval: 1,
readOnly: true
},
"hincrbyfloat": {
"readOnly": false
hincrbyfloat: {
multiKey: false,
interval: 1,
readOnly: false
},
"hlen": {
"readOnly": true
hlen: {
multiKey: false,
interval: 1,
readOnly: true
},
"slowlog": {
"readOnly": true
slowlog: {
multiKey: false,
interval: 0,
readOnly: true
},
"hexists": {
"readOnly": true
hexists: {
multiKey: false,
interval: 1,
readOnly: true
},
"getset": {
"readOnly": false
getset: {
multiKey: false,
interval: 1,
readOnly: false
},
"lpush": {
"readOnly": false
lpush: {
multiKey: false,
interval: 1,
readOnly: false
},
"info": {
"readOnly": true
info: {
multiKey: false,
interval: 0,
readOnly: true
},
"rpoplpush": {
"readOnly": false
rpoplpush: {
multiKey: false,
interval: 1,
readOnly: false
},
"zunionstore": {
"readOnly": false
zunionstore: {
multiKey: false,
interval: 0,
readOnly: false
},
"lrem": {
"readOnly": false
lrem: {
multiKey: false,
interval: 1,
readOnly: false
},
"rpush": {
"readOnly": false
rpush: {
multiKey: false,
interval: 1,
readOnly: false
},
"pexpireat": {
"readOnly": false
pexpireat: {
multiKey: false,
interval: 1,
readOnly: false
},
"zrevrange": {
"readOnly": true
zrevrange: {
multiKey: false,
interval: 1,
readOnly: true
},
"ttl": {
"readOnly": true
ttl: {
multiKey: false,
interval: 1,
readOnly: true
},
"del": {
"readOnly": false
del: {
group: function(resp) {
var total = 0;
for (var i = 0; i < resp.length; i++) {
total += (resp[i] || 0);
}
return total;
},
multiKey: true,
interval: 1,
readOnly: false
},
"rename": {
"readOnly": false
rename: {
multiKey: false,
interval: 1,
readOnly: false
},
"bgsave": {
"readOnly": true
bgsave: {
multiKey: false,
interval: 0,
readOnly: true
},
"decrby": {
"readOnly": false
decrby: {
multiKey: false,
interval: 1,
readOnly: false
},
"sunion": {
"readOnly": true
sunion: {
multiKey: true,
interval: 1,
readOnly: true
},
"shutdown": {
"readOnly": true
shutdown: {
multiKey: false,
interval: 0,
readOnly: true
},
"incrbyfloat": {
"readOnly": false
incrbyfloat: {
multiKey: false,
interval: 1,
readOnly: false
},
"pfcount": {
"readOnly": true
pfcount: {
multiKey: true,
interval: 1,
readOnly: true
},
"command": {
"readOnly": true
command: {
multiKey: false,
interval: 0,
readOnly: true
},
"exists": {
"readOnly": true
exists: {
multiKey: true,
interval: 1,
readOnly: true
},
"rpop": {
"readOnly": false
rpop: {
multiKey: false,
interval: 1,
readOnly: false
},
"expireat": {
"readOnly": false
expireat: {
multiKey: false,
interval: 1,
readOnly: false
}
};
{
"name": "redis-clustr",
"version": "1.3.0",
"version": "1.4.0",
"description": "Redis cluster client",
"main": "src/redisClustr.js",
"main": "src/RedisClustr.js",
"keywords": [

@@ -21,3 +21,3 @@ "redis",

"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"test": "mocha test/test.js"
},

@@ -30,3 +30,7 @@ "dependencies": {

"hiredis": "^0.4.0"
},
"devDependencies": {
"js-beautify": "^1.5.10",
"mocha": "^2.3.4"
}
}

@@ -15,5 +15,5 @@ # redis-clustr

```javascript
var RedisCluster = require('redis-clustr');
var RedisClustr = require('redis-clustr');
var redis = new RedisCluster({
var redis = new RedisClustr({
servers: [

@@ -39,5 +39,5 @@ {

```javascript
var RedisCluster = require('redis-clustr');
var RedisClustr = require('redis-clustr');
var RedisClient = require('redis');
var redis = new RedisCluster({
var redis = new RedisClustr({
servers: [...],

@@ -51,3 +51,25 @@ createClient: function(port, host) {

### Options
```javascript
var RedisClustr = require('redis-clustr');
var redis = new RedisClustr({
servers: [...],
slotInterval: 1000, // default: none. Interval to repeatedly re-fetch cluster slot configuration
maxQueueLength: 100, // default: no limit. Maximum length of the getSlots queue (basically number of commands that can be queued whilst connecting to the cluster)
queueShift: false, // default: true. Whether to shift the getSlots callback queue when it's at max length (error oldest callback), or to error on the new callback
wait: 5000, // default: no timeout. Max time to wait to connect to cluster before sending an error to all getSlots callbacks
slaves: 'share', // default: 'never'. How to direct readOnly commands: 'never' to use masters only, 'share' to distribute between masters and slaves or 'always' to only use slaves (if available)
createClient: function(port, host, options) {
return require('redis').createClient(port, host, options);
}, // default: redis.createClient. Function used to connect to redis, called with arguments above
redisOptions: {
// options passed to the node_redis client https://github.com/NodeRedis/node_redis#options-is-an-object-with-the-following-possible-properties
retry_max_delay: 500
// etc
}
});
```
## Supported functionality

@@ -67,4 +89,19 @@

### Pub/Sub
Pub/Sub is fully supported. When subscribe is used, a new client will be created (connected to a random node). This client is shared for all subscriptions.
```javascript
var RedisClustr = require('redis-clustr');
var redis = new RedisClustr({...});
redis.on('message', function(channel, message) { /* ... */ });
redis.subscribe('my-channel', function(err) {
redis.publish('my-channel', 'have a lovely day!');
});
```
### Errors
Just like node_redis, listen to the `error` event to stop your application from crashing due to errors. Redis Clustr automatically intercepts connection errors and will try to reconnect to the server.

@@ -0,1 +1,2 @@

'use strict';
// quickly ported from https://github.com/antirez/redis-rb-cluster/blob/master/crc16.rb

@@ -2,0 +3,0 @@

@@ -0,3 +1,3 @@

'use strict';
var setupCommands = require('./setupCommands');
var multiKeyCommands = require('../config/multiKeyCommands');

@@ -43,3 +43,3 @@ /*

if (!todo) return setImmediate(function() { cb(null); });
if (!todo) return setImmediate(function() { cb(null, []); });

@@ -55,26 +55,13 @@ var isDone = function() {

var conf = op[1];
var keys = Array.prototype.slice.call(op[2]);
var cb = function(err) {
if (err) self.cluster.emit('error', err);
};
if (typeof keys[keys.length - 1] === 'function') cb = keys.pop();
var parsed = self.cluster.parseArgs(op[2]);
var args = parsed[0];
var cb = parsed[1];
var first = keys[0];
if (Array.isArray(first)) {
keys = first;
}
// support multi-key commands (only run special code if there's more than one key, otherwise normal command)
var multiConf = multiKeyCommands[cmd];
if (multiConf && keys.length > multiConf.interval) {
var multiGroups = [];
for (var i = 0; i < keys.length; i += multiConf.interval) {
multiGroups.push(keys.slice(i, i + multiConf.interval));
}
var multiTodo = multiGroups.length;
if (conf.multiKey && conf.group && args.length > conf.interval) {
var multiTodo = args.length / conf.interval;
var multiErrors = null;
var multiResp = [];
multiGroups.forEach(function(multiKeys, multiIndex) {
var cli = self.cluster.selectClient(multiKeys[0], conf);
var runMultiGroup = function(cli, multiKeys, multiIndex) {
var b = batches[cli.address] || (batches[cli.address] = cli.batch());

@@ -88,3 +75,3 @@ self.cluster.commandCallback(cli, cmd, multiKeys, function(err, res) {

if (!--multiTodo) {
multiResp = multiConf.group(multiResp);
multiResp = conf.group(multiResp);
cb(multiErrors, multiResp);

@@ -96,11 +83,32 @@ resp[index] = multiResp;

b[cmd].apply(b, multiKeys);
});
};
for (var i = 0; i < multiTodo; i++) {
var multiKeys = args.slice(i * conf.interval, (i + 1) * conf.interval);
var cli = self.cluster.selectClient(multiKeys[0], conf);
if (!cli[cmd]) return cb(new Error('NodeRedis doesn\'t know the ' + cmd + ' command'));
runMultiGroup(cli, multiKeys, i);
}
return;
}
var cli = self.cluster.selectClient(keys, conf);
var cli;
if (cmd === 'eval' || cmd === 'evalsha') {
var numKeys = args[1];
if (!numKeys) {
cli = self.getRandomConnection();
} else {
// select based on the first KEYS argument
// we *could* validate that all keys are together, but it's easier
// to allow redis to error instead
cli = self.cluster.selectClient(args[2], {});
}
} else {
cli = self.cluster.selectClient(args, conf);
}
var b = batches[cli.address] || (batches[cli.address] = cli.batch());
if (!b[cmd]) return cb(new Error('NodeRedis doesn\'t know the ' + cmd + ' command'));
self.cluster.commandCallback(cli, cmd, keys, function(err, res) {
cb.apply(this, arguments);
self.cluster.commandCallback(cli, cmd, args, function(err, res) {
cb(err, res);
if (err) {

@@ -114,3 +122,3 @@ if (!errors) errors = [];

b[cmd].apply(b, keys);
b[cmd].apply(b, args);
});

@@ -117,0 +125,0 @@

@@ -0,17 +1,18 @@

'use strict';
var commands = require('../config/commands');
var multiKeyCommands = require('../config/multiKeyCommands');
module.exports = function(Class) {
function setupCommand(cmd, conf) {
if (multiKeyCommands[cmd] && Class.prototype.doMultiKeyCommand) {
Class.prototype[cmd] = function() {
this.doMultiKeyCommand(cmd, conf, multiKeyCommands[cmd], arguments);
return this;
};
} else {
Class.prototype[cmd] = function() {
this.doCommand(cmd, conf, arguments);
return this;
};
}
var fn = 'doCommand';
if (conf.multiKey && conf.group && Class.prototype.doMultiKeyCommand) fn = 'doMultiKeyCommand';
Class.prototype[cmd] = function() {
var args = new Array(arguments.length);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i];
}
this[fn](cmd, conf, args);
return this;
};
}

@@ -18,0 +19,0 @@

var redis = require('redis').createClient();
var fs = require('fs');
var beautify = require('js-beautify').js_beautify;
var extraConfig = require('../config/commandsConfig');
var commands = {};
redis.command(function(err, res) {
redis.quit();
if (err) return console.error(err);
for (var i = 0; i < res.length; i++) {
var c = res[i];
commands[c[0]] = {
// multiKey: c[4] === -1,
// interval: c[5],
readOnly: c[2].indexOf('readonly') !== -1
};
var cnf = extraConfig[c[0]] || {};
cnf.multiKey = c[4] === -1;
cnf.interval = c[5];
cnf.readOnly = c[2].indexOf('readonly') !== -1;
commands[c[0]] = cnf;
}
var file = 'module.exports = ' + JSON.stringify(commands, null, 2) + ';\n';
var file = '// Generated using tools/commands.js and config/commandsConfig.js on ' + new Date().toUTCString() + '\n\n';
file += beautify('module.exports = ' + convert(commands), { indent_size: 2 }) + ';\n';
fs.writeFileSync('./config/commands.js', file);
});
// horrible function to convert a JS object to a string (so we can write the config file)
function convert(obj) {
var type = typeof obj;
if (type === 'object' && Array.isArray(obj)) {
return '[' + obj.map(convert) + ']';
}
if (obj && type === 'object') {
var string = [];
for (var i in obj) {
var prop = i;
if (prop.indexOf('-') !== -1) prop = "'" + prop + "'";
string.push(prop + ':' + convert(obj[i]));
}
return '{' + string + '}';
}
if (type === 'function') {
return obj.toString();
}
return JSON.stringify(obj);
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc