UNPKG

3.77 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.customCommand = exports.defineRedisObject = undefined;
7exports.defineKeys = defineKeys;
8exports.defineArgv = defineArgv;
9exports.defineCommand = defineCommand;
10
11var _fengari = require('fengari');
12
13var _fengari2 = _interopRequireDefault(_fengari);
14
15var _fengariInterop = require('fengari-interop');
16
17var _fengariInterop2 = _interopRequireDefault(_fengariInterop);
18
19var _command = require('../command');
20
21var _command2 = _interopRequireDefault(_command);
22
23var _lua = require('../lua');
24
25var _ = require('.');
26
27var commands = _interopRequireWildcard(_);
28
29function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
30
31function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
32
33function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
34
35var lua = _fengari2.default.lua,
36 toLuaString = _fengari2.default.to_luastring;
37
38/**
39 * exported to test
40 *
41 * @param {*} vm - object with the lua state (L) and some utils
42 * ->
43 * @param fn - a function returning 0 for non-error and != 0 for error
44 */
45
46var defineRedisObject = exports.defineRedisObject = function defineRedisObject(vm) {
47 return function (fn) {
48 vm.defineGlobalFunction(fn, 'call');
49
50 // define redis object with call method
51 vm.luaExecString('\n local redis = {}\n redis.call = function(...)\n return call(select(\'#\', ...), ...)\n end\n return redis\n ');
52
53 // loads the redis object from the stack into the global table under key 'redis'
54 lua.lua_setglobal(vm.L, toLuaString('redis'));
55 };
56};
57
58var callToRedisCommand = function callToRedisCommand(vm) {
59 return function callToRedisCommand2() {
60 var rawArgs = vm.extractArgs();
61
62 var args = Number.isInteger(rawArgs[0]) ? rawArgs.slice(1) : rawArgs;
63 var name = args[0].toLowerCase();
64 var redisCmd = commands[name].bind(this);
65 var result = redisCmd.apply(undefined, _toConsumableArray(args.slice(1)));
66
67 if (result) {
68 if (Array.isArray(result)) {
69 result.unshift(null);
70 }
71 _fengariInterop2.default.push(vm.L, result);
72 return 1;
73 }
74 return 0;
75 };
76};
77
78// exported to test
79function defineKeys(vm, numberOfKeys, commandArgs) {
80 var keys = commandArgs.slice(0, numberOfKeys);
81 vm.defineGlobalArray(keys, 'KEYS');
82}
83
84// exported to test
85function defineArgv(vm, numberOfKeys, commandArgs) {
86 var args = commandArgs.slice(numberOfKeys);
87 vm.defineGlobalArray(args, 'ARGV');
88}
89
90// exported to test
91var customCommand = exports.customCommand = function customCommand(numberOfKeys, luaCode) {
92 return function customCommand2() {
93 var vm = (0, _lua.init)();
94 defineRedisObject(vm)(callToRedisCommand(vm).bind(this));
95
96 for (var _len = arguments.length, luaScriptArgs = Array(_len), _key = 0; _key < _len; _key++) {
97 luaScriptArgs[_key] = arguments[_key];
98 }
99
100 defineKeys.bind(this)(vm, numberOfKeys, luaScriptArgs);
101 defineArgv.bind(this)(vm, numberOfKeys, luaScriptArgs);
102
103 var topBeforeExecute = lua.lua_gettop(vm.L);
104 vm.luaExecString(luaCode);
105 var retVal = vm.popReturnValue(topBeforeExecute);
106 (0, _lua.dispose)(vm);
107 return retVal;
108 };
109};
110
111function defineCommand(command, _ref) {
112 var numberOfKeys = _ref.numberOfKeys,
113 luaCode = _ref.lua;
114
115 this[command] = (0, _command2.default)(customCommand(numberOfKeys, luaCode).bind(this), command, this);
116}
\No newline at end of file