diff --git a/packages/client/lib/cluster/cluster-slots.ts b/packages/client/lib/cluster/cluster-slots.ts index 37a17b73ae..bcf95390ce 100644 --- a/packages/client/lib/cluster/cluster-slots.ts +++ b/packages/client/lib/cluster/cluster-slots.ts @@ -2,6 +2,7 @@ import RedisClient, { InstantiableRedisClient, RedisClientType } from '../client import { RedisClusterMasterNode, RedisClusterReplicaNode } from '../commands/CLUSTER_NODES'; import { RedisClusterClientOptions, RedisClusterOptions } from '.'; import { RedisCommandArgument, RedisModules, RedisScripts } from '../commands'; +import { RootNodesUnavailableError } from '../errors'; // We need to use 'require', because it's not possible with Typescript to import // function that are exported as 'module.exports = function`, without esModuleInterop @@ -39,7 +40,7 @@ export default class RedisClusterSlots { diff --git a/packages/client/lib/cluster/index.spec.ts b/packages/client/lib/cluster/index.spec.ts index 66d458522e..a2981d824e 100644 --- a/packages/client/lib/cluster/index.spec.ts +++ b/packages/client/lib/cluster/index.spec.ts @@ -1,7 +1,9 @@ import { strict as assert } from 'assert'; import testUtils, { GLOBAL } from '../test-utils'; +import RedisCluster from '.'; import { ClusterSlotStates } from '../commands/CLUSTER_SETSLOT'; import { SQUARE_SCRIPT } from '../client/index.spec'; +import { RootNodesUnavailableError } from '../errors'; // We need to use 'require', because it's not possible with Typescript to import // function that are exported as 'module.exports = function`, without esModuleInterop @@ -10,20 +12,14 @@ const calculateSlot = require('cluster-key-slot'); describe('Cluster', () => { testUtils.testWithCluster('sendCommand', async cluster => { - await cluster.connect(); - - try { - await cluster.publish('channel', 'message'); - await cluster.set('a', 'b'); - await cluster.set('a{a}', 'bb'); - await cluster.set('aa', 'bb'); - await cluster.get('aa'); - await cluster.get('aa'); - await cluster.get('aa'); - await cluster.get('aa'); - } finally { - await cluster.disconnect(); - } + await cluster.publish('channel', 'message'); + await cluster.set('a', 'b'); + await cluster.set('a{a}', 'bb'); + await cluster.set('aa', 'bb'); + await cluster.get('aa'); + await cluster.get('aa'); + await cluster.get('aa'); + await cluster.get('aa'); }, GLOBAL.CLUSTERS.OPEN); testUtils.testWithCluster('multi', async cluster => { @@ -51,6 +47,22 @@ describe('Cluster', () => { } }); + it('should throw RootNodesUnavailableError', async () => { + const cluster = RedisCluster.create({ + rootNodes: [] + }); + + try { + await assert.rejects( + cluster.connect(), + RootNodesUnavailableError + ); + } catch (err) { + await cluster.disconnect(); + throw err; + } + }); + testUtils.testWithCluster('should handle live resharding', async cluster => { const key = 'key', value = 'value'; diff --git a/packages/client/lib/errors.ts b/packages/client/lib/errors.ts index 6af7d70744..464e81c2bb 100644 --- a/packages/client/lib/errors.ts +++ b/packages/client/lib/errors.ts @@ -39,3 +39,9 @@ export class AuthError extends Error { super(message); } } + +export class RootNodesUnavailableError extends Error { + constructor() { + super('All the root nodes are unavailable'); + } +}