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.
@@ -1460,7 +1460,7 @@ function extractFullyCheckedKeys(treeData, selectedKeys, idKey = "id", childrenK
1460
1460
  }
1461
1461
 
1462
1462
  /**
1463
- * @class WebSocketManager - 一个功能强大、高度可定制的 WebSocket 助手类
1463
+ * @class WebSocketManager - 一个纯粹、强大的 WebSocket 连接管理引擎
1464
1464
  *
1465
1465
  * @features
1466
1466
  * - 智能断线重连 (指数退避算法)
@@ -1468,10 +1468,10 @@ function extractFullyCheckedKeys(treeData, selectedKeys, idKey = "id", childrenK
1468
1468
  * - 高度可定制的心跳保活机制 (通过注入函数实现)
1469
1469
  * - 页面可见性 API 集成
1470
1470
  * - 消息发送队列
1471
- * - 事件驱动的消息分发
1472
1471
  * - 清晰的生命周期管理
1473
1472
  * - 优雅的资源销毁
1474
1473
  * - 可配置的数据序列化/反序列化
1474
+ * - 纯粹的消息传递,不关心消息内容
1475
1475
  */
1476
1476
  class WebSocketManager {
1477
1477
  /**
@@ -1675,7 +1675,7 @@ class WebSocketManager {
1675
1675
  }
1676
1676
 
1677
1677
  /**
1678
- * 优化后的消息处理方法,使用注入的函数来判断心跳
1678
+ * 纯粹的消息处理方法:处理心跳,然后将数据交给使用者
1679
1679
  * @param {MessageEvent} event
1680
1680
  */
1681
1681
  _onMessage(event) {
@@ -1689,12 +1689,12 @@ class WebSocketManager {
1689
1689
  if (this.options.deserializeData) {
1690
1690
  try {
1691
1691
  const parsedMessage = JSON.parse(event.data);
1692
- this._emit("message", parsedMessage);
1692
+ this._emit("message", parsedMessage, event);
1693
1693
  } catch (e) {
1694
- this._emit("message", event.data);
1694
+ this._emit("message", event.data, event);
1695
1695
  }
1696
1696
  } else {
1697
- this._emit("message", event.data);
1697
+ this._emit("message", event.data, event);
1698
1698
  }
1699
1699
  }
1700
1700
 
@@ -1714,7 +1714,7 @@ class WebSocketManager {
1714
1714
  this._emit("error", event);
1715
1715
  }
1716
1716
 
1717
- // --- 心跳机制 (重构) ---
1717
+ // --- 心跳机制 ---
1718
1718
  _startHeartbeat() {
1719
1719
  // 如果没有配置 getPingMessage,则无法启动心跳
1720
1720
  if (!this.options.getPingMessage) {
@@ -1830,7 +1830,7 @@ class WebSocketManager {
1830
1830
 
1831
1831
  _handleVisibilityChange() {
1832
1832
  // 如果未启用心跳,不需要处理页面可见性变化
1833
- if (!this.options.enableHeartbeat) {
1833
+ if (!this.options.getPingMessage) {
1834
1834
  return;
1835
1835
  }
1836
1836
 
@@ -1 +1 @@
1
- {"version":3,"file":"a2bei4.utils.cjs.js","sources":["../src/source/arr.js","../src/source/audio.js","../src/source/browser.js","../src/source/common.js","../src/source/date.js","../src/source/download.js","../src/source/evt.js","../src/source/id.js","../src/source/timer.js","../src/source/tree.js","../src/source/webSocket.js"],"sourcesContent":["/**\n * 使用 Fisher-Yates 算法对数组 **原地** 随机乱序。\n * @template T\n * @param {T[]} arr - 要乱序的数组\n * @returns {T[]} 返回传入的同一数组实例(已乱序)\n */\nexport function shuffle(arr) {\n // 方式一:\n // arr.sort(() => Math.random() - 0.5);\n // 方式二:\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [arr[i], arr[j]] = [arr[j], arr[i]];\n }\n return arr;\n}\n\n/**\n * 将数组中的元素从 `fromIndex` 移动到 `toIndex`,**原地** 修改并返回该数组。\n * @template T\n * @param {T[]} arr - 要操作的数组\n * @param {number} fromIndex - 原始下标\n * @param {number} toIndex - 目标下标\n * @returns {T[]} 返回传入的同一数组实例\n */\nexport function moveItem(arr, fromIndex, toIndex) {\n arr.splice(toIndex, 0, arr.splice(fromIndex, 1)[0]);\n}\n","const AudioStreamResamplerProcessorCode = `\nclass AudioStreamResamplerProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super();\n const config = options.processorOptions || {};\n this.targetSampleRate = config.targetSampleRate || 16000;\n this.sourceSampleRate = sampleRate;\n this.downsampleRatio = this.sourceSampleRate / this.targetSampleRate;\n\n // 16000Hz 用 60ms chunk (960 samples),其他用 1024\n this.chunkSize = this.targetSampleRate === 16000 ? 960 : 1024;\n\n const sourceBufferSize = config.sourceBufferSize || 16384; // ~340ms @48kHz\n const pcmBufferSize = config.pcmBufferSize || (this.chunkSize * 10); // 更大缓冲,减少溢出概率\n\n this.sourceBuffer = new Float32Array(sourceBufferSize);\n this.sourceBufferLength = 0;\n\n this.pcmBuffer = new Int16Array(pcmBufferSize);\n this.pcmBufferIndex = 0;\n }\n\n process(inputs, outputs, parameters) {\n const input = inputs[0];\n if (!input || input.length === 0 || input[0].length === 0) return true;\n const inputChannel = input[0];\n\n // 1. 写入源缓冲区(溢出时覆盖最旧数据)\n const newLength = this.sourceBufferLength + inputChannel.length;\n if (newLength > this.sourceBuffer.length) {\n const overflow = newLength - this.sourceBuffer.length;\n this.sourceBuffer.copyWithin(0, overflow);\n this.sourceBufferLength = this.sourceBuffer.length - inputChannel.length;\n }\n this.sourceBuffer.set(inputChannel, this.sourceBufferLength);\n this.sourceBufferLength += inputChannel.length;\n\n // 2. 计算可降采样样本数\n const availableOutputSamples = Math.floor(this.sourceBufferLength / this.downsampleRatio);\n if (availableOutputSamples === 0) return true;\n\n // 3. 线性插值降采样\n const downsampled = new Float32Array(availableOutputSamples);\n for (let i = 0; i < availableOutputSamples; i++) {\n const srcIndex = i * this.downsampleRatio;\n const srcIndexInt = Math.floor(srcIndex);\n const fraction = srcIndex - srcIndexInt;\n const val0 = this.sourceBuffer[srcIndexInt];\n const val1 = srcIndexInt + 1 < this.sourceBufferLength ? this.sourceBuffer[srcIndexInt + 1] : val0;\n downsampled[i] = val0 + (val1 - val0) * fraction;\n }\n\n // 4. Float32 → Int16 PCM\n const pcmData = this.floatTo16BitPCM(downsampled);\n\n // 5. 写入 PCM 缓冲区(空间不足时直接覆盖最旧,缓冲区足够大基本不会触发)\n if (this.pcmBufferIndex + pcmData.length > this.pcmBuffer.length) {\n // 简单策略:从头覆盖(丢弃最旧数据)\n this.pcmBufferIndex = 0;\n }\n this.pcmBuffer.set(pcmData, this.pcmBufferIndex);\n this.pcmBufferIndex += pcmData.length;\n\n // 6. 发送所有完整的 chunk(关键:复制到新数组再转移)\n while (this.pcmBufferIndex >= this.chunkSize) {\n // 方法1:推荐,使用 slice(隐式复制到新 ArrayBuffer)\n const chunk = this.pcmBuffer.slice(0, this.chunkSize);\n\n // 方法2:等价写法\n // const chunk = new Int16Array(this.pcmBuffer.subarray(0, this.chunkSize));\n\n this.port.postMessage(chunk, [chunk.buffer]); // 转移新缓冲区,安全!\n\n // 移动剩余数据到开头\n this.pcmBuffer.copyWithin(0, this.chunkSize, this.pcmBufferIndex);\n this.pcmBufferIndex -= this.chunkSize;\n }\n\n // 7. 清理已消费的源数据\n const consumedSrc = Math.floor(availableOutputSamples * this.downsampleRatio + 0.5); // 四舍五入更准\n if (consumedSrc > 0) {\n this.sourceBuffer.copyWithin(0, consumedSrc, this.sourceBufferLength);\n this.sourceBufferLength -= consumedSrc;\n }\n\n return true;\n }\n\n floatTo16BitPCM(input) {\n const output = new Int16Array(input.length);\n for (let i = 0; i < input.length; i++) {\n const s = Math.max(-1, Math.min(1, input[i]));\n output[i] = s < 0 ? s * 0x8000 : s * 0x7FFF;\n }\n return output;\n }\n}\n\nregisterProcessor('audio-stream-resampler-processor', AudioStreamResamplerProcessor);\n`;\n\n/**\n * 浏览器端实时音频流重采样器。\n * 基于 AudioWorklet 将麦克风/媒体流转换为 16 kHz、16-bit、单声道 PCM,\n * 并通过回调逐块输出,可选保存完整 PCM 用于后续合并。\n */\nexport class AudioStreamResampler {\n /**\n * @param {object} config\n * @param {function(Int16Array)} config.onData - 收到一个 chunk PCM 数据的回调\n * @param {function(string, string)} [config.onStateChange] - 状态变化回调\n * @param {object} [config.processorOptions] - 传递给 AudioWorklet 的选项\n * @param {boolean} [config.saveFullPcm=false] - 是否在内部保存所有 PCM 用于 stop 时合并(长时间录音建议关闭)\n */\n constructor(config) {\n this.onData = config.onData || (() => {});\n this.onStateChange = config.onStateChange || (() => {});\n this.processorOptions = config.processorOptions || {};\n this.saveFullPcm = config.saveFullPcm ?? false;\n\n this.audioContext = null;\n this.workletNode = null;\n this.source = null;\n this.workletUrl = null;\n this.fullPcmData = this.saveFullPcm ? [] : null;\n\n this.isInitialized = false;\n this.isProcessing = false;\n }\n\n /**\n * 初始化 AudioContext 并加载 AudioWorklet。\n * 完成后状态变为 `\"ready\"`。\n */\n async init() {\n this.onStateChange(\"initializing\", \"正在初始化音频环境...\");\n try {\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)();\n\n const blob = new Blob([AudioStreamResamplerProcessorCode], { type: \"application/javascript\" });\n this.workletUrl = URL.createObjectURL(blob);\n await this.audioContext.audioWorklet.addModule(this.workletUrl);\n\n this.workletNode = new AudioWorkletNode(this.audioContext, \"audio-stream-resampler-processor\", {\n processorOptions: this.processorOptions\n });\n\n this.workletNode.port.onmessage = (event) => {\n const chunk = event.data; // Int16Array\n this.onData(chunk);\n if (this.saveFullPcm) {\n this.fullPcmData.push(chunk);\n }\n };\n\n this.isInitialized = true;\n this.onStateChange(\"ready\", \"音频环境已就绪\");\n } catch (err) {\n console.error(\"AudioStreamResampler init error:\", err);\n this.onStateChange(\"error\", `初始化失败: ${err.message}`);\n }\n }\n\n /**\n * 绑定媒体流,开始实时处理。\n * @param {MediaStream} stream - 通过 getUserMedia 或其他方式获得的流\n */\n setMediaStream(stream) {\n if (!this.isInitialized) {\n console.error(\"请先调用 init()\");\n return;\n }\n\n if (this.source) {\n this.source.disconnect();\n }\n\n this.source = this.audioContext.createMediaStreamSource(stream);\n this.source.connect(this.workletNode);\n // workletNode 默认连接到 destination,可选断开以静音\n // this.workletNode.connect(this.audioContext.destination);\n\n this.isProcessing = true;\n this.onStateChange(\"processing\", \"正在处理音频流...\");\n }\n\n /**\n * 停止处理并释放资源。\n * @param {(fullPcm: Int16Array) => void} [callback] - 若构造时 `saveFullPcm=true`,会把合并后的完整 PCM 通过此回调传出\n */\n stop(callback) {\n if (!this.isProcessing) return;\n\n this.onStateChange(\"stopping\", \"正在停止...\");\n\n if (this.source) {\n this.source.disconnect();\n this.source = null;\n }\n\n this._cleanup();\n\n this.onStateChange(\"stopped\", \"已停止\");\n\n if (this.saveFullPcm && callback && typeof callback === \"function\") {\n const totalLength = this.fullPcmData.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Int16Array(totalLength);\n let offset = 0;\n for (const chunk of this.fullPcmData) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n callback(combined);\n }\n }\n\n _cleanup() {\n if (this.workletNode) {\n this.workletNode.disconnect();\n this.workletNode.port.close();\n this.workletNode = null;\n }\n if (this.audioContext && this.audioContext.state !== \"closed\") {\n this.audioContext.close();\n this.audioContext = null;\n }\n if (this.workletUrl) {\n URL.revokeObjectURL(this.workletUrl);\n this.workletUrl = null;\n }\n\n this.isProcessing = false;\n this.isInitialized = false;\n if (this.fullPcmData) {\n this.fullPcmData.length = 0;\n }\n }\n}\n\n/**\n * 将 16-bit 单声道 PCM 数据封装成标准 WAV Blob。\n *\n * @param {Int16Array} pcmData - PCM 采样数据\n * @param {number} [sampleRate=16000] - 采样率,默认 16 kHz\n * @returns {Blob} audio/wav Blob\n */\nexport function pcmToWavBlob(pcmData, sampleRate = 16000) {\n const length = pcmData.length;\n const buffer = new ArrayBuffer(44 + length * 2);\n const view = new DataView(buffer);\n const writeString = (offset, string) => {\n for (let i = 0; i < string.length; i++) {\n view.setUint8(offset + i, string.charCodeAt(i));\n }\n };\n writeString(0, \"RIFF\");\n view.setUint32(4, 36 + length * 2, true);\n writeString(8, \"WAVE\");\n writeString(12, \"fmt \");\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(36, \"data\");\n view.setUint32(40, length * 2, true);\n let offset = 44;\n for (let i = 0; i < length; i++) {\n view.setInt16(offset, pcmData[i], true);\n offset += 2;\n }\n return new Blob([buffer], { type: \"audio/wav\" });\n}\n","/**\n * 视口尺寸对象。\n * @typedef {Object} ViewportDimensions\n * @property {number} w 视口宽度,单位像素。\n * @property {number} h 视口高度,单位像素。\n */\n\n/**\n * 获取当前视口(viewport)的宽高。\n *\n * 兼容策略:\n * 1. 优先使用 `window.innerWidth/innerHeight`(现代浏览器)。\n * 2. 降级到 `document.documentElement.clientWidth/clientHeight`(IE9+ 及怪异模式)。\n * 3. 最后降级到 `document.body.clientWidth/clientHeight`(IE6-8 怪异模式)。\n *\n * @returns {ViewportDimensions} 包含 `w`(宽度)和 `h`(高度)的对象,单位为像素。\n *\n * @example\n * const { w, h } = getViewportSize();\n * console.log(`视口尺寸:${w} × ${h}`);\n */\nexport function getViewportSize() {\n const d = document,\n root = d.documentElement,\n body = d.body;\n\n return {\n w: window.innerWidth || root.clientWidth || body.clientWidth,\n h: window.innerHeight || root.clientHeight || body.clientHeight\n };\n}\n\n/**\n * 将当前页面 URL 的 query 部分解析成键值对对象。\n *\n * @returns {Record<string, string>} 所有查询参数组成的平凡对象\n * (同名 key 仅保留最后一项)\n */\nexport function getAllSearchParams() {\n const urlSearchParams = new URLSearchParams(location.search);\n return Object.fromEntries(urlSearchParams.entries());\n}\n\n/**\n * 根据 key 获取当前页面 URL 中的单个查询参数。\n *\n * @param {string} key - 要提取的参数名\n * @returns {string | undefined} 对应参数值;不存在时返回 `undefined`\n */\nexport function getSearchParam(key) {\n const params = getAllSearchParams();\n return params[key];\n}\n","//#region 数据类型判断\n\n/**\n * 返回任意值的运行时类型字符串(小写形式)。\n *\n * @param {*} obj 待检测的值\n * @returns {keyof globalThis|\"blob\"|\"file\"|\"formdata\"|string} 小写类型名\n */\nexport function getDataType(obj) {\n return Object.prototype.toString\n .call(obj)\n .replace(/^\\[object\\s(\\w+)\\]$/, \"$1\")\n .toLowerCase();\n}\n\n/**\n * 判断值是否为原生 Blob(含 File)。\n *\n * @param {*} obj - 待检测的值\n * @returns {obj is Blob}\n */\nexport function isBlob(obj) {\n return getDataType(obj) === \"blob\";\n}\n\n/**\n * 判断值是否为**纯粹**的 Object(即 `{}` 或 `new Object()`,不含数组、null、自定义类等)。\n *\n * @param {*} obj - 待检测的值\n * @returns {obj is Record<PropertyKey, any>}\n */\nexport function isPlainObject(obj) {\n return getDataType(obj) === \"object\";\n}\n\n/**\n * 判断值是否为 Promise(含 Promise 子类)。\n *\n * @param {*} obj - 待检测的值\n * @returns {obj is Promise<any>}\n */\nexport function isPromise(obj) {\n return getDataType(obj) === \"promise\";\n}\n\n/**\n * 判断值是否为合法 Date 对象(含 Invalid Date 返回 false)。\n *\n * @param {*} t - 待检测值\n * @returns {t is Date}\n */\nexport function isDate(t) {\n return getDataType(t) === \"date\";\n}\n\n/**\n * 判断值是否为函数(含异步函数、生成器函数、类)。\n *\n * @param {*} obj - 待检测的值\n * @returns {obj is Function}\n */\nexport function isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * 判断值是否为**非空**字符串。\n *\n * @param {*} obj - 待检测的值\n * @returns {obj is string}\n */\nexport function isNonEmptyString(obj) {\n return getDataType(obj) === \"string\" && obj.length > 0;\n}\n\n//#endregion\n\n//#region 随机数据\n\n/**\n * 在闭区间 [min, max] 内生成一个均匀分布的随机整数。\n * 若 min > max 则自动交换。\n *\n * @param {number} min - 整数下界(包含)\n * @param {number} max - 整数上界(包含)\n * @returns {number}\n * @throws {TypeError} 当 min 或 max 不是整数时抛出\n */\nexport function randomIntInRange(min, max) {\n if (!Number.isInteger(min) || !Number.isInteger(max)) {\n throw new TypeError(\"Arguments must be integers\");\n }\n if (min > max) [min, max] = [max, min];\n // 注意加 1,否则 max 永远取不到;Math.floor 保证均匀\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n/**\n * 随机生成一个汉字(可控制范围)。\n *\n * @param {boolean} [base=true] - 是否启用基本区(0x4E00-0x9FA5)\n * @param {boolean} [extA=false] - 是否启用扩展 A 区(0x3400-0x4DBF)\n * @param {boolean} [extBH=false] - 是否启用扩展 B~H 区(0x20000-0x2EBEF,代理对)\n * @returns {string} 单个汉字字符\n * @throws {RangeError} 未启用任何区段时抛出\n */\nexport function randomHan(base = true, extA = false, extBH = false) {\n // 1. 收集已启用的“区段”\n const ranges = [];\n if (base) ranges.push({ min: 0x4e00, max: 0x9fa5, surrogate: false });\n if (extA) ranges.push({ min: 0x3400, max: 0x4dbf, surrogate: false });\n if (extBH) ranges.push({ min: 0x20000, max: 0x2ebef, surrogate: true });\n\n if (ranges.length === 0) {\n throw new RangeError(\"At least one range must be enabled\");\n }\n\n // 2. 按总码位数抽号\n const total = ranges.reduce((sum, r) => sum + (r.max - r.min + 1), 0);\n let n = randomIntInRange(0, total - 1);\n\n // 3. 定位落在哪个区段\n for (const { min, max, surrogate } of ranges) {\n const size = max - min + 1;\n if (n < size) {\n const code = min + n;\n if (!surrogate) return String.fromCharCode(code);\n // 代理对\n const offset = code - 0x10000;\n const hi = (offset >> 10) + 0xd800;\n const lo = (offset & 0x3ff) + 0xdc00;\n return String.fromCharCode(hi, lo);\n }\n n -= size;\n }\n}\n\n/**\n * 随机生成一个英文字母。\n *\n * @param {'lower'|'upper'} [type] - 指定大小写;留空则随机\n * @returns {string} 单个字母\n */\nexport function randomEnLetter(type) {\n const lower = \"abcdefghijklmnopqrstuvwxyz\";\n const upper = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n const randomNum = randomIntInRange(0, 25);\n\n switch (type) {\n case \"lower\":\n return lower[randomNum];\n case \"upper\":\n return upper[randomNum];\n default:\n return (Math.random() < 0.5 ? lower : upper)[randomNum];\n }\n}\n\n/**\n * 生成指定长度的随机“中英混合”字符串。\n *\n * @param {number} [len=1] - 目标长度(≥1,自动取整)\n * @param {number} [zhProb=0.5] - 每个位置选择汉字的概率,默认 0.5\n * @returns {string}\n */\nexport function randomHanOrEn(len, zhProb = 0.5) {\n len = Math.max(1, Math.floor(len));\n const buf = [];\n for (let i = 0; i < len; i++) {\n buf.push(Math.random() < zhProb ? randomHan() : randomEnLetter());\n }\n return buf.join(\"\");\n}\n\n//#endregion\n\n//#region 防抖节流\n\n/**\n * 创建 debounced(防抖)函数。\n * - 默认 trailing 触发;当 `leading=true` 时,首次调用或超过等待间隔会立即执行。\n * - 支持手动取消。\n *\n * @template {(...args: any[]) => any} T\n * @param {T} fn - 要防抖的原始函数\n * @param {number} wait - 防抖等待时间(毫秒)\n * @param {boolean} [leading=false] - 是否启用立即执行(leading edge)\n * @returns {T & { cancel(): void }} 返回经过防抖包装的函数,并附带 `cancel` 方法\n * @throws {TypeError} 当 `fn` 不是函数时抛出\n */\nexport function debounce(fn, wait, leading = false) {\n if (typeof fn !== \"function\") throw new TypeError(\"fn must be function\");\n wait = Math.max(0, Number(wait) || 0);\n let timeoutId;\n let lastCall = 0; // 0 表示从未调用过\n\n function debounced(...args) {\n const isFirst = lastCall === 0;\n const isOverWait = Date.now() - lastCall >= wait;\n\n clearTimeout(timeoutId);\n\n // 首次调用 || 已达到等待间隔\n if (leading && (isFirst || isOverWait)) {\n lastCall = Date.now();\n return fn.apply(this, args);\n }\n\n timeoutId = setTimeout(() => {\n lastCall = Date.now();\n fn.apply(this, args);\n }, wait);\n }\n\n debounced.cancel = () => {\n clearTimeout(timeoutId);\n lastCall = 0; // 恢复初始状态\n };\n\n return debounced;\n}\n\n/**\n * 创建 throttled(节流)函数。\n * 支持 leading/trailing 边缘触发,可手动取消。\n *\n * @template {(...args: any[]) => any} T\n * @param {T} fn - 要节流的原始函数\n * @param {number} wait - 节流间隔(毫秒)\n * @param {object} [options] - 配置项\n * @param {boolean} [options.leading=true] - 是否在 leading 边缘执行\n * @param {boolean} [options.trailing=true] - 是否在 trailing 边缘执行\n * @returns {T & { cancel(): void }} 返回经过节流包装的函数,并附带 `cancel` 方法\n * @throws {TypeError} 当 `fn` 不是函数时抛出\n */\nexport function throttle(fn, wait, { leading = true, trailing = true } = {}) {\n if (typeof fn !== \"function\") throw new TypeError(\"fn must be function\");\n wait = Math.max(0, Number(wait) || 0);\n\n let timeoutId = null,\n lastCall = 0;\n\n function throttled(...args) {\n const remaining = wait - (Date.now() - lastCall);\n\n if (leading && (lastCall === 0 || remaining <= 0)) {\n lastCall = Date.now();\n fn.apply(this, args);\n } else if (trailing && !timeoutId) {\n timeoutId = setTimeout(\n () => {\n timeoutId = null;\n lastCall = Date.now();\n fn.apply(this, args);\n },\n remaining > 0 ? remaining : wait\n );\n }\n }\n\n throttled.cancel = () => {\n clearTimeout(timeoutId);\n timeoutId = null;\n lastCall = 0;\n };\n\n return throttled;\n}\n\n//#endregion\n\n/**\n * 利用 JSON 序列化/反序列化实现**深拷贝**。\n * 注意:会丢失 `undefined`、函数、循环引用、特殊包装对象等。\n *\n * @template T\n * @param {T} obj - 待拷贝的 JSON 兼容值\n * @returns {T} 深拷贝后的值\n */\nexport function deepCloneByJSON(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * **安全**地将源对象中**已存在**的属性赋值到目标对象。\n * 不会新增键,也不会复制原型链上的属性。\n *\n * @template {Record<PropertyKey, any>} T\n * @param {T} target - 目标对象(将被就地修改)\n * @param {...Partial<T>} sources - 一个或多个源对象\n * @returns {T} 修改后的目标对象(即第一个参数本身)\n *\n * @example\n * const defaults = { a: 1, b: 2 };\n * assignExisting(defaults, { a: 9, c: 99 }); // defaults 变为 { a: 9, b: 2 }\n */\nexport function assignExisting(target, ...sources) {\n sources.forEach((source) => {\n Object.keys(source).forEach((key) => {\n if (target.hasOwnProperty(key)) {\n target[key] = source[key];\n }\n });\n });\n return target;\n}\n\n/**\n * 提取任意函数(含箭头函数、普通函数、async、class 构造器)的形参名称列表。\n * 通过源码正则解析,不支持解构参数、默认参数、剩余参数等复杂语法;\n * 若出现上述场景将返回空数组或部分名称。\n *\n * @param {Function} fn - 目标函数\n * @returns {string[]} 按声明顺序排列的参数名数组;解析失败时返回空数组\n *\n * @example\n * getFunctionArgNames(function (a, b) {}) // [\"a\", \"b\"]\n * getFunctionArgNames((foo, bar) => {}) // [\"foo\", \"bar\"]\n * getFunctionArgNames(async function x({a} = {}) {}) // [] (解构无法识别)\n */\nexport function getFunctionArgNames(fn) {\n const FN_ARG_SPLIT = /,/,\n FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/,\n FN_ARGS = /^[^(]*\\(\\s*([^)]*)\\)/m,\n ARROW_ARG = /^([^(]+?)=>/,\n STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\n const fnText = Function.prototype.toString.call(fn).replace(STRIP_COMMENTS, \"\");\n const argDecl = fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);\n const retArgNames = [];\n [].forEach.call(argDecl[1].split(FN_ARG_SPLIT), function (arg) {\n arg.replace(FN_ARG, function (all, underscore, name) {\n retArgNames.push(name);\n });\n });\n return retArgNames;\n}\n\n/**\n * 将 Blob(或 File)读取为文本,并可选择自动执行 `JSON.parse`。\n * 当 `isParse=true` 且内容非法 JSON 时,会回退为返回原始文本。\n *\n * @param {Blob} blob - 待读取的 Blob/File 对象\n * @param {boolean} [isParse=true] - 是否尝试将结果按 JSON 解析\n * @returns {Promise<string | any>} 解析后的 JSON 对象或原始文本\n *\n * @example\n * const json = await readBlobAsText(blob); // 自动 JSON.parse\n * const text = await readBlobAsText(blob, false); // 仅返回文本\n */\nexport function readBlobAsText(blob, isParse = true) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (evt) => {\n const result = evt.target.result;\n if (isParse) {\n try {\n resolve(JSON.parse(result));\n } catch (error) {\n console.error(error);\n resolve(result);\n }\n } else {\n resolve(result);\n }\n };\n reader.onerror = reject;\n reader.readAsText(blob);\n });\n}\n","/**\n * 将任意值安全转换为 Date 对象。\n * - 数字/数字字符串:视为时间戳\n * - 字符串:尝试按 ISO/RFC 格式解析\n * - 对象:优先 valueOf(),再 toString()\n * - null / undefined / 无效值:返回 null\n *\n * @param {*} val - 待转换值\n * @returns {Date | null} 有效 Date 或 null\n */\nexport function toDate(val) {\n if (val == null) return null; // null / undefined\n if (val instanceof Date) return isNaN(val) ? null : val; // 已是 Date,但需排除 Invalid Date\n\n // 1. 数字或数字字符串 → 时间戳\n if (typeof val === \"number\" || (typeof val === \"string\" && /^-?\\d+(\\.\\d+)?$/.test(val.trim()))) {\n const d = new Date(+val);\n return isNaN(d) ? null : d;\n }\n\n // 2. 标准 ISO 8601 / RFC 2825 等合法字符串\n if (typeof val === \"string\") {\n const d = new Date(val);\n return isNaN(d) ? null : d; // 非法格式返回 null\n }\n\n // 3. 对象带 valueOf / toString\n if (typeof val === \"object\") {\n // 优先调用 valueOf(期望返回数字时间戳)\n const prim = val.valueOf ? val.valueOf() : Object.prototype.valueOf.call(val);\n if (typeof prim === \"number\" && !isNaN(prim)) {\n const d = new Date(prim);\n return isNaN(d) ? null : d;\n }\n // 兜底用字符串\n const str = val.toString ? val.toString() : String(val);\n const d = new Date(str);\n return isNaN(d) ? null : d;\n }\n\n // 4. 其余情况\n return null;\n}\n\n/**\n * 在闭区间 [date1, date2] 内随机生成一个日期(含首尾)。\n * 若顺序相反则自动交换。\n *\n * @param {Date} date1 - 起始日期\n * @param {Date} date2 - 结束日期\n * @returns {Date} 随机日期\n */\nexport function randomDateInRange(date1, date2) {\n let v1 = date1.getTime(),\n v2 = date2.getTime();\n if (v1 > v2) [v1, v2] = [v2, v1];\n return new Date(v1 + Math.floor(Math.random() * (v2 - v1 + 1)));\n}\n\n/**\n * 计算两个时间之间的剩余/已过时长(天-时-分-秒),返回带补零的展示对象。\n *\n * @param {string|number|Date} originalTime - 原始时间(可转 Date 的任意值)\n * @param {Date} [currentTime=new Date()] - 基准时间,默认当前\n * @returns {{days:number,hours:string,minutes:string,seconds:string}}\n */\nexport function calcTimeDifference(originalTime, currentTime = new Date()) {\n // 计算时间差(毫秒)\n const diffMs = currentTime - new Date(originalTime);\n\n // 转换为天、小时、分钟、秒\n const diffSeconds = Math.floor(diffMs / 1000);\n const days = Math.floor(diffSeconds / (3600 * 24));\n const hours = Math.floor((diffSeconds % (3600 * 24)) / 3600);\n const minutes = Math.floor((diffSeconds % 3600) / 60);\n const seconds = diffSeconds % 60;\n\n const padZero = (num) => String(num).padStart(2, \"0\");\n\n return {\n days,\n hours: padZero(hours),\n minutes: padZero(minutes),\n seconds: padZero(seconds)\n };\n}\n\n/**\n * 将总秒数格式化成人类可读的时间段文本。\n * 固定进制:1 年=365 天,1 月=30 天。\n *\n * @param {number} totalSeconds - 非负总秒数\n * @param {object} [options] - 格式化选项\n * @param {Partial<{year:string,month:string,day:string,hour:string,minute:string,second:string}>} [options.labels] - 各单位的自定义文本\n * @param {('year'|'month'|'day'|'hour'|'minute'|'second')} [options.maxUnit] - 最大输出单位\n * @param {('year'|'month'|'day'|'hour'|'minute'|'second')} [options.minUnit] - 最小输出单位\n * @param {boolean} [options.showZero] - 是否强制显示 0 秒\n * @returns {string} 拼接后的时长文本,如“1天 02小时 30分钟”\n * @throws {TypeError} 当 totalSeconds 为非数字或负数时抛出\n */\nexport function formatDuration(totalSeconds, options = {}) {\n if (typeof totalSeconds !== \"number\" || totalSeconds < 0 || !isFinite(totalSeconds)) {\n throw new TypeError(\"totalSeconds 必须是非负数字\");\n }\n\n // 1. 默认中文单位\n const DEFAULT_LABELS = {\n year: \"年\",\n month: \"月\",\n day: \"天\",\n hour: \"小时\",\n minute: \"分钟\",\n second: \"秒\"\n };\n\n // 2. 固定进制表(秒)\n const UNIT_TABLE = [\n { key: \"year\", seconds: 365 * 24 * 3600 },\n { key: \"month\", seconds: 30 * 24 * 3600 },\n { key: \"day\", seconds: 24 * 3600 },\n { key: \"hour\", seconds: 3600 },\n { key: \"minute\", seconds: 60 },\n { key: \"second\", seconds: 1 }\n ];\n\n // 3. 合并用户自定义文本\n const labels = Object.assign({}, DEFAULT_LABELS, options.labels);\n\n // 4. 根据 maxUnit / minUnit 截取\n let start = 0,\n end = UNIT_TABLE.length;\n if (options.maxUnit) {\n const idx = UNIT_TABLE.findIndex((u) => u.key === options.maxUnit);\n if (idx !== -1) start = idx;\n }\n if (options.minUnit) {\n const idx = UNIT_TABLE.findIndex((u) => u.key === options.minUnit);\n if (idx !== -1) end = idx + 1;\n }\n const units = UNIT_TABLE.slice(start, end);\n if (!units.length) units.push(UNIT_TABLE[UNIT_TABLE.length - 1]); // 保底秒\n\n // 5. 逐级计算\n let rest = Math.floor(totalSeconds);\n const parts = [];\n\n for (const { key, seconds } of units) {\n const val = Math.floor(rest / seconds);\n rest %= seconds;\n\n const shouldShow = val > 0 || (options.showZero && key === \"second\");\n if (shouldShow || (parts.length === 0 && rest === 0)) {\n parts.push(`${val}${labels[key]}`);\n }\n }\n\n // 6. 兜底\n if (parts.length === 0) {\n parts.push(`0${labels[units[units.length - 1].key]}`);\n }\n\n return parts.join(\"\");\n}\n\n/**\n * 快捷调用 {@link formatDuration},最大单位到“天”。\n *\n * @param {number} totalSeconds\n * @param {Omit<Parameters<typeof formatDuration>[1],'maxUnit'>} [options]\n * @returns {string}\n */\nexport function formatDurationMaxDay(totalSeconds, options = {}) {\n return formatDuration(totalSeconds, { ...options, maxUnit: \"day\" });\n}\n\n/**\n * 快捷调用 {@link formatDuration},最大单位到“小时”。\n *\n * @param {number} totalSeconds\n * @param {Omit<Parameters<typeof formatDuration>[1],'maxUnit'>} [options]\n * @returns {string}\n */\nexport function formatDurationMaxHour(totalSeconds, options = {}) {\n return formatDuration(totalSeconds, { ...options, maxUnit: \"hour\" });\n}\n","/**\n * 通过动态创建 `<a>` 标签触发浏览器下载。\n * 注意:此方法可能无法强制下载浏览器原生支持的文件(如图片、PDF),浏览器可能会选择直接打开。\n *\n * @param {string} url - 任意可下载地址(同源或允许跨域)\n * @param {string} [fileName] - 保存到本地的文件名;不传时使用时间戳\n */\nexport function downloadByUrl(url, fileName) {\n const a = document.createElement(\"a\");\n a.style.display = \"none\";\n a.rel = \"noopener\";\n a.href = url;\n a.download = fileName || Date.now();\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/**\n * 把 Blob 转成临时 URL 并触发下载,下载完成后立即释放内存。\n *\n * @param {Blob} blob - 待下载的 Blob(含 File)\n * @param {string} [fileName] - 保存到本地的文件名\n */\nexport function downloadByBlob(blob, fileName) {\n const url = URL.createObjectURL(blob);\n downloadByUrl(url, fileName);\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n\n/**\n * 将任意数据包装成 Blob 并下载。\n *\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - 要写入文件的数据\n * @param {string} [fileName] - 保存到本地的文件名\n * @param {string} [mimeType] - MIME 类型;默认 `application/octet-stream`\n */\nexport function downloadByData(data, fileName, mimeType = \"application/octet-stream\") {\n downloadByBlob(new Blob([data], { type: mimeType }), fileName);\n}\n\n/**\n * 快捷下载 Excel 文件(MIME 已固定)。\n *\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - Excel 二进制或字符串内容\n * @param {string} [fileName] - 保存到本地的文件名\n */\nexport function downloadExcel(data, fileName) {\n downloadByData(data, fileName, \"application/vnd.ms-excel\");\n}\n\n/**\n * 快捷下载 JSON 文件(MIME 已固定)。\n * 若传入非字符串数据,会自行 `JSON.stringify`。\n *\n * @param {any} data - 要序列化的 JSON 数据\n * @param {string} [fileName] - 保存到本地的文件名\n */\nexport function downloadJSON(data, fileName) {\n // downloadByData(typeof data === \"string\" ? data : JSON.stringify(data, null, 4), fileName, \"application/json\");\n downloadByData(data, fileName, \"application/json\");\n}\n\n/**\n * 通过 `fetch` 获取资源并强制下载,避免浏览器直接打开文件。\n * 此方法适用于下载图片、PDF 等浏览器默认会打开的文件类型。\n * 如果 `fetch` 失败(如 CORS 策略阻止),会回退到 `downloadByUrl` 方法作为备选方案。\n *\n * @param {string} url - 文件的 URL 地址\n * @param {string} [fileName] - 保存到本地的文件名。如果不提供,会尝试从 URL 中自动提取\n * @returns {Promise<void>} 返回一个 Promise,在下载开始或失败后 resolve\n */\nexport async function fetchOrDownloadByUrl(url, fileName) {\n // 如果未提供文件名,尝试从 URL 路径中提取\n if (!fileName) {\n try {\n const urlPathname = new URL(url).pathname;\n // 获取路径的最后一部分作为文件名,并移除可能的查询参数\n fileName = urlPathname.substring(urlPathname.lastIndexOf(\"/\") + 1).split(\"?\")[0];\n } catch (e) {}\n // 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳\n if (!fileName) {\n fileName = Date.now().toString();\n }\n }\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n mode: \"cors\",\n cache: \"no-cache\"\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! ${response.status}: ${response.statusText}`);\n }\n\n const blob = await response.blob();\n downloadByBlob(blob, fileName);\n } catch (error) {\n downloadByUrl(url, fileName);\n }\n}\n","/**\n * 简单、高性能的通用事件总线。\n * - 支持命名空间事件\n * - 支持一次性监听器\n * - 返回唯一 flag,用于精确卸载\n * - emit 时可选自定义 this 指向\n */\nexport class MyEvent {\n constructor() {\n this.evtPool = new Map();\n }\n\n /**\n * 注册事件监听器。\n * @param {string} name - 事件名\n * @param {Function} fn - 回调函数\n * @returns {string} flag - 唯一标识,用于 off\n */\n on(name, fn) {\n let flag = Date.now() + \"_\" + parseInt(Math.random() * 1e8);\n const evtItem = {\n flag,\n fn\n };\n if (this.evtPool.has(name)) {\n this.evtPool.get(name).push(evtItem);\n } else {\n this.evtPool.set(name, [evtItem]);\n }\n return flag;\n }\n\n /**\n * 注册一次性监听器,触发后自动移除。\n * @param {string} name - 事件名\n * @param {Function} fn - 回调函数\n * @returns {string} flag - 唯一标识\n */\n once(name, fn) {\n const _this = this;\n let wrapper;\n wrapper = function (data) {\n _this.off(name, wrapper);\n fn.call(this, data);\n };\n return this.on(name, wrapper);\n }\n\n /**\n * 移除指定事件监听器。\n * @param {string} name - 事件名\n * @param {Function|string} fnOrFlag - 回调函数或 flag\n */\n off(name, fnOrFlag) {\n if (!this.evtPool.has(name)) return;\n const evtItems = this.evtPool.get(name);\n const filtered = evtItems.filter((item) => item.fn !== fnOrFlag && item.flag !== fnOrFlag);\n if (filtered.length === 0) {\n this.evtPool.delete(name);\n } else {\n this.evtPool.set(name, filtered);\n }\n }\n\n /**\n * 触发事件(同步执行)。\n * @param {string} name - 事件名\n * @param {*} [data] - 任意载荷\n * @param {*} [fnThis] - 回调内部 this 指向,默认 undefined\n */\n emit(name, data, fnThis) {\n if (!this.evtPool.has(name)) return;\n const evtItems = this.evtPool.get(name);\n evtItems.forEach((item) => {\n try {\n item.fn.call(fnThis, data);\n } catch (err) {\n console.error(`Error in event listener for \"${name}\":`, err);\n }\n });\n }\n}\n\n/**\n * 跨页通信插件:通过 localStorage + storage 事件将当前实例的 emit 广播到其他同源页面。\n * 支持节流、命名空间隔离。\n */\nexport const MyEvent_CrossPagePlugin = (() => {\n const INSTALLED = new WeakSet(); // 防止重复安装\n\n return {\n /**\n * 为指定 MyEvent 实例安装跨页插件。\n * @param {MyEvent} bus - 事件总线实例\n * @param {Options} [opts] - 配置项\n */\n install(bus, opts = {}) {\n if (INSTALLED.has(bus)) return;\n INSTALLED.add(bus);\n\n const ns = `___my-event-cross-page-${opts.namespace || \"default\"}___`;\n const delay = opts.throttle || 16;\n let last = 0;\n\n // 1、重写 emit\n const rawEmit = bus.emit;\n bus.emit = function (name, data, fnThis) {\n rawEmit.call(bus, name, data, fnThis); // 本地先执行\n const now = Date.now();\n if (now - last < delay) return;\n last = now;\n const key = ns + name;\n try {\n localStorage.setItem(key, JSON.stringify({ name, data, ts: now }));\n localStorage.removeItem(key); // 触发 storage 事件\n } catch (e) {}\n };\n\n // 2、监听其他页广播\n function onStorageHandler(e) {\n if (!e.key || !e.key.startsWith(ns)) return;\n let payload;\n try {\n payload = JSON.parse(e.newValue || \"{}\");\n } catch {\n return;\n }\n if (!payload.ts || payload.ts <= last) return;\n rawEmit.call(bus, e.key.slice(ns.length), payload.data); // 仅本地\n }\n addEventListener(\"storage\", onStorageHandler);\n\n // 3、保存卸载器\n bus._uninstallCrossPage = () => {\n removeEventListener(\"storage\", onStorageHandler);\n bus.emit = rawEmit;\n INSTALLED.delete(bus);\n };\n },\n\n /**\n * 卸载插件,恢复原始 emit 并停止监听。\n * @param {MyEvent} bus - 事件总线实例\n */\n uninstall(bus) {\n if (typeof bus._uninstallCrossPage === \"function\") bus._uninstallCrossPage();\n }\n };\n})();\n","/**\n * 生成 RFC4122 版本 4 的 GUID/UUID。\n * 收集来源:《基于mvc的javascript web富应用开发》 书中介绍是Robert Kieffer写的,还留了网址 http://goo.gl/0b0hu ,但实际访问不了。\n * 格式:`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`\n *\n * @returns {string} 36 位大写 GUID\n *\n * @example\n * // A2E0F340-6C3B-4D7F-B8C1-1E4F6A8B9C0D\n * console.log(getGUID())\n */\nexport function getGUID() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n let r = (Math.random() * 16) | 0,\n v = c == \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16).toUpperCase();\n });\n}\n\n/**\n * 分布式短 ID 生成器。\n * 格式:`${timestamp}${flag}${serial}`,其中:\n * - timestamp:毫秒级时间戳\n * - flag:客户端标识串(自定义)\n * - serial:同一毫秒内的序号,左补零到固定长度\n */\nexport class MyId {\n #ts = Date.now(); //\t时间戳\n #sn = 0; //\t序号(保证同一客户端之间的唯一项)\n #flag = \"\"; //\t客户端标识(保证不同客户端之间的唯一项)\n #len = 5; //\t序号位长度(我的电脑测试,同一时间戳内可以for循环执行了1000次左右,没有一次超过3k,所以5位应该够用了)\n // 测试代码\n // let obj = {[Date.now()]:[]}; try { for (let i = 0; i < 100000; i++) { obj[Date.now()].push(i); } } catch { console.log(obj[Object.getOwnPropertyNames(obj)[0]].length); }\n\n /**\n * @param {object} [option]\n * @param {string} [option.flag] - 客户端标识,默认空串\n * @param {number} [option.len=5] - 序号位长度(位数),安全范围 ≥0\n */\n constructor(option = {}) {\n if (option) {\n if (typeof option.flag === \"string\") {\n this.#flag = option.flag;\n }\n if (Number.isSafeInteger(option.len) && len >= 0) {\n this.#len = option.len;\n }\n }\n }\n\n /**\n * 生成下一个全局唯一字符串 ID。\n * 同一毫秒序号自动递增;序号溢出时会在控制台警告。\n * @returns {string}\n */\n nextId() {\n let ts = Date.now();\n if (ts === this.#ts) {\n this.#sn++;\n if (this.#sn >= 10 ** this.#len) {\n console.log(\"长度不够用了!!!\");\n }\n } else {\n this.#sn = 0;\n this.#ts = ts;\n }\n return ts.toString() + this.#flag + this.#sn.toString().padStart(this.#len, \"0\");\n }\n}\n","/**\n * 基于 `setTimeout` 的“间隔循环”定时器。\n * 每次任务执行完成后才计算下一次间隔,避免任务堆积。\n */\nexport class IntervalTimer {\n /**\n * 创建定时器实例。\n * @param {() => void} fn - 每次间隔要执行的业务函数\n * @param {number} [ms=1000] - 间隔时间(毫秒)\n * @throws {TypeError} 当 `fn` 不是函数时抛出\n */\n constructor(fn, ms = 1000) {\n if (typeof fn !== \"function\") {\n throw new TypeError(\"IntervalTimer: 必须传入一个函数\");\n }\n this._fn = fn;\n this._ms = ms;\n this._timerId = null;\n }\n\n /**\n * 启动定时器;若已启动则先停止再重新启动。\n * 首次执行会立即触发。\n */\n start() {\n this.stop();\n const loop = () => {\n this._fn(); // 执行业务\n this._timerId = setTimeout(loop, this._ms);\n };\n loop(); // 立即执行第一次\n }\n\n /**\n * 停止定时器。\n */\n stop() {\n if (this._timerId !== null) {\n clearTimeout(this._timerId);\n this._timerId = null;\n }\n }\n\n /**\n * 查询定时器是否正在运行。\n * @returns {boolean}\n */\n isRunning() {\n return this._timerId !== null;\n }\n}\n","/**\n * 把嵌套树拍平成 `{ [id]: node }` 映射,同时把原 `children` 置为 `null`。\n *\n * @template T extends Record<PropertyKey, any>\n * @param {T[]} data - 嵌套树森林\n * @param {string} [idKey='id'] - 主键字段\n * @param {string} [childrenKey='children'] - 子节点字段\n * @returns {Record<string, T & { [k in typeof childrenKey]: null }>} id→节点的映射表\n */\nexport function nestedTree2IdMap(data, idKey = \"id\", childrenKey = \"children\") {\n const retObj = {};\n function fn(nodes) {\n if (Array.isArray(nodes) && nodes.length > 0) {\n nodes.forEach((node) => {\n retObj[node[idKey]] = { ...node };\n retObj[node[idKey]][childrenKey] = null;\n\n fn(node[childrenKey]);\n });\n }\n }\n fn(data);\n return retObj;\n}\n\n/**\n * 把**已包含完整父子关系**的扁平节点列表还原成嵌套树(森林)。\n *\n * @template T extends Record<PropertyKey, any>\n * @param {T[]} nodes - 扁平节点列表(必须包含 id / parentId)\n * @param {number | string} [parentId=0] - 根节点标识值\n * @param {Object} [opts] - 字段映射配置\n * @param {string} [opts.idKey='id'] - 节点主键\n * @param {string} [opts.parentKey='parentId'] - 父节点外键\n * @param {string} [opts.childrenKey='children'] - 存放子节点的字段\n * @returns {(T & { [k in typeof childrenKey]: T[] })[]} 嵌套树森林\n */\nexport function flatCompleteTree2NestedTree(nodes, parentId = 0, { idKey = \"id\", parentKey = \"parentId\", childrenKey = \"children\" } = {}) {\n const map = new Map(); // id -> node\n const items = []; // 多根森林\n\n // 1. 初始化:保证每个节点都有 children,并存入 map\n for (const item of nodes) {\n const node = { ...item, [childrenKey]: [] };\n map.set(item[idKey], node);\n }\n\n // 2. 建立父子关系\n for (const item of nodes) {\n const node = map.get(item[idKey]);\n const parentIdVal = item[parentKey];\n\n if (parentIdVal === parentId) {\n // 根层\n items.push(node);\n } else {\n // 非根层:找到父节点,把自己挂上去\n const parent = map.get(parentIdVal);\n if (parent) parent[childrenKey].push(node);\n // 如果 parent 不存在,说明数据不完整,可自定义处理\n }\n }\n\n return items;\n}\n\n/**\n * 在嵌套树中按 `id` 递归查找节点,并返回其指定属性值。\n *\n * @template T extends Record<PropertyKey, any>\n * @param {string | number} id - 要查找的 id\n * @param {T[]} arr - 嵌套树森林\n * @param {string} [resultKey='name'] - 需要返回的字段\n * @param {string} [idKey='id'] - 主键字段\n * @param {string} [childrenKey='children'] - 子节点字段\n * @returns {any} 找到的值;未找到返回 `undefined`\n */\nexport const findObjAttrValueById = function findObjAttrValueByIdFn(id, arr, resultKey = \"name\", idKey = \"id\", childrenKey = \"children\") {\n if (Array.isArray(arr) && arr.length > 0) {\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n if (item[idKey]?.toString() === id?.toString()) {\n return item[resultKey];\n } else if (Array.isArray(item[childrenKey]) && item[childrenKey].length > 0) {\n const result = findObjAttrValueByIdFn(id, item[childrenKey], resultKey, idKey, childrenKey);\n if (result) {\n return result;\n }\n }\n }\n }\n};\n\n/**\n * 从服务端返回的已选 id 数组里,提取出\n * 1. 叶子节点\n * 2. 所有子节点都被选中的父节点\n * 其余父节点一律丢弃(由前端 Tree 自动算半选)\n *\n * @param {Array} treeData 完整树\n * @param {Array} selectedKeys 后端给的选中 id 数组\n * @param {String} idKey 节点唯一字段\n * @param {String} childrenKey 子节点字段\n * @returns {{checked: string[], halfChecked: string[]}}\n */\nexport function extractFullyCheckedKeys(treeData, selectedKeys, idKey = \"id\", childrenKey = \"children\") {\n const selectedSet = new Set(selectedKeys);\n const checked = new Set();\n const halfChecked = new Set();\n\n /* 返回值含义\n 0 - 未选中\n 1 - 半选\n 2 - 全选\n */\n function dfs(node) {\n const nodeId = node[idKey];\n const children = node[childrenKey] || [];\n\n // 叶子\n if (!children.length) {\n if (selectedSet.has(nodeId)) {\n checked.add(nodeId);\n return 2;\n }\n return 0;\n }\n\n // 非叶子\n let allChecked = true;\n let someChecked = false;\n\n children.forEach((child) => {\n const childState = dfs(child);\n if (childState !== 2) allChecked = false;\n if (childState >= 1) someChecked = true;\n });\n\n // 当前节点本身在 selectedKeys 里,但子节点未全选 → 只能算半选\n if (selectedSet.has(nodeId)) {\n if (allChecked) {\n checked.add(nodeId);\n return 2;\n }\n halfChecked.add(nodeId);\n return 1;\n }\n\n // 当前节点不在 selectedKeys 里,看子节点\n if (allChecked) {\n checked.add(nodeId);\n return 2;\n }\n if (someChecked) {\n halfChecked.add(nodeId);\n return 1;\n }\n return 0;\n }\n\n treeData.forEach(dfs);\n return {\n checked: [...checked],\n halfChecked: [...halfChecked]\n };\n}\n","/**\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":"a2bei4.utils.cjs.js","sources":["../src/source/arr.js","../src/source/audio.js","../src/source/browser.js","../src/source/common.js","../src/source/date.js","../src/source/download.js","../src/source/evt.js","../src/source/id.js","../src/source/timer.js","../src/source/tree.js","../src/source/webSocket.js"],"sourcesContent":["/**\n * 使用 Fisher-Yates 算法对数组 **原地** 随机乱序。\n * @template T\n * @param {T[]} arr - 要乱序的数组\n * @returns {T[]} 返回传入的同一数组实例(已乱序)\n */\nexport function shuffle(arr) {\n // 方式一:\n // arr.sort(() => Math.random() - 0.5);\n // 方式二:\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [arr[i], arr[j]] = [arr[j], arr[i]];\n }\n return arr;\n}\n\n/**\n * 将数组中的元素从 `fromIndex` 移动到 `toIndex`,**原地** 修改并返回该数组。\n * @template T\n * @param {T[]} arr - 要操作的数组\n * @param {number} fromIndex - 原始下标\n * @param {number} toIndex - 目标下标\n * @returns {T[]} 返回传入的同一数组实例\n */\nexport function moveItem(arr, fromIndex, toIndex) {\n arr.splice(toIndex, 0, arr.splice(fromIndex, 1)[0]);\n}\n","const AudioStreamResamplerProcessorCode = `\nclass AudioStreamResamplerProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super();\n const config = options.processorOptions || {};\n this.targetSampleRate = config.targetSampleRate || 16000;\n this.sourceSampleRate = sampleRate;\n this.downsampleRatio = this.sourceSampleRate / this.targetSampleRate;\n\n // 16000Hz 用 60ms chunk (960 samples),其他用 1024\n this.chunkSize = this.targetSampleRate === 16000 ? 960 : 1024;\n\n const sourceBufferSize = config.sourceBufferSize || 16384; // ~340ms @48kHz\n const pcmBufferSize = config.pcmBufferSize || (this.chunkSize * 10); // 更大缓冲,减少溢出概率\n\n this.sourceBuffer = new Float32Array(sourceBufferSize);\n this.sourceBufferLength = 0;\n\n this.pcmBuffer = new Int16Array(pcmBufferSize);\n this.pcmBufferIndex = 0;\n }\n\n process(inputs, outputs, parameters) {\n const input = inputs[0];\n if (!input || input.length === 0 || input[0].length === 0) return true;\n const inputChannel = input[0];\n\n // 1. 写入源缓冲区(溢出时覆盖最旧数据)\n const newLength = this.sourceBufferLength + inputChannel.length;\n if (newLength > this.sourceBuffer.length) {\n const overflow = newLength - this.sourceBuffer.length;\n this.sourceBuffer.copyWithin(0, overflow);\n this.sourceBufferLength = this.sourceBuffer.length - inputChannel.length;\n }\n this.sourceBuffer.set(inputChannel, this.sourceBufferLength);\n this.sourceBufferLength += inputChannel.length;\n\n // 2. 计算可降采样样本数\n const availableOutputSamples = Math.floor(this.sourceBufferLength / this.downsampleRatio);\n if (availableOutputSamples === 0) return true;\n\n // 3. 线性插值降采样\n const downsampled = new Float32Array(availableOutputSamples);\n for (let i = 0; i < availableOutputSamples; i++) {\n const srcIndex = i * this.downsampleRatio;\n const srcIndexInt = Math.floor(srcIndex);\n const fraction = srcIndex - srcIndexInt;\n const val0 = this.sourceBuffer[srcIndexInt];\n const val1 = srcIndexInt + 1 < this.sourceBufferLength ? this.sourceBuffer[srcIndexInt + 1] : val0;\n downsampled[i] = val0 + (val1 - val0) * fraction;\n }\n\n // 4. Float32 → Int16 PCM\n const pcmData = this.floatTo16BitPCM(downsampled);\n\n // 5. 写入 PCM 缓冲区(空间不足时直接覆盖最旧,缓冲区足够大基本不会触发)\n if (this.pcmBufferIndex + pcmData.length > this.pcmBuffer.length) {\n // 简单策略:从头覆盖(丢弃最旧数据)\n this.pcmBufferIndex = 0;\n }\n this.pcmBuffer.set(pcmData, this.pcmBufferIndex);\n this.pcmBufferIndex += pcmData.length;\n\n // 6. 发送所有完整的 chunk(关键:复制到新数组再转移)\n while (this.pcmBufferIndex >= this.chunkSize) {\n // 方法1:推荐,使用 slice(隐式复制到新 ArrayBuffer)\n const chunk = this.pcmBuffer.slice(0, this.chunkSize);\n\n // 方法2:等价写法\n // const chunk = new Int16Array(this.pcmBuffer.subarray(0, this.chunkSize));\n\n this.port.postMessage(chunk, [chunk.buffer]); // 转移新缓冲区,安全!\n\n // 移动剩余数据到开头\n this.pcmBuffer.copyWithin(0, this.chunkSize, this.pcmBufferIndex);\n this.pcmBufferIndex -= this.chunkSize;\n }\n\n // 7. 清理已消费的源数据\n const consumedSrc = Math.floor(availableOutputSamples * this.downsampleRatio + 0.5); // 四舍五入更准\n if (consumedSrc > 0) {\n this.sourceBuffer.copyWithin(0, consumedSrc, this.sourceBufferLength);\n this.sourceBufferLength -= consumedSrc;\n }\n\n return true;\n }\n\n floatTo16BitPCM(input) {\n const output = new Int16Array(input.length);\n for (let i = 0; i < input.length; i++) {\n const s = Math.max(-1, Math.min(1, input[i]));\n output[i] = s < 0 ? s * 0x8000 : s * 0x7FFF;\n }\n return output;\n }\n}\n\nregisterProcessor('audio-stream-resampler-processor', AudioStreamResamplerProcessor);\n`;\n\n/**\n * 浏览器端实时音频流重采样器。\n * 基于 AudioWorklet 将麦克风/媒体流转换为 16 kHz、16-bit、单声道 PCM,\n * 并通过回调逐块输出,可选保存完整 PCM 用于后续合并。\n */\nexport class AudioStreamResampler {\n /**\n * @param {object} config\n * @param {function(Int16Array)} config.onData - 收到一个 chunk PCM 数据的回调\n * @param {function(string, string)} [config.onStateChange] - 状态变化回调\n * @param {object} [config.processorOptions] - 传递给 AudioWorklet 的选项\n * @param {boolean} [config.saveFullPcm=false] - 是否在内部保存所有 PCM 用于 stop 时合并(长时间录音建议关闭)\n */\n constructor(config) {\n this.onData = config.onData || (() => {});\n this.onStateChange = config.onStateChange || (() => {});\n this.processorOptions = config.processorOptions || {};\n this.saveFullPcm = config.saveFullPcm ?? false;\n\n this.audioContext = null;\n this.workletNode = null;\n this.source = null;\n this.workletUrl = null;\n this.fullPcmData = this.saveFullPcm ? [] : null;\n\n this.isInitialized = false;\n this.isProcessing = false;\n }\n\n /**\n * 初始化 AudioContext 并加载 AudioWorklet。\n * 完成后状态变为 `\"ready\"`。\n */\n async init() {\n this.onStateChange(\"initializing\", \"正在初始化音频环境...\");\n try {\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)();\n\n const blob = new Blob([AudioStreamResamplerProcessorCode], { type: \"application/javascript\" });\n this.workletUrl = URL.createObjectURL(blob);\n await this.audioContext.audioWorklet.addModule(this.workletUrl);\n\n this.workletNode = new AudioWorkletNode(this.audioContext, \"audio-stream-resampler-processor\", {\n processorOptions: this.processorOptions\n });\n\n this.workletNode.port.onmessage = (event) => {\n const chunk = event.data; // Int16Array\n this.onData(chunk);\n if (this.saveFullPcm) {\n this.fullPcmData.push(chunk);\n }\n };\n\n this.isInitialized = true;\n this.onStateChange(\"ready\", \"音频环境已就绪\");\n } catch (err) {\n console.error(\"AudioStreamResampler init error:\", err);\n this.onStateChange(\"error\", `初始化失败: ${err.message}`);\n }\n }\n\n /**\n * 绑定媒体流,开始实时处理。\n * @param {MediaStream} stream - 通过 getUserMedia 或其他方式获得的流\n */\n setMediaStream(stream) {\n if (!this.isInitialized) {\n console.error(\"请先调用 init()\");\n return;\n }\n\n if (this.source) {\n this.source.disconnect();\n }\n\n this.source = this.audioContext.createMediaStreamSource(stream);\n this.source.connect(this.workletNode);\n // workletNode 默认连接到 destination,可选断开以静音\n // this.workletNode.connect(this.audioContext.destination);\n\n this.isProcessing = true;\n this.onStateChange(\"processing\", \"正在处理音频流...\");\n }\n\n /**\n * 停止处理并释放资源。\n * @param {(fullPcm: Int16Array) => void} [callback] - 若构造时 `saveFullPcm=true`,会把合并后的完整 PCM 通过此回调传出\n */\n stop(callback) {\n if (!this.isProcessing) return;\n\n this.onStateChange(\"stopping\", \"正在停止...\");\n\n if (this.source) {\n this.source.disconnect();\n this.source = null;\n }\n\n this._cleanup();\n\n this.onStateChange(\"stopped\", \"已停止\");\n\n if (this.saveFullPcm && callback && typeof callback === \"function\") {\n const totalLength = this.fullPcmData.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Int16Array(totalLength);\n let offset = 0;\n for (const chunk of this.fullPcmData) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n callback(combined);\n }\n }\n\n _cleanup() {\n if (this.workletNode) {\n this.workletNode.disconnect();\n this.workletNode.port.close();\n this.workletNode = null;\n }\n if (this.audioContext && this.audioContext.state !== \"closed\") {\n this.audioContext.close();\n this.audioContext = null;\n }\n if (this.workletUrl) {\n URL.revokeObjectURL(this.workletUrl);\n this.workletUrl = null;\n }\n\n this.isProcessing = false;\n this.isInitialized = false;\n if (this.fullPcmData) {\n this.fullPcmData.length = 0;\n }\n }\n}\n\n/**\n * 将 16-bit 单声道 PCM 数据封装成标准 WAV Blob。\n *\n * @param {Int16Array} pcmData - PCM 采样数据\n * @param {number} [sampleRate=16000] - 采样率,默认 16 kHz\n * @returns {Blob} audio/wav Blob\n */\nexport function pcmToWavBlob(pcmData, sampleRate = 16000) {\n const length = pcmData.length;\n const buffer = new ArrayBuffer(44 + length * 2);\n const view = new DataView(buffer);\n const writeString = (offset, string) => {\n for (let i = 0; i < string.length; i++) {\n view.setUint8(offset + i, string.charCodeAt(i));\n }\n };\n writeString(0, \"RIFF\");\n view.setUint32(4, 36 + length * 2, true);\n writeString(8, \"WAVE\");\n writeString(12, \"fmt \");\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(36, \"data\");\n view.setUint32(40, length * 2, true);\n let offset = 44;\n for (let i = 0; i < length; i++) {\n view.setInt16(offset, pcmData[i], true);\n offset += 2;\n }\n return new Blob([buffer], { type: \"audio/wav\" });\n}\n","/**\n * 视口尺寸对象。\n * @typedef {Object} ViewportDimensions\n * @property {number} w 视口宽度,单位像素。\n * @property {number} h 视口高度,单位像素。\n */\n\n/**\n * 获取当前视口(viewport)的宽高。\n *\n * 兼容策略:\n * 1. 优先使用 `window.innerWidth/innerHeight`(现代浏览器)。\n * 2. 降级到 `document.documentElement.clientWidth/clientHeight`(IE9+ 及怪异模式)。\n * 3. 最后降级到 `document.body.clientWidth/clientHeight`(IE6-8 怪异模式)。\n *\n * @returns {ViewportDimensions} 包含 `w`(宽度)和 `h`(高度)的对象,单位为像素。\n *\n * @example\n * const { w, h } = getViewportSize();\n * console.log(`视口尺寸:${w} × ${h}`);\n */\nexport function getViewportSize() {\n const d = document,\n root = d.documentElement,\n body = d.body;\n\n return {\n w: window.innerWidth || root.clientWidth || body.clientWidth,\n h: window.innerHeight || root.clientHeight || body.clientHeight\n };\n}\n\n/**\n * 将当前页面 URL 的 query 部分解析成键值对对象。\n *\n * @returns {Record<string, string>} 所有查询参数组成的平凡对象\n * (同名 key 仅保留最后一项)\n */\nexport function getAllSearchParams() {\n const urlSearchParams = new URLSearchParams(location.search);\n return Object.fromEntries(urlSearchParams.entries());\n}\n\n/**\n * 根据 key 获取当前页面 URL 中的单个查询参数。\n *\n * @param {string} key - 要提取的参数名\n * @returns {string | undefined} 对应参数值;不存在时返回 `undefined`\n */\nexport function getSearchParam(key) {\n const params = getAllSearchParams();\n return params[key];\n}\n","//#region 数据类型判断\n\n/**\n * 返回任意值的运行时类型字符串(小写形式)。\n *\n * @param {*} obj 待检测的值\n * @returns {keyof globalThis|\"blob\"|\"file\"|\"formdata\"|string} 小写类型名\n */\nexport function getDataType(obj) {\n return Object.prototype.toString\n .call(obj)\n .replace(/^\\[object\\s(\\w+)\\]$/, \"$1\")\n .toLowerCase();\n}\n\n/**\n * 判断值是否为原生 Blob(含 File)。\n *\n * @param {*} obj - 待检测的值\n * @returns {obj is Blob}\n */\nexport function isBlob(obj) {\n return getDataType(obj) === \"blob\";\n}\n\n/**\n * 判断值是否为**纯粹**的 Object(即 `{}` 或 `new Object()`,不含数组、null、自定义类等)。\n *\n * @param {*} obj - 待检测的值\n * @returns {obj is Record<PropertyKey, any>}\n */\nexport function isPlainObject(obj) {\n return getDataType(obj) === \"object\";\n}\n\n/**\n * 判断值是否为 Promise(含 Promise 子类)。\n *\n * @param {*} obj - 待检测的值\n * @returns {obj is Promise<any>}\n */\nexport function isPromise(obj) {\n return getDataType(obj) === \"promise\";\n}\n\n/**\n * 判断值是否为合法 Date 对象(含 Invalid Date 返回 false)。\n *\n * @param {*} t - 待检测值\n * @returns {t is Date}\n */\nexport function isDate(t) {\n return getDataType(t) === \"date\";\n}\n\n/**\n * 判断值是否为函数(含异步函数、生成器函数、类)。\n *\n * @param {*} obj - 待检测的值\n * @returns {obj is Function}\n */\nexport function isFunction(obj) {\n return typeof obj === \"function\";\n}\n\n/**\n * 判断值是否为**非空**字符串。\n *\n * @param {*} obj - 待检测的值\n * @returns {obj is string}\n */\nexport function isNonEmptyString(obj) {\n return getDataType(obj) === \"string\" && obj.length > 0;\n}\n\n//#endregion\n\n//#region 随机数据\n\n/**\n * 在闭区间 [min, max] 内生成一个均匀分布的随机整数。\n * 若 min > max 则自动交换。\n *\n * @param {number} min - 整数下界(包含)\n * @param {number} max - 整数上界(包含)\n * @returns {number}\n * @throws {TypeError} 当 min 或 max 不是整数时抛出\n */\nexport function randomIntInRange(min, max) {\n if (!Number.isInteger(min) || !Number.isInteger(max)) {\n throw new TypeError(\"Arguments must be integers\");\n }\n if (min > max) [min, max] = [max, min];\n // 注意加 1,否则 max 永远取不到;Math.floor 保证均匀\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n/**\n * 随机生成一个汉字(可控制范围)。\n *\n * @param {boolean} [base=true] - 是否启用基本区(0x4E00-0x9FA5)\n * @param {boolean} [extA=false] - 是否启用扩展 A 区(0x3400-0x4DBF)\n * @param {boolean} [extBH=false] - 是否启用扩展 B~H 区(0x20000-0x2EBEF,代理对)\n * @returns {string} 单个汉字字符\n * @throws {RangeError} 未启用任何区段时抛出\n */\nexport function randomHan(base = true, extA = false, extBH = false) {\n // 1. 收集已启用的“区段”\n const ranges = [];\n if (base) ranges.push({ min: 0x4e00, max: 0x9fa5, surrogate: false });\n if (extA) ranges.push({ min: 0x3400, max: 0x4dbf, surrogate: false });\n if (extBH) ranges.push({ min: 0x20000, max: 0x2ebef, surrogate: true });\n\n if (ranges.length === 0) {\n throw new RangeError(\"At least one range must be enabled\");\n }\n\n // 2. 按总码位数抽号\n const total = ranges.reduce((sum, r) => sum + (r.max - r.min + 1), 0);\n let n = randomIntInRange(0, total - 1);\n\n // 3. 定位落在哪个区段\n for (const { min, max, surrogate } of ranges) {\n const size = max - min + 1;\n if (n < size) {\n const code = min + n;\n if (!surrogate) return String.fromCharCode(code);\n // 代理对\n const offset = code - 0x10000;\n const hi = (offset >> 10) + 0xd800;\n const lo = (offset & 0x3ff) + 0xdc00;\n return String.fromCharCode(hi, lo);\n }\n n -= size;\n }\n}\n\n/**\n * 随机生成一个英文字母。\n *\n * @param {'lower'|'upper'} [type] - 指定大小写;留空则随机\n * @returns {string} 单个字母\n */\nexport function randomEnLetter(type) {\n const lower = \"abcdefghijklmnopqrstuvwxyz\";\n const upper = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n const randomNum = randomIntInRange(0, 25);\n\n switch (type) {\n case \"lower\":\n return lower[randomNum];\n case \"upper\":\n return upper[randomNum];\n default:\n return (Math.random() < 0.5 ? lower : upper)[randomNum];\n }\n}\n\n/**\n * 生成指定长度的随机“中英混合”字符串。\n *\n * @param {number} [len=1] - 目标长度(≥1,自动取整)\n * @param {number} [zhProb=0.5] - 每个位置选择汉字的概率,默认 0.5\n * @returns {string}\n */\nexport function randomHanOrEn(len, zhProb = 0.5) {\n len = Math.max(1, Math.floor(len));\n const buf = [];\n for (let i = 0; i < len; i++) {\n buf.push(Math.random() < zhProb ? randomHan() : randomEnLetter());\n }\n return buf.join(\"\");\n}\n\n//#endregion\n\n//#region 防抖节流\n\n/**\n * 创建 debounced(防抖)函数。\n * - 默认 trailing 触发;当 `leading=true` 时,首次调用或超过等待间隔会立即执行。\n * - 支持手动取消。\n *\n * @template {(...args: any[]) => any} T\n * @param {T} fn - 要防抖的原始函数\n * @param {number} wait - 防抖等待时间(毫秒)\n * @param {boolean} [leading=false] - 是否启用立即执行(leading edge)\n * @returns {T & { cancel(): void }} 返回经过防抖包装的函数,并附带 `cancel` 方法\n * @throws {TypeError} 当 `fn` 不是函数时抛出\n */\nexport function debounce(fn, wait, leading = false) {\n if (typeof fn !== \"function\") throw new TypeError(\"fn must be function\");\n wait = Math.max(0, Number(wait) || 0);\n let timeoutId;\n let lastCall = 0; // 0 表示从未调用过\n\n function debounced(...args) {\n const isFirst = lastCall === 0;\n const isOverWait = Date.now() - lastCall >= wait;\n\n clearTimeout(timeoutId);\n\n // 首次调用 || 已达到等待间隔\n if (leading && (isFirst || isOverWait)) {\n lastCall = Date.now();\n return fn.apply(this, args);\n }\n\n timeoutId = setTimeout(() => {\n lastCall = Date.now();\n fn.apply(this, args);\n }, wait);\n }\n\n debounced.cancel = () => {\n clearTimeout(timeoutId);\n lastCall = 0; // 恢复初始状态\n };\n\n return debounced;\n}\n\n/**\n * 创建 throttled(节流)函数。\n * 支持 leading/trailing 边缘触发,可手动取消。\n *\n * @template {(...args: any[]) => any} T\n * @param {T} fn - 要节流的原始函数\n * @param {number} wait - 节流间隔(毫秒)\n * @param {object} [options] - 配置项\n * @param {boolean} [options.leading=true] - 是否在 leading 边缘执行\n * @param {boolean} [options.trailing=true] - 是否在 trailing 边缘执行\n * @returns {T & { cancel(): void }} 返回经过节流包装的函数,并附带 `cancel` 方法\n * @throws {TypeError} 当 `fn` 不是函数时抛出\n */\nexport function throttle(fn, wait, { leading = true, trailing = true } = {}) {\n if (typeof fn !== \"function\") throw new TypeError(\"fn must be function\");\n wait = Math.max(0, Number(wait) || 0);\n\n let timeoutId = null,\n lastCall = 0;\n\n function throttled(...args) {\n const remaining = wait - (Date.now() - lastCall);\n\n if (leading && (lastCall === 0 || remaining <= 0)) {\n lastCall = Date.now();\n fn.apply(this, args);\n } else if (trailing && !timeoutId) {\n timeoutId = setTimeout(\n () => {\n timeoutId = null;\n lastCall = Date.now();\n fn.apply(this, args);\n },\n remaining > 0 ? remaining : wait\n );\n }\n }\n\n throttled.cancel = () => {\n clearTimeout(timeoutId);\n timeoutId = null;\n lastCall = 0;\n };\n\n return throttled;\n}\n\n//#endregion\n\n/**\n * 利用 JSON 序列化/反序列化实现**深拷贝**。\n * 注意:会丢失 `undefined`、函数、循环引用、特殊包装对象等。\n *\n * @template T\n * @param {T} obj - 待拷贝的 JSON 兼容值\n * @returns {T} 深拷贝后的值\n */\nexport function deepCloneByJSON(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * **安全**地将源对象中**已存在**的属性赋值到目标对象。\n * 不会新增键,也不会复制原型链上的属性。\n *\n * @template {Record<PropertyKey, any>} T\n * @param {T} target - 目标对象(将被就地修改)\n * @param {...Partial<T>} sources - 一个或多个源对象\n * @returns {T} 修改后的目标对象(即第一个参数本身)\n *\n * @example\n * const defaults = { a: 1, b: 2 };\n * assignExisting(defaults, { a: 9, c: 99 }); // defaults 变为 { a: 9, b: 2 }\n */\nexport function assignExisting(target, ...sources) {\n sources.forEach((source) => {\n Object.keys(source).forEach((key) => {\n if (target.hasOwnProperty(key)) {\n target[key] = source[key];\n }\n });\n });\n return target;\n}\n\n/**\n * 提取任意函数(含箭头函数、普通函数、async、class 构造器)的形参名称列表。\n * 通过源码正则解析,不支持解构参数、默认参数、剩余参数等复杂语法;\n * 若出现上述场景将返回空数组或部分名称。\n *\n * @param {Function} fn - 目标函数\n * @returns {string[]} 按声明顺序排列的参数名数组;解析失败时返回空数组\n *\n * @example\n * getFunctionArgNames(function (a, b) {}) // [\"a\", \"b\"]\n * getFunctionArgNames((foo, bar) => {}) // [\"foo\", \"bar\"]\n * getFunctionArgNames(async function x({a} = {}) {}) // [] (解构无法识别)\n */\nexport function getFunctionArgNames(fn) {\n const FN_ARG_SPLIT = /,/,\n FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/,\n FN_ARGS = /^[^(]*\\(\\s*([^)]*)\\)/m,\n ARROW_ARG = /^([^(]+?)=>/,\n STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\n const fnText = Function.prototype.toString.call(fn).replace(STRIP_COMMENTS, \"\");\n const argDecl = fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);\n const retArgNames = [];\n [].forEach.call(argDecl[1].split(FN_ARG_SPLIT), function (arg) {\n arg.replace(FN_ARG, function (all, underscore, name) {\n retArgNames.push(name);\n });\n });\n return retArgNames;\n}\n\n/**\n * 将 Blob(或 File)读取为文本,并可选择自动执行 `JSON.parse`。\n * 当 `isParse=true` 且内容非法 JSON 时,会回退为返回原始文本。\n *\n * @param {Blob} blob - 待读取的 Blob/File 对象\n * @param {boolean} [isParse=true] - 是否尝试将结果按 JSON 解析\n * @returns {Promise<string | any>} 解析后的 JSON 对象或原始文本\n *\n * @example\n * const json = await readBlobAsText(blob); // 自动 JSON.parse\n * const text = await readBlobAsText(blob, false); // 仅返回文本\n */\nexport function readBlobAsText(blob, isParse = true) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (evt) => {\n const result = evt.target.result;\n if (isParse) {\n try {\n resolve(JSON.parse(result));\n } catch (error) {\n console.error(error);\n resolve(result);\n }\n } else {\n resolve(result);\n }\n };\n reader.onerror = reject;\n reader.readAsText(blob);\n });\n}\n","/**\n * 将任意值安全转换为 Date 对象。\n * - 数字/数字字符串:视为时间戳\n * - 字符串:尝试按 ISO/RFC 格式解析\n * - 对象:优先 valueOf(),再 toString()\n * - null / undefined / 无效值:返回 null\n *\n * @param {*} val - 待转换值\n * @returns {Date | null} 有效 Date 或 null\n */\nexport function toDate(val) {\n if (val == null) return null; // null / undefined\n if (val instanceof Date) return isNaN(val) ? null : val; // 已是 Date,但需排除 Invalid Date\n\n // 1. 数字或数字字符串 → 时间戳\n if (typeof val === \"number\" || (typeof val === \"string\" && /^-?\\d+(\\.\\d+)?$/.test(val.trim()))) {\n const d = new Date(+val);\n return isNaN(d) ? null : d;\n }\n\n // 2. 标准 ISO 8601 / RFC 2825 等合法字符串\n if (typeof val === \"string\") {\n const d = new Date(val);\n return isNaN(d) ? null : d; // 非法格式返回 null\n }\n\n // 3. 对象带 valueOf / toString\n if (typeof val === \"object\") {\n // 优先调用 valueOf(期望返回数字时间戳)\n const prim = val.valueOf ? val.valueOf() : Object.prototype.valueOf.call(val);\n if (typeof prim === \"number\" && !isNaN(prim)) {\n const d = new Date(prim);\n return isNaN(d) ? null : d;\n }\n // 兜底用字符串\n const str = val.toString ? val.toString() : String(val);\n const d = new Date(str);\n return isNaN(d) ? null : d;\n }\n\n // 4. 其余情况\n return null;\n}\n\n/**\n * 在闭区间 [date1, date2] 内随机生成一个日期(含首尾)。\n * 若顺序相反则自动交换。\n *\n * @param {Date} date1 - 起始日期\n * @param {Date} date2 - 结束日期\n * @returns {Date} 随机日期\n */\nexport function randomDateInRange(date1, date2) {\n let v1 = date1.getTime(),\n v2 = date2.getTime();\n if (v1 > v2) [v1, v2] = [v2, v1];\n return new Date(v1 + Math.floor(Math.random() * (v2 - v1 + 1)));\n}\n\n/**\n * 计算两个时间之间的剩余/已过时长(天-时-分-秒),返回带补零的展示对象。\n *\n * @param {string|number|Date} originalTime - 原始时间(可转 Date 的任意值)\n * @param {Date} [currentTime=new Date()] - 基准时间,默认当前\n * @returns {{days:number,hours:string,minutes:string,seconds:string}}\n */\nexport function calcTimeDifference(originalTime, currentTime = new Date()) {\n // 计算时间差(毫秒)\n const diffMs = currentTime - new Date(originalTime);\n\n // 转换为天、小时、分钟、秒\n const diffSeconds = Math.floor(diffMs / 1000);\n const days = Math.floor(diffSeconds / (3600 * 24));\n const hours = Math.floor((diffSeconds % (3600 * 24)) / 3600);\n const minutes = Math.floor((diffSeconds % 3600) / 60);\n const seconds = diffSeconds % 60;\n\n const padZero = (num) => String(num).padStart(2, \"0\");\n\n return {\n days,\n hours: padZero(hours),\n minutes: padZero(minutes),\n seconds: padZero(seconds)\n };\n}\n\n/**\n * 将总秒数格式化成人类可读的时间段文本。\n * 固定进制:1 年=365 天,1 月=30 天。\n *\n * @param {number} totalSeconds - 非负总秒数\n * @param {object} [options] - 格式化选项\n * @param {Partial<{year:string,month:string,day:string,hour:string,minute:string,second:string}>} [options.labels] - 各单位的自定义文本\n * @param {('year'|'month'|'day'|'hour'|'minute'|'second')} [options.maxUnit] - 最大输出单位\n * @param {('year'|'month'|'day'|'hour'|'minute'|'second')} [options.minUnit] - 最小输出单位\n * @param {boolean} [options.showZero] - 是否强制显示 0 秒\n * @returns {string} 拼接后的时长文本,如“1天 02小时 30分钟”\n * @throws {TypeError} 当 totalSeconds 为非数字或负数时抛出\n */\nexport function formatDuration(totalSeconds, options = {}) {\n if (typeof totalSeconds !== \"number\" || totalSeconds < 0 || !isFinite(totalSeconds)) {\n throw new TypeError(\"totalSeconds 必须是非负数字\");\n }\n\n // 1. 默认中文单位\n const DEFAULT_LABELS = {\n year: \"年\",\n month: \"月\",\n day: \"天\",\n hour: \"小时\",\n minute: \"分钟\",\n second: \"秒\"\n };\n\n // 2. 固定进制表(秒)\n const UNIT_TABLE = [\n { key: \"year\", seconds: 365 * 24 * 3600 },\n { key: \"month\", seconds: 30 * 24 * 3600 },\n { key: \"day\", seconds: 24 * 3600 },\n { key: \"hour\", seconds: 3600 },\n { key: \"minute\", seconds: 60 },\n { key: \"second\", seconds: 1 }\n ];\n\n // 3. 合并用户自定义文本\n const labels = Object.assign({}, DEFAULT_LABELS, options.labels);\n\n // 4. 根据 maxUnit / minUnit 截取\n let start = 0,\n end = UNIT_TABLE.length;\n if (options.maxUnit) {\n const idx = UNIT_TABLE.findIndex((u) => u.key === options.maxUnit);\n if (idx !== -1) start = idx;\n }\n if (options.minUnit) {\n const idx = UNIT_TABLE.findIndex((u) => u.key === options.minUnit);\n if (idx !== -1) end = idx + 1;\n }\n const units = UNIT_TABLE.slice(start, end);\n if (!units.length) units.push(UNIT_TABLE[UNIT_TABLE.length - 1]); // 保底秒\n\n // 5. 逐级计算\n let rest = Math.floor(totalSeconds);\n const parts = [];\n\n for (const { key, seconds } of units) {\n const val = Math.floor(rest / seconds);\n rest %= seconds;\n\n const shouldShow = val > 0 || (options.showZero && key === \"second\");\n if (shouldShow || (parts.length === 0 && rest === 0)) {\n parts.push(`${val}${labels[key]}`);\n }\n }\n\n // 6. 兜底\n if (parts.length === 0) {\n parts.push(`0${labels[units[units.length - 1].key]}`);\n }\n\n return parts.join(\"\");\n}\n\n/**\n * 快捷调用 {@link formatDuration},最大单位到“天”。\n *\n * @param {number} totalSeconds\n * @param {Omit<Parameters<typeof formatDuration>[1],'maxUnit'>} [options]\n * @returns {string}\n */\nexport function formatDurationMaxDay(totalSeconds, options = {}) {\n return formatDuration(totalSeconds, { ...options, maxUnit: \"day\" });\n}\n\n/**\n * 快捷调用 {@link formatDuration},最大单位到“小时”。\n *\n * @param {number} totalSeconds\n * @param {Omit<Parameters<typeof formatDuration>[1],'maxUnit'>} [options]\n * @returns {string}\n */\nexport function formatDurationMaxHour(totalSeconds, options = {}) {\n return formatDuration(totalSeconds, { ...options, maxUnit: \"hour\" });\n}\n","/**\n * 通过动态创建 `<a>` 标签触发浏览器下载。\n * 注意:此方法可能无法强制下载浏览器原生支持的文件(如图片、PDF),浏览器可能会选择直接打开。\n *\n * @param {string} url - 任意可下载地址(同源或允许跨域)\n * @param {string} [fileName] - 保存到本地的文件名;不传时使用时间戳\n */\nexport function downloadByUrl(url, fileName) {\n const a = document.createElement(\"a\");\n a.style.display = \"none\";\n a.rel = \"noopener\";\n a.href = url;\n a.download = fileName || Date.now();\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/**\n * 把 Blob 转成临时 URL 并触发下载,下载完成后立即释放内存。\n *\n * @param {Blob} blob - 待下载的 Blob(含 File)\n * @param {string} [fileName] - 保存到本地的文件名\n */\nexport function downloadByBlob(blob, fileName) {\n const url = URL.createObjectURL(blob);\n downloadByUrl(url, fileName);\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n\n/**\n * 将任意数据包装成 Blob 并下载。\n *\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - 要写入文件的数据\n * @param {string} [fileName] - 保存到本地的文件名\n * @param {string} [mimeType] - MIME 类型;默认 `application/octet-stream`\n */\nexport function downloadByData(data, fileName, mimeType = \"application/octet-stream\") {\n downloadByBlob(new Blob([data], { type: mimeType }), fileName);\n}\n\n/**\n * 快捷下载 Excel 文件(MIME 已固定)。\n *\n * @param {string | ArrayBufferView | ArrayBuffer | Blob} data - Excel 二进制或字符串内容\n * @param {string} [fileName] - 保存到本地的文件名\n */\nexport function downloadExcel(data, fileName) {\n downloadByData(data, fileName, \"application/vnd.ms-excel\");\n}\n\n/**\n * 快捷下载 JSON 文件(MIME 已固定)。\n * 若传入非字符串数据,会自行 `JSON.stringify`。\n *\n * @param {any} data - 要序列化的 JSON 数据\n * @param {string} [fileName] - 保存到本地的文件名\n */\nexport function downloadJSON(data, fileName) {\n // downloadByData(typeof data === \"string\" ? data : JSON.stringify(data, null, 4), fileName, \"application/json\");\n downloadByData(data, fileName, \"application/json\");\n}\n\n/**\n * 通过 `fetch` 获取资源并强制下载,避免浏览器直接打开文件。\n * 此方法适用于下载图片、PDF 等浏览器默认会打开的文件类型。\n * 如果 `fetch` 失败(如 CORS 策略阻止),会回退到 `downloadByUrl` 方法作为备选方案。\n *\n * @param {string} url - 文件的 URL 地址\n * @param {string} [fileName] - 保存到本地的文件名。如果不提供,会尝试从 URL 中自动提取\n * @returns {Promise<void>} 返回一个 Promise,在下载开始或失败后 resolve\n */\nexport async function fetchOrDownloadByUrl(url, fileName) {\n // 如果未提供文件名,尝试从 URL 路径中提取\n if (!fileName) {\n try {\n const urlPathname = new URL(url).pathname;\n // 获取路径的最后一部分作为文件名,并移除可能的查询参数\n fileName = urlPathname.substring(urlPathname.lastIndexOf(\"/\") + 1).split(\"?\")[0];\n } catch (e) {}\n // 如果提取后文件名为空(例如 URL 以 '/' 结尾),也使用时间戳\n if (!fileName) {\n fileName = Date.now().toString();\n }\n }\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n mode: \"cors\",\n cache: \"no-cache\"\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! ${response.status}: ${response.statusText}`);\n }\n\n const blob = await response.blob();\n downloadByBlob(blob, fileName);\n } catch (error) {\n downloadByUrl(url, fileName);\n }\n}\n","/**\n * 简单、高性能的通用事件总线。\n * - 支持命名空间事件\n * - 支持一次性监听器\n * - 返回唯一 flag,用于精确卸载\n * - emit 时可选自定义 this 指向\n */\nexport class MyEvent {\n constructor() {\n this.evtPool = new Map();\n }\n\n /**\n * 注册事件监听器。\n * @param {string} name - 事件名\n * @param {Function} fn - 回调函数\n * @returns {string} flag - 唯一标识,用于 off\n */\n on(name, fn) {\n let flag = Date.now() + \"_\" + parseInt(Math.random() * 1e8);\n const evtItem = {\n flag,\n fn\n };\n if (this.evtPool.has(name)) {\n this.evtPool.get(name).push(evtItem);\n } else {\n this.evtPool.set(name, [evtItem]);\n }\n return flag;\n }\n\n /**\n * 注册一次性监听器,触发后自动移除。\n * @param {string} name - 事件名\n * @param {Function} fn - 回调函数\n * @returns {string} flag - 唯一标识\n */\n once(name, fn) {\n const _this = this;\n let wrapper;\n wrapper = function (data) {\n _this.off(name, wrapper);\n fn.call(this, data);\n };\n return this.on(name, wrapper);\n }\n\n /**\n * 移除指定事件监听器。\n * @param {string} name - 事件名\n * @param {Function|string} fnOrFlag - 回调函数或 flag\n */\n off(name, fnOrFlag) {\n if (!this.evtPool.has(name)) return;\n const evtItems = this.evtPool.get(name);\n const filtered = evtItems.filter((item) => item.fn !== fnOrFlag && item.flag !== fnOrFlag);\n if (filtered.length === 0) {\n this.evtPool.delete(name);\n } else {\n this.evtPool.set(name, filtered);\n }\n }\n\n /**\n * 触发事件(同步执行)。\n * @param {string} name - 事件名\n * @param {*} [data] - 任意载荷\n * @param {*} [fnThis] - 回调内部 this 指向,默认 undefined\n */\n emit(name, data, fnThis) {\n if (!this.evtPool.has(name)) return;\n const evtItems = this.evtPool.get(name);\n evtItems.forEach((item) => {\n try {\n item.fn.call(fnThis, data);\n } catch (err) {\n console.error(`Error in event listener for \"${name}\":`, err);\n }\n });\n }\n}\n\n/**\n * 跨页通信插件:通过 localStorage + storage 事件将当前实例的 emit 广播到其他同源页面。\n * 支持节流、命名空间隔离。\n */\nexport const MyEvent_CrossPagePlugin = (() => {\n const INSTALLED = new WeakSet(); // 防止重复安装\n\n return {\n /**\n * 为指定 MyEvent 实例安装跨页插件。\n * @param {MyEvent} bus - 事件总线实例\n * @param {Options} [opts] - 配置项\n */\n install(bus, opts = {}) {\n if (INSTALLED.has(bus)) return;\n INSTALLED.add(bus);\n\n const ns = `___my-event-cross-page-${opts.namespace || \"default\"}___`;\n const delay = opts.throttle || 16;\n let last = 0;\n\n // 1、重写 emit\n const rawEmit = bus.emit;\n bus.emit = function (name, data, fnThis) {\n rawEmit.call(bus, name, data, fnThis); // 本地先执行\n const now = Date.now();\n if (now - last < delay) return;\n last = now;\n const key = ns + name;\n try {\n localStorage.setItem(key, JSON.stringify({ name, data, ts: now }));\n localStorage.removeItem(key); // 触发 storage 事件\n } catch (e) {}\n };\n\n // 2、监听其他页广播\n function onStorageHandler(e) {\n if (!e.key || !e.key.startsWith(ns)) return;\n let payload;\n try {\n payload = JSON.parse(e.newValue || \"{}\");\n } catch {\n return;\n }\n if (!payload.ts || payload.ts <= last) return;\n rawEmit.call(bus, e.key.slice(ns.length), payload.data); // 仅本地\n }\n addEventListener(\"storage\", onStorageHandler);\n\n // 3、保存卸载器\n bus._uninstallCrossPage = () => {\n removeEventListener(\"storage\", onStorageHandler);\n bus.emit = rawEmit;\n INSTALLED.delete(bus);\n };\n },\n\n /**\n * 卸载插件,恢复原始 emit 并停止监听。\n * @param {MyEvent} bus - 事件总线实例\n */\n uninstall(bus) {\n if (typeof bus._uninstallCrossPage === \"function\") bus._uninstallCrossPage();\n }\n };\n})();\n","/**\n * 生成 RFC4122 版本 4 的 GUID/UUID。\n * 收集来源:《基于mvc的javascript web富应用开发》 书中介绍是Robert Kieffer写的,还留了网址 http://goo.gl/0b0hu ,但实际访问不了。\n * 格式:`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`\n *\n * @returns {string} 36 位大写 GUID\n *\n * @example\n * // A2E0F340-6C3B-4D7F-B8C1-1E4F6A8B9C0D\n * console.log(getGUID())\n */\nexport function getGUID() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n let r = (Math.random() * 16) | 0,\n v = c == \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16).toUpperCase();\n });\n}\n\n/**\n * 分布式短 ID 生成器。\n * 格式:`${timestamp}${flag}${serial}`,其中:\n * - timestamp:毫秒级时间戳\n * - flag:客户端标识串(自定义)\n * - serial:同一毫秒内的序号,左补零到固定长度\n */\nexport class MyId {\n #ts = Date.now(); //\t时间戳\n #sn = 0; //\t序号(保证同一客户端之间的唯一项)\n #flag = \"\"; //\t客户端标识(保证不同客户端之间的唯一项)\n #len = 5; //\t序号位长度(我的电脑测试,同一时间戳内可以for循环执行了1000次左右,没有一次超过3k,所以5位应该够用了)\n // 测试代码\n // let obj = {[Date.now()]:[]}; try { for (let i = 0; i < 100000; i++) { obj[Date.now()].push(i); } } catch { console.log(obj[Object.getOwnPropertyNames(obj)[0]].length); }\n\n /**\n * @param {object} [option]\n * @param {string} [option.flag] - 客户端标识,默认空串\n * @param {number} [option.len=5] - 序号位长度(位数),安全范围 ≥0\n */\n constructor(option = {}) {\n if (option) {\n if (typeof option.flag === \"string\") {\n this.#flag = option.flag;\n }\n if (Number.isSafeInteger(option.len) && len >= 0) {\n this.#len = option.len;\n }\n }\n }\n\n /**\n * 生成下一个全局唯一字符串 ID。\n * 同一毫秒序号自动递增;序号溢出时会在控制台警告。\n * @returns {string}\n */\n nextId() {\n let ts = Date.now();\n if (ts === this.#ts) {\n this.#sn++;\n if (this.#sn >= 10 ** this.#len) {\n console.log(\"长度不够用了!!!\");\n }\n } else {\n this.#sn = 0;\n this.#ts = ts;\n }\n return ts.toString() + this.#flag + this.#sn.toString().padStart(this.#len, \"0\");\n }\n}\n","/**\n * 基于 `setTimeout` 的“间隔循环”定时器。\n * 每次任务执行完成后才计算下一次间隔,避免任务堆积。\n */\nexport class IntervalTimer {\n /**\n * 创建定时器实例。\n * @param {() => void} fn - 每次间隔要执行的业务函数\n * @param {number} [ms=1000] - 间隔时间(毫秒)\n * @throws {TypeError} 当 `fn` 不是函数时抛出\n */\n constructor(fn, ms = 1000) {\n if (typeof fn !== \"function\") {\n throw new TypeError(\"IntervalTimer: 必须传入一个函数\");\n }\n this._fn = fn;\n this._ms = ms;\n this._timerId = null;\n }\n\n /**\n * 启动定时器;若已启动则先停止再重新启动。\n * 首次执行会立即触发。\n */\n start() {\n this.stop();\n const loop = () => {\n this._fn(); // 执行业务\n this._timerId = setTimeout(loop, this._ms);\n };\n loop(); // 立即执行第一次\n }\n\n /**\n * 停止定时器。\n */\n stop() {\n if (this._timerId !== null) {\n clearTimeout(this._timerId);\n this._timerId = null;\n }\n }\n\n /**\n * 查询定时器是否正在运行。\n * @returns {boolean}\n */\n isRunning() {\n return this._timerId !== null;\n }\n}\n","/**\n * 把嵌套树拍平成 `{ [id]: node }` 映射,同时把原 `children` 置为 `null`。\n *\n * @template T extends Record<PropertyKey, any>\n * @param {T[]} data - 嵌套树森林\n * @param {string} [idKey='id'] - 主键字段\n * @param {string} [childrenKey='children'] - 子节点字段\n * @returns {Record<string, T & { [k in typeof childrenKey]: null }>} id→节点的映射表\n */\nexport function nestedTree2IdMap(data, idKey = \"id\", childrenKey = \"children\") {\n const retObj = {};\n function fn(nodes) {\n if (Array.isArray(nodes) && nodes.length > 0) {\n nodes.forEach((node) => {\n retObj[node[idKey]] = { ...node };\n retObj[node[idKey]][childrenKey] = null;\n\n fn(node[childrenKey]);\n });\n }\n }\n fn(data);\n return retObj;\n}\n\n/**\n * 把**已包含完整父子关系**的扁平节点列表还原成嵌套树(森林)。\n *\n * @template T extends Record<PropertyKey, any>\n * @param {T[]} nodes - 扁平节点列表(必须包含 id / parentId)\n * @param {number | string} [parentId=0] - 根节点标识值\n * @param {Object} [opts] - 字段映射配置\n * @param {string} [opts.idKey='id'] - 节点主键\n * @param {string} [opts.parentKey='parentId'] - 父节点外键\n * @param {string} [opts.childrenKey='children'] - 存放子节点的字段\n * @returns {(T & { [k in typeof childrenKey]: T[] })[]} 嵌套树森林\n */\nexport function flatCompleteTree2NestedTree(nodes, parentId = 0, { idKey = \"id\", parentKey = \"parentId\", childrenKey = \"children\" } = {}) {\n const map = new Map(); // id -> node\n const items = []; // 多根森林\n\n // 1. 初始化:保证每个节点都有 children,并存入 map\n for (const item of nodes) {\n const node = { ...item, [childrenKey]: [] };\n map.set(item[idKey], node);\n }\n\n // 2. 建立父子关系\n for (const item of nodes) {\n const node = map.get(item[idKey]);\n const parentIdVal = item[parentKey];\n\n if (parentIdVal === parentId) {\n // 根层\n items.push(node);\n } else {\n // 非根层:找到父节点,把自己挂上去\n const parent = map.get(parentIdVal);\n if (parent) parent[childrenKey].push(node);\n // 如果 parent 不存在,说明数据不完整,可自定义处理\n }\n }\n\n return items;\n}\n\n/**\n * 在嵌套树中按 `id` 递归查找节点,并返回其指定属性值。\n *\n * @template T extends Record<PropertyKey, any>\n * @param {string | number} id - 要查找的 id\n * @param {T[]} arr - 嵌套树森林\n * @param {string} [resultKey='name'] - 需要返回的字段\n * @param {string} [idKey='id'] - 主键字段\n * @param {string} [childrenKey='children'] - 子节点字段\n * @returns {any} 找到的值;未找到返回 `undefined`\n */\nexport const findObjAttrValueById = function findObjAttrValueByIdFn(id, arr, resultKey = \"name\", idKey = \"id\", childrenKey = \"children\") {\n if (Array.isArray(arr) && arr.length > 0) {\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n if (item[idKey]?.toString() === id?.toString()) {\n return item[resultKey];\n } else if (Array.isArray(item[childrenKey]) && item[childrenKey].length > 0) {\n const result = findObjAttrValueByIdFn(id, item[childrenKey], resultKey, idKey, childrenKey);\n if (result) {\n return result;\n }\n }\n }\n }\n};\n\n/**\n * 从服务端返回的已选 id 数组里,提取出\n * 1. 叶子节点\n * 2. 所有子节点都被选中的父节点\n * 其余父节点一律丢弃(由前端 Tree 自动算半选)\n *\n * @param {Array} treeData 完整树\n * @param {Array} selectedKeys 后端给的选中 id 数组\n * @param {String} idKey 节点唯一字段\n * @param {String} childrenKey 子节点字段\n * @returns {{checked: string[], halfChecked: string[]}}\n */\nexport function extractFullyCheckedKeys(treeData, selectedKeys, idKey = \"id\", childrenKey = \"children\") {\n const selectedSet = new Set(selectedKeys);\n const checked = new Set();\n const halfChecked = new Set();\n\n /* 返回值含义\n 0 - 未选中\n 1 - 半选\n 2 - 全选\n */\n function dfs(node) {\n const nodeId = node[idKey];\n const children = node[childrenKey] || [];\n\n // 叶子\n if (!children.length) {\n if (selectedSet.has(nodeId)) {\n checked.add(nodeId);\n return 2;\n }\n return 0;\n }\n\n // 非叶子\n let allChecked = true;\n let someChecked = false;\n\n children.forEach((child) => {\n const childState = dfs(child);\n if (childState !== 2) allChecked = false;\n if (childState >= 1) someChecked = true;\n });\n\n // 当前节点本身在 selectedKeys 里,但子节点未全选 → 只能算半选\n if (selectedSet.has(nodeId)) {\n if (allChecked) {\n checked.add(nodeId);\n return 2;\n }\n halfChecked.add(nodeId);\n return 1;\n }\n\n // 当前节点不在 selectedKeys 里,看子节点\n if (allChecked) {\n checked.add(nodeId);\n return 2;\n }\n if (someChecked) {\n halfChecked.add(nodeId);\n return 1;\n }\n return 0;\n }\n\n treeData.forEach(dfs);\n return {\n checked: [...checked],\n halfChecked: [...halfChecked]\n };\n}\n","/**\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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"}