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 = (ev: T) => unknown; type EventListenerOf = T extends "open" ? EventListener : T extends "message" ? EventListener : T extends "error" ? EventListener : T extends "close" ? EventListener : never; export type MessageListener = (msg: D) => unknown; export interface RetryOptions { maxAttempts?: number; initialDelay?: number; maxDelay?: number; backoffMultiplier?: number; } export interface ConnectOptions { timeoutMs?: number; autoReconnect?: boolean; retryOptions?: RetryOptions; } export declare function getDaemon(serviceName?: string): Daemon; declare class Daemon { protected _socket: WS | null; protected _connectedUrl: string; protected _responseQueue: { [request_id: string]: { resolver: (value: unknown) => void; rejecter: (error: unknown) => void; timeout: NodeJS.Timeout; }; }; 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 unknown>>; protected _closing: boolean; protected _onClosePromise: (() => unknown) | undefined; protected _subscriptions: string[]; protected _serviceName: string; protected _autoReconnect: boolean; protected _retryOptions: Required; protected _timeoutMs: number; protected _reconnectAttempts: number; protected _reconnectTimer: NodeJS.Timeout | null; protected _lastConnectionUrl: string; protected _isReconnecting: boolean; get connected(): boolean; get closing(): boolean; constructor(serviceName?: string); protected onRejection(e: unknown): null; /** * Connect to local daemon via websocket. * @param daemonServerURL - The websocket URL to connect to. If not provided, uses config values. * @param options - Connection options including timeout, reconnect settings, and retry settings */ connect(daemonServerURL?: string, options?: ConnectOptions): Promise; close(): Promise; sendMessage(destination: string, command: string, data?: Record, timeoutMs?: number): Promise; createMessageTemplate(command: string, destination: string, data: Record): { command: string; data: Record; ack: boolean; origin: string; destination: string; request_id: string; }; subscribe(service: string): Promise; addEventListener(type: T, listener: EventListenerOf): void; removeEventListener(type: T, listener: EventListenerOf): 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(origin: string | undefined, listener: MessageListener): () => void; removeMessageListener(origin: string, listener: MessageListener): void; clearAllMessageListeners(): void; protected onOpen(event: Event, url: string): Promise; protected onError(error: ErrorEvent): void; protected onMessage(event: MessageEvent): void; protected onClose(event: CloseEvent): void; protected onPing(): void; protected onPong(): void; protected _attemptReconnection(previousSubscriptions: string[]): void; } export type TDaemon = InstanceType; export {};