import { Capture } from "./capture.js"; import type { ResponseMode, ResponsePart, WebFetchError } from "./types.js"; import { lookup as defaultDnsLookup } from "node:dns/promises"; import type { ClientRequest, IncomingMessage, RequestOptions } from "node:http"; export type DnsLookupFn = typeof defaultDnsLookup; export type HttpRequestFn = (url: string | URL, options: RequestOptions, callback?: (res: IncomingMessage) => void) => ClientRequest; export type HttpsRequestFn = HttpRequestFn; export interface NormalisedArgs { url: string; maxBytes: number; timeoutMs: number; includeHeaders: boolean; includeTls: boolean; includeTiming: boolean; includeRedirectChain: boolean; responseMode: ResponseMode; responsePart: ResponsePart; redactSensitive: boolean; } export interface RequestLoopContext { args: NormalisedArgs; capture: Capture; controller: AbortController; now: () => number; t0: number; httpsRequestFn: HttpsRequestFn; httpRequestFn: HttpRequestFn; dnsLookupFn: DnsLookupFn; } interface IssueHopArgs { ctx: RequestLoopContext; currentUrl: string; parsed: URL; resolvedIp: string; resolvedFamily: 4 | 6; hop: number; } type HopOutcome = { kind: "redirect"; status: number; location: string; } | { kind: "terminal"; status: number; contentType: string | undefined; body: string; bytesReceived: number; truncated: boolean; truncatedAt?: number; } | { kind: "error"; error: WebFetchError; }; export declare function issueHop(input: IssueHopArgs): Promise; export declare function timeoutError(lastUrl: string, t0: number, now: () => number): WebFetchError; export declare function networkError(lastUrl: string, err: unknown, prefix?: string): WebFetchError; export {};