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.
- package/README.md +14 -48
- package/dist/foundation/Copy.d.ts +8 -0
- package/dist/foundation/Copy.d.ts.map +1 -0
- package/dist/foundation/Copy.js +21 -0
- package/dist/foundation/index.d.ts +2 -0
- package/dist/foundation/index.d.ts.map +1 -1
- package/dist/foundation/index.js +2 -0
- package/dist/http/api/ApiBuilder.d.ts +115 -0
- package/dist/http/api/ApiBuilder.d.ts.map +1 -0
- package/dist/http/api/ApiBuilder.js +128 -0
- package/dist/http/api/index.d.ts +2 -0
- package/dist/http/api/index.d.ts.map +1 -0
- package/dist/http/api/index.js +1 -0
- package/dist/http/cache/DiskLruCache.d.ts +66 -0
- package/dist/http/cache/DiskLruCache.d.ts.map +1 -0
- package/dist/http/cache/DiskLruCache.js +254 -0
- package/dist/http/cache/HttpCache.d.ts +59 -0
- package/dist/http/cache/HttpCache.d.ts.map +1 -0
- package/dist/http/cache/HttpCache.js +215 -0
- package/dist/http/cache/index.d.ts +3 -0
- package/dist/http/cache/index.d.ts.map +1 -0
- package/dist/http/cache/index.js +2 -0
- package/dist/http/client/ApiStream.d.ts +80 -0
- package/dist/http/client/ApiStream.d.ts.map +1 -0
- package/dist/http/client/ApiStream.js +190 -0
- package/dist/http/client/HttpClient.d.ts +88 -0
- package/dist/http/client/HttpClient.d.ts.map +1 -0
- package/dist/http/client/HttpClient.js +381 -0
- package/dist/http/client/index.d.ts +3 -0
- package/dist/http/client/index.d.ts.map +1 -0
- package/dist/http/client/index.js +2 -0
- package/dist/http/index.d.ts +42 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +45 -0
- package/dist/http/models/ApiTypes.d.ts +54 -0
- package/dist/http/models/ApiTypes.d.ts.map +1 -0
- package/dist/http/models/ApiTypes.js +4 -0
- package/dist/http/models/CacheConfig.d.ts +58 -0
- package/dist/http/models/CacheConfig.d.ts.map +1 -0
- package/dist/http/models/CacheConfig.js +4 -0
- package/dist/http/models/CacheEntry.d.ts +28 -0
- package/dist/http/models/CacheEntry.d.ts.map +1 -0
- package/dist/http/models/CacheEntry.js +1 -0
- package/dist/http/models/CacheInterceptor.d.ts +112 -0
- package/dist/http/models/CacheInterceptor.d.ts.map +1 -0
- package/dist/http/models/CacheInterceptor.js +6 -0
- package/dist/http/models/CacheMode.d.ts +45 -0
- package/dist/http/models/CacheMode.d.ts.map +1 -0
- package/dist/http/models/CacheMode.js +45 -0
- package/dist/http/models/DiskCacheConfig.d.ts +56 -0
- package/dist/http/models/DiskCacheConfig.d.ts.map +1 -0
- package/dist/http/models/DiskCacheConfig.js +4 -0
- package/dist/http/models/HttpClientConfig.d.ts +77 -0
- package/dist/http/models/HttpClientConfig.d.ts.map +1 -0
- package/dist/http/models/HttpClientConfig.js +4 -0
- package/dist/http/models/LruMetadata.d.ts +28 -0
- package/dist/http/models/LruMetadata.d.ts.map +1 -0
- package/dist/http/models/LruMetadata.js +6 -0
- package/dist/http/models/RequestConfig.d.ts +67 -0
- package/dist/http/models/RequestConfig.d.ts.map +1 -0
- package/dist/http/models/RequestConfig.js +4 -0
- package/dist/http/models/index.d.ts +24 -0
- package/dist/http/models/index.d.ts.map +1 -0
- package/dist/http/models/index.js +16 -0
- package/dist/http/types.d.ts +13 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +14 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/package.json +14 -4
package/README.md
CHANGED
|
@@ -18,55 +18,21 @@ This project was created using `bun init` in bun v1.3.2. [Bun](https://bun.com)
|
|
|
18
18
|
|
|
19
19
|
## 模块文档
|
|
20
20
|
|
|
21
|
-
| 模块
|
|
22
|
-
|
|
23
|
-
| [event-bus](./src/event-bus/README.md)
|
|
24
|
-
| [fetch](./src/fetch/README.md)
|
|
25
|
-
| [
|
|
26
|
-
| [
|
|
27
|
-
| [
|
|
28
|
-
| [
|
|
29
|
-
| [
|
|
30
|
-
| [
|
|
31
|
-
| [
|
|
32
|
-
| [
|
|
33
|
-
| [
|
|
21
|
+
| 模块 | 说明 |
|
|
22
|
+
|------------------------------------------|-------------------------|
|
|
23
|
+
| [event-bus](./src/event-bus/README.md) | 事件总线,支持跨 Tab 通信 |
|
|
24
|
+
| [fetch](./src/fetch/README.md) | 带超时控制的 fetch 封装 |
|
|
25
|
+
| [http](./src/http/README.md) | 超强网络框架设计 |
|
|
26
|
+
| [flow](./src/flow/README.md) | Promise 扩展,全局错误处理 |
|
|
27
|
+
| [foundation](./src/foundation/README.md) | 基础工具,性能监控 |
|
|
28
|
+
| [layout](./src/layout/README.md) | 布局组件,悬浮交互 |
|
|
29
|
+
| [media](./src/media/README.md) | 媒体组件,视频播放 |
|
|
30
|
+
| [models](./src/models/README.md) | 数据模型,API 响应类型 |
|
|
31
|
+
| [refresh](./src/refresh/README.md) | 刷新加载,分页加载更多 |
|
|
32
|
+
| [responsive](./src/responsive/README.md) | 响应式布局,设备检测 |
|
|
33
|
+
| [sse](./src/sse/README.md) | Server-Sent Events 连接管理 |
|
|
34
|
+
| [utils](./src/utils/README.md) | 工具函数,滚动定位、组件刷新 |
|
|
34
35
|
|
|
35
36
|
## 详细文档
|
|
36
37
|
|
|
37
38
|
- [PlaybackQueue 播放队列状态管理](./src/media/playback-queue-store.md)
|
|
38
|
-
|
|
39
|
-
### VideoPlaySafe 视频安全播放
|
|
40
|
-
|
|
41
|
-
处理移动端自动播放限制,自动降级为静音播放。
|
|
42
|
-
|
|
43
|
-
#### 功能特性
|
|
44
|
-
|
|
45
|
-
- 按当前 `video.muted` 状态尝试播放
|
|
46
|
-
- 如果非静音播放失败(`NotAllowedError` / `AbortError`),自动降级为静音重试
|
|
47
|
-
- 支持扩展 `HTMLVideoElement` 原型,直接调用 `video.playSafe()`
|
|
48
|
-
|
|
49
|
-
#### 使用方式
|
|
50
|
-
|
|
51
|
-
```typescript
|
|
52
|
-
import { playSafe, extendVideoElement } from '@xxf/react/media/video-play-safe';
|
|
53
|
-
|
|
54
|
-
// 方式一:直接调用函数
|
|
55
|
-
await playSafe(videoElement, {
|
|
56
|
-
mutedRetry: true, // 是否在非静音播放失败时降级为静音重试,默认 true
|
|
57
|
-
onMutedChange: () => { // 从有声降级为静音时回调
|
|
58
|
-
console.log('已降级为静音播放');
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
// 方式二:扩展原型后调用
|
|
63
|
-
extendVideoElement();
|
|
64
|
-
await videoElement.playSafe({ mutedRetry: true });
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
#### API
|
|
68
|
-
|
|
69
|
-
| 参数 | 类型 | 默认值 | 说明 |
|
|
70
|
-
|------|------|--------|------|
|
|
71
|
-
| `mutedRetry` | `boolean` | `true` | 是否在非静音播放失败时降级为静音重试 |
|
|
72
|
-
| `onMutedChange` | `() => void` | - | 从有声降级为静音时的回调函数 |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Copy.d.ts","sourceRoot":"","sources":["../../src/foundation/Copy.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAEnC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// utils/copy.ts
|
|
2
|
+
import rfdc from 'rfdc';
|
|
3
|
+
/**
|
|
4
|
+
* 内部深拷贝实现
|
|
5
|
+
*
|
|
6
|
+
* proto: false -> 不拷贝原型链(更安全)
|
|
7
|
+
* circles: true -> 支持循环引用
|
|
8
|
+
*/
|
|
9
|
+
const deepCloneImpl = rfdc({
|
|
10
|
+
proto: false,
|
|
11
|
+
circles: true,
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* 深拷贝
|
|
15
|
+
*
|
|
16
|
+
* 业务层只调用 copy()
|
|
17
|
+
* 不感知具体实现
|
|
18
|
+
*/
|
|
19
|
+
export function copy(value) {
|
|
20
|
+
return deepCloneImpl(value);
|
|
21
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/foundation/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/foundation/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,QAAQ,CAAA"}
|
package/dist/foundation/index.js
CHANGED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 构建器
|
|
3
|
+
*
|
|
4
|
+
* 使用 Builder 模式定义 API,类似 Android Retrofit
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* const userApi = ApiBuilder.create({
|
|
9
|
+
* baseUrl: 'https://api.example.com',
|
|
10
|
+
* })
|
|
11
|
+
* .get<User>('getUser', {
|
|
12
|
+
* path: '/users/{id}',
|
|
13
|
+
* cache: { mode: CacheMode.IfCache, ttl: 60000 },
|
|
14
|
+
* })
|
|
15
|
+
* .post<User, CreateUserDTO>('createUser', {
|
|
16
|
+
* path: '/users',
|
|
17
|
+
* })
|
|
18
|
+
* .build()
|
|
19
|
+
*
|
|
20
|
+
* // 使用 API
|
|
21
|
+
* const user = await userApi.getUser({ pathParams: { id: '123' } })
|
|
22
|
+
*
|
|
23
|
+
* // 多次响应
|
|
24
|
+
* for await (const { data, fromCache } of userApi.getUserList()) {
|
|
25
|
+
* console.log(data, fromCache)
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
import ky, { type Options as KyOptions } from 'ky';
|
|
30
|
+
import { HttpClient } from '../client/HttpClient';
|
|
31
|
+
import { ApiStream } from '../client/ApiStream';
|
|
32
|
+
import type { RequestConfig, ApiOptions, CacheConfig, HttpClientConfig } from '../types';
|
|
33
|
+
/**
|
|
34
|
+
* API 端点函数类型
|
|
35
|
+
*/
|
|
36
|
+
export type ApiEndpoint<TResponse> = {
|
|
37
|
+
(options?: ApiOptions): ApiStream<TResponse>;
|
|
38
|
+
/** 请求配置 */
|
|
39
|
+
config: RequestConfig;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* API 定义类型
|
|
43
|
+
*/
|
|
44
|
+
export type ApiDefinition = Record<string, ApiEndpoint<unknown>>;
|
|
45
|
+
/**
|
|
46
|
+
* 端点选项
|
|
47
|
+
*/
|
|
48
|
+
interface EndpointOptions {
|
|
49
|
+
/** 请求路径,支持 {param} 占位符 */
|
|
50
|
+
path: string;
|
|
51
|
+
/** 请求方法 */
|
|
52
|
+
method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
53
|
+
/** 请求头 */
|
|
54
|
+
headers?: Record<string, string>;
|
|
55
|
+
/** 超时时间 (ms) */
|
|
56
|
+
timeout?: number;
|
|
57
|
+
/** 重试次数 */
|
|
58
|
+
retry?: number;
|
|
59
|
+
/** 缓存配置 */
|
|
60
|
+
cache?: CacheConfig;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* API 构建器
|
|
64
|
+
*/
|
|
65
|
+
export declare class ApiBuilder<T extends ApiDefinition = Record<string, never>> {
|
|
66
|
+
private client;
|
|
67
|
+
private endpoints;
|
|
68
|
+
private constructor();
|
|
69
|
+
/**
|
|
70
|
+
* 创建 API 构建器
|
|
71
|
+
*/
|
|
72
|
+
static create(config: HttpClientConfig): ApiBuilder;
|
|
73
|
+
/**
|
|
74
|
+
* 从现有 ky 实例创建
|
|
75
|
+
*/
|
|
76
|
+
static from(kyInstance: ReturnType<typeof ky.create>, config?: Partial<HttpClientConfig>): ApiBuilder;
|
|
77
|
+
/**
|
|
78
|
+
* 定义 GET 请求
|
|
79
|
+
*/
|
|
80
|
+
get<TResponse>(name: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
|
|
81
|
+
/**
|
|
82
|
+
* 定义 POST 请求
|
|
83
|
+
*/
|
|
84
|
+
post<TResponse>(name: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
|
|
85
|
+
/**
|
|
86
|
+
* 定义 PUT 请求
|
|
87
|
+
*/
|
|
88
|
+
put<TResponse>(name: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
|
|
89
|
+
/**
|
|
90
|
+
* 定义 DELETE 请求
|
|
91
|
+
*/
|
|
92
|
+
delete<TResponse>(name: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
|
|
93
|
+
/**
|
|
94
|
+
* 定义 PATCH 请求
|
|
95
|
+
*/
|
|
96
|
+
patch<TResponse>(name: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
|
|
97
|
+
/**
|
|
98
|
+
* 通用端点定义
|
|
99
|
+
*/
|
|
100
|
+
private endpoint;
|
|
101
|
+
/**
|
|
102
|
+
* 扩展 ky 实例(添加 hooks 等)
|
|
103
|
+
*/
|
|
104
|
+
extend(options: KyOptions): this;
|
|
105
|
+
/**
|
|
106
|
+
* 构建 API 服务
|
|
107
|
+
*/
|
|
108
|
+
build(): T;
|
|
109
|
+
/**
|
|
110
|
+
* 获取 HTTP 客户端实例(用于高级操作)
|
|
111
|
+
*/
|
|
112
|
+
getClient(): HttpClient;
|
|
113
|
+
}
|
|
114
|
+
export {};
|
|
115
|
+
//# sourceMappingURL=ApiBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiBuilder.d.ts","sourceRoot":"","sources":["../../../src/http/api/ApiBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 构建器
|
|
3
|
+
*
|
|
4
|
+
* 使用 Builder 模式定义 API,类似 Android Retrofit
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* const userApi = ApiBuilder.create({
|
|
9
|
+
* baseUrl: 'https://api.example.com',
|
|
10
|
+
* })
|
|
11
|
+
* .get<User>('getUser', {
|
|
12
|
+
* path: '/users/{id}',
|
|
13
|
+
* cache: { mode: CacheMode.IfCache, ttl: 60000 },
|
|
14
|
+
* })
|
|
15
|
+
* .post<User, CreateUserDTO>('createUser', {
|
|
16
|
+
* path: '/users',
|
|
17
|
+
* })
|
|
18
|
+
* .build()
|
|
19
|
+
*
|
|
20
|
+
* // 使用 API
|
|
21
|
+
* const user = await userApi.getUser({ pathParams: { id: '123' } })
|
|
22
|
+
*
|
|
23
|
+
* // 多次响应
|
|
24
|
+
* for await (const { data, fromCache } of userApi.getUserList()) {
|
|
25
|
+
* console.log(data, fromCache)
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
import { HttpClient } from '../client/HttpClient';
|
|
30
|
+
/**
|
|
31
|
+
* API 构建器
|
|
32
|
+
*/
|
|
33
|
+
export class ApiBuilder {
|
|
34
|
+
constructor(config) {
|
|
35
|
+
this.endpoints = new Map();
|
|
36
|
+
this.client = new HttpClient(config);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 创建 API 构建器
|
|
40
|
+
*/
|
|
41
|
+
static create(config) {
|
|
42
|
+
return new ApiBuilder(config);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 从现有 ky 实例创建
|
|
46
|
+
*/
|
|
47
|
+
static from(kyInstance, config) {
|
|
48
|
+
const builder = new ApiBuilder({
|
|
49
|
+
baseUrl: '',
|
|
50
|
+
...config,
|
|
51
|
+
});
|
|
52
|
+
builder.client.setKyInstance(kyInstance);
|
|
53
|
+
return builder;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 定义 GET 请求
|
|
57
|
+
*/
|
|
58
|
+
get(name, options) {
|
|
59
|
+
return this.endpoint(name, { ...options, method: 'GET' });
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 定义 POST 请求
|
|
63
|
+
*/
|
|
64
|
+
post(name, options) {
|
|
65
|
+
return this.endpoint(name, { ...options, method: 'POST' });
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 定义 PUT 请求
|
|
69
|
+
*/
|
|
70
|
+
put(name, options) {
|
|
71
|
+
return this.endpoint(name, { ...options, method: 'PUT' });
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 定义 DELETE 请求
|
|
75
|
+
*/
|
|
76
|
+
delete(name, options) {
|
|
77
|
+
return this.endpoint(name, { ...options, method: 'DELETE' });
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 定义 PATCH 请求
|
|
81
|
+
*/
|
|
82
|
+
patch(name, options) {
|
|
83
|
+
return this.endpoint(name, { ...options, method: 'PATCH' });
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 通用端点定义
|
|
87
|
+
*/
|
|
88
|
+
endpoint(name, options) {
|
|
89
|
+
var _a;
|
|
90
|
+
const config = {
|
|
91
|
+
method: (_a = options.method) !== null && _a !== void 0 ? _a : 'GET',
|
|
92
|
+
path: options.path,
|
|
93
|
+
headers: options.headers,
|
|
94
|
+
timeout: options.timeout,
|
|
95
|
+
retry: options.retry,
|
|
96
|
+
cache: options.cache,
|
|
97
|
+
};
|
|
98
|
+
this.endpoints.set(name, config);
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 扩展 ky 实例(添加 hooks 等)
|
|
103
|
+
*/
|
|
104
|
+
extend(options) {
|
|
105
|
+
this.client.extendKy(options);
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 构建 API 服务
|
|
110
|
+
*/
|
|
111
|
+
build() {
|
|
112
|
+
const api = {};
|
|
113
|
+
for (const [name, config] of this.endpoints) {
|
|
114
|
+
const endpoint = ((options) => {
|
|
115
|
+
return this.client.request(config, options);
|
|
116
|
+
});
|
|
117
|
+
endpoint.config = config;
|
|
118
|
+
api[name] = endpoint;
|
|
119
|
+
}
|
|
120
|
+
return api;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 获取 HTTP 客户端实例(用于高级操作)
|
|
124
|
+
*/
|
|
125
|
+
getClient() {
|
|
126
|
+
return this.client;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ApiBuilder } from './ApiBuilder';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 基于 IndexedDB 的 LRU 磁盘缓存
|
|
3
|
+
*
|
|
4
|
+
* 特点:
|
|
5
|
+
* - 使用 idb-keyval 简化 IndexedDB 操作
|
|
6
|
+
* - 维护 LRU 元数据实现淘汰策略
|
|
7
|
+
* - 支持 TTL 过期
|
|
8
|
+
* - 批量清理优化性能
|
|
9
|
+
* - 防污染:返回数据的深拷贝
|
|
10
|
+
*/
|
|
11
|
+
import type { CacheEntry, DiskLruCacheConfig } from '../types';
|
|
12
|
+
export declare class DiskLruCache {
|
|
13
|
+
private store;
|
|
14
|
+
private config;
|
|
15
|
+
private metadata;
|
|
16
|
+
private metadataDirty;
|
|
17
|
+
private flushTimer;
|
|
18
|
+
private evicting;
|
|
19
|
+
constructor(config: DiskLruCacheConfig);
|
|
20
|
+
/**
|
|
21
|
+
* 加载或初始化 LRU 元数据(失败返回空元数据)
|
|
22
|
+
*/
|
|
23
|
+
private loadMetadata;
|
|
24
|
+
/**
|
|
25
|
+
* 保存元数据到磁盘 (批量优化,延迟写入)
|
|
26
|
+
*/
|
|
27
|
+
private scheduleFlushMetadata;
|
|
28
|
+
/**
|
|
29
|
+
* 立即刷新元数据到磁盘(失败静默忽略)
|
|
30
|
+
*/
|
|
31
|
+
flush(): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* 获取缓存(失败返回 null,不影响业务)
|
|
34
|
+
* @returns 缓存条目的深拷贝
|
|
35
|
+
*/
|
|
36
|
+
get<T>(key: string): Promise<CacheEntry<T> | null>;
|
|
37
|
+
/**
|
|
38
|
+
* 设置缓存(失败静默忽略,不影响业务)
|
|
39
|
+
*/
|
|
40
|
+
set<T>(key: string, data: T, ttl?: number): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* 删除缓存(失败静默忽略)
|
|
43
|
+
*/
|
|
44
|
+
delete(key: string): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* 检查缓存是否存在(不更新访问时间,失败返回 false)
|
|
47
|
+
*/
|
|
48
|
+
has(key: string): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* 淘汰最旧的缓存条目(失败静默忽略)
|
|
51
|
+
*/
|
|
52
|
+
private evict;
|
|
53
|
+
/**
|
|
54
|
+
* 清空所有缓存(失败静默忽略)
|
|
55
|
+
*/
|
|
56
|
+
clear(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* 获取缓存数量(失败返回 0)
|
|
59
|
+
*/
|
|
60
|
+
size(): Promise<number>;
|
|
61
|
+
/**
|
|
62
|
+
* 获取所有缓存 key(失败返回空数组)
|
|
63
|
+
*/
|
|
64
|
+
keys(): Promise<string[]>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=DiskLruCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiskLruCache.d.ts","sourceRoot":"","sources":["../../../src/http/cache/DiskLruCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAe,MAAM,UAAU,CAAA;AAK3E,qBAAa,YAAY;IACrB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,QAAQ,CAAQ;gBAEZ,MAAM,EAAE,kBAAkB;IAQtC;;OAEG;YACW,YAAY;IAiB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B;;;OAGG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAmCxD;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BlE;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAexC;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASxC;;OAEG;YACW,KAAK;IAsCnB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAS7B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAQlC"}
|