/* * Copyright (c) 2021, Dex♪ * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Requests { class RequestClient; class WebSocket : public RefCounted { public: struct CertificateAndKey { ByteString certificate; ByteString 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 create_from_id(Badge, RequestClient& client, i64 websocket_id) { return adopt_ref(*new WebSocket(client, websocket_id)); } i64 id() const { return m_websocket_id; } ReadyState ready_state(); void set_ready_state(ReadyState); ByteString subprotocol_in_use(); void set_subprotocol_in_use(ByteString); void send(ByteBuffer binary_or_text_message, bool is_text); void send(StringView text_message); void close(u16 code = 1005, ByteString reason = {}); Function on_open; Function on_message; Function on_error; Function on_close; Function on_certificate_requested; void did_open(Badge); void did_receive(Badge, ByteBuffer, bool); void did_error(Badge, i32); void did_close(Badge, u16, ByteString, bool); void did_request_certificates(Badge); private: explicit WebSocket(RequestClient&, i64 websocket_id); WeakPtr m_client; ReadyState m_ready_state { ReadyState::Connecting }; ByteString m_subprotocol; i64 m_websocket_id { -1 }; }; }