Seven is the number.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
3.3 KiB

4 years ago
  1. var LibraryWebSockets = {
  2. $webSocketInstances: [],
  3. SocketCreate: function(url, protocols)
  4. {
  5. var str = Pointer_stringify(url);
  6. var prot = Pointer_stringify(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. var str = socket.error.slice(0, Math.max(0, bufsize - 1));
  77. writeStringToMemory(str, ptr, false);
  78. return 1;
  79. },
  80. SocketSend: function (socketInstance, ptr, length)
  81. {
  82. var socket = webSocketInstances[socketInstance];
  83. socket.socket.send (HEAPU8.buffer.slice(ptr, ptr+length));
  84. },
  85. SocketRecvLength: function(socketInstance)
  86. {
  87. var socket = webSocketInstances[socketInstance];
  88. if (socket.messages.length == 0)
  89. return 0;
  90. return socket.messages[0].length;
  91. },
  92. SocketRecv: function (socketInstance, ptr, length)
  93. {
  94. var socket = webSocketInstances[socketInstance];
  95. if (socket.messages.length == 0)
  96. return 0;
  97. if (socket.messages[0].length > length)
  98. return 0;
  99. HEAPU8.set(socket.messages[0], ptr);
  100. socket.messages = socket.messages.slice(1);
  101. },
  102. SocketClose: function (socketInstance)
  103. {
  104. var socket = webSocketInstances[socketInstance];
  105. socket.socket.close();
  106. }
  107. };
  108. autoAddDeps(LibraryWebSockets, '$webSocketInstances');
  109. mergeInto(LibraryManager.library, LibraryWebSockets);