/** * @websocket * @param url * @param onOpen * @param onMessage * @param onClose * @param onError * @param heart * @param isReconnect * @returns {WebSocket} * @private */ const _webSocket = ({ url, onOpen, onMessage, onClose, onError, heart, isReconnect }) => { if (!window.WebSocket) { throw new Error("您的浏览器不支持WebSocket"); } let isConnected = false; // 设定已链接webSocket标记 let ws = null; // websocket对象 let heartTimer = null; let _heart = { timer: 3000, message: "", }; if (heart) { if (typeof heart === "object" && Object.keys(heart).length > 0) { _heart = { ..._heart, ...heart }; } } else { _heart = null; } // 创建并链接webSocket const connect = () => { // 如果未链接webSocket,则创建一个新的webSocket if (!isConnected) { const wsUrl = `${process.env.VUE_APP_API_WS}${url}`; ws = new WebSocket(wsUrl); isConnected = true; } }; // 向后台发送心跳消息 const heartCheck = () => { ws.send(JSON.stringify(_heart.message)); }; // 初始化事件回调函数 const initEventHandle = () => { ws.addEventListener("open", (e) => { if (_heart) { heartCheck(); } // 如果传入了函数,执行onOpen if (!onOpen) { return false; } else { onOpen(e, ws); } }); ws.addEventListener("message", (e) => { if (!e) { console.log("get nothing from service"); return false; } else { // 如果获取到后台消息,则timer毫秒后再次发起心跳请求给后台,检测是否断连 if (_heart) { heartTimer = setTimeout(() => { if (isConnected) { heartCheck(); } }, _heart.timer); } } // 如果传入了函数,执行onMessage if (!onMessage) { return false; } else { onMessage(e); } }); ws.addEventListener("close", (e) => { if (heartTimer) { clearTimeout(heartTimer); heartTimer = null; } // 如果传入了函数,执行onClose if (!onClose) { return false; } else { onClose(e); } }); ws.addEventListener("error", (e) => { if (!onError) { return false; } else { onError(e); } if (isReconnect) { // 如果断开立即重连标志为true // 重新链接webSocket connect(); } else { if (heartTimer) { clearTimeout(heartTimer); heartTimer = null; } } }); }; // 1.创建并链接webSocket connect(); // 2.初始化事件回调函数 initEventHandle(); // 3.返回 return ws; }; export default _webSocket; export { _webSocket };