websocket.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. self.importScripts('helper.js');
  2. var parameters = GetRequest();
  3. var cardToken = parameters['cardToken'];
  4. cardToken = cardToken && decodeURIComponent(cardToken);
  5. var errorTime = 0;
  6. var socketURL = decodeURIComponent(parameters['socketURL']);
  7. var intervaler;
  8. doConnect();
  9. function throttle(fn, delay) {
  10. var flag = true;
  11. return () => {
  12. if (!flag) return;
  13. flag = false;
  14. errorTime += delay;
  15. timer = setTimeout(() => {
  16. fn();
  17. flag = true;
  18. }, delay);
  19. };
  20. }
  21. function doConnect() {
  22. var ws = new WebSocket(socketURL);
  23. ws.binaryType = 'arraybuffer';
  24. intervaler = setInterval(() => {
  25. if (ws.readyState === 1) {
  26. ws.send('ping');
  27. } else {
  28. clearInterval(intervaler);
  29. self.postMessage('close');
  30. }
  31. }, 3000);
  32. ws.onerror = function () {
  33. ws.close(1006);
  34. };
  35. ws.addEventListener('close', function (e) {
  36. if (e.code === 1006) {
  37. clearInterval(intervaler);
  38. throttle(doConnect, 100);
  39. if (errorTime > 1000) {
  40. self.postMessage('close');
  41. }
  42. }
  43. });
  44. ws.addEventListener('open', function (event) {
  45. var verifyBuffer = VerifyCode('RK3923C1201900139', cardToken);
  46. ws.send(verifyBuffer);
  47. errorTime = 0;
  48. });
  49. ws.addEventListener('message', function (event) {
  50. var input = new Uint8Array(event.data);
  51. if (input[0] == 0xff) {
  52. self.postMessage(input);
  53. } else {
  54. self.postMessage(input);
  55. }
  56. });
  57. self.addEventListener(
  58. 'message',
  59. function (e) {
  60. if (e === 'close') {
  61. clearInterval(intervaler);
  62. ws.close();
  63. } else {
  64. ws.send(e.data);
  65. }
  66. },
  67. false,
  68. );
  69. }
  70. function GetRequest() {
  71. var url = location.search; // 获取url中"?"符后的字串
  72. var obj = new Object();
  73. if (url.indexOf('?') != -1) {
  74. var str = url.substr(1);
  75. strs = str.split('&');
  76. for (var i = 0; i < strs.length; i++) {
  77. obj[strs[i].split('=')[0]] = strs[i].split('=')[1];
  78. }
  79. }
  80. return obj;
  81. }