useWebSocket.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // noinspection JSUnusedGlobalSymbols
  2. import { unref } from 'vue';
  3. import { useWebSocket, WebSocketResult } from '@vueuse/core';
  4. import { getToken } from '/@/utils/auth';
  5. let result: WebSocketResult<any>;
  6. const listeners = new Map();
  7. /**
  8. * 开启 WebSocket 链接,全局只需执行一次
  9. * @param url
  10. */
  11. export function connectWebSocket(url: string) {
  12. //update-begin-author:taoyan date:2022-4-24 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278
  13. let token = (getToken() || '') as string;
  14. result = useWebSocket(url, {
  15. // 自动重连 (遇到错误最多重复连接10次)
  16. autoReconnect: {
  17. retries : 10,
  18. delay : 5000
  19. },
  20. // 心跳检测
  21. heartbeat: {
  22. message: "ping",
  23. interval: 55000
  24. },
  25. protocols: [token],
  26. });
  27. //update-end-author:taoyan date:2022-4-24 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278
  28. if (result) {
  29. result.open = onOpen;
  30. result.close = onClose;
  31. const ws = unref(result.ws);
  32. if(ws!=null){
  33. ws.onerror = onError;
  34. ws.onmessage = onMessage;
  35. }
  36. }
  37. }
  38. function onOpen() {
  39. console.log('[WebSocket] 连接成功');
  40. }
  41. function onClose(e) {
  42. console.log('[WebSocket] 连接断开:', e);
  43. }
  44. function onError(e) {
  45. console.log('[WebSocket] 连接发生错误: ', e);
  46. }
  47. function onMessage(e) {
  48. console.debug('[WebSocket] -----接收消息-------', e.data);
  49. try {
  50. const data = JSON.parse(e.data);
  51. for (const callback of listeners.keys()) {
  52. try {
  53. callback(data);
  54. } catch (err) {
  55. console.error(err);
  56. }
  57. }
  58. } catch (err) {
  59. console.error('[WebSocket] data解析失败:', err);
  60. }
  61. }
  62. /**
  63. * 添加 WebSocket 消息监听
  64. * @param callback
  65. */
  66. export function onWebSocket(callback: (data: object) => any) {
  67. if (!listeners.has(callback)) {
  68. if (typeof callback === 'function') {
  69. listeners.set(callback, null);
  70. } else {
  71. console.debug('[WebSocket] 添加 WebSocket 消息监听失败:传入的参数不是一个方法');
  72. }
  73. }
  74. }
  75. /**
  76. * 解除 WebSocket 消息监听
  77. *
  78. * @param callback
  79. */
  80. export function offWebSocket(callback: (data: object) => any) {
  81. listeners.delete(callback);
  82. }
  83. export function useMyWebSocket() {
  84. return result;
  85. }