import {ElNotification as message} from 'element-plus'
import {Session} from "/@/utils/storage";
import {getWsBaseURL} from "/@/utils/baseUrl";
import socket from '/@/types/socket'
const websocket: socket = {
websocket: null,
connectURL: getWsBaseURL(),
socket_open: false,
hearbeat_timer: 0,
hearbeat_interval: 2 * 1000,
is_reconnect: false,
reconnect_count: 0,
reconnect_current: 1,
reconnect_timer: 0,
reconnect_interval: 5 * 1000,
init: (receiveMessage: ((_msg: { data: Blob }) => void) | null, closeCallback: (() => void) | null, wsUrl: string) => {
if (!('WebSocket' in window)) {
message.warning('浏览器不支持WebSocket')
return null
}
const token = Session.get('token')
if(!token){
return null
}
console.log('wsUrl: ', wsUrl)
websocket.websocket = new WebSocket(wsUrl)
websocket.websocket.onmessage = (e) => {
if (receiveMessage) {
receiveMessage(e)
}
}
websocket.websocket.onclose = (e) => {
console.log('websocket close: ', e)
websocket.socket_open = false
if (closeCallback) {
closeCallback();
}
if (websocket.is_reconnect) {
websocket.reconnect_timer = setTimeout(() => {
if (websocket.reconnect_current > websocket.reconnect_count) {
clearTimeout(websocket.reconnect_timer)
websocket.is_reconnect = false
websocket.socket_open = false
return
}
websocket.reconnect_current++
websocket.reconnect()
}, websocket.reconnect_interval)
}
}
websocket.websocket.onopen = function () {
websocket.socket_open = true
websocket.is_reconnect = true
}
websocket.websocket.onerror = function (e) {
console.log('WebSocket onerror', e)
}
},
heartbeat: () => {
if (websocket.hearbeat_timer) {
clearInterval(websocket.hearbeat_timer);
}
websocket.hearbeat_timer = setInterval(() => {
const data = {
token: Session.get('token')
}
websocket.send(data)
}, websocket.hearbeat_interval)
},
send: (data:string, callback = null) => {
if (websocket.websocket && websocket.websocket.readyState === websocket.websocket.OPEN) {
websocket.websocket.send(data)
if (callback) {
callback();
}
} else {
clearInterval(websocket.hearbeat_timer)
websocket.socket_open = false
}
},
close: () => {
websocket.is_reconnect = false
websocket.websocket?.close()
websocket.websocket = null;
websocket.socket_open = false
},
* 重新连接
*/
reconnect: () => {
if (websocket.websocket && !websocket.is_reconnect) {
websocket.close()
}
websocket.init(null)
},
}
export default websocket;