Skip to content

Commit 30bb30b

Browse files
committed
[wasm64] Fix library_websocket.js
Update `test_websocket_send.c` such that it checks that both text and binary messages are received. Also, delete `websocket.c` which I think was supposed to be removed as part of emscripten-core#7672 (where it was renamed to test_websocket_send.c). Fixes: emscripten-core#21515
1 parent cf90417 commit 30bb30b

6 files changed

+170
-203
lines changed

src/generated_struct_info32.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,22 @@
627627
"renderViaOffscreenBackBuffer": 52,
628628
"stencil": 8
629629
},
630+
"EmscriptenWebSocketCloseEvent": {
631+
"__size__": 524,
632+
"code": 8,
633+
"reason": 10,
634+
"wasClean": 4
635+
},
636+
"EmscriptenWebSocketCreateAttributes": {
637+
"__size__": 12,
638+
"protocols": 4
639+
},
640+
"EmscriptenWebSocketMessageEvent": {
641+
"__size__": 16,
642+
"data": 4,
643+
"isText": 12,
644+
"numBytes": 8
645+
},
630646
"EmscriptenWheelEvent": {
631647
"__size__": 104,
632648
"deltaMode": 96,

src/generated_struct_info64.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,22 @@
627627
"renderViaOffscreenBackBuffer": 52,
628628
"stencil": 8
629629
},
630+
"EmscriptenWebSocketCloseEvent": {
631+
"__size__": 524,
632+
"code": 8,
633+
"reason": 10,
634+
"wasClean": 4
635+
},
636+
"EmscriptenWebSocketCreateAttributes": {
637+
"__size__": 24,
638+
"protocols": 8
639+
},
640+
"EmscriptenWebSocketMessageEvent": {
641+
"__size__": 24,
642+
"data": 8,
643+
"isText": 20,
644+
"numBytes": 16
645+
},
630646
"EmscriptenWheelEvent": {
631647
"__size__": 104,
632648
"deltaMode": 96,

src/library_websocket.js

Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,14 @@
77
var LibraryWebSocket = {
88
$WS: {
99
sockets: [null],
10-
socketEvent: null
10+
socketEvent: null,
11+
getSocketEvent(socketId) {
12+
// Singleton event pointer. Use EmscriptenWebSocketCloseEvent, which is
13+
// the largest event struct
14+
this.socketEvent ||= _malloc({{{ C_STRUCTS.EmscriptenWebSocketCloseEvent.__size__ }}});
15+
{{{ makeSetValue('this.socketEvent', 0, 'socketId', 'u32') }}};
16+
return this.socketEvent;
17+
},
1118
},
1219

1320
emscripten_websocket_get_ready_state__deps: ['$WS'],
@@ -136,9 +143,7 @@ var LibraryWebSocket = {
136143
// TODO:
137144
// if (thread == {{{ cDefs.EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD }}} ||
138145
// (thread == _pthread_self()) return emscripten_websocket_set_onopen_callback_on_calling_thread(socketId, userData, callbackFunc);
139-
140-
WS.socketEvent ||= _malloc(1024); // TODO: sizeof(EmscriptenWebSocketCloseEvent), which is the largest event struct
141-
146+
var eventPtr = WS.getSocketEvent(socketId);
142147
var socket = WS.sockets[socketId];
143148
if (!socket) {
144149
#if WEBSOCKET_DEBUG
@@ -154,17 +159,15 @@ var LibraryWebSocket = {
154159
#if WEBSOCKET_DEBUG
155160
dbg(`websocket event "open": socketId=${socketId},userData=${userData},callbackFunc=${callbackFunc})`);
156161
#endif
157-
HEAPU32[WS.socketEvent>>2] = socketId;
158-
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData);
162+
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, eventPtr, userData);
159163
}
160164
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
161165
},
162166

163167
emscripten_websocket_set_onerror_callback_on_thread__deps: ['$WS'],
164168
emscripten_websocket_set_onerror_callback_on_thread__proxy: 'sync',
165169
emscripten_websocket_set_onerror_callback_on_thread: (socketId, userData, callbackFunc, thread) => {
166-
WS.socketEvent ||= _malloc(1024); // TODO: sizeof(EmscriptenWebSocketCloseEvent), which is the largest event struct
167-
170+
var eventPtr = WS.getSocketEvent(socketId);
168171
var socket = WS.sockets[socketId];
169172
if (!socket) {
170173
#if WEBSOCKET_DEBUG
@@ -180,17 +183,15 @@ var LibraryWebSocket = {
180183
#if WEBSOCKET_DEBUG
181184
dbg(`websocket event "error": socketId=${socketId},userData=${userData},callbackFunc=${callbackFunc})`);
182185
#endif
183-
HEAPU32[WS.socketEvent>>2] = socketId;
184-
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData);
186+
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, eventPtr, userData);
185187
}
186188
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
187189
},
188190

189191
emscripten_websocket_set_onclose_callback_on_thread__deps: ['$WS', '$stringToUTF8'],
190192
emscripten_websocket_set_onclose_callback_on_thread__proxy: 'sync',
191193
emscripten_websocket_set_onclose_callback_on_thread: (socketId, userData, callbackFunc, thread) => {
192-
WS.socketEvent ||= _malloc(1024); // TODO: sizeof(EmscriptenWebSocketCloseEvent), which is the largest event struct
193-
194+
var eventPtr = WS.getSocketEvent(socketId);
194195
var socket = WS.sockets[socketId];
195196
if (!socket) {
196197
#if WEBSOCKET_DEBUG
@@ -206,20 +207,18 @@ var LibraryWebSocket = {
206207
#if WEBSOCKET_DEBUG
207208
dbg(`websocket event "close": socketId=${socketId},userData=${userData},callbackFunc=${callbackFunc})`);
208209
#endif
209-
HEAPU32[WS.socketEvent>>2] = socketId;
210-
HEAPU32[(WS.socketEvent+4)>>2] = e.wasClean;
211-
HEAPU32[(WS.socketEvent+8)>>2] = e.code;
212-
stringToUTF8(e.reason, WS.socketEvent+10, 512);
213-
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData);
210+
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketCloseEvent.wasClean, 'e.wasClean', 'i32') }}},
211+
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketCloseEvent.wasClean, 'e.code', 'i16') }}},
212+
stringToUTF8(e.reason, eventPtr + {{{ C_STRUCTS.EmscriptenWebSocketCloseEvent.reason }}}, 512);
213+
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, eventPtr, userData);
214214
}
215215
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
216216
},
217217

218218
emscripten_websocket_set_onmessage_callback_on_thread__deps: ['$WS', '$stringToNewUTF8', 'malloc', 'free'],
219219
emscripten_websocket_set_onmessage_callback_on_thread__proxy: 'sync',
220220
emscripten_websocket_set_onmessage_callback_on_thread: (socketId, userData, callbackFunc, thread) => {
221-
WS.socketEvent ||= _malloc(1024); // TODO: sizeof(EmscriptenWebSocketCloseEvent), which is the largest event struct
222-
221+
var eventPtr = WS.getSocketEvent(socketId);
223222
var socket = WS.sockets[socketId];
224223
if (!socket) {
225224
#if WEBSOCKET_DEBUG
@@ -235,15 +234,14 @@ var LibraryWebSocket = {
235234
#if WEBSOCKET_DEBUG == 2
236235
dbg(`websocket event "message": socketId=${socketId},userData=${userData},callbackFunc=${callbackFunc})`);
237236
#endif
238-
HEAPU32[WS.socketEvent>>2] = socketId;
239-
if (typeof e.data == 'string') {
237+
var isText = typeof e.data == 'string';
238+
if (isText) {
240239
var buf = stringToNewUTF8(e.data);
241240
var len = lengthBytesUTF8(e.data)+1;
242241
#if WEBSOCKET_DEBUG
243242
var s = (e.data.length < 256) ? e.data : (e.data.substr(0, 256) + ` (${e.data.length-256} more characters)`);
244243
dbg(`WebSocket onmessage, received data: "${e.data}", ${e.data.length} chars, ${len} bytes encoded as UTF-8: "${s}"`);
245244
#endif
246-
HEAPU32[(WS.socketEvent+12)>>2] = 1; // text data
247245
} else {
248246
var len = e.data.byteLength;
249247
var buf = _malloc(len);
@@ -258,11 +256,11 @@ var LibraryWebSocket = {
258256

259257
dbg(s);
260258
#endif
261-
HEAPU32[(WS.socketEvent+12)>>2] = 0; // binary data
262259
}
263-
HEAPU32[(WS.socketEvent+4)>>2] = buf;
264-
HEAPU32[(WS.socketEvent+8)>>2] = len;
265-
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, WS.socketEvent, userData);
260+
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketMessageEvent.data, 'buf', '*') }}},
261+
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketMessageEvent.numBytes, 'len', 'i32') }}},
262+
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketMessageEvent.isText, 'isText', 'i32') }}},
263+
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, eventPtr, userData);
266264
_free(buf);
267265
}
268266
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
@@ -284,9 +282,8 @@ var LibraryWebSocket = {
284282
return {{{ cDefs.EMSCRIPTEN_RESULT_INVALID_PARAM }}};
285283
}
286284

287-
var createAttrs = createAttributes>>2;
288-
var url = UTF8ToString(HEAP32[createAttrs]);
289-
var protocols = HEAP32[createAttrs+1];
285+
var url = UTF8ToString({{{ makeGetValue('createAttributes', 0, '*') }}});
286+
var protocols = {{{ makeGetValue('createAttributes', C_STRUCTS.EmscriptenWebSocketCreateAttributes.protocols, '*') }}}
290287
// TODO: Add support for createOnMainThread==false; currently all WebSocket connections are created on the main thread.
291288
// var createOnMainThread = HEAP32[createAttrs+2];
292289

src/struct_info.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,24 @@
11441144
]
11451145
}
11461146
},
1147+
{
1148+
"file": "emscripten/websocket.h",
1149+
"structs": {
1150+
"EmscriptenWebSocketCloseEvent": [
1151+
"wasClean",
1152+
"code",
1153+
"reason"
1154+
],
1155+
"EmscriptenWebSocketMessageEvent": [
1156+
"data",
1157+
"numBytes",
1158+
"isText"
1159+
],
1160+
"EmscriptenWebSocketCreateAttributes": [
1161+
"protocols"
1162+
]
1163+
}
1164+
},
11471165
{
11481166
"file": "AL/al.h",
11491167
"defines": [

0 commit comments

Comments
 (0)