WebSocket.jslib 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. var LibraryWebSockets = {
  2. $webSocketInstances: [],
  3. SocketCreate: function(url, protocols)
  4. {
  5. var str = UTF8ToString(url);
  6. var prot = UTF8ToString(protocols);
  7. var socket = {
  8. socket: new WebSocket(str, [prot]),
  9. buffer: new Uint8Array(0),
  10. error: null,
  11. messages: []
  12. }
  13. socket.socket.binaryType = 'arraybuffer';
  14. socket.socket.onmessage = function (e) {
  15. // if (e.data instanceof Blob)
  16. // {
  17. // var reader = new FileReader();
  18. // reader.addEventListener("loadend", function() {
  19. // var array = new Uint8Array(reader.result);
  20. // socket.messages.push(array);
  21. // });
  22. // reader.readAsArrayBuffer(e.data);
  23. // }
  24. if (e.data instanceof ArrayBuffer)
  25. {
  26. var array = new Uint8Array(e.data);
  27. socket.messages.push(array);
  28. }
  29. };
  30. socket.socket.onclose = function (e) {
  31. if (e.code != 1000)
  32. {
  33. if (e.reason != null && e.reason.length > 0)
  34. socket.error = e.reason;
  35. else
  36. {
  37. switch (e.code)
  38. {
  39. case 1001:
  40. socket.error = "Endpoint going away.";
  41. break;
  42. case 1002:
  43. socket.error = "Protocol error.";
  44. break;
  45. case 1003:
  46. socket.error = "Unsupported message.";
  47. break;
  48. case 1005:
  49. socket.error = "No status.";
  50. break;
  51. case 1006:
  52. socket.error = "Abnormal disconnection.";
  53. break;
  54. case 1009:
  55. socket.error = "Data frame too large.";
  56. break;
  57. default:
  58. socket.error = "Error "+e.code;
  59. }
  60. }
  61. }
  62. }
  63. var instance = webSocketInstances.push(socket) - 1;
  64. return instance;
  65. },
  66. SocketState: function (socketInstance)
  67. {
  68. var socket = webSocketInstances[socketInstance];
  69. return socket.socket.readyState;
  70. },
  71. SocketError: function (socketInstance, ptr, bufsize)
  72. {
  73. var socket = webSocketInstances[socketInstance];
  74. if (socket.error == null)
  75. return 0;
  76. stringToUTF8(socket.error, ptr, bufsize);
  77. return 1;
  78. },
  79. SocketSend: function (socketInstance, ptr, length)
  80. {
  81. var socket = webSocketInstances[socketInstance];
  82. socket.socket.send (HEAPU8.buffer.slice(ptr, ptr+length));
  83. },
  84. SocketRecvLength: function(socketInstance)
  85. {
  86. var socket = webSocketInstances[socketInstance];
  87. if (socket.messages.length == 0)
  88. return 0;
  89. return socket.messages[0].length;
  90. },
  91. SocketRecv: function (socketInstance, ptr, length)
  92. {
  93. var socket = webSocketInstances[socketInstance];
  94. if (socket.messages.length == 0)
  95. return 0;
  96. if (socket.messages[0].length > length)
  97. return 0;
  98. HEAPU8.set(socket.messages[0], ptr);
  99. socket.messages = socket.messages.slice(1);
  100. },
  101. SocketClose: function (socketInstance)
  102. {
  103. var socket = webSocketInstances[socketInstance];
  104. socket.socket.close();
  105. }
  106. };
  107. autoAddDeps(LibraryWebSockets, '$webSocketInstances');
  108. mergeInto(LibraryManager.library, LibraryWebSockets);