import type { CloseEvent, ErrorEvent, MessageEvent, Event } from "ws";
import * as WS from "ws";
import { WsMessage } from "../api/ws";
import { WsRegisterServiceMessage } from "../api/ws/daemon";
export type EventType = "open" | "message" | "error" | "close";
export type WsEvent = Event | MessageEvent | ErrorEvent | CloseEvent;
export type EventListener<T = WsEvent> = (ev: T) => unknown;
type EventListenerOf<T> = T extends "open" ? EventListener<Event> : T extends "message" ? EventListener<MessageEvent> : T extends "error" ? EventListener<ErrorEvent> : T extends "close" ? EventListener<CloseEvent> : never;
export type MessageListener<D extends WsMessage> = (msg: D) => unknown;
export declare function getDaemon(serviceName?: string): Daemon;
declare class Daemon {
    protected _socket: WS | null;
    protected _connectedUrl: string;
    protected _responseQueue: {
        [request_id: string]: (value: unknown) => void;
    };
    protected _openEventListeners: Array<(e: Event) => unknown>;
    protected _messageEventListeners: Array<(e: MessageEvent) => unknown>;
    protected _errorEventListeners: Array<(e: ErrorEvent) => unknown>;
    protected _closeEventListeners: Array<(e: CloseEvent) => unknown>;
    protected _messageListeners: Record<string, Array<(e: WsMessage) => unknown>>;
    protected _closing: boolean;
    protected _onClosePromise: (() => unknown) | undefined;
    protected _subscriptions: string[];
    protected _serviceName: string;
    get connected(): boolean;
    get closing(): boolean;
    constructor(serviceName?: string);
    protected onRejection(e: unknown): null;
    /**
     * Connect to local daemon via websocket.
     * @param daemonServerURL
     * @param timeoutMs
     */
    connect(daemonServerURL?: string, timeoutMs?: number): Promise<boolean>;
    close(): Promise<unknown>;
    sendMessage<M = unknown>(destination: string, command: string, data?: Record<string, unknown>): Promise<M>;
    createMessageTemplate(command: string, destination: string, data: Record<string, unknown>): {
        command: string;
        data: Record<string, unknown>;
        ack: boolean;
        origin: string;
        destination: string;
        request_id: string;
    };
    subscribe<T extends WsRegisterServiceMessage>(service: string): Promise<T>;
    addEventListener<T extends EventType>(type: T, listener: EventListenerOf<T>): void;
    removeEventListener<T extends EventType>(type: T, listener: EventListenerOf<T>): void;
    clearAllEventListeners(): void;
    /**
     * Add listener for message
     * @param {string} origin - Can be chia_farmer, chia_full_node, chia_wallet, etc.
     * @param listener - Triggered when a message arrives.
     */
    addMessageListener<D extends WsMessage>(origin: string | undefined, listener: MessageListener<D>): () => void;
    removeMessageListener<D extends WsMessage>(origin: string, listener: MessageListener<D>): void;
    clearAllMessageListeners(): void;
    protected onOpen(event: Event, url: string): Promise<WsRegisterServiceMessage>;
    protected onError(error: ErrorEvent): void;
    protected onMessage(event: MessageEvent): void;
    protected onClose(event: CloseEvent): void;
    protected onPing(): void;
    protected onPong(): void;
}
export type TDaemon = InstanceType<typeof Daemon>;
export {};
