Skip to content

Commit e553270

Browse files
committed
fix #2205 - reject commands in connect phase when disableOfflineQueue is true
1 parent d097322 commit e553270

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

packages/client/lib/client/index.spec.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import testUtils, { GLOBAL, waitTillBeenCalled } from '../test-utils';
33
import RedisClient, { RedisClientType } from '.';
44
import { RedisClientMultiCommandType } from './multi-command';
55
import { RedisCommandArguments, RedisCommandRawReply, RedisModules, RedisFunctions, RedisScripts } from '../commands';
6-
import { AbortError, ClientClosedError, ConnectionTimeoutError, DisconnectsClientError, SocketClosedUnexpectedlyError, WatchError } from '../errors';
6+
import { AbortError, ClientClosedError, ClientOfflineError, ConnectionTimeoutError, DisconnectsClientError, SocketClosedUnexpectedlyError, WatchError } from '../errors';
77
import { defineScript } from '../lua-script';
88
import { spy } from 'sinon';
99
import { once } from 'events';
@@ -874,4 +874,20 @@ describe('Client', () => {
874874
pingInterval: 1
875875
}
876876
});
877+
878+
testUtils.testWithClient('should reject commands in connect phase when `disableOfflineQueue`', async client => {
879+
const connectPromise = client.connect();
880+
await assert.rejects(
881+
client.ping(),
882+
ClientOfflineError
883+
);
884+
await connectPromise;
885+
await client.disconnect();
886+
}, {
887+
...GLOBAL.SERVERS.OPEN,
888+
clientOptions: {
889+
disableOfflineQueue: true
890+
},
891+
disableClientSetup: true
892+
});
877893
});

packages/client/lib/client/index.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { ScanCommandOptions } from '../commands/SCAN';
1111
import { HScanTuple } from '../commands/HSCAN';
1212
import { attachCommands, attachExtensions, fCallArguments, transformCommandArguments, transformCommandReply, transformLegacyCommandArguments } from '../commander';
1313
import { Pool, Options as PoolOptions, createPool } from 'generic-pool';
14-
import { ClientClosedError, DisconnectsClientError } from '../errors';
14+
import { ClientClosedError, ClientOfflineError, DisconnectsClientError } from '../errors';
1515
import { URL } from 'url';
1616
import { TcpSocketConnectOpts } from 'net';
1717

@@ -405,16 +405,16 @@ export default class RedisClient<
405405
): Promise<T> {
406406
if (!this.#socket.isOpen) {
407407
return Promise.reject(new ClientClosedError());
408-
}
409-
410-
if (options?.isolated) {
408+
} else if (options?.isolated) {
411409
return this.executeIsolated(isolatedClient =>
412410
isolatedClient.sendCommand(args, {
413411
...options,
414412
isolated: false
415413
})
416414
);
417-
}
415+
} else if (!this.#socket.isReady && this.#options?.disableOfflineQueue) {
416+
return Promise.reject(new ClientOfflineError());
417+
}
418418

419419
const promise = this.#queue.addCommand<T>(args, options);
420420
this.#tick();

packages/client/lib/errors.ts

+6
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ export class ClientClosedError extends Error {
2222
}
2323
}
2424

25+
export class ClientOfflineError extends Error {
26+
constructor() {
27+
super('The client is offline');
28+
}
29+
}
30+
2531
export class DisconnectsClientError extends Error {
2632
constructor() {
2733
super('Disconnects client');

0 commit comments

Comments
 (0)