import type { AxiosResponse } from 'axios'
import type { LeagdoApiResponse } from './api'
import API, {
setWebsocketOnError,
setApiEntryPoint,
legado_http_entry_point,
setWebsocketOnMessage,
} from './api'
import ajax from './axios'
import { validatorHttpUrl } from '@/utils/utils'
import { createApp } from 'vue'
import App from '@/App.vue'
import store, { useConnectionStore } from '@/store'
createApp(App).use(store)
const connectionStore = useConnectionStore()
const LeagdoApiResponseKeys: string[] = Array.of('isSuccess', 'errorMsg')
const notification = ElMessage
const responseCheckInterceptor = (resp: AxiosResponse) => {
let isLeagdoApiResponse = true
try {
const data = resp.data
for (const key of LeagdoApiResponseKeys) {
if (!(key in data)) {
isLeagdoApiResponse = false
LeagdoApiResponseKeys.length = 0
}
}
if ((data as LeagdoApiResponse<unknown>).isSuccess === true) {
if (!('data' in data)) {
isLeagdoApiResponse = false
}
}
} catch {
isLeagdoApiResponse = false
}
if (isLeagdoApiResponse === false) {
notification.warning({ message: '后端返回内容格式错误', grouping: true })
throw new Error()
}
connectionStore.setConnectType('primary')
connectionStore.setConnectStatus('已连接 ' + legado_http_entry_point)
return resp
}
const axiosErrorInterceptor = (err: unknown) => {
notification.error({
message: '后端连接失败,请检查阅读WEB服务或者设置其它可用链接',
grouping: true,
})
connectionStore.setConnectType('danger')
connectionStore.setConnectStatus('连接异常')
throw err
}
ajax.interceptors.response.use(responseCheckInterceptor, axiosErrorInterceptor)
setWebsocketOnError(axiosErrorInterceptor)
setWebsocketOnMessage(() => {
connectionStore.setConnectType('primary')
connectionStore.setConnectStatus('已连接 ' + legado_http_entry_point)
})
* 按照阅读的默认规则 解析阅读HTTP WebSocket API入口地址
* @returns [http_url, webSocekt_url]
*/
export const parseLeagdoHttpUrlWithDefault = (
http_url: string | URL,
): [string, string] => {
let url = new URL(location.origin)
if (validatorHttpUrl(http_url)) {
url = new URL(http_url)
}
const { protocol, port } = url
let legado_webSocket_port
if (port !== '') {
legado_webSocket_port = String(Number(port) + 1)
} else {
legado_webSocket_port = protocol.startsWith('https:') ? '444' : '81'
}
const legado_webSocket_protocol = protocol.startsWith('https:')
? 'wss://'
: 'ws://'
const http_entry_point = url.toString()
url.protocol = legado_webSocket_protocol
url.port = legado_webSocket_port
const webSocket_entry_point = url.toString()
console.info('legado_api_config:')
console.table({
'http API入口': http_entry_point,
'webSocket API入口': webSocket_entry_point,
})
return [http_entry_point, webSocket_entry_point]
}
setApiEntryPoint(
...parseLeagdoHttpUrlWithDefault(ajax.defaults.baseURL as string),
)
export default API
export * from './api'