app.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. (function(win) {
  2. const rawHeaderLen = 18;
  3. const packetOffset = 0;
  4. const headerOffset = 4;
  5. const verOffset = 6;
  6. const opOffset = 8;
  7. const seqOffset = 12;
  8. const compressOffset = 16;
  9. const ctypeOffset = 17;
  10. var Client = function(options) {
  11. var MAX_CONNECT_TIMES = 10;
  12. var DELAY = 15000;
  13. this.options = options || {};
  14. this.createConnect(MAX_CONNECT_TIMES, DELAY);
  15. }
  16. Client.prototype.createConnect = function(max, delay) {
  17. var self = this;
  18. if (max === 0) {
  19. return;
  20. }
  21. connect();
  22. var textDecoder = new TextDecoder();
  23. var textEncoder = new TextEncoder();
  24. var heartbeatInterval;
  25. function connect() {
  26. var ws = new WebSocket('ws://172.22.33.126:7822/sub');
  27. ws.binaryType = 'arraybuffer';
  28. ws.onopen = function() {
  29. console.log("auth start")
  30. auth();
  31. register();
  32. }
  33. ws.onmessage = function(evt) {
  34. var data = evt.data;
  35. var dataView = new DataView(data, 0);
  36. var packetLen = dataView.getInt32(packetOffset);
  37. var headerLen = dataView.getInt16(headerOffset);
  38. var ver = dataView.getInt16(verOffset);
  39. var op = dataView.getInt32(opOffset);
  40. var seq = dataView.getInt32(seqOffset);
  41. var msgBody = textDecoder.decode(data.slice(headerLen, packetLen));
  42. console.log("receiveHeader: packetLen=" + packetLen, "headerLen=" + headerLen, "ver=" + ver, "op=" + op, "seq=" + seq,"body="+msgBody);
  43. switch(op) {
  44. case 8:
  45. // heartbeat
  46. heartbeat();
  47. heartbeatInterval = setInterval(heartbeat, 30 * 1000);
  48. break;
  49. case 3:
  50. // heartbeat reply
  51. console.log("receive: heartbeat online=", dataView.getInt32(rawHeaderLen));
  52. break;
  53. case 5:
  54. // batch message
  55. for (var offset=0; offset<data.byteLength; offset+=packetLen) {
  56. // parse
  57. var packetLen = dataView.getInt32(offset);
  58. var headerLen = dataView.getInt16(offset+headerOffset);
  59. var ver = dataView.getInt16(offset+verOffset);
  60. var msgBody = textDecoder.decode(data.slice(offset+headerLen, offset+packetLen));
  61. // callback
  62. messageReceived(ver, msgBody);
  63. }
  64. break;
  65. }
  66. }
  67. ws.onclose = function() {
  68. console.log("closed")
  69. if (heartbeatInterval) clearInterval(heartbeatInterval);
  70. setTimeout(reConnect, delay);
  71. }
  72. function heartbeat() {
  73. var headerBuf = new ArrayBuffer(rawHeaderLen);
  74. var headerView = new DataView(headerBuf, 0);
  75. headerView.setInt32(packetOffset, rawHeaderLen);
  76. headerView.setInt16(headerOffset, rawHeaderLen);
  77. headerView.setInt16(verOffset, 1);
  78. headerView.setInt32(opOffset, 2);
  79. headerView.setInt32(seqOffset, 1);
  80. headerView.setInt8(compressOffset, 0);
  81. headerView.setInt8(ctypeOffset, 0);
  82. ws.send(headerBuf);
  83. console.log("send: heartbeat");
  84. }
  85. function auth() {
  86. var token ='{"room_id":"test://room_001","platform":"web"}' // ,"device_id":"123"
  87. var headerBuf = new ArrayBuffer(rawHeaderLen);
  88. var headerView = new DataView(headerBuf, 0);
  89. var bodyBuf = textEncoder.encode(token);
  90. headerView.setInt32(packetOffset, rawHeaderLen + bodyBuf.byteLength);
  91. headerView.setInt16(headerOffset, rawHeaderLen);
  92. headerView.setInt16(verOffset, 1);
  93. headerView.setInt32(opOffset, 7);
  94. headerView.setInt32(seqOffset, 1);
  95. headerView.setInt8(compressOffset, 0);
  96. headerView.setInt8(ctypeOffset, 0);
  97. ws.send(mergeArrayBuffer(headerBuf, bodyBuf));
  98. }
  99. function register() {
  100. var token ='{"operations":[1001,1002,1003]}' // ,"device_id":"123"
  101. var headerBuf = new ArrayBuffer(rawHeaderLen);
  102. var headerView = new DataView(headerBuf, 0);
  103. var bodyBuf = textEncoder.encode(token);
  104. headerView.setInt32(packetOffset, rawHeaderLen + bodyBuf.byteLength);
  105. headerView.setInt16(headerOffset, rawHeaderLen);
  106. headerView.setInt16(verOffset, 1);
  107. headerView.setInt32(opOffset, 14);
  108. headerView.setInt32(seqOffset, 3);
  109. headerView.setInt8(compressOffset, 0);
  110. headerView.setInt8(ctypeOffset, 0);
  111. ws.send(mergeArrayBuffer(headerBuf, bodyBuf));
  112. }
  113. function messageReceived(ver, body) {
  114. var notify = self.options.notify;
  115. if(notify) notify(body);
  116. console.log("messageReceived:", "ver=" + ver, "body=" + body);
  117. }
  118. function mergeArrayBuffer(ab1, ab2) {
  119. var u81 = new Uint8Array(ab1),
  120. u82 = new Uint8Array(ab2),
  121. res = new Uint8Array(ab1.byteLength + ab2.byteLength);
  122. res.set(u81, 0);
  123. res.set(u82, ab1.byteLength);
  124. return res.buffer;
  125. }
  126. function char2ab(str) {
  127. var buf = new ArrayBuffer(str.length);
  128. var bufView = new Uint8Array(buf);
  129. for (var i=0; i<str.length; i++) {
  130. bufView[i] = str[i];
  131. }
  132. return buf;
  133. }
  134. }
  135. function reConnect() {
  136. self.createConnect(--max, delay * 2);
  137. }
  138. }
  139. win['MyClient'] = Client;
  140. })(window);