ws.js 2.7 KB

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