a2bei4-utils 1.0.0 → 1.0.1
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 +1051 -250
- 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 +1047 -251
- 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 +1051 -250
- 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 +281 -0
- package/dist/audio.cjs.map +1 -0
- package/dist/audio.js +278 -0
- package/dist/audio.js.map +1 -0
- package/dist/common.cjs +6 -6
- package/dist/common.cjs.map +1 -1
- package/dist/common.js +6 -6
- package/dist/common.js.map +1 -1
- package/dist/download.cjs +43 -0
- package/dist/download.cjs.map +1 -1
- package/dist/download.js +43 -1
- 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 +0 -1
- package/dist/timer.cjs.map +1 -1
- package/dist/timer.js +0 -1
- package/dist/timer.js.map +1 -1
- package/dist/tree.cjs +75 -0
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +75 -1
- package/dist/tree.js.map +1 -1
- package/dist/webSocket.cjs +409 -0
- package/dist/webSocket.cjs.map +1 -0
- package/dist/webSocket.js +407 -0
- package/dist/webSocket.js.map +1 -0
- package/package.json +11 -1
- package/readme.txt +8 -5
- package/types/audio.d.ts +57 -0
- package/types/download.d.ts +12 -1
- package/types/index.d.ts +207 -1
- package/types/tree.d.ts +17 -1
- package/types/webSocket.d.ts +124 -0
package/types/index.d.ts
CHANGED
|
@@ -29,6 +29,129 @@ declare class IntervalTimer {
|
|
|
29
29
|
isRunning(): boolean;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
/**
|
|
33
|
+
* @class WebSocketManager - 一个功能强大、高度可定制的 WebSocket 助手类
|
|
34
|
+
*
|
|
35
|
+
* @features
|
|
36
|
+
* - 智能断线重连 (指数退避算法)
|
|
37
|
+
* - 网络状态监听
|
|
38
|
+
* - 高度可定制的心跳保活机制 (通过注入函数实现)
|
|
39
|
+
* - 页面可见性 API 集成
|
|
40
|
+
* - 消息发送队列
|
|
41
|
+
* - 事件驱动的消息分发
|
|
42
|
+
* - 清晰的生命周期管理
|
|
43
|
+
* - 优雅的资源销毁
|
|
44
|
+
* - 可配置的数据序列化/反序列化
|
|
45
|
+
*/
|
|
46
|
+
declare class WebSocketManager {
|
|
47
|
+
/**
|
|
48
|
+
* @param {string} url - WebSocket 服务器的地址
|
|
49
|
+
* @param {object} [options={}] - 配置选项
|
|
50
|
+
* @param {number} [options.heartbeatInterval=30000] - 心跳间隔 (毫秒)
|
|
51
|
+
* @param {number} [options.heartbeatTimeout=10000] - 心跳超时时间 (毫秒)
|
|
52
|
+
* @param {number} [options.reconnectBaseInterval=1000] - 重连基础间隔 (毫秒)
|
|
53
|
+
* @param {number} [options.maxReconnectInterval=30000] - 最大重连间隔 (毫秒)
|
|
54
|
+
* @param {number} [options.maxReconnectAttempts=Infinity] - 最大重连次数
|
|
55
|
+
* @param {boolean} [options.autoConnect=true] - 是否在实例化后自动连接
|
|
56
|
+
* @param {boolean} [options.serializeData=false] - 发送数据时是否自动序列化为JSON字符串
|
|
57
|
+
* @param {boolean} [options.deserializeData=false] - 接收数据时是否自动反序列化为JSON对象
|
|
58
|
+
* @param {function|null} [options.getPingMessage=null] - 返回要发送的 ping 消息内容的函数。如果为 null,则不发送心跳。
|
|
59
|
+
* @param {function|null} [options.isPongMessage=null] - 判断接收到的消息是否为 pong 的函数。接收 MessageEvent 对象作为参数,返回布尔值。
|
|
60
|
+
* @param {object} [options.protocols] - WebSocket 协议
|
|
61
|
+
*/
|
|
62
|
+
constructor(url: string, options?: {
|
|
63
|
+
heartbeatInterval?: number | undefined;
|
|
64
|
+
heartbeatTimeout?: number | undefined;
|
|
65
|
+
reconnectBaseInterval?: number | undefined;
|
|
66
|
+
maxReconnectInterval?: number | undefined;
|
|
67
|
+
maxReconnectAttempts?: number | undefined;
|
|
68
|
+
autoConnect?: boolean | undefined;
|
|
69
|
+
serializeData?: boolean | undefined;
|
|
70
|
+
deserializeData?: boolean | undefined;
|
|
71
|
+
getPingMessage?: Function | null | undefined;
|
|
72
|
+
isPongMessage?: Function | null | undefined;
|
|
73
|
+
protocols?: object | undefined;
|
|
74
|
+
});
|
|
75
|
+
url: string;
|
|
76
|
+
options: {
|
|
77
|
+
heartbeatInterval: number;
|
|
78
|
+
heartbeatTimeout: number;
|
|
79
|
+
reconnectBaseInterval: number;
|
|
80
|
+
maxReconnectInterval: number;
|
|
81
|
+
maxReconnectAttempts: number;
|
|
82
|
+
autoConnect: boolean;
|
|
83
|
+
serializeData: boolean;
|
|
84
|
+
deserializeData: boolean;
|
|
85
|
+
getPingMessage: Function | null;
|
|
86
|
+
isPongMessage: Function | null;
|
|
87
|
+
protocols?: object | undefined;
|
|
88
|
+
};
|
|
89
|
+
ws: WebSocket | null;
|
|
90
|
+
readyState: 3;
|
|
91
|
+
reconnectAttempts: number;
|
|
92
|
+
forcedClose: boolean;
|
|
93
|
+
isReconnecting: boolean;
|
|
94
|
+
heartbeatTimer: number | null;
|
|
95
|
+
heartbeatTimeoutTimer: number | null;
|
|
96
|
+
reconnectTimer: number | null;
|
|
97
|
+
messageQueue: any[];
|
|
98
|
+
listeners: Map<any, any>;
|
|
99
|
+
_onOpen(event: any): void;
|
|
100
|
+
/**
|
|
101
|
+
* 优化后的消息处理方法,使用注入的函数来判断心跳
|
|
102
|
+
* @param {MessageEvent} event
|
|
103
|
+
*/
|
|
104
|
+
_onMessage(event: MessageEvent): void;
|
|
105
|
+
_onClose(event: any): void;
|
|
106
|
+
_onError(event: any): void;
|
|
107
|
+
_handleVisibilityChange(): void;
|
|
108
|
+
_handleOnline(): void;
|
|
109
|
+
_handleOffline(): void;
|
|
110
|
+
/**
|
|
111
|
+
* 连接到 WebSocket 服务器
|
|
112
|
+
*/
|
|
113
|
+
connect(): void;
|
|
114
|
+
/**
|
|
115
|
+
* 发送数据
|
|
116
|
+
* @param {string|object|ArrayBuffer|Blob} data - 要发送的数据
|
|
117
|
+
*/
|
|
118
|
+
send(data: string | object | ArrayBuffer | Blob): void;
|
|
119
|
+
/**
|
|
120
|
+
* 主动关闭连接
|
|
121
|
+
* @param {number} [code=1000] - 关闭代码
|
|
122
|
+
* @param {string} [reason=''] - 关闭原因
|
|
123
|
+
*/
|
|
124
|
+
close(code?: number, reason?: string): void;
|
|
125
|
+
/**
|
|
126
|
+
* 彻底销毁实例,清理所有资源
|
|
127
|
+
*/
|
|
128
|
+
destroy(): void;
|
|
129
|
+
/**
|
|
130
|
+
* 添加事件监听器
|
|
131
|
+
* @param {string} eventName - 事件名 (e.g., 'open', 'message', 'close', 'error', 'reconnect')
|
|
132
|
+
* @param {function} callback - 回调函数
|
|
133
|
+
*/
|
|
134
|
+
on(eventName: string, callback: Function): void;
|
|
135
|
+
/**
|
|
136
|
+
* 移除事件监听器
|
|
137
|
+
* @param {string} eventName - 事件名
|
|
138
|
+
* @param {function} callback - 回调函数
|
|
139
|
+
*/
|
|
140
|
+
off(eventName: string, callback: Function): void;
|
|
141
|
+
_startHeartbeat(): void;
|
|
142
|
+
_stopHeartbeat(): void;
|
|
143
|
+
_setHeartbeatTimeout(): void;
|
|
144
|
+
_clearHeartbeatTimeout(): void;
|
|
145
|
+
_handlePong(): void;
|
|
146
|
+
_scheduleReconnect(): void;
|
|
147
|
+
_clearReconnectTimer(): void;
|
|
148
|
+
_flushMessageQueue(): void;
|
|
149
|
+
_emit(eventName: any, ...args: any[]): void;
|
|
150
|
+
_updateReadyState(newState: any): void;
|
|
151
|
+
_setupEventListeners(): void;
|
|
152
|
+
_removeEventListeners(): void;
|
|
153
|
+
}
|
|
154
|
+
|
|
32
155
|
/**
|
|
33
156
|
* 使用 Fisher-Yates 算法对数组 **原地** 随机乱序。
|
|
34
157
|
* @template T
|
|
@@ -46,6 +169,62 @@ declare function shuffle<T>(arr: T[]): T[];
|
|
|
46
169
|
*/
|
|
47
170
|
declare function moveItem<T>(arr: T[], fromIndex: number, toIndex: number): T[];
|
|
48
171
|
|
|
172
|
+
/**
|
|
173
|
+
* 将 16-bit 单声道 PCM 数据封装成标准 WAV Blob。
|
|
174
|
+
*
|
|
175
|
+
* @param {Int16Array} pcmData - PCM 采样数据
|
|
176
|
+
* @param {number} [sampleRate=16000] - 采样率,默认 16 kHz
|
|
177
|
+
* @returns {Blob} audio/wav Blob
|
|
178
|
+
*/
|
|
179
|
+
declare function pcmToWavBlob(pcmData: Int16Array, sampleRate?: number): Blob;
|
|
180
|
+
/**
|
|
181
|
+
* 浏览器端实时音频流重采样器。
|
|
182
|
+
* 基于 AudioWorklet 将麦克风/媒体流转换为 16 kHz、16-bit、单声道 PCM,
|
|
183
|
+
* 并通过回调逐块输出,可选保存完整 PCM 用于后续合并。
|
|
184
|
+
*/
|
|
185
|
+
declare class AudioStreamResampler {
|
|
186
|
+
/**
|
|
187
|
+
* @param {object} config
|
|
188
|
+
* @param {function(Int16Array)} config.onData - 收到一个 chunk PCM 数据的回调
|
|
189
|
+
* @param {function(string, string)} [config.onStateChange] - 状态变化回调
|
|
190
|
+
* @param {object} [config.processorOptions] - 传递给 AudioWorklet 的选项
|
|
191
|
+
* @param {boolean} [config.saveFullPcm=false] - 是否在内部保存所有 PCM 用于 stop 时合并(长时间录音建议关闭)
|
|
192
|
+
*/
|
|
193
|
+
constructor(config: {
|
|
194
|
+
onData: (arg0: Int16Array) => any;
|
|
195
|
+
onStateChange?: ((arg0: string, arg1: string) => any) | undefined;
|
|
196
|
+
processorOptions?: object | undefined;
|
|
197
|
+
saveFullPcm?: boolean | undefined;
|
|
198
|
+
});
|
|
199
|
+
onData: (arg0: Int16Array) => any;
|
|
200
|
+
onStateChange: (arg0: string, arg1: string) => any;
|
|
201
|
+
processorOptions: object;
|
|
202
|
+
saveFullPcm: boolean;
|
|
203
|
+
audioContext: AudioContext | null;
|
|
204
|
+
workletNode: AudioWorkletNode | null;
|
|
205
|
+
source: MediaStreamAudioSourceNode | null;
|
|
206
|
+
workletUrl: string | null;
|
|
207
|
+
fullPcmData: never[] | null;
|
|
208
|
+
isInitialized: boolean;
|
|
209
|
+
isProcessing: boolean;
|
|
210
|
+
/**
|
|
211
|
+
* 初始化 AudioContext 并加载 AudioWorklet。
|
|
212
|
+
* 完成后状态变为 `"ready"`。
|
|
213
|
+
*/
|
|
214
|
+
init(): Promise<void>;
|
|
215
|
+
/**
|
|
216
|
+
* 绑定媒体流,开始实时处理。
|
|
217
|
+
* @param {MediaStream} stream - 通过 getUserMedia 或其他方式获得的流
|
|
218
|
+
*/
|
|
219
|
+
setMediaStream(stream: MediaStream): void;
|
|
220
|
+
/**
|
|
221
|
+
* 停止处理并释放资源。
|
|
222
|
+
* @param {(fullPcm: Int16Array) => void} [callback] - 若构造时 `saveFullPcm=true`,会把合并后的完整 PCM 通过此回调传出
|
|
223
|
+
*/
|
|
224
|
+
stop(callback?: (fullPcm: Int16Array) => void): void;
|
|
225
|
+
_cleanup(): void;
|
|
226
|
+
}
|
|
227
|
+
|
|
49
228
|
/**
|
|
50
229
|
* 视口尺寸对象。
|
|
51
230
|
* @typedef {Object} ViewportDimensions
|
|
@@ -342,6 +521,7 @@ declare function formatDurationMaxHour(totalSeconds: number, options?: Omit<Para
|
|
|
342
521
|
|
|
343
522
|
/**
|
|
344
523
|
* 通过动态创建 `<a>` 标签触发浏览器下载。
|
|
524
|
+
* 注意:此方法可能无法强制下载浏览器原生支持的文件(如图片、PDF),浏览器可能会选择直接打开。
|
|
345
525
|
*
|
|
346
526
|
* @param {string} url - 任意可下载地址(同源或允许跨域)
|
|
347
527
|
* @param {string} [fileName] - 保存到本地的文件名;不传时使用时间戳
|
|
@@ -377,6 +557,16 @@ declare function downloadExcel(data: string | ArrayBufferView | ArrayBuffer | Bl
|
|
|
377
557
|
* @param {string} [fileName] - 保存到本地的文件名
|
|
378
558
|
*/
|
|
379
559
|
declare function downloadJSON(data: any, fileName?: string): void;
|
|
560
|
+
/**
|
|
561
|
+
* 通过 `fetch` 获取资源并强制下载,避免浏览器直接打开文件。
|
|
562
|
+
* 此方法适用于下载图片、PDF 等浏览器默认会打开的文件类型。
|
|
563
|
+
* 如果 `fetch` 失败(如 CORS 策略阻止),会回退到 `downloadByUrl` 方法作为备选方案。
|
|
564
|
+
*
|
|
565
|
+
* @param {string} url - 文件的 URL 地址
|
|
566
|
+
* @param {string} [fileName] - 保存到本地的文件名。如果不提供,会尝试从 URL 中自动提取
|
|
567
|
+
* @returns {Promise<void>} 返回一个 Promise,在下载开始或失败后 resolve
|
|
568
|
+
*/
|
|
569
|
+
declare function fetchOrDownloadByUrl(url: string, fileName?: string): Promise<void>;
|
|
380
570
|
|
|
381
571
|
/**
|
|
382
572
|
* 简单、高性能的通用事件总线。
|
|
@@ -494,6 +684,22 @@ declare function flatCompleteTree2NestedTree<T>(nodes: T[], parentId?: number |
|
|
|
494
684
|
parentKey?: string | undefined;
|
|
495
685
|
childrenKey?: string | undefined;
|
|
496
686
|
}): (T & { [k in typeof childrenKey]: T[]; })[];
|
|
687
|
+
/**
|
|
688
|
+
* 从服务端返回的已选 id 数组里,提取出
|
|
689
|
+
* 1. 叶子节点
|
|
690
|
+
* 2. 所有子节点都被选中的父节点
|
|
691
|
+
* 其余父节点一律丢弃(由前端 Tree 自动算半选)
|
|
692
|
+
*
|
|
693
|
+
* @param {Array} treeData 完整树
|
|
694
|
+
* @param {Array} selectedKeys 后端给的选中 id 数组
|
|
695
|
+
* @param {String} idKey 节点唯一字段
|
|
696
|
+
* @param {String} childrenKey 子节点字段
|
|
697
|
+
* @returns {{checked: string[], halfChecked: string[]}}
|
|
698
|
+
*/
|
|
699
|
+
declare function extractFullyCheckedKeys(treeData: any[], selectedKeys: any[], idKey?: string, childrenKey?: string): {
|
|
700
|
+
checked: string[];
|
|
701
|
+
halfChecked: string[];
|
|
702
|
+
};
|
|
497
703
|
declare function findObjAttrValueById<T>(id: string | number, arr: T[], resultKey?: string, idKey?: string, childrenKey?: string): any;
|
|
498
704
|
|
|
499
|
-
export { IntervalTimer, MyEvent, MyEvent_CrossPagePlugin, MyId, assignExisting, calcTimeDifference, debounce, deepCloneByJSON, downloadByBlob, downloadByData, downloadByUrl, downloadExcel, downloadJSON, findObjAttrValueById, flatCompleteTree2NestedTree, formatDuration, formatDurationMaxDay, formatDurationMaxHour, getAllSearchParams, getDataType, getFunctionArgNames, getGUID, getSearchParam, getViewportSize, isBlob, isDate, isFunction, isNonEmptyString, isPlainObject, isPromise, moveItem, nestedTree2IdMap, randomDateInRange, randomEnLetter, randomHan, randomHanOrEn, randomIntInRange, readBlobAsText, shuffle, throttle, toDate };
|
|
705
|
+
export { AudioStreamResampler, IntervalTimer, MyEvent, MyEvent_CrossPagePlugin, MyId, WebSocketManager, assignExisting, calcTimeDifference, debounce, deepCloneByJSON, downloadByBlob, downloadByData, downloadByUrl, downloadExcel, downloadJSON, extractFullyCheckedKeys, fetchOrDownloadByUrl, findObjAttrValueById, flatCompleteTree2NestedTree, formatDuration, formatDurationMaxDay, formatDurationMaxHour, getAllSearchParams, getDataType, getFunctionArgNames, getGUID, getSearchParam, getViewportSize, isBlob, isDate, isFunction, isNonEmptyString, isPlainObject, isPromise, moveItem, nestedTree2IdMap, pcmToWavBlob, randomDateInRange, randomEnLetter, randomHan, randomHanOrEn, randomIntInRange, readBlobAsText, shuffle, throttle, toDate };
|
package/types/tree.d.ts
CHANGED
|
@@ -25,6 +25,22 @@ declare function flatCompleteTree2NestedTree<T>(nodes: T[], parentId?: number |
|
|
|
25
25
|
parentKey?: string | undefined;
|
|
26
26
|
childrenKey?: string | undefined;
|
|
27
27
|
}): (T & { [k in typeof childrenKey]: T[]; })[];
|
|
28
|
+
/**
|
|
29
|
+
* 从服务端返回的已选 id 数组里,提取出
|
|
30
|
+
* 1. 叶子节点
|
|
31
|
+
* 2. 所有子节点都被选中的父节点
|
|
32
|
+
* 其余父节点一律丢弃(由前端 Tree 自动算半选)
|
|
33
|
+
*
|
|
34
|
+
* @param {Array} treeData 完整树
|
|
35
|
+
* @param {Array} selectedKeys 后端给的选中 id 数组
|
|
36
|
+
* @param {String} idKey 节点唯一字段
|
|
37
|
+
* @param {String} childrenKey 子节点字段
|
|
38
|
+
* @returns {{checked: string[], halfChecked: string[]}}
|
|
39
|
+
*/
|
|
40
|
+
declare function extractFullyCheckedKeys(treeData: any[], selectedKeys: any[], idKey?: string, childrenKey?: string): {
|
|
41
|
+
checked: string[];
|
|
42
|
+
halfChecked: string[];
|
|
43
|
+
};
|
|
28
44
|
declare function findObjAttrValueById<T>(id: string | number, arr: T[], resultKey?: string, idKey?: string, childrenKey?: string): any;
|
|
29
45
|
|
|
30
|
-
export { findObjAttrValueById, flatCompleteTree2NestedTree, nestedTree2IdMap };
|
|
46
|
+
export { extractFullyCheckedKeys, findObjAttrValueById, flatCompleteTree2NestedTree, nestedTree2IdMap };
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @class WebSocketManager - 一个功能强大、高度可定制的 WebSocket 助手类
|
|
3
|
+
*
|
|
4
|
+
* @features
|
|
5
|
+
* - 智能断线重连 (指数退避算法)
|
|
6
|
+
* - 网络状态监听
|
|
7
|
+
* - 高度可定制的心跳保活机制 (通过注入函数实现)
|
|
8
|
+
* - 页面可见性 API 集成
|
|
9
|
+
* - 消息发送队列
|
|
10
|
+
* - 事件驱动的消息分发
|
|
11
|
+
* - 清晰的生命周期管理
|
|
12
|
+
* - 优雅的资源销毁
|
|
13
|
+
* - 可配置的数据序列化/反序列化
|
|
14
|
+
*/
|
|
15
|
+
declare class WebSocketManager {
|
|
16
|
+
/**
|
|
17
|
+
* @param {string} url - WebSocket 服务器的地址
|
|
18
|
+
* @param {object} [options={}] - 配置选项
|
|
19
|
+
* @param {number} [options.heartbeatInterval=30000] - 心跳间隔 (毫秒)
|
|
20
|
+
* @param {number} [options.heartbeatTimeout=10000] - 心跳超时时间 (毫秒)
|
|
21
|
+
* @param {number} [options.reconnectBaseInterval=1000] - 重连基础间隔 (毫秒)
|
|
22
|
+
* @param {number} [options.maxReconnectInterval=30000] - 最大重连间隔 (毫秒)
|
|
23
|
+
* @param {number} [options.maxReconnectAttempts=Infinity] - 最大重连次数
|
|
24
|
+
* @param {boolean} [options.autoConnect=true] - 是否在实例化后自动连接
|
|
25
|
+
* @param {boolean} [options.serializeData=false] - 发送数据时是否自动序列化为JSON字符串
|
|
26
|
+
* @param {boolean} [options.deserializeData=false] - 接收数据时是否自动反序列化为JSON对象
|
|
27
|
+
* @param {function|null} [options.getPingMessage=null] - 返回要发送的 ping 消息内容的函数。如果为 null,则不发送心跳。
|
|
28
|
+
* @param {function|null} [options.isPongMessage=null] - 判断接收到的消息是否为 pong 的函数。接收 MessageEvent 对象作为参数,返回布尔值。
|
|
29
|
+
* @param {object} [options.protocols] - WebSocket 协议
|
|
30
|
+
*/
|
|
31
|
+
constructor(url: string, options?: {
|
|
32
|
+
heartbeatInterval?: number | undefined;
|
|
33
|
+
heartbeatTimeout?: number | undefined;
|
|
34
|
+
reconnectBaseInterval?: number | undefined;
|
|
35
|
+
maxReconnectInterval?: number | undefined;
|
|
36
|
+
maxReconnectAttempts?: number | undefined;
|
|
37
|
+
autoConnect?: boolean | undefined;
|
|
38
|
+
serializeData?: boolean | undefined;
|
|
39
|
+
deserializeData?: boolean | undefined;
|
|
40
|
+
getPingMessage?: Function | null | undefined;
|
|
41
|
+
isPongMessage?: Function | null | undefined;
|
|
42
|
+
protocols?: object | undefined;
|
|
43
|
+
});
|
|
44
|
+
url: string;
|
|
45
|
+
options: {
|
|
46
|
+
heartbeatInterval: number;
|
|
47
|
+
heartbeatTimeout: number;
|
|
48
|
+
reconnectBaseInterval: number;
|
|
49
|
+
maxReconnectInterval: number;
|
|
50
|
+
maxReconnectAttempts: number;
|
|
51
|
+
autoConnect: boolean;
|
|
52
|
+
serializeData: boolean;
|
|
53
|
+
deserializeData: boolean;
|
|
54
|
+
getPingMessage: Function | null;
|
|
55
|
+
isPongMessage: Function | null;
|
|
56
|
+
protocols?: object | undefined;
|
|
57
|
+
};
|
|
58
|
+
ws: WebSocket | null;
|
|
59
|
+
readyState: 3;
|
|
60
|
+
reconnectAttempts: number;
|
|
61
|
+
forcedClose: boolean;
|
|
62
|
+
isReconnecting: boolean;
|
|
63
|
+
heartbeatTimer: number | null;
|
|
64
|
+
heartbeatTimeoutTimer: number | null;
|
|
65
|
+
reconnectTimer: number | null;
|
|
66
|
+
messageQueue: any[];
|
|
67
|
+
listeners: Map<any, any>;
|
|
68
|
+
_onOpen(event: any): void;
|
|
69
|
+
/**
|
|
70
|
+
* 优化后的消息处理方法,使用注入的函数来判断心跳
|
|
71
|
+
* @param {MessageEvent} event
|
|
72
|
+
*/
|
|
73
|
+
_onMessage(event: MessageEvent): void;
|
|
74
|
+
_onClose(event: any): void;
|
|
75
|
+
_onError(event: any): void;
|
|
76
|
+
_handleVisibilityChange(): void;
|
|
77
|
+
_handleOnline(): void;
|
|
78
|
+
_handleOffline(): void;
|
|
79
|
+
/**
|
|
80
|
+
* 连接到 WebSocket 服务器
|
|
81
|
+
*/
|
|
82
|
+
connect(): void;
|
|
83
|
+
/**
|
|
84
|
+
* 发送数据
|
|
85
|
+
* @param {string|object|ArrayBuffer|Blob} data - 要发送的数据
|
|
86
|
+
*/
|
|
87
|
+
send(data: string | object | ArrayBuffer | Blob): void;
|
|
88
|
+
/**
|
|
89
|
+
* 主动关闭连接
|
|
90
|
+
* @param {number} [code=1000] - 关闭代码
|
|
91
|
+
* @param {string} [reason=''] - 关闭原因
|
|
92
|
+
*/
|
|
93
|
+
close(code?: number, reason?: string): void;
|
|
94
|
+
/**
|
|
95
|
+
* 彻底销毁实例,清理所有资源
|
|
96
|
+
*/
|
|
97
|
+
destroy(): void;
|
|
98
|
+
/**
|
|
99
|
+
* 添加事件监听器
|
|
100
|
+
* @param {string} eventName - 事件名 (e.g., 'open', 'message', 'close', 'error', 'reconnect')
|
|
101
|
+
* @param {function} callback - 回调函数
|
|
102
|
+
*/
|
|
103
|
+
on(eventName: string, callback: Function): void;
|
|
104
|
+
/**
|
|
105
|
+
* 移除事件监听器
|
|
106
|
+
* @param {string} eventName - 事件名
|
|
107
|
+
* @param {function} callback - 回调函数
|
|
108
|
+
*/
|
|
109
|
+
off(eventName: string, callback: Function): void;
|
|
110
|
+
_startHeartbeat(): void;
|
|
111
|
+
_stopHeartbeat(): void;
|
|
112
|
+
_setHeartbeatTimeout(): void;
|
|
113
|
+
_clearHeartbeatTimeout(): void;
|
|
114
|
+
_handlePong(): void;
|
|
115
|
+
_scheduleReconnect(): void;
|
|
116
|
+
_clearReconnectTimer(): void;
|
|
117
|
+
_flushMessageQueue(): void;
|
|
118
|
+
_emit(eventName: any, ...args: any[]): void;
|
|
119
|
+
_updateReadyState(newState: any): void;
|
|
120
|
+
_setupEventListeners(): void;
|
|
121
|
+
_removeEventListeners(): void;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export { WebSocketManager };
|