123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- const commands_1 = require("@ioredis/commands");
- const autoPipelining_1 = require("../autoPipelining");
- const Command_1 = require("../Command");
- const Script_1 = require("../Script");
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- class Commander {
- constructor() {
- this.options = {};
- /**
- * @ignore
- */
- this.scriptsSet = {};
- /**
- * @ignore
- */
- this.addedBuiltinSet = new Set();
- }
- /**
- * Return supported builtin commands
- */
- getBuiltinCommands() {
- return commands.slice(0);
- }
- /**
- * Create a builtin command
- */
- createBuiltinCommand(commandName) {
- return {
- string: generateFunction(null, commandName, "utf8"),
- buffer: generateFunction(null, commandName, null),
- };
- }
- /**
- * Create add builtin command
- */
- addBuiltinCommand(commandName) {
- this.addedBuiltinSet.add(commandName);
- this[commandName] = generateFunction(commandName, commandName, "utf8");
- this[commandName + "Buffer"] = generateFunction(commandName + "Buffer", commandName, null);
- }
- /**
- * Define a custom command using lua script
- */
- defineCommand(name, definition) {
- const script = new Script_1.default(definition.lua, definition.numberOfKeys, this.options.keyPrefix, definition.readOnly);
- this.scriptsSet[name] = script;
- this[name] = generateScriptingFunction(name, name, script, "utf8");
- this[name + "Buffer"] = generateScriptingFunction(name + "Buffer", name, script, null);
- }
- /**
- * @ignore
- */
- sendCommand(command, stream, node) {
- throw new Error('"sendCommand" is not implemented');
- }
- }
- const commands = commands_1.list.filter((command) => command !== "monitor");
- commands.push("sentinel");
- commands.forEach(function (commandName) {
- Commander.prototype[commandName] = generateFunction(commandName, commandName, "utf8");
- Commander.prototype[commandName + "Buffer"] = generateFunction(commandName + "Buffer", commandName, null);
- });
- Commander.prototype.call = generateFunction("call", "utf8");
- Commander.prototype.callBuffer = generateFunction("callBuffer", null);
- // @ts-expect-error
- Commander.prototype.send_command = Commander.prototype.call;
- function generateFunction(functionName, _commandName, _encoding) {
- if (typeof _encoding === "undefined") {
- _encoding = _commandName;
- _commandName = null;
- }
- return function (...args) {
- const commandName = (_commandName || args.shift());
- let callback = args[args.length - 1];
- if (typeof callback === "function") {
- args.pop();
- }
- else {
- callback = undefined;
- }
- const options = {
- errorStack: this.options.showFriendlyErrorStack ? new Error() : undefined,
- keyPrefix: this.options.keyPrefix,
- replyEncoding: _encoding,
- };
- // No auto pipeline, use regular command sending
- if (!(0, autoPipelining_1.shouldUseAutoPipelining)(this, functionName, commandName)) {
- return this.sendCommand(
- // @ts-expect-error
- new Command_1.default(commandName, args, options, callback));
- }
- // Create a new pipeline and make sure it's scheduled
- return (0, autoPipelining_1.executeWithAutoPipelining)(this, functionName, commandName,
- // @ts-expect-error
- args, callback);
- };
- }
- function generateScriptingFunction(functionName, commandName, script, encoding) {
- return function (...args) {
- const callback = typeof args[args.length - 1] === "function" ? args.pop() : undefined;
- const options = {
- replyEncoding: encoding,
- };
- if (this.options.showFriendlyErrorStack) {
- options.errorStack = new Error();
- }
- // No auto pipeline, use regular command sending
- if (!(0, autoPipelining_1.shouldUseAutoPipelining)(this, functionName, commandName)) {
- return script.execute(this, args, options, callback);
- }
- // Create a new pipeline and make sure it's scheduled
- return (0, autoPipelining_1.executeWithAutoPipelining)(this, functionName, commandName, args, callback);
- };
- }
- exports.default = Commander;
|