diff options
author | 2022-06-17 04:26:44 -0700 | |
---|---|---|
committer | 2022-06-22 06:56:47 -0700 | |
commit | 38cc869104584987d0a7f3b21be4da196bb3f390 (patch) | |
tree | 6523c2d1d90a80f704e955af335a44d8e89b80f9 /src/javascript/jsc/bindings/webcore/WebSocketStream.cpp | |
parent | 5d8a99e1d4009cb4b9c7766b2af76c3df8364670 (diff) | |
download | bun-38cc869104584987d0a7f3b21be4da196bb3f390.tar.gz bun-38cc869104584987d0a7f3b21be4da196bb3f390.tar.zst bun-38cc869104584987d0a7f3b21be4da196bb3f390.zip |
WIP WebSocket
Diffstat (limited to 'src/javascript/jsc/bindings/webcore/WebSocketStream.cpp')
-rw-r--r-- | src/javascript/jsc/bindings/webcore/WebSocketStream.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/javascript/jsc/bindings/webcore/WebSocketStream.cpp b/src/javascript/jsc/bindings/webcore/WebSocketStream.cpp new file mode 100644 index 000000000..434860854 --- /dev/null +++ b/src/javascript/jsc/bindings/webcore/WebSocketStream.cpp @@ -0,0 +1,83 @@ +#include "WebSocketStream.h" +#include <uws/uSockets/src/libusockets.h> + +namespace WebCore { + +template<bool SSL, bool isServer> +WebSocketStreamBase<SSL, isServer>* WebSocketStreamBase<SSL, isServer>::adoptSocket(us_socket_t* socket, ScriptExecutionContext* scriptCtx) +{ + using UserData = WebCore::WebSocket; + + /* Adopting a socket invalidates it, do not rely on it directly to carry any data */ + uWS::WebSocket<SSL, isServer, UserData>* webSocket = (uWS::WebSocket<SSL, isServer, UserData>*)us_socket_context_adopt_socket(SSL, + (us_socket_context_t*)webSocketContext, (us_socket_t*)this, sizeof(WebSocketData) + sizeof(UserData)); + + /* For whatever reason we were corked, update cork to the new socket */ + if (wasCorked) { + webSocket->AsyncSocket<SSL>::corkUnchecked(); + } + + /* Initialize websocket with any moved backpressure intact */ + webSocket->init(perMessageDeflate, compressOptions, std::move(backpressure)); +} + +void WebSocketStreamBase::registerHTTPContext(ScriptExecutionContext* script, us_socket_context_t* ctx, us_loop_t* loop) +{ + if constexpr (!isServer) { + if constexpr (SSL) { + Bun__SecureWebSocketUpgradeClient__register(script->jsGlobalObject(), loop, ctx); + } else { + Bun__WebSocketUpgradeClient__register(script->jsGlobalObject(), loop, ctx); + } + } else { + RELEASE_ASSERT_NOT_REACHED(); + } +} + +template<bool SSL, bool isServer> +uWS::WebSocketContext* WebSocketStreamBase<SSL, isServer>::registerClientContext(ScriptExecutionContext*, us_socket_context_t* parent) +{ + uWS::Loop* loop = uWS::Loop::get(); + uWS::WebSocketContext<SSL, isServer>* ctx = uWS::WebSocketContext<SSL, isServer>::create(loop, parent, nullptr); + auto* opts = ctx->getExt(); + + /* Maximum message size we can receive */ + static unsigned int maxPayloadLength = 128 * 1024 * 1024; + /* 2 minutes timeout is good */ + static unsigned short idleTimeout = 120; + /* 64kb backpressure is probably good */ + static unsigned int maxBackpressure = 64 * 1024; + static bool closeOnBackpressureLimit = false; + /* This one depends on kernel timeouts and is a bad default */ + static bool resetIdleTimeoutOnSend = false; + /* A good default, esp. for newcomers */ + static bool sendPingsAutomatically = true; + /* Maximum socket lifetime in seconds before forced closure (defaults to disabled) */ + static unsigned short maxLifetime = 0; + + opts->maxPayloadLength = maxPayloadLength; + opts->maxBackpressure = maxBackpressure; + opts->closeOnBackpressureLimit = closeOnBackpressureLimit; + opts->resetIdleTimeoutOnSend = resetIdleTimeoutOnSend; + opts->sendPingsAutomatically = sendPingsAutomatically; + // opts->compression = compression; + // TODO: + opts->compression = false; + + opts->openHandler = [](uWS::WebSocket<SSL, isServer, WebCore::WebSocket>* ws) { + auto* webSocket = ws->getUserData(); + webSocket->didOpen(); + }; + + opts->messageHandler = [](uWS::WebSocket<SSL, isServer, WebCore::WebSocket>* ws, std::string_view input, uWS::OpCode opCode) { + auto* webSocket = ws->getUserData(); + webSocket->didReceiveData<uWS::WebSocket<SSL, isServer, WebCore::WebSocket>*>(ws, input.data(), input.length()); + }; + + opts->closeHandler = [](uWS::WebSocket<SSL, isServer, WebCore::WebSocket>* ws, int code, std::string_view message) { + auto* webSocket = ws->getUserData(); + webSocket->didClose<uWS::WebSocket<SSL, isServer, WebCore::WebSocket>*>(ws, code, message.data(), message.length()); + }; +} + +}
\ No newline at end of file |