123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- '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;
|