wujingjing
2025-01-16 d83c862df0101148f0f300f5db252b78b552f78f
src/utils/request.ts
@@ -8,6 +8,7 @@
import { debounce, decodeFormData } from './util';
import { AUTH_URL, MAIN_URL, SECONDARY_URL } from '/@/constants';
import { Local, LoginInfo, Session } from '/@/utils/storage';
import { isSharePage } from '../stores/chatRoom';
// import JSONbig from 'json-bigint';
//#region ====================== 后端 res.err_code ======================
@@ -34,7 +35,7 @@
   }
   return !!accessSession;
};
export const SESSION_KEY = 'hswatersession';
export const handleNoAuth = debounce(() => {
   emitNoAuth();
});
@@ -46,9 +47,9 @@
         const accessSession = Local.get(accessSessionKey);
         if (accessSession) {
            // 将 token 添加到请求报文头中
            config.headers['hswatersession'] = accessSession;
            config.headers[SESSION_KEY] = accessSession;
         }
         if (!NO_AUTH_API_LIST.includes(config.url)) {
         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,7 +89,7 @@
         if (!serveData.json_ok) {
            switch (serveData?.err_code) {
               case ErrorCode.Auth:
                  if (res.config.url !== LOGIN_URL && res.config.url !== TEL_LOGIN_URL) {
                  if (res.config.url !== LOGIN_URL && res.config.url !== TEL_LOGIN_URL && !isSharePage.value) {
                     handleNoAuth();
                     throw '权限验证失败';
                  }
@@ -131,14 +132,15 @@
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 ====================== 流响应数据 ======================
@@ -147,36 +149,42 @@
   responseType: 'stream',
});
const decoder = new TextDecoder();
const encoder = new TextEncoder();
const readStream = async (stream: ReadableStream, cb: (value) => void) => {
const readStream = async (stream: ReadableStream, cb: (value) => void): Promise<any> => {
   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);
   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 = (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);
      });
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
@@ -204,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)
@@ -213,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);
@@ -230,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);