Serenity Operating System
at master 131 lines 5.1 kB view raw
1/* 2 * Copyright (c) 2022, Dex♪ <dexes.ttp@gmail.com> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibProtocol/WebSocket.h> 8#include <LibProtocol/WebSocketClient.h> 9#include <LibWebView/WebSocketClientAdapter.h> 10 11namespace WebView { 12 13RefPtr<WebSocketClientSocketAdapter> WebSocketClientSocketAdapter::create(NonnullRefPtr<Protocol::WebSocket> websocket) 14{ 15 return adopt_ref(*new WebSocketClientSocketAdapter(move(websocket))); 16} 17 18WebSocketClientSocketAdapter::WebSocketClientSocketAdapter(NonnullRefPtr<Protocol::WebSocket> websocket) 19 : m_websocket(move(websocket)) 20{ 21 m_websocket->on_open = [weak_this = make_weak_ptr()] { 22 if (auto strong_this = weak_this.strong_ref()) 23 if (strong_this->on_open) 24 strong_this->on_open(); 25 }; 26 m_websocket->on_message = [weak_this = make_weak_ptr()](auto message) { 27 if (auto strong_this = weak_this.strong_ref()) { 28 if (strong_this->on_message) { 29 strong_this->on_message(Web::WebSockets::WebSocketClientSocket::Message { 30 .data = move(message.data), 31 .is_text = message.is_text, 32 }); 33 } 34 } 35 }; 36 m_websocket->on_error = [weak_this = make_weak_ptr()](auto error) { 37 if (auto strong_this = weak_this.strong_ref()) { 38 if (strong_this->on_error) { 39 switch (error) { 40 case Protocol::WebSocket::Error::CouldNotEstablishConnection: 41 strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::CouldNotEstablishConnection); 42 return; 43 case Protocol::WebSocket::Error::ConnectionUpgradeFailed: 44 strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::ConnectionUpgradeFailed); 45 return; 46 case Protocol::WebSocket::Error::ServerClosedSocket: 47 strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::ServerClosedSocket); 48 return; 49 } 50 VERIFY_NOT_REACHED(); 51 } 52 } 53 }; 54 m_websocket->on_close = [weak_this = make_weak_ptr()](u16 code, DeprecatedString reason, bool was_clean) { 55 if (auto strong_this = weak_this.strong_ref()) 56 if (strong_this->on_close) 57 strong_this->on_close(code, move(reason), was_clean); 58 }; 59 m_websocket->on_certificate_requested = [weak_this = make_weak_ptr()] { 60 if (auto strong_this = weak_this.strong_ref()) { 61 if (strong_this->on_certificate_requested) { 62 auto certificate_and_key = weak_this->on_certificate_requested(); 63 return Protocol::WebSocket::CertificateAndKey { 64 .certificate = move(certificate_and_key.certificate), 65 .key = move(certificate_and_key.key), 66 }; 67 } 68 } 69 return Protocol::WebSocket::CertificateAndKey {}; 70 }; 71} 72 73WebSocketClientSocketAdapter::~WebSocketClientSocketAdapter() = default; 74 75Web::WebSockets::WebSocket::ReadyState WebSocketClientSocketAdapter::ready_state() 76{ 77 switch (m_websocket->ready_state()) { 78 case Protocol::WebSocket::ReadyState::Connecting: 79 return Web::WebSockets::WebSocket::ReadyState::Connecting; 80 case Protocol::WebSocket::ReadyState::Open: 81 return Web::WebSockets::WebSocket::ReadyState::Open; 82 case Protocol::WebSocket::ReadyState::Closing: 83 return Web::WebSockets::WebSocket::ReadyState::Closing; 84 case Protocol::WebSocket::ReadyState::Closed: 85 return Web::WebSockets::WebSocket::ReadyState::Closed; 86 } 87 VERIFY_NOT_REACHED(); 88} 89 90DeprecatedString WebSocketClientSocketAdapter::subprotocol_in_use() 91{ 92 return m_websocket->subprotocol_in_use(); 93} 94 95void WebSocketClientSocketAdapter::send(ByteBuffer binary_or_text_message, bool is_text) 96{ 97 m_websocket->send(binary_or_text_message, is_text); 98} 99 100void WebSocketClientSocketAdapter::send(StringView text_message) 101{ 102 m_websocket->send(text_message); 103} 104 105void WebSocketClientSocketAdapter::close(u16 code, DeprecatedString reason) 106{ 107 m_websocket->close(code, reason); 108} 109 110ErrorOr<NonnullRefPtr<WebSocketClientManagerAdapter>> WebSocketClientManagerAdapter::try_create() 111{ 112 auto websocket_client = TRY(Protocol::WebSocketClient::try_create()); 113 return adopt_nonnull_ref_or_enomem(new (nothrow) WebSocketClientManagerAdapter(move(websocket_client))); 114} 115 116WebSocketClientManagerAdapter::WebSocketClientManagerAdapter(NonnullRefPtr<Protocol::WebSocketClient> websocket_client) 117 : m_websocket_client(move(websocket_client)) 118{ 119} 120 121WebSocketClientManagerAdapter::~WebSocketClientManagerAdapter() = default; 122 123RefPtr<Web::WebSockets::WebSocketClientSocket> WebSocketClientManagerAdapter::connect(const AK::URL& url, DeprecatedString const& origin, Vector<DeprecatedString> const& protocols) 124{ 125 auto underlying_websocket = m_websocket_client->connect(url, origin, protocols); 126 if (!underlying_websocket) 127 return {}; 128 return WebSocketClientSocketAdapter::create(underlying_websocket.release_nonnull()); 129} 130 131}