@qiniu/miku-delivery-mp-ks
Version:
Kuaishou Mini Program SDK for Miku Delivery
62 lines (61 loc) • 2.82 kB
TypeScript
/**
* @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 {};