websocket.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import {ElNotification as message} from 'element-plus'
  2. import {Session} from "/@/utils/storage";
  3. import {getWsBaseURL} from "/@/utils/baseUrl";
  4. // @ts-ignore
  5. import socket from '@/types/api/socket'
  6. const websocket: socket = {
  7. websocket: null,
  8. connectURL: getWsBaseURL(),
  9. // 开启标识
  10. socket_open: false,
  11. // 心跳timer
  12. hearbeat_timer: null,
  13. // 心跳发送频率
  14. hearbeat_interval: 2 * 1000,
  15. // 是否自动重连
  16. is_reonnect: true,
  17. // 重连次数
  18. reconnect_count: 3,
  19. // 已发起重连次数
  20. reconnect_current: 1,
  21. // 重连timer
  22. reconnect_timer: null,
  23. // 重连频率
  24. reconnect_interval: 5 * 1000,
  25. init: (receiveMessage: Function | null) => {
  26. if (!('WebSocket' in window)) {
  27. message.warning('浏览器不支持WebSocket')
  28. return null
  29. }
  30. const token = Session.get('token')
  31. if(!token){
  32. // message.warning('websocket认证失败')
  33. return null
  34. }
  35. const wsUrl = `${getWsBaseURL()}ws/${token}/`
  36. websocket.websocket = new WebSocket(wsUrl)
  37. websocket.websocket.onmessage = (e: any) => {
  38. if (receiveMessage) {
  39. receiveMessage(e)
  40. }
  41. }
  42. websocket.websocket.onclose = (e: any) => {
  43. websocket.socket_open = false
  44. // 需要重新连接
  45. if (websocket.is_reonnect) {
  46. websocket.reconnect_timer = setTimeout(() => {
  47. // 超过重连次数
  48. if (websocket.reconnect_current > websocket.reconnect_count) {
  49. clearTimeout(websocket.reconnect_timer)
  50. websocket.is_reonnect = false
  51. return
  52. }
  53. // 记录重连次数
  54. websocket.reconnect_current++
  55. websocket.reconnect()
  56. }, websocket.reconnect_interval)
  57. }
  58. }
  59. // 连接成功
  60. websocket.websocket.onopen = function () {
  61. websocket.socket_open = true
  62. websocket.is_reonnect = true
  63. // 开启心跳
  64. websocket.heartbeat()
  65. }
  66. // 连接发生错误
  67. websocket.websocket.onerror = function () { }
  68. },
  69. heartbeat: () => {
  70. websocket.hearbeat_timer && clearInterval(websocket.hearbeat_timer)
  71. websocket.hearbeat_timer = setInterval(() => {
  72. let data = {
  73. token: Session.get('token')
  74. }
  75. websocket.send(data)
  76. }, websocket.hearbeat_interval)
  77. },
  78. send: (data:string, callback = null) => {
  79. // 开启状态直接发送
  80. if (websocket.websocket.readyState === websocket.websocket.OPEN) {
  81. websocket.websocket.send(JSON.stringify(data))
  82. // @ts-ignore
  83. callback && callback()
  84. } else {
  85. clearInterval(websocket.hearbeat_timer)
  86. message({
  87. type: 'warning',
  88. message: 'socket链接已断开',
  89. duration: 1000,
  90. })
  91. }
  92. },
  93. close: () => {
  94. websocket.is_reonnect = false
  95. websocket.websocket.close()
  96. websocket.websocket = null;
  97. },
  98. /**
  99. * 重新连接
  100. */
  101. reconnect: () => {
  102. if (websocket.websocket && !websocket.is_reonnect) {
  103. websocket.close()
  104. }
  105. websocket.init(null)
  106. },
  107. }
  108. export default websocket;