a2bei4-utils 1.0.1 → 1.0.2
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/dist/a2bei4.utils.cjs.js +8 -8
- 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 +8 -8
- 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 +8 -8
- 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/webSocket.cjs +8 -8
- package/dist/webSocket.cjs.map +1 -1
- package/dist/webSocket.js +8 -8
- package/dist/webSocket.js.map +1 -1
- package/package.json +2 -1
- package/readme.txt +1 -1
- package/types/index.d.ts +4 -4
- package/types/webSocket.d.ts +3 -3
package/dist/webSocket.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @class WebSocketManager -
|
|
4
|
+
* @class WebSocketManager - 一个纯粹、强大的 WebSocket 连接管理引擎
|
|
5
5
|
*
|
|
6
6
|
* @features
|
|
7
7
|
* - 智能断线重连 (指数退避算法)
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
* - 高度可定制的心跳保活机制 (通过注入函数实现)
|
|
10
10
|
* - 页面可见性 API 集成
|
|
11
11
|
* - 消息发送队列
|
|
12
|
-
* - 事件驱动的消息分发
|
|
13
12
|
* - 清晰的生命周期管理
|
|
14
13
|
* - 优雅的资源销毁
|
|
15
14
|
* - 可配置的数据序列化/反序列化
|
|
15
|
+
* - 纯粹的消息传递,不关心消息内容
|
|
16
16
|
*/
|
|
17
17
|
class WebSocketManager {
|
|
18
18
|
/**
|
|
@@ -216,7 +216,7 @@ class WebSocketManager {
|
|
|
216
216
|
}
|
|
217
217
|
|
|
218
218
|
/**
|
|
219
|
-
*
|
|
219
|
+
* 纯粹的消息处理方法:处理心跳,然后将数据交给使用者
|
|
220
220
|
* @param {MessageEvent} event
|
|
221
221
|
*/
|
|
222
222
|
_onMessage(event) {
|
|
@@ -230,12 +230,12 @@ class WebSocketManager {
|
|
|
230
230
|
if (this.options.deserializeData) {
|
|
231
231
|
try {
|
|
232
232
|
const parsedMessage = JSON.parse(event.data);
|
|
233
|
-
this._emit("message", parsedMessage);
|
|
233
|
+
this._emit("message", parsedMessage, event);
|
|
234
234
|
} catch (e) {
|
|
235
|
-
this._emit("message", event.data);
|
|
235
|
+
this._emit("message", event.data, event);
|
|
236
236
|
}
|
|
237
237
|
} else {
|
|
238
|
-
this._emit("message", event.data);
|
|
238
|
+
this._emit("message", event.data, event);
|
|
239
239
|
}
|
|
240
240
|
}
|
|
241
241
|
|
|
@@ -255,7 +255,7 @@ class WebSocketManager {
|
|
|
255
255
|
this._emit("error", event);
|
|
256
256
|
}
|
|
257
257
|
|
|
258
|
-
// --- 心跳机制
|
|
258
|
+
// --- 心跳机制 ---
|
|
259
259
|
_startHeartbeat() {
|
|
260
260
|
// 如果没有配置 getPingMessage,则无法启动心跳
|
|
261
261
|
if (!this.options.getPingMessage) {
|
|
@@ -371,7 +371,7 @@ class WebSocketManager {
|
|
|
371
371
|
|
|
372
372
|
_handleVisibilityChange() {
|
|
373
373
|
// 如果未启用心跳,不需要处理页面可见性变化
|
|
374
|
-
if (!this.options.
|
|
374
|
+
if (!this.options.getPingMessage) {
|
|
375
375
|
return;
|
|
376
376
|
}
|
|
377
377
|
|
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);\n } catch (e) {\n this._emit(\"message\", event.data);\n }\n } else {\n this._emit(\"message\", event.data);\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.enableHeartbeat) {\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":["/**\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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"}
|
package/dist/webSocket.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @class WebSocketManager -
|
|
2
|
+
* @class WebSocketManager - 一个纯粹、强大的 WebSocket 连接管理引擎
|
|
3
3
|
*
|
|
4
4
|
* @features
|
|
5
5
|
* - 智能断线重连 (指数退避算法)
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
* - 高度可定制的心跳保活机制 (通过注入函数实现)
|
|
8
8
|
* - 页面可见性 API 集成
|
|
9
9
|
* - 消息发送队列
|
|
10
|
-
* - 事件驱动的消息分发
|
|
11
10
|
* - 清晰的生命周期管理
|
|
12
11
|
* - 优雅的资源销毁
|
|
13
12
|
* - 可配置的数据序列化/反序列化
|
|
13
|
+
* - 纯粹的消息传递,不关心消息内容
|
|
14
14
|
*/
|
|
15
15
|
class WebSocketManager {
|
|
16
16
|
/**
|
|
@@ -214,7 +214,7 @@ class WebSocketManager {
|
|
|
214
214
|
}
|
|
215
215
|
|
|
216
216
|
/**
|
|
217
|
-
*
|
|
217
|
+
* 纯粹的消息处理方法:处理心跳,然后将数据交给使用者
|
|
218
218
|
* @param {MessageEvent} event
|
|
219
219
|
*/
|
|
220
220
|
_onMessage(event) {
|
|
@@ -228,12 +228,12 @@ class WebSocketManager {
|
|
|
228
228
|
if (this.options.deserializeData) {
|
|
229
229
|
try {
|
|
230
230
|
const parsedMessage = JSON.parse(event.data);
|
|
231
|
-
this._emit("message", parsedMessage);
|
|
231
|
+
this._emit("message", parsedMessage, event);
|
|
232
232
|
} catch (e) {
|
|
233
|
-
this._emit("message", event.data);
|
|
233
|
+
this._emit("message", event.data, event);
|
|
234
234
|
}
|
|
235
235
|
} else {
|
|
236
|
-
this._emit("message", event.data);
|
|
236
|
+
this._emit("message", event.data, event);
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
239
|
|
|
@@ -253,7 +253,7 @@ class WebSocketManager {
|
|
|
253
253
|
this._emit("error", event);
|
|
254
254
|
}
|
|
255
255
|
|
|
256
|
-
// --- 心跳机制
|
|
256
|
+
// --- 心跳机制 ---
|
|
257
257
|
_startHeartbeat() {
|
|
258
258
|
// 如果没有配置 getPingMessage,则无法启动心跳
|
|
259
259
|
if (!this.options.getPingMessage) {
|
|
@@ -369,7 +369,7 @@ class WebSocketManager {
|
|
|
369
369
|
|
|
370
370
|
_handleVisibilityChange() {
|
|
371
371
|
// 如果未启用心跳,不需要处理页面可见性变化
|
|
372
|
-
if (!this.options.
|
|
372
|
+
if (!this.options.getPingMessage) {
|
|
373
373
|
return;
|
|
374
374
|
}
|
|
375
375
|
|
package/dist/webSocket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webSocket.js","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);\n } catch (e) {\n this._emit(\"message\", event.data);\n }\n } else {\n this._emit(\"message\", event.data);\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.enableHeartbeat) {\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.js","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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "a2bei4-utils",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "🧰 零依赖、ESM 的 JS 业务工具箱:数组乱序/深浅克隆、防抖节流、URL/query 解析、Date/时长格式化、随机汉字/字母、文件下载、事件总线、UUID/分布式短 ID、树结构互转等 40+ 常用函数 & 类,Tree-Shaking 友好。",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -145,6 +145,7 @@
|
|
|
145
145
|
"typescript": "^5.9.3"
|
|
146
146
|
},
|
|
147
147
|
"scripts": {
|
|
148
|
+
"clean:pack": "node scripts/clean-pack-generate.js",
|
|
148
149
|
"update:package": "node scripts/update-package.js",
|
|
149
150
|
"generate:entry": "node scripts/generate-entry.js",
|
|
150
151
|
"generate:index": "node scripts/generate-index.js",
|
package/readme.txt
CHANGED
package/types/index.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ declare class IntervalTimer {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
* @class WebSocketManager -
|
|
33
|
+
* @class WebSocketManager - 一个纯粹、强大的 WebSocket 连接管理引擎
|
|
34
34
|
*
|
|
35
35
|
* @features
|
|
36
36
|
* - 智能断线重连 (指数退避算法)
|
|
@@ -38,10 +38,10 @@ declare class IntervalTimer {
|
|
|
38
38
|
* - 高度可定制的心跳保活机制 (通过注入函数实现)
|
|
39
39
|
* - 页面可见性 API 集成
|
|
40
40
|
* - 消息发送队列
|
|
41
|
-
* - 事件驱动的消息分发
|
|
42
41
|
* - 清晰的生命周期管理
|
|
43
42
|
* - 优雅的资源销毁
|
|
44
43
|
* - 可配置的数据序列化/反序列化
|
|
44
|
+
* - 纯粹的消息传递,不关心消息内容
|
|
45
45
|
*/
|
|
46
46
|
declare class WebSocketManager {
|
|
47
47
|
/**
|
|
@@ -98,7 +98,7 @@ declare class WebSocketManager {
|
|
|
98
98
|
listeners: Map<any, any>;
|
|
99
99
|
_onOpen(event: any): void;
|
|
100
100
|
/**
|
|
101
|
-
*
|
|
101
|
+
* 纯粹的消息处理方法:处理心跳,然后将数据交给使用者
|
|
102
102
|
* @param {MessageEvent} event
|
|
103
103
|
*/
|
|
104
104
|
_onMessage(event: MessageEvent): void;
|
|
@@ -280,7 +280,7 @@ type ViewportDimensions = {
|
|
|
280
280
|
* @param {*} obj 待检测的值
|
|
281
281
|
* @returns {keyof globalThis|"blob"|"file"|"formdata"|string} 小写类型名
|
|
282
282
|
*/
|
|
283
|
-
declare function getDataType(obj: any): ("undefined" | "globalThis" | "eval" | "parseInt" | "parseFloat" | "isNaN" | "isFinite" | "decodeURI" | "decodeURIComponent" | "encodeURI" | "encodeURIComponent" | "escape" | "unescape" | "NaN" | "Infinity" | "Symbol" | "Object" | "Function" | "String" | "Boolean" | "Number" | "Math" | "Date" | "RegExp" | "Error" | "EvalError" | "RangeError" | "ReferenceError" | "SyntaxError" | "TypeError" | "URIError" | "JSON" | "Array" | "Promise" | "ArrayBuffer" | "DataView" | "Int8Array" | "Uint8Array" | "Uint8ClampedArray" | "Int16Array" | "Uint16Array" | "Int32Array" | "Uint32Array" | "Float32Array" | "Float64Array" | "Intl" | "alert" | "blur" | "cancelIdleCallback" | "captureEvents" | "close" | "confirm" | "focus" | "getComputedStyle" | "getSelection" | "matchMedia" | "moveBy" | "moveTo" | "open" | "postMessage" | "print" | "prompt" | "releaseEvents" | "requestIdleCallback" | "resizeBy" | "resizeTo" | "scroll" | "scrollBy" | "scrollTo" | "stop" | "toString" | "dispatchEvent" | "cancelAnimationFrame" | "requestAnimationFrame" | "atob" | "btoa" | "clearInterval" | "clearTimeout" | "createImageBitmap" | "fetch" | "queueMicrotask" | "reportError" | "setInterval" | "setTimeout" | "structuredClone" | "addEventListener" | "removeEventListener" | "NodeFilter" | "AbortController" | "AbortSignal" | "AbstractRange" | "AnalyserNode" | "Animation" | "AnimationEffect" | "AnimationEvent" | "AnimationPlaybackEvent" | "AnimationTimeline" | "Attr" | "AudioBuffer" | "AudioBufferSourceNode" | "AudioContext" | "AudioData" | "AudioDecoder" | "AudioDestinationNode" | "AudioEncoder" | "AudioListener" | "AudioNode" | "AudioParam" | "AudioParamMap" | "AudioProcessingEvent" | "AudioScheduledSourceNode" | "AudioWorklet" | "AudioWorkletNode" | "AuthenticatorAssertionResponse" | "AuthenticatorAttestationResponse" | "AuthenticatorResponse" | "BarProp" | "BaseAudioContext" | "BeforeUnloadEvent" | "BiquadFilterNode" | "Blob" | "BlobEvent" | "BroadcastChannel" | "ByteLengthQueuingStrategy" | "CDATASection" | "CSPViolationReportBody" | "CSSAnimation" | "CSSConditionRule" | "CSSContainerRule" | "CSSCounterStyleRule" | "CSSFontFaceRule" | "CSSFontFeatureValuesRule" | "CSSFontPaletteValuesRule" | "CSSGroupingRule" | "CSSImageValue" | "CSSImportRule" | "CSSKeyframeRule" | "CSSKeyframesRule" | "CSSKeywordValue" | "CSSLayerBlockRule" | "CSSLayerStatementRule" | "CSSMathClamp" | "CSSMathInvert" | "CSSMathMax" | "CSSMathMin" | "CSSMathNegate" | "CSSMathProduct" | "CSSMathSum" | "CSSMathValue" | "CSSMatrixComponent" | "CSSMediaRule" | "CSSNamespaceRule" | "CSSNestedDeclarations" | "CSSNumericArray" | "CSSNumericValue" | "CSSPageRule" | "CSSPerspective" | "CSSPropertyRule" | "CSSRotate" | "CSSRule" | "CSSRuleList" | "CSSScale" | "CSSScopeRule" | "CSSSkew" | "CSSSkewX" | "CSSSkewY" | "CSSStartingStyleRule" | "CSSStyleDeclaration" | "CSSStyleRule" | "CSSStyleSheet" | "CSSStyleValue" | "CSSSupportsRule" | "CSSTransformComponent" | "CSSTransformValue" | "CSSTransition" | "CSSTranslate" | "CSSUnitValue" | "CSSUnparsedValue" | "CSSVariableReferenceValue" | "CSSViewTransitionRule" | "Cache" | "CacheStorage" | "CanvasCaptureMediaStreamTrack" | "CanvasGradient" | "CanvasPattern" | "CanvasRenderingContext2D" | "CaretPosition" | "ChannelMergerNode" | "ChannelSplitterNode" | "CharacterData" | "Clipboard" | "ClipboardEvent" | "ClipboardItem" | "CloseEvent" | "Comment" | "CompositionEvent" | "CompressionStream" | "ConstantSourceNode" | "ContentVisibilityAutoStateChangeEvent" | "ConvolverNode" | "CookieChangeEvent" | "CookieStore" | "CookieStoreManager" | "CountQueuingStrategy" | "Credential" | "CredentialsContainer" | "Crypto" | "CryptoKey" | "CustomElementRegistry" | "CustomEvent" | "CustomStateSet" | "DOMException" | "DOMImplementation" | "DOMMatrix" | "SVGMatrix" | "WebKitCSSMatrix" | "DOMMatrixReadOnly" | "DOMParser" | "DOMPoint" | "SVGPoint" | "DOMPointReadOnly" | "DOMQuad" | "DOMRect" | "SVGRect" | "DOMRectList" | "DOMRectReadOnly" | "DOMStringList" | "DOMStringMap" | "DOMTokenList" | "DataTransfer" | "DataTransferItem" | "DataTransferItemList" | "DecompressionStream" | "DelayNode" | "DeviceMotionEvent" | "DeviceOrientationEvent" | "Document" | "DocumentFragment" | "DocumentTimeline" | "DocumentType" | "DragEvent" | "DynamicsCompressorNode" | "Element" | "ElementInternals" | "EncodedAudioChunk" | "EncodedVideoChunk" | "ErrorEvent" | "Event" | "EventCounts" | "EventSource" | "EventTarget" | "External" | "File" | "FileList" | "FileReader" | "FileSystem" | "FileSystemDirectoryEntry" | "FileSystemDirectoryHandle" | "FileSystemDirectoryReader" | "FileSystemEntry" | "FileSystemFileEntry" | "FileSystemFileHandle" | "FileSystemHandle" | "FileSystemWritableFileStream" | "FocusEvent" | "FontFace" | "FontFaceSet" | "FontFaceSetLoadEvent" | "FormData" | "FormDataEvent" | "FragmentDirective" | "GainNode" | "Gamepad" | "GamepadButton" | "GamepadEvent" | "GamepadHapticActuator" | "Geolocation" | "GeolocationCoordinates" | "GeolocationPosition" | "GeolocationPositionError" | "HTMLAllCollection" | "HTMLAnchorElement" | "HTMLAreaElement" | "HTMLAudioElement" | "HTMLBRElement" | "HTMLBaseElement" | "HTMLBodyElement" | "HTMLButtonElement" | "HTMLCanvasElement" | "HTMLCollection" | "HTMLDListElement" | "HTMLDataElement" | "HTMLDataListElement" | "HTMLDetailsElement" | "HTMLDialogElement" | "HTMLDirectoryElement" | "HTMLDivElement" | "HTMLDocument" | "HTMLElement" | "HTMLEmbedElement" | "HTMLFieldSetElement" | "HTMLFontElement" | "HTMLFormControlsCollection" | "HTMLFormElement" | "HTMLFrameElement" | "HTMLFrameSetElement" | "HTMLHRElement" | "HTMLHeadElement" | "HTMLHeadingElement" | "HTMLHtmlElement" | "HTMLIFrameElement" | "HTMLImageElement" | "HTMLInputElement" | "HTMLLIElement" | "HTMLLabelElement" | "HTMLLegendElement" | "HTMLLinkElement" | "HTMLMapElement" | "HTMLMarqueeElement" | "HTMLMediaElement" | "HTMLMenuElement" | "HTMLMetaElement" | "HTMLMeterElement" | "HTMLModElement" | "HTMLOListElement" | "HTMLObjectElement" | "HTMLOptGroupElement" | "HTMLOptionElement" | "HTMLOptionsCollection" | "HTMLOutputElement" | "HTMLParagraphElement" | "HTMLParamElement" | "HTMLPictureElement" | "HTMLPreElement" | "HTMLProgressElement" | "HTMLQuoteElement" | "HTMLScriptElement" | "HTMLSelectElement" | "HTMLSlotElement" | "HTMLSourceElement" | "HTMLSpanElement" | "HTMLStyleElement" | "HTMLTableCaptionElement" | "HTMLTableCellElement" | "HTMLTableColElement" | "HTMLTableElement" | "HTMLTableRowElement" | "HTMLTableSectionElement" | "HTMLTemplateElement" | "HTMLTextAreaElement" | "HTMLTimeElement" | "HTMLTitleElement" | "HTMLTrackElement" | "HTMLUListElement" | "HTMLUnknownElement" | "HTMLVideoElement" | "HashChangeEvent" | "Headers" | "Highlight" | "HighlightRegistry" | "History" | "IDBCursor" | "IDBCursorWithValue" | "IDBDatabase" | "IDBFactory" | "IDBIndex" | "IDBKeyRange" | "IDBObjectStore" | "IDBOpenDBRequest" | "IDBRequest" | "IDBTransaction" | "IDBVersionChangeEvent" | "IIRFilterNode" | "IdleDeadline" | "ImageBitmap" | "ImageBitmapRenderingContext" | "ImageCapture" | "ImageData" | "ImageDecoder" | "ImageTrack" | "ImageTrackList" | "InputDeviceInfo" | "InputEvent" | "IntersectionObserver" | "IntersectionObserverEntry" | "KeyboardEvent" | "KeyframeEffect" | "LargestContentfulPaint" | "Location" | "Lock" | "LockManager" | "MIDIAccess" | "MIDIConnectionEvent" | "MIDIInput" | "MIDIInputMap" | "MIDIMessageEvent" | "MIDIOutput" | "MIDIOutputMap" | "MIDIPort" | "MathMLElement" | "MediaCapabilities" | "MediaDeviceInfo" | "MediaDevices" | "MediaElementAudioSourceNode" | "MediaEncryptedEvent" | "MediaError" | "MediaKeyMessageEvent" | "MediaKeySession" | "MediaKeyStatusMap" | "MediaKeySystemAccess" | "MediaKeys" | "MediaList" | "MediaMetadata" | "MediaQueryList" | "MediaQueryListEvent" | "MediaRecorder" | "MediaSession" | "MediaSource" | "MediaSourceHandle" | "MediaStream" | "MediaStreamAudioDestinationNode" | "MediaStreamAudioSourceNode" | "MediaStreamTrack" | "MediaStreamTrackEvent" | "MessageChannel" | "MessageEvent" | "MessagePort" | "MimeType" | "MimeTypeArray" | "MouseEvent" | "MutationObserver" | "MutationRecord" | "NamedNodeMap" | "NavigationActivation" | "NavigationHistoryEntry" | "NavigationPreloadManager" | "Navigator" | "NavigatorLogin" | "Node" | "NodeIterator" | "NodeList" | "Notification" | "OfflineAudioCompletionEvent" | "OfflineAudioContext" | "OffscreenCanvas" | "OffscreenCanvasRenderingContext2D" | "OscillatorNode" | "OverconstrainedError" | "PageRevealEvent" | "PageSwapEvent" | "PageTransitionEvent" | "PannerNode" | "Path2D" | "PaymentAddress" | "PaymentMethodChangeEvent" | "PaymentRequest" | "PaymentRequestUpdateEvent" | "PaymentResponse" | "Performance" | "PerformanceEntry" | "PerformanceEventTiming" | "PerformanceMark" | "PerformanceMeasure" | "PerformanceNavigation" | "PerformanceNavigationTiming" | "PerformanceObserver" | "PerformanceObserverEntryList" | "PerformancePaintTiming" | "PerformanceResourceTiming" | "PerformanceServerTiming" | "PerformanceTiming" | "PeriodicWave" | "PermissionStatus" | "Permissions" | "PictureInPictureEvent" | "PictureInPictureWindow" | "Plugin" | "PluginArray" | "PointerEvent" | "PopStateEvent" | "ProcessingInstruction" | "ProgressEvent" | "PromiseRejectionEvent" | "PublicKeyCredential" | "PushManager" | "PushSubscription" | "PushSubscriptionOptions" | "RTCCertificate" | "RTCDTMFSender" | "RTCDTMFToneChangeEvent" | "RTCDataChannel" | "RTCDataChannelEvent" | "RTCDtlsTransport" | "RTCEncodedAudioFrame" | "RTCEncodedVideoFrame" | "RTCError" | "RTCErrorEvent" | "RTCIceCandidate" | "RTCIceTransport" | "RTCPeerConnection" | "RTCPeerConnectionIceErrorEvent" | "RTCPeerConnectionIceEvent" | "RTCRtpReceiver" | "RTCRtpScriptTransform" | "RTCRtpSender" | "RTCRtpTransceiver" | "RTCSctpTransport" | "RTCSessionDescription" | "RTCStatsReport" | "RTCTrackEvent" | "RadioNodeList" | "Range" | "ReadableByteStreamController" | "ReadableStream" | "ReadableStreamBYOBReader" | "ReadableStreamBYOBRequest" | "ReadableStreamDefaultController" | "ReadableStreamDefaultReader" | "RemotePlayback" | "Report" | "ReportBody" | "ReportingObserver" | "Request" | "ResizeObserver" | "ResizeObserverEntry" | "ResizeObserverSize" | "Response" | "SVGAElement" | "SVGAngle" | "SVGAnimateElement" | "SVGAnimateMotionElement" | "SVGAnimateTransformElement" | "SVGAnimatedAngle" | "SVGAnimatedBoolean" | "SVGAnimatedEnumeration" | "SVGAnimatedInteger" | "SVGAnimatedLength" | "SVGAnimatedLengthList" | "SVGAnimatedNumber" | "SVGAnimatedNumberList" | "SVGAnimatedPreserveAspectRatio" | "SVGAnimatedRect" | "SVGAnimatedString" | "SVGAnimatedTransformList" | "SVGAnimationElement" | "SVGCircleElement" | "SVGClipPathElement" | "SVGComponentTransferFunctionElement" | "SVGDefsElement" | "SVGDescElement" | "SVGElement" | "SVGEllipseElement" | "SVGFEBlendElement" | "SVGFEColorMatrixElement" | "SVGFEComponentTransferElement" | "SVGFECompositeElement" | "SVGFEConvolveMatrixElement" | "SVGFEDiffuseLightingElement" | "SVGFEDisplacementMapElement" | "SVGFEDistantLightElement" | "SVGFEDropShadowElement" | "SVGFEFloodElement" | "SVGFEFuncAElement" | "SVGFEFuncBElement" | "SVGFEFuncGElement" | "SVGFEFuncRElement" | "SVGFEGaussianBlurElement" | "SVGFEImageElement" | "SVGFEMergeElement" | "SVGFEMergeNodeElement" | "SVGFEMorphologyElement" | "SVGFEOffsetElement" | "SVGFEPointLightElement" | "SVGFESpecularLightingElement" | "SVGFESpotLightElement" | "SVGFETileElement" | "SVGFETurbulenceElement" | "SVGFilterElement" | "SVGForeignObjectElement" | "SVGGElement" | "SVGGeometryElement" | "SVGGradientElement" | "SVGGraphicsElement" | "SVGImageElement" | "SVGLength" | "SVGLengthList" | "SVGLineElement" | "SVGLinearGradientElement" | "SVGMPathElement" | "SVGMarkerElement" | "SVGMaskElement" | "SVGMetadataElement" | "SVGNumber" | "SVGNumberList" | "SVGPathElement" | "SVGPatternElement" | "SVGPointList" | "SVGPolygonElement" | "SVGPolylineElement" | "SVGPreserveAspectRatio" | "SVGRadialGradientElement" | "SVGRectElement" | "SVGSVGElement" | "SVGScriptElement" | "SVGSetElement" | "SVGStopElement" | "SVGStringList" | "SVGStyleElement" | "SVGSwitchElement" | "SVGSymbolElement" | "SVGTSpanElement" | "SVGTextContentElement" | "SVGTextElement" | "SVGTextPathElement" | "SVGTextPositioningElement" | "SVGTitleElement" | "SVGTransform" | "SVGTransformList" | "SVGUnitTypes" | "SVGUseElement" | "SVGViewElement" | "Screen" | "ScreenOrientation" | "ScriptProcessorNode" | "SecurityPolicyViolationEvent" | "Selection" | "ServiceWorker" | "ServiceWorkerContainer" | "ServiceWorkerRegistration" | "ShadowRoot" | "SharedWorker" | "SourceBuffer" | "SourceBufferList" | "SpeechRecognitionAlternative" | "SpeechRecognitionResult" | "SpeechRecognitionResultList" | "SpeechSynthesis" | "SpeechSynthesisErrorEvent" | "SpeechSynthesisEvent" | "SpeechSynthesisUtterance" | "SpeechSynthesisVoice" | "StaticRange" | "StereoPannerNode" | "Storage" | "StorageEvent" | "StorageManager" | "StylePropertyMap" | "StylePropertyMapReadOnly" | "StyleSheet" | "StyleSheetList" | "SubmitEvent" | "SubtleCrypto" | "Text" | "TextDecoder" | "TextDecoderStream" | "TextEncoder" | "TextEncoderStream" | "TextEvent" | "TextMetrics" | "TextTrack" | "TextTrackCue" | "TextTrackCueList" | "TextTrackList" | "TimeRanges" | "ToggleEvent" | "Touch" | "TouchEvent" | "TouchList" | "TrackEvent" | "TransformStream" | "TransformStreamDefaultController" | "TransitionEvent" | "TreeWalker" | "UIEvent" | "URL" | "webkitURL" | "URLSearchParams" | "UserActivation" | "VTTCue" | "VTTRegion" | "ValidityState" | "VideoColorSpace" | "VideoDecoder" | "VideoEncoder" | "VideoFrame" | "VideoPlaybackQuality" | "ViewTransition" | "ViewTransitionTypeSet" | "VisualViewport" | "WakeLock" | "WakeLockSentinel" | "WaveShaperNode" | "WebGL2RenderingContext" | "WebGLActiveInfo" | "WebGLBuffer" | "WebGLContextEvent" | "WebGLFramebuffer" | "WebGLProgram" | "WebGLQuery" | "WebGLRenderbuffer" | "WebGLRenderingContext" | "WebGLSampler" | "WebGLShader" | "WebGLShaderPrecisionFormat" | "WebGLSync" | "WebGLTexture" | "WebGLTransformFeedback" | "WebGLUniformLocation" | "WebGLVertexArrayObject" | "WebSocket" | "WebTransport" | "WebTransportBidirectionalStream" | "WebTransportDatagramDuplexStream" | "WebTransportError" | "WheelEvent" | "Window" | "Worker" | "Worklet" | "WritableStream" | "WritableStreamDefaultController" | "WritableStreamDefaultWriter" | "XMLDocument" | "XMLHttpRequest" | "XMLHttpRequestEventTarget" | "XMLHttpRequestUpload" | "XMLSerializer" | "XPathEvaluator" | "XPathExpression" | "XPathResult" | "XSLTProcessor" | "CSS" | "WebAssembly" | "console" | "Audio" | "Image" | "Option" | "clientInformation" | "closed" | "cookieStore" | "customElements" | "devicePixelRatio" | "document" | "event" | "external" | "frameElement" | "frames" | "history" | "innerHeight" | "innerWidth" | "length" | "location" | "locationbar" | "menubar" | "navigator" | "ondevicemotion" | "ondeviceorientation" | "ondeviceorientationabsolute" | "onorientationchange" | "opener" | "orientation" | "originAgentCluster" | "outerHeight" | "outerWidth" | "pageXOffset" | "pageYOffset" | "parent" | "personalbar" | "screen" | "screenLeft" | "screenTop" | "screenX" | "screenY" | "scrollX" | "scrollY" | "scrollbars" | "self" | "speechSynthesis" | "status" | "statusbar" | "toolbar" | "top" | "visualViewport" | "window" | "onabort" | "onanimationcancel" | "onanimationend" | "onanimationiteration" | "onanimationstart" | "onauxclick" | "onbeforeinput" | "onbeforematch" | "onbeforetoggle" | "onblur" | "oncancel" | "oncanplay" | "oncanplaythrough" | "onchange" | "onclick" | "onclose" | "oncontextlost" | "oncontextmenu" | "oncontextrestored" | "oncopy" | "oncuechange" | "oncut" | "ondblclick" | "ondrag" | "ondragend" | "ondragenter" | "ondragleave" | "ondragover" | "ondragstart" | "ondrop" | "ondurationchange" | "onemptied" | "onended" | "onerror" | "onfocus" | "onformdata" | "ongotpointercapture" | "oninput" | "oninvalid" | "onkeydown" | "onkeypress" | "onkeyup" | "onload" | "onloadeddata" | "onloadedmetadata" | "onloadstart" | "onlostpointercapture" | "onmousedown" | "onmouseenter" | "onmouseleave" | "onmousemove" | "onmouseout" | "onmouseover" | "onmouseup" | "onpaste" | "onpause" | "onplay" | "onplaying" | "onpointercancel" | "onpointerdown" | "onpointerenter" | "onpointerleave" | "onpointermove" | "onpointerout" | "onpointerover" | "onpointerrawupdate" | "onpointerup" | "onprogress" | "onratechange" | "onreset" | "onresize" | "onscroll" | "onscrollend" | "onsecuritypolicyviolation" | "onseeked" | "onseeking" | "onselect" | "onselectionchange" | "onselectstart" | "onslotchange" | "onstalled" | "onsubmit" | "onsuspend" | "ontimeupdate" | "ontoggle" | "ontouchcancel" | "ontouchend" | "ontouchmove" | "ontouchstart" | "ontransitioncancel" | "ontransitionend" | "ontransitionrun" | "ontransitionstart" | "onvolumechange" | "onwaiting" | "onwebkitanimationend" | "onwebkitanimationiteration" | "onwebkitanimationstart" | "onwebkittransitionend" | "onwheel" | "onafterprint" | "onbeforeprint" | "onbeforeunload" | "ongamepadconnected" | "ongamepaddisconnected" | "onhashchange" | "onlanguagechange" | "onmessage" | "onmessageerror" | "onoffline" | "ononline" | "onpagehide" | "onpagereveal" | "onpageshow" | "onpageswap" | "onpopstate" | "onrejectionhandled" | "onstorage" | "onunhandledrejection" | "onunload" | "localStorage" | "caches" | "crossOriginIsolated" | "crypto" | "indexedDB" | "isSecureContext" | "origin" | "performance" | "sessionStorage" | "importScripts" | "ActiveXObject" | "WScript" | "WSH" | "Enumerator" | "VBArray" | "Map" | "WeakMap" | "Set" | "WeakSet" | "Iterator" | "Proxy" | "Reflect" | "SharedArrayBuffer" | "Atomics" | "BigInt" | "BigInt64Array" | "BigUint64Array" | "AggregateError" | "WeakRef" | "FinalizationRegistry" | "SuppressedError" | "DisposableStack" | "AsyncDisposableStack" | "Float16Array") | "blob" | "file" | "formdata" | string;
|
|
283
|
+
declare function getDataType(obj: any): ("undefined" | "length" | "toString" | "ArrayBuffer" | "SharedArrayBuffer" | "globalThis" | "eval" | "parseInt" | "parseFloat" | "isNaN" | "isFinite" | "decodeURI" | "decodeURIComponent" | "encodeURI" | "encodeURIComponent" | "escape" | "unescape" | "NaN" | "Infinity" | "Symbol" | "Object" | "Function" | "String" | "Boolean" | "Number" | "Math" | "Date" | "RegExp" | "Error" | "EvalError" | "RangeError" | "ReferenceError" | "SyntaxError" | "TypeError" | "URIError" | "JSON" | "Array" | "Promise" | "DataView" | "Int8Array" | "Uint8Array" | "Uint8ClampedArray" | "Int16Array" | "Uint16Array" | "Int32Array" | "Uint32Array" | "Float32Array" | "Float64Array" | "Intl" | "alert" | "blur" | "cancelIdleCallback" | "captureEvents" | "close" | "confirm" | "focus" | "getComputedStyle" | "getSelection" | "matchMedia" | "moveBy" | "moveTo" | "open" | "postMessage" | "print" | "prompt" | "releaseEvents" | "requestIdleCallback" | "resizeBy" | "resizeTo" | "scroll" | "scrollBy" | "scrollTo" | "stop" | "dispatchEvent" | "cancelAnimationFrame" | "requestAnimationFrame" | "atob" | "btoa" | "clearInterval" | "clearTimeout" | "createImageBitmap" | "fetch" | "queueMicrotask" | "reportError" | "setInterval" | "setTimeout" | "structuredClone" | "addEventListener" | "removeEventListener" | "NodeFilter" | "AbortController" | "AbortSignal" | "AbstractRange" | "AnalyserNode" | "Animation" | "AnimationEffect" | "AnimationEvent" | "AnimationPlaybackEvent" | "AnimationTimeline" | "Attr" | "AudioBuffer" | "AudioBufferSourceNode" | "AudioContext" | "AudioData" | "AudioDecoder" | "AudioDestinationNode" | "AudioEncoder" | "AudioListener" | "AudioNode" | "AudioParam" | "AudioParamMap" | "AudioProcessingEvent" | "AudioScheduledSourceNode" | "AudioWorklet" | "AudioWorkletNode" | "AuthenticatorAssertionResponse" | "AuthenticatorAttestationResponse" | "AuthenticatorResponse" | "BarProp" | "BaseAudioContext" | "BeforeUnloadEvent" | "BiquadFilterNode" | "Blob" | "BlobEvent" | "BroadcastChannel" | "ByteLengthQueuingStrategy" | "CDATASection" | "CSPViolationReportBody" | "CSSAnimation" | "CSSConditionRule" | "CSSContainerRule" | "CSSCounterStyleRule" | "CSSFontFaceRule" | "CSSFontFeatureValuesRule" | "CSSFontPaletteValuesRule" | "CSSGroupingRule" | "CSSImageValue" | "CSSImportRule" | "CSSKeyframeRule" | "CSSKeyframesRule" | "CSSKeywordValue" | "CSSLayerBlockRule" | "CSSLayerStatementRule" | "CSSMathClamp" | "CSSMathInvert" | "CSSMathMax" | "CSSMathMin" | "CSSMathNegate" | "CSSMathProduct" | "CSSMathSum" | "CSSMathValue" | "CSSMatrixComponent" | "CSSMediaRule" | "CSSNamespaceRule" | "CSSNestedDeclarations" | "CSSNumericArray" | "CSSNumericValue" | "CSSPageRule" | "CSSPerspective" | "CSSPropertyRule" | "CSSRotate" | "CSSRule" | "CSSRuleList" | "CSSScale" | "CSSScopeRule" | "CSSSkew" | "CSSSkewX" | "CSSSkewY" | "CSSStartingStyleRule" | "CSSStyleDeclaration" | "CSSStyleRule" | "CSSStyleSheet" | "CSSStyleValue" | "CSSSupportsRule" | "CSSTransformComponent" | "CSSTransformValue" | "CSSTransition" | "CSSTranslate" | "CSSUnitValue" | "CSSUnparsedValue" | "CSSVariableReferenceValue" | "CSSViewTransitionRule" | "Cache" | "CacheStorage" | "CanvasCaptureMediaStreamTrack" | "CanvasGradient" | "CanvasPattern" | "CanvasRenderingContext2D" | "CaretPosition" | "ChannelMergerNode" | "ChannelSplitterNode" | "CharacterData" | "Clipboard" | "ClipboardEvent" | "ClipboardItem" | "CloseEvent" | "Comment" | "CompositionEvent" | "CompressionStream" | "ConstantSourceNode" | "ContentVisibilityAutoStateChangeEvent" | "ConvolverNode" | "CookieChangeEvent" | "CookieStore" | "CookieStoreManager" | "CountQueuingStrategy" | "Credential" | "CredentialsContainer" | "Crypto" | "CryptoKey" | "CustomElementRegistry" | "CustomEvent" | "CustomStateSet" | "DOMException" | "DOMImplementation" | "DOMMatrix" | "SVGMatrix" | "WebKitCSSMatrix" | "DOMMatrixReadOnly" | "DOMParser" | "DOMPoint" | "SVGPoint" | "DOMPointReadOnly" | "DOMQuad" | "DOMRect" | "SVGRect" | "DOMRectList" | "DOMRectReadOnly" | "DOMStringList" | "DOMStringMap" | "DOMTokenList" | "DataTransfer" | "DataTransferItem" | "DataTransferItemList" | "DecompressionStream" | "DelayNode" | "DeviceMotionEvent" | "DeviceOrientationEvent" | "Document" | "DocumentFragment" | "DocumentTimeline" | "DocumentType" | "DragEvent" | "DynamicsCompressorNode" | "Element" | "ElementInternals" | "EncodedAudioChunk" | "EncodedVideoChunk" | "ErrorEvent" | "Event" | "EventCounts" | "EventSource" | "EventTarget" | "External" | "File" | "FileList" | "FileReader" | "FileSystem" | "FileSystemDirectoryEntry" | "FileSystemDirectoryHandle" | "FileSystemDirectoryReader" | "FileSystemEntry" | "FileSystemFileEntry" | "FileSystemFileHandle" | "FileSystemHandle" | "FileSystemWritableFileStream" | "FocusEvent" | "FontFace" | "FontFaceSet" | "FontFaceSetLoadEvent" | "FormData" | "FormDataEvent" | "FragmentDirective" | "GainNode" | "Gamepad" | "GamepadButton" | "GamepadEvent" | "GamepadHapticActuator" | "Geolocation" | "GeolocationCoordinates" | "GeolocationPosition" | "GeolocationPositionError" | "HTMLAllCollection" | "HTMLAnchorElement" | "HTMLAreaElement" | "HTMLAudioElement" | "HTMLBRElement" | "HTMLBaseElement" | "HTMLBodyElement" | "HTMLButtonElement" | "HTMLCanvasElement" | "HTMLCollection" | "HTMLDListElement" | "HTMLDataElement" | "HTMLDataListElement" | "HTMLDetailsElement" | "HTMLDialogElement" | "HTMLDirectoryElement" | "HTMLDivElement" | "HTMLDocument" | "HTMLElement" | "HTMLEmbedElement" | "HTMLFieldSetElement" | "HTMLFontElement" | "HTMLFormControlsCollection" | "HTMLFormElement" | "HTMLFrameElement" | "HTMLFrameSetElement" | "HTMLHRElement" | "HTMLHeadElement" | "HTMLHeadingElement" | "HTMLHtmlElement" | "HTMLIFrameElement" | "HTMLImageElement" | "HTMLInputElement" | "HTMLLIElement" | "HTMLLabelElement" | "HTMLLegendElement" | "HTMLLinkElement" | "HTMLMapElement" | "HTMLMarqueeElement" | "HTMLMediaElement" | "HTMLMenuElement" | "HTMLMetaElement" | "HTMLMeterElement" | "HTMLModElement" | "HTMLOListElement" | "HTMLObjectElement" | "HTMLOptGroupElement" | "HTMLOptionElement" | "HTMLOptionsCollection" | "HTMLOutputElement" | "HTMLParagraphElement" | "HTMLParamElement" | "HTMLPictureElement" | "HTMLPreElement" | "HTMLProgressElement" | "HTMLQuoteElement" | "HTMLScriptElement" | "HTMLSelectElement" | "HTMLSlotElement" | "HTMLSourceElement" | "HTMLSpanElement" | "HTMLStyleElement" | "HTMLTableCaptionElement" | "HTMLTableCellElement" | "HTMLTableColElement" | "HTMLTableElement" | "HTMLTableRowElement" | "HTMLTableSectionElement" | "HTMLTemplateElement" | "HTMLTextAreaElement" | "HTMLTimeElement" | "HTMLTitleElement" | "HTMLTrackElement" | "HTMLUListElement" | "HTMLUnknownElement" | "HTMLVideoElement" | "HashChangeEvent" | "Headers" | "Highlight" | "HighlightRegistry" | "History" | "IDBCursor" | "IDBCursorWithValue" | "IDBDatabase" | "IDBFactory" | "IDBIndex" | "IDBKeyRange" | "IDBObjectStore" | "IDBOpenDBRequest" | "IDBRequest" | "IDBTransaction" | "IDBVersionChangeEvent" | "IIRFilterNode" | "IdleDeadline" | "ImageBitmap" | "ImageBitmapRenderingContext" | "ImageCapture" | "ImageData" | "ImageDecoder" | "ImageTrack" | "ImageTrackList" | "InputDeviceInfo" | "InputEvent" | "IntersectionObserver" | "IntersectionObserverEntry" | "KeyboardEvent" | "KeyframeEffect" | "LargestContentfulPaint" | "Location" | "Lock" | "LockManager" | "MIDIAccess" | "MIDIConnectionEvent" | "MIDIInput" | "MIDIInputMap" | "MIDIMessageEvent" | "MIDIOutput" | "MIDIOutputMap" | "MIDIPort" | "MathMLElement" | "MediaCapabilities" | "MediaDeviceInfo" | "MediaDevices" | "MediaElementAudioSourceNode" | "MediaEncryptedEvent" | "MediaError" | "MediaKeyMessageEvent" | "MediaKeySession" | "MediaKeyStatusMap" | "MediaKeySystemAccess" | "MediaKeys" | "MediaList" | "MediaMetadata" | "MediaQueryList" | "MediaQueryListEvent" | "MediaRecorder" | "MediaSession" | "MediaSource" | "MediaSourceHandle" | "MediaStream" | "MediaStreamAudioDestinationNode" | "MediaStreamAudioSourceNode" | "MediaStreamTrack" | "MediaStreamTrackEvent" | "MessageChannel" | "MessageEvent" | "MessagePort" | "MimeType" | "MimeTypeArray" | "MouseEvent" | "MutationObserver" | "MutationRecord" | "NamedNodeMap" | "NavigationActivation" | "NavigationHistoryEntry" | "NavigationPreloadManager" | "Navigator" | "NavigatorLogin" | "Node" | "NodeIterator" | "NodeList" | "Notification" | "OfflineAudioCompletionEvent" | "OfflineAudioContext" | "OffscreenCanvas" | "OffscreenCanvasRenderingContext2D" | "OscillatorNode" | "OverconstrainedError" | "PageRevealEvent" | "PageSwapEvent" | "PageTransitionEvent" | "PannerNode" | "Path2D" | "PaymentAddress" | "PaymentMethodChangeEvent" | "PaymentRequest" | "PaymentRequestUpdateEvent" | "PaymentResponse" | "Performance" | "PerformanceEntry" | "PerformanceEventTiming" | "PerformanceMark" | "PerformanceMeasure" | "PerformanceNavigation" | "PerformanceNavigationTiming" | "PerformanceObserver" | "PerformanceObserverEntryList" | "PerformancePaintTiming" | "PerformanceResourceTiming" | "PerformanceServerTiming" | "PerformanceTiming" | "PeriodicWave" | "PermissionStatus" | "Permissions" | "PictureInPictureEvent" | "PictureInPictureWindow" | "Plugin" | "PluginArray" | "PointerEvent" | "PopStateEvent" | "ProcessingInstruction" | "ProgressEvent" | "PromiseRejectionEvent" | "PublicKeyCredential" | "PushManager" | "PushSubscription" | "PushSubscriptionOptions" | "RTCCertificate" | "RTCDTMFSender" | "RTCDTMFToneChangeEvent" | "RTCDataChannel" | "RTCDataChannelEvent" | "RTCDtlsTransport" | "RTCEncodedAudioFrame" | "RTCEncodedVideoFrame" | "RTCError" | "RTCErrorEvent" | "RTCIceCandidate" | "RTCIceTransport" | "RTCPeerConnection" | "RTCPeerConnectionIceErrorEvent" | "RTCPeerConnectionIceEvent" | "RTCRtpReceiver" | "RTCRtpScriptTransform" | "RTCRtpSender" | "RTCRtpTransceiver" | "RTCSctpTransport" | "RTCSessionDescription" | "RTCStatsReport" | "RTCTrackEvent" | "RadioNodeList" | "Range" | "ReadableByteStreamController" | "ReadableStream" | "ReadableStreamBYOBReader" | "ReadableStreamBYOBRequest" | "ReadableStreamDefaultController" | "ReadableStreamDefaultReader" | "RemotePlayback" | "Report" | "ReportBody" | "ReportingObserver" | "Request" | "ResizeObserver" | "ResizeObserverEntry" | "ResizeObserverSize" | "Response" | "SVGAElement" | "SVGAngle" | "SVGAnimateElement" | "SVGAnimateMotionElement" | "SVGAnimateTransformElement" | "SVGAnimatedAngle" | "SVGAnimatedBoolean" | "SVGAnimatedEnumeration" | "SVGAnimatedInteger" | "SVGAnimatedLength" | "SVGAnimatedLengthList" | "SVGAnimatedNumber" | "SVGAnimatedNumberList" | "SVGAnimatedPreserveAspectRatio" | "SVGAnimatedRect" | "SVGAnimatedString" | "SVGAnimatedTransformList" | "SVGAnimationElement" | "SVGCircleElement" | "SVGClipPathElement" | "SVGComponentTransferFunctionElement" | "SVGDefsElement" | "SVGDescElement" | "SVGElement" | "SVGEllipseElement" | "SVGFEBlendElement" | "SVGFEColorMatrixElement" | "SVGFEComponentTransferElement" | "SVGFECompositeElement" | "SVGFEConvolveMatrixElement" | "SVGFEDiffuseLightingElement" | "SVGFEDisplacementMapElement" | "SVGFEDistantLightElement" | "SVGFEDropShadowElement" | "SVGFEFloodElement" | "SVGFEFuncAElement" | "SVGFEFuncBElement" | "SVGFEFuncGElement" | "SVGFEFuncRElement" | "SVGFEGaussianBlurElement" | "SVGFEImageElement" | "SVGFEMergeElement" | "SVGFEMergeNodeElement" | "SVGFEMorphologyElement" | "SVGFEOffsetElement" | "SVGFEPointLightElement" | "SVGFESpecularLightingElement" | "SVGFESpotLightElement" | "SVGFETileElement" | "SVGFETurbulenceElement" | "SVGFilterElement" | "SVGForeignObjectElement" | "SVGGElement" | "SVGGeometryElement" | "SVGGradientElement" | "SVGGraphicsElement" | "SVGImageElement" | "SVGLength" | "SVGLengthList" | "SVGLineElement" | "SVGLinearGradientElement" | "SVGMPathElement" | "SVGMarkerElement" | "SVGMaskElement" | "SVGMetadataElement" | "SVGNumber" | "SVGNumberList" | "SVGPathElement" | "SVGPatternElement" | "SVGPointList" | "SVGPolygonElement" | "SVGPolylineElement" | "SVGPreserveAspectRatio" | "SVGRadialGradientElement" | "SVGRectElement" | "SVGSVGElement" | "SVGScriptElement" | "SVGSetElement" | "SVGStopElement" | "SVGStringList" | "SVGStyleElement" | "SVGSwitchElement" | "SVGSymbolElement" | "SVGTSpanElement" | "SVGTextContentElement" | "SVGTextElement" | "SVGTextPathElement" | "SVGTextPositioningElement" | "SVGTitleElement" | "SVGTransform" | "SVGTransformList" | "SVGUnitTypes" | "SVGUseElement" | "SVGViewElement" | "Screen" | "ScreenOrientation" | "ScriptProcessorNode" | "SecurityPolicyViolationEvent" | "Selection" | "ServiceWorker" | "ServiceWorkerContainer" | "ServiceWorkerRegistration" | "ShadowRoot" | "SharedWorker" | "SourceBuffer" | "SourceBufferList" | "SpeechRecognitionAlternative" | "SpeechRecognitionResult" | "SpeechRecognitionResultList" | "SpeechSynthesis" | "SpeechSynthesisErrorEvent" | "SpeechSynthesisEvent" | "SpeechSynthesisUtterance" | "SpeechSynthesisVoice" | "StaticRange" | "StereoPannerNode" | "Storage" | "StorageEvent" | "StorageManager" | "StylePropertyMap" | "StylePropertyMapReadOnly" | "StyleSheet" | "StyleSheetList" | "SubmitEvent" | "SubtleCrypto" | "Text" | "TextDecoder" | "TextDecoderStream" | "TextEncoder" | "TextEncoderStream" | "TextEvent" | "TextMetrics" | "TextTrack" | "TextTrackCue" | "TextTrackCueList" | "TextTrackList" | "TimeRanges" | "ToggleEvent" | "Touch" | "TouchEvent" | "TouchList" | "TrackEvent" | "TransformStream" | "TransformStreamDefaultController" | "TransitionEvent" | "TreeWalker" | "UIEvent" | "URL" | "webkitURL" | "URLSearchParams" | "UserActivation" | "VTTCue" | "VTTRegion" | "ValidityState" | "VideoColorSpace" | "VideoDecoder" | "VideoEncoder" | "VideoFrame" | "VideoPlaybackQuality" | "ViewTransition" | "ViewTransitionTypeSet" | "VisualViewport" | "WakeLock" | "WakeLockSentinel" | "WaveShaperNode" | "WebGL2RenderingContext" | "WebGLActiveInfo" | "WebGLBuffer" | "WebGLContextEvent" | "WebGLFramebuffer" | "WebGLProgram" | "WebGLQuery" | "WebGLRenderbuffer" | "WebGLRenderingContext" | "WebGLSampler" | "WebGLShader" | "WebGLShaderPrecisionFormat" | "WebGLSync" | "WebGLTexture" | "WebGLTransformFeedback" | "WebGLUniformLocation" | "WebGLVertexArrayObject" | "WebSocket" | "WebTransport" | "WebTransportBidirectionalStream" | "WebTransportDatagramDuplexStream" | "WebTransportError" | "WheelEvent" | "Window" | "Worker" | "Worklet" | "WritableStream" | "WritableStreamDefaultController" | "WritableStreamDefaultWriter" | "XMLDocument" | "XMLHttpRequest" | "XMLHttpRequestEventTarget" | "XMLHttpRequestUpload" | "XMLSerializer" | "XPathEvaluator" | "XPathExpression" | "XPathResult" | "XSLTProcessor" | "CSS" | "WebAssembly" | "console" | "Audio" | "Image" | "Option" | "clientInformation" | "closed" | "cookieStore" | "customElements" | "devicePixelRatio" | "document" | "event" | "external" | "frameElement" | "frames" | "history" | "innerHeight" | "innerWidth" | "location" | "locationbar" | "menubar" | "navigator" | "ondevicemotion" | "ondeviceorientation" | "ondeviceorientationabsolute" | "onorientationchange" | "opener" | "orientation" | "originAgentCluster" | "outerHeight" | "outerWidth" | "pageXOffset" | "pageYOffset" | "parent" | "personalbar" | "screen" | "screenLeft" | "screenTop" | "screenX" | "screenY" | "scrollX" | "scrollY" | "scrollbars" | "self" | "speechSynthesis" | "status" | "statusbar" | "toolbar" | "top" | "visualViewport" | "window" | "onabort" | "onanimationcancel" | "onanimationend" | "onanimationiteration" | "onanimationstart" | "onauxclick" | "onbeforeinput" | "onbeforematch" | "onbeforetoggle" | "onblur" | "oncancel" | "oncanplay" | "oncanplaythrough" | "onchange" | "onclick" | "onclose" | "oncontextlost" | "oncontextmenu" | "oncontextrestored" | "oncopy" | "oncuechange" | "oncut" | "ondblclick" | "ondrag" | "ondragend" | "ondragenter" | "ondragleave" | "ondragover" | "ondragstart" | "ondrop" | "ondurationchange" | "onemptied" | "onended" | "onerror" | "onfocus" | "onformdata" | "ongotpointercapture" | "oninput" | "oninvalid" | "onkeydown" | "onkeypress" | "onkeyup" | "onload" | "onloadeddata" | "onloadedmetadata" | "onloadstart" | "onlostpointercapture" | "onmousedown" | "onmouseenter" | "onmouseleave" | "onmousemove" | "onmouseout" | "onmouseover" | "onmouseup" | "onpaste" | "onpause" | "onplay" | "onplaying" | "onpointercancel" | "onpointerdown" | "onpointerenter" | "onpointerleave" | "onpointermove" | "onpointerout" | "onpointerover" | "onpointerrawupdate" | "onpointerup" | "onprogress" | "onratechange" | "onreset" | "onresize" | "onscroll" | "onscrollend" | "onsecuritypolicyviolation" | "onseeked" | "onseeking" | "onselect" | "onselectionchange" | "onselectstart" | "onslotchange" | "onstalled" | "onsubmit" | "onsuspend" | "ontimeupdate" | "ontoggle" | "ontouchcancel" | "ontouchend" | "ontouchmove" | "ontouchstart" | "ontransitioncancel" | "ontransitionend" | "ontransitionrun" | "ontransitionstart" | "onvolumechange" | "onwaiting" | "onwebkitanimationend" | "onwebkitanimationiteration" | "onwebkitanimationstart" | "onwebkittransitionend" | "onwheel" | "onafterprint" | "onbeforeprint" | "onbeforeunload" | "ongamepadconnected" | "ongamepaddisconnected" | "onhashchange" | "onlanguagechange" | "onmessage" | "onmessageerror" | "onoffline" | "ononline" | "onpagehide" | "onpagereveal" | "onpageshow" | "onpageswap" | "onpopstate" | "onrejectionhandled" | "onstorage" | "onunhandledrejection" | "onunload" | "localStorage" | "caches" | "crossOriginIsolated" | "crypto" | "indexedDB" | "isSecureContext" | "origin" | "performance" | "sessionStorage" | "importScripts" | "ActiveXObject" | "WScript" | "WSH" | "Enumerator" | "VBArray" | "Map" | "WeakMap" | "Set" | "WeakSet" | "Iterator" | "Proxy" | "Reflect" | "Atomics" | "BigInt" | "BigInt64Array" | "BigUint64Array" | "AggregateError" | "WeakRef" | "FinalizationRegistry" | "SuppressedError" | "DisposableStack" | "AsyncDisposableStack" | "Float16Array") | "blob" | "file" | "formdata" | string;
|
|
284
284
|
/**
|
|
285
285
|
* 判断值是否为原生 Blob(含 File)。
|
|
286
286
|
*
|
package/types/webSocket.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @class WebSocketManager -
|
|
2
|
+
* @class WebSocketManager - 一个纯粹、强大的 WebSocket 连接管理引擎
|
|
3
3
|
*
|
|
4
4
|
* @features
|
|
5
5
|
* - 智能断线重连 (指数退避算法)
|
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
* - 高度可定制的心跳保活机制 (通过注入函数实现)
|
|
8
8
|
* - 页面可见性 API 集成
|
|
9
9
|
* - 消息发送队列
|
|
10
|
-
* - 事件驱动的消息分发
|
|
11
10
|
* - 清晰的生命周期管理
|
|
12
11
|
* - 优雅的资源销毁
|
|
13
12
|
* - 可配置的数据序列化/反序列化
|
|
13
|
+
* - 纯粹的消息传递,不关心消息内容
|
|
14
14
|
*/
|
|
15
15
|
declare class WebSocketManager {
|
|
16
16
|
/**
|
|
@@ -67,7 +67,7 @@ declare class WebSocketManager {
|
|
|
67
67
|
listeners: Map<any, any>;
|
|
68
68
|
_onOpen(event: any): void;
|
|
69
69
|
/**
|
|
70
|
-
*
|
|
70
|
+
* 纯粹的消息处理方法:处理心跳,然后将数据交给使用者
|
|
71
71
|
* @param {MessageEvent} event
|
|
72
72
|
*/
|
|
73
73
|
_onMessage(event: MessageEvent): void;
|