172 lines
4.6 KiB
JavaScript
172 lines
4.6 KiB
JavaScript
import axios from 'axios'
|
||
import { fetchEventSource } from '@microsoft/fetch-event-source'
|
||
|
||
// 判断是否在 Electron 环境中
|
||
const isElectron = window && window.process && window.process.type
|
||
|
||
const service = axios.create({
|
||
baseURL: isElectron ? process.env.VITE_APP_BASE_API : import.meta.env.VITE_APP_BASE_API,
|
||
timeout: 30000
|
||
})
|
||
|
||
// 请求拦截器
|
||
service.interceptors.request.use(
|
||
config => {
|
||
// 如果配置中已经包含了 Authorization header,则使用配置中的值
|
||
if (!config.headers['Authorization']) {
|
||
const token = localStorage.getItem('token')
|
||
if (token) {
|
||
config.headers['Authorization'] = `Bearer ${token}`
|
||
}
|
||
}
|
||
config.headers['Content-Type'] = 'application/json'
|
||
return config
|
||
},
|
||
error => {
|
||
return Promise.reject(error)
|
||
}
|
||
)
|
||
|
||
// 响应拦截器
|
||
service.interceptors.response.use(
|
||
response => {
|
||
return response.data
|
||
},
|
||
error => {
|
||
return Promise.reject(error)
|
||
}
|
||
)
|
||
|
||
// SSE 请求方法
|
||
export const sseRequest = (config) => {
|
||
return new Promise((resolve) => {
|
||
try {
|
||
const url = new URL(`${config.url}`, window.location.origin)
|
||
// const baseURL = isElectron ? process.env.VITE_APP_BASE_API : import.meta.env.VITE_APP_BASE_API
|
||
// const url = new URL(`${config.url}`, baseURL)
|
||
const ctrl = new AbortController()
|
||
let messageQueue = []
|
||
let resolveQueue = null
|
||
|
||
const messageGenerator = async function* () {
|
||
const source = new fetchEventSource(url.toString(), {
|
||
method: 'POST',
|
||
headers: {
|
||
'Authorization': config.headers?.Authorization || `Bearer ${localStorage.getItem('token')}`,
|
||
'Content-Type': 'application/json',
|
||
'Accept': 'text/event-stream',
|
||
// 'Cache-Control': 'no-cache',
|
||
// 'Connection': 'keep-alive'
|
||
},
|
||
body: JSON.stringify(config.params),
|
||
signal: ctrl.signal,
|
||
openWhenHidden: true,
|
||
// credentials: 'include',
|
||
// keepalive: true,
|
||
// retry: 1000,
|
||
// onopen(response) {
|
||
// if (response.ok && response.headers.get('content-type')?.includes('text/event-stream')) {
|
||
// return;
|
||
// }
|
||
// throw new Error(`Failed to open SSE connection: ${response.status} ${response.statusText}`);
|
||
// },
|
||
onmessage: (event) => {
|
||
try {
|
||
const data = JSON.parse(event.data)
|
||
if (resolveQueue) {
|
||
resolveQueue(data)
|
||
resolveQueue = null
|
||
} else {
|
||
messageQueue.push(data)
|
||
}
|
||
} catch (error) {
|
||
console.error('Error parsing SSE message:', error)
|
||
}
|
||
},
|
||
onerror: (error) => {
|
||
console.error('EventSource failed:', error)
|
||
ctrl.abort()
|
||
if (resolveQueue) {
|
||
resolveQueue(null)
|
||
resolveQueue = null
|
||
}
|
||
},
|
||
onclose: () => {
|
||
console.log('Connection closed')
|
||
if (resolveQueue) {
|
||
resolveQueue(null)
|
||
resolveQueue = null
|
||
}
|
||
}
|
||
})
|
||
|
||
try {
|
||
while (true) {
|
||
if (messageQueue.length > 0) {
|
||
yield messageQueue.shift()
|
||
} else {
|
||
const message = await new Promise(resolve => {
|
||
resolveQueue = resolve
|
||
})
|
||
if (message === null) {
|
||
break
|
||
}
|
||
yield message
|
||
}
|
||
}
|
||
} finally {
|
||
ctrl.abort()
|
||
}
|
||
}
|
||
|
||
resolve(messageGenerator())
|
||
} catch (error) {
|
||
console.error('SSE request setup failed:', error)
|
||
resolve((async function* () {})())
|
||
}
|
||
})
|
||
}
|
||
|
||
// 常规HTTP请求方法
|
||
export const httpRequest = (config) => {
|
||
return new Promise((resolve, reject) => {
|
||
try {
|
||
const {
|
||
url,
|
||
method = 'GET',
|
||
params = {},
|
||
data = {},
|
||
headers = {},
|
||
...restConfig
|
||
} = config
|
||
|
||
// 构建请求配置
|
||
const requestConfig = {
|
||
url,
|
||
method,
|
||
params,
|
||
data,
|
||
headers: {
|
||
...headers,
|
||
'Content-Type': 'application/json'
|
||
},
|
||
...restConfig
|
||
}
|
||
|
||
// 发送请求
|
||
service(requestConfig)
|
||
.then(response => {
|
||
resolve(response)
|
||
})
|
||
.catch(error => {
|
||
console.error('HTTP request failed:', error)
|
||
reject(error)
|
||
})
|
||
} catch (error) {
|
||
console.error('HTTP request setup failed:', error)
|
||
reject(error)
|
||
}
|
||
})
|
||
}
|
||
|
||
export default service
|