| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- import { useDictSync } from "@/composables";
- import { AuthStorage } from "@/utils/auth";
- // 不直接导入 store 或 userStore
- // 全局 WebSocket 实例管理
- const websocketInstances = new Map<string, any>();
- // 用于防止重复初始化的状态标记
- let isInitialized = false;
- let dictWebSocketInstance: ReturnType<typeof useDictSync> | 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);
- }
|