import type { AppiumLogger, HTTPBody, HTTPHeaders, HTTPMethod, ProxyOptions, ProxyResponse } from '@appium/types';
import { PROTOCOLS } from '../constants';
import { ProtocolConverter } from './protocol-converter';
import http from 'node:http';
import https from 'node:https';
import type { Request, Response } from 'express';
type Protocol = (typeof PROTOCOLS)[keyof typeof PROTOCOLS];
export declare class JWProxy {
    readonly scheme: string;
    readonly server: string;
    readonly port: number;
    readonly base: string;
    readonly reqBasePath: string;
    sessionId: string | null;
    timeout: number;
    readonly headers: HTTPHeaders | undefined;
    readonly httpAgent: http.Agent;
    readonly httpsAgent: https.Agent;
    readonly protocolConverter: ProtocolConverter;
    private _downstreamProtocol;
    private _activeRequests;
    private readonly _log;
    constructor(opts?: ProxyOptions);
    get log(): AppiumLogger;
    /**
     * Gets the protocol used by the downstream server (W3C or MJSONWP).
     */
    get downstreamProtocol(): Protocol | null | undefined;
    /**
     * Sets the protocol used by the downstream server (W3C or MJSONWP).
     */
    set downstreamProtocol(value: Protocol | null | undefined);
    /**
     * Returns the number of active downstream HTTP requests.
     */
    getActiveRequestsCount(): number;
    /**
     * Cancels all currently active downstream HTTP requests.
     */
    cancelActiveRequests(): void;
    /**
     * Builds a full downstream URL (including base path and session) for a given upstream URL.
     */
    getUrlForProxy(url: string, method?: HTTPMethod): string;
    /**
     * Proxies a raw WebDriver command to the downstream server.
     */
    proxy(url: string, method: string, body?: HTTPBody): Promise<[ProxyResponse, HTTPBody]>;
    /**
     * Detects the downstream protocol from a response body.
     */
    getProtocolFromResBody(resObj: Record<string, unknown>): Protocol | undefined;
    /**
     * Proxies a command identified by its HTTP method and URL to the downstream server.
     */
    proxyCommand(url: string, method: HTTPMethod, body?: HTTPBody): Promise<[ProxyResponse, HTTPBody]>;
    /**
     * Executes a WebDriver command and returns the unwrapped `value` field (or throws).
     */
    command(url: string, method: HTTPMethod, body?: HTTPBody): Promise<HTTPBody>;
    /**
     * Extracts a session id from a WebDriver-style URL.
     */
    getSessionIdFromUrl(url: string): string | null;
    /**
     * Proxies an Express `Request`/`Response` pair to the downstream server,
     * converting any downstream errors into a proper W3C HTTP response.
     *
     * This method must not throw; it always writes a response.
     */
    proxyReqRes(req: Request, res: Response): Promise<void>;
    /**
     * Performs requests to the downstream server
     *
     * @private - Do not call this method directly,
     * it uses client-specific arguments and responses!
     */
    private request;
    private _parseUrl;
    private _toNormalizedPathname;
}
export {};
//# sourceMappingURL=proxy.d.ts.map