///
import { RedisClientType } from '../client';
import { RedisClusterOptions } from '.';
import { RedisCommandArgument, RedisFunctions, RedisModules, RedisScripts } from '../commands';
import { ChannelListeners } from '../client/pub-sub';
import { EventEmitter } from 'stream';
interface NodeAddress {
host: string;
port: number;
}
export type NodeAddressMap = {
[address: string]: NodeAddress;
} | ((address: string) => NodeAddress | undefined);
type ValueOrPromise = T | Promise;
type ClientOrPromise = ValueOrPromise>;
export interface Node {
address: string;
client?: ClientOrPromise;
}
export interface ShardNode extends Node {
id: string;
host: string;
port: number;
readonly: boolean;
}
export interface MasterNode extends ShardNode {
pubSubClient?: ClientOrPromise;
}
export interface Shard {
master: MasterNode;
replicas?: Array>;
nodesIterator?: IterableIterator>;
}
export type PubSubNode = Required>;
export type OnShardedChannelMovedError = (err: unknown, channel: string, listeners?: ChannelListeners) => void;
export default class RedisClusterSlots {
#private;
slots: Shard[];
shards: Shard[];
masters: ShardNode[];
replicas: ShardNode[];
readonly nodeByAddress: Map | MasterNode>;
pubSubNode?: PubSubNode;
get isOpen(): boolean;
constructor(options: RedisClusterOptions, emit: EventEmitter['emit']);
connect(): Promise;
nodeClient(node: ShardNode): ClientOrPromise;
rediscover(startWith: RedisClientType): Promise;
quit(): Promise;
disconnect(): Promise;
getClient(firstKey: RedisCommandArgument | undefined, isReadonly: boolean | undefined): ClientOrPromise;
getRandomNode(): ShardNode;
getSlotRandomNode(slotNumber: number): ShardNode;
getMasterByAddress(address: string): ClientOrPromise | undefined;
getPubSubClient(): ClientOrPromise;
executeUnsubscribeCommand(unsubscribe: (client: RedisClientType) => Promise): Promise;
getShardedPubSubClient(channel: string): ClientOrPromise;
executeShardedUnsubscribeCommand(channel: string, unsubscribe: (client: RedisClientType) => Promise): Promise;
}
export {};