#include "root.h" #include "headers.h" #include "ScriptExecutionContext.h" #include "webcore/WebSocket.h" #include "libusockets.h" #include "_libusockets.h" extern "C" void Bun__startLoop(us_loop_t* loop); namespace WebCore { static std::atomic lastUniqueIdentifier = 0; static Lock allScriptExecutionContextsMapLock; static HashMap& allScriptExecutionContextsMap() WTF_REQUIRES_LOCK(allScriptExecutionContextsMapLock) { static NeverDestroyed> contexts; ASSERT(allScriptExecutionContextsMapLock.isLocked()); return contexts; } template static void registerHTTPContextForWebSocket(ScriptExecutionContext* script, us_socket_context_t* ctx, us_loop_t* loop) { if constexpr (!isServer) { if constexpr (SSL) { Bun__WebSocketHTTPSClient__register(script->jsGlobalObject(), loop, ctx); } else { Bun__WebSocketHTTPClient__register(script->jsGlobalObject(), loop, ctx); } } else { RELEASE_ASSERT_NOT_REACHED(); } } us_socket_context_t* ScriptExecutionContext::webSocketContextSSL() { if (!m_ssl_client_websockets_ctx) { us_loop_t* loop = (us_loop_t*)uws_get_loop(); us_bun_socket_context_options_t opts; memset(&opts, 0, sizeof(us_bun_socket_context_options_t)); // adds root ca opts.request_cert = true; // but do not reject unauthorized opts.reject_unauthorized = false; this->m_ssl_client_websockets_ctx = us_create_bun_socket_context(1, loop, sizeof(size_t), opts); void** ptr = reinterpret_cast(us_socket_context_ext(1, m_ssl_client_websockets_ctx)); *ptr = this; registerHTTPContextForWebSocket(this, m_ssl_client_websockets_ctx, loop); } return m_ssl_client_websockets_ctx; } bool ScriptExecutionContext::postTaskTo(ScriptExecutionContextIdentifier identifier, Function&& task) { Locker locker { allScriptExecutionContextsMapLock }; auto* context = allScriptExecutionContextsMap().get(identifier); if (!context) return false; context->postTaskConcurrently(WTFMove(task)); return true; } us_socket_context_t* ScriptExecutionContext::webSocketContextNoSSL() { if (!m_client_websockets_ctx) { us_loop_t* loop = (us_loop_t*)uws_get_loop(); us_socket_context_options_t opts; memset(&opts, 0, sizeof(us_socket_context_options_t)); this->m_client_websockets_ctx = us_create_socket_context(0, loop, sizeof(size_t), opts); void** ptr = reinterpret_cast(us_socket_context_ext(0, m_client_websockets_ctx)); *ptr = this; registerHTTPContextForWebSocket(this, m_client_websockets_ctx, loop); } return m_client_websockets_ctx; } template static us_socket_context_t* registerWebSocketClientContext(ScriptExecutionContext* script, us_socket_context_t* parent) { us_loop_t* loop = (us_loop_t*)uws_get_loop(); if constexpr (SSL) { us_socket_context_t* child = us_create_child_socket_context(1, parent, sizeof(size_t)); Bun__WebSocketClientTLS__register(script->jsGlobalObject(), loop, child); return child; } else { us_socket_context_t* child = us_create_child_socket_context(0, parent, sizeof(size_t)); Bun__WebSocketClient__register(script->jsGlobalObject(), loop, child); return child; } } us_socket_context_t* ScriptExecutionContext::connectedWebSocketKindClient() { return registerWebSocketClientContext(this, webSocketContextNoSSL()); } us_socket_context_t* ScriptExecutionContext::connectedWebSocketKindClientSSL() { return registerWebSocketClientContext(this, webSocketContextSSL()); } void ScriptExecutionContext::regenerateIdentifier() { Locker locker { allScriptExecutionContextsMapLock }; // ASSERT(allScriptExecutionContextsMap().contains(m_identifier)); // allScriptExecutionContextsMap().remove(m_identifier); m_identifier = ++lastUniqueIdentifier; // ASSERT(!allScriptExecutionContextsMap().contains(m_identifier)); allScriptExecutionContextsMap().add(m_identifier, this); } void ScriptExecutionContext::addToContextsMap() { Locker locker { allScriptExecutionContextsMapLock }; ASSERT(!allScriptExecutionContextsMap().contains(m_identifier)); // allScriptExecutionContextsMap().add(m_identifier, this); } void ScriptExecutionContext::removeFromContextsMap() { Locker locker { allScriptExecutionContextsMapLock }; ASSERT(allScriptExecutionContextsMap().contains(m_identifier)); // allScriptExecutionContextsMap().remove(m_identifier); } } ion> Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2024-02-26fix: better assetsInlineLimit runtime type checking (#10154)Gravatar James Ross 2-9/+13
2024-02-26fix: correct remote url (#10223)Gravatar Ben Holmes 2-2/+8
2024-02-26fix(toolbar): Make it so every built-in app can be closed by outside clicks (...Gravatar Erika 8-51/+63
2024-02-26Fix an issue where Vercel adapter may create functions for prerendered routes...Gravatar Ming-jun Lu 4-2/+26
2024-02-26[ci] formatGravatar Matthew Phillips 1-1/+1
2024-02-26Fix hydration scripts missing from dynamic slot usage (#10219)Gravatar Matthew Phillips 6-1/+69
2024-02-26[ci] formatGravatar Matthew Phillips 1-5/+5
2024-02-26Prevent errors in rendering from crashing server (#10221)Gravatar Matthew Phillips 7-14/+78
2024-02-26fix: svelte 5 mount/hydrate api change. (#10224)Gravatar 前端子鱼 3-5/+12
2024-02-24[ci] formatGravatar Arsh 1-9/+30
2024-02-24prevent warning: `Astro.request.headers` is not available in "static" output ...Gravatar Arsh 2-27/+30
2024-02-23Improved error logging from config (#10207)Gravatar Ben Holmes 4-36/+67
2024-02-23[ci] formatGravatar Arsh 3-3/+3
2024-02-23fix(dev): remove params for prerendered pages (#10199)Gravatar Arsh 9-13/+78
2024-02-23[ci] release (#10213)astro@4.4.4@astrojs/vercel@7.3.3@astrojs/node@8.2.1@astrojs/db@0.4.0Gravatar Houston (Bot) 41-177/+95
2024-02-23Fixes edge middleware calling nested routes (#10215)Gravatar Matthew Phillips 2-1/+6
2024-02-23Adds an error message for non-string transition:name values (#10205)Gravatar Martin Trapp 2-0/+8
2024-02-23[ci] formatGravatar Furkan Erdem 1-1/+1
2024-02-23Fix(node): Custom headers are not present in responses from standalone Node s...Gravatar Furkan Erdem 8-0/+163