import { EventEmitter } from "events";
import { CredentialsService, TunnelCredentials } from "./credentials.service";
import { DeviceFlowService } from "./device-flow.service";
export interface McpRequestHandler {
    handle(request: {
        method: string;
        path: string;
        headers: Record<string, string>;
        body: string;
    }): Promise<{
        status: number;
        headers?: Record<string, string>;
        body: string;
    }>;
}
export declare class TunnelClientError extends Error {
    readonly code: string;
    readonly originalError?: unknown | undefined;
    constructor(message: string, code: string, originalError?: unknown | undefined);
}
export declare class TunnelClient extends EventEmitter {
    private readonly mcpHandler;
    private readonly credentialsService;
    private readonly deviceFlowService;
    private readonly tunnelUrl;
    private readonly logger;
    private ws;
    private reconnectAttempts;
    private reconnectTimer;
    private isConnecting;
    private isManualDisconnect;
    private isReconnecting;
    private currentTunnelUrl;
    private credentials;
    private connectionTimeout;
    private lastServerPingTime;
    private healthCheckInterval;
    private pongTimeout;
    constructor(mcpHandler: McpRequestHandler, credentialsService: CredentialsService, deviceFlowService: DeviceFlowService, tunnelUrl: string);
    connect(initialCredentials?: TunnelCredentials): Promise<string>;
    disconnect(): void;
    isConnected(): boolean;
    getTunnelUrl(): string | null;
    private establishConnection;
    private establishWithAuthRetry;
    private isAuthFailure;
    private handleMessage;
    private handleRequest;
    private mapHandlerError;
    private handlePing;
    private handleError;
    private sendResponse;
    private sendPong;
    private isPermanentCloseCode;
    private handleReconnection;
    private startHealthCheck;
    private stopHealthCheck;
    private checkConnectionHealth;
    private handlePong;
    private refreshTokenAndSave;
    private clearReconnectTimer;
    private clearConnectionTimeout;
    private wrapError;
}
