111 lines
3.4 KiB
TypeScript
111 lines
3.4 KiB
TypeScript
import {ElNotification as message} from 'element-plus'
|
|
import {Session} from "/@/utils/storage";
|
|
import {getWsBaseURL} from "/@/utils/baseUrl";
|
|
// @ts-ignore
|
|
import socket from '@/types/api/socket'
|
|
|
|
const websocket: socket = {
|
|
websocket: null,
|
|
connectURL: getWsBaseURL(),
|
|
// 开启标识
|
|
socket_open: false,
|
|
// 心跳timer
|
|
hearbeat_timer: null,
|
|
// 心跳发送频率
|
|
hearbeat_interval: 2 * 1000,
|
|
// 是否自动重连
|
|
is_reonnect: true,
|
|
// 重连次数
|
|
reconnect_count: 3,
|
|
// 已发起重连次数
|
|
reconnect_current: 1,
|
|
// 重连timer
|
|
reconnect_timer: null,
|
|
// 重连频率
|
|
reconnect_interval: 5 * 1000,
|
|
init: (receiveMessage: Function | null) => {
|
|
if (!('WebSocket' in window)) {
|
|
message.warning('浏览器不支持WebSocket')
|
|
return null
|
|
}
|
|
const token = Session.get('token')
|
|
if(!token){
|
|
// message.warning('websocket认证失败')
|
|
return null
|
|
}
|
|
const wsUrl = `${getWsBaseURL()}ws/${token}/`
|
|
websocket.websocket = new WebSocket(wsUrl)
|
|
websocket.websocket.onmessage = (e: any) => {
|
|
if (receiveMessage) {
|
|
receiveMessage(e)
|
|
}
|
|
}
|
|
websocket.websocket.onclose = (e: any) => {
|
|
websocket.socket_open = false
|
|
// 需要重新连接
|
|
if (websocket.is_reonnect) {
|
|
websocket.reconnect_timer = setTimeout(() => {
|
|
// 超过重连次数
|
|
if (websocket.reconnect_current > websocket.reconnect_count) {
|
|
clearTimeout(websocket.reconnect_timer)
|
|
websocket.is_reonnect = false
|
|
return
|
|
}
|
|
// 记录重连次数
|
|
websocket.reconnect_current++
|
|
websocket.reconnect()
|
|
}, websocket.reconnect_interval)
|
|
}
|
|
}
|
|
// 连接成功
|
|
websocket.websocket.onopen = function () {
|
|
websocket.socket_open = true
|
|
websocket.is_reonnect = true
|
|
// 开启心跳
|
|
websocket.heartbeat()
|
|
}
|
|
// 连接发生错误
|
|
websocket.websocket.onerror = function () { }
|
|
},
|
|
heartbeat: () => {
|
|
websocket.hearbeat_timer && clearInterval(websocket.hearbeat_timer)
|
|
|
|
websocket.hearbeat_timer = setInterval(() => {
|
|
let data = {
|
|
token: Session.get('token')
|
|
}
|
|
websocket.send(data)
|
|
}, websocket.hearbeat_interval)
|
|
},
|
|
send: (data:string, callback = null) => {
|
|
// 开启状态直接发送
|
|
if (websocket.websocket.readyState === websocket.websocket.OPEN) {
|
|
websocket.websocket.send(JSON.stringify(data))
|
|
// @ts-ignore
|
|
callback && callback()
|
|
} else {
|
|
clearInterval(websocket.hearbeat_timer)
|
|
message({
|
|
type: 'warning',
|
|
message: 'socket链接已断开',
|
|
duration: 1000,
|
|
})
|
|
}
|
|
},
|
|
close: () => {
|
|
websocket.is_reonnect = false
|
|
websocket.websocket.close()
|
|
websocket.websocket = null;
|
|
},
|
|
/**
|
|
* 重新连接
|
|
*/
|
|
reconnect: () => {
|
|
if (websocket.websocket && !websocket.is_reonnect) {
|
|
websocket.close()
|
|
}
|
|
websocket.init(null)
|
|
},
|
|
}
|
|
export default websocket;
|