aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc
diff options
context:
space:
mode:
Diffstat (limited to 'src/javascript/jsc')
-rw-r--r--src/javascript/jsc/bindings/ScriptExecutionContext.cpp14
-rw-r--r--src/javascript/jsc/bindings/bindings.zig4
-rw-r--r--src/javascript/jsc/bindings/exports.zig4
-rw-r--r--src/javascript/jsc/bindings/webcore/WebSocket.cpp65
-rw-r--r--src/javascript/jsc/bindings/webcore/WebSocket.h2
-rw-r--r--src/javascript/jsc/rare_data.zig4
6 files changed, 53 insertions, 40 deletions
diff --git a/src/javascript/jsc/bindings/ScriptExecutionContext.cpp b/src/javascript/jsc/bindings/ScriptExecutionContext.cpp
index b89e0645f..9c6735993 100644
--- a/src/javascript/jsc/bindings/ScriptExecutionContext.cpp
+++ b/src/javascript/jsc/bindings/ScriptExecutionContext.cpp
@@ -63,18 +63,18 @@ static uWS::WebSocketContext<SSL, false, WebCore::WebSocket*>* registerWebSocket
auto* opts = ctx->getExt();
/* Maximum message size we can receive */
- static unsigned int maxPayloadLength = 128 * 1024 * 1024;
+ unsigned int maxPayloadLength = 16 * 1024;
/* 2 minutes timeout is good */
- static unsigned short idleTimeout = 120;
+ unsigned short idleTimeout = 120;
/* 64kb backpressure is probably good */
- static unsigned int maxBackpressure = 128 * 1024 * 1024;
- static bool closeOnBackpressureLimit = false;
+ unsigned int maxBackpressure = 64 * 1024;
+ bool closeOnBackpressureLimit = false;
/* This one depends on kernel timeouts and is a bad default */
- static bool resetIdleTimeoutOnSend = false;
+ bool resetIdleTimeoutOnSend = false;
/* A good default, esp. for newcomers */
- static bool sendPingsAutomatically = true;
+ bool sendPingsAutomatically = false;
/* Maximum socket lifetime in seconds before forced closure (defaults to disabled) */
- static unsigned short maxLifetime = 0;
+ unsigned short maxLifetime = 0;
opts->maxPayloadLength = maxPayloadLength;
opts->maxBackpressure = maxBackpressure;
diff --git a/src/javascript/jsc/bindings/bindings.zig b/src/javascript/jsc/bindings/bindings.zig
index 841fa7a38..1b6524826 100644
--- a/src/javascript/jsc/bindings/bindings.zig
+++ b/src/javascript/jsc/bindings/bindings.zig
@@ -210,6 +210,10 @@ pub const ZigString = extern struct {
return JSC.JSValue.fromRef(slice_).getZigString(ctx.ptr());
}
+ pub fn from16Slice(slice_: []const u16) ZigString {
+ return from16(slice_.ptr, slice_.len);
+ }
+
pub fn from16(slice_: [*]const u16, len: usize) ZigString {
var str = init(@ptrCast([*]const u8, slice_)[0..len]);
str.markUTF16();
diff --git a/src/javascript/jsc/bindings/exports.zig b/src/javascript/jsc/bindings/exports.zig
index 0c9c2a677..c70388186 100644
--- a/src/javascript/jsc/bindings/exports.zig
+++ b/src/javascript/jsc/bindings/exports.zig
@@ -189,6 +189,8 @@ pub const JSArrayBufferSink = JSC.WebCore.ArrayBufferSink.JSSink;
// WebSocket
pub const WebSocketHTTPClient = @import("../../../http/websocket_http_client.zig").WebSocketHTTPClient;
pub const WebSocketHTTSPClient = @import("../../../http/websocket_http_client.zig").WebSocketHTTPSClient;
+pub const WebSocketClient = @import("../../../http/websocket_http_client.zig").WebSocketClient;
+pub const WebSocketClientTLS = @import("../../../http/websocket_http_client.zig").WebSocketClientTLS;
pub fn Errorable(comptime Type: type) type {
return extern struct {
@@ -2510,6 +2512,8 @@ pub const Formatter = ZigConsoleClient.Formatter;
comptime {
WebSocketHTTPClient.shim.ref();
WebSocketHTTSPClient.shim.ref();
+ WebSocketClient.shim.ref();
+ WebSocketClientTLS.shim.ref();
if (!is_bindgen) {
_ = Process.getTitle;
diff --git a/src/javascript/jsc/bindings/webcore/WebSocket.cpp b/src/javascript/jsc/bindings/webcore/WebSocket.cpp
index 9b996565c..3c9f3a373 100644
--- a/src/javascript/jsc/bindings/webcore/WebSocket.cpp
+++ b/src/javascript/jsc/bindings/webcore/WebSocket.cpp
@@ -420,8 +420,6 @@ ExceptionOr<void> WebSocket::send(const String& message)
if (utf8.length() > 0)
this->sendWebSocketData<false>(utf8.data(), utf8.length());
- delete utf8;
-
return {};
}
@@ -490,31 +488,34 @@ void WebSocket::sendWebSocketData(const char* baseAddress, size_t length)
if constexpr (isBinary)
opCode = uWS::OpCode::BINARY;
- switch (m_connectedWebSocketKind) {
- case ConnectedWebSocketKind::Client: {
- this->m_connectedWebSocket.client->send({ baseAddress, length }, opCode);
- this->m_bufferedAmount = this->m_connectedWebSocket.client->getBufferedAmount();
- break;
- }
- case ConnectedWebSocketKind::ClientSSL: {
- this->m_connectedWebSocket.clientSSL->send({ baseAddress, length }, opCode);
- this->m_bufferedAmount = this->m_connectedWebSocket.clientSSL->getBufferedAmount();
- break;
- }
- case ConnectedWebSocketKind::Server: {
- this->m_connectedWebSocket.server->send({ baseAddress, length }, opCode);
- this->m_bufferedAmount = this->m_connectedWebSocket.server->getBufferedAmount();
- break;
- }
- case ConnectedWebSocketKind::ServerSSL: {
- this->m_connectedWebSocket.serverSSL->send({ baseAddress, length }, opCode);
- this->m_bufferedAmount = this->m_connectedWebSocket.serverSSL->getBufferedAmount();
- break;
- }
- default: {
- RELEASE_ASSERT_NOT_REACHED();
- }
- }
+ this->m_connectedWebSocket.client->cork(
+ [&]() {
+ switch (m_connectedWebSocketKind) {
+ case ConnectedWebSocketKind::Client: {
+ this->m_connectedWebSocket.client->send({ baseAddress, length }, opCode);
+ this->m_bufferedAmount = this->m_connectedWebSocket.client->getBufferedAmount();
+ break;
+ }
+ case ConnectedWebSocketKind::ClientSSL: {
+ this->m_connectedWebSocket.clientSSL->send({ baseAddress, length }, opCode);
+ this->m_bufferedAmount = this->m_connectedWebSocket.clientSSL->getBufferedAmount();
+ break;
+ }
+ case ConnectedWebSocketKind::Server: {
+ this->m_connectedWebSocket.server->send({ baseAddress, length }, opCode);
+ this->m_bufferedAmount = this->m_connectedWebSocket.server->getBufferedAmount();
+ break;
+ }
+ case ConnectedWebSocketKind::ServerSSL: {
+ this->m_connectedWebSocket.serverSSL->send({ baseAddress, length }, opCode);
+ this->m_bufferedAmount = this->m_connectedWebSocket.serverSSL->getBufferedAmount();
+ break;
+ }
+ default: {
+ RELEASE_ASSERT_NOT_REACHED();
+ }
+ }
+ });
}
ExceptionOr<void> WebSocket::close(std::optional<unsigned short> optionalCode, const String& reason)
@@ -856,16 +857,18 @@ void WebSocket::didConnect(us_socket_t* socket, char* bufferedData, size_t buffe
this->didConnect();
}
-void WebSocket::didFailToConnect(int32_t code)
+void WebSocket::didFailWithErrorCode(int32_t code)
{
m_state = CLOSED;
// this means we already handled it
- if (this->m_upgradeClient == nullptr) {
+ if (this->m_upgradeClient == nullptr && this->m_connectedWebSocketKind == ConnectedWebSocketKind::None) {
return;
}
this->m_upgradeClient = nullptr;
+ this->m_connectedWebSocketKind = ConnectedWebSocketKind::None;
+ this->m_connectedWebSocket.client = nullptr;
switch (code) {
// cancel
@@ -982,7 +985,7 @@ extern "C" void WebSocket__didConnect(WebCore::WebSocket* webSocket, us_socket_t
{
webSocket->didConnect(socket, bufferedData, len);
}
-extern "C" void WebSocket__didFailToConnect(WebCore::WebSocket* webSocket, int32_t errorCode)
+extern "C" void WebSocket__didFailWithErrorCode(WebCore::WebSocket* webSocket, int32_t errorCode)
{
- webSocket->didFailToConnect(errorCode);
+ webSocket->didFailWithErrorCode(errorCode);
} \ No newline at end of file
diff --git a/src/javascript/jsc/bindings/webcore/WebSocket.h b/src/javascript/jsc/bindings/webcore/WebSocket.h
index 351e8c6b6..51b885c3b 100644
--- a/src/javascript/jsc/bindings/webcore/WebSocket.h
+++ b/src/javascript/jsc/bindings/webcore/WebSocket.h
@@ -97,7 +97,7 @@ public:
void didConnect();
void didClose(unsigned unhandledBufferedAmount, unsigned short code, const String& reason);
void didConnect(us_socket_t* socket, char* bufferedData, size_t bufferedDataSize);
- void didFailToConnect(int32_t code);
+ void didFailWithErrorCode(int32_t code);
void didReceiveMessage(String&& message);
void didReceiveData(const char* data, size_t length);
diff --git a/src/javascript/jsc/rare_data.zig b/src/javascript/jsc/rare_data.zig
index 3020dfc16..f82418da9 100644
--- a/src/javascript/jsc/rare_data.zig
+++ b/src/javascript/jsc/rare_data.zig
@@ -7,12 +7,14 @@ const Syscall = @import("./node/syscall.zig");
const JSC = @import("javascript_core");
const std = @import("std");
const BoringSSL = @import("boringssl");
-boring_ssl_engine: ?*BoringSSL.ENGINE = null,
+const WebSocketClientMask = @import("../../http/websocket_http_client.zig").Mask;
+boring_ssl_engine: ?*BoringSSL.ENGINE = null,
editor_context: EditorContext = EditorContext{},
stderr_store: ?*Blob.Store = null,
stdin_store: ?*Blob.Store = null,
stdout_store: ?*Blob.Store = null,
+websocket_mask: WebSocketClientMask = WebSocketClientMask{},
// TODO: make this per JSGlobalObject instead of global
// This does not handle ShadowRealm correctly!