'use strict' const commands = require('redis-commands') const Multi = require('./multi') const RedisClient = require('../').RedisClient const Command = require('./command') // TODO: Rewrite this including the individual commands into a Commands class // that provided a functionality to add new commands to the client commands.list.forEach((command) => { // Some rare Redis commands use special characters in their command name // Convert those to a underscore to prevent using invalid function names const commandName = command.replace(/(?:^([0-9])|[^a-zA-Z0-9_$])/g, '_$1') // Do not override existing functions if (!RedisClient.prototype[command]) { RedisClient.prototype[command] = function () { let arr let len = arguments.length let callback let 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.internalSendCommand(new Command(command, arr, callback)) } if (RedisClient.prototype[command] !== commandName) { Object.defineProperty(RedisClient.prototype[command], 'name', { value: commandName }) } } // Do not override existing functions if (!Multi.prototype[command]) { Multi.prototype[command] = function () { let arr let len = arguments.length let callback let 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 } if (Multi.prototype[command] !== commandName) { Object.defineProperty(Multi.prototype[command], 'name', { value: commandName }) } } })