useWebSocket.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. const token = (getToken() || '') as string;
  14. console.log(url);
  15. result = useWebSocket(url);
  16. //update-end-author:taoyan date:2022-4-24 for: v2.4.6 的 websocket 服务端,存在性能和安全问题。 #3278
  17. if (result) {
  18. result.open = onOpen;
  19. result.close = onClose;
  20. const ws = unref(result.ws);
  21. if (ws != null) {
  22. ws.onerror = onError;
  23. ws.onmessage = onMessage;
  24. console.log('WebSocket连接通了', result, ws);
  25. } else {
  26. console.log('WebSocket连接连接失败');
  27. }
  28. }
  29. }
  30. function onOpen() {
  31. console.log('[WebSocket] 连接成功');
  32. }
  33. function onClose(e) {
  34. console.log('[WebSocket] 连接断开:', e);
  35. }
  36. function onError(e) {
  37. console.log('[WebSocket] 连接发生错误: ', e);
  38. }
  39. function onMessage(e) {
  40. console.debug('[WebSocket] -----接收消息-------', e.data);
  41. try {
  42. const data = JSON.parse(e.data);
  43. for (const callback of listeners.keys()) {
  44. try {
  45. callback(data);
  46. } catch (err) {
  47. console.error(err);
  48. }
  49. }
  50. } catch (err) {
  51. console.error('[WebSocket] data解析失败:', err);
  52. }
  53. }
  54. /**
  55. * 添加 WebSocket 消息监听
  56. * @param callback
  57. */
  58. export function onWebSocket(callback: (data: object) => any) {
  59. if (!listeners.has(callback)) {
  60. if (typeof callback === 'function') {
  61. listeners.set(callback, null);
  62. } else {
  63. console.debug('[WebSocket] 添加 WebSocket 消息监听失败:传入的参数不是一个方法');
  64. }
  65. }
  66. }
  67. /**
  68. * 解除 WebSocket 消息监听
  69. *
  70. * @param callback
  71. */
  72. export function offWebSocket(callback: (data: object) => any) {
  73. listeners.delete(callback);
  74. }
  75. export function useMyWebSocket() {
  76. return result;
  77. }