import { BlockData } from './Block';
import { PayloadData } from './Payload';
import { Logger } from './Logger';
import { Service, ServiceOptions } from './Service';
import { Connection } from './Connection';
export type Task = (commander: Commander, payload: PayloadData, service: Service) => void;
export type ResponseType = (data: PayloadData) => void;
export declare enum CommanderMode {
    Service = 0,
    Bot = 1
}
export declare enum DisconnectReason {
    Normal = 0,
    Timeout = 1,
    Handshake = 2,
    ServerDown = 3,
    Unknown = 4
}
export declare class Commander {
    private id;
    private connection;
    private service;
    private options;
    private log;
    private mode;
    onDisconnect: (reason: DisconnectReason) => void;
    onReady: () => void;
    cid: string;
    private counter;
    private pulse;
    private commands;
    private callbacks;
    private requests;
    private timeouts;
    private names;
    private timer;
    private protocol;
    private reason;
    constructor(id: string, connection: Connection, service: Service, options: ServiceOptions, log: Logger, mode?: CommanderMode);
    kick(reason: DisconnectReason): void;
    heartbeat(): void;
    handshake(data: Buffer): void;
    acknowledge(data: Buffer): void;
    disconnect(): void;
    command(command: string, data?: Buffer): void;
    fetch(request: string, data?: Buffer): Promise<PayloadData>;
    request(request: string, callback: ResponseType, data?: Buffer): number;
    response(request: PayloadData, data?: Buffer): void;
    error(request: PayloadData, error: string, data?: Buffer): void;
    clear(): void;
    cancelRequest(id: number): void;
    addCommand(command: string, callback: ResponseType): void;
    cancelCommand(command: string, callback?: ResponseType): void;
    addOnRequest(request: string, callback: ResponseType): void;
    cancelOnRequest(request: string): void;
    onCheckTimeout(): void;
    onBlock(block: BlockData): void;
    onPayload(payload: PayloadData): void;
    onClose(): void;
    onHandshake(block: BlockData): void;
    onAcknowledgement(block: BlockData): void;
    onHeartbeat(): void;
    onKick(block: BlockData): void;
    onPulse(): void;
    destroy(): void;
}
