aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/bindings/webcore/WebSocketStream.cpp
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-06-17 04:26:44 -0700
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-06-22 06:56:47 -0700
commit38cc869104584987d0a7f3b21be4da196bb3f390 (patch)
tree6523c2d1d90a80f704e955af335a44d8e89b80f9 /src/javascript/jsc/bindings/webcore/WebSocketStream.cpp
parent5d8a99e1d4009cb4b9c7766b2af76c3df8364670 (diff)
downloadbun-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.cpp83
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