| | |
| | | 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'; |
| | |
| | | (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 '权限验证失败'; |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | 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; |
| | |
| | | ); |
| | | }; |
| | | // 配置新建一个 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({ |