/** 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; type GetWeight = (item: T, i: number) => number; export declare function random(items: T[], getWeight?: GetWeight): T | null; /** * 代替上面的 random 方法,需要达到以下效果: * - 同一客户端尽量将同一资源的请求调度到同一个 ECDN 节点,以发挥小程序框架的图片自动缓存能力 * - 不同客户端对同一资源的调度节点应尽量随机,以避免 ECDN 节点间负载不均衡 */ export declare function select(items: T[], clientID: string, cacheKey: string, getWeight?: GetWeight): 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 {};