forked from redis/ioredis
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
42 lines (35 loc) · 1.28 KB
/
script.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
'use strict';
var Command = require('./command');
var crypto = require('crypto');
var Promise = require('bluebird');
function Script(lua, numberOfKeys, keyPrefix) {
this.lua = lua;
this.sha = crypto.createHash('sha1').update(this.lua).digest('hex');
this.numberOfKeys = typeof numberOfKeys === 'number' ? numberOfKeys : null;
this.keyPrefix = keyPrefix ? keyPrefix : '';
}
Script.prototype.execute = function (container, args, options, callback) {
if (typeof this.numberOfKeys === 'number') {
args.unshift(this.numberOfKeys);
}
if (this.keyPrefix) {
options.keyPrefix = this.keyPrefix;
}
var evalsha = new Command('evalsha', [this.sha].concat(args), options);
evalsha.isCustomCommand = true;
var result = container.sendCommand(evalsha);
if (result instanceof Promise) {
var _this = this;
return result.catch(function (err) {
if (err.toString().indexOf('NOSCRIPT') === -1) {
throw err;
}
return container.sendCommand(new Command('eval', [_this.lua].concat(args), options));
}).nodeify(callback);
}
// result is not a Promise--probably returned from a pipeline chain; however,
// we still need the callback to fire when the script is evaluated
evalsha.promise.nodeify(callback);
return result;
};
module.exports = Script;