Skip to content

Commit 6942cec

Browse files
committed
fix: keyPrefix should work with Buffer
Closes #1486
1 parent bb166cc commit 6942cec

File tree

3 files changed

+55
-4
lines changed

3 files changed

+55
-4
lines changed

Diff for: lib/Command.ts

+20-3
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,24 @@ export default class Command implements Respondable {
181181
this.initPromise();
182182

183183
if (options.keyPrefix) {
184-
this._iterateKeys((key) => options.keyPrefix + key);
184+
// @ts-expect-error
185+
const isBufferKeyPrefix = options.keyPrefix instanceof Buffer;
186+
// @ts-expect-error
187+
let keyPrefixBuffer: Buffer | null = isBufferKeyPrefix
188+
? options.keyPrefix
189+
: null;
190+
this._iterateKeys((key) => {
191+
if (key instanceof Buffer) {
192+
if (keyPrefixBuffer === null) {
193+
keyPrefixBuffer = Buffer.from(options.keyPrefix);
194+
}
195+
return Buffer.concat([keyPrefixBuffer, key]);
196+
} else if (isBufferKeyPrefix) {
197+
// @ts-expect-error
198+
return Buffer.concat([options.keyPrefix, Buffer.from(String(key))]);
199+
}
200+
return options.keyPrefix + key;
201+
});
185202
}
186203

187204
if (options.readOnly) {
@@ -327,8 +344,8 @@ export default class Command implements Respondable {
327344
* Iterate through the command arguments that are considered keys.
328345
*/
329346
private _iterateKeys(
330-
transform: Function = (key) => key
331-
): Array<string | Buffer> {
347+
transform: (key: CommandParameter) => CommandParameter = (key) => key
348+
): (string | Buffer)[] {
332349
if (typeof this.keys === "undefined") {
333350
this.keys = [];
334351
if (exists(this.name)) {

Diff for: test/functional/cluster/scripting.ts

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ describe("cluster:scripting", () => {
1212
[12182, 16383, ["127.0.0.1", 30002]],
1313
];
1414
}
15-
console.log(argv);
1615
if (argv[0] === "eval" && argv[1] === lua && argv[2] === "2") {
1716
return argv.slice(3);
1817
}

Diff for: test/functional/send_command.ts

+35
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ describe("send command", () => {
5959
expect(res).to.eql("OK");
6060
}
6161
);
62+
// @ts-expect-error
6263
redis.callBuffer("get", Buffer.from("foo"), function (err, result) {
6364
expect(result).to.be.instanceof(Buffer);
6465
expect(result.toString()).to.eql("bar");
@@ -149,6 +150,40 @@ describe("send command", () => {
149150
});
150151
});
151152

153+
it("should support prefixing buffer keys", async () => {
154+
const redis = new Redis({ keyPrefix: "foo:" });
155+
await redis.mset(
156+
Buffer.from("bar"),
157+
Buffer.from("baz"),
158+
Buffer.from("foo"),
159+
Buffer.from("baz")
160+
);
161+
await redis.set(Buffer.from([0xff]), Buffer.from("baz"));
162+
163+
const redisWOPrefix = new Redis();
164+
expect(await redisWOPrefix.get("foo:bar")).to.eql("baz");
165+
expect(await redisWOPrefix.get("foo:foo")).to.eql("baz");
166+
expect(
167+
await redisWOPrefix.get(Buffer.from([0x66, 0x6f, 0x6f, 0x3a, 0xff]))
168+
).to.eql("baz");
169+
});
170+
171+
it("should support buffer as keyPrefix", async () => {
172+
// @ts-expect-error
173+
const redis = new Redis({ keyPrefix: Buffer.from([0xff]) });
174+
await redis.mset("bar", Buffer.from("baz"), "foo", Buffer.from("bar"));
175+
await redis.set(Buffer.from([0xff]), Buffer.from("baz"));
176+
177+
const redisWOPrefix = new Redis();
178+
expect(
179+
await redisWOPrefix.get(Buffer.from([0xff, 0x62, 0x61, 0x72]))
180+
).to.eql("baz");
181+
expect(
182+
await redisWOPrefix.get(Buffer.from([0xff, 0x66, 0x6f, 0x6f]))
183+
).to.eql("bar");
184+
expect(await redisWOPrefix.get(Buffer.from([0xff, 0xff]))).to.eql("baz");
185+
});
186+
152187
it("should support key prefixing for zunionstore", (done) => {
153188
const redis = new Redis({ keyPrefix: "foo:" });
154189
redis.zadd("zset1", 1, "one");

0 commit comments

Comments
 (0)