You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.3 KiB
42 lines
1.3 KiB
'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;
|
|
|