/** * 运行时目录(live catalog)—— client 侧从 host 拉取目录并回退到内置快照。 * * 背景:徽章与覆盖面板此前只吃**构建期烤进 bundle** 的快照 * (`__PEAKRATE_PROFILES__`)。host 每 24h 拉取目录却无人消费 —— 数据源更新后 * 界面不会变,除非重新构建并重装插件。现在 host 通过带信任围栏的 * `/peakrate/catalog` 把运行时目录交给这里。 * * 设计取舍: * - **内置快照永远是兜底**:拉取失败(离线 / 首启 / 被围栏拒绝)时静默回退, * 绝不让徽章因为网络问题消失。首屏不等网络 —— 先用内置的渲染,拿到再替换。 * - **单一数据源**:模块级一份 `profiles`,组件经 `subscribeLiveCatalog` 订阅, * 拉取落地后立即重渲染,不必等下一次 30s 心跳。 */ import type { RateProfile } from '../matching.js'; /** 最近一次拉取的结果描述,供覆盖面板如实显示数据来源。 */ declare let liveMeta: { origin: 'remote' | 'builtin'; fetchedAt?: string; updatedAt?: string; } | undefined; /** 拉取状态:idle 表示还没试过。 */ declare let liveStatus: 'idle' | 'loading' | 'ready' | 'failed'; /** 订阅运行时目录的变化;返回取消订阅函数。 */ export declare function subscribeLiveCatalog(listener: () => void): () => void; /** * 取当前生效的 profile 列表。 * * @param fallback - 内置快照;仅在还没成功拉到运行时目录时使用。 * @returns 运行时目录优先,否则回退。 */ export declare function resolveProfiles(fallback: readonly RateProfile[]): RateProfile[]; /** 运行时目录的元信息(数据来源 / 取得时间),供覆盖面板展示。 */ export declare function liveCatalogMeta(): typeof liveMeta; /** 当前拉取状态。 */ export declare function liveCatalogStatus(): typeof liveStatus; /** 最近一次失败原因(若有)。 */ export declare function liveCatalogError(): string | undefined; /** * 从 host 拉取一次目录。 * * @param options - `refresh: true` 时用 POST 让 host **强制重新拉取远端**, * 否则 GET 只读 host 当前已有的目录。 * @returns 是否成功拿到新目录。 */ export declare function fetchLiveCatalog(options?: { refresh?: boolean; }): Promise; export {};