import { type Ref } from 'vue';
import { type MaybeRefOrGetter } from '../../utils/utils';
export type CacheStrategy = 'memory' | 'localStorage' | 'sessionStorage' | 'indexedDB';
export type CacheKeyGenerator
= string | ((params: P) => string);
export interface UseRequestCacheOptions {
/** 请求函数 */
requestFn: (params: P) => Promise;
/** 缓存唯一标记,用于区分不同请求。可以是字符串或生成函数 */
cacheKey: CacheKeyGenerator;
/** 缓存时间(毫秒),默认 5 分钟 (300000ms) */
cacheTime?: number;
/** Storage 策略,默认为 'memory' */
storage?: MaybeRefOrGetter;
/** 请求参数(响应式或普通对象),用于生成动态 key */
params?: MaybeRefOrGetter;
/** 结果转换函数,在返回数据前进行转换 */
transformResult?: (data: R) => T;
/** 是否立即执行,默认 true */
immediate?: boolean;
/** 手动指定的 storage key 前缀,默认 'req_cache_' */
storageKeyPrefix?: string;
/** 首次请求是否强制更新(跳过缓存),默认为 false */
forceRefreshOnFirst?: MaybeRefOrGetter;
/** IndexedDB 数据库名称,仅在 storage 为 'indexedDB' 时有效,默认 'RequestCacheDB' */
dbName?: string;
/** IndexedDB 存储对象名称,仅在 storage 为 'indexedDB' 时有效,默认 'request_cache' */
storeName?: string;
/** 请求成功的回调 */
onSuccess?: (data: T) => void;
/** 请求失败的回调 */
onError?: (error: any) => void;
}
export interface UseRequestCacheReturn {
data: Ref;
loading: Ref;
error: Ref;
/** 执行请求 (优先使用缓存) */
run: () => Promise;
/** 刷新(忽略缓存,强制请求) */
refresh: () => Promise;
/** 清除指定 key 的缓存,如果不传则清除当前自动生成的 key */
clearCache: (key?: string) => Promise;
}
/** 缓存快照条目,由 getRequestCache 返回 */
export interface CacheSnapshot {
/** 缓存的原始 key(不含 storageKeyPrefix) */
key: string;
/** 缓存的原始数据(未经 transformResult 处理) */
data: unknown;
/** 写入时间戳(毫秒) */
timestamp: number;
/** 所在 storage 策略 */
storage: CacheStrategy;
/** 是否已过期(但尚未被清除) */
isExpired: boolean;
}
/** clearRequestCache / getRequestCache 的过滤条件 */
export interface RequestCacheFilter {
/** 指定要操作的 key 列表,不传则匹配所有 */
keys?: string[];
/** 按 storage 策略过滤,不传则匹配所有 */
storage?: CacheStrategy | CacheStrategy[];
/** 按 storageKeyPrefix 过滤,不传则匹配所有 */
storageKeyPrefix?: string;
}
/**
* 支持缓存的请求 Hook
*
* 特性:
* 1. 支持内存、localStorage、sessionStorage 缓存
* 2. 支持请求去重(并发请求共享同一个 Promise)
* 3. 支持结果转换 (transformResult)
* 4. 支持缓存过期时间
*
* @param options 配置选项
*/
export declare function useRequestCache(options: UseRequestCacheOptions): UseRequestCacheReturn;
/**
* 清除缓存注册表中匹配的缓存条目。
* 不传 filter 时清除全部;孤儿缓存(已卸载实例写入的持久化缓存)不在清除范围内,会等待自然过期。
*/
export declare function clearRequestCache(filter?: RequestCacheFilter): Promise;
/**
* 获取缓存注册表中匹配的缓存快照列表。
* 不传 filter 时返回全部;返回的 data 为原始数据,未经 transformResult 处理。
*/
export declare function getRequestCache(filter?: RequestCacheFilter): Promise;
/** setRequestCache 单条注入配置 */
export interface SetRequestCacheEntry {
/** 缓存 key,需与对应 useRequestCache 实例的 cacheKey 保持一致 */
key: string;
/** 要注入的原始数据(与 requestFn 返回类型一致) */
data: unknown;
/** 缓存时间(毫秒),默认 Infinity(永久不过期) */
cacheTime?: number;
/** Storage 策略,默认 'memory' */
storage?: CacheStrategy;
/** storage key 前缀,默认 'req_cache_' */
storageKeyPrefix?: string;
/** IndexedDB 数据库名,默认 'RequestCacheDB' */
dbName?: string;
/** IndexedDB store 名,默认 'request_cache' */
storeName?: string;
}
/**
* 在项目初始化阶段(如 main.ts)批量注入静态缓存数据。
* 注入后,useRequestCache 实例首次 run() 将直接命中缓存,不发起网络请求。
*
* @example
* // main.ts
* await setRequestCache([
* { key: 'user-profile', data: window.__APP_CONFIG__.user },
* { key: 'permissions', data: window.__APP_CONFIG__.permissions },
* ])
* app.mount('#app')
*/
export declare function setRequestCache(entries: SetRequestCacheEntry | SetRequestCacheEntry[]): Promise;
//# sourceMappingURL=index.d.ts.map