ws.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import store from "@/store";
  2. import { Message } from "iview";
  3. import { VUE_APP_WK_SERVER_SOCKET_FOR_AUDIO } from "@/constants/constants";
  4. let ws;
  5. let shouldReconnect = true;
  6. let heartbeatId = null;
  7. const RECONNECT_INTERVAL = 3000;
  8. const HEARTBEAT_INTERVAL = 50 * 1000;
  9. let reconnectNumber = 0;
  10. export function openWS({ examRecordDataId }) {
  11. console.log("in openWS", examRecordDataId);
  12. try {
  13. ws = new WebSocket(
  14. VUE_APP_WK_SERVER_SOCKET_FOR_AUDIO +
  15. `${examRecordDataId}/${store.state.user.key}/${store.state.user.token}`
  16. );
  17. } catch {
  18. setTimeout(() => {
  19. // tryWSReconnect();
  20. reconnectNumber++;
  21. if (reconnectNumber >= 5) {
  22. Message.error({
  23. content: "Websocket重连失败",
  24. duration: 5,
  25. closable: true
  26. });
  27. }
  28. openWS({ examRecordDataId });
  29. }, RECONNECT_INTERVAL);
  30. return;
  31. }
  32. ws.onopen = event => {
  33. console.log("open ws", event);
  34. reconnectNumber = 0;
  35. ws.onmessage = processWSMessage;
  36. ws.onclose = () => {
  37. console.log("ws close by server");
  38. clearInterval(heartbeatId);
  39. if (shouldReconnect) {
  40. console.log("close -> reconnect");
  41. setTimeout(() => {
  42. // tryWSReconnect();
  43. reconnectNumber++;
  44. if (reconnectNumber >= 5) {
  45. Message.error({
  46. content: "Websocket重连失败",
  47. duration: 5,
  48. closable: true
  49. });
  50. }
  51. openWS({ examRecordDataId });
  52. }, RECONNECT_INTERVAL);
  53. } else {
  54. shouldReconnect = true; // reset shouldReconnect
  55. }
  56. };
  57. heartbeat();
  58. };
  59. }
  60. // function tryWSReconnect() {
  61. // // socket.close();
  62. // openWS();
  63. // }
  64. function heartbeat() {
  65. heartbeatId = setInterval(() => {
  66. ws.send(
  67. JSON.stringify({
  68. eventType: "HEARTBEAT"
  69. })
  70. );
  71. }, HEARTBEAT_INTERVAL);
  72. }
  73. export function closeWsWithoutReconnect() {
  74. shouldReconnect = false;
  75. ws.close();
  76. }
  77. export function getQRCode(order) {
  78. if (ws.readyState === ws.OPEN) {
  79. ws.send(
  80. JSON.stringify({
  81. eventType: "GET_QR_CODE",
  82. order
  83. })
  84. );
  85. return true;
  86. } else {
  87. return false;
  88. }
  89. }
  90. function processWSMessage(event) {
  91. // console.log("get ws msg: ", event);
  92. const res = JSON.parse(event.data);
  93. if (res.eventType !== "HEARTBEAT" && !res.isSuccess) {
  94. Message.error({
  95. content: res.errorMessage,
  96. duration: 10,
  97. closable: true
  98. });
  99. return;
  100. }
  101. switch (res.eventType) {
  102. case "HEARTBEAT":
  103. // console.log("ws heartbeat response from server");
  104. break;
  105. case "GET_QR_CODE":
  106. console.log("get qrcode", res);
  107. store.commit("examingHomeModule/setQuestionQrCode", {
  108. qrCode: res.data.qrCode,
  109. order: res.data.order
  110. });
  111. break;
  112. case "SCAN_QR_CODE":
  113. console.log("wx scanned qrcode", res);
  114. store.commit("examingHomeModule/setQuestionQrCodeScanned", {
  115. order: res.data.order
  116. });
  117. break;
  118. case "GET_AUDIO_ANSWER":
  119. console.log("get audio url", res);
  120. store.commit("examingHomeModule/setQuestionAudioFileUrl", {
  121. order: res.data.order,
  122. audioFileUrl: res.data.audioFileUrl
  123. });
  124. break;
  125. case "SYSTEM_ERROR":
  126. console.log("ws get error", res);
  127. break;
  128. }
  129. }