Files
ladybird/Libraries/LibRequests/WebSocket.h
Timothy Flynn 3a413d988b LibRequests+RequestServer: Store websocket IDs as u64
The bug fixed here is that in RequestServer's ConnectionFromClient, we
stored the websocket ID as i32, despite it being i64 everywhere else.
Let's make it unsigned while we are here to be consistent with how all
other RS-related IDs will be soon.
2025-12-12 10:54:33 -05:00

84 lines
2.0 KiB
C++

/*
* 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/ByteString.h>
#include <AK/Function.h>
#include <AK/RefCounted.h>
#include <AK/WeakPtr.h>
namespace Requests {
class RequestClient;
class WebSocket : public RefCounted<WebSocket> {
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<WebSocket> create_from_id(Badge<RequestClient>, RequestClient& client, u64 websocket_id)
{
return adopt_ref(*new WebSocket(client, websocket_id));
}
u64 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(ReadonlyBytes binary_or_text_message, bool is_text);
void send(StringView text_message);
void close(u16 code = 1005, ByteString reason = {});
Function<void()> on_open;
Function<void(Message)> on_message;
Function<void(Error)> on_error;
Function<void(u16 code, ByteString reason, bool was_clean)> on_close;
Function<CertificateAndKey()> on_certificate_requested;
void did_open(Badge<RequestClient>);
void did_receive(Badge<RequestClient>, ByteBuffer, bool);
void did_error(Badge<RequestClient>, i32);
void did_close(Badge<RequestClient>, u16, ByteString, bool);
void did_request_certificates(Badge<RequestClient>);
private:
WebSocket(RequestClient&, u64 websocket_id);
WeakPtr<RequestClient> m_client;
ReadyState m_ready_state { ReadyState::Connecting };
ByteString m_subprotocol;
u64 m_websocket_id { 0 };
};
}