From 9a873d6c0e19f5f85c0bd4fdcd135450189afdea Mon Sep 17 00:00:00 2001
From: wujingjing <gersonwu@qq.com>
Date: 星期日, 03 十一月 2024 15:15:54 +0800
Subject: [PATCH] 流式获取数据

---
 src/utils/request.ts |   49 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/src/utils/request.ts b/src/utils/request.ts
index c8756bf..a79a4c5 100644
--- a/src/utils/request.ts
+++ b/src/utils/request.ts
@@ -1,13 +1,13 @@
-import type { AxiosInstance, AxiosRequestConfig } from 'axios';
+import type { AxiosInstance, AxiosRequestConfig, CreateAxiosDefaults } from 'axios';
 import axios from 'axios';
 import { ElMessage } from 'element-plus';
 import { NO_AUTH_API_LIST } from '../api/ai/chat';
 import { LOGIN_URL, TEL_LOGIN_URL } from '../api/ai/user';
+import { Logger } from '../model/logger/Logger';
 import emitter from './mitt';
 import { debounce, decodeFormData } from './util';
 import { AUTH_URL, MAIN_URL, SECONDARY_URL } from '/@/constants';
 import { Local, LoginInfo, Session } from '/@/utils/storage';
-import { Logger } from '../model/logger/Logger';
 // import JSONbig from 'json-bigint';
 
 //#region ====================== 鍚庣 res.err_code ======================
@@ -128,18 +128,61 @@
 	);
 };
 // 閰嶇疆鏂板缓涓�涓� axios 瀹炰緥
-const createAxiosInstance = () => {
+const createAxiosInstance = (option: Partial<CreateAxiosDefaults<any>> = {}) => {
 	return axios.create({
 		baseURL: MAIN_URL,
 		timeout: 50000,
 		headers: { 'Content-Type': 'application/json;charset=utf-8 ' },
+		...option,
 	});
 };
+
 const service = createAxiosInstance();
 
 export const mainRequest = service;
 
+//#region ====================== 娴佸搷搴旀暟鎹� ======================
+const streamInstance = createAxiosInstance({
+	adapter: 'fetch',
+	responseType: 'stream',
+});
+const decoder = new TextDecoder();
+const encoder = new TextEncoder();
+const readStream = async (stream: ReadableStream, cb: (value) => void) => {
+	const reader = stream.getReader();
+	let lastValue = new Uint8Array();
+	while (1) {
+		const { done, value } = await reader.read();
+		if (done) {
+			break;
+		}
+		const txt = decoder.decode(Uint8Array.from([...lastValue, ...value]));
+		const txtArr = txt.split('\n');
+		txtArr.forEach((value, index, array) => {
+			// 涓�鑸笉浼氬嚭鐜拌繛缁崲琛岋紝鍙彲鑳芥渶鍚庝竴涓槸鎹㈣
+			if (index === array.length - 1) {
+				// 缂栫爜鍥炲幓锛屼腑鏂囧垏鍒嗕細涔辩爜
+				lastValue = encoder.encode(value);
+			} else {
+				cb(value);
+			}
+		});
+	}
+};
+
+export const streamReq = (config: AxiosRequestConfig<any>, callback: (value) => void) => {
+	streamInstance(config).then((response) => {
+		const stream = response as unknown as ReadableStream;
+		readStream(stream, (value) => {
+			const jsonValue = JSON.parse(value);
+			callback(jsonValue);
+		});
+	});
+};
+//#endregion
+
 initRequestInterceptor(service);
+initRequestInterceptor(streamInstance);
 
 export function secondaryRequest(config: AxiosRequestConfig<any>) {
 	return service({

--
Gitblit v1.9.3