From d5846fc94573f1c2156230d9cdf2da45e4e12c46 Mon Sep 17 00:00:00 2001
From: gerson <1405270578@qq.com>
Date: 星期日, 09 二月 2025 16:43:09 +0800
Subject: [PATCH] 主题对接

---
 src/utils/request.ts |  107 ++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 80 insertions(+), 27 deletions(-)

diff --git a/src/utils/request.ts b/src/utils/request.ts
index a8f78b5..6c8eace 100644
--- a/src/utils/request.ts
+++ b/src/utils/request.ts
@@ -1,12 +1,14 @@
-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 } from './util';
+import { debounce, decodeFormData } from './util';
 import { AUTH_URL, MAIN_URL, SECONDARY_URL } from '/@/constants';
 import { Local, LoginInfo, Session } from '/@/utils/storage';
-import { LOGIN_URL } from '../api/ai/user';
-import { NO_AUTH_API_LIST } from '../api/ai/chat';
+import { isSharePage } from '../stores/chatRoom';
 // import JSONbig from 'json-bigint';
 
 //#region ====================== 鍚庣 res.err_code ======================
@@ -33,8 +35,8 @@
 	}
 	return !!accessSession;
 };
-
-const handleNoAuth = debounce(() => {
+export const SESSION_KEY = 'hswatersession';
+export const handleNoAuth = debounce(() => {
 	emitNoAuth();
 });
 const initRequestInterceptor = (request: AxiosInstance) => {
@@ -43,15 +45,14 @@
 		(config) => {
 			// 鑾峰彇鏈湴鐨� token
 			const accessSession = Local.get(accessSessionKey);
-			if (!NO_AUTH_API_LIST.includes(config.url)) {
-				if (accessSession) {
-					// 灏� token 娣诲姞鍒拌姹傛姤鏂囧ご涓�
-					config.headers['hswatersession'] = accessSession;
-				} else {
-					if (config.url !== LOGIN_URL) {
-						handleNoAuth(config.url);
-						throw '鏉冮檺楠岃瘉澶辫触';
-					}
+			if (accessSession) {
+				// 灏� token 娣诲姞鍒拌姹傛姤鏂囧ご涓�
+				config.headers[SESSION_KEY] = accessSession;
+			}
+			if (!NO_AUTH_API_LIST.includes(config.url) && !isSharePage.value) {
+				if (!accessSession && config.url !== LOGIN_URL && config.url !== TEL_LOGIN_URL) {
+					handleNoAuth(config.url);
+					throw '鏉冮檺楠岃瘉澶辫触';
 				}
 			}
 
@@ -88,16 +89,17 @@
 			if (!serveData.json_ok) {
 				switch (serveData?.err_code) {
 					case ErrorCode.Auth:
-						if (res.config.url !== LOGIN_URL) {
+						if (res.config.url !== LOGIN_URL && res.config.url !== TEL_LOGIN_URL && !isSharePage.value) {
 							handleNoAuth();
 							throw '鏉冮檺楠岃瘉澶辫触';
 						}
 						break;
 					case ErrorCode.Exception:
+						const param = res.config.data ? `\n    璇锋眰鍙傛暟锛�${JSON.stringify(decodeFormData(res.config.data))}\n` : '';
 						ElMessage.error('鍐呴儴閿欒锛�');
-						throw '鍐呴儴閿欒';
+						Logger.error(`${res.config.url} 鍝嶅簲澶辫触${param}`, serveData?.json_msg && new Error(serveData?.json_msg));
+						return res.data;
 				}
-				
 			}
 			return res.data;
 		},
@@ -127,18 +129,68 @@
 	);
 };
 // 閰嶇疆鏂板缓涓�涓� 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 ' },
+		timeout: 1200000,
+		headers: {
+			'Content-Type': 'application/x-www-form-urlencoded',
+		},
+		...option,
 	});
 };
-const service = createAxiosInstance();
 
+const service = createAxiosInstance();
 export const mainRequest = service;
 
+//#region ====================== 娴佸搷搴旀暟鎹� ======================
+const streamInstance = createAxiosInstance({
+	adapter: 'fetch',
+	responseType: 'stream',
+});
+const decoder = new TextDecoder();
+const readStream = async (stream: ReadableStream, cb: (value) => void): Promise<any> => {
+	const reader = stream.getReader();
+	let lastValue = '';
+	const p = new Promise(async (resolve, reject) => {
+		let fullValue = '';
+		while (1) {
+			const { done, value } = await reader.read();
+			if (done) {
+				break;
+			}
+			// const txt = decoder.decode(Uint8Array.from([...lastValue, ...value]));
+			const txt = decoder.decode(value);
+			const txtArr = txt.split('\n');
+			txtArr[0] = lastValue + txtArr[0];
+			txtArr.forEach((value, index, array) => {
+				// 涓�鑸笉浼氬嚭鐜拌繛缁崲琛岋紝鍙彲鑳芥渶鍚庝竴涓槸鎹㈣
+				if (index === array.length - 1) {
+					lastValue = value;
+				} else {
+					const decodeValue = decodeURIComponent(value);
+					fullValue += decodeValue;
+					cb(decodeValue);
+				}
+			});
+		}
+		resolve(fullValue);
+	});
+	return p;
+};
+
+export const streamReq = async (config: AxiosRequestConfig<any>, callback: (value) => void) => {
+	const response = await streamInstance(config);
+	const stream = response as unknown as ReadableStream;
+	return readStream(stream, (value) => {
+		const jsonValue = JSON.parse(value);
+		callback(jsonValue);
+	});
+};
+//#endregion
+
 initRequestInterceptor(service);
+initRequestInterceptor(streamInstance);
 
 export function secondaryRequest(config: AxiosRequestConfig<any>) {
 	return service({
@@ -160,7 +212,7 @@
  * @description 鍩熷悕鍓嶇紑
  * 闃叉绫讳技浜� http://sqi.beng35.com/airp 鍜� http://sqi.beng35.com/test 鍏敤鍚屼竴涓� token 鎴� userInfo
  */
-export const getDomainPrefix = (win: Window) => {
+export const getDomainPrefix = (win: Window = window) => {
 	const subDomainName = win.location.pathname
 		.split('/')
 		.filter((item) => !!item)
@@ -169,15 +221,17 @@
 	return domainPrefix;
 };
 
+export const domainPrefix = getDomainPrefix(window);
+
 // token 閿畾涔�
 export const sessionName = 'access-session';
 export const userName = 'userName';
 
 export const getSessionKey = (win: Window) => {
-	return getDomainPrefix(win) + sessionName;
+	return  sessionName;
 };
 export const getUserNameKey = (win: Window) => {
-	return getDomainPrefix(win) + userName;
+	return  userName;
 };
 
 export const accessSessionKey = getSessionKey(window);
@@ -186,8 +240,7 @@
 export const refreshAccessTokenKey = `x-${accessSessionKey}`;
 
 // userInfo閿畾涔�
-export const userInfoKey = getDomainPrefix(window) + 'userInfo';
-
+export const userInfoKey ='userInfo';
 // 鑾峰彇 token
 export const getSession = () => {
 	return Local.get(accessSessionKey);

--
Gitblit v1.9.3