@blueking/chat-helper 0.0.1-beta.3 → 0.0.1-beta.30
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 +962 -63
- package/dist/agent/type.d.ts +27 -2
- package/dist/agent/type.ts.js +1 -1
- package/dist/agent/use-agent.d.ts +506 -436
- package/dist/agent/use-agent.ts.js +224 -25
- package/dist/event/ag-ui.d.ts +27 -7
- package/dist/event/ag-ui.ts.js +180 -150
- package/dist/event/type.d.ts +36 -108
- package/dist/event/type.ts.js +9 -11
- package/dist/http/fetch/fetch.d.ts +40 -36
- package/dist/http/fetch/fetch.ts.js +59 -32
- package/dist/http/fetch/index.d.ts +1 -0
- package/dist/http/fetch/index.ts.js +17 -1
- package/dist/http/index.d.ts +24 -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 +22 -16
- package/dist/http/module/index.ts.js +2 -1
- package/dist/http/module/message.d.ts +22 -7
- package/dist/http/module/message.ts.js +49 -7
- package/dist/http/module/session.d.ts +14 -11
- package/dist/http/module/session.ts.js +66 -4
- package/dist/http/transform/agent.ts.js +11 -8
- package/dist/http/transform/message.d.ts +6 -6
- package/dist/http/transform/message.ts.js +542 -118
- package/dist/http/transform/session.ts.js +9 -1
- package/dist/index.d.ts +2926 -2631
- package/dist/index.ts.js +26 -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 +239 -142
- package/dist/message/type.ts.js +15 -15
- package/dist/message/use-message.d.ts +817 -754
- package/dist/message/use-message.ts.js +226 -28
- package/dist/session/type.d.ts +10 -0
- package/dist/session/use-session.d.ts +1881 -1729
- package/dist/session/use-session.ts.js +198 -33
- package/dist/type.d.ts +4 -4
- package/package.json +2 -1
package/dist/event/type.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import type
|
|
2
|
-
export declare enum
|
|
3
|
-
|
|
1
|
+
import { type IMessageApi, type MessageRole, type MessageStatus } 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",
|
|
7
|
+
ReferenceDocument = "reference_document",
|
|
8
|
+
TempMessage = "temp_message"
|
|
4
9
|
}
|
|
5
10
|
export declare enum EventType {
|
|
6
11
|
ActivityDelta = "ACTIVITY_DELTA",
|
|
@@ -30,23 +35,11 @@ export declare enum EventType {
|
|
|
30
35
|
ToolCallResult = "TOOL_CALL_RESULT",
|
|
31
36
|
ToolCallStart = "TOOL_CALL_START"
|
|
32
37
|
}
|
|
33
|
-
export declare enum TextMessageRole {
|
|
34
|
-
ASSISTANT = "assistant",
|
|
35
|
-
SYSTEM = "system",
|
|
36
|
-
TOOL = "tool",
|
|
37
|
-
USER = "user"
|
|
38
|
-
}
|
|
39
38
|
/**
|
|
40
39
|
* Activity 代表 Agent 执行过程中的活动/动作/任务,可能包含结构化数据
|
|
41
40
|
* 活动状态的增量更新
|
|
42
41
|
* 记录活动类型 activityType
|
|
43
42
|
* 使用 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
43
|
*/
|
|
51
44
|
export interface IActivityDeltaEvent extends IBaseEvent {
|
|
52
45
|
activityType: string;
|
|
@@ -59,17 +52,6 @@ export interface IActivityDeltaEvent extends IBaseEvent {
|
|
|
59
52
|
* 活动状态的快照
|
|
60
53
|
* 记录活动类型 activityType
|
|
61
54
|
* 使用 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
55
|
*/
|
|
74
56
|
export interface IActivitySnapshotEvent extends IBaseEvent {
|
|
75
57
|
activityType: string;
|
|
@@ -78,10 +60,6 @@ export interface IActivitySnapshotEvent extends IBaseEvent {
|
|
|
78
60
|
replace?: boolean;
|
|
79
61
|
type: EventType.ActivitySnapshot;
|
|
80
62
|
}
|
|
81
|
-
export interface IBaseCustomEvent {
|
|
82
|
-
timestamp?: number;
|
|
83
|
-
type: CustomEventType;
|
|
84
|
-
}
|
|
85
63
|
export interface IBaseEvent {
|
|
86
64
|
timestamp?: number;
|
|
87
65
|
type: EventType;
|
|
@@ -89,26 +67,24 @@ export interface IBaseEvent {
|
|
|
89
67
|
/**
|
|
90
68
|
* 自定义事件
|
|
91
69
|
* 用于发送自定义事件到客户端
|
|
92
|
-
*
|
|
93
|
-
* @example CustomEvent {
|
|
94
|
-
* name: "custom_event",
|
|
95
|
-
* value: { type: CustomEventType.ReferenceDocument, data: { ... } }
|
|
96
|
-
* }
|
|
97
70
|
*/
|
|
98
71
|
export interface ICustomEvent extends IBaseEvent {
|
|
99
|
-
name:
|
|
72
|
+
name: CustomEventName;
|
|
100
73
|
type: EventType.Custom;
|
|
101
|
-
value:
|
|
74
|
+
value: IKnowledgeRagResultCustomValue | IKnowledgeRagTextContentCustomValue | IReferenceDocumentCustomValue | ITempMessageCustomValue;
|
|
102
75
|
}
|
|
103
76
|
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;
|
|
77
|
+
export type IKnowledgeRagResultCustomValue = IReferenceDocumentCustomValue;
|
|
78
|
+
export interface IKnowledgeRagTextContentCustomValue {
|
|
79
|
+
cover: boolean;
|
|
80
|
+
chunk: {
|
|
81
|
+
content: string;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
104
84
|
/**
|
|
105
85
|
* 消息快照事件
|
|
106
86
|
* 用于记录当前时刻的完整消息状态
|
|
107
87
|
* 同步多端消息状态
|
|
108
|
-
*
|
|
109
|
-
* @example MessagesSnapshotEvent {
|
|
110
|
-
* messages: [{ ... }, { ... }]
|
|
111
|
-
* }
|
|
112
88
|
*/
|
|
113
89
|
export interface IMessagesSnapshotEvent extends IBaseEvent {
|
|
114
90
|
messages: IMessageApi[];
|
|
@@ -117,32 +93,17 @@ export interface IMessagesSnapshotEvent extends IBaseEvent {
|
|
|
117
93
|
/**
|
|
118
94
|
* 透传底层原始事件数据
|
|
119
95
|
* 保留完整的原始事件信息,不做解析
|
|
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
96
|
*/
|
|
132
97
|
export interface IRawEvent extends IBaseEvent {
|
|
133
98
|
event: unknown;
|
|
134
99
|
source?: string;
|
|
135
100
|
type: EventType.Raw;
|
|
136
101
|
}
|
|
137
|
-
export
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
title: string;
|
|
143
|
-
url: string;
|
|
144
|
-
}[];
|
|
145
|
-
}
|
|
102
|
+
export type IReferenceDocumentCustomValue = {
|
|
103
|
+
name: string;
|
|
104
|
+
originFileUrl?: string;
|
|
105
|
+
url: string;
|
|
106
|
+
}[];
|
|
146
107
|
export interface IRunErrorEvent extends IBaseEvent {
|
|
147
108
|
code?: string;
|
|
148
109
|
message: string;
|
|
@@ -164,13 +125,6 @@ export interface IRunFinishedEvent extends IBaseEvent {
|
|
|
164
125
|
* 关联会话线程 threadId
|
|
165
126
|
* 可以记录初始输入 input
|
|
166
127
|
* 支持嵌套运行(parentRunId 用于子 Agent 调用)
|
|
167
|
-
*
|
|
168
|
-
* @example RunStartedEvent {
|
|
169
|
-
* runId: 123,
|
|
170
|
-
* threadId: "thread_123",
|
|
171
|
-
* parentRunId: undefined,
|
|
172
|
-
* input: { messages: [...] },
|
|
173
|
-
* }
|
|
174
128
|
*/
|
|
175
129
|
export interface IRunStartedEvent extends IBaseEvent {
|
|
176
130
|
input?: unknown;
|
|
@@ -183,10 +137,6 @@ export interface IRunStartedEvent extends IBaseEvent {
|
|
|
183
137
|
* 状态增量更新事件
|
|
184
138
|
* 用于更新客户端状态
|
|
185
139
|
* 以 JSON Patch 格式增量更新状态
|
|
186
|
-
*
|
|
187
|
-
* @example StateDeltaEvent {
|
|
188
|
-
* delta: [{ op: "add", path: "/title", value: "分析需求" }]
|
|
189
|
-
* }
|
|
190
140
|
*/
|
|
191
141
|
export interface IStateDeltaEvent extends IBaseEvent {
|
|
192
142
|
delta: unknown;
|
|
@@ -196,10 +146,6 @@ export interface IStateDeltaEvent extends IBaseEvent {
|
|
|
196
146
|
* 状态快照事件
|
|
197
147
|
* 用于初始化或重置客户端状态
|
|
198
148
|
* 提供当前时刻的完整状态视图
|
|
199
|
-
*
|
|
200
|
-
* @example StateSnapshotEvent {
|
|
201
|
-
* snapshot: { ... }
|
|
202
|
-
* }
|
|
203
149
|
*/
|
|
204
150
|
export interface IStateSnapshotEvent extends IBaseEvent {
|
|
205
151
|
snapshot: unknown;
|
|
@@ -220,45 +166,40 @@ export interface IStepStartedEvent extends IBaseEvent {
|
|
|
220
166
|
stepName: string;
|
|
221
167
|
type: EventType.StepStarted;
|
|
222
168
|
}
|
|
169
|
+
export interface ITempMessageCustomValue {
|
|
170
|
+
message: string;
|
|
171
|
+
status: MessageStatus;
|
|
172
|
+
}
|
|
223
173
|
export interface ITextMessageChunkEvent extends IBaseEvent {
|
|
224
174
|
delta?: string;
|
|
225
|
-
messageId:
|
|
226
|
-
role?:
|
|
175
|
+
messageId: string;
|
|
176
|
+
role?: MessageRole;
|
|
227
177
|
type: EventType.TextMessageChunk;
|
|
228
178
|
}
|
|
229
179
|
export interface ITextMessageContentEvent extends IBaseEvent {
|
|
230
180
|
delta: string;
|
|
231
|
-
messageId:
|
|
181
|
+
messageId: string;
|
|
232
182
|
type: EventType.TextMessageContent;
|
|
233
183
|
}
|
|
234
184
|
export interface ITextMessageEndEvent extends IBaseEvent {
|
|
235
|
-
messageId:
|
|
185
|
+
messageId: string;
|
|
236
186
|
type: EventType.TextMessageEnd;
|
|
237
187
|
}
|
|
238
188
|
export interface ITextMessageStartEvent extends IBaseEvent {
|
|
239
|
-
messageId:
|
|
240
|
-
role:
|
|
189
|
+
messageId: string;
|
|
190
|
+
role: MessageRole;
|
|
241
191
|
type: EventType.TextMessageStart;
|
|
242
192
|
}
|
|
243
193
|
/**
|
|
244
194
|
* 思考结束事件
|
|
245
|
-
*
|
|
246
|
-
* @example ThinkingEndEvent {
|
|
247
|
-
* timestamp: 1734902400000,
|
|
248
|
-
* type: EventType.ThinkingEnd,
|
|
249
|
-
* }
|
|
250
195
|
*/
|
|
251
196
|
export interface IThinkingEndEvent extends IBaseEvent {
|
|
197
|
+
duration?: number;
|
|
252
198
|
type: EventType.ThinkingEnd;
|
|
253
199
|
}
|
|
254
200
|
/**
|
|
255
201
|
* 思考开始事件
|
|
256
202
|
* 记录思考的标题 title
|
|
257
|
-
*
|
|
258
|
-
* @example ThinkingStartEvent {
|
|
259
|
-
* title: "分析需求"
|
|
260
|
-
* type: EventType.ThinkingStart,
|
|
261
|
-
* }
|
|
262
203
|
*/
|
|
263
204
|
export interface IThinkingStartEvent extends IBaseEvent {
|
|
264
205
|
title?: string;
|
|
@@ -266,12 +207,6 @@ export interface IThinkingStartEvent extends IBaseEvent {
|
|
|
266
207
|
}
|
|
267
208
|
/**
|
|
268
209
|
* 思考文本消息内容事件
|
|
269
|
-
*
|
|
270
|
-
* @example ThinkingTextMessageContentEvent {
|
|
271
|
-
* timestamp: 1734902400000,
|
|
272
|
-
* type: EventType.ThinkingTextMessageContent,
|
|
273
|
-
* delta: "思考中..."
|
|
274
|
-
* }
|
|
275
210
|
*/
|
|
276
211
|
export interface IThinkingTextMessageContentEvent extends IBaseEvent {
|
|
277
212
|
delta: string;
|
|
@@ -279,22 +214,12 @@ export interface IThinkingTextMessageContentEvent extends IBaseEvent {
|
|
|
279
214
|
}
|
|
280
215
|
/**
|
|
281
216
|
* 思考文本消息结束事件
|
|
282
|
-
*
|
|
283
|
-
* @example ThinkingTextMessageEndEvent {
|
|
284
|
-
* timestamp: 1734902400000,
|
|
285
|
-
* type: EventType.ThinkingTextMessageEnd,
|
|
286
|
-
* }
|
|
287
217
|
*/
|
|
288
218
|
export interface IThinkingTextMessageEndEvent extends IBaseEvent {
|
|
289
219
|
type: EventType.ThinkingTextMessageEnd;
|
|
290
220
|
}
|
|
291
221
|
/**
|
|
292
222
|
* 思考文本消息开始事件
|
|
293
|
-
*
|
|
294
|
-
* @example ThinkingTextMessageStartEvent {
|
|
295
|
-
* timestamp: 1734902400000,
|
|
296
|
-
* type: EventType.ThinkingTextMessageStart,
|
|
297
|
-
* }
|
|
298
223
|
*/
|
|
299
224
|
export interface IThinkingTextMessageStartEvent extends IBaseEvent {
|
|
300
225
|
type: EventType.ThinkingTextMessageStart;
|
|
@@ -317,11 +242,14 @@ export interface IToolCallEndEvent extends IBaseEvent {
|
|
|
317
242
|
}
|
|
318
243
|
export interface IToolCallResultEvent extends IBaseEvent {
|
|
319
244
|
content: string;
|
|
245
|
+
duration?: number;
|
|
320
246
|
messageId: string;
|
|
321
247
|
toolCallId: string;
|
|
322
248
|
type: EventType.ToolCallResult;
|
|
323
249
|
}
|
|
324
250
|
export interface IToolCallStartEvent extends IBaseEvent {
|
|
251
|
+
description?: string;
|
|
252
|
+
mcpName?: string;
|
|
325
253
|
parentMessageId?: string;
|
|
326
254
|
toolCallId: string;
|
|
327
255
|
toolCallName: string;
|
package/dist/event/type.ts.js
CHANGED
|
@@ -22,10 +22,15 @@
|
|
|
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["TempMessage"] = "temp_message";
|
|
33
|
+
})(CustomEventName || (CustomEventName = {}));
|
|
29
34
|
export var EventType;
|
|
30
35
|
(function(EventType) {
|
|
31
36
|
EventType["ActivityDelta"] = "ACTIVITY_DELTA";
|
|
@@ -55,10 +60,3 @@ export var EventType;
|
|
|
55
60
|
EventType["ToolCallResult"] = "TOOL_CALL_RESULT";
|
|
56
61
|
EventType["ToolCallStart"] = "TOOL_CALL_START";
|
|
57
62
|
})(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,17 +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
|
-
headers,
|
|
258
|
-
body,
|
|
259
|
-
signal: controller.signal
|
|
260
|
-
}));
|
|
261
|
-
const fetchResponse = yield fetch(request);
|
|
266
|
+
const fetchResponse = yield fetch(url, fetchConfig);
|
|
262
267
|
// 清除超时定时器
|
|
263
268
|
if (timeoutId) {
|
|
264
269
|
clearTimeout(timeoutId);
|
|
@@ -299,13 +304,14 @@ export class FetchClient {
|
|
|
299
304
|
status: fetchResponse.status,
|
|
300
305
|
statusText: fetchResponse.statusText,
|
|
301
306
|
headers: fetchResponse.headers,
|
|
302
|
-
config: requestConfig
|
|
303
|
-
request
|
|
307
|
+
config: requestConfig
|
|
304
308
|
};
|
|
305
309
|
// 验证状态码
|
|
306
310
|
const validateStatus = requestConfig.validateStatus || _this.defaults.validateStatus;
|
|
307
311
|
if (!validateStatus(fetchResponse.status)) {
|
|
308
|
-
|
|
312
|
+
var _response_data_error, _response_data;
|
|
313
|
+
const message = ((_response_data = response.data) === null || _response_data === void 0 ? void 0 : (_response_data_error = _response_data.error) === null || _response_data_error === void 0 ? void 0 : _response_data_error.message) || `Request failed with status code ${fetchResponse.status}`;
|
|
314
|
+
throw createError(message, requestConfig, `ERR_BAD_RESPONSE`, response);
|
|
309
315
|
}
|
|
310
316
|
// 应用响应拦截器
|
|
311
317
|
let finalResponse = response;
|
|
@@ -331,7 +337,7 @@ export class FetchClient {
|
|
|
331
337
|
0,
|
|
332
338
|
'success'
|
|
333
339
|
].includes(apiResponse.code)) {
|
|
334
|
-
throw createError(apiResponse.message, requestConfig, apiResponse.code,
|
|
340
|
+
throw createError(apiResponse.message, requestConfig, apiResponse.code, finalResponse);
|
|
335
341
|
}
|
|
336
342
|
return apiResponse.data;
|
|
337
343
|
} catch (error) {
|
|
@@ -341,11 +347,11 @@ export class FetchClient {
|
|
|
341
347
|
}
|
|
342
348
|
// 处理中断错误
|
|
343
349
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
344
|
-
const requestError = createError('Request timeout', requestConfig, 'ECONNABORTED', undefined
|
|
350
|
+
const requestError = createError('Request timeout', requestConfig, 'ECONNABORTED', undefined);
|
|
345
351
|
throw _this.applyResponseErrorInterceptors(requestError);
|
|
346
352
|
}
|
|
347
353
|
// 处理其他错误
|
|
348
|
-
const requestError = error.isAxiosError === true ? error : createError(error.message, requestConfig, error.code, undefined
|
|
354
|
+
const requestError = error.isAxiosError === true ? error : createError(error.message, requestConfig, error.code, undefined);
|
|
349
355
|
throw _this.applyResponseErrorInterceptors(requestError);
|
|
350
356
|
}
|
|
351
357
|
})();
|
|
@@ -361,22 +367,27 @@ export class FetchClient {
|
|
|
361
367
|
var _this = this;
|
|
362
368
|
return _async_to_generator(function*() {
|
|
363
369
|
// 准备请求(标记为流式请求)
|
|
364
|
-
const { url,
|
|
365
|
-
// 发送请求
|
|
366
|
-
const request = new Request(url, _object_spread_props(_object_spread({}, requestConfig), {
|
|
367
|
-
headers,
|
|
368
|
-
body,
|
|
369
|
-
signal: controller.signal
|
|
370
|
-
}));
|
|
370
|
+
const { url, fetchConfig, requestConfig } = _this.prepareRequest(config, true);
|
|
371
371
|
try {
|
|
372
372
|
var // 触发 onStart 回调
|
|
373
373
|
_config_onStart, _fetchResponse_body;
|
|
374
|
-
|
|
374
|
+
// 发送请求
|
|
375
|
+
const fetchResponse = yield fetch(url, fetchConfig);
|
|
375
376
|
// 验证状态码
|
|
376
377
|
const validateStatus = requestConfig.validateStatus || _this.defaults.validateStatus;
|
|
377
378
|
if (!validateStatus(fetchResponse.status)) {
|
|
378
379
|
var _config_onError;
|
|
379
|
-
|
|
380
|
+
let message = `Request failed with status code ${fetchResponse.status}`;
|
|
381
|
+
try {
|
|
382
|
+
var _errorData_error;
|
|
383
|
+
const errorData = yield fetchResponse.json();
|
|
384
|
+
if (errorData === null || errorData === void 0 ? void 0 : (_errorData_error = errorData.error) === null || _errorData_error === void 0 ? void 0 : _errorData_error.message) {
|
|
385
|
+
message = errorData.error.message;
|
|
386
|
+
}
|
|
387
|
+
} catch (_error) {
|
|
388
|
+
message = `Request failed with status code ${fetchResponse.status}`;
|
|
389
|
+
}
|
|
390
|
+
const error = createError(message, requestConfig, `ERR_BAD_RESPONSE`, undefined);
|
|
380
391
|
(_config_onError = config.onError) === null || _config_onError === void 0 ? void 0 : _config_onError.call(config, error);
|
|
381
392
|
return;
|
|
382
393
|
}
|
|
@@ -385,12 +396,21 @@ export class FetchClient {
|
|
|
385
396
|
const reader = (_fetchResponse_body = fetchResponse.body) === null || _fetchResponse_body === void 0 ? void 0 : _fetchResponse_body.pipeThrough(new window.TextDecoderStream()).getReader();
|
|
386
397
|
if (!reader) {
|
|
387
398
|
var _config_onError1;
|
|
388
|
-
const error = new Error('
|
|
399
|
+
const error = new Error('IResponse body is not readable');
|
|
389
400
|
(_config_onError1 = config.onError) === null || _config_onError1 === void 0 ? void 0 : _config_onError1.call(config, error);
|
|
390
401
|
return;
|
|
391
402
|
}
|
|
392
403
|
// 临时存储数据
|
|
393
404
|
let temp = '';
|
|
405
|
+
// 判断是否为 JSON 字符串
|
|
406
|
+
const isJson = (str)=>{
|
|
407
|
+
try {
|
|
408
|
+
JSON.parse(str);
|
|
409
|
+
return true;
|
|
410
|
+
} catch (_error) {
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
};
|
|
394
414
|
// eslint-disable-next-line no-constant-condition
|
|
395
415
|
while(true){
|
|
396
416
|
const { value, done } = yield reader.read();
|
|
@@ -403,10 +423,11 @@ export class FetchClient {
|
|
|
403
423
|
const values = (temp + value.toString()).split('\n');
|
|
404
424
|
values.forEach((value)=>{
|
|
405
425
|
const item = value.replace('data:', '').trim();
|
|
406
|
-
if (item
|
|
426
|
+
if (isJson(item)) {
|
|
407
427
|
var _config_onMessage;
|
|
408
428
|
const json = JSON.parse(item);
|
|
409
429
|
(_config_onMessage = config.onMessage) === null || _config_onMessage === void 0 ? void 0 : _config_onMessage.call(config, json);
|
|
430
|
+
temp = '';
|
|
410
431
|
} else if (item) {
|
|
411
432
|
temp = item;
|
|
412
433
|
}
|
|
@@ -429,7 +450,7 @@ export class FetchClient {
|
|
|
429
450
|
constructor(config = {}){
|
|
430
451
|
_define_property(this, "defaults", void 0);
|
|
431
452
|
_define_property(this, "interceptors", void 0);
|
|
432
|
-
this.defaults =
|
|
453
|
+
this.defaults = mergeConfig({
|
|
433
454
|
method: 'GET',
|
|
434
455
|
headers: {
|
|
435
456
|
'Content-Type': 'application/json'
|
|
@@ -468,11 +489,10 @@ function buildURL(url, params) {
|
|
|
468
489
|
return url;
|
|
469
490
|
}
|
|
470
491
|
// 创建错误对象
|
|
471
|
-
function createError(message, config, code,
|
|
492
|
+
function createError(message, config, code, response) {
|
|
472
493
|
const error = new Error(message);
|
|
473
494
|
error.config = config;
|
|
474
495
|
error.code = String(code);
|
|
475
|
-
error.request = request;
|
|
476
496
|
error.response = response;
|
|
477
497
|
error.isAxiosError = true;
|
|
478
498
|
return error;
|
|
@@ -481,12 +501,19 @@ function createError(message, config, code, request, response) {
|
|
|
481
501
|
function getValue(value) {
|
|
482
502
|
return typeof value === 'function' ? value() : value;
|
|
483
503
|
}
|
|
504
|
+
// 判断是否是普通对象(排除类实例如 AbortController、Headers 等)
|
|
505
|
+
function isPlainObject(value) {
|
|
506
|
+
if (!value || typeof value !== 'object') return false;
|
|
507
|
+
const proto = Object.getPrototypeOf(value);
|
|
508
|
+
return proto === Object.prototype || proto === null;
|
|
509
|
+
}
|
|
484
510
|
// 合并配置
|
|
485
511
|
function mergeConfig(config1, config2) {
|
|
486
512
|
const output = _object_spread({}, config1);
|
|
487
513
|
for(const key in config2){
|
|
488
514
|
const value2 = config2[key];
|
|
489
|
-
|
|
515
|
+
// 只对普通对象进行深度合并,类实例(如 AbortController)直接赋值
|
|
516
|
+
if (isPlainObject(value2)) {
|
|
490
517
|
const value1 = config1[key];
|
|
491
518
|
output[key] = mergeConfig(value1 || {}, value2);
|
|
492
519
|
} else {
|