import store from "@/store"; import { Message } from "iview"; import { VUE_APP_WK_SERVER_SOCKET_FOR_AUDIO } from "@/constants/constants"; let ws; let shouldReconnect = true; let heartbeatId = null; const RECONNECT_INTERVAL = 3000; const HEARTBEAT_INTERVAL = 50 * 1000; let reconnectNumber = 0; export function openWS({ examRecordDataId }) { console.log("in openWS", examRecordDataId); try { ws = new WebSocket( VUE_APP_WK_SERVER_SOCKET_FOR_AUDIO + `${examRecordDataId}/${store.state.user.key}/${store.state.user.token}` ); } catch { setTimeout(() => { // tryWSReconnect(); reconnectNumber++; if (reconnectNumber >= 5) { Message.error({ content: "Websocket重连失败", duration: 5, closable: true }); } openWS({ examRecordDataId }); }, RECONNECT_INTERVAL); return; } ws.onopen = event => { console.log("open ws", event); reconnectNumber = 0; ws.onmessage = processWSMessage; ws.onclose = () => { console.log("ws close by server"); clearInterval(heartbeatId); if (shouldReconnect) { console.log("close -> reconnect"); setTimeout(() => { // tryWSReconnect(); reconnectNumber++; if (reconnectNumber >= 5) { Message.error({ content: "Websocket重连失败", duration: 5, closable: true }); } openWS({ examRecordDataId }); }, RECONNECT_INTERVAL); } else { shouldReconnect = true; // reset shouldReconnect } }; heartbeat(); }; } // function tryWSReconnect() { // // socket.close(); // openWS(); // } function heartbeat() { heartbeatId = setInterval(() => { ws.send( JSON.stringify({ eventType: "HEARTBEAT" }) ); }, HEARTBEAT_INTERVAL); } export function closeWsWithoutReconnect() { shouldReconnect = false; ws.close(); } export function getQRCode(order) { if (ws.readyState === ws.OPEN) { ws.send( JSON.stringify({ eventType: "GET_QR_CODE", order }) ); return true; } else { return false; } } function processWSMessage(event) { // console.log("get ws msg: ", event); const res = JSON.parse(event.data); if (res.eventType !== "HEARTBEAT" && !res.isSuccess) { Message.error({ content: res.errorMessage, duration: 10, closable: true }); return; } switch (res.eventType) { case "HEARTBEAT": // console.log("ws heartbeat response from server"); break; case "GET_QR_CODE": console.log("get qrcode", res); store.commit("examingHomeModule/setQuestionQrCode", { qrCode: res.data.qrCode, order: res.data.order }); break; case "SCAN_QR_CODE": console.log("wx scanned qrcode", res); store.commit("examingHomeModule/setQuestionQrCodeScanned", { order: res.data.order }); break; case "GET_AUDIO_ANSWER": console.log("get audio url", res); store.commit("examingHomeModule/setQuestionAudioFileUrl", { order: res.data.order, audioFileUrl: res.data.audioFileUrl }); break; case "SYSTEM_ERROR": console.log("ws get error", res); break; } }