@blueking/chat-helper 0.0.1-beta.1 → 0.0.1-beta.10
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 +969 -63
- package/dist/agent/type.d.ts +2 -2
- package/dist/agent/use-agent.d.ts +439 -435
- package/dist/agent/use-agent.ts.js +189 -20
- package/dist/event/ag-ui.d.ts +23 -7
- package/dist/event/ag-ui.ts.js +161 -150
- package/dist/event/type.d.ts +30 -107
- package/dist/event/type.ts.js +8 -11
- package/dist/http/fetch/fetch.d.ts +40 -36
- package/dist/http/fetch/fetch.ts.js +46 -34
- package/dist/http/fetch/index.d.ts +1 -0
- package/dist/http/fetch/index.ts.js +17 -1
- package/dist/http/index.d.ts +20 -16
- package/dist/http/index.ts.js +60 -3
- package/dist/http/module/agent.d.ts +2 -2
- package/dist/http/module/index.d.ts +18 -16
- package/dist/http/module/index.ts.js +2 -1
- package/dist/http/module/message.d.ts +21 -7
- package/dist/http/module/message.ts.js +43 -6
- package/dist/http/module/session.d.ts +11 -11
- package/dist/http/module/session.ts.js +3 -3
- package/dist/http/transform/agent.ts.js +3 -6
- package/dist/http/transform/message.d.ts +6 -6
- package/dist/http/transform/message.ts.js +540 -118
- package/dist/http/transform/session.ts.js +9 -1
- package/dist/index.d.ts +2655 -2651
- package/dist/index.ts.js +31 -5
- package/dist/mediator/index.d.ts +2 -0
- package/dist/mediator/index.ts.js +26 -0
- package/dist/mediator/type.d.ts +50 -0
- package/dist/mediator/type.ts.js +28 -0
- package/dist/mediator/use-mediator.d.ts +7 -0
- package/dist/mediator/use-mediator.ts.js +47 -0
- package/dist/message/type.d.ts +235 -142
- package/dist/message/type.ts.js +15 -15
- package/dist/message/use-message.d.ts +748 -758
- package/dist/message/use-message.ts.js +215 -27
- package/dist/session/type.d.ts +10 -0
- package/dist/session/use-session.d.ts +1736 -1733
- package/dist/session/use-session.ts.js +161 -37
- package/dist/type.d.ts +4 -4
- package/dist/type.ts.js +25 -0
- package/package.json +2 -1
package/dist/event/type.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import type
|
|
2
|
-
export declare enum
|
|
1
|
+
import { type IMessageApi, type MessageRole } from '../message/type';
|
|
2
|
+
export declare enum CustomEventName {
|
|
3
|
+
KnowledgeRagEnd = "knowledge_rag_end",
|
|
4
|
+
KnowledgeRagResult = "knowledge_rag_result",
|
|
5
|
+
KnowledgeRagStart = "knowledge_rag_start",
|
|
6
|
+
KnowledgeRagTextContent = "knowledge_rag_text_content",
|
|
3
7
|
ReferenceDocument = "reference_document"
|
|
4
8
|
}
|
|
5
9
|
export declare enum EventType {
|
|
@@ -30,23 +34,11 @@ export declare enum EventType {
|
|
|
30
34
|
ToolCallResult = "TOOL_CALL_RESULT",
|
|
31
35
|
ToolCallStart = "TOOL_CALL_START"
|
|
32
36
|
}
|
|
33
|
-
export declare enum TextMessageRole {
|
|
34
|
-
ASSISTANT = "assistant",
|
|
35
|
-
SYSTEM = "system",
|
|
36
|
-
TOOL = "tool",
|
|
37
|
-
USER = "user"
|
|
38
|
-
}
|
|
39
37
|
/**
|
|
40
38
|
* Activity 代表 Agent 执行过程中的活动/动作/任务,可能包含结构化数据
|
|
41
39
|
* 活动状态的增量更新
|
|
42
40
|
* 记录活动类型 activityType
|
|
43
41
|
* 使用 JSON Patch (RFC 6902) 格式增量更新 Activity 数据
|
|
44
|
-
*
|
|
45
|
-
* @example ActivityDeltaEvent {
|
|
46
|
-
* activityType: "file_processing",
|
|
47
|
-
* messageId: "123",
|
|
48
|
-
* patch: [{ op: "add", path: "/title", value: "分析需求" }]
|
|
49
|
-
* }
|
|
50
42
|
*/
|
|
51
43
|
export interface IActivityDeltaEvent extends IBaseEvent {
|
|
52
44
|
activityType: string;
|
|
@@ -59,17 +51,6 @@ export interface IActivityDeltaEvent extends IBaseEvent {
|
|
|
59
51
|
* 活动状态的快照
|
|
60
52
|
* 记录活动类型 activityType
|
|
61
53
|
* 使用 JSON 格式存储 Activity 数据
|
|
62
|
-
*
|
|
63
|
-
* @example ActivitySnapshotEvent {
|
|
64
|
-
* activityType: "file_processing",
|
|
65
|
-
* messageId: "123",
|
|
66
|
-
* content: {
|
|
67
|
-
* title: "分析需求",
|
|
68
|
-
* status: "pending",
|
|
69
|
-
* progress: 0.5,
|
|
70
|
-
* },
|
|
71
|
-
* replace: true,
|
|
72
|
-
* }
|
|
73
54
|
*/
|
|
74
55
|
export interface IActivitySnapshotEvent extends IBaseEvent {
|
|
75
56
|
activityType: string;
|
|
@@ -78,10 +59,6 @@ export interface IActivitySnapshotEvent extends IBaseEvent {
|
|
|
78
59
|
replace?: boolean;
|
|
79
60
|
type: EventType.ActivitySnapshot;
|
|
80
61
|
}
|
|
81
|
-
export interface IBaseCustomEvent {
|
|
82
|
-
timestamp?: number;
|
|
83
|
-
type: CustomEventType;
|
|
84
|
-
}
|
|
85
62
|
export interface IBaseEvent {
|
|
86
63
|
timestamp?: number;
|
|
87
64
|
type: EventType;
|
|
@@ -89,26 +66,24 @@ export interface IBaseEvent {
|
|
|
89
66
|
/**
|
|
90
67
|
* 自定义事件
|
|
91
68
|
* 用于发送自定义事件到客户端
|
|
92
|
-
*
|
|
93
|
-
* @example CustomEvent {
|
|
94
|
-
* name: "custom_event",
|
|
95
|
-
* value: { type: CustomEventType.ReferenceDocument, data: { ... } }
|
|
96
|
-
* }
|
|
97
69
|
*/
|
|
98
70
|
export interface ICustomEvent extends IBaseEvent {
|
|
99
|
-
name:
|
|
71
|
+
name: CustomEventName;
|
|
100
72
|
type: EventType.Custom;
|
|
101
|
-
value:
|
|
73
|
+
value: IKnowledgeRagResultCustomValue | IKnowledgeRagTextContentCustomValue | IReferenceDocumentCustomValue;
|
|
102
74
|
}
|
|
103
75
|
export type IEvent = IActivityDeltaEvent | IActivitySnapshotEvent | ICustomEvent | IMessagesSnapshotEvent | IRawEvent | IRunErrorEvent | IRunFinishedEvent | IRunStartedEvent | IStateDeltaEvent | IStateSnapshotEvent | IStepFinishedEvent | IStepStartedEvent | ITextMessageChunkEvent | ITextMessageContentEvent | ITextMessageEndEvent | ITextMessageStartEvent | IThinkingEndEvent | IThinkingStartEvent | IThinkingTextMessageContentEvent | IThinkingTextMessageEndEvent | IThinkingTextMessageStartEvent | IToolCallArgsEvent | IToolCallChunkEvent | IToolCallEndEvent | IToolCallResultEvent | IToolCallStartEvent;
|
|
76
|
+
export type IKnowledgeRagResultCustomValue = IReferenceDocumentCustomValue;
|
|
77
|
+
export interface IKnowledgeRagTextContentCustomValue {
|
|
78
|
+
cover: boolean;
|
|
79
|
+
chunk: {
|
|
80
|
+
content: string;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
104
83
|
/**
|
|
105
84
|
* 消息快照事件
|
|
106
85
|
* 用于记录当前时刻的完整消息状态
|
|
107
86
|
* 同步多端消息状态
|
|
108
|
-
*
|
|
109
|
-
* @example MessagesSnapshotEvent {
|
|
110
|
-
* messages: [{ ... }, { ... }]
|
|
111
|
-
* }
|
|
112
87
|
*/
|
|
113
88
|
export interface IMessagesSnapshotEvent extends IBaseEvent {
|
|
114
89
|
messages: IMessageApi[];
|
|
@@ -117,32 +92,17 @@ export interface IMessagesSnapshotEvent extends IBaseEvent {
|
|
|
117
92
|
/**
|
|
118
93
|
* 透传底层原始事件数据
|
|
119
94
|
* 保留完整的原始事件信息,不做解析
|
|
120
|
-
*
|
|
121
|
-
* // 同时对接多个 AI 服务
|
|
122
|
-
* @example RawEvent {
|
|
123
|
-
* event: { Claude 原始响应 },
|
|
124
|
-
* source: "anthropic"
|
|
125
|
-
* }
|
|
126
|
-
*
|
|
127
|
-
* @example RawEvent {
|
|
128
|
-
* event: { OpenAI 原始响应 },
|
|
129
|
-
* source: "openai"
|
|
130
|
-
* }
|
|
131
95
|
*/
|
|
132
96
|
export interface IRawEvent extends IBaseEvent {
|
|
133
97
|
event: unknown;
|
|
134
98
|
source?: string;
|
|
135
99
|
type: EventType.Raw;
|
|
136
100
|
}
|
|
137
|
-
export
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
title: string;
|
|
143
|
-
url: string;
|
|
144
|
-
}[];
|
|
145
|
-
}
|
|
101
|
+
export type IReferenceDocumentCustomValue = {
|
|
102
|
+
name: string;
|
|
103
|
+
originFileUrl?: string;
|
|
104
|
+
url: string;
|
|
105
|
+
}[];
|
|
146
106
|
export interface IRunErrorEvent extends IBaseEvent {
|
|
147
107
|
code?: string;
|
|
148
108
|
message: string;
|
|
@@ -164,13 +124,6 @@ export interface IRunFinishedEvent extends IBaseEvent {
|
|
|
164
124
|
* 关联会话线程 threadId
|
|
165
125
|
* 可以记录初始输入 input
|
|
166
126
|
* 支持嵌套运行(parentRunId 用于子 Agent 调用)
|
|
167
|
-
*
|
|
168
|
-
* @example RunStartedEvent {
|
|
169
|
-
* runId: 123,
|
|
170
|
-
* threadId: "thread_123",
|
|
171
|
-
* parentRunId: undefined,
|
|
172
|
-
* input: { messages: [...] },
|
|
173
|
-
* }
|
|
174
127
|
*/
|
|
175
128
|
export interface IRunStartedEvent extends IBaseEvent {
|
|
176
129
|
input?: unknown;
|
|
@@ -183,10 +136,6 @@ export interface IRunStartedEvent extends IBaseEvent {
|
|
|
183
136
|
* 状态增量更新事件
|
|
184
137
|
* 用于更新客户端状态
|
|
185
138
|
* 以 JSON Patch 格式增量更新状态
|
|
186
|
-
*
|
|
187
|
-
* @example StateDeltaEvent {
|
|
188
|
-
* delta: [{ op: "add", path: "/title", value: "分析需求" }]
|
|
189
|
-
* }
|
|
190
139
|
*/
|
|
191
140
|
export interface IStateDeltaEvent extends IBaseEvent {
|
|
192
141
|
delta: unknown;
|
|
@@ -196,10 +145,6 @@ export interface IStateDeltaEvent extends IBaseEvent {
|
|
|
196
145
|
* 状态快照事件
|
|
197
146
|
* 用于初始化或重置客户端状态
|
|
198
147
|
* 提供当前时刻的完整状态视图
|
|
199
|
-
*
|
|
200
|
-
* @example StateSnapshotEvent {
|
|
201
|
-
* snapshot: { ... }
|
|
202
|
-
* }
|
|
203
148
|
*/
|
|
204
149
|
export interface IStateSnapshotEvent extends IBaseEvent {
|
|
205
150
|
snapshot: unknown;
|
|
@@ -222,43 +167,34 @@ export interface IStepStartedEvent extends IBaseEvent {
|
|
|
222
167
|
}
|
|
223
168
|
export interface ITextMessageChunkEvent extends IBaseEvent {
|
|
224
169
|
delta?: string;
|
|
225
|
-
messageId:
|
|
226
|
-
role?:
|
|
170
|
+
messageId: string;
|
|
171
|
+
role?: MessageRole;
|
|
227
172
|
type: EventType.TextMessageChunk;
|
|
228
173
|
}
|
|
229
174
|
export interface ITextMessageContentEvent extends IBaseEvent {
|
|
230
175
|
delta: string;
|
|
231
|
-
messageId:
|
|
176
|
+
messageId: string;
|
|
232
177
|
type: EventType.TextMessageContent;
|
|
233
178
|
}
|
|
234
179
|
export interface ITextMessageEndEvent extends IBaseEvent {
|
|
235
|
-
messageId:
|
|
180
|
+
messageId: string;
|
|
236
181
|
type: EventType.TextMessageEnd;
|
|
237
182
|
}
|
|
238
183
|
export interface ITextMessageStartEvent extends IBaseEvent {
|
|
239
|
-
messageId:
|
|
240
|
-
role:
|
|
184
|
+
messageId: string;
|
|
185
|
+
role: MessageRole;
|
|
241
186
|
type: EventType.TextMessageStart;
|
|
242
187
|
}
|
|
243
188
|
/**
|
|
244
189
|
* 思考结束事件
|
|
245
|
-
*
|
|
246
|
-
* @example ThinkingEndEvent {
|
|
247
|
-
* timestamp: 1734902400000,
|
|
248
|
-
* type: EventType.ThinkingEnd,
|
|
249
|
-
* }
|
|
250
190
|
*/
|
|
251
191
|
export interface IThinkingEndEvent extends IBaseEvent {
|
|
192
|
+
duration?: number;
|
|
252
193
|
type: EventType.ThinkingEnd;
|
|
253
194
|
}
|
|
254
195
|
/**
|
|
255
196
|
* 思考开始事件
|
|
256
197
|
* 记录思考的标题 title
|
|
257
|
-
*
|
|
258
|
-
* @example ThinkingStartEvent {
|
|
259
|
-
* title: "分析需求"
|
|
260
|
-
* type: EventType.ThinkingStart,
|
|
261
|
-
* }
|
|
262
198
|
*/
|
|
263
199
|
export interface IThinkingStartEvent extends IBaseEvent {
|
|
264
200
|
title?: string;
|
|
@@ -266,12 +202,6 @@ export interface IThinkingStartEvent extends IBaseEvent {
|
|
|
266
202
|
}
|
|
267
203
|
/**
|
|
268
204
|
* 思考文本消息内容事件
|
|
269
|
-
*
|
|
270
|
-
* @example ThinkingTextMessageContentEvent {
|
|
271
|
-
* timestamp: 1734902400000,
|
|
272
|
-
* type: EventType.ThinkingTextMessageContent,
|
|
273
|
-
* delta: "思考中..."
|
|
274
|
-
* }
|
|
275
205
|
*/
|
|
276
206
|
export interface IThinkingTextMessageContentEvent extends IBaseEvent {
|
|
277
207
|
delta: string;
|
|
@@ -279,22 +209,12 @@ export interface IThinkingTextMessageContentEvent extends IBaseEvent {
|
|
|
279
209
|
}
|
|
280
210
|
/**
|
|
281
211
|
* 思考文本消息结束事件
|
|
282
|
-
*
|
|
283
|
-
* @example ThinkingTextMessageEndEvent {
|
|
284
|
-
* timestamp: 1734902400000,
|
|
285
|
-
* type: EventType.ThinkingTextMessageEnd,
|
|
286
|
-
* }
|
|
287
212
|
*/
|
|
288
213
|
export interface IThinkingTextMessageEndEvent extends IBaseEvent {
|
|
289
214
|
type: EventType.ThinkingTextMessageEnd;
|
|
290
215
|
}
|
|
291
216
|
/**
|
|
292
217
|
* 思考文本消息开始事件
|
|
293
|
-
*
|
|
294
|
-
* @example ThinkingTextMessageStartEvent {
|
|
295
|
-
* timestamp: 1734902400000,
|
|
296
|
-
* type: EventType.ThinkingTextMessageStart,
|
|
297
|
-
* }
|
|
298
218
|
*/
|
|
299
219
|
export interface IThinkingTextMessageStartEvent extends IBaseEvent {
|
|
300
220
|
type: EventType.ThinkingTextMessageStart;
|
|
@@ -317,11 +237,14 @@ export interface IToolCallEndEvent extends IBaseEvent {
|
|
|
317
237
|
}
|
|
318
238
|
export interface IToolCallResultEvent extends IBaseEvent {
|
|
319
239
|
content: string;
|
|
240
|
+
duration?: number;
|
|
320
241
|
messageId: string;
|
|
321
242
|
toolCallId: string;
|
|
322
243
|
type: EventType.ToolCallResult;
|
|
323
244
|
}
|
|
324
245
|
export interface IToolCallStartEvent extends IBaseEvent {
|
|
246
|
+
description?: string;
|
|
247
|
+
mcpName?: string;
|
|
325
248
|
parentMessageId?: string;
|
|
326
249
|
toolCallId: string;
|
|
327
250
|
toolCallName: string;
|
package/dist/event/type.ts.js
CHANGED
|
@@ -22,10 +22,14 @@
|
|
|
22
22
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
|
23
23
|
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
24
24
|
* IN THE SOFTWARE.
|
|
25
|
-
*/ export var
|
|
26
|
-
(function(
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
*/ export var CustomEventName;
|
|
26
|
+
(function(CustomEventName) {
|
|
27
|
+
CustomEventName["KnowledgeRagEnd"] = "knowledge_rag_end";
|
|
28
|
+
CustomEventName["KnowledgeRagResult"] = "knowledge_rag_result";
|
|
29
|
+
CustomEventName["KnowledgeRagStart"] = "knowledge_rag_start";
|
|
30
|
+
CustomEventName["KnowledgeRagTextContent"] = "knowledge_rag_text_content";
|
|
31
|
+
CustomEventName["ReferenceDocument"] = "reference_document";
|
|
32
|
+
})(CustomEventName || (CustomEventName = {}));
|
|
29
33
|
export var EventType;
|
|
30
34
|
(function(EventType) {
|
|
31
35
|
EventType["ActivityDelta"] = "ACTIVITY_DELTA";
|
|
@@ -55,10 +59,3 @@ export var EventType;
|
|
|
55
59
|
EventType["ToolCallResult"] = "TOOL_CALL_RESULT";
|
|
56
60
|
EventType["ToolCallStart"] = "TOOL_CALL_START";
|
|
57
61
|
})(EventType || (EventType = {}));
|
|
58
|
-
export var TextMessageRole;
|
|
59
|
-
(function(TextMessageRole) {
|
|
60
|
-
TextMessageRole["ASSISTANT"] = "assistant";
|
|
61
|
-
TextMessageRole["SYSTEM"] = "system";
|
|
62
|
-
TextMessageRole["TOOL"] = "tool";
|
|
63
|
-
TextMessageRole["USER"] = "user";
|
|
64
|
-
})(TextMessageRole || (TextMessageRole = {}));
|
|
@@ -3,13 +3,7 @@ export interface ApiResponse<T = unknown> {
|
|
|
3
3
|
data: T;
|
|
4
4
|
message: string;
|
|
5
5
|
}
|
|
6
|
-
export interface
|
|
7
|
-
onDone?: () => void;
|
|
8
|
-
onError?: (error: Error) => void;
|
|
9
|
-
onMessage?: (event: unknown) => void;
|
|
10
|
-
onStart?: () => void;
|
|
11
|
-
}
|
|
12
|
-
export interface RequestConfig {
|
|
6
|
+
export interface IRequestConfig {
|
|
13
7
|
baseURL?: string;
|
|
14
8
|
controller?: AbortController;
|
|
15
9
|
credentials?: 'include' | 'omit' | 'same-origin';
|
|
@@ -25,24 +19,28 @@ export interface RequestConfig {
|
|
|
25
19
|
transformResponse?: (data: unknown) => unknown;
|
|
26
20
|
validateStatus?: (status: number) => boolean;
|
|
27
21
|
}
|
|
28
|
-
export interface
|
|
22
|
+
export interface IRequestError extends Error {
|
|
29
23
|
code?: string;
|
|
30
|
-
config:
|
|
24
|
+
config: IRequestConfig;
|
|
31
25
|
isAxiosError: boolean;
|
|
32
|
-
|
|
33
|
-
response?: Response;
|
|
26
|
+
response?: IResponse;
|
|
34
27
|
}
|
|
35
|
-
export interface
|
|
36
|
-
config:
|
|
28
|
+
export interface IResponse<T = unknown> {
|
|
29
|
+
config: IRequestConfig;
|
|
37
30
|
data: T;
|
|
38
31
|
headers: Headers;
|
|
39
|
-
request?: Request;
|
|
40
32
|
status: number;
|
|
41
33
|
statusText: string;
|
|
42
34
|
}
|
|
43
|
-
export interface
|
|
35
|
+
export interface ISSEConfig extends ISSEProtocol, Omit<IRequestConfig, 'responseType'> {
|
|
36
|
+
}
|
|
37
|
+
export interface ISSEProtocol {
|
|
38
|
+
onDone?: () => void;
|
|
39
|
+
onError?: (error: Error) => void;
|
|
40
|
+
onMessage?: (event: unknown) => void;
|
|
41
|
+
onStart?: () => void;
|
|
44
42
|
}
|
|
45
|
-
interface
|
|
43
|
+
interface IInterceptor<T> {
|
|
46
44
|
fulfilled?: (value: T) => T;
|
|
47
45
|
rejected?: (error: unknown) => unknown;
|
|
48
46
|
}
|
|
@@ -50,35 +48,41 @@ declare class InterceptorManager<T> {
|
|
|
50
48
|
private handlers;
|
|
51
49
|
clear(): void;
|
|
52
50
|
eject(id: number): void;
|
|
53
|
-
forEach(fn: (interceptor:
|
|
51
|
+
forEach(fn: (interceptor: IInterceptor<T>) => void): void;
|
|
54
52
|
use(fulfilled?: (value: T) => T, rejected?: (error: unknown) => unknown): number;
|
|
55
53
|
}
|
|
56
54
|
export declare class FetchClient {
|
|
57
|
-
defaults:
|
|
55
|
+
defaults: IRequestConfig;
|
|
58
56
|
interceptors: {
|
|
59
|
-
request: InterceptorManager<
|
|
60
|
-
response: InterceptorManager<
|
|
57
|
+
request: InterceptorManager<IRequestConfig>;
|
|
58
|
+
response: InterceptorManager<IResponse>;
|
|
61
59
|
};
|
|
62
|
-
constructor(config?:
|
|
60
|
+
constructor(config?: IRequestConfig);
|
|
63
61
|
applyResponseErrorInterceptors(error: unknown): unknown;
|
|
64
|
-
create(config?:
|
|
65
|
-
delete<T = unknown>(url: string, params?: Record<string, unknown>, config?:
|
|
66
|
-
get<T = unknown>(url: string, params?: Record<string, unknown>, config?:
|
|
67
|
-
head<T = unknown>(url: string, params?: Record<string, unknown>, config?:
|
|
68
|
-
options<T = unknown>(url: string, params?: Record<string, unknown>, config?:
|
|
69
|
-
patch<T = unknown>(url: string, data?: unknown, config?:
|
|
70
|
-
post<T = unknown>(url: string, data?: unknown, config?:
|
|
71
|
-
prepareRequest(config:
|
|
62
|
+
create(config?: IRequestConfig): FetchClient;
|
|
63
|
+
delete<T = unknown>(url: string, params?: Record<string, unknown>, config?: IRequestConfig): Promise<T>;
|
|
64
|
+
get<T = unknown>(url: string, params?: Record<string, unknown>, config?: IRequestConfig): Promise<T>;
|
|
65
|
+
head<T = unknown>(url: string, params?: Record<string, unknown>, config?: IRequestConfig): Promise<T>;
|
|
66
|
+
options<T = unknown>(url: string, params?: Record<string, unknown>, config?: IRequestConfig): Promise<T>;
|
|
67
|
+
patch<T = unknown>(url: string, data?: unknown, config?: IRequestConfig): Promise<T>;
|
|
68
|
+
post<T = unknown>(url: string, data?: unknown, config?: IRequestConfig): Promise<T>;
|
|
69
|
+
prepareRequest(config: IRequestConfig, isStream?: boolean): {
|
|
72
70
|
url: string;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
71
|
+
requestConfig: IRequestConfig;
|
|
72
|
+
fetchConfig: {
|
|
73
|
+
method: string;
|
|
74
|
+
credentials: "include" | "omit" | "same-origin";
|
|
75
|
+
mode: "same-origin" | "cors" | "no-cors";
|
|
76
|
+
headers: Headers;
|
|
77
|
+
body: BodyInit;
|
|
78
|
+
signal: AbortSignal;
|
|
79
|
+
};
|
|
76
80
|
controller: AbortController;
|
|
77
81
|
};
|
|
78
|
-
put<T = unknown>(url: string, data?: unknown, config?:
|
|
79
|
-
request<T = unknown>(config:
|
|
80
|
-
stream(url: string, config?:
|
|
81
|
-
streamRequest(config:
|
|
82
|
+
put<T = unknown>(url: string, data?: unknown, config?: IRequestConfig): Promise<T>;
|
|
83
|
+
request<T = unknown>(config: IRequestConfig): Promise<T>;
|
|
84
|
+
stream(url: string, config?: ISSEConfig): Promise<void>;
|
|
85
|
+
streamRequest(config: ISSEConfig): Promise<void>;
|
|
82
86
|
}
|
|
83
87
|
declare const fetchClient: FetchClient;
|
|
84
88
|
export default fetchClient;
|
|
@@ -192,8 +192,9 @@ export class FetchClient {
|
|
|
192
192
|
prepareRequest(config, isStream = false) {
|
|
193
193
|
// 合并配置
|
|
194
194
|
const mergedConfig = mergeConfig(this.defaults, config);
|
|
195
|
-
//
|
|
195
|
+
// 总的请求配置
|
|
196
196
|
let requestConfig = mergedConfig;
|
|
197
|
+
// 应用请求拦截器
|
|
197
198
|
this.interceptors.request.forEach((interceptor)=>{
|
|
198
199
|
if (interceptor.fulfilled) {
|
|
199
200
|
try {
|
|
@@ -208,7 +209,7 @@ export class FetchClient {
|
|
|
208
209
|
});
|
|
209
210
|
// 构建完整 URL
|
|
210
211
|
let url = requestConfig.url || '';
|
|
211
|
-
if (requestConfig.baseURL) {
|
|
212
|
+
if (requestConfig.baseURL && !url.startsWith('http')) {
|
|
212
213
|
url = requestConfig.baseURL + url;
|
|
213
214
|
}
|
|
214
215
|
url = buildURL(url, requestConfig.params);
|
|
@@ -219,6 +220,7 @@ export class FetchClient {
|
|
|
219
220
|
if (isStream && !headers.has('Accept')) {
|
|
220
221
|
headers.set('Accept', 'text/event-stream');
|
|
221
222
|
}
|
|
223
|
+
// 处理请求体
|
|
222
224
|
if (body !== undefined && body !== null) {
|
|
223
225
|
var _headers_get;
|
|
224
226
|
if (requestConfig.transformRequest) {
|
|
@@ -229,11 +231,19 @@ export class FetchClient {
|
|
|
229
231
|
}
|
|
230
232
|
// 创建 AbortController
|
|
231
233
|
const controller = requestConfig.controller ? requestConfig.controller : new AbortController();
|
|
232
|
-
|
|
233
|
-
|
|
234
|
+
// 请求配置
|
|
235
|
+
const fetchConfig = {
|
|
236
|
+
method: requestConfig.method,
|
|
237
|
+
credentials: requestConfig.credentials,
|
|
238
|
+
mode: requestConfig.mode,
|
|
234
239
|
headers,
|
|
235
240
|
body,
|
|
241
|
+
signal: controller.signal
|
|
242
|
+
};
|
|
243
|
+
return {
|
|
244
|
+
url,
|
|
236
245
|
requestConfig,
|
|
246
|
+
fetchConfig,
|
|
237
247
|
controller
|
|
238
248
|
};
|
|
239
249
|
}
|
|
@@ -248,18 +258,12 @@ export class FetchClient {
|
|
|
248
258
|
var _this = this;
|
|
249
259
|
return _async_to_generator(function*() {
|
|
250
260
|
// 准备请求
|
|
251
|
-
const { url,
|
|
261
|
+
const { url, fetchConfig, requestConfig, controller } = _this.prepareRequest(config);
|
|
252
262
|
// 创建超时控制
|
|
253
263
|
const timeoutId = requestConfig.timeout && requestConfig.timeout > 0 ? setTimeout(()=>controller.abort(), requestConfig.timeout) : undefined;
|
|
254
264
|
try {
|
|
255
265
|
// 发送请求
|
|
256
|
-
const
|
|
257
|
-
method: requestConfig.method,
|
|
258
|
-
headers,
|
|
259
|
-
body,
|
|
260
|
-
signal: controller.signal
|
|
261
|
-
});
|
|
262
|
-
const fetchResponse = yield fetch(request);
|
|
266
|
+
const fetchResponse = yield fetch(url, fetchConfig);
|
|
263
267
|
// 清除超时定时器
|
|
264
268
|
if (timeoutId) {
|
|
265
269
|
clearTimeout(timeoutId);
|
|
@@ -300,13 +304,12 @@ export class FetchClient {
|
|
|
300
304
|
status: fetchResponse.status,
|
|
301
305
|
statusText: fetchResponse.statusText,
|
|
302
306
|
headers: fetchResponse.headers,
|
|
303
|
-
config: requestConfig
|
|
304
|
-
request
|
|
307
|
+
config: requestConfig
|
|
305
308
|
};
|
|
306
309
|
// 验证状态码
|
|
307
310
|
const validateStatus = requestConfig.validateStatus || _this.defaults.validateStatus;
|
|
308
311
|
if (!validateStatus(fetchResponse.status)) {
|
|
309
|
-
throw createError(`Request failed with status code ${fetchResponse.status}`, requestConfig, `ERR_BAD_RESPONSE`,
|
|
312
|
+
throw createError(`Request failed with status code ${fetchResponse.status}`, requestConfig, `ERR_BAD_RESPONSE`, response);
|
|
310
313
|
}
|
|
311
314
|
// 应用响应拦截器
|
|
312
315
|
let finalResponse = response;
|
|
@@ -332,7 +335,7 @@ export class FetchClient {
|
|
|
332
335
|
0,
|
|
333
336
|
'success'
|
|
334
337
|
].includes(apiResponse.code)) {
|
|
335
|
-
throw createError(apiResponse.message, requestConfig, apiResponse.code,
|
|
338
|
+
throw createError(apiResponse.message, requestConfig, apiResponse.code, finalResponse);
|
|
336
339
|
}
|
|
337
340
|
return apiResponse.data;
|
|
338
341
|
} catch (error) {
|
|
@@ -342,11 +345,11 @@ export class FetchClient {
|
|
|
342
345
|
}
|
|
343
346
|
// 处理中断错误
|
|
344
347
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
345
|
-
const requestError = createError('Request timeout', requestConfig, 'ECONNABORTED', undefined
|
|
348
|
+
const requestError = createError('Request timeout', requestConfig, 'ECONNABORTED', undefined);
|
|
346
349
|
throw _this.applyResponseErrorInterceptors(requestError);
|
|
347
350
|
}
|
|
348
351
|
// 处理其他错误
|
|
349
|
-
const requestError = error.isAxiosError === true ? error : createError(error.message, requestConfig, error.code, undefined
|
|
352
|
+
const requestError = error.isAxiosError === true ? error : createError(error.message, requestConfig, error.code, undefined);
|
|
350
353
|
throw _this.applyResponseErrorInterceptors(requestError);
|
|
351
354
|
}
|
|
352
355
|
})();
|
|
@@ -362,23 +365,17 @@ export class FetchClient {
|
|
|
362
365
|
var _this = this;
|
|
363
366
|
return _async_to_generator(function*() {
|
|
364
367
|
// 准备请求(标记为流式请求)
|
|
365
|
-
const { url,
|
|
366
|
-
// 发送请求
|
|
367
|
-
const request = new Request(url, {
|
|
368
|
-
method: requestConfig.method || 'GET',
|
|
369
|
-
headers,
|
|
370
|
-
body,
|
|
371
|
-
signal: controller.signal
|
|
372
|
-
});
|
|
368
|
+
const { url, fetchConfig, requestConfig } = _this.prepareRequest(config, true);
|
|
373
369
|
try {
|
|
374
370
|
var // 触发 onStart 回调
|
|
375
371
|
_config_onStart, _fetchResponse_body;
|
|
376
|
-
|
|
372
|
+
// 发送请求
|
|
373
|
+
const fetchResponse = yield fetch(url, fetchConfig);
|
|
377
374
|
// 验证状态码
|
|
378
375
|
const validateStatus = requestConfig.validateStatus || _this.defaults.validateStatus;
|
|
379
376
|
if (!validateStatus(fetchResponse.status)) {
|
|
380
377
|
var _config_onError;
|
|
381
|
-
const error = createError(`Request failed with status code ${fetchResponse.status}`, requestConfig, `ERR_BAD_RESPONSE`,
|
|
378
|
+
const error = createError(`Request failed with status code ${fetchResponse.status}`, requestConfig, `ERR_BAD_RESPONSE`, undefined);
|
|
382
379
|
(_config_onError = config.onError) === null || _config_onError === void 0 ? void 0 : _config_onError.call(config, error);
|
|
383
380
|
return;
|
|
384
381
|
}
|
|
@@ -387,12 +384,21 @@ export class FetchClient {
|
|
|
387
384
|
const reader = (_fetchResponse_body = fetchResponse.body) === null || _fetchResponse_body === void 0 ? void 0 : _fetchResponse_body.pipeThrough(new window.TextDecoderStream()).getReader();
|
|
388
385
|
if (!reader) {
|
|
389
386
|
var _config_onError1;
|
|
390
|
-
const error = new Error('
|
|
387
|
+
const error = new Error('IResponse body is not readable');
|
|
391
388
|
(_config_onError1 = config.onError) === null || _config_onError1 === void 0 ? void 0 : _config_onError1.call(config, error);
|
|
392
389
|
return;
|
|
393
390
|
}
|
|
394
391
|
// 临时存储数据
|
|
395
392
|
let temp = '';
|
|
393
|
+
// 判断是否为 JSON 字符串
|
|
394
|
+
const isJson = (str)=>{
|
|
395
|
+
try {
|
|
396
|
+
JSON.parse(str);
|
|
397
|
+
return true;
|
|
398
|
+
} catch (_error) {
|
|
399
|
+
return false;
|
|
400
|
+
}
|
|
401
|
+
};
|
|
396
402
|
// eslint-disable-next-line no-constant-condition
|
|
397
403
|
while(true){
|
|
398
404
|
const { value, done } = yield reader.read();
|
|
@@ -405,7 +411,7 @@ export class FetchClient {
|
|
|
405
411
|
const values = (temp + value.toString()).split('\n');
|
|
406
412
|
values.forEach((value)=>{
|
|
407
413
|
const item = value.replace('data:', '').trim();
|
|
408
|
-
if (item
|
|
414
|
+
if (isJson(item)) {
|
|
409
415
|
var _config_onMessage;
|
|
410
416
|
const json = JSON.parse(item);
|
|
411
417
|
(_config_onMessage = config.onMessage) === null || _config_onMessage === void 0 ? void 0 : _config_onMessage.call(config, json);
|
|
@@ -431,7 +437,7 @@ export class FetchClient {
|
|
|
431
437
|
constructor(config = {}){
|
|
432
438
|
_define_property(this, "defaults", void 0);
|
|
433
439
|
_define_property(this, "interceptors", void 0);
|
|
434
|
-
this.defaults =
|
|
440
|
+
this.defaults = mergeConfig({
|
|
435
441
|
method: 'GET',
|
|
436
442
|
headers: {
|
|
437
443
|
'Content-Type': 'application/json'
|
|
@@ -470,11 +476,10 @@ function buildURL(url, params) {
|
|
|
470
476
|
return url;
|
|
471
477
|
}
|
|
472
478
|
// 创建错误对象
|
|
473
|
-
function createError(message, config, code,
|
|
479
|
+
function createError(message, config, code, response) {
|
|
474
480
|
const error = new Error(message);
|
|
475
481
|
error.config = config;
|
|
476
482
|
error.code = String(code);
|
|
477
|
-
error.request = request;
|
|
478
483
|
error.response = response;
|
|
479
484
|
error.isAxiosError = true;
|
|
480
485
|
return error;
|
|
@@ -483,12 +488,19 @@ function createError(message, config, code, request, response) {
|
|
|
483
488
|
function getValue(value) {
|
|
484
489
|
return typeof value === 'function' ? value() : value;
|
|
485
490
|
}
|
|
491
|
+
// 判断是否是普通对象(排除类实例如 AbortController、Headers 等)
|
|
492
|
+
function isPlainObject(value) {
|
|
493
|
+
if (!value || typeof value !== 'object') return false;
|
|
494
|
+
const proto = Object.getPrototypeOf(value);
|
|
495
|
+
return proto === Object.prototype || proto === null;
|
|
496
|
+
}
|
|
486
497
|
// 合并配置
|
|
487
498
|
function mergeConfig(config1, config2) {
|
|
488
499
|
const output = _object_spread({}, config1);
|
|
489
500
|
for(const key in config2){
|
|
490
501
|
const value2 = config2[key];
|
|
491
|
-
|
|
502
|
+
// 只对普通对象进行深度合并,类实例(如 AbortController)直接赋值
|
|
503
|
+
if (isPlainObject(value2)) {
|
|
492
504
|
const value1 = config1[key];
|
|
493
505
|
output[key] = mergeConfig(value1 || {}, value2);
|
|
494
506
|
} else {
|
|
@@ -35,7 +35,23 @@ export const useFetch = (options)=>{
|
|
|
35
35
|
if ((_options_interceptors1 = options.interceptors) === null || _options_interceptors1 === void 0 ? void 0 : _options_interceptors1.response) {
|
|
36
36
|
fetchClient.interceptors.response.use(options.interceptors.response);
|
|
37
37
|
}
|
|
38
|
+
// 重置 fetchClient 配置
|
|
39
|
+
const reset = (newOptions)=>{
|
|
40
|
+
var _newOptions_interceptors, _newOptions_interceptors1;
|
|
41
|
+
// 更新 baseURL
|
|
42
|
+
fetchClient.defaults.baseURL = newOptions.requestData.urlPrefix;
|
|
43
|
+
// 清空并重新注册拦截器
|
|
44
|
+
fetchClient.interceptors.request.clear();
|
|
45
|
+
fetchClient.interceptors.response.clear();
|
|
46
|
+
if ((_newOptions_interceptors = newOptions.interceptors) === null || _newOptions_interceptors === void 0 ? void 0 : _newOptions_interceptors.request) {
|
|
47
|
+
fetchClient.interceptors.request.use(newOptions.interceptors.request);
|
|
48
|
+
}
|
|
49
|
+
if ((_newOptions_interceptors1 = newOptions.interceptors) === null || _newOptions_interceptors1 === void 0 ? void 0 : _newOptions_interceptors1.response) {
|
|
50
|
+
fetchClient.interceptors.response.use(newOptions.interceptors.response);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
38
53
|
return {
|
|
39
|
-
fetchClient
|
|
54
|
+
fetchClient,
|
|
55
|
+
reset
|
|
40
56
|
};
|
|
41
57
|
};
|