Serenity Operating System
at master 97 lines 3.5 kB view raw
1/* 2 * Copyright (c) 2022, Dex♪ <dexes.ttp@gmail.com> 3 * Copyright (c) 2022, Andreas Kling <kling@serenityos.org> 4 * 5 * SPDX-License-Identifier: BSD-2-Clause 6 */ 7 8#include "WebSocketLadybird.h" 9 10namespace Ladybird { 11 12NonnullRefPtr<WebSocketLadybird> WebSocketLadybird::create(NonnullRefPtr<WebSocket::WebSocket> underlying_socket) 13{ 14 return adopt_ref(*new WebSocketLadybird(move(underlying_socket))); 15} 16 17WebSocketLadybird::WebSocketLadybird(NonnullRefPtr<WebSocket::WebSocket> underlying_socket) 18 : m_websocket(move(underlying_socket)) 19{ 20 m_websocket->on_open = [weak_this = make_weak_ptr()] { 21 if (auto strong_this = weak_this.strong_ref()) 22 if (strong_this->on_open) 23 strong_this->on_open(); 24 }; 25 m_websocket->on_message = [weak_this = make_weak_ptr()](auto message) { 26 if (auto strong_this = weak_this.strong_ref()) { 27 if (strong_this->on_message) { 28 strong_this->on_message(Web::WebSockets::WebSocketClientSocket::Message { 29 .data = move(message.data()), 30 .is_text = message.is_text(), 31 }); 32 } 33 } 34 }; 35 m_websocket->on_error = [weak_this = make_weak_ptr()](auto error) { 36 if (auto strong_this = weak_this.strong_ref()) { 37 if (strong_this->on_error) { 38 switch (error) { 39 case WebSocket::WebSocket::Error::CouldNotEstablishConnection: 40 strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::CouldNotEstablishConnection); 41 return; 42 case WebSocket::WebSocket::Error::ConnectionUpgradeFailed: 43 strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::ConnectionUpgradeFailed); 44 return; 45 case WebSocket::WebSocket::Error::ServerClosedSocket: 46 strong_this->on_error(Web::WebSockets::WebSocketClientSocket::Error::ServerClosedSocket); 47 return; 48 } 49 VERIFY_NOT_REACHED(); 50 } 51 } 52 }; 53 m_websocket->on_close = [weak_this = make_weak_ptr()](u16 code, DeprecatedString reason, bool was_clean) { 54 if (auto strong_this = weak_this.strong_ref()) 55 if (strong_this->on_close) 56 strong_this->on_close(code, move(reason), was_clean); 57 }; 58} 59 60WebSocketLadybird::~WebSocketLadybird() = default; 61 62Web::WebSockets::WebSocket::ReadyState WebSocketLadybird::ready_state() 63{ 64 switch (m_websocket->ready_state()) { 65 case WebSocket::ReadyState::Connecting: 66 return Web::WebSockets::WebSocket::ReadyState::Connecting; 67 case WebSocket::ReadyState::Open: 68 return Web::WebSockets::WebSocket::ReadyState::Open; 69 case WebSocket::ReadyState::Closing: 70 return Web::WebSockets::WebSocket::ReadyState::Closing; 71 case WebSocket::ReadyState::Closed: 72 return Web::WebSockets::WebSocket::ReadyState::Closed; 73 } 74 VERIFY_NOT_REACHED(); 75} 76 77DeprecatedString WebSocketLadybird::subprotocol_in_use() 78{ 79 return m_websocket->subprotocol_in_use(); 80} 81 82void WebSocketLadybird::send(ByteBuffer binary_or_text_message, bool is_text) 83{ 84 m_websocket->send(WebSocket::Message(binary_or_text_message, is_text)); 85} 86 87void WebSocketLadybird::send(StringView message) 88{ 89 m_websocket->send(WebSocket::Message(message)); 90} 91 92void WebSocketLadybird::close(u16 code, DeprecatedString reason) 93{ 94 m_websocket->close(code, reason); 95} 96 97}