UNPKG

@qiniu/miku-delivery-mp-ks

Version:

Kuaishou Mini Program SDK for Miku Delivery

62 lines (61 loc) 2.82 kB
/** * @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 {};