xxf_react 0.6.6 → 0.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +14 -48
  2. package/dist/foundation/Copy.d.ts +8 -0
  3. package/dist/foundation/Copy.d.ts.map +1 -0
  4. package/dist/foundation/Copy.js +21 -0
  5. package/dist/foundation/index.d.ts +2 -0
  6. package/dist/foundation/index.d.ts.map +1 -1
  7. package/dist/foundation/index.js +2 -0
  8. package/dist/http/api/ApiBuilder.d.ts +115 -0
  9. package/dist/http/api/ApiBuilder.d.ts.map +1 -0
  10. package/dist/http/api/ApiBuilder.js +128 -0
  11. package/dist/http/api/index.d.ts +2 -0
  12. package/dist/http/api/index.d.ts.map +1 -0
  13. package/dist/http/api/index.js +1 -0
  14. package/dist/http/cache/DiskLruCache.d.ts +66 -0
  15. package/dist/http/cache/DiskLruCache.d.ts.map +1 -0
  16. package/dist/http/cache/DiskLruCache.js +254 -0
  17. package/dist/http/cache/HttpCache.d.ts +59 -0
  18. package/dist/http/cache/HttpCache.d.ts.map +1 -0
  19. package/dist/http/cache/HttpCache.js +215 -0
  20. package/dist/http/cache/index.d.ts +3 -0
  21. package/dist/http/cache/index.d.ts.map +1 -0
  22. package/dist/http/cache/index.js +2 -0
  23. package/dist/http/client/ApiStream.d.ts +80 -0
  24. package/dist/http/client/ApiStream.d.ts.map +1 -0
  25. package/dist/http/client/ApiStream.js +190 -0
  26. package/dist/http/client/HttpClient.d.ts +88 -0
  27. package/dist/http/client/HttpClient.d.ts.map +1 -0
  28. package/dist/http/client/HttpClient.js +381 -0
  29. package/dist/http/client/index.d.ts +3 -0
  30. package/dist/http/client/index.d.ts.map +1 -0
  31. package/dist/http/client/index.js +2 -0
  32. package/dist/http/index.d.ts +42 -0
  33. package/dist/http/index.d.ts.map +1 -0
  34. package/dist/http/index.js +45 -0
  35. package/dist/http/models/ApiTypes.d.ts +54 -0
  36. package/dist/http/models/ApiTypes.d.ts.map +1 -0
  37. package/dist/http/models/ApiTypes.js +4 -0
  38. package/dist/http/models/CacheConfig.d.ts +58 -0
  39. package/dist/http/models/CacheConfig.d.ts.map +1 -0
  40. package/dist/http/models/CacheConfig.js +4 -0
  41. package/dist/http/models/CacheEntry.d.ts +28 -0
  42. package/dist/http/models/CacheEntry.d.ts.map +1 -0
  43. package/dist/http/models/CacheEntry.js +1 -0
  44. package/dist/http/models/CacheInterceptor.d.ts +112 -0
  45. package/dist/http/models/CacheInterceptor.d.ts.map +1 -0
  46. package/dist/http/models/CacheInterceptor.js +6 -0
  47. package/dist/http/models/CacheMode.d.ts +45 -0
  48. package/dist/http/models/CacheMode.d.ts.map +1 -0
  49. package/dist/http/models/CacheMode.js +45 -0
  50. package/dist/http/models/DiskCacheConfig.d.ts +56 -0
  51. package/dist/http/models/DiskCacheConfig.d.ts.map +1 -0
  52. package/dist/http/models/DiskCacheConfig.js +4 -0
  53. package/dist/http/models/HttpClientConfig.d.ts +77 -0
  54. package/dist/http/models/HttpClientConfig.d.ts.map +1 -0
  55. package/dist/http/models/HttpClientConfig.js +4 -0
  56. package/dist/http/models/LruMetadata.d.ts +28 -0
  57. package/dist/http/models/LruMetadata.d.ts.map +1 -0
  58. package/dist/http/models/LruMetadata.js +6 -0
  59. package/dist/http/models/RequestConfig.d.ts +67 -0
  60. package/dist/http/models/RequestConfig.d.ts.map +1 -0
  61. package/dist/http/models/RequestConfig.js +4 -0
  62. package/dist/http/models/index.d.ts +24 -0
  63. package/dist/http/models/index.d.ts.map +1 -0
  64. package/dist/http/models/index.js +16 -0
  65. package/dist/http/types.d.ts +13 -0
  66. package/dist/http/types.d.ts.map +1 -0
  67. package/dist/http/types.js +14 -0
  68. package/dist/index.d.ts +1 -0
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +3 -0
  71. package/package.json +14 -4
@@ -0,0 +1,42 @@
1
+ /**
2
+ * HTTP 网络框架
3
+ *
4
+ * 基于 ky + idb-keyval,支持:
5
+ * - 内存 + 磁盘双层缓存
6
+ * - 6 种缓存模式
7
+ * - AsyncGenerator 流式响应
8
+ * - 类 Retrofit 的 API 定义方式
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { ApiBuilder, CacheMode } from 'xxf_react/http'
13
+ *
14
+ * const userApi = ApiBuilder.create({
15
+ * baseUrl: 'https://api.example.com',
16
+ * })
17
+ * .get<User>('getUser', {
18
+ * path: '/users/{id}',
19
+ * cache: { mode: CacheMode.IfCache, ttl: 60000 },
20
+ * })
21
+ * .build()
22
+ *
23
+ * // 方式1: 简单 await
24
+ * const user = await userApi.getUser({ pathParams: { id: '123' } })
25
+ *
26
+ * // 方式2: for await 多次响应
27
+ * for await (const { data, fromCache } of userApi.getUser({ pathParams: { id: '123' } })) {
28
+ * console.log(data, fromCache)
29
+ * }
30
+ *
31
+ * // 方式3: subscribe 安全消费
32
+ * await userApi.getUser({ pathParams: { id: '123' } }).subscribe({
33
+ * onData: (data, fromCache) => console.log(data),
34
+ * onError: (e) => console.error(e),
35
+ * })
36
+ * ```
37
+ */
38
+ export { CacheMode, type CacheEntry, type ApiResult, type ApiCallback, type CacheConfig, type CacheKeyRequest, type HttpClientConfig, type RequestConfig, type ApiOptions, type DiskLruCacheConfig, type HttpCacheConfig, type CacheInterceptor, type CacheInterceptorContext, type CacheInterceptorResult, } from './types';
39
+ export { DiskLruCache, HttpCache } from './cache';
40
+ export { HttpClient, ApiStream } from './client';
41
+ export { ApiBuilder, type ApiEndpoint, type ApiDefinition } from './api';
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAGH,OAAO,EACH,SAAS,EACT,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,eAAe,EAEpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,GAC9B,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAGjD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGhD,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAA"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * HTTP 网络框架
3
+ *
4
+ * 基于 ky + idb-keyval,支持:
5
+ * - 内存 + 磁盘双层缓存
6
+ * - 6 种缓存模式
7
+ * - AsyncGenerator 流式响应
8
+ * - 类 Retrofit 的 API 定义方式
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { ApiBuilder, CacheMode } from 'xxf_react/http'
13
+ *
14
+ * const userApi = ApiBuilder.create({
15
+ * baseUrl: 'https://api.example.com',
16
+ * })
17
+ * .get<User>('getUser', {
18
+ * path: '/users/{id}',
19
+ * cache: { mode: CacheMode.IfCache, ttl: 60000 },
20
+ * })
21
+ * .build()
22
+ *
23
+ * // 方式1: 简单 await
24
+ * const user = await userApi.getUser({ pathParams: { id: '123' } })
25
+ *
26
+ * // 方式2: for await 多次响应
27
+ * for await (const { data, fromCache } of userApi.getUser({ pathParams: { id: '123' } })) {
28
+ * console.log(data, fromCache)
29
+ * }
30
+ *
31
+ * // 方式3: subscribe 安全消费
32
+ * await userApi.getUser({ pathParams: { id: '123' } }).subscribe({
33
+ * onData: (data, fromCache) => console.log(data),
34
+ * onError: (e) => console.error(e),
35
+ * })
36
+ * ```
37
+ */
38
+ // Types
39
+ export { CacheMode, } from './types';
40
+ // Cache
41
+ export { DiskLruCache, HttpCache } from './cache';
42
+ // Client
43
+ export { HttpClient, ApiStream } from './client';
44
+ // API
45
+ export { ApiBuilder } from './api';
@@ -0,0 +1,54 @@
1
+ /**
2
+ * API 响应相关类型
3
+ */
4
+ /**
5
+ * API 响应结果
6
+ *
7
+ * 包含响应数据和来源标识
8
+ *
9
+ * @template T 响应数据类型
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * for await (const result of api.getUser({ pathParams: { id: '1' } })) {
14
+ * if (result.fromCache) {
15
+ * showSkeleton(result.data)
16
+ * } else {
17
+ * renderFull(result.data)
18
+ * }
19
+ * }
20
+ * ```
21
+ */
22
+ export interface ApiResult<T> {
23
+ /** 响应数据 */
24
+ data: T;
25
+ /** 是否来自缓存 */
26
+ fromCache: boolean;
27
+ }
28
+ /**
29
+ * API 回调配置
30
+ *
31
+ * 用于 subscribe 安全消费模式,确保回调错误不影响后续响应
32
+ *
33
+ * @template T 响应数据类型
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * await api.getUser({ pathParams: { id: '1' } }).subscribe({
38
+ * onData: (data, fromCache) => {
39
+ * renderUI(data) // 即使这里抛错,网络数据仍会返回
40
+ * },
41
+ * onError: (e) => console.error(e),
42
+ * onComplete: () => console.log('done'),
43
+ * })
44
+ * ```
45
+ */
46
+ export interface ApiCallback<T> {
47
+ /** 数据回调 (可能多次调用) */
48
+ onData: (data: T, fromCache: boolean) => void;
49
+ /** 错误回调 */
50
+ onError?: (error: Error) => void;
51
+ /** 完成回调 */
52
+ onComplete?: () => void;
53
+ }
54
+ //# sourceMappingURL=ApiTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiTypes.d.ts","sourceRoot":"","sources":["../../../src/http/models/ApiTypes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC;IACxB,WAAW;IACX,IAAI,EAAE,CAAC,CAAA;IACP,aAAa;IACb,SAAS,EAAE,OAAO,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,oBAAoB;IACpB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7C,WAAW;IACX,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;CAC1B"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * API 响应相关类型
3
+ */
4
+ export {};
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 缓存配置相关类型
3
+ */
4
+ import { CacheMode } from './CacheMode';
5
+ /**
6
+ * 缓存 key 计算请求参数
7
+ *
8
+ * 用于自定义缓存 key 生成函数
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * cache: {
13
+ * cacheKey: (req: CacheKeyRequest) => `user:${req.pathParams?.id}`,
14
+ * }
15
+ * ```
16
+ */
17
+ export interface CacheKeyRequest {
18
+ /** 请求方法 */
19
+ method: string;
20
+ /** 请求路径 */
21
+ path: string;
22
+ /** 查询参数 */
23
+ query?: Record<string, unknown>;
24
+ /** 请求体 */
25
+ body?: unknown;
26
+ /** 请求头 */
27
+ headers?: Record<string, string>;
28
+ /** 路径参数 */
29
+ pathParams?: Record<string, string | number>;
30
+ }
31
+ /**
32
+ * 缓存配置
33
+ *
34
+ * 用于配置单个 API 的缓存行为
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * .get<User>('getUser', {
39
+ * path: '/users/{id}',
40
+ * cache: {
41
+ * mode: CacheMode.FirstCache,
42
+ * ttl: 5 * 60 * 1000, // 5 分钟
43
+ * keyHeaders: ['Authorization'],
44
+ * },
45
+ * })
46
+ * ```
47
+ */
48
+ export interface CacheConfig {
49
+ /** 缓存模式 */
50
+ mode: CacheMode;
51
+ /** 缓存时间 (ms),默认 5 分钟 */
52
+ ttl?: number;
53
+ /** 参与缓存 key 计算的 header 名称 */
54
+ keyHeaders?: string[];
55
+ /** 自定义缓存 key 生成函数 */
56
+ cacheKey?: (request: CacheKeyRequest) => string;
57
+ }
58
+ //# sourceMappingURL=CacheConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheConfig.d.ts","sourceRoot":"","sources":["../../../src/http/models/CacheConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC5B,WAAW;IACX,MAAM,EAAE,MAAM,CAAA;IACd,WAAW;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,UAAU;IACV,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,UAAU;IACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;CAC/C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,WAAW;IACxB,WAAW;IACX,IAAI,EAAE,SAAS,CAAA;IACf,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,MAAM,CAAA;CAClD"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 缓存配置相关类型
3
+ */
4
+ export {};
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 缓存条目
3
+ *
4
+ * 存储在内存缓存和磁盘缓存中的数据结构
5
+ *
6
+ * @template T 缓存数据类型
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const entry: CacheEntry<User> = {
11
+ * data: { id: '1', name: 'John' },
12
+ * timestamp: Date.now(),
13
+ * ttl: 5 * 60 * 1000, // 5 分钟
14
+ * key: 'GET:/users/1',
15
+ * }
16
+ * ```
17
+ */
18
+ export interface CacheEntry<T = unknown> {
19
+ /** 缓存数据 */
20
+ data: T;
21
+ /** 缓存时间戳 (ms) */
22
+ timestamp: number;
23
+ /** 过期时间 (ms),0 表示永不过期 */
24
+ ttl: number;
25
+ /** 缓存 key */
26
+ key: string;
27
+ }
28
+ //# sourceMappingURL=CacheEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheEntry.d.ts","sourceRoot":"","sources":["../../../src/http/models/CacheEntry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACnC,WAAW;IACX,IAAI,EAAE,CAAC,CAAA;IACP,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,aAAa;IACb,GAAG,EAAE,MAAM,CAAA;CACd"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,112 @@
1
+ /**
2
+ * 缓存拦截器相关类型
3
+ *
4
+ * 用于根据响应内容动态决定是否缓存
5
+ */
6
+ import type { CacheKeyRequest } from './CacheConfig';
7
+ /**
8
+ * 缓存拦截器上下文
9
+ *
10
+ * 包含响应的完整信息,供拦截器判断是否应该缓存
11
+ *
12
+ * @template T 响应数据类型
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * cacheInterceptor: (ctx) => {
17
+ * // 可以访问响应数据、HTTP 状态码、响应头等
18
+ * console.log(ctx.data) // 响应数据
19
+ * console.log(ctx.status) // HTTP 状态码
20
+ * console.log(ctx.headers) // 响应头
21
+ * console.log(ctx.request) // 请求信息
22
+ * console.log(ctx.cacheKey) // 缓存 key
23
+ * }
24
+ * ```
25
+ */
26
+ export interface CacheInterceptorContext<T = unknown> {
27
+ /** 响应数据(已解析的 JSON) */
28
+ data: T;
29
+ /** HTTP 状态码 */
30
+ status: number;
31
+ /** 响应头 */
32
+ headers: Headers;
33
+ /** 请求信息(用于调试或高级判断) */
34
+ request: CacheKeyRequest;
35
+ /** 缓存 key(用于调试或高级判断) */
36
+ cacheKey: string;
37
+ }
38
+ /**
39
+ * 缓存拦截器返回结果
40
+ *
41
+ * 当需要更精细控制时使用对象形式返回
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * // 简单返回 boolean
46
+ * cacheInterceptor: (ctx) => ctx.status === 200
47
+ *
48
+ * // 返回对象,可以覆盖 TTL
49
+ * cacheInterceptor: (ctx) => ({
50
+ * shouldCache: true,
51
+ * ttl: 10 * 60 * 1000, // 覆盖为 10 分钟
52
+ * })
53
+ * ```
54
+ */
55
+ export interface CacheInterceptorResult {
56
+ /** 是否允许缓存 */
57
+ shouldCache: boolean;
58
+ /**
59
+ * 可选:覆盖缓存 TTL (ms)
60
+ * 如果不指定,使用请求配置中的 ttl
61
+ */
62
+ ttl?: number;
63
+ }
64
+ /**
65
+ * 缓存拦截器
66
+ *
67
+ * 在响应返回后、写入缓存前调用,用于根据响应内容决定是否缓存。
68
+ *
69
+ * ## 常见场景
70
+ * - 只缓存 HTTP 200 响应
71
+ * - 只缓存业务 code 为成功的响应
72
+ * - 根据响应头决定是否缓存
73
+ * - 根据响应内容动态调整缓存时间
74
+ *
75
+ * ## 返回值
76
+ * - `true`:允许缓存
77
+ * - `false`:不缓存
78
+ * - `CacheInterceptorResult`:精细控制(是否缓存 + 可选覆盖 TTL)
79
+ * - `Promise<...>`:支持异步判断
80
+ *
81
+ * @template T 响应数据类型
82
+ * @param context 拦截器上下文,包含响应的完整信息
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * // 示例 1:只缓存 HTTP 200
87
+ * cacheInterceptor: (ctx) => ctx.status === 200
88
+ *
89
+ * // 示例 2:检查业务 code
90
+ * cacheInterceptor: (ctx) => {
91
+ * const res = ctx.data as { code?: number }
92
+ * return res.code === 200
93
+ * }
94
+ *
95
+ * // 示例 3:检查响应头
96
+ * cacheInterceptor: (ctx) => {
97
+ * return ctx.headers.get('X-Cacheable') !== 'false'
98
+ * }
99
+ *
100
+ * // 示例 4:动态 TTL
101
+ * cacheInterceptor: (ctx) => {
102
+ * const res = ctx.data as { code?: number; cacheTtl?: number }
103
+ * if (res.code !== 200) return false
104
+ * return {
105
+ * shouldCache: true,
106
+ * ttl: res.cacheTtl ?? 5 * 60 * 1000,
107
+ * }
108
+ * }
109
+ * ```
110
+ */
111
+ export type CacheInterceptor<T = unknown> = (context: CacheInterceptorContext<T>) => boolean | CacheInterceptorResult | Promise<boolean | CacheInterceptorResult>;
112
+ //# sourceMappingURL=CacheInterceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheInterceptor.d.ts","sourceRoot":"","sources":["../../../src/http/models/CacheInterceptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,OAAO;IAChD,sBAAsB;IACtB,IAAI,EAAE,CAAC,CAAA;IACP,eAAe;IACf,MAAM,EAAE,MAAM,CAAA;IACd,UAAU;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,sBAAsB;IACtB,OAAO,EAAE,eAAe,CAAA;IACxB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,sBAAsB;IACnC,aAAa;IACb,WAAW,EAAE,OAAO,CAAA;IACpB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,OAAO,IAAI,CACxC,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,KAClC,OAAO,GAAG,sBAAsB,GAAG,OAAO,CAAC,OAAO,GAAG,sBAAsB,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 缓存拦截器相关类型
3
+ *
4
+ * 用于根据响应内容动态决定是否缓存
5
+ */
6
+ export {};
@@ -0,0 +1,45 @@
1
+ /**
2
+ * 缓存模式枚举
3
+ *
4
+ * 定义了 6 种缓存策略,覆盖各种业务场景
5
+ */
6
+ export declare enum CacheMode {
7
+ /**
8
+ * 先从本地缓存拿,然后从服务器拿
9
+ * - 可能 yield 两次(先缓存后网络)
10
+ * - 适用于:需要快速展示旧数据,同时更新最新数据
11
+ */
12
+ FirstCache = "firstCache",
13
+ /**
14
+ * 先从服务器获取,没网络则读缓存
15
+ * - yield 1 次
16
+ * - 适用于:优先保证数据最新,网络异常时降级
17
+ */
18
+ FirstRemote = "firstRemote",
19
+ /**
20
+ * 只从服务器拿(默认模式)
21
+ * - yield 1 次
22
+ * - 适用于:实时性要求高的数据
23
+ */
24
+ OnlyRemote = "onlyRemote",
25
+ /**
26
+ * 只从缓存拿
27
+ * - yield 0-1 次(无缓存时不 yield)
28
+ * - 适用于:离线场景、纯本地数据
29
+ */
30
+ OnlyCache = "onlyCache",
31
+ /**
32
+ * 有缓存返回缓存,否则请求网络
33
+ * - yield 1 次
34
+ * - 适用于:缓存优先,减少网络请求
35
+ */
36
+ IfCache = "ifCache",
37
+ /**
38
+ * 读上次缓存,后台静默更新
39
+ * - yield 1 次(返回缓存或网络)
40
+ * - 有缓存时后台同步网络但不 yield
41
+ * - 适用于:SWR(stale-while-revalidate)策略
42
+ */
43
+ LastCache = "lastCache"
44
+ }
45
+ //# sourceMappingURL=CacheMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheMode.d.ts","sourceRoot":"","sources":["../../../src/http/models/CacheMode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,oBAAY,SAAS;IACjB;;;;OAIG;IACH,UAAU,eAAe;IAEzB;;;;OAIG;IACH,WAAW,gBAAgB;IAE3B;;;;OAIG;IACH,UAAU,eAAe;IAEzB;;;;OAIG;IACH,SAAS,cAAc;IAEvB;;;;OAIG;IACH,OAAO,YAAY;IAEnB;;;;;OAKG;IACH,SAAS,cAAc;CAC1B"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * 缓存模式枚举
3
+ *
4
+ * 定义了 6 种缓存策略,覆盖各种业务场景
5
+ */
6
+ export var CacheMode;
7
+ (function (CacheMode) {
8
+ /**
9
+ * 先从本地缓存拿,然后从服务器拿
10
+ * - 可能 yield 两次(先缓存后网络)
11
+ * - 适用于:需要快速展示旧数据,同时更新最新数据
12
+ */
13
+ CacheMode["FirstCache"] = "firstCache";
14
+ /**
15
+ * 先从服务器获取,没网络则读缓存
16
+ * - yield 1 次
17
+ * - 适用于:优先保证数据最新,网络异常时降级
18
+ */
19
+ CacheMode["FirstRemote"] = "firstRemote";
20
+ /**
21
+ * 只从服务器拿(默认模式)
22
+ * - yield 1 次
23
+ * - 适用于:实时性要求高的数据
24
+ */
25
+ CacheMode["OnlyRemote"] = "onlyRemote";
26
+ /**
27
+ * 只从缓存拿
28
+ * - yield 0-1 次(无缓存时不 yield)
29
+ * - 适用于:离线场景、纯本地数据
30
+ */
31
+ CacheMode["OnlyCache"] = "onlyCache";
32
+ /**
33
+ * 有缓存返回缓存,否则请求网络
34
+ * - yield 1 次
35
+ * - 适用于:缓存优先,减少网络请求
36
+ */
37
+ CacheMode["IfCache"] = "ifCache";
38
+ /**
39
+ * 读上次缓存,后台静默更新
40
+ * - yield 1 次(返回缓存或网络)
41
+ * - 有缓存时后台同步网络但不 yield
42
+ * - 适用于:SWR(stale-while-revalidate)策略
43
+ */
44
+ CacheMode["LastCache"] = "lastCache";
45
+ })(CacheMode || (CacheMode = {}));
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 缓存存储配置
3
+ */
4
+ /**
5
+ * DiskLruCache 配置
6
+ *
7
+ * 用于配置基于 IndexedDB 的磁盘 LRU 缓存
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const diskCache = new DiskLruCache({
12
+ * dbName: 'my-app-cache',
13
+ * storeName: 'http-cache',
14
+ * maxSize: 500,
15
+ * cleanupThreshold: 0.1,
16
+ * })
17
+ * ```
18
+ */
19
+ export interface DiskLruCacheConfig {
20
+ /** IndexedDB 数据库名 */
21
+ dbName: string;
22
+ /** 存储名(ObjectStore 名称) */
23
+ storeName: string;
24
+ /** 最大条目数 */
25
+ maxSize: number;
26
+ /**
27
+ * 清理阈值
28
+ *
29
+ * 超过 maxSize * (1 + cleanupThreshold) 后触发清理
30
+ * 默认 0.1,即超过 110% 时清理到 100%
31
+ */
32
+ cleanupThreshold?: number;
33
+ }
34
+ /**
35
+ * HttpCache 配置
36
+ *
37
+ * 用于配置 HTTP 缓存(内存 + 磁盘双层)
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * const cache = new HttpCache({
42
+ * memoryMaxSize: 100,
43
+ * diskMaxSize: 500,
44
+ * dbName: 'my-app-cache',
45
+ * })
46
+ * ```
47
+ */
48
+ export interface HttpCacheConfig {
49
+ /** 内存缓存最大条目数 */
50
+ memoryMaxSize: number;
51
+ /** 磁盘缓存最大条目数 */
52
+ diskMaxSize: number;
53
+ /** IndexedDB 数据库名 */
54
+ dbName: string;
55
+ }
56
+ //# sourceMappingURL=DiskCacheConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiskCacheConfig.d.ts","sourceRoot":"","sources":["../../../src/http/models/DiskCacheConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,kBAAkB;IAC/B,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY;IACZ,OAAO,EAAE,MAAM,CAAA;IACf;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC5B,gBAAgB;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAA;CACjB"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 缓存存储配置
3
+ */
4
+ export {};
@@ -0,0 +1,77 @@
1
+ /**
2
+ * HTTP 客户端配置
3
+ */
4
+ import type { CacheConfig } from './CacheConfig';
5
+ import type { CacheInterceptor } from './CacheInterceptor';
6
+ /**
7
+ * HTTP 客户端配置
8
+ *
9
+ * 用于创建 HttpClient 或 ApiBuilder 时的全局配置
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const api = ApiBuilder.create({
14
+ * baseUrl: 'https://api.example.com',
15
+ * timeout: 10000,
16
+ * headers: { 'X-App-Version': '1.0.0' },
17
+ * defaultCache: {
18
+ * mode: CacheMode.FirstRemote,
19
+ * ttl: 5 * 60 * 1000,
20
+ * },
21
+ * cacheInterceptor: (ctx) => ctx.status === 200,
22
+ * })
23
+ * ```
24
+ */
25
+ export interface HttpClientConfig {
26
+ /** 基础 URL */
27
+ baseUrl: string;
28
+ /** 默认请求头 */
29
+ headers?: Record<string, string>;
30
+ /** 默认超时时间 (ms),默认 30000 */
31
+ timeout?: number;
32
+ /** 默认重试次数,默认 2 */
33
+ retry?: number;
34
+ /** 内存缓存最大条目数,默认 100 */
35
+ memoryCacheMaxSize?: number;
36
+ /** 磁盘缓存最大条目数,默认 500 */
37
+ diskCacheMaxSize?: number;
38
+ /** IndexedDB 数据库名,默认 'xxf-http-cache' */
39
+ dbName?: string;
40
+ /** 默认参与缓存 key 的 header,默认 ['Authorization'] */
41
+ defaultKeyHeaders?: string[];
42
+ /**
43
+ * 全局默认缓存配置
44
+ *
45
+ * 如果不设置,默认为 OnlyRemote(不缓存)
46
+ * 单个接口的 cache 配置会覆盖此全局配置
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * defaultCache: {
51
+ * mode: CacheMode.FirstRemote,
52
+ * ttl: 5 * 60 * 1000,
53
+ * }
54
+ * ```
55
+ */
56
+ defaultCache?: Partial<CacheConfig>;
57
+ /**
58
+ * 全局缓存拦截器
59
+ *
60
+ * 在响应返回后、写入缓存前调用,用于根据响应内容决定是否缓存。
61
+ * 只有当缓存模式需要写入缓存时才会调用此拦截器。
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * // 只缓存 HTTP 200 且业务 code 为 200 的响应
66
+ * cacheInterceptor: (ctx) => {
67
+ * if (ctx.status !== 200) return false
68
+ * const res = ctx.data as { code?: number }
69
+ * return res.code === 200
70
+ * }
71
+ * ```
72
+ *
73
+ * @see CacheInterceptor 查看更多示例
74
+ */
75
+ cacheInterceptor?: CacheInterceptor;
76
+ }
77
+ //# sourceMappingURL=HttpClientConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClientConfig.d.ts","sourceRoot":"","sources":["../../../src/http/models/HttpClientConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE1D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,gBAAgB;IAC7B,aAAa;IACb,OAAO,EAAE,MAAM,CAAA;IAEf,YAAY;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEhC,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,uBAAuB;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAE3B,uBAAuB;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAE5B;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAEnC;;;;;;;;;;;;;;;;;OAiBG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACtC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * HTTP 客户端配置
3
+ */
4
+ export {};
@@ -0,0 +1,28 @@
1
+ /**
2
+ * LRU 缓存元数据
3
+ *
4
+ * 用于 DiskLruCache 内部管理缓存条目的访问顺序
5
+ */
6
+ /**
7
+ * LRU 元数据条目
8
+ *
9
+ * 单个缓存条目的元数据信息
10
+ */
11
+ export interface LruMetadataEntry {
12
+ /** 最后访问时间 (ms) */
13
+ accessTime: number;
14
+ /** 数据大小估算 (可选,用于未来扩展) */
15
+ size?: number;
16
+ }
17
+ /**
18
+ * LRU 元数据
19
+ *
20
+ * 存储在 IndexedDB 中的元数据,用于 LRU 淘汰算法
21
+ */
22
+ export interface LruMetadata {
23
+ /** 所有缓存 key 及其元数据 */
24
+ entries: Record<string, LruMetadataEntry>;
25
+ /** 总条目数 */
26
+ count: number;
27
+ }
28
+ //# sourceMappingURL=LruMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LruMetadata.d.ts","sourceRoot":"","sources":["../../../src/http/models/LruMetadata.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC7B,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IACzC,WAAW;IACX,KAAK,EAAE,MAAM,CAAA;CAChB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * LRU 缓存元数据
3
+ *
4
+ * 用于 DiskLruCache 内部管理缓存条目的访问顺序
5
+ */
6
+ export {};