Serenity Operating System
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}