index.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { message } from 'ant-design-vue'
  2. import ReconnectingWebSocket from 'reconnecting-websocket'
  3. import { EBizCode } from '../types'
  4. interface WebSocketOptions {
  5. data: any
  6. cache?: boolean | string
  7. destroyCache?: string
  8. }
  9. export interface MessageHandler {
  10. (data: { [key: string]: any }): void
  11. }
  12. export interface CommonHostWs<T> {
  13. sn: string
  14. host: T
  15. }
  16. /**
  17. * ConnectWebSocket 类
  18. * TODO: 优化messageHandler: EventEmitter。暂时传入回调函数
  19. */
  20. class ConnectWebSocket {
  21. _url: string
  22. _socket: ReconnectingWebSocket | null
  23. _hasInit: boolean
  24. _messageHandler: MessageHandler | null
  25. constructor(url: string) {
  26. this._url = url
  27. this._socket = null
  28. this._hasInit = false
  29. this._messageHandler = null
  30. }
  31. initSocket() {
  32. if (this._hasInit) {
  33. return
  34. }
  35. if (!this._url) {
  36. return
  37. }
  38. // 会自动重连,无需处理重连逻辑
  39. this._socket = new ReconnectingWebSocket(this._url, [], {
  40. maxReconnectionDelay: 20000, // 断开后最大的重连时间: 20s,每多一次重连,会增加 1.3 倍,5 * 1.3 * 1.3 * 1.3...
  41. minReconnectionDelay: 5000, // 断开后最短的重连时间: 5s
  42. maxRetries: 5
  43. })
  44. this._hasInit = true
  45. this._socket.addEventListener('open', this._onOpen.bind(this))
  46. this._socket.addEventListener('close', this._onClose.bind(this))
  47. this._socket.addEventListener('error', this._onError.bind(this))
  48. this._socket.addEventListener('message', this._onMessage.bind(this))
  49. }
  50. _onOpen() {
  51. // console.log('连接成功')
  52. }
  53. _onClose() {
  54. // console.log('连接已断开')
  55. }
  56. _onError() {
  57. // console.log('连接 error')
  58. }
  59. registerMessageHandler(messageHandler: MessageHandler) {
  60. this._messageHandler = messageHandler
  61. }
  62. _onMessage(msg: MessageEvent) {
  63. const data = JSON.parse(msg.data)
  64. this._messageHandler && this._messageHandler(data)
  65. // console.log('接受消息', message)
  66. }
  67. sendMessage = (message: WebSocketOptions): void => {
  68. this._socket?.send(JSON.stringify(message.data))
  69. }
  70. close() {
  71. this._socket?.close()
  72. }
  73. }
  74. export default ConnectWebSocket