Skip to content

Commit 56c214a

Browse files
authored
Fix emscripten_websocket_deinitialize() (#25744)
This code was broken by #21531 and was untested.
1 parent 0f21271 commit 56c214a

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

src/lib/libwebsocket.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -409,21 +409,19 @@ var LibraryWebSocket = {
409409
emscripten_websocket_is_supported__proxy: 'sync',
410410
emscripten_websocket_is_supported: () => typeof WebSocket != 'undefined',
411411

412-
emscripten_websocket_deinitialize__deps: ['$WS'],
412+
emscripten_websocket_deinitialize__deps: ['$webSockets', 'emscripten_websocket_delete'],
413413
emscripten_websocket_deinitialize__proxy: 'sync',
414-
emscripten_websocket_deinitialize__deps: ['emscripten_websocket_delete'],
415414
emscripten_websocket_deinitialize: () => {
416415
#if WEBSOCKET_DEBUG
417416
dbg('emscripten_websocket_deinitialize()');
418417
#endif
419-
for (var i in WS.sockets) {
420-
var socket = WS.sockets[i];
421-
if (socket) {
418+
for (var i in webSockets.allocated) {
419+
if (webSockets.has(i)) {
420+
var socket = webSockets.get(i);
422421
socket.close();
423422
_emscripten_websocket_delete(i);
424423
}
425424
}
426-
WS.sockets = [];
427425
}
428426
}
429427

test/test_sockets.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ def test_nodejs_sockets_echo_subprotocol_runtime(self):
388388
@parameterized({
389389
'': [[]],
390390
'shared': [['-sSHARED_MEMORY']],
391+
'deinitialize': [['-DTEST_EMSCRIPTEN_WEBSOCKET_DEINITIALIZE']],
391392
})
392393
@requires_dev_dependency('ws')
393394
def test_websocket_send(self, args):

test/websocket/test_websocket_send.c

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
#include <emscripten/websocket.h>
44
#include <assert.h>
55

6-
// This test performs that same server communications using two different
6+
// This test performs the same server communications using two different
77
// sockets. This verifies that multiple sockets are supported simultaneously.
8+
// Depending on whether TEST_EMSCRIPTEN_WEBSOCKET_DEINITIALIZE is defined,
9+
// cleanup is either performed using emscripten_websocket_deinitialize() or
10+
// emscripten_websocket_close() and emscripten_websocket_delete().
811
EMSCRIPTEN_WEBSOCKET_T sock1;
912
EMSCRIPTEN_WEBSOCKET_T sock2;
1013

@@ -44,6 +47,7 @@ bool WebSocketError(int eventType, const EmscriptenWebSocketErrorEvent *e, void
4447
bool WebSocketMessage(int eventType, const EmscriptenWebSocketMessageEvent *e, void *userData) {
4548
printf("message(socket=%d, eventType=%d, userData=%p data=%p, numBytes=%d, isText=%d)\n", e->socket, eventType, userData, e->data, e->numBytes, e->isText);
4649
static int text_received = 0;
50+
static int binary_received = 0;
4751
assert(e->socket == sock1 || e->socket == sock2);
4852
if (e->isText) {
4953
printf("text data: \"%s\"\n", e->data);
@@ -54,13 +58,39 @@ bool WebSocketMessage(int eventType, const EmscriptenWebSocketMessageEvent *e, v
5458

5559
// We expect to receive the text message before the binary one
5660
assert(text_received);
61+
binary_received++;
5762
printf("binary data:");
5863
for (int i = 0; i < e->numBytes; ++i) {
5964
printf(" %02X", e->data[i]);
6065
assert(e->data[i] == i);
6166
}
6267
printf("\n");
68+
69+
#ifdef TEST_EMSCRIPTEN_WEBSOCKET_DEINITIALIZE
70+
if (binary_received == 2) {
71+
// We successfully received binary data from both websockets.
72+
// We are done. We can deinitialize and exit.
73+
emscripten_websocket_deinitialize();
74+
// All websocket handles are invalidated.
75+
// It is no longer possible to query their state.
76+
unsigned short ready_state;
77+
EMSCRIPTEN_RESULT result = emscripten_websocket_get_ready_state(e->socket, &ready_state);
78+
assert(result == EMSCRIPTEN_RESULT_INVALID_TARGET);
79+
(void)ready_state;
80+
sock1 = sock2 = 0;
81+
emscripten_force_exit(0);
82+
}
83+
#else
6384
emscripten_websocket_close(e->socket, 0, 0);
85+
// The WebSocket is being closed, but its handle is still valid.
86+
// It should therefore still be possible to query its state.
87+
unsigned short ready_state;
88+
EMSCRIPTEN_RESULT result = emscripten_websocket_get_ready_state(e->socket, &ready_state);
89+
assert(result == EMSCRIPTEN_RESULT_SUCCESS);
90+
// https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/readyState
91+
assert(ready_state == 2); // 2 = CLOSING
92+
#endif // TEST_EMSCRIPTEN_WEBSOCKET_DEINITIALIZE
93+
6494
return 0;
6595
}
6696

0 commit comments

Comments
 (0)