Skip to content

Commit 0b02737

Browse files
committed
legacy mode
1 parent 9795690 commit 0b02737

File tree

2 files changed

+122
-9
lines changed

2 files changed

+122
-9
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import { strict as assert } from 'assert';
2+
import testUtils, { GLOBAL } from '../test-utils';
3+
import { promisify } from 'util';
4+
import { RedisLegacyClientType } from './legacy-mode';
5+
import { ErrorReply } from '../errors';
6+
import { RedisClientType } from '.';
7+
import { once } from 'events';
8+
9+
function testWithLegacyClient(title: string, fn: (legacy: RedisLegacyClientType, client: RedisClientType) => Promise<unknown>) {
10+
testUtils.testWithClient(title, client => fn(client.legacy(), client), GLOBAL.SERVERS.OPEN);
11+
}
12+
13+
describe.only('Legacy Mode', () => {
14+
describe('client.sendCommand', () => {
15+
testWithLegacyClient('resolve', async client => {
16+
assert.equal(
17+
await promisify(client.sendCommand).call(client, 'PING'),
18+
'PONG'
19+
);
20+
});
21+
22+
testWithLegacyClient('reject', async client => {
23+
await assert.rejects(
24+
promisify(client.sendCommand).call(client, 'ERROR'),
25+
ErrorReply
26+
);
27+
});
28+
29+
testWithLegacyClient('reject without a callback', async (legacy, client) => {
30+
legacy.sendCommand('ERROR');
31+
const [err] = await once(client, 'error');
32+
assert.ok(err instanceof ErrorReply);
33+
});
34+
});
35+
36+
describe('hGetAll (TRANSFORM_LEGACY_REPLY)', () => {
37+
testWithLegacyClient('resolve', async client => {
38+
await promisify(client.hSet).call(client, 'key', 'field', 'value');
39+
assert.deepEqual(
40+
await promisify(client.hGetAll).call(client, 'key'),
41+
Object.create(null, {
42+
field: {
43+
value: 'value',
44+
configurable: true,
45+
enumerable: true
46+
}
47+
})
48+
);
49+
});
50+
51+
testWithLegacyClient('reject', async client => {
52+
await assert.rejects(
53+
promisify(client.hGetAll).call(client),
54+
ErrorReply
55+
);
56+
});
57+
});
58+
59+
describe('client.set', () => {
60+
testWithLegacyClient('vardict', async client => {
61+
assert.equal(
62+
await promisify(client.set).call(client, 'a', 'b'),
63+
'OK'
64+
);
65+
});
66+
67+
testWithLegacyClient('array', async client => {
68+
assert.equal(
69+
await promisify(client.set).call(client, ['a', 'b']),
70+
'OK'
71+
);
72+
});
73+
74+
testWithLegacyClient('vardict & arrays', async client => {
75+
assert.equal(
76+
await promisify(client.set).call(client, ['a'], 'b', ['EX', 1]),
77+
'OK'
78+
);
79+
});
80+
81+
testWithLegacyClient('reject without a callback', async (legacy, client) => {
82+
legacy.set('ERROR');
83+
const [err] = await once(client, 'error');
84+
assert.ok(err instanceof ErrorReply);
85+
});
86+
});
87+
88+
describe('client.multi', () => {
89+
testWithLegacyClient('resolve', async client => {
90+
const multi = client.multi().ping().sendCommand('PING');
91+
assert.deepEqual(
92+
await promisify(multi.exec).call(multi),
93+
['PONG', 'PONG']
94+
);
95+
});
96+
97+
testWithLegacyClient('reject', async client => {
98+
const multi = client.multi().sendCommand('ERROR');
99+
await assert.rejects(
100+
promisify(multi.exec).call(multi),
101+
ErrorReply
102+
);
103+
});
104+
105+
testWithLegacyClient('reject without a callback', async (legacy, client) => {
106+
legacy.multi().sendCommand('ERROR').exec();
107+
const [err] = await once(client, 'error');
108+
assert.ok(err instanceof ErrorReply);
109+
});
110+
});
111+
});

packages/client/lib/client/legacy-mode.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export class RedisLegacyClient {
9191
this._Multi = LegacyMultiCommand.factory(RESP);
9292
}
9393

94-
sendCommand(...args: LegacyArguments) {
94+
sendCommand(...args: LegacyCommandArguments) {
9595
const redisArgs: CommandArguments = [],
9696
callback = RedisLegacyClient._transformArguments(redisArgs, args),
9797
promise = this._client.sendCommand(redisArgs);
@@ -115,15 +115,16 @@ type MultiWithCommands = {
115115
[P in keyof typeof COMMANDS]: (...args: LegacyCommandArguments) => RedisLegacyMultiType;
116116
};
117117

118-
export type RedisLegacyMultiType = Omit<LegacyMultiCommand, '_client'> & MultiWithCommands;
118+
export type RedisLegacyMultiType = LegacyMultiCommand & MultiWithCommands;
119119

120-
class LegacyMultiCommand extends RedisMultiCommand {
120+
class LegacyMultiCommand {
121121
private static _createCommand(name: string, command: Command, resp: RespVersions) {
122122
const transformReply = RedisLegacyClient.getTransformReply(command, resp);
123123
return function (this: LegacyMultiCommand, ...args: LegacyArguments) {
124124
const redisArgs = [name];
125125
RedisLegacyClient.pushArguments(redisArgs, args);
126-
return this.addCommand(redisArgs, transformReply);
126+
this._multi.addCommand(redisArgs, transformReply);
127+
return this;
127128
};
128129
}
129130

@@ -144,29 +145,30 @@ class LegacyMultiCommand extends RedisMultiCommand {
144145
};
145146
}
146147

147-
private _client: RedisClientType<RedisModules, RedisFunctions, RedisScripts>;
148+
private readonly _multi = new RedisMultiCommand();
149+
private readonly _client: RedisClientType<RedisModules, RedisFunctions, RedisScripts>;
148150

149151
constructor(client: RedisClientType<RedisModules, RedisFunctions, RedisScripts>) {
150-
super();
151152
this._client = client;
152153
}
153154

154155
sendCommand(...args: LegacyArguments) {
155156
const redisArgs: CommandArguments = [];
156157
RedisLegacyClient.pushArguments(redisArgs, args);
157-
return this.addCommand(redisArgs);
158+
this._multi.addCommand(redisArgs);
159+
return this;
158160
}
159161

160162
exec(cb?: (err: ErrorReply | null, replies?: Array<unknown>) => unknown) {
161-
const promise = this._client.executeMulti(this.queue);
163+
const promise = this._client.executeMulti(this._multi.queue);
162164

163165
if (!cb) {
164166
promise.catch(err => this._client.emit('error', err));
165167
return;
166168
}
167169

168170
promise
169-
.then(results => cb(null, this.transformReplies(results)))
171+
.then(results => cb(null, this._multi.transformReplies(results)))
170172
.catch(err => cb?.(err));
171173
}
172174
}

0 commit comments

Comments
 (0)