a2bei4-utils 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +2 -2
- package/dist/a2bei4.utils.cjs.js +2080 -1846
- package/dist/a2bei4.utils.cjs.js.map +1 -1
- package/dist/a2bei4.utils.cjs.min.js +1 -1
- package/dist/a2bei4.utils.cjs.min.js.map +1 -1
- package/dist/a2bei4.utils.esm.js +2073 -1843
- package/dist/a2bei4.utils.esm.js.map +1 -1
- package/dist/a2bei4.utils.esm.min.js +1 -1
- package/dist/a2bei4.utils.esm.min.js.map +1 -1
- package/dist/a2bei4.utils.umd.js +2080 -1846
- package/dist/a2bei4.utils.umd.js.map +1 -1
- package/dist/a2bei4.utils.umd.min.js +1 -1
- package/dist/a2bei4.utils.umd.min.js.map +1 -1
- package/dist/arr.cjs +27 -27
- package/dist/arr.cjs.map +1 -1
- package/dist/arr.js +27 -27
- package/dist/arr.js.map +1 -1
- package/dist/audio.cjs +274 -274
- package/dist/audio.cjs.map +1 -1
- package/dist/audio.js +274 -274
- package/dist/audio.js.map +1 -1
- package/dist/browser.cjs +52 -52
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +52 -52
- package/dist/browser.js.map +1 -1
- package/dist/common.cjs +369 -369
- package/dist/common.cjs.map +1 -1
- package/dist/common.js +369 -369
- package/dist/common.js.map +1 -1
- package/dist/date.cjs +421 -188
- package/dist/date.cjs.map +1 -1
- package/dist/date.js +414 -185
- package/dist/date.js.map +1 -1
- package/dist/download.cjs +102 -102
- package/dist/download.cjs.map +1 -1
- package/dist/download.js +102 -102
- package/dist/download.js.map +1 -1
- package/dist/evt.cjs +148 -148
- package/dist/evt.cjs.map +1 -1
- package/dist/evt.js +148 -148
- package/dist/evt.js.map +1 -1
- package/dist/id.cjs +68 -68
- package/dist/id.cjs.map +1 -1
- package/dist/id.js +68 -68
- package/dist/id.js.map +1 -1
- package/dist/timer.cjs +51 -50
- package/dist/timer.cjs.map +1 -1
- package/dist/timer.js +51 -50
- package/dist/timer.js.map +1 -1
- package/dist/tree.cjs +165 -165
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +165 -165
- package/dist/tree.js.map +1 -1
- package/dist/webSocket.cjs +403 -403
- package/dist/webSocket.cjs.map +1 -1
- package/dist/webSocket.js +403 -403
- package/dist/webSocket.js.map +1 -1
- package/package.json +1 -1
- package/readme.txt +21 -11
- package/types/date.d.ts +243 -45
- package/types/index.d.ts +244 -47
package/dist/webSocket.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webSocket.cjs","sources":["../src/source/webSocket.js"],"sourcesContent":["/**\n * @class WebSocketManager - 一个纯粹、强大的 WebSocket 连接管理引擎\n *\n * @features\n * - 智能断线重连 (指数退避算法)\n * - 网络状态监听\n * - 高度可定制的心跳保活机制 (通过注入函数实现)\n * - 页面可见性 API 集成\n * - 消息发送队列\n * - 清晰的生命周期管理\n * - 优雅的资源销毁\n * - 可配置的数据序列化/反序列化\n * - 纯粹的消息传递,不关心消息内容\n */\nexport class WebSocketManager {\n /**\n * @param {string} url - WebSocket 服务器的地址\n * @param {object} [options={}] - 配置选项\n * @param {number} [options.heartbeatInterval=30000] - 心跳间隔 (毫秒)\n * @param {number} [options.heartbeatTimeout=10000] - 心跳超时时间 (毫秒)\n * @param {number} [options.reconnectBaseInterval=1000] - 重连基础间隔 (毫秒)\n * @param {number} [options.maxReconnectInterval=30000] - 最大重连间隔 (毫秒)\n * @param {number} [options.maxReconnectAttempts=Infinity] - 最大重连次数\n * @param {boolean} [options.autoConnect=true] - 是否在实例化后自动连接\n * @param {boolean} [options.serializeData=false] - 发送数据时是否自动序列化为JSON字符串\n * @param {boolean} [options.deserializeData=false] - 接收数据时是否自动反序列化为JSON对象\n * @param {function|null} [options.getPingMessage=null] - 返回要发送的 ping 消息内容的函数。如果为 null,则不发送心跳。\n * @param {function|null} [options.isPongMessage=null] - 判断接收到的消息是否为 pong 的函数。接收 MessageEvent 对象作为参数,返回布尔值。\n * @param {object} [options.protocols] - WebSocket 协议\n */\n constructor(url, options = {}) {\n this.url = url;\n\n // 默认的心跳实现,用于向后兼容\n const defaultGetPingMessage = () => JSON.stringify({ type: \"ping\" });\n const defaultIsPongMessage = (event) => {\n try {\n const message = JSON.parse(event.data);\n return message.type === \"pong\";\n } catch (e) {\n return false;\n }\n };\n\n this.options = {\n heartbeatInterval: 30000,\n heartbeatTimeout: 10000,\n reconnectBaseInterval: 1000,\n maxReconnectInterval: 30000,\n maxReconnectAttempts: Infinity,\n autoConnect: true,\n serializeData: false,\n deserializeData: false,\n getPingMessage: defaultGetPingMessage, // 默认提供 ping 消息生成器\n isPongMessage: defaultIsPongMessage, // 默认提供 pong 消息判断器\n ...options\n };\n\n // WebSocket 实例\n this.ws = null;\n\n // 状态管理\n this.readyState = WebSocket.CLOSED;\n this.reconnectAttempts = 0;\n this.forcedClose = false;\n this.isReconnecting = false;\n\n // 定时器\n this.heartbeatTimer = null;\n this.heartbeatTimeoutTimer = null;\n this.reconnectTimer = null;\n\n // 消息队列\n this.messageQueue = [];\n\n // 事件监听器\n this.listeners = new Map();\n\n // 绑定方法上下文\n this._onOpen = this._onOpen.bind(this);\n this._onMessage = this._onMessage.bind(this);\n this._onClose = this._onClose.bind(this);\n this._onError = this._onError.bind(this);\n this._handleVisibilityChange = this._handleVisibilityChange.bind(this);\n this._handleOnline = this._handleOnline.bind(this);\n this._handleOffline = this._handleOffline.bind(this);\n\n this._setupEventListeners();\n\n if (this.options.autoConnect) {\n this.connect();\n }\n }\n\n // --- 公共 API ---\n\n /**\n * 连接到 WebSocket 服务器\n */\n connect() {\n if (this.ws && (this.ws.readyState === WebSocket.CONNECTING || this.ws.readyState === WebSocket.OPEN)) {\n return;\n }\n\n this.forcedClose = false;\n this._updateReadyState(WebSocket.CONNECTING);\n console.log(`[WS] 正在连接到 ${this.url}...`);\n this._emit(\"connecting\");\n\n try {\n this.ws = new WebSocket(this.url, this.options.protocols);\n this.ws.onopen = this._onOpen;\n this.ws.onmessage = this._onMessage;\n this.ws.onclose = this._onClose;\n this.ws.onerror = this._onError;\n } catch (error) {\n console.error(\"[WS] 连接失败:\", error);\n this._onError(error);\n }\n }\n\n /**\n * 发送数据\n * @param {string|object|ArrayBuffer|Blob} data - 要发送的数据\n */\n send(data) {\n if (this.readyState === WebSocket.OPEN) {\n let message;\n // 根据配置决定是否序列化数据\n if (this.options.serializeData) {\n message = JSON.stringify(data);\n } else {\n message = data;\n }\n this.ws.send(message);\n console.log(\"[WS] 消息已发送:\", message);\n } else {\n console.warn(\"[WS] 连接未打开,消息已加入队列:\", data);\n this.messageQueue.push(data);\n }\n }\n\n /**\n * 主动关闭连接\n * @param {number} [code=1000] - 关闭代码\n * @param {string} [reason=''] - 关闭原因\n */\n close(code = 1000, reason = \"Normal closure\") {\n this.forcedClose = true;\n this._stopHeartbeat();\n this._clearReconnectTimer();\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(code, reason);\n } else {\n this._updateReadyState(WebSocket.CLOSED);\n this._emit(\"close\", { code, reason, wasClean: true });\n }\n }\n\n /**\n * 彻底销毁实例,清理所有资源\n */\n destroy() {\n console.log(\"[WS] 正在销毁实例...\");\n this.close(1000, \"Instance destroyed\");\n this._removeEventListeners();\n this.messageQueue = [];\n this.listeners.clear();\n this.ws = null;\n }\n\n /**\n * 添加事件监听器\n * @param {string} eventName - 事件名 (e.g., 'open', 'message', 'close', 'error', 'reconnect')\n * @param {function} callback - 回调函数\n */\n on(eventName, callback) {\n if (!this.listeners.has(eventName)) {\n this.listeners.set(eventName, []);\n }\n this.listeners.get(eventName).push(callback);\n }\n\n /**\n * 移除事件监听器\n * @param {string} eventName - 事件名\n * @param {function} callback - 回调函数\n */\n off(eventName, callback) {\n if (this.listeners.has(eventName)) {\n const callbacks = this.listeners.get(eventName);\n const index = callbacks.indexOf(callback);\n if (index > -1) {\n callbacks.splice(index, 1);\n }\n }\n }\n\n // --- 内部方法 ---\n\n _onOpen(event) {\n console.log(\"[WS] 连接已建立\");\n this._updateReadyState(WebSocket.OPEN);\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n\n // 如果配置了 getPingMessage,则启动心跳\n if (this.options.getPingMessage) {\n this._startHeartbeat();\n }\n\n this._flushMessageQueue();\n this._emit(\"open\", event);\n }\n\n /**\n * 纯粹的消息处理方法:处理心跳,然后将数据交给使用者\n * @param {MessageEvent} event\n */\n _onMessage(event) {\n // --- 步骤 1: 使用注入的函数优先处理内部心跳机制 ---\n if (this.options.isPongMessage && this.options.isPongMessage(event)) {\n this._handlePong();\n return; // 是心跳消息,处理完毕,直接返回\n }\n\n // --- 步骤 2: 根据用户配置处理业务消息 ---\n if (this.options.deserializeData) {\n try {\n const parsedMessage = JSON.parse(event.data);\n this._emit(\"message\", parsedMessage, event);\n } catch (e) {\n this._emit(\"message\", event.data, event);\n }\n } else {\n this._emit(\"message\", event.data, event);\n }\n }\n\n _onClose(event) {\n console.log(\"[WS] 连接已关闭\", event);\n this._updateReadyState(WebSocket.CLOSED);\n this._stopHeartbeat();\n this._emit(\"close\", event);\n\n if (!this.forcedClose) {\n this._scheduleReconnect();\n }\n }\n\n _onError(event) {\n console.error(\"[WS] 连接发生错误:\", event);\n this._emit(\"error\", event);\n }\n\n // --- 心跳机制 ---\n _startHeartbeat() {\n // 如果没有配置 getPingMessage,则无法启动心跳\n if (!this.options.getPingMessage) {\n return;\n }\n\n this._stopHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n try {\n // 调用注入的函数获取消息内容并发送\n const pingMessage = this.options.getPingMessage();\n this.ws.send(pingMessage);\n console.log(\"[WS] 发送 Ping:\", pingMessage);\n this._setHeartbeatTimeout();\n } catch (error) {\n console.error(\"[WS] 发送 Ping 消息失败:\", error);\n }\n }\n }, this.options.heartbeatInterval);\n }\n\n _stopHeartbeat() {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n this._clearHeartbeatTimeout();\n }\n\n _setHeartbeatTimeout() {\n this._clearHeartbeatTimeout();\n this.heartbeatTimeoutTimer = setTimeout(() => {\n console.error(\"[WS] 心跳超时,主动断开连接\");\n this.ws.close(1006, \"Heartbeat timeout\");\n }, this.options.heartbeatTimeout);\n }\n\n _clearHeartbeatTimeout() {\n if (this.heartbeatTimeoutTimer) {\n clearTimeout(this.heartbeatTimeoutTimer);\n this.heartbeatTimeoutTimer = null;\n }\n }\n\n _handlePong() {\n console.log(\"[WS] 收到 Pong\");\n this._clearHeartbeatTimeout();\n }\n\n // --- 重连机制 ---\n _scheduleReconnect() {\n if (this.forcedClose || this.isReconnecting || this.reconnectAttempts >= this.options.maxReconnectAttempts) {\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {\n console.error(\"[WS] 已达到最大重连次数,停止重连\");\n this._emit(\"reconnect-failed\");\n }\n return;\n }\n\n this.isReconnecting = true;\n const interval = Math.min(this.options.reconnectBaseInterval * Math.pow(2, this.reconnectAttempts), this.options.maxReconnectInterval);\n\n console.log(`[WS] ${interval / 1000}秒后将尝试第 ${this.reconnectAttempts + 1} 次重连...`);\n this._emit(\"reconnect-attempt\", { attempt: this.reconnectAttempts + 1, interval });\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectAttempts++;\n this.connect();\n }, interval);\n }\n\n _clearReconnectTimer() {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n // --- 消息队列 ---\n _flushMessageQueue() {\n if (this.messageQueue.length === 0) return;\n console.log(`[WS] 发送队列中的 ${this.messageQueue.length} 条消息`);\n const queue = [...this.messageQueue];\n this.messageQueue = [];\n queue.forEach((data) => this.send(data));\n }\n\n // --- 事件系统 ---\n _emit(eventName, ...args) {\n if (this.listeners.has(eventName)) {\n this.listeners.get(eventName).forEach((callback) => callback(...args));\n }\n }\n\n // --- 状态与监听器管理 ---\n _updateReadyState(newState) {\n this.readyState = newState;\n this._emit(\"ready-state-change\", newState);\n }\n\n _setupEventListeners() {\n document.addEventListener(\"visibilitychange\", this._handleVisibilityChange);\n window.addEventListener(\"online\", this._handleOnline);\n window.addEventListener(\"offline\", this._handleOffline);\n }\n\n _removeEventListeners() {\n document.removeEventListener(\"visibilitychange\", this._handleVisibilityChange);\n window.removeEventListener(\"online\", this._handleOnline);\n window.removeEventListener(\"offline\", this._handleOffline);\n }\n\n _handleVisibilityChange() {\n // 如果未启用心跳,不需要处理页面可见性变化\n if (!this.options.getPingMessage) {\n return;\n }\n\n if (document.hidden) {\n console.log(\"[WS] 页面隐藏,停止心跳\");\n this._stopHeartbeat();\n } else {\n console.log(\"[WS] 页面可见,检查连接状态\");\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this._startHeartbeat();\n } else if (!this.forcedClose && !this.isReconnecting) {\n this.connect();\n }\n }\n }\n\n _handleOnline() {\n console.log(\"[WS] 网络已恢复,尝试重连\");\n if (!this.forcedClose && this.readyState !== WebSocket.OPEN) {\n this._clearReconnectTimer(); // 清除当前的重连计划\n this.connect(); // 立即尝试连接\n }\n }\n\n _handleOffline() {\n console.log(\"[WS] 网络已断开\");\n this._clearReconnectTimer(); // 停止重连尝试\n // ws.onclose 会被触发,从而启动重连逻辑,但我们已经停止了\n // 所以这里可以手动触发一次 close 事件来通知应用层\n if (this.ws) this.ws.onclose({ code: 1006, reason: \"Network offline\" });\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webSocket.cjs","sources":["../src/source/webSocket.js"],"sourcesContent":["/**\r\n * @class WebSocketManager - 一个纯粹、强大的 WebSocket 连接管理引擎\r\n *\r\n * @features\r\n * - 智能断线重连 (指数退避算法)\r\n * - 网络状态监听\r\n * - 高度可定制的心跳保活机制 (通过注入函数实现)\r\n * - 页面可见性 API 集成\r\n * - 消息发送队列\r\n * - 清晰的生命周期管理\r\n * - 优雅的资源销毁\r\n * - 可配置的数据序列化/反序列化\r\n * - 纯粹的消息传递,不关心消息内容\r\n */\r\nexport class WebSocketManager {\r\n /**\r\n * @param {string} url - WebSocket 服务器的地址\r\n * @param {object} [options={}] - 配置选项\r\n * @param {number} [options.heartbeatInterval=30000] - 心跳间隔 (毫秒)\r\n * @param {number} [options.heartbeatTimeout=10000] - 心跳超时时间 (毫秒)\r\n * @param {number} [options.reconnectBaseInterval=1000] - 重连基础间隔 (毫秒)\r\n * @param {number} [options.maxReconnectInterval=30000] - 最大重连间隔 (毫秒)\r\n * @param {number} [options.maxReconnectAttempts=Infinity] - 最大重连次数\r\n * @param {boolean} [options.autoConnect=true] - 是否在实例化后自动连接\r\n * @param {boolean} [options.serializeData=false] - 发送数据时是否自动序列化为JSON字符串\r\n * @param {boolean} [options.deserializeData=false] - 接收数据时是否自动反序列化为JSON对象\r\n * @param {function|null} [options.getPingMessage=null] - 返回要发送的 ping 消息内容的函数。如果为 null,则不发送心跳。\r\n * @param {function|null} [options.isPongMessage=null] - 判断接收到的消息是否为 pong 的函数。接收 MessageEvent 对象作为参数,返回布尔值。\r\n * @param {object} [options.protocols] - WebSocket 协议\r\n */\r\n constructor(url, options = {}) {\r\n this.url = url;\r\n\r\n // 默认的心跳实现,用于向后兼容\r\n const defaultGetPingMessage = () => JSON.stringify({ type: \"ping\" });\r\n const defaultIsPongMessage = (event) => {\r\n try {\r\n const message = JSON.parse(event.data);\r\n return message.type === \"pong\";\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n this.options = {\r\n heartbeatInterval: 30000,\r\n heartbeatTimeout: 10000,\r\n reconnectBaseInterval: 1000,\r\n maxReconnectInterval: 30000,\r\n maxReconnectAttempts: Infinity,\r\n autoConnect: true,\r\n serializeData: false,\r\n deserializeData: false,\r\n getPingMessage: defaultGetPingMessage, // 默认提供 ping 消息生成器\r\n isPongMessage: defaultIsPongMessage, // 默认提供 pong 消息判断器\r\n ...options\r\n };\r\n\r\n // WebSocket 实例\r\n this.ws = null;\r\n\r\n // 状态管理\r\n this.readyState = WebSocket.CLOSED;\r\n this.reconnectAttempts = 0;\r\n this.forcedClose = false;\r\n this.isReconnecting = false;\r\n\r\n // 定时器\r\n this.heartbeatTimer = null;\r\n this.heartbeatTimeoutTimer = null;\r\n this.reconnectTimer = null;\r\n\r\n // 消息队列\r\n this.messageQueue = [];\r\n\r\n // 事件监听器\r\n this.listeners = new Map();\r\n\r\n // 绑定方法上下文\r\n this._onOpen = this._onOpen.bind(this);\r\n this._onMessage = this._onMessage.bind(this);\r\n this._onClose = this._onClose.bind(this);\r\n this._onError = this._onError.bind(this);\r\n this._handleVisibilityChange = this._handleVisibilityChange.bind(this);\r\n this._handleOnline = this._handleOnline.bind(this);\r\n this._handleOffline = this._handleOffline.bind(this);\r\n\r\n this._setupEventListeners();\r\n\r\n if (this.options.autoConnect) {\r\n this.connect();\r\n }\r\n }\r\n\r\n // --- 公共 API ---\r\n\r\n /**\r\n * 连接到 WebSocket 服务器\r\n */\r\n connect() {\r\n if (this.ws && (this.ws.readyState === WebSocket.CONNECTING || this.ws.readyState === WebSocket.OPEN)) {\r\n return;\r\n }\r\n\r\n this.forcedClose = false;\r\n this._updateReadyState(WebSocket.CONNECTING);\r\n console.log(`[WS] 正在连接到 ${this.url}...`);\r\n this._emit(\"connecting\");\r\n\r\n try {\r\n this.ws = new WebSocket(this.url, this.options.protocols);\r\n this.ws.onopen = this._onOpen;\r\n this.ws.onmessage = this._onMessage;\r\n this.ws.onclose = this._onClose;\r\n this.ws.onerror = this._onError;\r\n } catch (error) {\r\n console.error(\"[WS] 连接失败:\", error);\r\n this._onError(error);\r\n }\r\n }\r\n\r\n /**\r\n * 发送数据\r\n * @param {string|object|ArrayBuffer|Blob} data - 要发送的数据\r\n */\r\n send(data) {\r\n if (this.readyState === WebSocket.OPEN) {\r\n let message;\r\n // 根据配置决定是否序列化数据\r\n if (this.options.serializeData) {\r\n message = JSON.stringify(data);\r\n } else {\r\n message = data;\r\n }\r\n this.ws.send(message);\r\n console.log(\"[WS] 消息已发送:\", message);\r\n } else {\r\n console.warn(\"[WS] 连接未打开,消息已加入队列:\", data);\r\n this.messageQueue.push(data);\r\n }\r\n }\r\n\r\n /**\r\n * 主动关闭连接\r\n * @param {number} [code=1000] - 关闭代码\r\n * @param {string} [reason=''] - 关闭原因\r\n */\r\n close(code = 1000, reason = \"Normal closure\") {\r\n this.forcedClose = true;\r\n this._stopHeartbeat();\r\n this._clearReconnectTimer();\r\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\r\n this.ws.close(code, reason);\r\n } else {\r\n this._updateReadyState(WebSocket.CLOSED);\r\n this._emit(\"close\", { code, reason, wasClean: true });\r\n }\r\n }\r\n\r\n /**\r\n * 彻底销毁实例,清理所有资源\r\n */\r\n destroy() {\r\n console.log(\"[WS] 正在销毁实例...\");\r\n this.close(1000, \"Instance destroyed\");\r\n this._removeEventListeners();\r\n this.messageQueue = [];\r\n this.listeners.clear();\r\n this.ws = null;\r\n }\r\n\r\n /**\r\n * 添加事件监听器\r\n * @param {string} eventName - 事件名 (e.g., 'open', 'message', 'close', 'error', 'reconnect')\r\n * @param {function} callback - 回调函数\r\n */\r\n on(eventName, callback) {\r\n if (!this.listeners.has(eventName)) {\r\n this.listeners.set(eventName, []);\r\n }\r\n this.listeners.get(eventName).push(callback);\r\n }\r\n\r\n /**\r\n * 移除事件监听器\r\n * @param {string} eventName - 事件名\r\n * @param {function} callback - 回调函数\r\n */\r\n off(eventName, callback) {\r\n if (this.listeners.has(eventName)) {\r\n const callbacks = this.listeners.get(eventName);\r\n const index = callbacks.indexOf(callback);\r\n if (index > -1) {\r\n callbacks.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n // --- 内部方法 ---\r\n\r\n _onOpen(event) {\r\n console.log(\"[WS] 连接已建立\");\r\n this._updateReadyState(WebSocket.OPEN);\r\n this.reconnectAttempts = 0;\r\n this.isReconnecting = false;\r\n\r\n // 如果配置了 getPingMessage,则启动心跳\r\n if (this.options.getPingMessage) {\r\n this._startHeartbeat();\r\n }\r\n\r\n this._flushMessageQueue();\r\n this._emit(\"open\", event);\r\n }\r\n\r\n /**\r\n * 纯粹的消息处理方法:处理心跳,然后将数据交给使用者\r\n * @param {MessageEvent} event\r\n */\r\n _onMessage(event) {\r\n // --- 步骤 1: 使用注入的函数优先处理内部心跳机制 ---\r\n if (this.options.isPongMessage && this.options.isPongMessage(event)) {\r\n this._handlePong();\r\n return; // 是心跳消息,处理完毕,直接返回\r\n }\r\n\r\n // --- 步骤 2: 根据用户配置处理业务消息 ---\r\n if (this.options.deserializeData) {\r\n try {\r\n const parsedMessage = JSON.parse(event.data);\r\n this._emit(\"message\", parsedMessage, event);\r\n } catch (e) {\r\n this._emit(\"message\", event.data, event);\r\n }\r\n } else {\r\n this._emit(\"message\", event.data, event);\r\n }\r\n }\r\n\r\n _onClose(event) {\r\n console.log(\"[WS] 连接已关闭\", event);\r\n this._updateReadyState(WebSocket.CLOSED);\r\n this._stopHeartbeat();\r\n this._emit(\"close\", event);\r\n\r\n if (!this.forcedClose) {\r\n this._scheduleReconnect();\r\n }\r\n }\r\n\r\n _onError(event) {\r\n console.error(\"[WS] 连接发生错误:\", event);\r\n this._emit(\"error\", event);\r\n }\r\n\r\n // --- 心跳机制 ---\r\n _startHeartbeat() {\r\n // 如果没有配置 getPingMessage,则无法启动心跳\r\n if (!this.options.getPingMessage) {\r\n return;\r\n }\r\n\r\n this._stopHeartbeat();\r\n this.heartbeatTimer = setInterval(() => {\r\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\r\n try {\r\n // 调用注入的函数获取消息内容并发送\r\n const pingMessage = this.options.getPingMessage();\r\n this.ws.send(pingMessage);\r\n console.log(\"[WS] 发送 Ping:\", pingMessage);\r\n this._setHeartbeatTimeout();\r\n } catch (error) {\r\n console.error(\"[WS] 发送 Ping 消息失败:\", error);\r\n }\r\n }\r\n }, this.options.heartbeatInterval);\r\n }\r\n\r\n _stopHeartbeat() {\r\n if (this.heartbeatTimer) {\r\n clearInterval(this.heartbeatTimer);\r\n this.heartbeatTimer = null;\r\n }\r\n this._clearHeartbeatTimeout();\r\n }\r\n\r\n _setHeartbeatTimeout() {\r\n this._clearHeartbeatTimeout();\r\n this.heartbeatTimeoutTimer = setTimeout(() => {\r\n console.error(\"[WS] 心跳超时,主动断开连接\");\r\n this.ws.close(1006, \"Heartbeat timeout\");\r\n }, this.options.heartbeatTimeout);\r\n }\r\n\r\n _clearHeartbeatTimeout() {\r\n if (this.heartbeatTimeoutTimer) {\r\n clearTimeout(this.heartbeatTimeoutTimer);\r\n this.heartbeatTimeoutTimer = null;\r\n }\r\n }\r\n\r\n _handlePong() {\r\n console.log(\"[WS] 收到 Pong\");\r\n this._clearHeartbeatTimeout();\r\n }\r\n\r\n // --- 重连机制 ---\r\n _scheduleReconnect() {\r\n if (this.forcedClose || this.isReconnecting || this.reconnectAttempts >= this.options.maxReconnectAttempts) {\r\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {\r\n console.error(\"[WS] 已达到最大重连次数,停止重连\");\r\n this._emit(\"reconnect-failed\");\r\n }\r\n return;\r\n }\r\n\r\n this.isReconnecting = true;\r\n const interval = Math.min(this.options.reconnectBaseInterval * Math.pow(2, this.reconnectAttempts), this.options.maxReconnectInterval);\r\n\r\n console.log(`[WS] ${interval / 1000}秒后将尝试第 ${this.reconnectAttempts + 1} 次重连...`);\r\n this._emit(\"reconnect-attempt\", { attempt: this.reconnectAttempts + 1, interval });\r\n\r\n this.reconnectTimer = setTimeout(() => {\r\n this.reconnectAttempts++;\r\n this.connect();\r\n }, interval);\r\n }\r\n\r\n _clearReconnectTimer() {\r\n if (this.reconnectTimer) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n }\r\n\r\n // --- 消息队列 ---\r\n _flushMessageQueue() {\r\n if (this.messageQueue.length === 0) return;\r\n console.log(`[WS] 发送队列中的 ${this.messageQueue.length} 条消息`);\r\n const queue = [...this.messageQueue];\r\n this.messageQueue = [];\r\n queue.forEach((data) => this.send(data));\r\n }\r\n\r\n // --- 事件系统 ---\r\n _emit(eventName, ...args) {\r\n if (this.listeners.has(eventName)) {\r\n this.listeners.get(eventName).forEach((callback) => callback(...args));\r\n }\r\n }\r\n\r\n // --- 状态与监听器管理 ---\r\n _updateReadyState(newState) {\r\n this.readyState = newState;\r\n this._emit(\"ready-state-change\", newState);\r\n }\r\n\r\n _setupEventListeners() {\r\n document.addEventListener(\"visibilitychange\", this._handleVisibilityChange);\r\n window.addEventListener(\"online\", this._handleOnline);\r\n window.addEventListener(\"offline\", this._handleOffline);\r\n }\r\n\r\n _removeEventListeners() {\r\n document.removeEventListener(\"visibilitychange\", this._handleVisibilityChange);\r\n window.removeEventListener(\"online\", this._handleOnline);\r\n window.removeEventListener(\"offline\", this._handleOffline);\r\n }\r\n\r\n _handleVisibilityChange() {\r\n // 如果未启用心跳,不需要处理页面可见性变化\r\n if (!this.options.getPingMessage) {\r\n return;\r\n }\r\n\r\n if (document.hidden) {\r\n console.log(\"[WS] 页面隐藏,停止心跳\");\r\n this._stopHeartbeat();\r\n } else {\r\n console.log(\"[WS] 页面可见,检查连接状态\");\r\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\r\n this._startHeartbeat();\r\n } else if (!this.forcedClose && !this.isReconnecting) {\r\n this.connect();\r\n }\r\n }\r\n }\r\n\r\n _handleOnline() {\r\n console.log(\"[WS] 网络已恢复,尝试重连\");\r\n if (!this.forcedClose && this.readyState !== WebSocket.OPEN) {\r\n this._clearReconnectTimer(); // 清除当前的重连计划\r\n this.connect(); // 立即尝试连接\r\n }\r\n }\r\n\r\n _handleOffline() {\r\n console.log(\"[WS] 网络已断开\");\r\n this._clearReconnectTimer(); // 停止重连尝试\r\n // ws.onclose 会被触发,从而启动重连逻辑,但我们已经停止了\r\n // 所以这里可以手动触发一次 close 事件来通知应用层\r\n if (this.ws) this.ws.onclose({ code: 1006, reason: \"Network offline\" });\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|