From 6584cbef8a5829950c20b507e17445b97650e73f Mon Sep 17 00:00:00 2001
From: hcong <1050828145@qq.com>
Date: 星期三, 27 十一月 2024 12:15:04 +0800
Subject: [PATCH] 1. 新增消息管理类 2. socket消息类型js改为枚举类 3. 重连函数在使用时以参数传递进来

---
 src/socket/FYWebSocket.js               |   48 +++++++--------
 src/socket/index.js                     |   27 ++------
 src/components/bg-task/FYBgTaskCard.vue |    5 +
 src/socket/MessageManager.js            |   27 +++++++++
 src/enum/socketMessage.js               |   32 +++++++---
 src/socket/socketMessage.js             |    3 
 6 files changed, 84 insertions(+), 58 deletions(-)

diff --git a/src/components/bg-task/FYBgTaskCard.vue b/src/components/bg-task/FYBgTaskCard.vue
index baad435..91c449f 100644
--- a/src/components/bg-task/FYBgTaskCard.vue
+++ b/src/components/bg-task/FYBgTaskCard.vue
@@ -46,7 +46,8 @@
 import { useFetchData } from '@/composables/fetchData';
 import bgtaskApi from '@/api/fysp/bgtaskApi';
 import { enumBgTask, BG_TASK_TYPE, BG_TASK_STATUS } from '@/enum/bgTask';
-import eventBus from '@/socket/eventBus.js';
+import { SOCKET_MESSAGE_TYPE } from '@/enum/socketMessage';
+import MessageManager from '@/socket/MessageManager.js';
 
 export default {
   setup() {
@@ -79,7 +80,7 @@
   },
   methods: {
     registerBgTaskMessage() {
-      eventBus.register('background_task', (data) => {
+      MessageManager.register(SOCKET_MESSAGE_TYPE.BACKGROUND_TASK.name, (data) => {
         this.refreshTaskById(data)
       })
     },
diff --git a/src/enum/socketMessage.js b/src/enum/socketMessage.js
index 9a7783b..14ea741 100644
--- a/src/enum/socketMessage.js
+++ b/src/enum/socketMessage.js
@@ -1,17 +1,29 @@
-const messageTypes = [
-  { id: 0, value: '0', label: '蹇冭烦鏈哄埗', name: 'heartbeat' },
-  { id: 1, value: '1', label: '鍚庡彴浠诲姟', name: 'background_task' },
-  { id: 2, value: '2', label: '涓氬姟鏃ュ織', name: 'business_log' }
-];
+import { Enum } from './enum';
+const SOCKET_MESSAGE_TYPE = Enum({
+  BACKGROUND_TASK: {
+    id: 1,
+    value: '1',
+    label: '鍚庡彴浠诲姟',
+    name: 'background_task'
+  },
+  BUSINESS_LOG: { id: 2, value: '2', label: '涓氬姟鏃ュ織', name: 'business_log' }
+});
 /**
  * 鏍规嵁socket娑堟伅绫诲瀷瀛楁寰楀埌杩欎釜绫诲瀷瀵硅薄
  * @param {*} value socket娑堟伅绫诲瀷
  * @returns 瀵瑰簲鐨勬秷鎭被鍨嬪璞�
  */
+/**
+ * 閫氳繃鍚嶇О鏌ユ壘鏋氫妇绫�
+ * @param {String} value
+ * @returns
+ */
 function getByValue(value) {
-  return messageTypes.find((v) => v.value == value);
+  for (const type in SOCKET_MESSAGE_TYPE) {
+    const typeObj = SOCKET_MESSAGE_TYPE[type]
+    if (typeObj.value == value) {
+      return typeObj
+    }
+  }
 }
-function isHeartbeatMessageByType(type) {
-  return type == '0';
-}
-export { messageTypes, getByValue, isHeartbeatMessageByType };
+export { SOCKET_MESSAGE_TYPE, getByValue };
diff --git a/src/socket/FYWebSocket.js b/src/socket/FYWebSocket.js
index 80f00c3..0243462 100644
--- a/src/socket/FYWebSocket.js
+++ b/src/socket/FYWebSocket.js
@@ -1,9 +1,4 @@
-import eventBus from './eventBus.js';
-import {
-  messageTypes,
-  getByValue,
-  isHeartbeatMessageByType
-} from '@/enum/socketMessage.js';
+import { SOCKET_MESSAGE_TYPE, getByValue } from '@/enum/socketMessage.js';
 import { encodeMessage, decodeMessage } from './socketMessage.js';
 import { $socket_base_url } from '@/api/index.js';
 class FYWebSocket extends WebSocket {
@@ -16,15 +11,22 @@
    *    time: 蹇冭烦鏃堕棿闂撮殧
    *    timeout: 蹇冭烦瓒呮椂闂撮殧
    *    reconnect: 鏂嚎閲嶈繛鏃堕棿闂撮殧
-   * isReconnect 鏄惁鏂嚎閲嶈繛
+   * reconnectFunc 鏂嚎閲嶈繛鍑芥暟
+   * messageManager 娑堟伅绠$悊鍣�
    */
-  init(heartBeatConfig, isReconnect) {
+  init(reconnectFunc, messageManager) {
     this.onopen = this.openHandler; // 杩炴帴鎴愬姛鍚庣殑鍥炶皟鍑芥暟
     this.onclose = this.closeHandler; // 杩炴帴鍏抽棴鍚庣殑鍥炶皟 鍑芥暟
     this.onmessage = this.messageHandler; // 鏀跺埌鏈嶅姟鍣ㄦ暟鎹悗鐨勫洖璋冨嚱鏁�
     this.onerror = this.errorHandler; // 杩炴帴鍙戠敓閿欒鐨勫洖璋冩柟娉�
-    this.heartBeatConfig = heartBeatConfig; // 蹇冭烦杩炴帴閰嶇疆鍙傛暟
-    this.isReconnect = isReconnect; // 璁板綍鏄惁鏂嚎閲嶈繛
+    this.heartBeatConfig = {
+      time: 30 * 1000,
+      timeout: 2 * 1000,
+      reconnect: 30 * 1000
+    }; // 蹇冭烦杩炴帴閰嶇疆鍙傛暟
+    this.isReconnect = typeof reconnectFunc === 'function'; // 璁板綍鏄惁鏂嚎閲嶈繛
+    this.reconnectFunc = reconnectFunc; // 鏂嚎閲嶈繛鍑芥暟
+    this.messageManager = messageManager; // 娑堟伅澶勭悊绠$悊鍣�
     this.reconnectTimer = null; // 璁板綍鏂嚎閲嶈繛鐨勬椂闂村櫒
     this.startHeartBeatTimer = null; // 璁板綍蹇冭烦鏃堕棿鍣�
     this.webSocketState = false; // 璁板綍socket杩炴帴鐘舵�� true涓哄凡杩炴帴
@@ -39,7 +41,7 @@
   }
   // 杩炴帴鎴愬姛鍚庣殑鍥炶皟鍑芥暟
   openHandler() {
-    console.log('====onopen 杩炴帴鎴愬姛====');
+    console.log('====onopen websocket杩炴帴鎴愬姛====');
     // socket鐘舵�佽缃负杩炴帴锛屽仛涓哄悗闈㈢殑鏂嚎閲嶈繛鐨勬嫤鎴櫒
     this.webSocketState = true;
     // 鍒ゆ柇鏄惁鍚姩蹇冭烦鏈哄埗
@@ -53,22 +55,17 @@
     if (!(webSocketMsg && webSocketMsg != null && webSocketMsg != {})) {
       return;
     }
-    console.log("webSocketMsg", webSocketMsg);
-    
     const type = webSocketMsg.type;
     const data = webSocketMsg.data;
     let typeObj = getByValue(type);
-    console.log("typeObj", typeObj);
-    
-    if (isHeartbeatMessageByType(type)) {
+    if (type == 0) {
       // 灏嗚繛鎺ョ姸鎬佹洿鏂颁负鍦ㄧ嚎
       this.webSocketState = true;
-      eventBus.emit(typeObj.name, data);
-      console.log('====onmessage 蹇冭烦妫�娴�====', data);
+      console.log('====onmessage websocket蹇冭烦妫�娴�====', data);
     } else {
       // 鍙戦�佷簨浠�
-      eventBus.emit(typeObj.name, data);
-      console.log(`====onmessage ${typeObj.label}====`, data);
+      this.messageManager.emit(typeObj.name, data);
+      console.log(`====onmessage websocket${typeObj.label}====`, data);
     }
   }
   // 杩炴帴鍏抽棴鍚庣殑鍥炶皟 鍑芥暟
@@ -93,7 +90,7 @@
   startHeartBeat(time) {
     this.startHeartBeatTimer = setTimeout(() => {
       // 瀹㈡埛绔瘡闅斾竴娈垫椂闂村悜鏈嶅姟绔彂閫佷竴涓績璺虫秷鎭�
-      this.sendMessage(messageTypes[0].value, Date.now());
+      this.sendMessage('0', Date.now());
       this.waitingServer();
     }, time);
   }
@@ -106,12 +103,12 @@
         this.startHeartBeat(this.heartBeatConfig.time);
         return;
       }
-      console.log('蹇冭烦鏃犲搷搴�, 宸茬粡鍜屾湇鍔$鏂嚎');
+      console.log('websocket 蹇冭烦鏃犲搷搴�, 宸茬粡鍜屾湇鍔$鏂嚎');
       // 閲嶆柊杩炴帴鏃讹紝璁板緱瑕佸厛鍏抽棴褰撳墠杩炴帴
       try {
         this.close();
       } catch (error) {
-        console.log('褰撳墠杩炴帴宸茬粡鍏抽棴');
+        console.log('websocket 褰撳墠杩炴帴宸茬粡鍏抽棴');
       }
       // // 閲嶆柊杩炴帴
       // this.reconnectWebSocket()
@@ -126,8 +123,9 @@
     }
     // 鏍规嵁浼犲叆鐨勬柇绾块噸杩炴椂闂撮棿闅� 寤舵椂杩炴帴
     this.reconnectTimer = setTimeout(() => {
-      // 瑙﹀彂閲嶆柊杩炴帴浜嬩欢
-      eventBus.emit('reconnect');
+      // 瑙﹀彂閲嶆柊杩炴帴鍑芥暟
+      console.log('====onerror websocket灏濊瘯閲嶈繛====');
+      this.reconnectFunc();
     }, this.heartBeatConfig.reconnect);
   }
 }
diff --git a/src/socket/MessageManager.js b/src/socket/MessageManager.js
new file mode 100644
index 0000000..7ae5bff
--- /dev/null
+++ b/src/socket/MessageManager.js
@@ -0,0 +1,27 @@
+import eventBus from './eventBus.js';
+
+class MessageManager {
+  constructor() {
+    this.messageHandler = eventBus;
+  }
+  /**
+   * 娉ㄥ唽浜嬩欢
+   * @param {*} eventType 浜嬩欢绫诲瀷
+   * @param {*} handler 浜嬩欢澶勭悊鍑芥暟
+   */
+  register(eventType, handler) {
+    this.messageHandler.register(eventType, handler);
+  }
+
+  /**
+   * 鍙戦�佷簨浠�
+   * @param {*} eventType 浜嬩欢绫诲瀷
+   * @param  {...any} ars 浜嬩欢鍐呭
+   */
+  emit(eventType, ...ars) {
+    this.messageHandler.emit(eventType, ...ars);
+  }
+}
+const instance = new MessageManager();
+Object.freeze(instance); // 闃叉淇敼瀹炰緥
+export default instance;
diff --git a/src/socket/index.js b/src/socket/index.js
index cf2583f..ce75986 100644
--- a/src/socket/index.js
+++ b/src/socket/index.js
@@ -1,31 +1,20 @@
-
-import { FYWebSocket } from '@/socket/FYWebSocket.js'
-import eventBus from '@/socket/eventBus.js';
+import { FYWebSocket } from '@/socket/FYWebSocket.js';
+import MessageManager from '@/socket/MessageManager.js';
 
 let socket = null;
+
 // 杩炴帴websocket
 function connectWebSocket() {
-  if (socket == null) {
-    socket = new FYWebSocket()
-  }
-  socket.init({
-    time: 4 * 1000,
-    timeout: 2 * 1000,
-    reconnect: 3 * 1000
-  }, true)
+  socket = new FYWebSocket();
+  socket.init(() => {
+    connectWebSocket();
+  }, MessageManager);
   return socket;
-}
-// 鏂嚎閲嶈繛websocket
-function startReconnectWebSocket() {
-  eventBus.register('reconnect', () => {
-    connectWebSocket()
-  })
 }
 /**
  * 鍒濆鍖杝ocket瀹㈡埛绔�
  */
 function initSocketClient() {
   connectWebSocket();
-  startReconnectWebSocket();
 }
-export { initSocketClient }
\ No newline at end of file
+export { initSocketClient };
diff --git a/src/socket/socketMessage.js b/src/socket/socketMessage.js
index d6651c0..e3fe02c 100644
--- a/src/socket/socketMessage.js
+++ b/src/socket/socketMessage.js
@@ -1,4 +1,3 @@
-import { messageTypes } from '@/enum/socketMessage.js' 
 // 寮�濮嬬鍙峰拰缁撴潫绗﹀彿鍒嗗埆涓� '##' 鍜� '%%', 鍒嗛殧绗︿负 &&
 // 寮�濮嬬鍙�
 const startStr = '##';
@@ -35,7 +34,7 @@
   const type = parts[0];
   let data = JSON.parse(parts[1]);
   return {
-    type: messageTypes.find((item) => item.value == type).value,
+    type: type,
     data: data
   };
 }

--
Gitblit v1.9.3