/** * @module initWebSocket 初始化 * @module websocketOnopen 连接成功 * @module websocketOnerror 连接失败 * @module websocketClose 断开连接 * @module resetHeart 重置心跳 * @module sendSocketHeart 心跳发送 * @module reconnect 重连 * @module sendMsg 发送数据 * @module websocketOnmessage 接收数据 * @module test 测试收到消息传递 * @description socket 通信 * @param {any} url socket地址 * @param {any} websocket websocket 实例 * @param {any} heartTime 心跳定时器实例 * @param {number} socketHeart 心跳次数 * @param {number} HeartTimeOut 心跳超时时间 * @param {number} socketError 错误次数 */ import { getToken } from '@/utils/token' import { ElNotification } from 'element-plus' import useNoticeStore from '@/stores/modules/notice' let socketUrl: any = '' // socket地址 let websocket: any = null // websocket 实例 let heartTime: any = null // 心跳定时器实例 let socketHeart = 0 as number // 心跳次数 const HeartTimeOut = 10000 // 心跳超时时间 10000 = 10s let socketError = 0 as number // 错误次数 import { getTimeState } from '@/utils' // 初始化socket export const initWebSocket = (url: any) => { if (import.meta.env.VITE_APP_WEBSOCKET === 'false') { return } socketUrl = url // 初始化 websocket websocket = new WebSocket(url + '?Authorization=Bearer ' + getToken() + '&clientId=' + import.meta.env.VITE_APP_CLIENT_ID) websocketOnopen() websocketOnmessage() websocketOnerror() websocketClose() sendSocketHeart() return websocket } // socket 连接成功 export const websocketOnopen = () => { websocket.onopen = function () { console.log('连接 websocket 成功') resetHeart() } } // socket 连接失败 export const websocketOnerror = () => { websocket.onerror = function (e: any) { console.log('连接 websocket 失败', e) } } // socket 断开链接 export const websocketClose = () => { websocket.onclose = function (e: any) { console.log('断开连接', e) } } // socket 重置心跳 export const resetHeart = () => { socketHeart = 0 socketError = 0 clearInterval(heartTime) sendSocketHeart() } // socket心跳发送 export const sendSocketHeart = () => { heartTime = setInterval(() => { // 如果连接正常则发送心跳 if (websocket.readyState == 1) { // if (socketHeart <= 30) { websocket.send( JSON.stringify({ type: 'ping' }) ) socketHeart = socketHeart + 1 } else { // 重连 reconnect() } }, HeartTimeOut) } // socket重连 export const reconnect = () => { if (socketError <= 2) { clearInterval(heartTime) initWebSocket(socketUrl) socketError = socketError + 1 // eslint-disable-next-line prettier/prettier console.log('socket重连', socketError) } else { // eslint-disable-next-line prettier/prettier console.log('重试次数已用完') clearInterval(heartTime) } } // socket 发送数据 export const sendMsg = (data: any) => { websocket.send(data) } const playSound = () => { const audio = new Audio('src/assets/audio/tip.mp3') audio.play() } // socket 接收数据 export const websocketOnmessage = () => { websocket.onmessage = function (e: any) { let title = '消息' if (e.data.indexOf('heartbeat') > 0) { resetHeart() } if (e.data.indexOf('ping') > 0) { return } useNoticeStore().addNotice({ message: e.data, read: false, time: new Date().toLocaleString() }) if (e.data.indexOf('欢迎') == 0) { title = getTimeState() as any } ElNotification({ title, message: e.data, type: 'success', duration: 3000 }) playSound() return e.data } }