Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/library_websocket.js
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,6 @@ var LibraryWebSocket = {
// TODO:
// if (thread == {{{ cDefs.EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD }}} ||
// (thread == _pthread_self()) return emscripten_websocket_set_onopen_callback_on_calling_thread(socketId, userData, callbackFunc);
var eventPtr = WS.getSocketEvent(socketId);
var socket = WS.getSocket(socketId);
if (!socket) {
#if WEBSOCKET_DEBUG
Expand All @@ -168,6 +167,7 @@ var LibraryWebSocket = {
#if WEBSOCKET_DEBUG
dbg(`websocket event "open": socketId=${socketId},userData=${userData},callbackFunc=${callbackFunc})`);
#endif
var eventPtr = WS.getSocketEvent(socketId);
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, eventPtr, userData);
}
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
Expand All @@ -176,7 +176,6 @@ var LibraryWebSocket = {
emscripten_websocket_set_onerror_callback_on_thread__deps: ['$WS'],
emscripten_websocket_set_onerror_callback_on_thread__proxy: 'sync',
emscripten_websocket_set_onerror_callback_on_thread: (socketId, userData, callbackFunc, thread) => {
var eventPtr = WS.getSocketEvent(socketId);
var socket = WS.getSocket(socketId);
if (!socket) {
#if WEBSOCKET_DEBUG
Expand All @@ -192,6 +191,7 @@ var LibraryWebSocket = {
#if WEBSOCKET_DEBUG
dbg(`websocket event "error": socketId=${socketId},userData=${userData},callbackFunc=${callbackFunc})`);
#endif
var eventPtr = WS.getSocketEvent(socketId);
{{{ makeDynCall('iipp', 'callbackFunc') }}}(0/*TODO*/, eventPtr, userData);
}
return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}};
Expand All @@ -200,7 +200,6 @@ var LibraryWebSocket = {
emscripten_websocket_set_onclose_callback_on_thread__deps: ['$WS', '$stringToUTF8'],
emscripten_websocket_set_onclose_callback_on_thread__proxy: 'sync',
emscripten_websocket_set_onclose_callback_on_thread: (socketId, userData, callbackFunc, thread) => {
var eventPtr = WS.getSocketEvent(socketId);
var socket = WS.getSocket(socketId);
if (!socket) {
#if WEBSOCKET_DEBUG
Expand All @@ -216,6 +215,7 @@ var LibraryWebSocket = {
#if WEBSOCKET_DEBUG
dbg(`websocket event "close": socketId=${socketId},userData=${userData},callbackFunc=${callbackFunc})`);
#endif
var eventPtr = WS.getSocketEvent(socketId);
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketCloseEvent.wasClean, 'e.wasClean', 'i8') }}},
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketCloseEvent.wasClean, 'e.code', 'i16') }}},
stringToUTF8(e.reason, eventPtr + {{{ C_STRUCTS.EmscriptenWebSocketCloseEvent.reason }}}, 512);
Expand All @@ -227,7 +227,6 @@ var LibraryWebSocket = {
emscripten_websocket_set_onmessage_callback_on_thread__deps: ['$WS', '$stringToNewUTF8', 'malloc', 'free'],
emscripten_websocket_set_onmessage_callback_on_thread__proxy: 'sync',
emscripten_websocket_set_onmessage_callback_on_thread: (socketId, userData, callbackFunc, thread) => {
var eventPtr = WS.getSocketEvent(socketId);
var socket = WS.getSocket(socketId);
if (!socket) {
#if WEBSOCKET_DEBUG
Expand Down Expand Up @@ -266,6 +265,7 @@ var LibraryWebSocket = {
dbg(s);
#endif
}
var eventPtr = WS.getSocketEvent(socketId);
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketMessageEvent.data, 'buf', '*') }}},
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketMessageEvent.numBytes, 'len', 'i32') }}},
{{{ makeSetValue('eventPtr', C_STRUCTS.EmscriptenWebSocketMessageEvent.isText, 'isText', 'i8') }}},
Expand Down
41 changes: 30 additions & 11 deletions test/websocket/test_websocket_send.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,13 @@
#include <emscripten/websocket.h>
#include <assert.h>

// This test performs that same server communications using two different
// sockets. This verifies that multiple sockets are supported simultaneously.
EMSCRIPTEN_WEBSOCKET_T sock1;
EMSCRIPTEN_WEBSOCKET_T sock2;

EM_BOOL WebSocketOpen(int eventType, const EmscriptenWebSocketOpenEvent *e, void *userData) {
printf("open(eventType=%d, userData=%p)\n", eventType, userData);
printf("open(socket=%d, eventType=%d, userData=%p)\n", e->socket, eventType, userData);

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

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

EM_BOOL WebSocketClose(int eventType, const EmscriptenWebSocketCloseEvent *e, void *userData) {
printf("close(eventType=%d, wasClean=%d, code=%d, reason=%s, userData=%p)\n", eventType, e->wasClean, e->code, e->reason, userData);
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);
return 0;
}

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

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

// We expect to receive the text message beofre the binary one
// We expect to receive the text message before the binary one
assert(text_received);
printf("binary data:");
for (int i = 0; i < e->numBytes; ++i) {
printf(" %02X", e->data[i]);
assert(e->data[i] == i);
}
printf("\n");

emscripten_websocket_close(e->socket, 0, 0);
emscripten_websocket_delete(e->socket);
emscripten_force_exit(0);
if (e->socket == sock1) {
sock1 = 0;
} else {
sock2 = 0;
}
// Once both sockets are closed we are done.
if (!sock1 && !sock2) {
emscripten_force_exit(0);
}

return 0;
}

int main() {
assert(emscripten_websocket_is_supported());

EMSCRIPTEN_WEBSOCKET_T create_socket() {
EmscriptenWebSocketCreateAttributes attr;
emscripten_websocket_init_create_attributes(&attr);

Expand Down Expand Up @@ -106,6 +118,13 @@ int main() {
emscripten_websocket_set_onclose_callback(socket, (void*)0x43, WebSocketClose);
emscripten_websocket_set_onerror_callback(socket, (void*)0x44, WebSocketError);
emscripten_websocket_set_onmessage_callback(socket, (void*)0x45, WebSocketMessage);
return socket;
}

int main() {
assert(emscripten_websocket_is_supported());
sock1 = create_socket();
sock2 = create_socket();
emscripten_exit_with_live_runtime();
return 0;
}