BestHTTP_WebSocket.jslib 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. var Lib_BEST_HTTP_WebGL_WS_Bridge =
  2. {
  3. $ws: {
  4. webSocketInstances: {},
  5. nextInstanceId : 1,
  6. /*UTF8Decoder: new TextDecoder('utf8'),*/
  7. Set : function(socket) {
  8. ws.webSocketInstances[ws.nextInstanceId] = socket;
  9. return ws.nextInstanceId++;
  10. },
  11. Get : function(id) {
  12. return ws.webSocketInstances[id];
  13. },
  14. Remove: function(id) {
  15. delete ws.webSocketInstances[id];
  16. },
  17. _callOnClose: function(onClose, id, code, reason)
  18. {
  19. var length = lengthBytesUTF8(reason) + 1;
  20. var buffer = _malloc(length);
  21. stringToUTF8Array(reason, HEAPU8, buffer, length);
  22. Module['dynCall_viii'](onClose, id, code, buffer);
  23. _free(buffer);
  24. },
  25. _callOnError: function(errCallback, id, reason)
  26. {
  27. var length = lengthBytesUTF8(reason) + 1;
  28. var buffer = _malloc(length);
  29. stringToUTF8Array(reason, HEAPU8, buffer, length);
  30. Module['dynCall_vii'](errCallback, id, buffer);
  31. _free(buffer);
  32. }
  33. },
  34. WS_Create: function(url, protocol, onOpen, onText, onBinary, onError, onClose)
  35. {
  36. var urlStr = (UTF8ToString(url)).replace(/\+/g, '%2B').replace(/%252[fF]/ig, '%2F');
  37. var proto = UTF8ToString(protocol);
  38. console.log('WS_Create(' + urlStr + ', "' + proto + '")');
  39. var socket = {
  40. onError: onError,
  41. onClose: onClose
  42. };
  43. if (proto == '')
  44. socket.socketImpl = new WebSocket(urlStr);
  45. else
  46. socket.socketImpl = new WebSocket(urlStr, [proto]);
  47. var id = ws.nextInstanceId;
  48. socket.socketImpl.binaryType = "arraybuffer";
  49. socket.socketImpl.onopen = function(e) {
  50. console.log(id + ' WS_Create - onOpen');
  51. Module['dynCall_vi'](onOpen, id);
  52. };
  53. socket.socketImpl.onmessage = function (e)
  54. {
  55. // Binary?
  56. if (e.data instanceof ArrayBuffer)
  57. {
  58. var byteArray = new Uint8Array(e.data);
  59. var buffer = _malloc(byteArray.length);
  60. HEAPU8.set(byteArray, buffer);
  61. Module['dynCall_viii'](onBinary, id, buffer, byteArray.length);
  62. _free(buffer);
  63. }
  64. else // Text
  65. {
  66. var length = lengthBytesUTF8(e.data) + 1;
  67. var buffer = _malloc(length);
  68. stringToUTF8Array(e.data, HEAPU8, buffer, length);
  69. Module['dynCall_vii'](onText, id, buffer);
  70. _free(buffer);
  71. }
  72. };
  73. socket.socketImpl.onerror = function (e)
  74. {
  75. console.log(id + ' WS_Create - onError');
  76. // Do not call this, onClose will be called with an apropriate error code and reason
  77. //ws._callOnError(onError, id, "Unknown error.");
  78. };
  79. socket.socketImpl.onclose = function (e) {
  80. console.log(id + ' WS_Create - onClose ' + e.code + ' ' + e.reason);
  81. //if (e.code != 1000)
  82. //{
  83. // if (e.reason != null && e.reason.length > 0)
  84. // ws._callOnError(onError, id, e.reason);
  85. // else
  86. // {
  87. // switch (e.code)
  88. // {
  89. // case 1001: ws._callOnError(onError, id, "Endpoint going away.");
  90. // break;
  91. // case 1002: ws._callOnError(onError, id, "Protocol error.");
  92. // break;
  93. // case 1003: ws._callOnError(onError, id, "Unsupported message.");
  94. // break;
  95. // case 1005: ws._callOnError(onError, id, "No status.");
  96. // break;
  97. // case 1006: ws._callOnError(onError, id, "Abnormal disconnection.");
  98. // break;
  99. // case 1009: ws._callOnError(onError, id, "Data frame too large.");
  100. // break;
  101. // default: ws._callOnError(onError, id, "Error " + e.code);
  102. // }
  103. // }
  104. //}
  105. //else
  106. ws._callOnClose(onClose, id, e.code, e.reason);
  107. };
  108. return ws.Set(socket);
  109. },
  110. WS_GetState: function (id)
  111. {
  112. var socket = ws.Get(id);
  113. if (typeof socket === 'undefined' ||
  114. socket == null ||
  115. typeof socket.socketImpl === 'undefined' ||
  116. socket.socketImpl == null)
  117. return 3; // closed
  118. return socket.socketImpl.readyState;
  119. },
  120. WS_GetBufferedAmount: function (id)
  121. {
  122. var socket = ws.Get(id);
  123. return socket.socketImpl.bufferedAmount;
  124. },
  125. WS_Send_String: function (id, ptr, pos, length)
  126. {
  127. var socket = ws.Get(id);
  128. var startPtr = ptr + pos;
  129. var endPtr = startPtr + length;
  130. var UTF8Decoder = new TextDecoder('utf8');
  131. var str = UTF8Decoder.decode(HEAPU8.subarray ? HEAPU8.subarray(startPtr, endPtr) : new Uint8Array(HEAPU8.slice(startPtr, endPtr)));
  132. try
  133. {
  134. socket.socketImpl.send(str);
  135. }
  136. catch(e) {
  137. ws._callOnError(socket.onError, id, ' ' + e.name + ': ' + e.message);
  138. }
  139. return socket.socketImpl.bufferedAmount;
  140. },
  141. WS_Send_Binary: function(id, ptr, pos, length)
  142. {
  143. var socket = ws.Get(id);
  144. try
  145. {
  146. var buff = new Uint8Array(HEAPU8.subarray(ptr + pos, ptr + pos + length)).buffer;
  147. socket.socketImpl.send(buff /*HEAPU8.buffer.slice(ptr + pos, ptr + pos + length)*/);
  148. }
  149. catch(e) {
  150. ws._callOnError(socket.onError, id, ' ' + e.name + ': ' + e.message);
  151. }
  152. return socket.socketImpl.bufferedAmount;
  153. },
  154. WS_Close: function (id, code, reason)
  155. {
  156. var socket = ws.Get(id);
  157. var reasonStr = UTF8ToString(reason);
  158. console.log(id + ' WS_Close(' + code + ', ' + reasonStr + ')');
  159. socket.socketImpl.close(/*ulong*/code, reasonStr);
  160. },
  161. WS_Release: function(id)
  162. {
  163. console.log(id + ' WS_Release');
  164. ws.Remove(id);
  165. }
  166. };
  167. autoAddDeps(Lib_BEST_HTTP_WebGL_WS_Bridge, '$ws');
  168. mergeInto(LibraryManager.library, Lib_BEST_HTTP_WebGL_WS_Bridge);