websocket.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import { useDictSync } from "@/composables";
  2. import { AuthStorage } from "@/utils/auth";
  3. // 不直接导入 store 或 userStore
  4. // 全局 WebSocket 实例管理
  5. const websocketInstances = new Map<string, any>();
  6. // 用于防止重复初始化的状态标记
  7. let isInitialized = false;
  8. let dictWebSocketInstance: ReturnType<typeof useDictSync> | null = null;
  9. /**
  10. * 注册 WebSocket 实例
  11. */
  12. export function registerWebSocketInstance(key: string, instance: any) {
  13. websocketInstances.set(key, instance);
  14. console.log(`[WebSocketPlugin] Registered WebSocket instance: ${key}`);
  15. }
  16. /**
  17. * 获取 WebSocket 实例
  18. */
  19. export function getWebSocketInstance(key: string) {
  20. return websocketInstances.get(key);
  21. }
  22. /**
  23. * 初始化WebSocket服务
  24. */
  25. export function setupWebSocket() {
  26. console.log("[WebSocketPlugin] 开始初始化WebSocket服务...");
  27. // 检查是否已经初始化
  28. if (isInitialized) {
  29. console.log("[WebSocketPlugin] WebSocket服务已经初始化,跳过重复初始化");
  30. return;
  31. }
  32. // 检查环境变量是否配置
  33. const wsEndpoint = import.meta.env.VITE_APP_WS_ENDPOINT;
  34. if (!wsEndpoint) {
  35. console.log("[WebSocketPlugin] 未配置WebSocket端点,跳过WebSocket初始化");
  36. return;
  37. }
  38. // 检查是否已登录(基于是否存在访问令牌)
  39. if (!AuthStorage.getAccessToken()) {
  40. console.warn(
  41. "[WebSocketPlugin] 未找到访问令牌,WebSocket初始化已跳过。用户登录后将自动重新连接。"
  42. );
  43. return;
  44. }
  45. try {
  46. // 延迟初始化,确保应用完全启动
  47. setTimeout(() => {
  48. // 保存实例引用
  49. dictWebSocketInstance = useDictSync();
  50. registerWebSocketInstance("dictSync", dictWebSocketInstance);
  51. // 初始化字典WebSocket服务
  52. dictWebSocketInstance.initWebSocket();
  53. console.log("[WebSocketPlugin] 字典WebSocket初始化完成");
  54. // 初始化在线用户计数WebSocket
  55. import("@/composables").then(({ useOnlineCount }) => {
  56. const onlineCountInstance = useOnlineCount({ autoInit: false });
  57. onlineCountInstance.initWebSocket();
  58. console.log("[WebSocketPlugin] 在线用户计数WebSocket初始化完成");
  59. });
  60. // 在窗口关闭前断开WebSocket连接
  61. window.addEventListener("beforeunload", handleWindowClose);
  62. console.log("[WebSocketPlugin] WebSocket服务初始化完成");
  63. isInitialized = true;
  64. }, 1000); // 延迟1秒初始化
  65. } catch (error) {
  66. console.error("[WebSocketPlugin] 初始化WebSocket服务失败:", error);
  67. }
  68. }
  69. /**
  70. * 处理窗口关闭
  71. */
  72. function handleWindowClose() {
  73. console.log("[WebSocketPlugin] 窗口即将关闭,断开WebSocket连接");
  74. cleanupWebSocket();
  75. }
  76. /**
  77. * 清理WebSocket连接
  78. */
  79. export function cleanupWebSocket() {
  80. // 清理字典 WebSocket
  81. if (dictWebSocketInstance) {
  82. try {
  83. dictWebSocketInstance.closeWebSocket();
  84. console.log("[WebSocketPlugin] 字典WebSocket连接已断开");
  85. } catch (error) {
  86. console.error("[WebSocketPlugin] 断开字典WebSocket连接失败:", error);
  87. }
  88. }
  89. // 清理所有注册的 WebSocket 实例
  90. websocketInstances.forEach((instance, key) => {
  91. try {
  92. if (instance && typeof instance.disconnect === "function") {
  93. instance.disconnect();
  94. console.log(`[WebSocketPlugin] ${key} WebSocket连接已断开`);
  95. } else if (instance && typeof instance.closeWebSocket === "function") {
  96. instance.closeWebSocket();
  97. console.log(`[WebSocketPlugin] ${key} WebSocket连接已断开`);
  98. }
  99. } catch (error) {
  100. console.error(`[WebSocketPlugin] 断开 ${key} WebSocket连接失败:`, error);
  101. }
  102. });
  103. // 清空实例映射
  104. websocketInstances.clear();
  105. // 移除事件监听器
  106. window.removeEventListener("beforeunload", handleWindowClose);
  107. // 重置状态
  108. dictWebSocketInstance = null;
  109. isInitialized = false;
  110. }
  111. /**
  112. * 重新初始化WebSocket(用于登录后重连)
  113. */
  114. export function reinitializeWebSocket() {
  115. // 先清理现有连接
  116. cleanupWebSocket();
  117. // 延迟后重新初始化
  118. setTimeout(() => {
  119. setupWebSocket();
  120. }, 500);
  121. }