aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/bindings/ScriptExecutionContext.cpp
blob: 17bc266dc46ab340a956754cc8a0b8371d2699c2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

#include "ScriptExecutionContext.h"
#include <uws/src/App.h>
#include "WebSocketStream.h"

extern "C" void Bun__startLoop(us_loop_t* loop);

namespace WebCore {

template<bool isSSL>
us_socket_context_t* ScriptExecutionContext::webSocketContext()
{
    if constexpr (isSSL) {
        if (!m_ssl_client_websockets_ctx) {
            us_loop_t* loop = (us_loop_t*)uWS::Loop::get();
            us_socket_context_options_t opts;
            memset(&opts, 0, sizeof(us_socket_context_options_t));
            this->m_ssl_client_websockets_ctx = us_create_socket_context(1, loop, sizeof(size_t), opts);
            void** ptr = reinterpret_cast<void**>(us_socket_context_ext(1, m_ssl_client_websockets_ctx));
            *ptr = this;
            registerHTTPContextForWebSocket<isSSL, false>(this, m_ssl_client_websockets_ctx);
        }

        return m_ssl_client_websockets_ctx;
    } else {
        if (!m_client_websockets_ctx) {
            us_loop_t* loop = (us_loop_t*)uWS::Loop::get();
            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<void**>(us_socket_context_ext(0, m_client_websockets_ctx));
            *ptr = this;
            registerHTTPContextForWebSocket<isSSL, false>(this, m_client_websockets_ctx);
        }

        return m_client_websockets_ctx;
    }
}

template<bool isSSL, bool isServer>
uWS::WebSocketContext<isSSL, isServer, ScriptExecutionContext*>* ScriptExecutionContext::connnectedWebSocketContext()
{
    if constexpr (isSSL) {
        if (!m_connected_ssl_client_websockets_ctx) {
            // should be the parent
            RELEASE_ASSERT(m_ssl_client_websockets_ctx);
            m_connected_client_websockets_ctx = registerWebSocketClientContext(this, webSocketContext<isSSL>());
        }

        return m_connected_ssl_client_websockets_ctx;
    } else {
        if (!m_connected_client_websockets_ctx) {
            // should be the parent
            RELEASE_ASSERT(m_client_websockets_ctx);
            m_connected_client_websockets_ctx = registerWebSocketClientContext(this, webSocketContext<isSSL>());
        }

        return m_connected_client_websockets_ctx;
    }
}

}