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
55#if defined(NETWORK_ENABLE_TEST_INJECTION)
56namespace kcenon::network::tests::support
57{
58 class quic_server_probe;
59} // namespace kcenon::network::tests::support
60#endif
61
63{
64
70 {
72 std::string cert_file;
73
75 std::string key_file;
76
78 std::optional<std::string> ca_cert_file;
79
82
84 std::vector<std::string> alpn_protocols;
85
87 uint64_t max_idle_timeout_ms{30000};
88
90 uint64_t initial_max_data{1048576};
91
93 uint64_t initial_max_stream_data{65536};
94
97
100
102 size_t max_connections{10000};
103
105 bool enable_retry{true};
106
108 std::vector<uint8_t> retry_key;
109 };
110
150 : public std::enable_shared_from_this<messaging_quic_server>
152 {
153 public:
155 using connection_callback_t = std::function<void(std::shared_ptr<session::quic_session>)>;
157 using disconnection_callback_t = std::function<void(std::shared_ptr<session::quic_session>)>;
159 using receive_callback_t = std::function<void(std::shared_ptr<session::quic_session>,
160 const std::vector<uint8_t>&)>;
162 using stream_receive_callback_t = std::function<void(std::shared_ptr<session::quic_session>,
163 uint64_t,
164 const std::vector<uint8_t>&,
165 bool)>;
167 using error_callback_t = std::function<void(std::error_code)>;
168
173 explicit messaging_quic_server(std::string_view server_id);
174
178 ~messaging_quic_server() noexcept override;
179
180 // Non-copyable, non-movable
182 messaging_quic_server& operator=(const messaging_quic_server&) = delete;
185
186 // =====================================================================
187 // Server Lifecycle
188 // =====================================================================
189
195 [[nodiscard]] auto start_server(unsigned short port) -> VoidResult;
196
203 [[nodiscard]] auto start_server(unsigned short port,
204 const quic_server_config& config)
205 -> VoidResult;
206
211 [[nodiscard]] auto stop_server() -> VoidResult;
212
217 [[nodiscard]] auto server_id() const -> const std::string&;
218
219 // =====================================================================
220 // Session Management
221 // =====================================================================
222
227 [[nodiscard]] auto sessions() const
228 -> std::vector<std::shared_ptr<session::quic_session>>;
229
235 [[nodiscard]] auto get_session(const std::string& session_id)
236 -> std::shared_ptr<session::quic_session>;
237
242 [[nodiscard]] auto session_count() const -> size_t;
243
250 [[nodiscard]] auto disconnect_session(const std::string& session_id,
251 uint64_t error_code = 0)
252 -> VoidResult;
253
258 auto disconnect_all(uint64_t error_code = 0) -> void;
259
260 // =====================================================================
261 // Broadcasting
262 // =====================================================================
263
269 [[nodiscard]] auto broadcast(std::vector<uint8_t>&& data) -> VoidResult;
270
277 [[nodiscard]] auto multicast(const std::vector<std::string>& session_ids,
278 std::vector<uint8_t>&& data) -> VoidResult;
279
280 // =====================================================================
281 // i_network_component interface implementation
282 // =====================================================================
283
290 [[nodiscard]] auto is_running() const -> bool override;
291
297 auto wait_for_stop() -> void override;
298
299 // =====================================================================
300 // i_quic_server interface implementation
301 // =====================================================================
302
310 [[nodiscard]] auto start(uint16_t port) -> VoidResult override;
311
318 [[nodiscard]] auto stop() -> VoidResult override;
319
326 [[nodiscard]] auto connection_count() const -> size_t override;
327
334 auto set_connection_callback(interfaces::i_quic_server::connection_callback_t callback) -> void override;
335
342 auto set_disconnection_callback(interfaces::i_quic_server::disconnection_callback_t callback) -> void override;
343
350 auto set_receive_callback(interfaces::i_quic_server::receive_callback_t callback) -> void override;
351
358 auto set_stream_callback(interfaces::i_quic_server::stream_callback_t callback) -> void override;
359
366 auto set_error_callback(interfaces::i_quic_server::error_callback_t callback) -> void override;
367
368 // =====================================================================
369 // Legacy API (maintained for backward compatibility)
370 // =====================================================================
371
376 auto set_connection_callback(connection_callback_t callback) -> void;
377
383
388 auto set_receive_callback(receive_callback_t callback) -> void;
389
398
403 auto set_error_callback(error_callback_t callback) -> void;
404
405#if KCENON_WITH_COMMON_SYSTEM
410 auto set_monitor(kcenon::common::interfaces::IMonitor* monitor) -> void;
411
416 auto get_monitor() const -> kcenon::common::interfaces::IMonitor*;
417#endif // KCENON_WITH_COMMON_SYSTEM
418
419 private:
420#if defined(NETWORK_ENABLE_TEST_INJECTION)
421 // Test-only: grants tests/support/quic_server_probe access to private
422 // surfaces without leaking them through the public API.
423 friend class kcenon::network::tests::support::quic_server_probe;
424#endif
425
426 // =====================================================================
427 // Internal Implementation Methods
428 // =====================================================================
429
435 auto do_start_impl(unsigned short port) -> VoidResult;
436
441 auto do_stop_impl() -> VoidResult;
442
443 auto start_receive() -> void;
444
445 auto handle_packet(std::span<const uint8_t> data,
446 const asio::ip::udp::endpoint& from) -> void;
447
450 const asio::ip::udp::endpoint& endpoint)
451 -> std::shared_ptr<session::quic_session>;
452
453 auto generate_session_id() -> std::string;
454
455 auto on_session_close(const std::string& session_id) -> void;
456
457 auto start_cleanup_timer() -> void;
458
459 auto cleanup_dead_sessions() -> void;
460
461 // =====================================================================
462 // Internal Callback Helpers
463 // =====================================================================
464
469 auto invoke_connection_callback(std::shared_ptr<session::quic_session> session) -> void;
470
475 auto invoke_disconnection_callback(std::shared_ptr<session::quic_session> session) -> void;
476
482 auto invoke_receive_callback(std::shared_ptr<session::quic_session> session,
483 const std::vector<uint8_t>& data) -> void;
484
492 auto invoke_stream_receive_callback(std::shared_ptr<session::quic_session> session,
493 uint64_t stream_id,
494 const std::vector<uint8_t>& data,
495 bool fin) -> void;
496
501 auto invoke_error_callback(std::error_code ec) -> void;
502
505
513 >;
514
515 // =====================================================================
516 // Member Variables
517 // =====================================================================
518
519 std::string server_id_;
523 std::unique_ptr<asio::io_context> io_context_;
524 std::unique_ptr<asio::executor_work_guard<asio::io_context::executor_type>>
526 std::unique_ptr<asio::ip::udp::socket> udp_socket_;
527 std::shared_ptr<integration::thread_pool_interface> thread_pool_;
528 std::future<void> io_context_future_;
529
531
532 // Session management
533 mutable std::shared_mutex sessions_mutex_;
534 std::map<std::string, std::shared_ptr<session::quic_session>> sessions_;
535
536 // Receive buffer
537 std::array<uint8_t, 65536> recv_buffer_;
538 asio::ip::udp::endpoint recv_endpoint_;
539
540 // Cleanup timer
541 std::unique_ptr<asio::steady_timer> cleanup_timer_;
542
543 // Session ID counter
544 std::atomic<uint64_t> session_counter_{0};
545
546 // Interface callback storage (separate from legacy callbacks)
548
549#if KCENON_WITH_COMMON_SYSTEM
550 kcenon::common::interfaces::IMonitor* monitor_ = nullptr;
551 std::atomic<uint64_t> messages_received_{0};
552 std::atomic<uint64_t> messages_sent_{0};
553 std::atomic<uint64_t> connection_errors_{0};
554#endif // KCENON_WITH_COMMON_SYSTEM
555 };
556
557// =====================================================================
558// Unified Pattern Type Aliases
559// =====================================================================
560// These aliases provide a consistent API pattern across all protocols,
561// making QUIC servers accessible via the unified template naming.
562// See: unified_messaging_server.h for TCP, unified_udp_messaging_server.h for UDP.
563
577
592
593} // 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:70
std::string key_file
Path to server private key file (PEM format, required)
Definition quic_server.h:75
uint64_t max_idle_timeout_ms
Maximum idle timeout in milliseconds (default: 30 seconds)
Definition quic_server.h:87
uint64_t initial_max_stream_data
Initial maximum data per stream (default: 64 KB)
Definition quic_server.h:93
std::string cert_file
Path to server certificate file (PEM format, required)
Definition quic_server.h:72
std::optional< std::string > ca_cert_file
Path to CA certificate file for client verification (optional)
Definition quic_server.h:78
std::vector< std::string > alpn_protocols
ALPN protocols to negotiate.
Definition quic_server.h:84
uint64_t initial_max_streams_bidi
Initial maximum bidirectional streams (default: 100)
Definition quic_server.h:96
size_t max_connections
Maximum number of concurrent connections (default: 10000)
uint64_t initial_max_data
Initial maximum data that can be sent (default: 1 MB)
Definition quic_server.h:90
uint64_t initial_max_streams_uni
Initial maximum unidirectional streams (default: 100)
Definition quic_server.h:99
bool require_client_cert
Whether to require client certificate (mutual TLS)
Definition quic_server.h:81
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)
Thread system integration interface for network_system.