yangyin
2024-11-08 c2c7d3c66be938892edaa77d96d8af7f98a66c6d
src/utils/request.ts
@@ -1,10 +1,11 @@
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 JSONbig from 'json-bigint';
@@ -43,15 +44,14 @@
      (config) => {
         // 获取本地的 token
         const accessSession = Local.get(accessSessionKey);
         if (accessSession) {
            // 将 token 添加到请求报文头中
            config.headers['hswatersession'] = accessSession;
         }
         if (!NO_AUTH_API_LIST.includes(config.url)) {
            if (accessSession) {
               // 将 token 添加到请求报文头中
               config.headers['hswatersession'] = accessSession;
            } else {
               if (config.url !== LOGIN_URL && config.url !== TEL_LOGIN_URL) {
                  handleNoAuth(config.url);
                  throw '权限验证失败';
               }
            if (!accessSession && config.url !== LOGIN_URL && config.url !== TEL_LOGIN_URL) {
               handleNoAuth(config.url);
               throw '权限验证失败';
            }
         }
@@ -94,8 +94,10 @@
                  }
                  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;
@@ -126,18 +128,69 @@
   );
};
// 配置新建一个 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();
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({