7
7
var LibraryWebSocket = {
8
8
$WS : {
9
9
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
+ } ,
11
18
} ,
12
19
13
20
emscripten_websocket_get_ready_state__deps : [ '$WS' ] ,
@@ -136,9 +143,7 @@ var LibraryWebSocket = {
136
143
// TODO:
137
144
// if (thread == {{{ cDefs.EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD }}} ||
138
145
// (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 ) ;
142
147
var socket = WS . sockets [ socketId ] ;
143
148
if ( ! socket ) {
144
149
#if WEBSOCKET_DEBUG
@@ -154,17 +159,15 @@ var LibraryWebSocket = {
154
159
#if WEBSOCKET_DEBUG
155
160
dbg ( `websocket event "open": socketId=${ socketId } ,userData=${ userData } ,callbackFunc=${ callbackFunc } )` ) ;
156
161
#endif
157
- HEAPU32 [ WS . socketEvent >> 2 ] = socketId ;
158
- { { { makeDynCall ( 'iipp' , 'callbackFunc' ) } } } ( 0 /*TODO*/ , WS . socketEvent , userData ) ;
162
+ { { { makeDynCall ( 'iipp' , 'callbackFunc' ) } } } ( 0 /*TODO*/ , eventPtr , userData ) ;
159
163
}
160
164
return { { { cDefs . EMSCRIPTEN_RESULT_SUCCESS } } } ;
161
165
} ,
162
166
163
167
emscripten_websocket_set_onerror_callback_on_thread__deps : [ '$WS' ] ,
164
168
emscripten_websocket_set_onerror_callback_on_thread__proxy : 'sync' ,
165
169
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 ) ;
168
171
var socket = WS . sockets [ socketId ] ;
169
172
if ( ! socket ) {
170
173
#if WEBSOCKET_DEBUG
@@ -180,17 +183,15 @@ var LibraryWebSocket = {
180
183
#if WEBSOCKET_DEBUG
181
184
dbg ( `websocket event "error": socketId=${ socketId } ,userData=${ userData } ,callbackFunc=${ callbackFunc } )` ) ;
182
185
#endif
183
- HEAPU32 [ WS . socketEvent >> 2 ] = socketId ;
184
- { { { makeDynCall ( 'iipp' , 'callbackFunc' ) } } } ( 0 /*TODO*/ , WS . socketEvent , userData ) ;
186
+ { { { makeDynCall ( 'iipp' , 'callbackFunc' ) } } } ( 0 /*TODO*/ , eventPtr , userData ) ;
185
187
}
186
188
return { { { cDefs . EMSCRIPTEN_RESULT_SUCCESS } } } ;
187
189
} ,
188
190
189
191
emscripten_websocket_set_onclose_callback_on_thread__deps : [ '$WS' , '$stringToUTF8' ] ,
190
192
emscripten_websocket_set_onclose_callback_on_thread__proxy : 'sync' ,
191
193
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 ) ;
194
195
var socket = WS . sockets [ socketId ] ;
195
196
if ( ! socket ) {
196
197
#if WEBSOCKET_DEBUG
@@ -206,20 +207,18 @@ var LibraryWebSocket = {
206
207
#if WEBSOCKET_DEBUG
207
208
dbg ( `websocket event "close": socketId=${ socketId } ,userData=${ userData } ,callbackFunc=${ callbackFunc } )` ) ;
208
209
#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 ) ;
214
214
}
215
215
return { { { cDefs . EMSCRIPTEN_RESULT_SUCCESS } } } ;
216
216
} ,
217
217
218
218
emscripten_websocket_set_onmessage_callback_on_thread__deps : [ '$WS' , '$stringToNewUTF8' , 'malloc' , 'free' ] ,
219
219
emscripten_websocket_set_onmessage_callback_on_thread__proxy : 'sync' ,
220
220
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 ) ;
223
222
var socket = WS . sockets [ socketId ] ;
224
223
if ( ! socket ) {
225
224
#if WEBSOCKET_DEBUG
@@ -235,15 +234,14 @@ var LibraryWebSocket = {
235
234
#if WEBSOCKET_DEBUG == 2
236
235
dbg ( `websocket event "message": socketId=${ socketId } ,userData=${ userData } ,callbackFunc=${ callbackFunc } )` ) ;
237
236
#endif
238
- HEAPU32 [ WS . socketEvent >> 2 ] = socketId ;
239
- if ( typeof e . data == 'string' ) {
237
+ var isText = typeof e . data == 'string' ;
238
+ if ( isText ) {
240
239
var buf = stringToNewUTF8 ( e . data ) ;
241
240
var len = lengthBytesUTF8 ( e . data ) + 1 ;
242
241
#if WEBSOCKET_DEBUG
243
242
var s = ( e . data . length < 256 ) ? e . data : ( e . data . substr ( 0 , 256 ) + ` (${ e . data . length - 256 } more characters)` ) ;
244
243
dbg ( `WebSocket onmessage, received data: "${ e . data } ", ${ e . data . length } chars, ${ len } bytes encoded as UTF-8: "${ s } "` ) ;
245
244
#endif
246
- HEAPU32 [ ( WS . socketEvent + 12 ) >> 2 ] = 1 ; // text data
247
245
} else {
248
246
var len = e . data . byteLength ;
249
247
var buf = _malloc ( len ) ;
@@ -258,11 +256,11 @@ var LibraryWebSocket = {
258
256
259
257
dbg ( s ) ;
260
258
#endif
261
- HEAPU32 [ ( WS . socketEvent + 12 ) >> 2 ] = 0 ; // binary data
262
259
}
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 ) ;
266
264
_free ( buf ) ;
267
265
}
268
266
return { { { cDefs . EMSCRIPTEN_RESULT_SUCCESS } } } ;
@@ -284,9 +282,8 @@ var LibraryWebSocket = {
284
282
return { { { cDefs . EMSCRIPTEN_RESULT_INVALID_PARAM } } } ;
285
283
}
286
284
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 , '*' ) } } }
290
287
// TODO: Add support for createOnMainThread==false; currently all WebSocket connections are created on the main thread.
291
288
// var createOnMainThread = HEAP32[createAttrs+2];
292
289
0 commit comments