//#region src/engine.d.ts /** * 核心增量引擎 —— 按 fontKey 管理字符集与子集请求 * * 职责(与「注册方式」无关,被 CSS 模式 / FontFace 模式共用): * 1. 字符去重:同一字体下只对未加载过的字符发起子集请求 * 2. 并发控制:全局并发池,任务在「provider 返回 + 注册完成」后才释放槽位, * 与旧版一致地把浏览器字体挂载也纳入限流 * 3. 失败记忆:加载/注册失败的字符记入 failedChars,不再反复请求(可手动重试) * 4. provider 抽象:默认走 HTTP API,可注入离线裁剪 provider * * 不负责:把字体片段注册到运行环境(CSS @font-face / FontFace 由外层模式完成) */ /** 子集提供者:给定字体名+文本,返回字体片段 URL 与格式(HTTP 或 blob:) */ type SubsetProvider = (fontName: string, text: string, outType: string) => Promise<{ url: string; format: string; }>; /** 单个字体的增量状态 */ interface IFontState { /** 字体名(API 查询用,如 '令东齐伋复刻体.ttf'),服务端支持模糊匹配 */ fontName: string; /** 该字体的服务基地址(HTTP provider 用) */ baseUrl: string; /** 输出格式 */ outType: string; /** 已成功加载的字符集 */ loadedChars: Set; /** 加载失败过的字符集(字体不含此字 / 网络错误),避免反复请求 */ failedChars: Set; /** 正在请求中的字符集(防重复并发) */ pendingChars: Set; /** * 该字体的注册回调:新片段就绪时由模式层把字体挂到运行环境。 * 返回 Promise 时引擎会等它完成才释放并发槽(保证 ready() 语义)。 */ onLoadChunk: ((chunk: LoadedChunk) => void | Promise) | null; /** * 该字体的专属 provider(优先于引擎级配置)。 * uni 小程序模式用:无 unicode-range,需按累积全集而非增量构造 URL */ provider?: SubsetProvider | null; } /** 一次成功加载的增量片段 */ interface LoadedChunk { /** 字体名 */ fontName: string; /** 本片段包含的字符 */ chars: string[]; /** 字体文件 URL */ url: string; /** 字体格式(woff2 / truetype) */ format: string; } /** 引擎配置 */ interface IEngineConfig { /** 全局最大并发子集请求(含注册)数,默认 4 */ maxConcurrent: number; /** 自定义子集提供者(离线裁剪场景),null 表示走默认 HTTP */ provider: SubsetProvider | null; } /** 创建字体状态的初始选项 */ interface IEnsureStateOptions { /** 服务基地址(HTTP provider 用) */ baseUrl: string; /** 输出格式 */ outType: string; /** 注册回调(可后补) */ onLoadChunk?: (chunk: LoadedChunk) => void | Promise; /** 该字体的专属 provider(优先于引擎级配置) */ provider?: SubsetProvider | null; } declare function createHttpProvider(baseUrl: string): SubsetProvider; declare class IncrementalEngine { /** fontKey -> 字体状态 */ private states; private config; /** 并发池 */ private active; private queue; /** 在途任务数(provider 请求 + 注册回调),hasPending / ready 用 */ private flying; constructor(config?: Partial); /** fontKey:fontName + family 唯一确定一个增量组 */ static fontKey(fontName: string, family: string): string; setProvider(provider: SubsetProvider | null): void; getState(key: string): IFontState | undefined; /** 获取或创建字体状态;已存在时按传入项更新 baseUrl / outType / 回调 */ ensureState(key: string, fontName: string, options: IEnsureStateOptions): IFontState; /** 删除状态(销毁时) */ removeState(key: string): void; /** 是否还有在途任务(请求中或注册中,ready() 轮询用) */ hasPending(): boolean; /** 清除失败记录(下次遇到这些字符会重新请求) */ retryFailed(key: string): void; /** * 提交一批文本:过滤出新字符并异步请求子集。 * 乐观标记 pending,成功移入 loaded、失败移入 failed。 * 超过 maxCharsPerChunk 时自动分批(uni 小程序 loadFontFace 无 unicode-range, * 单次需携带全量累积文本,长文本按批切分避免 URL 超限)。 */ submitText(key: string, text: string, maxCharsPerChunk?: number): void; /** 执行一次子集请求 + 注册(在并发槽内完成) */ private loadChunk; /** 并发池:超出 maxConcurrent 的任务排队等待 */ private enqueue; /** * 执行一个任务,完成后从队列取下一个。 * 注意:这里必须直接调用 next(fn),不能递归调用外层 run 闭包—— * 那样会把下一个任务替换成本次任务重跑(闭包捕获),队列真身丢失 */ private execute; setMaxConcurrent(n: number): void; } //#endregion export { IEngineConfig, IEnsureStateOptions, IFontState, IncrementalEngine, LoadedChunk, SubsetProvider, createHttpProvider };