You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-09 00:22:08 +03:00
The "restore-asking" function name is not valid and was causing co-redis (by way of its usage of thenify) to throw because thenify uses the function name to rewrite async functions with promises. This PR will change the name of the "restore-asking" function to "restore_asking", which is valid. This sanitation is a bit stricter than necessary, since it also sanitizes valid unicode characters, but it covers this module's potential use cases just fine.
111 lines
3.8 KiB
JavaScript
111 lines
3.8 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;
|
|
}
|
|
}());
|
|
|
|
// TODO: Rewrite this including the invidual commands into a Commands class
|
|
// that provided a functionality to add new commands to the client
|
|
|
|
commands.list.forEach(function (command) {
|
|
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));
|
|
};
|
|
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;
|
|
};
|
|
if (changeFunctionName) {
|
|
Object.defineProperty(Multi.prototype[command], 'name', {
|
|
value: commandName
|
|
});
|
|
}
|
|
}
|
|
});
|