diff options
author | DexesTTP <dexes.ttp@gmail.com> | 2021-04-24 01:46:49 +0200 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2021-04-25 19:04:34 +0200 |
commit | 62ed26164bd160387c80522dfee5db2891b4c0dc (patch) | |
tree | 0ac84f7e03d12e6aaf320698cb18c452d50b938f /Userland/Libraries/LibProtocol/WebSocket.h | |
parent | c11ca9df33c602a8c5d8efb89cb42a9986629c1d (diff) | |
download | serenity-62ed26164bd160387c80522dfee5db2891b4c0dc.zip |
Services: Add a WebSocket service
The WebSocket service isolates communication with a WebSocket to its
own isolated process. Similar to other isolating services, it has its
own user and group.
Diffstat (limited to 'Userland/Libraries/LibProtocol/WebSocket.h')
-rw-r--r-- | Userland/Libraries/LibProtocol/WebSocket.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/Userland/Libraries/LibProtocol/WebSocket.h b/Userland/Libraries/LibProtocol/WebSocket.h new file mode 100644 index 0000000000..c0f079f5c1 --- /dev/null +++ b/Userland/Libraries/LibProtocol/WebSocket.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2021, Dexβͺ <dexes.ttp@gmail.com> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/Badge.h> +#include <AK/ByteBuffer.h> +#include <AK/Function.h> +#include <AK/RefCounted.h> +#include <AK/String.h> +#include <AK/WeakPtr.h> +#include <LibCore/Notifier.h> +#include <LibIPC/Forward.h> + +namespace Protocol { + +class WebSocketClient; + +class WebSocket : public RefCounted<WebSocket> { +public: + struct CertificateAndKey { + String certificate; + String key; + }; + + struct Message { + ByteBuffer data; + bool is_text { false }; + }; + + enum class Error { + CouldNotEstablishConnection, + ConnectionUpgradeFailed, + ServerClosedSocket, + }; + + enum class ReadyState { + Connecting = 0, + Open = 1, + Closing = 2, + Closed = 3, + }; + + static NonnullRefPtr<WebSocket> create_from_id(Badge<WebSocketClient>, WebSocketClient& client, i32 connection_id) + { + return adopt_ref(*new WebSocket(client, connection_id)); + } + + int id() const { return m_connection_id; } + + ReadyState ready_state(); + + void send(ByteBuffer binary_or_text_message, bool is_text); + void send(StringView text_message); + void close(u16 code = 1005, String reason = {}); + + Function<void()> on_open; + Function<void(Message)> on_message; + Function<void(Error)> on_error; + Function<void(u16 code, String reason, bool was_clean)> on_close; + Function<CertificateAndKey()> on_certificate_requested; + + void did_open(Badge<WebSocketClient>); + void did_receive(Badge<WebSocketClient>, ByteBuffer, bool); + void did_error(Badge<WebSocketClient>, i32); + void did_close(Badge<WebSocketClient>, u16, String, bool); + void did_request_certificates(Badge<WebSocketClient>); + +private: + explicit WebSocket(WebSocketClient&, i32 connection_id); + WeakPtr<WebSocketClient> m_client; + int m_connection_id { -1 }; +}; + +} |