122 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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;
 |