| 'use strict'; |
| |
| var commands = require('redis-commands'); |
| var Multi = require('./multi'); |
| var RedisClient = require('../').RedisClient; |
| var Command = require('./command'); |
| // Feature detect if a function may change it's name |
| var changeFunctionName = (function () { |
| var fn = function abc () {}; |
| try { |
| Object.defineProperty(fn, 'name', { |
| value: 'foobar' |
| }); |
| return true; |
| } catch (e) { |
| return false; |
| } |
| }()); |
| |
| var addCommand = function (command) { |
| // Some rare Redis commands use special characters in their command name |
| // Convert those to a underscore to prevent using invalid function names |
| var commandName = command.replace(/(?:^([0-9])|[^a-zA-Z0-9_$])/g, '_$1'); |
| |
| // Do not override existing functions |
| if (!RedisClient.prototype[command]) { |
| RedisClient.prototype[command.toUpperCase()] = RedisClient.prototype[command] = function () { |
| var arr; |
| var len = arguments.length; |
| var callback; |
| var i = 0; |
| if (Array.isArray(arguments[0])) { |
| arr = arguments[0]; |
| if (len === 2) { |
| callback = arguments[1]; |
| } |
| } else if (len > 1 && Array.isArray(arguments[1])) { |
| if (len === 3) { |
| callback = arguments[2]; |
| } |
| len = arguments[1].length; |
| arr = new Array(len + 1); |
| arr[0] = arguments[0]; |
| for (; i < len; i += 1) { |
| arr[i + 1] = arguments[1][i]; |
| } |
| } else { |
| // The later should not be the average use case |
| if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { |
| len--; |
| callback = arguments[len]; |
| } |
| arr = new Array(len); |
| for (; i < len; i += 1) { |
| arr[i] = arguments[i]; |
| } |
| } |
| return this.internal_send_command(new Command(command, arr, callback)); |
| }; |
| // Alias special function names (e.g. NR.RUN becomes NR_RUN and nr_run) |
| if (commandName !== command) { |
| RedisClient.prototype[commandName.toUpperCase()] = RedisClient.prototype[commandName] = RedisClient.prototype[command]; |
| } |
| if (changeFunctionName) { |
| Object.defineProperty(RedisClient.prototype[command], 'name', { |
| value: commandName |
| }); |
| } |
| } |
| |
| // Do not override existing functions |
| if (!Multi.prototype[command]) { |
| Multi.prototype[command.toUpperCase()] = Multi.prototype[command] = function () { |
| var arr; |
| var len = arguments.length; |
| var callback; |
| var i = 0; |
| if (Array.isArray(arguments[0])) { |
| arr = arguments[0]; |
| if (len === 2) { |
| callback = arguments[1]; |
| } |
| } else if (len > 1 && Array.isArray(arguments[1])) { |
| if (len === 3) { |
| callback = arguments[2]; |
| } |
| len = arguments[1].length; |
| arr = new Array(len + 1); |
| arr[0] = arguments[0]; |
| for (; i < len; i += 1) { |
| arr[i + 1] = arguments[1][i]; |
| } |
| } else { |
| // The later should not be the average use case |
| if (len !== 0 && (typeof arguments[len - 1] === 'function' || typeof arguments[len - 1] === 'undefined')) { |
| len--; |
| callback = arguments[len]; |
| } |
| arr = new Array(len); |
| for (; i < len; i += 1) { |
| arr[i] = arguments[i]; |
| } |
| } |
| this.queue.push(new Command(command, arr, callback)); |
| return this; |
| }; |
| // Alias special function names (e.g. NR.RUN becomes NR_RUN and nr_run) |
| if (commandName !== command) { |
| Multi.prototype[commandName.toUpperCase()] = Multi.prototype[commandName] = Multi.prototype[command]; |
| } |
| if (changeFunctionName) { |
| Object.defineProperty(Multi.prototype[command], 'name', { |
| value: commandName |
| }); |
| } |
| } |
| }; |
| |
| commands.list.forEach(addCommand); |
| |
| module.exports = addCommand; |