/// <reference types="node" />
import COMMANDS from "./commands";
import { ValkeyCommand, ValkeyCommandArgument, ValkeyCommandArguments, ValkeyCommandRawReply, ValkeyCommandReply, ValkeyFunctions, ValkeyModules, ValkeyExtensions, ValkeyScript, ValkeyScripts, ValkeyCommandSignature, ValkeyFunction } from "../commands";
import { ClientCommandOptions, ValkeyClientOptions, ValkeyClientType, WithFunctions, WithModules, WithScripts } from "../client";
import { NodeAddressMap, ShardNode } from "./cluster-slots";
import { EventEmitter } from "events";
import { ValkeyClusterMultiCommandType } from "./multi-command";
import { PubSubListener } from "../client/pub-sub";
export type ValkeyClusterClientOptions = Omit<ValkeyClientOptions, "modules" | "functions" | "scripts" | "database">;
export interface ValkeyClusterOptions<M extends ValkeyModules = Record<string, never>, F extends ValkeyFunctions = Record<string, never>, S extends ValkeyScripts = Record<string, never>> extends ValkeyExtensions<M, F, S> {
    /**
     * Should contain details for some of the cluster nodes that the client will use to discover
     * the "cluster topology". We recommend including details for at least 3 nodes here.
     */
    rootNodes: Array<ValkeyClusterClientOptions>;
    /**
     * Default values used for every client in the cluster. Use this to specify global values,
     * for example: ACL credentials, timeouts, TLS configuration etc.
     */
    defaults?: Partial<ValkeyClusterClientOptions>;
    /**
     * When `true`, `.connect()` will only discover the cluster topology, without actually connecting to all the nodes.
     * Useful for short-term or PubSub-only connections.
     */
    minimizeConnections?: boolean;
    /**
     * When `true`, distribute load by executing readonly commands (such as `GET`, `GEOSEARCH`, etc.) across all cluster nodes. When `false`, only use master nodes.
     */
    useReplicas?: boolean;
    /**
     * The maximum number of times a command will be redirected due to `MOVED` or `ASK` errors.
     */
    maxCommandRedirections?: number;
    /**
     * Mapping between the addresses in the cluster (see `CLUSTER SHARDS`) and the addresses the client should connect to
     * Useful when the cluster is running on another network
     *
     */
    nodeAddressMap?: NodeAddressMap;
}
type WithCommands = {
    [P in keyof typeof COMMANDS]: ValkeyCommandSignature<(typeof COMMANDS)[P]>;
};
export type ValkeyClusterType<M extends ValkeyModules = Record<string, never>, F extends ValkeyFunctions = Record<string, never>, S extends ValkeyScripts = Record<string, never>> = ValkeyCluster<M, F, S> & WithCommands & WithModules<M> & WithFunctions<F> & WithScripts<S>;
export default class ValkeyCluster<M extends ValkeyModules, F extends ValkeyFunctions, S extends ValkeyScripts> extends EventEmitter {
    #private;
    static extractFirstKey(command: ValkeyCommand, originalArgs: Array<unknown>, valkeyArgs: ValkeyCommandArguments): ValkeyCommandArgument | undefined;
    static create<M extends ValkeyModules, F extends ValkeyFunctions, S extends ValkeyScripts>(options?: ValkeyClusterOptions<M, F, S>): ValkeyClusterType<M, F, S>;
    get slots(): import("./cluster-slots").Shard<M, F, S>[];
    get shards(): import("./cluster-slots").Shard<M, F, S>[];
    get masters(): ShardNode<M, F, S>[];
    get replicas(): ShardNode<M, F, S>[];
    get nodeByAddress(): Map<string, ShardNode<M, F, S> | import("./cluster-slots").MasterNode<M, F, S>>;
    get pubSubNode(): Required<import("./cluster-slots").Node<M, F, S>> | undefined;
    get isOpen(): boolean;
    constructor(options: ValkeyClusterOptions<M, F, S>);
    duplicate(overrides?: Partial<ValkeyClusterOptions<M, F, S>>): ValkeyClusterType<M, F, S>;
    connect(): Promise<void>;
    commandsExecutor<C extends ValkeyCommand>(command: C, args: Array<unknown>): Promise<ValkeyCommandReply<C>>;
    sendCommand<T = ValkeyCommandRawReply>(firstKey: ValkeyCommandArgument | undefined, isReadonly: boolean | undefined, args: ValkeyCommandArguments, options?: ClientCommandOptions): Promise<T>;
    functionsExecutor<F extends ValkeyFunction>(fn: F, args: Array<unknown>, name: string): Promise<ValkeyCommandReply<F>>;
    executeFunction(name: string, fn: ValkeyFunction, originalArgs: Array<unknown>, valkeyArgs: ValkeyCommandArguments, options?: ClientCommandOptions): Promise<ValkeyCommandRawReply>;
    scriptsExecutor<S extends ValkeyScript>(script: S, args: Array<unknown>): Promise<ValkeyCommandReply<S>>;
    executeScript(script: ValkeyScript, originalArgs: Array<unknown>, valkeyArgs: ValkeyCommandArguments, options?: ClientCommandOptions): Promise<ValkeyCommandRawReply>;
    MULTI(routing?: ValkeyCommandArgument): ValkeyClusterMultiCommandType<M, F, S>;
    multi: (routing?: ValkeyCommandArgument) => ValkeyClusterMultiCommandType<M, F, S>;
    SUBSCRIBE<T extends boolean = false>(channels: string | Array<string>, listener: PubSubListener<T>, bufferMode?: T): Promise<void>;
    subscribe: <T extends boolean = false>(channels: string | Array<string>, listener: PubSubListener<T>, bufferMode?: T) => Promise<void>;
    UNSUBSCRIBE<T extends boolean = false>(channels?: string | Array<string>, listener?: PubSubListener<boolean>, bufferMode?: T): Promise<void>;
    unsubscribe: <T extends boolean = false>(channels?: string | Array<string>, listener?: PubSubListener<boolean>, bufferMode?: T) => Promise<void>;
    PSUBSCRIBE<T extends boolean = false>(patterns: string | Array<string>, listener: PubSubListener<T>, bufferMode?: T): Promise<void>;
    pSubscribe: <T extends boolean = false>(patterns: string | Array<string>, listener: PubSubListener<T>, bufferMode?: T) => Promise<void>;
    PUNSUBSCRIBE<T extends boolean = false>(patterns?: string | Array<string>, listener?: PubSubListener<T>, bufferMode?: T): Promise<void>;
    pUnsubscribe: <T extends boolean = false>(patterns?: string | Array<string>, listener?: PubSubListener<T>, bufferMode?: T) => Promise<void>;
    SSUBSCRIBE<T extends boolean = false>(channels: string | Array<string>, listener: PubSubListener<T>, bufferMode?: T): Promise<void>;
    sSubscribe: <T extends boolean = false>(channels: string | Array<string>, listener: PubSubListener<T>, bufferMode?: T) => Promise<void>;
    SUNSUBSCRIBE<T extends boolean = false>(channels: string | Array<string>, listener?: PubSubListener<T>, bufferMode?: T): Promise<void>;
    sUnsubscribe: <T extends boolean = false>(channels: string | Array<string>, listener?: PubSubListener<T>, bufferMode?: T) => Promise<void>;
    quit(): Promise<void>;
    disconnect(): Promise<void>;
    nodeClient(node: ShardNode<M, F, S>): ValkeyClientType<M, F, S> | Promise<ValkeyClientType<M, F, S>>;
    getRandomNode(): ShardNode<M, F, S>;
    getSlotRandomNode(slot: number): ShardNode<M, F, S>;
    /**
     * @deprecated use `.masters` instead
     */
    getMasters(): ShardNode<M, F, S>[];
    /**
     * @deprecated use `.slots[<SLOT>]` instead
     */
    getSlotMaster(slot: number): import("./cluster-slots").MasterNode<M, F, S>;
}
export {};
