import type { Client, ClientDebugEvent, ClientEvents } from "../client.js";
import * as Protocol from "lavalink-protocol";
import * as API from "lavalink-api-client";
import * as WS from "lavalink-ws-client";
import { TypedEmitter } from "tiny-typed-emitter";
import type { PlayerManager } from "../players.js";
import type { NodeDiscordOptions } from "../node.js";
import { LoadBalancer, LoadBalancerFactory } from "./balancer.js";
import { ClusterNode, ClusterNodeOptions } from "./node.js";
import { ClusterPlayerManagerOptions } from "./players.js";
export declare class Cluster extends TypedEmitter<ClusterEvents> implements Client {
    readonly options: ClusterOptions;
    readonly nodes: Map<string, ClusterNode>;
    readonly balancer: LoadBalancer;
    readonly players: PlayerManager;
    userId: string | undefined;
    private connectedAt;
    private readyAt;
    constructor(options: ClusterOptions);
    get ready(): boolean;
    get rest(): API.LavalinkHttpClient;
    get api(): API.LavalinkAPI;
    get uptime(): number;
    connect(options?: WS.LavalinkWSClientConnectOptions): void;
    disconnect(): void;
    private debug;
}
export interface ClusterEvents extends ClientEvents {
    nodeDebug: (node: ClusterNode, event: ClientDebugEvent) => void;
    nodeError: (node: ClusterNode, error: Error) => void;
    nodeMessage: (node: ClusterNode, message: Protocol.Message) => void;
    nodeConnected: (node: ClusterNode, event: WS.LavalinkWSClientConnectedEvent) => void;
    nodeDisconnected: (node: ClusterNode, event: WS.LavalinkWSClientDisconnectedEvent) => void;
    nodeReconnecting: (node: ClusterNode) => void;
    nodeReady: (node: ClusterNode, event: WS.LavalinkWSClientReadyEvent) => void;
    nodeRequest: (node: ClusterNode, event: API.LavalinkHttpClientRequestEvent) => void;
}
export interface ClusterOptions {
    nodes: ClusterNodeOptions[];
    discord: NodeDiscordOptions;
    players?: ClusterPlayerManagerOptions;
    loadBalancer?: LoadBalancerFactory;
}
//# sourceMappingURL=client.d.ts.map