From 396c8250295fe698d236cce195ba51e582ca2ad7 Mon Sep 17 00:00:00 2001 From: Roman Turchin Date: Thu, 12 Jun 2025 18:06:05 +0200 Subject: [PATCH 1/2] Allow to set custom websocket factory --- site/source/docs/porting/networking.rst | 3 +++ src/lib/libsockfs.js | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/site/source/docs/porting/networking.rst b/site/source/docs/porting/networking.rst index 150661b8e778f..b8916989d5715 100644 --- a/site/source/docs/porting/networking.rst +++ b/site/source/docs/porting/networking.rst @@ -51,6 +51,9 @@ This is the default build mode for Emscripten. Use the linker flag to connect to, and the linker flag ``-sWEBSOCKET_SUBPROTOCOL`` or ``Module['websocket']['subprotocol']`` to control the connection type (``'binary'`` or ``'text'``). +Or define custom WebSocket factory using ``Module['websocket']['factory']``. Factory +is called with options param ``{addr, port, type, family, protocol}`` and +must return WebSocket instance. Full POSIX Sockets over WebSocket Proxy Server ============================================== diff --git a/src/lib/libsockfs.js b/src/lib/libsockfs.js index 7ada365896fdc..24f267cd91664 100644 --- a/src/lib/libsockfs.js +++ b/src/lib/libsockfs.js @@ -172,6 +172,19 @@ addToLibrary({ addr = result[1]; port = parseInt(result[2], 10); } + } else if (typeof SOCKFS.websocketArgs["factory"] === "function") { + try { + ws = SOCKFS.websocketArgs["factory"]({ + addr, + port, + type: sock.type, + family: sock.family, + protocol: sock.protocol + }); + ws.binaryType = 'arraybuffer'; + } catch (e) { + throw new FS.ErrnoError({{{ cDefs.EHOSTUNREACH }}}); + } } else { // create the actual websocket object and connect try { From b6e661ca13fac78c70b34dd0765e053f57a02156 Mon Sep 17 00:00:00 2001 From: Roman Turchin Date: Thu, 12 Jun 2025 21:54:23 +0200 Subject: [PATCH 2/2] wrap ws factory with expectToReceiveOnModule(websocket) --- src/lib/libsockfs.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib/libsockfs.js b/src/lib/libsockfs.js index 24f267cd91664..14db4b71bcad0 100644 --- a/src/lib/libsockfs.js +++ b/src/lib/libsockfs.js @@ -172,7 +172,9 @@ addToLibrary({ addr = result[1]; port = parseInt(result[2], 10); } - } else if (typeof SOCKFS.websocketArgs["factory"] === "function") { + } +#if expectToReceiveOnModule('websocket') + else if (typeof SOCKFS.websocketArgs["factory"] === "function") { try { ws = SOCKFS.websocketArgs["factory"]({ addr, @@ -185,7 +187,9 @@ addToLibrary({ } catch (e) { throw new FS.ErrnoError({{{ cDefs.EHOSTUNREACH }}}); } - } else { + } +#endif + else { // create the actual websocket object and connect try { // The default value is 'ws://' the replace is needed because the compiler replaces '//' comments with '#'