/** DNS 模块的 resolve 结果 */
export type Resolved = {
    /** IP 地址 */
    ip: string;
    /** 域名，用于 Web 端带域名访问 */
    host: string;
    /** HTTP 端口 */
    http: number;
    /** HTTPS 端口 */
    https: number;
    /** HoW Proxy 端口 */
    how: number;
};
export type Job = (resolved: Resolved) => void | Promise<void>;
type GetWeight<T> = (item: T, i: number) => number;
export declare function random<T>(items: T[], getWeight?: GetWeight<T>): T | null;
/**
 * 代替上面的 random 方法，需要达到以下效果：
 *  - 同一客户端尽量将同一资源的请求调度到同一个 ECDN 节点，以发挥小程序框架的图片自动缓存能力
 *  - 不同客户端对同一资源的调度节点应尽量随机，以避免 ECDN 节点间负载不均衡
 */
export declare function select<T>(items: T[], clientID: string, cacheKey: string, getWeight?: GetWeight<T>): T | null;
export declare function isAbortError(e: any): boolean;
/**
 * 判断是不是应该基于给定的异常来禁用目标节点
 * 如果是跟目标节点无关，无须切换目标节点简单重试就能成功的异常（一般是端上自己的问题），这里返回 false，
 * 对应地 dns do 逻辑不会因为该异常而将目标节点从可用集合中剔除，因此避免对后续请求的影响
 */
export declare function shouldDisableTarget(e: any): boolean;
/** Resolve 失败（服务不可用、网络问题、...） */
export declare class ResolveError extends Error {
    /** 作为请求失败起因的原 error */
    cause: unknown;
    name: string;
    constructor(
    /** 作为请求失败起因的原 error */
    cause: unknown);
}
/** 当前请求没有可用的 ECDN 节点 */
export declare class NoAvailableNodeError extends Error {
    name: string;
}
/** 使用 Resolve 结果中的 ECDN 节点处理请求失败 */
export declare class DoWithNodeError extends Error {
    /** 作为请求失败起因的原 error */
    cause: unknown;
    name: string;
    constructor(
    /** 作为请求失败起因的原 error */
    cause: unknown);
}
/** Resolve 决策走 Local DNS，而不走 ECDN 节点 */
export declare class LocalDNSError extends Error {
    name: string;
}
export declare function withResolved(originalUrl: string, resolved: Resolved): string;
export {};
