SocketHandler.class.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import ListenerHandler from "@/classes/ListenerHandler.class";
  2. export default class SocketHandlerMock {
  3. dispatcher: ListenerHandler;
  4. url: string;
  5. data: {
  6. dispatch?: Record<string, (...args: any[]) => any>;
  7. progress?: Record<string, (...args: any[]) => any>;
  8. on?: Record<string, any>;
  9. };
  10. onDisconnectCbs: {
  11. temp: any[];
  12. persist: any[];
  13. };
  14. executeDispatch: boolean;
  15. constructor(url: string) {
  16. this.dispatcher = new ListenerHandler();
  17. this.url = url;
  18. this.data = {
  19. dispatch: {},
  20. progress: {},
  21. on: {}
  22. };
  23. this.onDisconnectCbs = {
  24. temp: [],
  25. persist: []
  26. };
  27. this.executeDispatch = true;
  28. }
  29. on(
  30. target: string,
  31. cb: (...args: any[]) => any,
  32. options?: EventListenerOptions
  33. ) {
  34. const onData = this.data.on && this.data.on[target];
  35. this.dispatcher.addEventListener(
  36. `on.${target}`,
  37. (event: CustomEvent) => cb(event.detail() || onData),
  38. options
  39. );
  40. }
  41. dispatch(target: string, ...args: any[]) {
  42. const lastArg = args[args.length - 1];
  43. const _args = args.slice(0, -1);
  44. const dispatchData = () =>
  45. this.data.dispatch &&
  46. typeof this.data.dispatch[target] === "function"
  47. ? this.data.dispatch[target](..._args)
  48. : undefined;
  49. const progressData = () =>
  50. this.data.progress &&
  51. typeof this.data.progress[target] === "function"
  52. ? this.data.progress[target](..._args)
  53. : undefined;
  54. if (typeof lastArg === "function") {
  55. if (this.executeDispatch && dispatchData()) lastArg(dispatchData());
  56. else if (!this.executeDispatch)
  57. this.dispatcher.addEventListener(
  58. `dispatch.${target}`,
  59. (event: CustomEvent) =>
  60. lastArg(event.detail(..._args) || dispatchData()),
  61. false
  62. );
  63. } else if (typeof lastArg === "object") {
  64. if (this.executeDispatch) {
  65. if (progressData())
  66. progressData().forEach((data: any) => {
  67. lastArg.onProgress(data);
  68. });
  69. if (dispatchData()) lastArg.cb(dispatchData());
  70. } else {
  71. this.dispatcher.addEventListener(
  72. `progress.${target}`,
  73. (event: CustomEvent) => {
  74. if (event.detail(..._args))
  75. lastArg.onProgress(event.detail(..._args));
  76. else if (progressData())
  77. progressData().forEach((data: any) => {
  78. lastArg.onProgress(data);
  79. });
  80. },
  81. false
  82. );
  83. this.dispatcher.addEventListener(
  84. `dispatch.${target}`,
  85. (event: CustomEvent) =>
  86. lastArg.cb(event.detail(..._args) || dispatchData()),
  87. false
  88. );
  89. }
  90. }
  91. }
  92. // eslint-disable-next-line class-methods-use-this
  93. onConnect(cb: (...args: any[]) => any) {
  94. cb();
  95. }
  96. onDisconnect(cb: (...args: any[]) => any, persist = false) {
  97. if (persist) this.onDisconnectCbs.persist.push(cb);
  98. else this.onDisconnectCbs.temp.push(cb);
  99. this.dispatcher.addEventListener(
  100. "socket.disconnect",
  101. () => {
  102. this.onDisconnectCbs.temp.forEach(callback => callback());
  103. this.onDisconnectCbs.persist.forEach(callback => callback());
  104. },
  105. false
  106. );
  107. }
  108. clearCallbacks() {
  109. this.onDisconnectCbs.temp = [];
  110. }
  111. // eslint-disable-next-line class-methods-use-this
  112. destroyModalListeners() {}
  113. trigger(type: string, target: string, data?: any) {
  114. this.dispatcher.dispatchEvent(
  115. new CustomEvent(`${type}.${target}`, {
  116. detail: (...args: any[]) => {
  117. if (typeof data === "function") return data(...args);
  118. if (typeof data === "undefined") return undefined;
  119. return JSON.parse(JSON.stringify(data));
  120. }
  121. })
  122. );
  123. }
  124. }