wx/src/utils/request.js

114 lines
3.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import axios from 'axios'
import { fetchEventSource } from '@microsoft/fetch-event-source'
const service = axios.create({
baseURL: process.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 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'
},
body: JSON.stringify(config.params),
signal: ctrl.signal,
openWhenHidden: true,
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* () {})())
}
})
}
export default service