// websocketManager.js import WsRequest from '@/common/websocket.js'; let globalWs = null; const initWs = (url, options = {}) => { // 如果已经有 WebSocket 实例且 URL 相同,直接返回 if (globalWs) { if (globalWs.url === url) { return globalWs; } // 否则先将旧实例以“手动关闭”方式关闭并清理,避免旧实例干扰 try { globalWs._shouldReconnect = false; globalWs.close(1000, 'reinit', true); } catch (e) { // 忽略关闭错误 } globalWs = null; } // 强烈建议:全局只 bind 一次(WsRequest 内部已用静态保护) const opt = Object.assign({ bindGlobal: true }, options); globalWs = new WsRequest(url, opt); return globalWs; }; const connectWs = () => { if (!globalWs) return; // 如果已经连接,直接返回,避免重复 open if (globalWs.connected) return; // 明确表示这是一次主动连接请求,允许自动重连 globalWs.reconnectAttempts = 0; globalWs._shouldReconnect = true; globalWs._manualClose = false; globalWs.open(); }; const closeWs = (manual = true) => { if (!globalWs) return; // 主动关闭时先禁止自动重连 if (manual) { globalWs._shouldReconnect = false; } // 传 manual 参数到 close,以便内部区分是否允许重连 globalWs.close(1000, 'manager close', !!manual); // 如果你想下次重新 init 时创建新实例,可以把 globalWs 置空 // globalWs = null; }; export { initWs, connectWs, closeWs };