Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
quic_server.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2024, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
5#pragma once
6
7// Experimental API marker - users must opt-in to use this header
10
12
22
23#include <array>
24#include <atomic>
25#include <functional>
26#include <future>
27#include <map>
28#include <memory>
29#include <mutex>
30#include <optional>
31#include <shared_mutex>
32#include <span>
33#include <string>
34#include <string_view>
35#include <system_error>
36#include <vector>
37
38#include <asio.hpp>
39
40// Optional monitoring support via common_system
41#if KCENON_WITH_COMMON_SYSTEM
42 #include <kcenon/common/interfaces/monitoring_interface.h>
43#endif // KCENON_WITH_COMMON_SYSTEM
44
46{
47 class quic_socket;
48} // namespace kcenon::network::internal
49
51{
52 class quic_session;
53} // namespace kcenon::network::session
54
56{
57
63 {
65 std::string cert_file;
66
68 std::string key_file;
69
71 std::optional<std::string> ca_cert_file;
72
75
77 std::vector<std::string> alpn_protocols;
78
80 uint64_t max_idle_timeout_ms{30000};
81
83 uint64_t initial_max_data{1048576};
84
86 uint64_t initial_max_stream_data{65536};
87
90
93
95 size_t max_connections{10000};
96
98 bool enable_retry{true};
99
101 std::vector<uint8_t> retry_key;
102 };
103
143 : public std::enable_shared_from_this<messaging_quic_server>
145 {
146 public:
148 using connection_callback_t = std::function<void(std::shared_ptr<session::quic_session>)>;
150 using disconnection_callback_t = std::function<void(std::shared_ptr<session::quic_session>)>;
152 using receive_callback_t = std::function<void(std::shared_ptr<session::quic_session>,
153 const std::vector<uint8_t>&)>;
155 using stream_receive_callback_t = std::function<void(std::shared_ptr<session::quic_session>,
156 uint64_t,
157 const std::vector<uint8_t>&,
158 bool)>;
160 using error_callback_t = std::function<void(std::error_code)>;
161
166 explicit messaging_quic_server(std::string_view server_id);
167
171 ~messaging_quic_server() noexcept override;
172
173 // Non-copyable, non-movable
175 messaging_quic_server& operator=(const messaging_quic_server&) = delete;
178
179 // =====================================================================
180 // Server Lifecycle
181 // =====================================================================
182
188 [[nodiscard]] auto start_server(unsigned short port) -> VoidResult;
189
196 [[nodiscard]] auto start_server(unsigned short port,
197 const quic_server_config& config)
198 -> VoidResult;
199
204 [[nodiscard]] auto stop_server() -> VoidResult;
205
210 [[nodiscard]] auto server_id() const -> const std::string&;
211
212 // =====================================================================
213 // Session Management
214 // =====================================================================
215
220 [[nodiscard]] auto sessions() const
221 -> std::vector<std::shared_ptr<session::quic_session>>;
222
228 [[nodiscard]] auto get_session(const std::string& session_id)
229 -> std::shared_ptr<session::quic_session>;
230
235 [[nodiscard]] auto session_count() const -> size_t;
236
243 [[nodiscard]] auto disconnect_session(const std::string& session_id,
244 uint64_t error_code = 0)
245 -> VoidResult;
246
251 auto disconnect_all(uint64_t error_code = 0) -> void;
252
253 // =====================================================================
254 // Broadcasting
255 // =====================================================================
256
262 [[nodiscard]] auto broadcast(std::vector<uint8_t>&& data) -> VoidResult;
263
270 [[nodiscard]] auto multicast(const std::vector<std::string>& session_ids,
271 std::vector<uint8_t>&& data) -> VoidResult;
272
273 // =====================================================================
274 // i_network_component interface implementation
275 // =====================================================================
276
283 [[nodiscard]] auto is_running() const -> bool override;
284
290 auto wait_for_stop() -> void override;
291
292 // =====================================================================
293 // i_quic_server interface implementation
294 // =====================================================================
295
303 [[nodiscard]] auto start(uint16_t port) -> VoidResult override;
304
311 [[nodiscard]] auto stop() -> VoidResult override;
312
319 [[nodiscard]] auto connection_count() const -> size_t override;
320
327 auto set_connection_callback(interfaces::i_quic_server::connection_callback_t callback) -> void override;
328
335 auto set_disconnection_callback(interfaces::i_quic_server::disconnection_callback_t callback) -> void override;
336
343 auto set_receive_callback(interfaces::i_quic_server::receive_callback_t callback) -> void override;
344
351 auto set_stream_callback(interfaces::i_quic_server::stream_callback_t callback) -> void override;
352
359 auto set_error_callback(interfaces::i_quic_server::error_callback_t callback) -> void override;
360
361 // =====================================================================
362 // Legacy API (maintained for backward compatibility)
363 // =====================================================================
364
369 auto set_connection_callback(connection_callback_t callback) -> void;
370
376
381 auto set_receive_callback(receive_callback_t callback) -> void;
382
391
396 auto set_error_callback(error_callback_t callback) -> void;
397
398#if KCENON_WITH_COMMON_SYSTEM
403 auto set_monitor(kcenon::common::interfaces::IMonitor* monitor) -> void;
404
409 auto get_monitor() const -> kcenon::common::interfaces::IMonitor*;
410#endif // KCENON_WITH_COMMON_SYSTEM
411
412 private:
413 // =====================================================================
414 // Internal Implementation Methods
415 // =====================================================================
416
422 auto do_start_impl(unsigned short port) -> VoidResult;
423
428 auto do_stop_impl() -> VoidResult;
429
430 auto start_receive() -> void;
431
432 auto handle_packet(std::span<const uint8_t> data,
433 const asio::ip::udp::endpoint& from) -> void;
434
437 const asio::ip::udp::endpoint& endpoint)
438 -> std::shared_ptr<session::quic_session>;
439
440 auto generate_session_id() -> std::string;
441
442 auto on_session_close(const std::string& session_id) -> void;
443
444 auto start_cleanup_timer() -> void;
445
446 auto cleanup_dead_sessions() -> void;
447
448 // =====================================================================
449 // Internal Callback Helpers
450 // =====================================================================
451
456 auto invoke_connection_callback(std::shared_ptr<session::quic_session> session) -> void;
457
462 auto invoke_disconnection_callback(std::shared_ptr<session::quic_session> session) -> void;
463
469 auto invoke_receive_callback(std::shared_ptr<session::quic_session> session,
470 const std::vector<uint8_t>& data) -> void;
471
479 auto invoke_stream_receive_callback(std::shared_ptr<session::quic_session> session,
480 uint64_t stream_id,
481 const std::vector<uint8_t>& data,
482 bool fin) -> void;
483
488 auto invoke_error_callback(std::error_code ec) -> void;
489
492
500 >;
501
502 // =====================================================================
503 // Member Variables
504 // =====================================================================
505
506 std::string server_id_;
510 std::unique_ptr<asio::io_context> io_context_;
511 std::unique_ptr<asio::executor_work_guard<asio::io_context::executor_type>>
513 std::unique_ptr<asio::ip::udp::socket> udp_socket_;
514 std::shared_ptr<integration::thread_pool_interface> thread_pool_;
515 std::future<void> io_context_future_;
516
518
519 // Session management
520 mutable std::shared_mutex sessions_mutex_;
521 std::map<std::string, std::shared_ptr<session::quic_session>> sessions_;
522
523 // Receive buffer
524 std::array<uint8_t, 65536> recv_buffer_;
525 asio::ip::udp::endpoint recv_endpoint_;
526
527 // Cleanup timer
528 std::unique_ptr<asio::steady_timer> cleanup_timer_;
529
530 // Session ID counter
531 std::atomic<uint64_t> session_counter_{0};
532
533 // Interface callback storage (separate from legacy callbacks)
535
536#if KCENON_WITH_COMMON_SYSTEM
537 kcenon::common::interfaces::IMonitor* monitor_ = nullptr;
538 std::atomic<uint64_t> messages_received_{0};
539 std::atomic<uint64_t> messages_sent_{0};
540 std::atomic<uint64_t> connection_errors_{0};
541#endif // KCENON_WITH_COMMON_SYSTEM
542 };
543
544// =====================================================================
545// Unified Pattern Type Aliases
546// =====================================================================
547// These aliases provide a consistent API pattern across all protocols,
548// making QUIC servers accessible via the unified template naming.
549// See: unified_messaging_server.h for TCP, unified_udp_messaging_server.h for UDP.
550
564
579
580} // namespace kcenon::network::core
Thread-safe callback registration and invocation manager.
A QUIC server that manages incoming client connections.
auto invoke_error_callback(std::error_code ec) -> void
Invokes the error callback.
auto is_running() const -> bool override
Checks if the server is currently running.
std::function< void(std::error_code)> error_callback_t
Callback type for errors.
auto on_session_close(const std::string &session_id) -> void
auto stop_server() -> VoidResult
Stops the server and releases all resources.
auto disconnect_all(uint64_t error_code=0) -> void
Disconnect all active sessions.
messaging_quic_server(std::string_view server_id)
Constructs a QUIC server with a given identifier.
auto sessions() const -> std::vector< std::shared_ptr< session::quic_session > >
Get all active sessions.
std::unique_ptr< asio::ip::udp::socket > udp_socket_
auto stop() -> VoidResult override
Stops the QUIC server.
auto disconnect_session(const std::string &session_id, uint64_t error_code=0) -> VoidResult
Disconnect a specific session.
auto broadcast(std::vector< uint8_t > &&data) -> VoidResult
Send data to all connected clients.
auto handle_packet(std::span< const uint8_t > data, const asio::ip::udp::endpoint &from) -> void
auto invoke_connection_callback(std::shared_ptr< session::quic_session > session) -> void
Invokes the connection callback.
auto start(uint16_t port) -> VoidResult override
Starts the QUIC server on the specified port.
auto set_stream_receive_callback(stream_receive_callback_t callback) -> void
Sets the callback for stream data reception (legacy version).
std::unique_ptr< asio::executor_work_guard< asio::io_context::executor_type > > work_guard_
std::array< uint8_t, 65536 > recv_buffer_
auto set_receive_callback(interfaces::i_quic_server::receive_callback_t callback) -> void override
Sets the callback for received data on default stream (interface version).
auto set_connection_callback(interfaces::i_quic_server::connection_callback_t callback) -> void override
Sets the callback for new connections (interface version).
auto session_count() const -> size_t
Get the number of active sessions.
auto start_server(unsigned short port) -> VoidResult
Start the server with default configuration.
std::function< void(std::shared_ptr< session::quic_session >, uint64_t, const std::vector< uint8_t > &, bool)> stream_receive_callback_t
Callback type for stream data (session, stream_id, data, fin)
auto do_start_impl(unsigned short port) -> VoidResult
QUIC-specific implementation of server start.
auto invoke_receive_callback(std::shared_ptr< session::quic_session > session, const std::vector< uint8_t > &data) -> void
Invokes the receive callback.
std::function< void(std::shared_ptr< session::quic_session >, const std::vector< uint8_t > &)> receive_callback_t
Callback type for received data (session, data)
interfaces::i_quic_server::error_callback_t interface_error_cb_
auto invoke_disconnection_callback(std::shared_ptr< session::quic_session > session) -> void
Invokes the disconnection callback.
std::function< void(std::shared_ptr< session::quic_session >)> disconnection_callback_t
Callback type for disconnections.
auto wait_for_stop() -> void override
Blocks until stop() is called.
std::map< std::string, std::shared_ptr< session::quic_session > > sessions_
std::shared_ptr< integration::thread_pool_interface > thread_pool_
auto get_session(const std::string &session_id) -> std::shared_ptr< session::quic_session >
Get a session by its ID.
std::unique_ptr< asio::io_context > io_context_
~messaging_quic_server() noexcept override
Destructor; automatically calls stop_server() if running.
auto set_disconnection_callback(interfaces::i_quic_server::disconnection_callback_t callback) -> void override
Sets the callback for disconnections (interface version).
auto connection_count() const -> size_t override
Gets the number of active QUIC connections (interface version).
auto server_id() const -> const std::string &
Returns the server identifier.
auto do_stop_impl() -> VoidResult
QUIC-specific implementation of server stop.
auto find_or_create_session(const protocols::quic::connection_id &dcid, const asio::ip::udp::endpoint &endpoint) -> std::shared_ptr< session::quic_session >
auto invoke_stream_receive_callback(std::shared_ptr< session::quic_session > session, uint64_t stream_id, const std::vector< uint8_t > &data, bool fin) -> void
Invokes the stream receive callback.
auto set_stream_callback(interfaces::i_quic_server::stream_callback_t callback) -> void override
Sets the callback for stream data (interface version).
std::unique_ptr< asio::steady_timer > cleanup_timer_
auto set_error_callback(interfaces::i_quic_server::error_callback_t callback) -> void override
Sets the callback for errors (interface version).
auto multicast(const std::vector< std::string > &session_ids, std::vector< uint8_t > &&data) -> VoidResult
Send data to specific sessions.
std::function< void(std::shared_ptr< session::quic_session >)> connection_callback_t
Callback type for new connections.
Interface for QUIC server components.
std::function< void( std::string_view, uint64_t, const std::vector< uint8_t > &, bool)> stream_callback_t
Callback type for stream data (session_id, stream_id, data, is_fin)
std::function< void(std::string_view, std::error_code)> error_callback_t
Callback type for errors (session_id, error)
QUIC Connection ID (RFC 9000 Section 5.1)
Thread-safe lifecycle state management for network components.
QUIC connection identifier type.
Feature flags for network_system.
Macros and utilities for marking experimental APIs.
#define NETWORK_REQUIRE_EXPERIMENTAL
Enforces opt-in for experimental APIs at compile time.
Component lifecycle management (start, stop, restart).
Result< std::monostate > VoidResult
quic_server_callback
Callback indices for messaging_quic_server.
Global context for shared network system resources.
Network-specific error and result type definitions.
Configuration options for QUIC server.
Definition quic_server.h:63
std::string key_file
Path to server private key file (PEM format, required)
Definition quic_server.h:68
uint64_t max_idle_timeout_ms
Maximum idle timeout in milliseconds (default: 30 seconds)
Definition quic_server.h:80
uint64_t initial_max_stream_data
Initial maximum data per stream (default: 64 KB)
Definition quic_server.h:86
std::string cert_file
Path to server certificate file (PEM format, required)
Definition quic_server.h:65
std::optional< std::string > ca_cert_file
Path to CA certificate file for client verification (optional)
Definition quic_server.h:71
std::vector< std::string > alpn_protocols
ALPN protocols to negotiate.
Definition quic_server.h:77
uint64_t initial_max_streams_bidi
Initial maximum bidirectional streams (default: 100)
Definition quic_server.h:89
size_t max_connections
Maximum number of concurrent connections (default: 10000)
Definition quic_server.h:95
uint64_t initial_max_data
Initial maximum data that can be sent (default: 1 MB)
Definition quic_server.h:83
uint64_t initial_max_streams_uni
Initial maximum unidirectional streams (default: 100)
Definition quic_server.h:92
bool require_client_cert
Whether to require client certificate (mutual TLS)
Definition quic_server.h:74
std::vector< uint8_t > retry_key
Key for retry token validation (auto-generated if empty)
bool enable_retry
Enable retry token for DoS protection (default: true)
Definition quic_server.h:98
Thread system integration interface for network_system.