@blueking/chat-helper 0.0.1-beta.2 → 0.0.1-beta.21
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 +20 -2
- package/dist/agent/use-agent.d.ts +904 -402
- package/dist/agent/use-agent.ts.js +218 -25
- package/dist/event/ag-ui.d.ts +22 -6
- package/dist/event/ag-ui.ts.js +167 -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 +58 -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 +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 +6 -7
- 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 +3151 -2641
- 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 +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 +1741 -1733
- 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,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: unknown) => 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,14 @@ 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
|
-
|
|
312
|
+
var _response_data;
|
|
313
|
+
const message = ((_response_data = response.data) === null || _response_data === void 0 ? void 0 : _response_data.message) || `Request failed with status code ${fetchResponse.status}`;
|
|
314
|
+
throw createError(message, requestConfig, `ERR_BAD_RESPONSE`, response);
|
|
310
315
|
}
|
|
311
316
|
// 应用响应拦截器
|
|
312
317
|
let finalResponse = response;
|
|
@@ -332,7 +337,7 @@ export class FetchClient {
|
|
|
332
337
|
0,
|
|
333
338
|
'success'
|
|
334
339
|
].includes(apiResponse.code)) {
|
|
335
|
-
throw createError(apiResponse.message, requestConfig, apiResponse.code,
|
|
340
|
+
throw createError(apiResponse.message, requestConfig, apiResponse.code, finalResponse);
|
|
336
341
|
}
|
|
337
342
|
return apiResponse.data;
|
|
338
343
|
} catch (error) {
|
|
@@ -342,11 +347,11 @@ export class FetchClient {
|
|
|
342
347
|
}
|
|
343
348
|
// 处理中断错误
|
|
344
349
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
345
|
-
const requestError = createError('Request timeout', requestConfig, 'ECONNABORTED', undefined
|
|
350
|
+
const requestError = createError('Request timeout', requestConfig, 'ECONNABORTED', undefined);
|
|
346
351
|
throw _this.applyResponseErrorInterceptors(requestError);
|
|
347
352
|
}
|
|
348
353
|
// 处理其他错误
|
|
349
|
-
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);
|
|
350
355
|
throw _this.applyResponseErrorInterceptors(requestError);
|
|
351
356
|
}
|
|
352
357
|
})();
|
|
@@ -362,23 +367,26 @@ export class FetchClient {
|
|
|
362
367
|
var _this = this;
|
|
363
368
|
return _async_to_generator(function*() {
|
|
364
369
|
// 准备请求(标记为流式请求)
|
|
365
|
-
const { url,
|
|
366
|
-
// 发送请求
|
|
367
|
-
const request = new Request(url, {
|
|
368
|
-
method: requestConfig.method || 'GET',
|
|
369
|
-
headers,
|
|
370
|
-
body,
|
|
371
|
-
signal: controller.signal
|
|
372
|
-
});
|
|
370
|
+
const { url, fetchConfig, requestConfig } = _this.prepareRequest(config, true);
|
|
373
371
|
try {
|
|
374
372
|
var // 触发 onStart 回调
|
|
375
373
|
_config_onStart, _fetchResponse_body;
|
|
376
|
-
|
|
374
|
+
// 发送请求
|
|
375
|
+
const fetchResponse = yield fetch(url, fetchConfig);
|
|
377
376
|
// 验证状态码
|
|
378
377
|
const validateStatus = requestConfig.validateStatus || _this.defaults.validateStatus;
|
|
379
378
|
if (!validateStatus(fetchResponse.status)) {
|
|
380
379
|
var _config_onError;
|
|
381
|
-
|
|
380
|
+
let message = `Request failed with status code ${fetchResponse.status}`;
|
|
381
|
+
try {
|
|
382
|
+
const errorData = yield fetchResponse.json();
|
|
383
|
+
if (errorData === null || errorData === void 0 ? void 0 : errorData.message) {
|
|
384
|
+
message = errorData.message;
|
|
385
|
+
}
|
|
386
|
+
} catch (_error) {
|
|
387
|
+
message = `Request failed with status code ${fetchResponse.status}`;
|
|
388
|
+
}
|
|
389
|
+
const error = createError(message, requestConfig, `ERR_BAD_RESPONSE`, undefined);
|
|
382
390
|
(_config_onError = config.onError) === null || _config_onError === void 0 ? void 0 : _config_onError.call(config, error);
|
|
383
391
|
return;
|
|
384
392
|
}
|
|
@@ -387,12 +395,21 @@ export class FetchClient {
|
|
|
387
395
|
const reader = (_fetchResponse_body = fetchResponse.body) === null || _fetchResponse_body === void 0 ? void 0 : _fetchResponse_body.pipeThrough(new window.TextDecoderStream()).getReader();
|
|
388
396
|
if (!reader) {
|
|
389
397
|
var _config_onError1;
|
|
390
|
-
const error = new Error('
|
|
398
|
+
const error = new Error('IResponse body is not readable');
|
|
391
399
|
(_config_onError1 = config.onError) === null || _config_onError1 === void 0 ? void 0 : _config_onError1.call(config, error);
|
|
392
400
|
return;
|
|
393
401
|
}
|
|
394
402
|
// 临时存储数据
|
|
395
403
|
let temp = '';
|
|
404
|
+
// 判断是否为 JSON 字符串
|
|
405
|
+
const isJson = (str)=>{
|
|
406
|
+
try {
|
|
407
|
+
JSON.parse(str);
|
|
408
|
+
return true;
|
|
409
|
+
} catch (_error) {
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
};
|
|
396
413
|
// eslint-disable-next-line no-constant-condition
|
|
397
414
|
while(true){
|
|
398
415
|
const { value, done } = yield reader.read();
|
|
@@ -405,10 +422,11 @@ export class FetchClient {
|
|
|
405
422
|
const values = (temp + value.toString()).split('\n');
|
|
406
423
|
values.forEach((value)=>{
|
|
407
424
|
const item = value.replace('data:', '').trim();
|
|
408
|
-
if (item
|
|
425
|
+
if (isJson(item)) {
|
|
409
426
|
var _config_onMessage;
|
|
410
427
|
const json = JSON.parse(item);
|
|
411
428
|
(_config_onMessage = config.onMessage) === null || _config_onMessage === void 0 ? void 0 : _config_onMessage.call(config, json);
|
|
429
|
+
temp = '';
|
|
412
430
|
} else if (item) {
|
|
413
431
|
temp = item;
|
|
414
432
|
}
|
|
@@ -431,7 +449,7 @@ export class FetchClient {
|
|
|
431
449
|
constructor(config = {}){
|
|
432
450
|
_define_property(this, "defaults", void 0);
|
|
433
451
|
_define_property(this, "interceptors", void 0);
|
|
434
|
-
this.defaults =
|
|
452
|
+
this.defaults = mergeConfig({
|
|
435
453
|
method: 'GET',
|
|
436
454
|
headers: {
|
|
437
455
|
'Content-Type': 'application/json'
|
|
@@ -470,11 +488,10 @@ function buildURL(url, params) {
|
|
|
470
488
|
return url;
|
|
471
489
|
}
|
|
472
490
|
// 创建错误对象
|
|
473
|
-
function createError(message, config, code,
|
|
491
|
+
function createError(message, config, code, response) {
|
|
474
492
|
const error = new Error(message);
|
|
475
493
|
error.config = config;
|
|
476
494
|
error.code = String(code);
|
|
477
|
-
error.request = request;
|
|
478
495
|
error.response = response;
|
|
479
496
|
error.isAxiosError = true;
|
|
480
497
|
return error;
|
|
@@ -483,12 +500,19 @@ function createError(message, config, code, request, response) {
|
|
|
483
500
|
function getValue(value) {
|
|
484
501
|
return typeof value === 'function' ? value() : value;
|
|
485
502
|
}
|
|
503
|
+
// 判断是否是普通对象(排除类实例如 AbortController、Headers 等)
|
|
504
|
+
function isPlainObject(value) {
|
|
505
|
+
if (!value || typeof value !== 'object') return false;
|
|
506
|
+
const proto = Object.getPrototypeOf(value);
|
|
507
|
+
return proto === Object.prototype || proto === null;
|
|
508
|
+
}
|
|
486
509
|
// 合并配置
|
|
487
510
|
function mergeConfig(config1, config2) {
|
|
488
511
|
const output = _object_spread({}, config1);
|
|
489
512
|
for(const key in config2){
|
|
490
513
|
const value2 = config2[key];
|
|
491
|
-
|
|
514
|
+
// 只对普通对象进行深度合并,类实例(如 AbortController)直接赋值
|
|
515
|
+
if (isPlainObject(value2)) {
|
|
492
516
|
const value1 = config1[key];
|
|
493
517
|
output[key] = mergeConfig(value1 || {}, value2);
|
|
494
518
|
} 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
|
};
|