2#ifndef _KURLYK_WEBSOCKET_CLIENT_HPP_INCLUDED
3#define _KURLYK_WEBSOCKET_CLIENT_HPP_INCLUDED
30 WebSocketClient(std::unique_ptr<WebSocketConfig> config, std::function<
void(
bool)> callback =
nullptr) {
36 m_client->set_config(std::move(config), std::move(callback));
51 const std::string& url,
53 const std::string& proxy_server = std::string(),
54 const std::string& proxy_auth = std::string(),
56 long request_timeout = 20,
57 bool reconnect =
true,
58 bool verify_cert =
true,
59 const std::string& ca_file = std::string(),
70 m_config->proxy_server = proxy_server;
73 m_config->request_timeout = request_timeout;
77 m_config->add_rate_limit(rpm, 60000);
93 void on_event(std::function<
void(std::unique_ptr<WebSocketEventData>)> callback) {
94 m_client->event_handler() = std::move(callback);
99 std::function<void(std::unique_ptr<WebSocketEventData>)>&
event_handler() {
106 std::future<bool>
set_config(std::unique_ptr<WebSocketConfig> config) {
107 auto promise = std::make_shared<std::promise<bool>>();
108 auto future = promise->get_future();
109 m_client->set_config(std::move(config), [promise](
bool success) {
110 promise->set_value(success);
119 void set_config(std::unique_ptr<WebSocketConfig> config, std::function<
void(
bool)> callback) {
120 m_client->set_config(std::move(config), std::move(callback));
128# if __cplusplus >= 201402L
129 auto config = std::make_unique<WebSocketConfig>(*
m_config.get());
133 m_client->set_config(std::move(config),
nullptr);
135 auto promise = std::make_shared<std::promise<bool>>();
136 auto future = promise->get_future();
137 m_client->connect([promise](
bool success) {
138 promise->set_value(success);
146 void connect(std::function<
void(
bool)> callback) {
148# if __cplusplus >= 201402L
149 auto config = std::make_unique<WebSocketConfig>(*
m_config.get());
153 m_client->set_config(std::move(config),
nullptr);
155 m_client->connect(std::move(callback));
162 auto connect_future =
connect();
163 return connect_future.get();
169 auto promise = std::make_shared<std::promise<bool>>();
170 auto future = promise->get_future();
171 m_client->disconnect([promise](
bool success) {
172 promise->set_value(success);
182 return disconnect_future.get();
187 void disconnect(std::function<
void(
bool success)> callback) {
188 m_client->disconnect(std::move(callback));
204 const std::string &message,
205 long rate_limit_id = 0,
206 std::function<
void(
const std::error_code&)> callback =
nullptr) {
207 return m_client->submit_message(message, rate_limit_id, std::move(callback));
216 const std::string &message,
217 long rate_limit_id = 0,
218 std::function<
void(
const std::error_code&)> callback =
nullptr) {
228 const int status = 1000,
229 const std::string &reason = std::string(),
230 std::function<
void(
const std::error_code&)> callback =
nullptr) {
231 return m_client->submit_close(status, reason, std::move(callback));
240 const int status = 1000,
241 const std::string &reason = std::string(),
242 std::function<
void(
const std::error_code&)> callback =
nullptr) {
261 return m_client->get_http_version();
273 return m_client->get_remote_endpoint();
280 void set_url(
const std::string& host,
const std::string& path,
const std::string& query =
"") {
282 return m_config->set_url(host, path, query);
290 return m_config->set_url(url, query);
298 void set_accept_encoding(
bool identity =
false,
bool deflate =
false,
bool gzip =
false,
bool brotli =
false) {
300 return m_config->set_accept_encoding(identity, deflate, gzip, brotli);
308 const std::string& ip,
312 return m_config->set_proxy(ip, port, type);
322 const std::string& ip,
324 const std::string& username,
325 const std::string& password,
328 return m_config->set_proxy(ip, port, username, password, type);
335 return m_config->set_proxy_server(server);
342 return m_config->set_proxy_auth(auth);
349 return m_config->set_proxy_type(type);
357 return m_config->set_proxy_auth(username, password);
364 void set_reconnect(
bool reconnect,
long reconnect_attempts = 0,
long reconnect_delay = 0) {
366 return m_config->set_reconnect(reconnect, reconnect_attempts, reconnect_delay);
373 return m_config->set_user_agent(user_agent);
380 return m_config->set_accept_language(accept_language);
387 return m_config->set_cookie(cookie);
394 return m_config->set_idle_timeout(idle_timeout);
401 return m_config->set_request_timeout(request_timeout);
408 return m_config->set_max_send_queue_size(max_send_queue_size);
415 return m_config->set_ca_file(ca_file);
423 return m_config->set_ca_file(verify_cert, ca_file);
430 return m_config->set_verify_cert(verify_cert);
444 return m_config->add_rate_limit(requests_per_period, period_ms);
451 long period_ms = 60000;
459 long period_ms = 1000;
470# if __cplusplus >= 201402L
471 m_config = std::make_unique<WebSocketConfig>();
481 static bool is_initialized =
false;
482 if (!is_initialized) {
483 is_initialized =
true;
Defines the WebSocketManager singleton responsible for backend-specific WebSocket client instances.
static HttpRequestManager & get_instance()
Get the singleton instance of HttpRequestManager.
std::function< void(std::unique_ptr< WebSocketEventData >)> & event_handler()
Accessor for the event handler function.
std::list< std::unique_ptr< WebSocketEventData > > receive_events()
Retrieves all pending WebSocket events in a batch.
void set_proxy_type(ProxyType type)
Sets the proxy type.
void set_proxy_auth(const std::string &username, const std::string &password)
Configures proxy authentication credentials.
static void ensure_initialized()
Ensures the WebSocket and network components are initialized.
void set_accept_language(const std::string &accept_language)
Sets the Accept-Language header.
void set_verify_cert(bool verify_cert)
Sets whether to verify the server’s certificate.
void set_cookie(const std::string &cookie)
Sets the cookie data.
void set_max_send_queue_size(std::size_t max_send_queue_size)
Sets the maximum number of outbound send operations queued for this client.
void set_proxy(const std::string &ip, int port, ProxyType type=ProxyType::PROXY_HTTP)
Sets the proxy server address.
void on_event(std::function< void(std::unique_ptr< WebSocketEventData >)> callback)
Sets a callback for WebSocket events.
std::string get_http_version() const
Retrieves the HTTP version used in the WebSocket connection.
void set_user_agent(const std::string &user_agent)
Sets the User-Agent header.
void set_idle_timeout(long idle_timeout)
Configures the idle timeout for the WebSocket connection.
std::unique_ptr< WebSocketEventData > receive_event()
Retrieves a single WebSocket event, if available.
WebSocketClient(const std::string &url, const Headers &headers=Headers(), const std::string &proxy_server=std::string(), const std::string &proxy_auth=std::string(), ProxyType proxy_type=ProxyType::PROXY_HTTP, long request_timeout=20, bool reconnect=true, bool verify_cert=true, const std::string &ca_file=std::string(), int rpm=200)
Initializes the facade with URL-based configuration values.
void set_url(const std::string &url, const QueryParams &query)
Sets the WebSocket server URL with specified query parameters.
void set_proxy_auth(const std::string &auth)
Sets the proxy authentication credentials.
WebSocketClient & operator=(const WebSocketClient &)=delete
const bool is_connected() const
Checks if the WebSocket is connected.
std::unique_ptr< WebSocketConfig > m_config
Deferred WebSocket configuration copied into the backend before connect().
void set_accept_encoding(bool identity=false, bool deflate=false, bool gzip=false, bool brotli=false)
Sets the Accept-Encoding header with specified encodings.
SubmitResult submit_close(const int status=1000, const std::string &reason=std::string(), std::function< void(const std::error_code &)> callback=nullptr)
Attempts to submit a close request to the WebSocket server.
bool send_close(const int status=1000, const std::string &reason=std::string(), std::function< void(const std::error_code &)> callback=nullptr)
Sends a close request to the WebSocket server.
SubmitResult submit_message(const std::string &message, long rate_limit_id=0, std::function< void(const std::error_code &)> callback=nullptr)
Attempts to submit a message through the WebSocket.
bool disconnect_and_wait()
Disconnects from the WebSocket server, blocking until the disconnection completes.
void set_reconnect(bool reconnect, long reconnect_attempts=0, long reconnect_delay=0)
Configures reconnection behavior.
std::string get_remote_endpoint() const
Retrieves the remote endpoint information.
void init_config()
Initializes the WebSocket configuration if it is not already set.
long add_rate_limit(long requests_per_period, long period_ms)
Adds a rate limit configuration to control the frequency of WebSocket messages.
void disconnect(std::function< void(bool success)> callback)
Disconnects from the WebSocket server and invokes a callback upon completion.
void set_ca_file(bool verify_cert, const std::string &ca_file)
Sets certificate verification and sets the CA certificate file.
void set_ca_file(const std::string &ca_file)
Sets the path to the CA certificate file.
long add_rate_limit_rpm(long requests_per_minute)
Adds a rate limit based on Requests Per Minute (RPM).
WebSocketClient(const WebSocketClient &)=delete
void set_proxy_server(const std::string &server)
Sets the proxy server address.
long add_rate_limit_rps(long requests_per_second)
Adds a rate limit based on Requests Per Second (RPS).
WebSocketClient(std::unique_ptr< WebSocketConfig > config, std::function< void(bool)> callback=nullptr)
Initializes the facade with a WebSocket configuration object.
void set_config(std::unique_ptr< WebSocketConfig > config, std::function< void(bool)> callback)
Sets the WebSocket configuration and executes a callback upon completion.
selected_backend_client_ptr m_client
Backend-specific WebSocket client selected by compile-time platform macros.
void set_url(const std::string &host, const std::string &path, const std::string &query="")
Sets the WebSocket server URL with optional query parameters.
bool connect_and_wait()
Connects to the WebSocket server, blocking until the connection completes.
virtual ~WebSocketClient()
Schedules backend shutdown through NetworkWorker before the facade is destroyed.
std::future< bool > set_config(std::unique_ptr< WebSocketConfig > config)
Asynchronously sets the WebSocket configuration.
void connect(std::function< void(bool)> callback)
Connects to the WebSocket server and executes a callback upon completion.
void set_proxy(const std::string &ip, int port, const std::string &username, const std::string &password, ProxyType type=ProxyType::PROXY_HTTP)
Sets the proxy server address with authentication.
WebSocketClient()
Initializes the WebSocket client facade and its backend-specific implementation.
void set_request_timeout(long request_timeout)
Sets the timeout for WebSocket requests.
std::future< bool > connect()
Asynchronously connects to the WebSocket server.
bool send_message(const std::string &message, long rate_limit_id=0, std::function< void(const std::error_code &)> callback=nullptr)
Sends a message through the WebSocket.
std::future< bool > disconnect()
Asynchronously disconnects from the WebSocket server.
Headers get_headers() const
Retrieves the headers associated with the WebSocket connection.
Configuration parameters for establishing and managing WebSocket connections.
static WebSocketManager & get_instance()
Get the singleton instance of WebSocketManager.
selected_backend_client_ptr create_client()
Creates and returns a new backend-specific WebSocket client selected by compilation flags.
void notify()
Notifies the worker to begin processing requests or tasks.
static NetworkWorker & get_instance()
Get the singleton instance of NetworkWorker.
void add_task(std::function< void()> task)
Adds a task to the queue and notifies the worker thread.
void start(const bool use_async)
Starts the worker thread for asynchronous task processing.
#define KURLYK_AUTO_INIT_USE_ASYNC
Determines whether the NetworkWorker runs in a background thread during automatic initialization.
Primary namespace for the Kurlyk library, encompassing initialization, request management,...
std::shared_ptr< selected_backend_client_t > selected_backend_client_ptr
Shared pointer to the compile-time selected backend client type.
ProxyType
Enumeration of supported proxy types compatible with libcurl.
utils::CaseInsensitiveMultimap Headers
Alias for HTTP headers, providing a case-insensitive unordered multimap.
utils::CaseInsensitiveMultimap QueryParams
Alias for query parameters in HTTP requests, stored case-insensitively.
Represents the synchronous result of trying to enqueue or submit work.
bool accepted
Indicates whether the work item was accepted for processing.