@be-link/request 1.45.1-beta.1 → 1.45.1-beta.3
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 +187 -65
- package/dist/application/clients/LiveClient.d.ts +39 -7
- package/dist/application/clients/LiveClient.d.ts.map +1 -1
- package/dist/application/interceptors/TokenInterceptor.d.ts +2 -0
- package/dist/application/interceptors/TokenInterceptor.d.ts.map +1 -1
- package/dist/core/constants/index.d.ts +4 -0
- package/dist/core/constants/index.d.ts.map +1 -1
- package/dist/core/types/interceptor.types.d.ts +2 -5
- package/dist/core/types/interceptor.types.d.ts.map +1 -1
- package/dist/index.cjs.js +890 -1695
- package/dist/index.esm.js +890 -1695
- package/dist/infrastructure/services/TimeSyncService.d.ts +1 -1
- package/dist/infrastructure/services/TimeSyncService.d.ts.map +1 -1
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -9,33 +9,114 @@
|
|
|
9
9
|
- 拦截器机制(请求/响应拦截)
|
|
10
10
|
- TypeScript 类型支持
|
|
11
11
|
- 多环境适配(Browser/Node.js)
|
|
12
|
+
- 支持多服务实例配置
|
|
12
13
|
|
|
13
14
|
## 安装
|
|
14
15
|
|
|
15
16
|
```bash
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
# 基础安装(包含所有依赖)
|
|
18
|
+
pnpm add @be-link/request axios crypto-js
|
|
19
|
+
|
|
20
|
+
# 如果需要使用云函数调用 (callFunction)
|
|
21
|
+
pnpm add @be-link/request axios crypto-js @cloudbase/js-sdk
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 依赖说明
|
|
25
|
+
|
|
26
|
+
| 依赖 | 是否必须 | 说明 |
|
|
27
|
+
| ------------------- | -------- | ---------------------- |
|
|
28
|
+
| `axios` | ✅ 必须 | HTTP 客户端 |
|
|
29
|
+
| `crypto-js` | ✅ 必须 | Token 加密(AES) |
|
|
30
|
+
| `@cloudbase/js-sdk` | ⚠️ 可选 | 仅 `callFunction` 需要 |
|
|
31
|
+
|
|
32
|
+
> **注意**:所有依赖作为 external 不打包进产物,需要用户安装。
|
|
33
|
+
|
|
34
|
+
## 架构设计
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
┌─────────────────────────────────────────────────────────────────────┐
|
|
38
|
+
│ 应用层 (Application) │
|
|
39
|
+
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
|
|
40
|
+
│ │ beLinkRequest │ │ beLinkLiveRequest│ │ request │ │
|
|
41
|
+
│ │ (企业级客户端) │ │ (直播客户端) │ │ (基础请求) │ │
|
|
42
|
+
│ └────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘ │
|
|
43
|
+
└───────────│─────────────────────│─────────────────────│─────────────┘
|
|
44
|
+
│ │ │
|
|
45
|
+
▼ ▼ │
|
|
46
|
+
┌─────────────────────────────────────────────────────────────────────┐
|
|
47
|
+
│ 客户端层 (Clients) │
|
|
48
|
+
│ ┌──────────────────┐ ┌──────────────────┐ │
|
|
49
|
+
│ │ BeLinkClient │ │ LiveClient │ │
|
|
50
|
+
│ │ - Token 加密 │ │ - 简化版 │ │
|
|
51
|
+
│ │ - 时间同步 │ │ - 无认证逻辑 │ │
|
|
52
|
+
│ │ - 401 处理 │ │ │ │
|
|
53
|
+
│ └────────┬─────────┘ └────────┬─────────┘ │
|
|
54
|
+
└───────────│─────────────────────│───────────────────────────────────┘
|
|
55
|
+
│ │
|
|
56
|
+
▼ ▼
|
|
57
|
+
┌─────────────────────────────────────────────────────────────────────┐
|
|
58
|
+
│ 基类层 (HttpClient) │
|
|
59
|
+
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
60
|
+
│ │ - get/post/put/delete 方法 │ │
|
|
61
|
+
│ │ - 拦截器管理 (addRequestInterceptor/addResponseInterceptor) │ │
|
|
62
|
+
│ │ - 请求上下文管理 │ │
|
|
63
|
+
│ └──────────────────────────────┬──────────────────────────────┘ │
|
|
64
|
+
└─────────────────────────────────│───────────────────────────────────┘
|
|
65
|
+
│
|
|
66
|
+
▼
|
|
67
|
+
┌─────────────────────────────────────────────────────────────────────┐
|
|
68
|
+
│ 适配器层 (AxiosAdapter) │
|
|
69
|
+
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
70
|
+
│ │ - 封装 Axios 实例 │ │
|
|
71
|
+
│ │ - 统一错误处理 (HttpError/NetworkError/TimeoutError) │ │
|
|
72
|
+
│ │ - 请求/响应转换 │ │
|
|
73
|
+
│ └─────────────────────────────────────────────────────────────┘ │
|
|
74
|
+
└─────────────────────────────────────────────────────────────────────┘
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Token 加密流程
|
|
78
|
+
|
|
19
79
|
```
|
|
80
|
+
每次请求时:
|
|
81
|
+
┌─────────────┐ ┌──────────────────┐ ┌─────────────────┐
|
|
82
|
+
│ TokenProvider│────>│ EncryptionService│────>│ 请求头 │
|
|
83
|
+
│ () => token │ │ AES(token|+|time)│ │ x-belink-auth.. │
|
|
84
|
+
└─────────────┘ └──────────────────┘ └─────────────────┘
|
|
85
|
+
│
|
|
86
|
+
▼
|
|
87
|
+
TimeSyncService
|
|
88
|
+
(服务器时间校正)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## 客户端选择指南
|
|
92
|
+
|
|
93
|
+
| 客户端 | 使用场景 | Token 加密 | 时间同步 | 401 处理 |
|
|
94
|
+
| ------------------- | -------------------- | :--------: | :------: | :------: |
|
|
95
|
+
| `beLinkRequest` | 需要认证的业务 API | ✅ | ✅ | ✅ |
|
|
96
|
+
| `beLinkLiveRequest` | 直播、无需认证的场景 | ❌ | ❌ | ❌ |
|
|
97
|
+
| `request` | 第三方 API、简单请求 | ❌ | ❌ | ❌ |
|
|
20
98
|
|
|
21
99
|
## 快速开始
|
|
22
100
|
|
|
23
101
|
### 1. 初始化配置
|
|
24
102
|
|
|
25
103
|
```typescript
|
|
26
|
-
import { beLinkRequest
|
|
104
|
+
import { beLinkRequest } from '@be-link/request';
|
|
27
105
|
|
|
28
106
|
// 初始化客户端
|
|
29
107
|
beLinkRequest.init({
|
|
30
108
|
mode: 'production', // 'development' | 'testing' | 'production'
|
|
31
|
-
|
|
109
|
+
baseUrl: 'https://api.example.com', // API 基础地址
|
|
110
|
+
loginPath: '/login', // 401 时跳转的登录页路径
|
|
111
|
+
tokenHeaderName: 'x-belink-authorization', // Token 请求头名称(可选)
|
|
112
|
+
tokenStorageKey: 'belink_token', // localStorage 存储键名(可选)
|
|
32
113
|
});
|
|
33
114
|
|
|
34
115
|
// 设置 Token(通常在登录后调用)
|
|
35
116
|
beLinkRequest.setToken('your-auth-token');
|
|
36
117
|
|
|
37
118
|
// 或监听 localStorage 中的 Token 变化
|
|
38
|
-
beLinkRequest.setupTokenListener('
|
|
119
|
+
beLinkRequest.setupTokenListener('belink_token');
|
|
39
120
|
```
|
|
40
121
|
|
|
41
122
|
### 2. 发起请求
|
|
@@ -66,25 +147,30 @@ const data = await beLinkRequest.request({
|
|
|
66
147
|
|
|
67
148
|
### beLinkRequest - 企业级请求客户端
|
|
68
149
|
|
|
69
|
-
|
|
150
|
+
**使用场景**: 需要用户认证的业务 API,如用户信息、订单、支付等。
|
|
151
|
+
|
|
152
|
+
**特性**:
|
|
153
|
+
|
|
154
|
+
- Token 自动加密(AES + 时间戳,防重放攻击)
|
|
155
|
+
- 服务器时间同步(解决客户端时间不准问题)
|
|
156
|
+
- 401 自动处理(跳转登录页或执行回调)
|
|
70
157
|
|
|
71
158
|
```typescript
|
|
72
159
|
import { beLinkRequest } from '@be-link/request';
|
|
73
160
|
|
|
74
|
-
//
|
|
161
|
+
// 初始化(必须在使用前调用)
|
|
75
162
|
beLinkRequest.init({
|
|
76
163
|
mode: 'production',
|
|
164
|
+
baseUrl: 'https://api.example.com',
|
|
77
165
|
loginPath: '/login',
|
|
166
|
+
tokenHeaderName: 'x-belink-authorization', // 请求头名称
|
|
167
|
+
tokenStorageKey: 'belink_token', // localStorage 键名
|
|
78
168
|
});
|
|
79
169
|
|
|
80
|
-
//
|
|
81
|
-
beLinkRequest.setToken(token: string): void
|
|
82
|
-
|
|
83
|
-
//
|
|
84
|
-
beLinkRequest.getToken(): string | null
|
|
85
|
-
|
|
86
|
-
// 监听 Token 变化(返回清理函数)
|
|
87
|
-
beLinkRequest.setupTokenListener(tokenKey: string | (() => string)): () => void
|
|
170
|
+
// Token 管理
|
|
171
|
+
beLinkRequest.setToken(token: string): void // 设置 Token
|
|
172
|
+
beLinkRequest.getToken(): string | null // 获取 Token
|
|
173
|
+
beLinkRequest.setupTokenListener(tokenKey): () => void // 监听 Token 变化
|
|
88
174
|
|
|
89
175
|
// HTTP 方法
|
|
90
176
|
beLinkRequest.get<T>(url: string, config?): Promise<ApiResponse<T>>
|
|
@@ -95,25 +181,39 @@ beLinkRequest.delete<T>(url: string, config?): Promise<ApiResponse<T>>
|
|
|
95
181
|
// 通用请求
|
|
96
182
|
beLinkRequest.request<T>(config: RequestConfig): Promise<ApiResponse<T>>
|
|
97
183
|
|
|
98
|
-
//
|
|
184
|
+
// 时间同步(向后兼容)
|
|
99
185
|
beLinkRequest.setupRequestTime(config): Promise<void> // 设置请求时间
|
|
100
186
|
beLinkRequest.removeRequestTime(): Promise<void> // 清除请求时间
|
|
101
187
|
```
|
|
102
188
|
|
|
103
189
|
### beLinkLiveRequest - 直播请求客户端
|
|
104
190
|
|
|
105
|
-
|
|
191
|
+
**使用场景**: 直播、公开 API、不需要用户认证的场景。
|
|
192
|
+
|
|
193
|
+
**特性**:
|
|
194
|
+
|
|
195
|
+
- 简化版客户端,无 Token 加密
|
|
196
|
+
- 无时间同步
|
|
197
|
+
- 无 401 处理
|
|
198
|
+
- 支持配置 baseUrl 和 tokenHeaderName
|
|
106
199
|
|
|
107
200
|
```typescript
|
|
108
201
|
import { beLinkLiveRequest } from '@be-link/request';
|
|
109
202
|
|
|
110
|
-
//
|
|
111
|
-
|
|
203
|
+
// 初始化
|
|
204
|
+
beLinkLiveRequest.init({
|
|
205
|
+
baseUrl: 'https://live-api.example.com',
|
|
206
|
+
tokenHeaderName: 'x-live-authorization', // 可选
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// 发起请求
|
|
210
|
+
const data = await beLinkLiveRequest.post('/api/live/room', { roomId: '123' });
|
|
211
|
+
const info = await beLinkLiveRequest.get('/api/live/info');
|
|
112
212
|
```
|
|
113
213
|
|
|
114
214
|
### request - 基础请求
|
|
115
215
|
|
|
116
|
-
|
|
216
|
+
**使用场景**: 调用第三方 API、简单的 HTTP 请求、不需要任何认证处理的场景。
|
|
117
217
|
|
|
118
218
|
```typescript
|
|
119
219
|
import { request } from '@be-link/request';
|
|
@@ -127,7 +227,7 @@ const result = await request({
|
|
|
127
227
|
|
|
128
228
|
### callFunction - 云函数调用
|
|
129
229
|
|
|
130
|
-
|
|
230
|
+
**使用场景**: 调用腾讯云 CloudBase 云函数。
|
|
131
231
|
|
|
132
232
|
```typescript
|
|
133
233
|
import { callFunction } from '@be-link/request';
|
|
@@ -156,47 +256,49 @@ const result = await callFunction({
|
|
|
156
256
|
});
|
|
157
257
|
```
|
|
158
258
|
|
|
159
|
-
|
|
259
|
+
## 多服务配置
|
|
160
260
|
|
|
161
|
-
|
|
261
|
+
当页面需要调用多个不同域名的服务时,可以配置不同的 `tokenStorageKey` 避免冲突:
|
|
162
262
|
|
|
163
263
|
```typescript
|
|
164
|
-
import {
|
|
264
|
+
import { BeLinkClient } from '@be-link/request';
|
|
165
265
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
configManager.init({
|
|
266
|
+
// 服务 A
|
|
267
|
+
const serviceA = new BeLinkClient();
|
|
268
|
+
serviceA.init({
|
|
170
269
|
mode: 'production',
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
key: 'your-encryption-key',
|
|
175
|
-
iv: 'your-encryption-iv',
|
|
176
|
-
},
|
|
177
|
-
timeSync: {
|
|
178
|
-
enabled: true,
|
|
179
|
-
developmentUrl: 'https://dev.example.com/time',
|
|
180
|
-
productionUrl: 'https://api.example.com/time',
|
|
181
|
-
},
|
|
182
|
-
cloudbase: {
|
|
183
|
-
development: 'dev-env-id',
|
|
184
|
-
testing: 'test-env-id',
|
|
185
|
-
production: 'prod-env-id',
|
|
186
|
-
region: 'ap-shanghai',
|
|
187
|
-
timeout: 60000,
|
|
188
|
-
},
|
|
270
|
+
baseUrl: 'https://api-a.example.com',
|
|
271
|
+
tokenHeaderName: 'x-service-a-auth',
|
|
272
|
+
tokenStorageKey: 'service_a_token',
|
|
189
273
|
});
|
|
190
274
|
|
|
191
|
-
//
|
|
192
|
-
const
|
|
193
|
-
|
|
275
|
+
// 服务 B
|
|
276
|
+
const serviceB = new BeLinkClient();
|
|
277
|
+
serviceB.init({
|
|
278
|
+
mode: 'production',
|
|
279
|
+
baseUrl: 'https://api-b.example.com',
|
|
280
|
+
tokenHeaderName: 'x-service-b-auth',
|
|
281
|
+
tokenStorageKey: 'service_b_token',
|
|
282
|
+
});
|
|
194
283
|
|
|
195
|
-
//
|
|
196
|
-
|
|
284
|
+
// localStorage 结构:
|
|
285
|
+
// {
|
|
286
|
+
// "service_a_token": "token_for_service_a",
|
|
287
|
+
// "service_b_token": "token_for_service_b"
|
|
288
|
+
// }
|
|
197
289
|
```
|
|
198
290
|
|
|
199
|
-
##
|
|
291
|
+
## 初始化配置
|
|
292
|
+
|
|
293
|
+
### init 配置项
|
|
294
|
+
|
|
295
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
296
|
+
| --------------- | -------------------------------------------- | :--: | -------------------------- | --------------------- |
|
|
297
|
+
| mode | `'development' \| 'testing' \| 'production'` | ✅ | - | 运行模式 |
|
|
298
|
+
| baseUrl | `string` | ❌ | - | API 基础地址 |
|
|
299
|
+
| loginPath | `string \| (() => void)` | ❌ | - | 401 时跳转路径或回调 |
|
|
300
|
+
| tokenHeaderName | `string` | ❌ | `'x-belink-authorization'` | Token 请求头名称 |
|
|
301
|
+
| tokenStorageKey | `string` | ❌ | `'token'` | localStorage 存储键名 |
|
|
200
302
|
|
|
201
303
|
### RequestConfig
|
|
202
304
|
|
|
@@ -260,10 +362,18 @@ beLinkRequest.addResponseInterceptor({
|
|
|
260
362
|
removeInterceptor();
|
|
261
363
|
```
|
|
262
364
|
|
|
365
|
+
### 内置拦截器(BeLinkClient)
|
|
366
|
+
|
|
367
|
+
| 拦截器 | 优先级 | 功能 |
|
|
368
|
+
| ---------------- | :----: | -------------------------- |
|
|
369
|
+
| TimeInterceptor | 1 | 时间同步,添加服务器时间头 |
|
|
370
|
+
| TokenInterceptor | 2 | Token 加密,添加认证头 |
|
|
371
|
+
| AuthInterceptor | 1 | 401 响应处理,跳转登录 |
|
|
372
|
+
|
|
263
373
|
## 错误处理
|
|
264
374
|
|
|
265
375
|
```typescript
|
|
266
|
-
import { beLinkRequest, HttpError, AuthError, TimeoutError } from '@be-link/request';
|
|
376
|
+
import { beLinkRequest, HttpError, AuthError, TimeoutError, NetworkError } from '@be-link/request';
|
|
267
377
|
|
|
268
378
|
try {
|
|
269
379
|
const data = await beLinkRequest.get('/api/data');
|
|
@@ -273,6 +383,8 @@ try {
|
|
|
273
383
|
console.log('认证失败');
|
|
274
384
|
} else if (error instanceof TimeoutError) {
|
|
275
385
|
console.log('请求超时');
|
|
386
|
+
} else if (error instanceof NetworkError) {
|
|
387
|
+
console.log('网络错误');
|
|
276
388
|
} else if (error instanceof HttpError) {
|
|
277
389
|
console.log('HTTP 错误:', error.status);
|
|
278
390
|
}
|
|
@@ -314,6 +426,9 @@ export type { CloudFunctionOptions, CloudFunctionResponse, CloudFunctionData } f
|
|
|
314
426
|
// 错误类
|
|
315
427
|
export { BaseError, HttpError, AuthError, TimeoutError, ConfigError, NetworkError } from '@be-link/request';
|
|
316
428
|
|
|
429
|
+
// 客户端类
|
|
430
|
+
export { HttpClient, BeLinkClient, LiveClient } from '@be-link/request';
|
|
431
|
+
|
|
317
432
|
// 工具函数
|
|
318
433
|
export { isBrowser, isNode, detectEnvironment } from '@be-link/request';
|
|
319
434
|
```
|
|
@@ -321,32 +436,33 @@ export { isBrowser, isNode, detectEnvironment } from '@be-link/request';
|
|
|
321
436
|
## 完整示例
|
|
322
437
|
|
|
323
438
|
```typescript
|
|
324
|
-
import { beLinkRequest,
|
|
439
|
+
import { beLinkRequest, beLinkLiveRequest, callFunction, HttpError, AuthError } from '@be-link/request';
|
|
325
440
|
|
|
326
|
-
// 1.
|
|
327
|
-
|
|
328
|
-
configManager.init({
|
|
441
|
+
// 1. 初始化企业级客户端
|
|
442
|
+
beLinkRequest.init({
|
|
329
443
|
mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
|
|
444
|
+
baseUrl: 'https://api.example.com',
|
|
330
445
|
loginPath: () => {
|
|
331
446
|
window.location.href = '/login';
|
|
332
447
|
},
|
|
448
|
+
tokenStorageKey: 'app_token',
|
|
333
449
|
});
|
|
334
450
|
|
|
335
|
-
// 2.
|
|
336
|
-
|
|
337
|
-
|
|
451
|
+
// 2. 初始化直播客户端
|
|
452
|
+
beLinkLiveRequest.init({
|
|
453
|
+
baseUrl: 'https://live-api.example.com',
|
|
338
454
|
});
|
|
339
455
|
|
|
340
456
|
// 3. 设置 Token(登录后)
|
|
341
|
-
const token = localStorage.getItem('
|
|
457
|
+
const token = localStorage.getItem('app_token');
|
|
342
458
|
if (token) {
|
|
343
459
|
beLinkRequest.setToken(token);
|
|
344
460
|
}
|
|
345
461
|
|
|
346
462
|
// 4. 监听 Token 变化
|
|
347
|
-
beLinkRequest.setupTokenListener('
|
|
463
|
+
beLinkRequest.setupTokenListener('app_token');
|
|
348
464
|
|
|
349
|
-
// 5.
|
|
465
|
+
// 5. 发起业务请求
|
|
350
466
|
async function fetchUserInfo(userId: string) {
|
|
351
467
|
try {
|
|
352
468
|
const response = await beLinkRequest.get<{ name: string; age: number }>(`/api/users/${userId}`);
|
|
@@ -360,7 +476,13 @@ async function fetchUserInfo(userId: string) {
|
|
|
360
476
|
}
|
|
361
477
|
}
|
|
362
478
|
|
|
363
|
-
// 6.
|
|
479
|
+
// 6. 发起直播请求
|
|
480
|
+
async function getLiveRoomInfo(roomId: string) {
|
|
481
|
+
const response = await beLinkLiveRequest.get(`/api/room/${roomId}`);
|
|
482
|
+
return response.data;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// 7. 调用云函数
|
|
364
486
|
async function createOrder(productId: string) {
|
|
365
487
|
const result = await callFunction({
|
|
366
488
|
name: 'order-service',
|
|
@@ -1,25 +1,57 @@
|
|
|
1
1
|
import { HttpClient } from './HttpClient';
|
|
2
|
-
import { RequestConfig, IConfig } from '../../core/types
|
|
3
|
-
import { ApiResponse } from '../../core/types/response.types';
|
|
2
|
+
import { ApiResponse, RequestConfig, IConfig, TimeSyncConfig, EncryptionConfig } from '../../core/types';
|
|
4
3
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* LiveClient 业务请求客户端
|
|
5
|
+
* 提供完整的认证、加密、时间同步等企业级功能
|
|
7
6
|
*/
|
|
8
7
|
export declare class LiveClient extends HttpClient {
|
|
8
|
+
private configManager;
|
|
9
|
+
private encryptionService;
|
|
10
|
+
private timeSyncService;
|
|
11
|
+
private token;
|
|
12
|
+
private userId;
|
|
13
|
+
private initialized;
|
|
14
|
+
private tokenListenerCleanup;
|
|
9
15
|
private tokenHeaderName;
|
|
16
|
+
private tokenStorageKey;
|
|
10
17
|
constructor();
|
|
11
18
|
/**
|
|
12
19
|
* 初始化客户端
|
|
13
20
|
*/
|
|
14
21
|
init(config: {
|
|
22
|
+
mode: string;
|
|
15
23
|
baseUrl?: string;
|
|
16
|
-
/** Token 请求头名称(默认 'x-belink-authorization') */
|
|
17
24
|
tokenHeaderName?: string;
|
|
25
|
+
tokenStorageKey?: string;
|
|
26
|
+
encryption: EncryptionConfig;
|
|
27
|
+
timeSyncConfig: TimeSyncConfig;
|
|
18
28
|
}): void;
|
|
29
|
+
setUserId(userId: string): void;
|
|
19
30
|
/**
|
|
20
|
-
*
|
|
31
|
+
* 设置 Token
|
|
21
32
|
*/
|
|
22
|
-
|
|
33
|
+
setToken(token: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* 获取当前 Token
|
|
36
|
+
*/
|
|
37
|
+
getToken(): string | null;
|
|
38
|
+
/**
|
|
39
|
+
* 设置 Token 监听器
|
|
40
|
+
* @returns 清理函数,用于移除监听器
|
|
41
|
+
*/
|
|
42
|
+
setupTokenListener(tokenKey: string | (() => string)): () => void;
|
|
43
|
+
/**
|
|
44
|
+
* 清除请求时间
|
|
45
|
+
*/
|
|
46
|
+
removeRequestTime(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* 设置请求时间
|
|
49
|
+
*/
|
|
50
|
+
setupRequestTime(config: IConfig): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* 设置默认拦截器
|
|
53
|
+
*/
|
|
54
|
+
private setupDefaultInterceptors;
|
|
23
55
|
/**
|
|
24
56
|
* 重写请求方法(向后兼容旧版 API)
|
|
25
57
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LiveClient.d.ts","sourceRoot":"","sources":["../../../src/application/clients/LiveClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"LiveClient.d.ts","sourceRoot":"","sources":["../../../src/application/clients/LiveClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAUzG;;;GAGG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,iBAAiB,CAAgC;IACzD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,eAAe,CAA8B;;IAiBrD;;OAEG;IACI,IAAI,CAAC,MAAM,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,gBAAgB,CAAC;QAC7B,cAAc,EAAE,cAAc,CAAC;KAChC,GAAG,IAAI;IAmCD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC;;OAEG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACI,QAAQ,IAAI,MAAM,GAAG,IAAI;IAIhC;;;OAGG;IACI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,MAAM,IAAI;IAqDxE;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/C;;OAEG;IACU,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7D;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAmBhC;;OAEG;IACU,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAY5F"}
|
|
@@ -6,6 +6,7 @@ import { IEncryptionService } from '../../core/interfaces';
|
|
|
6
6
|
export interface TokenInterceptorOptions {
|
|
7
7
|
priority?: number;
|
|
8
8
|
headerName?: string;
|
|
9
|
+
userId?: string | null;
|
|
9
10
|
}
|
|
10
11
|
/**
|
|
11
12
|
* Token 拦截器
|
|
@@ -17,6 +18,7 @@ export declare class TokenInterceptor implements RequestInterceptor {
|
|
|
17
18
|
private tokenProvider;
|
|
18
19
|
private encryptionService;
|
|
19
20
|
private headerName;
|
|
21
|
+
private userId;
|
|
20
22
|
constructor(tokenProvider: () => string | null, encryptionService: IEncryptionService, options?: TokenInterceptorOptions);
|
|
21
23
|
onRequest(context: RequestContext): Promise<RequestContext>;
|
|
22
24
|
onRequestError(error: Error): Promise<never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenInterceptor.d.ts","sourceRoot":"","sources":["../../../src/application/interceptors/TokenInterceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"TokenInterceptor.d.ts","sourceRoot":"","sources":["../../../src/application/interceptors/TokenInterceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,kBAAkB;IAClD,IAAI,SAAsB;IAC1B,QAAQ,EAAE,MAAM,CAAC;IAExB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAgB;gBAG5B,aAAa,EAAE,MAAM,MAAM,GAAG,IAAI,EAClC,iBAAiB,EAAE,kBAAkB,EACrC,OAAO,CAAC,EAAE,uBAAuB;IAStB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAiB3D,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;CAG1D"}
|
|
@@ -41,6 +41,10 @@ export declare const DEFAULT_TIMEOUT = 8000;
|
|
|
41
41
|
* Token Header 名称
|
|
42
42
|
*/
|
|
43
43
|
export declare const TOKEN_HEADER = "x-belink-authorization";
|
|
44
|
+
/**
|
|
45
|
+
* UserID Header 名称
|
|
46
|
+
*/
|
|
47
|
+
export declare const USERID_HEADER = "x-belink-userid";
|
|
44
48
|
/**
|
|
45
49
|
* 时间同步 Header
|
|
46
50
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/constants/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;CAYd,CAAC;AAEX;;GAEG;AACH,oBAAY,WAAW;IACrB,kBAAkB;IAClB,IAAI,qBAAqB;IACzB,mBAAmB;IACnB,eAAe,sCAAsC;IACrD,sBAAsB;IACtB,SAAS,wBAAwB;IACjC,UAAU;IACV,IAAI,eAAe;IACnB,WAAW;IACX,IAAI,cAAc;IAClB,UAAU;IACV,GAAG,oBAAoB;IACvB,WAAW;IACX,YAAY,6BAA6B;CAC1C;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,YAAY,2BAA2B,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;CAGpB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;;;;CAIf,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/constants/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;CAYd,CAAC;AAEX;;GAEG;AACH,oBAAY,WAAW;IACrB,kBAAkB;IAClB,IAAI,qBAAqB;IACzB,mBAAmB;IACnB,eAAe,sCAAsC;IACrD,sBAAsB;IACtB,SAAS,wBAAwB;IACjC,UAAU;IACV,IAAI,eAAe;IACnB,WAAW;IACX,IAAI,cAAc;IAClB,UAAU;IACV,GAAG,oBAAoB;IACvB,WAAW;IACX,YAAY,6BAA6B;CAC1C;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,YAAY,2BAA2B,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;CAGpB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;;;;CAIf,CAAC"}
|
|
@@ -4,13 +4,10 @@ import { ResponseContext } from './response.types';
|
|
|
4
4
|
* 请求错误类型
|
|
5
5
|
*/
|
|
6
6
|
export interface RequestError {
|
|
7
|
+
code?: string;
|
|
7
8
|
message?: string;
|
|
8
9
|
status?: number;
|
|
9
|
-
|
|
10
|
-
status: number;
|
|
11
|
-
data?: unknown;
|
|
12
|
-
};
|
|
13
|
-
code?: string;
|
|
10
|
+
data?: unknown;
|
|
14
11
|
}
|
|
15
12
|
/**
|
|
16
13
|
* 请求拦截器接口
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor.types.d.ts","sourceRoot":"","sources":["../../../src/core/types/interceptor.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,
|
|
1
|
+
{"version":3,"file":"interceptor.types.d.ts","sourceRoot":"","sources":["../../../src/core/types/interceptor.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,SAAS,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;IACjF,aAAa;IACb,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,UAAU,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACjG,aAAa;IACb,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;CACnE;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"}
|