/**
 * @file DNS 查询组件
 * @desc 详见 https://cf.qiniu.io/pages/viewpage.action?pageId=107318871
 * @todo - dns 对外接口（`ResolveResult`）的调整（干掉 ecdn 特别的概念）
 */
import ConsistentHash from '../utils/consistent-hash';
import Context from '../utils/context';
import type { AppInfo } from '../common/index';
import type Logger from '../log';
import { ResolveResult, Group, Elt } from './httpdns';
import { Job } from './common';
/** 保存并使用的 Resolve 结果 */
type SavedResolveResult = ResolveResult & {
    domain: string;
    /** 过期的时间戳，单位 ms */
    expireAt: number;
};
export type DNSResolver = (ctx: Context, domain: string, app: AppInfo, logger: Logger) => ResolveResult | Promise<ResolveResult>;
/** DNS 查询组件 */
export default class CDNResolver {
    private logger;
    private app;
    /** 客户端唯一标识 */
    private clientID;
    private dnsResolver;
    /** Resolve（`resolveDomain`）过程的超时时间 */
    private resolveTimeout;
    /** elt 第一次失败禁用时长 */
    private initialDisableDuration;
    constructor(logger: Logger, app: AppInfo, 
    /** 客户端唯一标识 */
    clientID: string, dnsResolver?: DNSResolver, 
    /** Resolve（`resolveDomain`）过程的超时时间 */
    resolveTimeout?: number, 
    /** elt 第一次失败禁用时长 */
    initialDisableDuration?: number);
    /** 缓存节点禁用信息 */
    private disabledElts;
    /** 判断节点是否被禁用 */
    private isEltDisabled;
    /** 节点失败时更新禁用信息，连续失败罚时翻倍 */
    private setEltDisabled;
    /** 节点成功时清除禁用信息 */
    private removeEltDisabled;
    private getCacheKey;
    private getStorageKey;
    /** 从持久化存储中读取解析结果，注意这里做了合并调用的处理，以减少初始化时对持久化存储的读操作 */
    private getResolveResultFromStorage;
    /** 向持久化存储中写入解析结果 */
    private saveResolveResultToStorage;
    /** 更新持久化存储中的结果，注意这里做了合并调用的处理，以避免重复的发往远端 HTTPDNS 服务器的请求 */
    private refreshResolveResultInStorage;
    /** 给定域名并获取解析结果 */
    resolveDomain(ctx: Context, domain: string): Promise<SavedResolveResult>;
    /** 给定 URL，解析并使用结果 IP / Host 执行特定逻辑（job） */
    do(ctx: Context, url: string, attempts: number, job: Job): Promise<void>;
    doWithGroup(ctx: Context, group: Group, cacheKey: string, splitn: number, job: Job): Promise<void>;
}
export declare function makeConsistentHash({ elts }: Group): ConsistentHash;
export declare function doWithElt(elt: Elt, clientID: string, cacheKey: string, job: Job): Promise<void>;
export {};
