Skip to content

Commit 4c71fa1

Browse files
authored
Fix socket ID used in socket events when multiple sockets are used. NFC (#22505)
We were lacking tests that used multiple sockets at the same time. Fixes: #22376
1 parent 0a46553 commit 4c71fa1

File tree

2 files changed

+34
-15
lines changed

2 files changed

+34
-15
lines changed

src/library_websocket.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ var LibraryWebSocket = {
152152
// TODO:
153153
// if (thread == {{{ cDefs.EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD }}} ||
154154
// (thread == _pthread_self()) return emscripten_websocket_set_onopen_callback_on_calling_thread(socketId, userData, callbackFunc);
155-
var eventPtr = WS.getSocketEvent(socketId);
156155
var socket = WS.getSocket(socketId);
157156
if (!socket) {
158157
#if WEBSOCKET_DEBUG
@@ -168,6 +167,7 @@ var LibraryWebSocket = {
168167
#if WEBSOCKET_DEBUG
169168
dbg(`websocket event "open": socketId=${socketId},userData=${userData},callbackFunc=${callbackFunc})`);
170169
#endif
170+
var eventPtr = WS.getSocketEvent(socketId);
171171
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, eventPtr, userData);
172172
}
173173
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
@@ -176,7 +176,6 @@ var LibraryWebSocket = {
176176
emscripten_websocket_set_onerror_callback_on_thread__deps: ['$WS'],
177177
emscripten_websocket_set_onerror_callback_on_thread__proxy: 'sync',
178178
emscripten_websocket_set_onerror_callback_on_thread: (socketId, userData, callbackFunc, thread) => {
179-
var eventPtr = WS.getSocketEvent(socketId);
180179
var socket = WS.getSocket(socketId);
181180
if (!socket) {
182181
#if WEBSOCKET_DEBUG
@@ -192,6 +191,7 @@ var LibraryWebSocket = {
192191
#if WEBSOCKET_DEBUG
193192
dbg(`websocket event "error": socketId=${socketId},userData=${userData},callbackFunc=${callbackFunc})`);
194193
#endif
194+
var eventPtr = WS.getSocketEvent(socketId);
195195
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, eventPtr, userData);
196196
}
197197
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
@@ -200,7 +200,6 @@ var LibraryWebSocket = {
200200
emscripten_websocket_set_onclose_callback_on_thread__deps: ['$WS', '$stringToUTF8'],
201201
emscripten_websocket_set_onclose_callback_on_thread__proxy: 'sync',
202202
emscripten_websocket_set_onclose_callback_on_thread: (socketId, userData, callbackFunc, thread) => {
203-
var eventPtr = WS.getSocketEvent(socketId);
204203
var socket = WS.getSocket(socketId);
205204
if (!socket) {
206205
#if WEBSOCKET_DEBUG
@@ -216,6 +215,7 @@ var LibraryWebSocket = {
216215
#if WEBSOCKET_DEBUG
217216
dbg(`websocket event "close": socketId=${socketId},userData=${userData},callbackFunc=${callbackFunc})`);
218217
#endif
218+
var eventPtr = WS.getSocketEvent(socketId);
219219
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketCloseEvent.wasClean, 'e.wasClean', 'i8') }}},
220220
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketCloseEvent.wasClean, 'e.code', 'i16') }}},
221221
stringToUTF8(e.reason, eventPtr + {{{ C_STRUCTS.EmscriptenWebSocketCloseEvent.reason }}}, 512);
@@ -227,7 +227,6 @@ var LibraryWebSocket = {
227227
emscripten_websocket_set_onmessage_callback_on_thread__deps: ['$WS', '$stringToNewUTF8', 'malloc', 'free'],
228228
emscripten_websocket_set_onmessage_callback_on_thread__proxy: 'sync',
229229
emscripten_websocket_set_onmessage_callback_on_thread: (socketId, userData, callbackFunc, thread) => {
230-
var eventPtr = WS.getSocketEvent(socketId);
231230
var socket = WS.getSocket(socketId);
232231
if (!socket) {
233232
#if WEBSOCKET_DEBUG
@@ -266,6 +265,7 @@ var LibraryWebSocket = {
266265
dbg(s);
267266
#endif
268267
}
268+
var eventPtr = WS.getSocketEvent(socketId);
269269
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketMessageEvent.data, 'buf', '*') }}},
270270
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketMessageEvent.numBytes, 'len', 'i32') }}},
271271
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketMessageEvent.isText, 'isText', 'i8') }}},

test/websocket/test_websocket_send.c

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

6+
// This test performs that same server communications using two different
7+
// sockets. This verifies that multiple sockets are supported simultaneously.
8+
EMSCRIPTEN_WEBSOCKET_T sock1;
9+
EMSCRIPTEN_WEBSOCKET_T sock2;
10+
611
EM_BOOL WebSocketOpen(int eventType, const EmscriptenWebSocketOpenEvent *e, void *userData) {
7-
printf("open(eventType=%d, userData=%p)\n", eventType, userData);
12+
printf("open(socket=%d, eventType=%d, userData=%p)\n", e->socket, eventType, userData);
813

914
emscripten_websocket_send_utf8_text(e->socket, "hello on the other side");
1015

@@ -15,43 +20,50 @@ EM_BOOL WebSocketOpen(int eventType, const EmscriptenWebSocketOpenEvent *e, void
1520
}
1621

1722
EM_BOOL WebSocketClose(int eventType, const EmscriptenWebSocketCloseEvent *e, void *userData) {
18-
printf("close(eventType=%d, wasClean=%d, code=%d, reason=%s, userData=%p)\n", eventType, e->wasClean, e->code, e->reason, userData);
23+
printf("close(socket=%d, eventType=%d, wasClean=%d, code=%d, reason=%s, userData=%p)\n", e->socket, eventType, e->wasClean, e->code, e->reason, userData);
1924
return 0;
2025
}
2126

2227
EM_BOOL WebSocketError(int eventType, const EmscriptenWebSocketErrorEvent *e, void *userData) {
23-
printf("error(eventType=%d, userData=%p)\n", eventType, userData);
28+
printf("error(socket=%d, eventType=%d, userData=%p)\n", e->socket, eventType, userData);
2429
return 0;
2530
}
2631

2732
EM_BOOL WebSocketMessage(int eventType, const EmscriptenWebSocketMessageEvent *e, void *userData) {
28-
printf("message(eventType=%d, userData=%p data=%p, numBytes=%d, isText=%d)\n", eventType, userData, e->data, e->numBytes, e->isText);
33+
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);
2934
static int text_received = 0;
35+
assert(e->socket == sock1 || e->socket == sock2);
3036
if (e->isText) {
3137
printf("text data: \"%s\"\n", e->data);
3238
assert(strcmp((const char*)e->data, "hello on the other side") == 0);
33-
text_received = 1;
39+
text_received++;
3440
return 0;
3541
}
3642

37-
// We expect to receive the text message beofre the binary one
43+
// We expect to receive the text message before the binary one
3844
assert(text_received);
3945
printf("binary data:");
4046
for (int i = 0; i < e->numBytes; ++i) {
4147
printf(" %02X", e->data[i]);
4248
assert(e->data[i] == i);
4349
}
4450
printf("\n");
45-
4651
emscripten_websocket_close(e->socket, 0, 0);
4752
emscripten_websocket_delete(e->socket);
48-
emscripten_force_exit(0);
53+
if (e->socket == sock1) {
54+
sock1 = 0;
55+
} else {
56+
sock2 = 0;
57+
}
58+
// Once both sockets are closed we are done.
59+
if (!sock1 && !sock2) {
60+
emscripten_force_exit(0);
61+
}
62+
4963
return 0;
5064
}
5165

52-
int main() {
53-
assert(emscripten_websocket_is_supported());
54-
66+
EMSCRIPTEN_WEBSOCKET_T create_socket() {
5567
EmscriptenWebSocketCreateAttributes attr;
5668
emscripten_websocket_init_create_attributes(&attr);
5769

@@ -106,6 +118,13 @@ int main() {
106118
emscripten_websocket_set_onclose_callback(socket, (void*)0x43, WebSocketClose);
107119
emscripten_websocket_set_onerror_callback(socket, (void*)0x44, WebSocketError);
108120
emscripten_websocket_set_onmessage_callback(socket, (void*)0x45, WebSocketMessage);
121+
return socket;
122+
}
123+
124+
int main() {
125+
assert(emscripten_websocket_is_supported());
126+
sock1 = create_socket();
127+
sock2 = create_socket();
109128
emscripten_exit_with_live_runtime();
110129
return 0;
111130
}

0 commit comments

Comments
 (0)