WebSocketUtil

带自动重连、心跳、AES-ECB 解密的 WebSocket 封装类。构造即连接,断线自动重连,服务端加密消息透明解密后分发给所有订阅者。

工作原理

  1. 构造即 connect():新建 WebSocket,绑定 open / close / error / message。
  2. 心跳:连接建立后每 5 秒发送 'ping' 字符串,服务端返回的 'pong'(Blob)被识别为心跳响应丢弃。
  3. 消息解密:非心跳的 Blob 消息按 hex 密文走 decryptHex(data, options.key) 解密为 JSON 字符串再分发;普通 text 消息直接透传。
  4. 断线重连:close / error 触发重连,延迟 reconnectInterval(默认 3 秒)后重新 connect;显式 close() 后不再重连。
  5. 多订阅者:listeners 为自建数组,add / remove 对称 API。

API

new WebSocketUtil(options: WebSocketOptions)

interface WebSocketOptions {
  url: string // wss:// 地址
  key: string // AES-ECB 解密密钥(hex 格式)
  reconnectInterval?: number // 重连间隔 ms,默认 3000
}
实例方法说明
send(data)向服务端发送字符串 / Buffer / Blob;未连接时 console.warn 并丢弃
close()主动关闭(清掉重连定时器与心跳,不再自动重连)
isConnected()readyState === OPEN
addOnMessageListener(fn) / removeOnMessageListener(fn)订阅 / 退订消息(fn(data: string),已解密)
addOnOpenListener(fn) / removeOnOpenListener(fn)订阅 / 退订连接建立
addOnCloseListener(fn) / removeOnCloseListener(fn)订阅 / 退订连接关闭
addOnErrorListener(fn) / removeOnErrorListener(fn)订阅 / 退订连接错误

使用示例

// 建立连接并订阅消息
const ws = new WebSocketUtil({ url: 'wss://api.example.com/ws', key: wsHexKey })
ws.addOnMessageListener((data) => console.log('recv:', data))

// 登录后发送鉴权帧
ws.addOnOpenListener(() => ws.send(JSON.stringify({ type: 'auth', token })))

// 组件卸载时释放(退订 + 关闭,避免泄漏与幽灵重连)
onBeforeUnmount(() => {
  ws.removeOnMessageListener(handler)
  ws.close()
})

注意事项

  • 仅客户端可用:connect 使用全局 window / WebSocket,请在 onMounted 或 client-only 上下文实例化,SSR 阶段不要触发构造。
  • key 为 hex 字符串,与 aes 的 decryptHex 约定一致。
  • 心跳间隔 5s、重连间隔默认 3s;如需调整心跳请扩展本类,不要魔改私有字段。
  • 组件级使用务必在卸载时 close() —— 否则实例会在后台无限重连。