Skip to content

Commit 03c2be0

Browse files
committed
tweak multi commands / fix addScript cases
1 parent 4c08d83 commit 03c2be0

File tree

5 files changed

+74
-76
lines changed

5 files changed

+74
-76
lines changed

packages/client/lib/client/multi-command.ts

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import COMMANDS from '../commands';
22
import RedisMultiCommand, { MULTI_REPLY, MultiReply, MultiReplyType, RedisMultiQueuedCommand } from '../multi-command';
33
import { ReplyWithTypeMapping, CommandReply, Command, CommandArguments, CommanderConfig, RedisFunctions, RedisModules, RedisScripts, RespVersions, TransformReply, RedisScript, RedisFunction, TypeMapping } from '../RESP/types';
4-
import { attachConfig, functionArgumentsPrefix, getTransformReply, scriptArgumentsPrefix } from '../commander';
4+
import { attachConfig, functionArgumentsPrefix, getTransformReply } from '../commander';
55
import { BasicCommandParser } from './parser';
66
import { Tail } from '../commands/generic-transformers';
77

@@ -92,12 +92,10 @@ export default class RedisClientMultiCommand<REPLIES = []> {
9292
const transformReply = getTransformReply(command, resp);
9393

9494
return function (this: RedisClientMultiCommand, ...args: Array<unknown>) {
95-
let redisArgs: CommandArguments;
96-
9795
const parser = new BasicCommandParser(resp);
9896
command.parseCommand(parser, ...args);
9997

100-
redisArgs = parser.redisArgs;
98+
const redisArgs: CommandArguments = parser.redisArgs;
10199
redisArgs.preserve = parser.preserve;
102100

103101
return this.addCommand(
@@ -111,12 +109,10 @@ export default class RedisClientMultiCommand<REPLIES = []> {
111109
const transformReply = getTransformReply(command, resp);
112110

113111
return function (this: { _self: RedisClientMultiCommand }, ...args: Array<unknown>) {
114-
let redisArgs: CommandArguments;
115-
116112
const parser = new BasicCommandParser(resp);
117113
command.parseCommand(parser, ...args);
118114

119-
redisArgs = parser.redisArgs;
115+
const redisArgs: CommandArguments = parser.redisArgs;
120116
redisArgs.preserve = parser.preserve;
121117

122118
return this._self.addCommand(
@@ -131,17 +127,12 @@ export default class RedisClientMultiCommand<REPLIES = []> {
131127
const transformReply = getTransformReply(fn, resp);
132128

133129
return function (this: { _self: RedisClientMultiCommand }, ...args: Array<unknown>) {
134-
let fnArgs: CommandArguments;
135-
136130
const parser = new BasicCommandParser(resp);
137-
parser.pushVariadic(prefix);
131+
parser.push(...prefix);
138132
fn.parseCommand(parser, ...args);
139133

140-
fnArgs = parser.redisArgs;
141-
fnArgs.preserve = parser.preserve;
142-
143-
const redisArgs: CommandArguments = prefix.concat(fnArgs);
144-
redisArgs.preserve = fnArgs.preserve;
134+
const redisArgs: CommandArguments = parser.redisArgs;
135+
redisArgs.preserve = parser.preserve;
145136

146137
return this._self.addCommand(
147138
redisArgs,
@@ -151,20 +142,17 @@ export default class RedisClientMultiCommand<REPLIES = []> {
151142
}
152143

153144
static #createScriptCommand(script: RedisScript, resp: RespVersions) {
154-
const prefix = scriptArgumentsPrefix(script);
155145
const transformReply = getTransformReply(script, resp);
156146

157147
return function (this: RedisClientMultiCommand, ...args: Array<unknown>) {
158-
let redisArgs: CommandArguments;
159-
160148
const parser = new BasicCommandParser(resp);
161-
parser.pushVariadic(prefix);
162149
script.parseCommand(parser, ...args);
163150

164-
redisArgs = parser.redisArgs;
151+
const redisArgs: CommandArguments = parser.redisArgs;
165152
redisArgs.preserve = parser.preserve;
166153

167-
return this.addCommand(
154+
return this.addScript(
155+
script,
168156
redisArgs,
169157
transformReply
170158
);
@@ -213,6 +201,16 @@ export default class RedisClientMultiCommand<REPLIES = []> {
213201
return this;
214202
}
215203

204+
addScript(
205+
script: RedisScript,
206+
args: CommandArguments,
207+
transformReply?: TransformReply
208+
) {
209+
this.#multi.addScript(script, args, transformReply);
210+
211+
return this;
212+
}
213+
216214
async exec<T extends MultiReply = MULTI_REPLY['GENERIC']>(execAsPipeline = false): Promise<MultiReplyType<T, REPLIES>> {
217215
if (execAsPipeline) return this.execAsPipeline<T>();
218216

packages/client/lib/client/pool.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,6 @@ export class RedisClientPool<
209209
return this._self.#isClosing;
210210
}
211211

212-
213212
/**
214213
* You are probably looking for {@link RedisClient.createPool `RedisClient.createPool`},
215214
* {@link RedisClientPool.fromClient `RedisClientPool.fromClient`},

packages/client/lib/cluster/multi-command.ts

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,12 @@ export default class RedisClusterMultiCommand<REPLIES = []> {
9696
const transformReply = getTransformReply(command, resp);
9797

9898
return function (this: RedisClusterMultiCommand, ...args: Array<unknown>) {
99-
let redisArgs: CommandArguments = [];
100-
let firstKey: RedisArgument | undefined;
101-
10299
const parser = new BasicCommandParser(resp);
103100
command.parseCommand(parser, ...args);
104-
redisArgs = parser.redisArgs;
101+
102+
const redisArgs: CommandArguments = parser.redisArgs;
105103
redisArgs.preserve = parser.preserve;
106-
firstKey = parser.firstKey;
104+
const firstKey = parser.firstKey;
107105

108106
return this.addCommand(
109107
firstKey,
@@ -118,14 +116,12 @@ export default class RedisClusterMultiCommand<REPLIES = []> {
118116
const transformReply = getTransformReply(command, resp);
119117

120118
return function (this: { _self: RedisClusterMultiCommand }, ...args: Array<unknown>) {
121-
let redisArgs: CommandArguments = [];
122-
let firstKey: RedisArgument | undefined;
123-
124119
const parser = new BasicCommandParser(resp);
125120
command.parseCommand(parser, ...args);
126-
redisArgs = parser.redisArgs;
121+
122+
const redisArgs: CommandArguments = parser.redisArgs;
127123
redisArgs.preserve = parser.preserve;
128-
firstKey = parser.firstKey;
124+
const firstKey = parser.firstKey;
129125

130126
return this._self.addCommand(
131127
firstKey,
@@ -141,17 +137,13 @@ export default class RedisClusterMultiCommand<REPLIES = []> {
141137
const transformReply = getTransformReply(fn, resp);
142138

143139
return function (this: { _self: RedisClusterMultiCommand }, ...args: Array<unknown>) {
144-
let fnArgs: CommandArguments = [];
145-
let firstKey: RedisArgument | undefined;
146-
147140
const parser = new BasicCommandParser(resp);
141+
parser.push(...prefix);
148142
fn.parseCommand(parser, ...args);
149-
fnArgs = parser.redisArgs;
150-
fnArgs.preserve = parser.preserve;
151-
firstKey = parser.firstKey;
152143

153-
const redisArgs: CommandArguments = prefix.concat(fnArgs);
154-
redisArgs.preserve = fnArgs.preserve;
144+
const redisArgs: CommandArguments = parser.redisArgs;
145+
redisArgs.preserve = parser.preserve;
146+
const firstKey = parser.firstKey;
155147

156148
return this._self.addCommand(
157149
firstKey,
@@ -166,26 +158,20 @@ export default class RedisClusterMultiCommand<REPLIES = []> {
166158
const transformReply = getTransformReply(script, resp);
167159

168160
return function (this: RedisClusterMultiCommand, ...args: Array<unknown>) {
169-
let scriptArgs: CommandArguments = [];
170-
let firstKey: RedisArgument | undefined;
171-
172161
const parser = new BasicCommandParser(resp);
173162
script.parseCommand(parser, ...args);
174-
scriptArgs = parser.redisArgs;
163+
164+
const scriptArgs: CommandArguments = parser.redisArgs;
175165
scriptArgs.preserve = parser.preserve;
176-
firstKey = parser.firstKey;
166+
const firstKey = parser.firstKey;
177167

178-
this.#setState(
168+
return this.addScript(
179169
firstKey,
180-
script.IS_READ_ONLY
181-
);
182-
this.#multi.addScript(
170+
script.IS_READ_ONLY,
183171
script,
184172
scriptArgs,
185173
transformReply
186174
);
187-
188-
return this;
189175
};
190176
}
191177

@@ -244,6 +230,19 @@ export default class RedisClusterMultiCommand<REPLIES = []> {
244230
return this;
245231
}
246232

233+
addScript(
234+
firstKey: RedisArgument | undefined,
235+
isReadonly: boolean | undefined,
236+
script: RedisScript,
237+
args: CommandArguments,
238+
transformReply?: TransformReply
239+
) {
240+
this.#setState(firstKey, isReadonly);
241+
this.#multi.addScript(script, args, transformReply);
242+
243+
return this;
244+
}
245+
247246
async exec<T extends MultiReply = MULTI_REPLY['GENERIC']>(execAsPipeline = false) {
248247
if (execAsPipeline) return this.execAsPipeline<T>();
249248

packages/client/lib/commander.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Command, CommanderConfig, RedisCommands, RedisFunction, RedisFunctions, RedisModules, RedisScript, RedisScripts, RespVersions, TransformReply } from './RESP/types';
1+
import { Command, CommanderConfig, RedisArgument, RedisCommands, RedisFunction, RedisFunctions, RedisModules, RedisScript, RedisScripts, RespVersions, TransformReply } from './RESP/types';
22

33
interface AttachConfigOptions<
44
M extends RedisModules,
@@ -98,7 +98,7 @@ export function getTransformReply(command: Command, resp: RespVersions): Transfo
9898
}
9999

100100
export function functionArgumentsPrefix(name: string, fn: RedisFunction) {
101-
const prefix: Array<string | Buffer> = [
101+
const prefix: Array<RedisArgument> = [
102102
fn.IS_READ_ONLY ? 'FCALL_RO' : 'FCALL',
103103
name
104104
];

packages/client/lib/sentinel/multi-commands.ts

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,10 @@ export default class RedisSentinelMultiCommand<REPLIES = []> {
9191
const transformReply = getTransformReply(command, resp);
9292

9393
return function (this: RedisSentinelMultiCommand, ...args: Array<unknown>) {
94-
let redisArgs: CommandArguments = [];
95-
9694
const parser = new BasicCommandParser(resp);
9795
command.parseCommand(parser, ...args);
98-
redisArgs = parser.redisArgs;
96+
97+
const redisArgs: CommandArguments = parser.redisArgs;
9998
redisArgs.preserve = parser.preserve;
10099

101100
return this.addCommand(
@@ -110,11 +109,10 @@ export default class RedisSentinelMultiCommand<REPLIES = []> {
110109
const transformReply = getTransformReply(command, resp);
111110

112111
return function (this: { _self: RedisSentinelMultiCommand }, ...args: Array<unknown>) {
113-
let redisArgs: CommandArguments = [];
114-
115112
const parser = new BasicCommandParser(resp);
116113
command.parseCommand(parser, ...args);
117-
redisArgs = parser.redisArgs;
114+
115+
const redisArgs: CommandArguments = parser.redisArgs;
118116
redisArgs.preserve = parser.preserve;
119117

120118
return this._self.addCommand(
@@ -130,15 +128,12 @@ export default class RedisSentinelMultiCommand<REPLIES = []> {
130128
const transformReply = getTransformReply(fn, resp);
131129

132130
return function (this: { _self: RedisSentinelMultiCommand }, ...args: Array<unknown>) {
133-
let fnArgs: CommandArguments = [];
134-
135131
const parser = new BasicCommandParser(resp);
132+
parser.push(...prefix);
136133
fn.parseCommand(parser, ...args);
137-
fnArgs = parser.redisArgs;
138-
fnArgs.preserve = parser.preserve;
139134

140-
const redisArgs: CommandArguments = prefix.concat(fnArgs);
141-
redisArgs.preserve = fnArgs.preserve;
135+
const redisArgs: CommandArguments = parser.redisArgs;
136+
redisArgs.preserve = parser.preserve;
142137

143138
return this._self.addCommand(
144139
fn.IS_READ_ONLY,
@@ -152,23 +147,18 @@ export default class RedisSentinelMultiCommand<REPLIES = []> {
152147
const transformReply = getTransformReply(script, resp);
153148

154149
return function (this: RedisSentinelMultiCommand, ...args: Array<unknown>) {
155-
let scriptArgs: CommandArguments = [];
156-
157150
const parser = new BasicCommandParser(resp);
158151
script.parseCommand(parser, ...args);
159-
scriptArgs = parser.redisArgs;
152+
153+
const scriptArgs: CommandArguments = parser.redisArgs;
160154
scriptArgs.preserve = parser.preserve;
161155

162-
this._setState(
163-
script.IS_READ_ONLY
164-
);
165-
this.#multi.addScript(
156+
return this.addScript(
157+
script.IS_READ_ONLY,
166158
script,
167159
scriptArgs,
168160
transformReply
169161
);
170-
171-
return this;
172162
};
173163
}
174164

@@ -198,7 +188,7 @@ export default class RedisSentinelMultiCommand<REPLIES = []> {
198188
this.#sentinel = sentinel;
199189
}
200190

201-
private _setState(
191+
#setState(
202192
isReadonly: boolean | undefined,
203193
) {
204194
this.#isReadonly &&= isReadonly;
@@ -209,11 +199,23 @@ export default class RedisSentinelMultiCommand<REPLIES = []> {
209199
args: CommandArguments,
210200
transformReply?: TransformReply
211201
) {
212-
this._setState(isReadonly);
202+
this.#setState(isReadonly);
213203
this.#multi.addCommand(args, transformReply);
214204
return this;
215205
}
216206

207+
addScript(
208+
isReadonly: boolean | undefined,
209+
script: RedisScript,
210+
args: CommandArguments,
211+
transformReply?: TransformReply
212+
) {
213+
this.#setState(isReadonly);
214+
this.#multi.addScript(script, args, transformReply);
215+
216+
return this;
217+
}
218+
217219
async exec<T extends MultiReply = MULTI_REPLY['GENERIC']>(execAsPipeline = false) {
218220
if (execAsPipeline) return this.execAsPipeline<T>();
219221

0 commit comments

Comments
 (0)