layui.define(['fms_util', 'jquery'], function (exports) { "use strict"; const fmsUtil = layui.fms_util const $ = layui.jquery let websocket = { longSock(url, fn, intro = '') { let lockReconnect = false //避免重复连接 const timeout = 30000 // 超时重连间隔 const HeartBeatMsg = 'HeartBeat' let onlineTimes = null let ws function formatMsg() { return JSON.stringify({ userId: API.userId(), content: HeartBeatMsg }) } function reconnect() { if (lockReconnect) return lockReconnect = true //没连接上会一直重连,设置延迟避免请求过多 setTimeout(function () { createWebSocket() lockReconnect = false }, timeout / 3) //这里设置重连间隔(ms) } //心跳检测 const heartCheck = { timeout, timeoutObj: null, serverTimeoutObj: null, reset: function () { clearInterval(this.timeoutObj) clearTimeout(this.serverTimeoutObj) return this }, start: function () { const self = this let count = 0 this.timeoutObj = setInterval(() => { if (count < 3) { if (ws.readyState === 1) { ws.send(formatMsg()) // console.info(`${intro}HeartBeat第${count + 1}次`) } count++ } else { clearInterval(this.timeoutObj) count = 0 if (ws.readyState === 0 && ws.readyState === 1) { ws.close() } } }, self.timeout) } } const createWebSocket = () => { // console.info(`${intro}创建11`) ws = new WebSocket(url) ws.onopen = () => { ws.send(formatMsg()) heartCheck.reset().start() } ws.onmessage = evt => { let { data } = evt try { data = JSON.parse(data) } catch (error) { data = {} } if (data.realMessageEnum === 1) { heartCheck.reset().start() if (data.content === HeartBeatMsg) { onLine() // 设置在线状态 clearTimeout(onlineTimes) // 清除计时器 onlineTimes = setTimeout(() => { // 如果超过2个心跳时间没返回则视为离线 offLine() }, timeout * 2); } } else if (data.realMessageEnum === 2) { ws.close() data.content && fmsUtil.msg(data.content) setTimeout(() => { User.config({ jquery: $ }); User.method().delUser() window.top.location.reload() }, 2000); } else { heartCheck.reset().start() fn(data, ws) } } ws.onclose = e => { if (e.code !== 1000) { reconnect() } else { clearInterval(heartCheck.timeoutObj) clearTimeout(heartCheck.serverTimeoutObj) } } ws.onerror = function (intro) { offLine() reconnect() //重连 } } createWebSocket() return ws } } exports('websocket', websocket); })