import { useDictSync } from "@/composables"; import { AuthStorage } from "@/utils/auth"; // 不直接导入 store 或 userStore // 全局 WebSocket 实例管理 const websocketInstances = new Map(); // 用于防止重复初始化的状态标记 let isInitialized = false; let dictWebSocketInstance: ReturnType | null = null; /** * 注册 WebSocket 实例 */ export function registerWebSocketInstance(key: string, instance: any) { websocketInstances.set(key, instance); console.log(`[WebSocketPlugin] Registered WebSocket instance: ${key}`); } /** * 获取 WebSocket 实例 */ export function getWebSocketInstance(key: string) { return websocketInstances.get(key); } /** * 初始化WebSocket服务 */ export function setupWebSocket() { console.log("[WebSocketPlugin] 开始初始化WebSocket服务..."); // 检查是否已经初始化 if (isInitialized) { console.log("[WebSocketPlugin] WebSocket服务已经初始化,跳过重复初始化"); return; } // 检查环境变量是否配置 const wsEndpoint = import.meta.env.VITE_APP_WS_ENDPOINT; if (!wsEndpoint) { console.log("[WebSocketPlugin] 未配置WebSocket端点,跳过WebSocket初始化"); return; } // 检查是否已登录(基于是否存在访问令牌) if (!AuthStorage.getAccessToken()) { console.warn( "[WebSocketPlugin] 未找到访问令牌,WebSocket初始化已跳过。用户登录后将自动重新连接。" ); return; } try { // 延迟初始化,确保应用完全启动 setTimeout(() => { // 保存实例引用 dictWebSocketInstance = useDictSync(); registerWebSocketInstance("dictSync", dictWebSocketInstance); // 初始化字典WebSocket服务 dictWebSocketInstance.initWebSocket(); console.log("[WebSocketPlugin] 字典WebSocket初始化完成"); // 初始化在线用户计数WebSocket import("@/composables").then(({ useOnlineCount }) => { const onlineCountInstance = useOnlineCount({ autoInit: false }); onlineCountInstance.initWebSocket(); console.log("[WebSocketPlugin] 在线用户计数WebSocket初始化完成"); }); // 在窗口关闭前断开WebSocket连接 window.addEventListener("beforeunload", handleWindowClose); console.log("[WebSocketPlugin] WebSocket服务初始化完成"); isInitialized = true; }, 1000); // 延迟1秒初始化 } catch (error) { console.error("[WebSocketPlugin] 初始化WebSocket服务失败:", error); } } /** * 处理窗口关闭 */ function handleWindowClose() { console.log("[WebSocketPlugin] 窗口即将关闭,断开WebSocket连接"); cleanupWebSocket(); } /** * 清理WebSocket连接 */ export function cleanupWebSocket() { // 清理字典 WebSocket if (dictWebSocketInstance) { try { dictWebSocketInstance.closeWebSocket(); console.log("[WebSocketPlugin] 字典WebSocket连接已断开"); } catch (error) { console.error("[WebSocketPlugin] 断开字典WebSocket连接失败:", error); } } // 清理所有注册的 WebSocket 实例 websocketInstances.forEach((instance, key) => { try { if (instance && typeof instance.disconnect === "function") { instance.disconnect(); console.log(`[WebSocketPlugin] ${key} WebSocket连接已断开`); } else if (instance && typeof instance.closeWebSocket === "function") { instance.closeWebSocket(); console.log(`[WebSocketPlugin] ${key} WebSocket连接已断开`); } } catch (error) { console.error(`[WebSocketPlugin] 断开 ${key} WebSocket连接失败:`, error); } }); // 清空实例映射 websocketInstances.clear(); // 移除事件监听器 window.removeEventListener("beforeunload", handleWindowClose); // 重置状态 dictWebSocketInstance = null; isInitialized = false; } /** * 重新初始化WebSocket(用于登录后重连) */ export function reinitializeWebSocket() { // 先清理现有连接 cleanupWebSocket(); // 延迟后重新初始化 setTimeout(() => { setupWebSocket(); }, 500); }