@be-link/http 1.0.1-beta.0

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.
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 拦截器模块导出
3
+ *
4
+ * @module interceptors
5
+ */
6
+ /** 请求拦截器 */
7
+ export { setRequestInterceptor } from './request';
8
+ /** 响应拦截器 */
9
+ export { setResponseInterceptor } from './response';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interceptors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY;AACZ,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,YAAY;AACZ,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * 请求拦截器
3
+ *
4
+ * 在请求发出前对请求进行处理,包括:
5
+ * - 时间同步
6
+ * - 设置默认请求头
7
+ * - 添加用户 ID
8
+ * - Token 加密和添加
9
+ * - 调用自定义拦截器
10
+ *
11
+ * @module interceptors/request
12
+ */
13
+ import type { AxiosInstance } from 'axios';
14
+ import type { RequestOptions } from '../types';
15
+ import { EncryptionService, TimeSyncService } from '../services';
16
+ /**
17
+ * 设置请求拦截器
18
+ *
19
+ * 为 Axios 实例添加请求拦截器,处理请求前的通用逻辑
20
+ *
21
+ * 拦截器执行顺序:
22
+ * 1. 确保时间同步(如果配置了 TimeSyncService)
23
+ * 2. 设置默认 Content-Type
24
+ * 3. 添加用户 ID 到请求头
25
+ * 4. 加密并添加 Token 到请求头
26
+ * 5. 调用自定义请求拦截器
27
+ *
28
+ * @param instance - Axios 实例
29
+ * @param options - 请求配置选项
30
+ * @param timeSyncService - 时间同步服务实例(可选)
31
+ * @param encryptionService - 加密服务实例(可选)
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * const instance = axios.create({ baseURL: 'https://api.example.com' });
36
+ *
37
+ * setRequestInterceptor(
38
+ * instance,
39
+ * {
40
+ * baseURL: 'https://api.example.com',
41
+ * getToken: () => localStorage.getItem('token'),
42
+ * getUserId: () => localStorage.getItem('userId'),
43
+ * },
44
+ * timeSyncService,
45
+ * encryptionService,
46
+ * );
47
+ * ```
48
+ */
49
+ export declare function setRequestInterceptor(instance: AxiosInstance, options: RequestOptions, timeSyncService?: TimeSyncService, encryptionService?: EncryptionService): void;
50
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/interceptors/request.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAA8B,MAAM,OAAO,CAAC;AAEvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,cAAc,EACvB,eAAe,CAAC,EAAE,eAAe,EACjC,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,IAAI,CAmDN"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * 响应拦截器
3
+ *
4
+ * 在收到响应后对响应进行处理,包括:
5
+ * - 提取响应数据
6
+ * - 调用自定义响应拦截器
7
+ * - 统一错误处理
8
+ *
9
+ * @module interceptors/response
10
+ */
11
+ import type { AxiosInstance } from 'axios';
12
+ import type { RequestOptions } from '../types';
13
+ /**
14
+ * 设置响应拦截器
15
+ *
16
+ * 为 Axios 实例添加响应拦截器,处理响应后的通用逻辑
17
+ *
18
+ * 成功响应处理:
19
+ * 1. 提取响应数据(response.data)
20
+ * 2. 调用自定义响应拦截器(如果配置)
21
+ * 3. 返回处理后的数据
22
+ *
23
+ * 错误响应处理:
24
+ * 1. 调用自定义错误处理(如果配置)
25
+ * 2. 检查业务错误(success === false)
26
+ * 3. 抛出错误
27
+ *
28
+ * @param instance - Axios 实例
29
+ * @param options - 请求配置选项
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const instance = axios.create({ baseURL: 'https://api.example.com' });
34
+ *
35
+ * setResponseInterceptor(instance, {
36
+ * baseURL: 'https://api.example.com',
37
+ * onResponse: (data) => {
38
+ * console.log('响应数据:', data);
39
+ * return data;
40
+ * },
41
+ * onError: (error) => {
42
+ * if (error.response?.status === 401) {
43
+ * // 处理未授权错误
44
+ * window.location.href = '/login';
45
+ * }
46
+ * throw error;
47
+ * },
48
+ * });
49
+ * ```
50
+ */
51
+ export declare function setResponseInterceptor(instance: AxiosInstance, options: RequestOptions): void;
52
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/interceptors/response.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,OAAO,CAAC;AAE1D,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,UAAU,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAyC7F"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * 加密服务
3
+ *
4
+ * 提供 Token 加密/解密功能,使用 AES-CBC 模式
5
+ * 加密后的 Token 包含时间戳,用于防止重放攻击
6
+ *
7
+ * @module EncryptionService
8
+ */
9
+ import type { EncryptionConfig, EncryptionService as IEncryptionService } from '../types';
10
+ import { TimeSyncService } from './TimeSyncService';
11
+ /**
12
+ * 加密服务
13
+ *
14
+ * 负责 Token 的 AES 加密和解密,提供以下功能:
15
+ * - Token 加密(带时间戳)
16
+ * - Token 解密
17
+ * - 与时间同步服务集成
18
+ *
19
+ * 加密格式说明:
20
+ * - 原始数据格式: `${token}|+|${timestamp}`
21
+ * - 加密算法: AES-128-CBC
22
+ * - 输出格式: Base64 编码
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * const encryption = new EncryptionService({
27
+ * key: '1234567890123456', // 16 位
28
+ * iv: '1234567890123456', // 16 位
29
+ * });
30
+ *
31
+ * // 加密 Token
32
+ * const encryptedToken = encryption.encryptToken('my-token');
33
+ *
34
+ * // 解密 Token
35
+ * const { token, timestamp } = encryption.decryptToken(encryptedToken);
36
+ * ```
37
+ */
38
+ export declare class EncryptionService implements IEncryptionService {
39
+ /** 加密配置 */
40
+ private config;
41
+ /** 时间同步服务实例(可选) */
42
+ private timeSyncService?;
43
+ /**
44
+ * 创建加密服务实例
45
+ *
46
+ * @param config - 加密配置
47
+ * @param timeSyncService - 时间同步服务实例(可选),用于获取服务器校正后的时间
48
+ */
49
+ constructor(config: EncryptionConfig, timeSyncService?: TimeSyncService);
50
+ /**
51
+ * 加密 Token
52
+ *
53
+ * 将 Token 与时间戳组合后进行 AES 加密
54
+ * 加密后的数据用于请求头的 Authorization 字段
55
+ *
56
+ * 加密流程:
57
+ * 1. 组合原始数据: `${token}|+|${timestamp}`
58
+ * 2. 使用 AES-128-CBC 加密
59
+ * 3. 输出 Base64 编码的密文
60
+ *
61
+ * @param token - 原始 Token 字符串
62
+ * @param timestamp - 可选的时间戳(毫秒),默认使用调整后的当前时间
63
+ * @returns 加密后的 Token 字符串(Base64 编码)
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * // 使用默认时间戳
68
+ * const encrypted = encryption.encryptToken('my-token');
69
+ *
70
+ * // 使用指定时间戳
71
+ * const encrypted = encryption.encryptToken('my-token', Date.now());
72
+ * ```
73
+ */
74
+ encryptToken(token: string, timestamp?: number): string;
75
+ /**
76
+ * 解密 Token
77
+ *
78
+ * 将加密后的 Token 解密,提取原始 Token 和时间戳
79
+ *
80
+ * @param encryptedToken - 加密后的 Token 字符串
81
+ * @returns 包含原始 Token 和时间戳的对象
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * const { token, timestamp } = encryption.decryptToken(encryptedToken);
86
+ * console.log(token); // 'my-token'
87
+ * console.log(timestamp); // 1703577600000
88
+ * ```
89
+ */
90
+ decryptToken(encryptedToken: string): {
91
+ token: string;
92
+ timestamp: number;
93
+ };
94
+ /**
95
+ * 获取调整后的时间戳
96
+ *
97
+ * 优先使用时间同步服务获取校正后的时间
98
+ * 如果没有时间同步服务,则使用当前客户端时间
99
+ *
100
+ * @returns 时间戳(毫秒)
101
+ */
102
+ private getAdjustedTime;
103
+ /**
104
+ * 更新配置
105
+ *
106
+ * 动态更新加密服务的配置
107
+ *
108
+ * @param config - 要更新的配置项
109
+ */
110
+ updateConfig(config: Partial<EncryptionConfig>): void;
111
+ /**
112
+ * 设置时间同步服务
113
+ *
114
+ * 用于后期绑定时间同步服务实例
115
+ *
116
+ * @param timeSyncService - 时间同步服务实例
117
+ */
118
+ setTimeSyncService(timeSyncService: TimeSyncService): void;
119
+ }
120
+ //# sourceMappingURL=EncryptionService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncryptionService.d.ts","sourceRoot":"","sources":["../../src/services/EncryptionService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,iBAAkB,YAAW,kBAAkB;IAC1D,WAAW;IACX,OAAO,CAAC,MAAM,CAAmB;IAEjC,mBAAmB;IACnB,OAAO,CAAC,eAAe,CAAC,CAAkB;IAE1C;;;;;OAKG;gBACS,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,eAAe;IAQvE;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACI,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAmB9D;;;;;;;;;;;;;;OAcG;IACI,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAejF;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAOvB;;;;;;OAMG;IACI,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAI5D;;;;;;OAMG;IACI,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;CAGlE"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * 时间同步服务
3
+ *
4
+ * 用于同步客户端和服务器时间,解决客户端时间不准确的问题
5
+ * 主要用于 Token 加密时使用服务器时间,防止重放攻击
6
+ *
7
+ * 使用 performance.now() 计算时间流逝,防止用户修改系统时间导致的问题
8
+ *
9
+ * @module TimeSyncService
10
+ */
11
+ import type { TimeSyncConfig, TimeSyncService as ITimeSyncService } from '../types';
12
+ /**
13
+ * 时间同步服务
14
+ *
15
+ * 负责同步客户端和服务器时间,提供以下功能:
16
+ * - 自动检测是否需要同步
17
+ * - 获取服务器时间
18
+ * - 使用 performance.now() 计算时间流逝,防止用户修改系统时间
19
+ * - 获取调整后的当前时间
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const timeSync = new TimeSyncService({
24
+ * syncUrl: 'https://api.example.com/api/time',
25
+ * syncGapTime: 50000,
26
+ * });
27
+ *
28
+ * // 确保时间同步
29
+ * await timeSync.ensureSync();
30
+ *
31
+ * // 获取调整后的时间
32
+ * const adjustedTime = timeSync.getAdjustedTime();
33
+ * ```
34
+ */
35
+ export declare class TimeSyncService implements ITimeSyncService {
36
+ /** 服务配置 */
37
+ private config;
38
+ /**
39
+ * 同步时的服务器时间(内存存储)
40
+ * 用于计算调整后的时间
41
+ */
42
+ private syncServerTime;
43
+ /**
44
+ * 同步时的 performance.now() 值(内存存储)
45
+ * 使用 performance.now() 而不是 Date.now(),防止用户修改系统时间
46
+ */
47
+ private syncPerformanceTime;
48
+ /**
49
+ * 正在进行的同步 Promise(用于防止并发请求时重复同步)
50
+ * 当有同步请求正在进行时,其他请求会等待这个 Promise 完成
51
+ */
52
+ private syncPromise;
53
+ /**
54
+ * 创建时间同步服务实例
55
+ */
56
+ constructor(config: TimeSyncConfig);
57
+ /**
58
+ * 确保时间已同步
59
+ *
60
+ * 检查是否需要同步:
61
+ * 1. 内存中没有同步数据(页面刷新后)
62
+ * 2. 距离上次同步的时间超过了 syncGapTime 阈值
63
+ *
64
+ * 并发控制:
65
+ * - 如果已有同步请求正在进行,直接等待该请求完成
66
+ * - 避免多个并发请求同时触发多次时间同步
67
+ */
68
+ ensureSync(): Promise<void>;
69
+ /**
70
+ * 执行时间同步
71
+ *
72
+ * 向服务器发送请求获取服务器时间
73
+ * 同时记录 performance.now() 用于后续计算时间流逝
74
+ *
75
+ * 并发控制:
76
+ * - 使用 syncPromise 作为锁,确保同一时间只有一个同步请求
77
+ * - 同步完成后清除锁,允许后续同步请求
78
+ */
79
+ sync(): Promise<void>;
80
+ /**
81
+ * 实际执行时间同步的内部方法
82
+ */
83
+ private doSync;
84
+ /**
85
+ * 获取服务器时间
86
+ *
87
+ * 返回同步时获取的服务器时间戳
88
+ */
89
+ getServerTime(): number | null;
90
+ /**
91
+ * 获取时间差
92
+ *
93
+ * 返回服务器时间与客户端时间的差值
94
+ * 注意:此方法仅用于向后兼容,实际计算使用 getAdjustedTime()
95
+ */
96
+ getTimeDiff(): number | null;
97
+ /**
98
+ * 获取调整后的当前时间
99
+ *
100
+ * 使用 performance.now() 计算时间流逝,得到准确的服务器时间
101
+ * 计算公式:同步时的服务器时间 + (当前 performance.now() - 同步时的 performance.now())
102
+ *
103
+ * 优势:即使用户修改系统时间,performance.now() 的流逝是正确的
104
+ *
105
+ * @returns 调整后的时间戳(毫秒),未同步时返回当前客户端时间
106
+ */
107
+ getAdjustedTime(): number;
108
+ /**
109
+ * 清除同步数据
110
+ */
111
+ clear(): void;
112
+ /**
113
+ * 更新配置
114
+ */
115
+ updateConfig(config: Partial<TimeSyncConfig>): void;
116
+ }
117
+ //# sourceMappingURL=TimeSyncService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeSyncService.d.ts","sourceRoot":"","sources":["../../src/services/TimeSyncService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAoCpF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,WAAW;IACX,OAAO,CAAC,MAAM,CAAiB;IAE/B;;;OAGG;IACH,OAAO,CAAC,cAAc,CAAuB;IAE7C;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CAAuB;IAElD;;;OAGG;IACH,OAAO,CAAC,WAAW,CAA8B;IAEjD;;OAEG;gBACS,MAAM,EAAE,cAAc;IAQlC;;;;;;;;;;OAUG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBxC;;;;;;;;;OASG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBlC;;OAEG;YACW,MAAM;IAwCpB;;;;OAIG;IACI,aAAa,IAAI,MAAM,GAAG,IAAI;IAIrC;;;;;OAKG;IACI,WAAW,IAAI,MAAM,GAAG,IAAI;IAOnC;;;;;;;;;OASG;IACI,eAAe,IAAI,MAAM;IAUhC;;OAEG;IACI,KAAK,IAAI,IAAI;IAYpB;;OAEG;IACI,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;CAG3D"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 服务模块导出
3
+ *
4
+ * @module services
5
+ */
6
+ /** 时间同步服务 */
7
+ export { TimeSyncService } from './TimeSyncService';
8
+ /** 加密服务 */
9
+ export { EncryptionService } from './EncryptionService';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,WAAW;AACX,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,268 @@
1
+ /**
2
+ * @be-link/http 类型定义
3
+ *
4
+ * 本文件定义了请求库的所有 TypeScript 类型接口
5
+ */
6
+ import type { AxiosInstance, AxiosRequestConfig } from 'axios';
7
+ /**
8
+ * 时间同步配置
9
+ *
10
+ * 用于配置客户端与服务器时间同步的相关参数
11
+ * 时间同步主要用于 Token 加密时使用服务器时间,防止客户端时间不准导致的问题
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const timeSyncConfig: TimeSyncConfig = {
16
+ * enabled: true,
17
+ * syncUrl: 'https://api.example.com/api/time',
18
+ * syncGapTime: 50000,
19
+ * storagePrefix: 'myapp',
20
+ * };
21
+ * ```
22
+ */
23
+ export interface TimeSyncConfig {
24
+ /**
25
+ * 是否启用时间同步
26
+ * @default true
27
+ */
28
+ enabled?: boolean;
29
+ /**
30
+ * 时间同步接口 URL
31
+ * 该接口应返回 { data: number } 格式,data 为服务器时间戳(毫秒)
32
+ */
33
+ syncUrl: string;
34
+ /**
35
+ * 同步间隔阈值(毫秒)
36
+ * 当距离上次同步时间超过此阈值时,会触发重新同步
37
+ * @default 50000 (50 秒)
38
+ */
39
+ syncGapTime?: number;
40
+ /**
41
+ * localStorage 存储 key 前缀
42
+ * 用于区分不同应用的时间同步数据
43
+ * 实际存储 key 为: `${storagePrefix}_belink_server_time`
44
+ */
45
+ storagePrefix?: string;
46
+ }
47
+ /**
48
+ * 加密配置
49
+ *
50
+ * 用于配置 Token AES 加密的相关参数
51
+ * 加密格式: AES(token + "|+|" + timestamp)
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const encryptionConfig: EncryptionConfig = {
56
+ * enabled: true,
57
+ * key: '1234567890123456', // 16 位
58
+ * iv: '1234567890123456', // 16 位
59
+ * };
60
+ * ```
61
+ */
62
+ export interface EncryptionConfig {
63
+ /**
64
+ * 是否启用加密
65
+ * @default true
66
+ */
67
+ enabled?: boolean;
68
+ /**
69
+ * AES 密钥
70
+ * 必须为 16 位字符串(128 位)
71
+ */
72
+ key: string;
73
+ /**
74
+ * AES 初始化向量(IV)
75
+ * 必须为 16 位字符串(128 位)
76
+ */
77
+ iv: string;
78
+ }
79
+ /**
80
+ * 请求配置选项
81
+ *
82
+ * createRequest 工厂函数的配置参数
83
+ * 所有参数都由应用方传递,提供最大的灵活性
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * const options: RequestOptions = {
88
+ * baseURL: 'https://api.example.com',
89
+ * timeout: 30000,
90
+ * timeSync: { syncUrl: 'https://api.example.com/api/time' },
91
+ * encryption: { key: '...', iv: '...' },
92
+ * getToken: () => localStorage.getItem('token'),
93
+ * getUserId: () => localStorage.getItem('userId'),
94
+ * };
95
+ * ```
96
+ */
97
+ export interface RequestOptions {
98
+ /**
99
+ * API 基础 URL
100
+ * 所有请求的 URL 都会基于此 URL 拼接
101
+ */
102
+ baseURL: string;
103
+ /**
104
+ * 请求超时时间(毫秒)
105
+ * @default 30000 (30 秒)
106
+ */
107
+ timeout?: number;
108
+ /**
109
+ * 默认请求头
110
+ * 会与每个请求的 headers 合并
111
+ */
112
+ headers?: Record<string, string>;
113
+ /**
114
+ * 时间同步配置
115
+ * 配置后会在请求前自动同步服务器时间
116
+ */
117
+ timeSync?: TimeSyncConfig;
118
+ /**
119
+ * Token 加密配置
120
+ * 配置后会自动对 Token 进行 AES 加密
121
+ */
122
+ encryption?: EncryptionConfig;
123
+ /**
124
+ * 获取 Token 的函数
125
+ * 每次请求时调用,返回当前的认证 Token
126
+ */
127
+ getToken?: () => string | null | undefined;
128
+ /**
129
+ * Token 请求头名称
130
+ * @default 'X-BeLink-Token'
131
+ */
132
+ tokenHeaderName?: string;
133
+ /**
134
+ * 获取用户 ID 的函数
135
+ * 每次请求时调用,返回当前用户 ID
136
+ */
137
+ getUserId?: () => string | null | undefined;
138
+ /**
139
+ * 用户 ID 请求头名称
140
+ * @default 'X-BeLink-UserId'
141
+ */
142
+ userIdHeaderName?: string;
143
+ /**
144
+ * 自定义请求拦截器
145
+ * 在请求发出前调用,可以修改请求配置
146
+ * @param config - Axios 请求配置
147
+ * @returns 修改后的请求配置
148
+ */
149
+ onRequest?: (config: AxiosRequestConfig) => AxiosRequestConfig | Promise<AxiosRequestConfig>;
150
+ /**
151
+ * 自定义响应拦截器
152
+ * 在收到响应后调用,可以处理响应数据
153
+ * @param response - 响应数据
154
+ * @returns 处理后的响应数据
155
+ */
156
+ onResponse?: <T = any>(response: T) => T | Promise<T>;
157
+ /**
158
+ * 自定义错误处理函数
159
+ * 在请求出错时调用,可以统一处理错误
160
+ * @param error - 错误对象
161
+ * @returns 处理后的结果或抛出错误
162
+ */
163
+ onError?: (error: any) => any;
164
+ }
165
+ /**
166
+ * API 响应结构
167
+ *
168
+ * 标准的 API 响应格式
169
+ *
170
+ * @template T - 响应数据类型
171
+ */
172
+ export interface ApiResponse<T = any> {
173
+ /**
174
+ * 请求是否成功
175
+ */
176
+ success: boolean;
177
+ /**
178
+ * 响应数据
179
+ */
180
+ data: T;
181
+ /**
182
+ * 错误或提示消息
183
+ */
184
+ message?: string;
185
+ /**
186
+ * 错误类型标识
187
+ */
188
+ errorType?: string;
189
+ /**
190
+ * 请求 ID,用于追踪和调试
191
+ */
192
+ requestId?: string;
193
+ }
194
+ /**
195
+ * 请求实例类型
196
+ *
197
+ * 继承自 AxiosInstance,附加了时间同步和加密服务实例
198
+ */
199
+ export interface RequestInstance extends AxiosInstance {
200
+ /**
201
+ * 时间同步服务实例
202
+ * 仅在配置了 timeSync 时存在
203
+ */
204
+ timeSync?: TimeSyncService;
205
+ /**
206
+ * 加密服务实例
207
+ * 仅在配置了 encryption 时存在
208
+ */
209
+ encryption?: EncryptionService;
210
+ }
211
+ /**
212
+ * 时间同步服务接口
213
+ *
214
+ * 定义时间同步服务需要实现的方法
215
+ */
216
+ export interface TimeSyncService {
217
+ /**
218
+ * 确保时间已同步
219
+ * 如果距离上次同步时间超过阈值,会自动触发同步
220
+ */
221
+ ensureSync: () => Promise<void>;
222
+ /**
223
+ * 强制执行时间同步
224
+ * 无论是否超过阈值都会向服务器请求时间
225
+ */
226
+ sync: () => Promise<void>;
227
+ /**
228
+ * 获取上次同步的服务器时间
229
+ * @returns 服务器时间戳(毫秒),如果未同步则返回 null
230
+ */
231
+ getServerTime: () => number | null;
232
+ /**
233
+ * 获取时间差(服务器时间 - 客户端时间)
234
+ * @returns 时间差(毫秒),如果未同步则返回 null
235
+ */
236
+ getTimeDiff: () => number | null;
237
+ /**
238
+ * 清除本地存储的时间同步数据
239
+ */
240
+ clear: () => void;
241
+ }
242
+ /**
243
+ * 加密服务接口
244
+ *
245
+ * 定义加密服务需要实现的方法
246
+ */
247
+ export interface EncryptionService {
248
+ /**
249
+ * 加密 Token
250
+ * 加密格式: AES(token + "|+|" + timestamp)
251
+ *
252
+ * @param token - 原始 Token
253
+ * @param timestamp - 可选的时间戳,默认使用调整后的当前时间
254
+ * @returns 加密后的 Token 字符串(Base64 编码)
255
+ */
256
+ encryptToken: (token: string, timestamp?: number) => string;
257
+ /**
258
+ * 解密 Token
259
+ *
260
+ * @param encryptedToken - 加密后的 Token
261
+ * @returns 包含原始 Token 和时间戳的对象
262
+ */
263
+ decryptToken: (encryptedToken: string) => {
264
+ token: string;
265
+ timestamp: number;
266
+ };
267
+ }
268
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}