干燥机配套车间生产管理系统/云平台服务端
baoshiwei
2024-05-27 fa3ac93010bea3805438ee3ab0a182bfbf7423da
src/hooks/web/useWebSocket.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
// noinspection JSUnusedGlobalSymbols
import { unref } from 'vue';
import { useWebSocket, WebSocketResult } from '@vueuse/core';
import { getToken } from '/@/utils/auth';
let result: WebSocketResult<any>;
const listeners = new Map();
/**
 * å¼€å¯ WebSocket é“¾æŽ¥ï¼Œå…¨å±€åªéœ€æ‰§è¡Œä¸€æ¬¡
 * @param url
 */
export function connectWebSocket(url: string) {
  console.log("连接websocket::", url)
  //update-begin-author:taoyan date:2022-4-24 for: v2.4.6 çš„ websocket æœåŠ¡ç«¯ï¼Œå­˜åœ¨æ€§èƒ½å’Œå®‰å…¨é—®é¢˜ã€‚ #3278
  let token = (getToken() || '') as string;
  result = useWebSocket(url, {
    // è‡ªåŠ¨é‡è¿ž (遇到错误最多重复连接10次)
    autoReconnect: {
      retries : 10,
      delay : 5000
    },
    // å¿ƒè·³æ£€æµ‹
    heartbeat: {
      message: "ping",
      interval: 55000
    },
     protocols: [token],
  });
  //update-end-author:taoyan date:2022-4-24 for: v2.4.6 çš„ websocket æœåŠ¡ç«¯ï¼Œå­˜åœ¨æ€§èƒ½å’Œå®‰å…¨é—®é¢˜ã€‚ #3278
  if (result) {
    result.open = onOpen;
    result.close = onClose;
    const ws = unref(result.ws);
    if(ws!=null){
      ws.onerror = onError;
      ws.onmessage = onMessage;
    }
  }
}
function onOpen() {
  console.log('[WebSocket] è¿žæŽ¥æˆåŠŸ');
}
function onClose(e) {
  console.log('[WebSocket] è¿žæŽ¥æ–­å¼€ï¼š', e);
}
function onError(e) {
  console.log('[WebSocket] è¿žæŽ¥å‘生错误: ', e);
}
function onMessage(e) {
  console.debug('[WebSocket] -----接收消息-------', e.data);
  try {
    const data = JSON.parse(e.data);
    for (const callback of listeners.keys()) {
      try {
        callback(data);
      } catch (err) {
        console.error(err);
      }
    }
  } catch (err) {
    console.error('[WebSocket] data解析失败:', err);
  }
}
/**
 * æ·»åŠ  WebSocket æ¶ˆæ¯ç›‘听
 * @param callback
 */
export function onWebSocket(callback: (data: object) => any) {
  if (!listeners.has(callback)) {
    if (typeof callback === 'function') {
      listeners.set(callback, null);
    } else {
      console.debug('[WebSocket] æ·»åŠ  WebSocket æ¶ˆæ¯ç›‘听失败:传入的参数不是一个方法');
    }
  }
}
/**
 * è§£é™¤ WebSocket æ¶ˆæ¯ç›‘听
 *
 * @param callback
 */
export function offWebSocket(callback: (data: object) => any) {
  listeners.delete(callback);
}
export function useMyWebSocket() {
  return result;
}