WebSocket.jslib 3.0 KB

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