@base-web-kits/base-tools-web 1.3.5 → 1.3.8
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 +93 -0
- package/dist/base-tools-web.umd.global.js +7 -4
- package/dist/base-tools-web.umd.global.js.map +1 -1
- package/dist/index.cjs +7 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -7
- package/dist/index.mjs +7 -4
- package/dist/index.mjs.map +1 -1
- package/dist/network/request.d.ts +14 -6
- package/dist/network/request.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/web/network/request.ts +21 -9
|
@@ -58,7 +58,16 @@ export type RequestConfigBase<D extends RequestData = RequestData> = {
|
|
|
58
58
|
resMap?: (data: ResponseData) => ResponseData;
|
|
59
59
|
/** 获取请求对象, 用于取消请求 */
|
|
60
60
|
onTaskReady?: (task: RequestTask) => void;
|
|
61
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* 流式数据接收事件回调 (已完成基础流式解析,返回消息对象)
|
|
63
|
+
* @example
|
|
64
|
+
* function onMessage(msg: SSEMessage) {
|
|
65
|
+
* console.log(msg);
|
|
66
|
+
* if(msg.type === 'DONE') { } // 流式传输结束
|
|
67
|
+
* if(msg.type === 'thinking') { } // 思考中
|
|
68
|
+
* if(msg.type === 'xx') { } // 各种消息类型
|
|
69
|
+
* }
|
|
70
|
+
*/
|
|
62
71
|
onMessage?: MessageCallback;
|
|
63
72
|
};
|
|
64
73
|
/** 请求任务对象 (用于取消请求) */
|
|
@@ -66,10 +75,6 @@ export type RequestTask = {
|
|
|
66
75
|
/** 取消请求 */
|
|
67
76
|
abort: () => void;
|
|
68
77
|
};
|
|
69
|
-
/** 流式数据块接收事件回调 */
|
|
70
|
-
export type ChunkCallback = (response: {
|
|
71
|
-
data: ArrayBuffer;
|
|
72
|
-
}) => void;
|
|
73
78
|
/**
|
|
74
79
|
* 基础请求 (返回 Promise 和 Task 对象)
|
|
75
80
|
* 基于 fetch API 封装,支持流式请求
|
|
@@ -141,13 +146,16 @@ export type ChunkCallback = (response: {
|
|
|
141
146
|
* // 流式监听
|
|
142
147
|
* const onMessage = (msg: SSEMessage) => {
|
|
143
148
|
* console.log(msg);
|
|
149
|
+
* if(msg.type === 'DONE') { } // 流式传输结束
|
|
150
|
+
* if(msg.type === 'thinking') { } // 思考中
|
|
151
|
+
* if(msg.type === 'xx') { } // 各种消息类型
|
|
144
152
|
* }
|
|
145
153
|
*
|
|
146
154
|
* // 流式发起
|
|
147
155
|
* const data = { content: '你好', chatId: 123 };
|
|
148
156
|
* apiChatStream({ data, onTaskReady, onMessage });
|
|
149
157
|
*
|
|
150
|
-
* // 流式取消 (
|
|
158
|
+
* // 流式取消 (在组件销毁或页面关闭时调用)
|
|
151
159
|
* chatTask?.abort();
|
|
152
160
|
*/
|
|
153
161
|
export declare function request<T, D extends RequestData = RequestData>(config: RequestConfigBase<D>): Promise<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/web/network/request.ts"],"names":[],"mappings":"AAKA,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5E,aAAa;AACb,MAAM,MAAM,aAAa,GACrB,KAAK,GACL,MAAM,GACN,KAAK,GACL,QAAQ,GACR,SAAS,GACT,MAAM,GACN,SAAS,GACT,OAAO,GACP,OAAO,CAAC;AAEZ;;;GAGG;AACH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,WAAW,GACX,eAAe,GACf,IAAI,GACJ,QAAQ,GACR,eAAe,GACf,cAAc,CAAC,UAAU,CAAC,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,OAAO,EAAE,GACT,IAAI,CAAC;AAET;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;AAEpG;;GAEG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/F;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI;IACnE,WAAW;IACX,GAAG,EAAE,MAAM,CAAC;IAEZ,WAAW;IACX,MAAM,CAAC,EAAE,aAAa,CAAC;IAEvB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAEtE,WAAW;IACX,IAAI,CAAC,EAAE,CAAC,CAAC;IAET,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,uDAAuD;IACvD,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAEvB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IAEf,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAEhB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,YAAY;IACZ,WAAW,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAEjC,cAAc;IACd,WAAW,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAEjC,uBAAuB;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;IAE/C,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,wBAAwB;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,oCAAoC;IACpC,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAE/B,sBAAsB;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,cAAc;IACd,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,YAAY,CAAC;IAE9C,qBAAqB;IACrB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAE1C
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/web/network/request.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -108,7 +108,16 @@ export type RequestConfigBase<D extends RequestData = RequestData> = {
|
|
|
108
108
|
/** 获取请求对象, 用于取消请求 */
|
|
109
109
|
onTaskReady?: (task: RequestTask) => void;
|
|
110
110
|
|
|
111
|
-
/**
|
|
111
|
+
/**
|
|
112
|
+
* 流式数据接收事件回调 (已完成基础流式解析,返回消息对象)
|
|
113
|
+
* @example
|
|
114
|
+
* function onMessage(msg: SSEMessage) {
|
|
115
|
+
* console.log(msg);
|
|
116
|
+
* if(msg.type === 'DONE') { } // 流式传输结束
|
|
117
|
+
* if(msg.type === 'thinking') { } // 思考中
|
|
118
|
+
* if(msg.type === 'xx') { } // 各种消息类型
|
|
119
|
+
* }
|
|
120
|
+
*/
|
|
112
121
|
onMessage?: MessageCallback;
|
|
113
122
|
};
|
|
114
123
|
|
|
@@ -118,9 +127,6 @@ export type RequestTask = {
|
|
|
118
127
|
abort: () => void;
|
|
119
128
|
};
|
|
120
129
|
|
|
121
|
-
/** 流式数据块接收事件回调 */
|
|
122
|
-
export type ChunkCallback = (response: { data: ArrayBuffer }) => void;
|
|
123
|
-
|
|
124
130
|
/**
|
|
125
131
|
* 流式解析对象
|
|
126
132
|
* - undefined: 未初始化
|
|
@@ -202,13 +208,16 @@ const requestCache = new Map<string, { res: unknown; expire: number }>();
|
|
|
202
208
|
* // 流式监听
|
|
203
209
|
* const onMessage = (msg: SSEMessage) => {
|
|
204
210
|
* console.log(msg);
|
|
211
|
+
* if(msg.type === 'DONE') { } // 流式传输结束
|
|
212
|
+
* if(msg.type === 'thinking') { } // 思考中
|
|
213
|
+
* if(msg.type === 'xx') { } // 各种消息类型
|
|
205
214
|
* }
|
|
206
215
|
*
|
|
207
216
|
* // 流式发起
|
|
208
217
|
* const data = { content: '你好', chatId: 123 };
|
|
209
218
|
* apiChatStream({ data, onTaskReady, onMessage });
|
|
210
219
|
*
|
|
211
|
-
* // 流式取消 (
|
|
220
|
+
* // 流式取消 (在组件销毁或页面关闭时调用)
|
|
212
221
|
* chatTask?.abort();
|
|
213
222
|
*/
|
|
214
223
|
export function request<T, D extends RequestData = RequestData>(config: RequestConfigBase<D>) {
|
|
@@ -403,7 +412,8 @@ export function request<T, D extends RequestData = RequestData>(config: RequestC
|
|
|
403
412
|
return;
|
|
404
413
|
}
|
|
405
414
|
|
|
406
|
-
if (!isAbortError && toastError)
|
|
415
|
+
if (!isAbortError && toastError)
|
|
416
|
+
appConfig.toast?.({ status, msg: `请求失败,${String(e)}` });
|
|
407
417
|
logRequestInfo({ status, config: logConfig, startTime, e });
|
|
408
418
|
reject(e);
|
|
409
419
|
} finally {
|
|
@@ -478,7 +488,7 @@ function logRequestInfo(options: {
|
|
|
478
488
|
info.res = cloneDeep(res); // 深拷贝,避免外部修改对象,造成输出不一致
|
|
479
489
|
log('info', info);
|
|
480
490
|
} else {
|
|
481
|
-
info.e = e;
|
|
491
|
+
info.e = e instanceof Error ? { name: e.name, message: e.message, stack: e.stack } : String(e); // Error需转为普通对象,否则发送网络日志会序列化成空对象
|
|
482
492
|
log('error', info);
|
|
483
493
|
}
|
|
484
494
|
}
|
|
@@ -508,9 +518,11 @@ function checkCache(cacheKey: string) {
|
|
|
508
518
|
* 处理流式响应
|
|
509
519
|
*/
|
|
510
520
|
async function handleStreamResponse(response: Response, sseTask: SseTask) {
|
|
511
|
-
if (!response.body)
|
|
521
|
+
if (!response.body) throw new Error('Response body is null');
|
|
512
522
|
if (sseTask.parser === undefined) {
|
|
513
|
-
|
|
523
|
+
throw new Error(
|
|
524
|
+
'Stream parser missing: Please set config.onMessage when enableChunked is true',
|
|
525
|
+
);
|
|
514
526
|
}
|
|
515
527
|
|
|
516
528
|
const reader = response.body.getReader();
|