兰宝车间质量管理系统-前端
疯狂的狮子Li
2023-11-14 9e89ab5bae8e52ca8d7bb17940cb7860ca573968
src/utils/websocket.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,141 @@
/**
 * @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/auth';
import useNoticeStore from '@/store/modules/notice';
import { ElNotification } from "element-plus";
const { addNotice } = useNoticeStore();
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; // é”™è¯¯æ¬¡æ•°
// åˆå§‹åŒ–socket
export const initWebSocket = (url: any) => {
  if (!import.meta.env.VITE_APP_WEBSOCKET) {
    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);
};
// socket æŽ¥æ”¶æ•°æ®
export const websocketonmessage = () => {
  websocket.onmessage = function (e: any) {
    if (e.data.indexOf('heartbeat') > 0) {
      resetHeart();
    }
    if (e.data.indexOf('ping') > 0) {
      return;
    }
    addNotice({
      message: e.data,
      read: false,
      time: new Date().toLocaleString()
    });
    ElNotification({
      title: '消息',
      message: e.data,
      type: 'success',
      duration: 3000
    })
    return e.data;
  };
};