Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
quic_facade.cpp
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
6
7#include <atomic>
8#include <iomanip>
9#include <sstream>
10#include <stdexcept>
11
14
16{
17
18namespace
19{
21 std::atomic<uint64_t> g_client_id_counter{0};
22
24 std::atomic<uint64_t> g_server_id_counter{0};
25} // namespace
26
28{
29 const auto id = g_client_id_counter.fetch_add(1, std::memory_order_relaxed);
30 std::ostringstream oss;
31 oss << "quic_client_" << std::setfill('0') << std::setw(8) << id;
32 return oss.str();
33}
34
36{
37 const auto id = g_server_id_counter.fetch_add(1, std::memory_order_relaxed);
38 std::ostringstream oss;
39 oss << "quic_server_" << std::setfill('0') << std::setw(8) << id;
40 return oss.str();
41}
42
44{
45 if (config.host.empty())
46 {
47 return error_void(-1, "quic_facade: host cannot be empty", "quic_facade");
48 }
49
50 if (config.port == 0 || config.port > 65535)
51 {
52 return error_void(-1, "quic_facade: port must be between 1 and 65535", "quic_facade");
53 }
54
55 if (config.max_idle_timeout_ms == 0)
56 {
57 return error_void(-1, "quic_facade: max_idle_timeout_ms must be positive", "quic_facade");
58 }
59
60 return ok();
61}
62
64{
65 if (config.port == 0 || config.port > 65535)
66 {
67 return error_void(-1, "quic_facade: port must be between 1 and 65535", "quic_facade");
68 }
69
70 if (config.cert_path.empty())
71 {
72 return error_void(-1, "quic_facade: cert_path cannot be empty", "quic_facade");
73 }
74
75 if (config.key_path.empty())
76 {
77 return error_void(-1, "quic_facade: key_path cannot be empty", "quic_facade");
78 }
79
80 if (config.max_idle_timeout_ms == 0)
81 {
82 return error_void(-1, "quic_facade: max_idle_timeout_ms must be positive", "quic_facade");
83 }
84
85 if (config.max_connections == 0)
86 {
87 return error_void(-1, "quic_facade: max_connections must be positive", "quic_facade");
88 }
89
90 return ok();
91}
92
95{
96 auto validation = validate_client_config(config);
97 if (validation.is_err())
98 {
100 validation.error().code, validation.error().message, "quic_facade");
101 }
102
103 const auto client_id = config.client_id.empty() ? generate_client_id() : config.client_id;
104
105 auto adapter = std::make_shared<internal::adapters::quic_client_adapter>(client_id);
106
107 // Configure QUIC-specific options
108 if (!config.alpn.empty())
109 {
110 adapter->set_alpn_protocols({config.alpn});
111 }
112
113 if (config.ca_cert_path)
114 {
115 adapter->set_ca_cert_path(*config.ca_cert_path);
116 }
117
118 if (config.client_cert_path && config.client_key_path)
119 {
120 adapter->set_client_cert(*config.client_cert_path, *config.client_key_path);
121 }
122
123 adapter->set_verify_server(config.verify_server);
124 adapter->set_max_idle_timeout(config.max_idle_timeout_ms);
125
126 return ok(std::shared_ptr<interfaces::i_protocol_client>(adapter));
127}
128
131{
132 auto validation = validate_server_config(config);
133 if (validation.is_err())
134 {
136 validation.error().code, validation.error().message, "quic_facade");
137 }
138
139 const auto server_id = config.server_id.empty() ? generate_server_id() : config.server_id;
140
141 auto adapter = std::make_shared<internal::adapters::quic_server_adapter>(server_id);
142
143 // Configure TLS certificates (required for QUIC)
144 adapter->set_cert_path(config.cert_path);
145 adapter->set_key_path(config.key_path);
146
147 // Configure QUIC-specific options
148 if (!config.alpn.empty())
149 {
150 adapter->set_alpn_protocols({config.alpn});
151 }
152
153 if (config.ca_cert_path)
154 {
155 adapter->set_ca_cert_path(*config.ca_cert_path);
156 }
157
158 adapter->set_require_client_cert(config.require_client_cert);
159 adapter->set_max_idle_timeout(config.max_idle_timeout_ms);
160 adapter->set_max_connections(config.max_connections);
161
162 return ok(std::shared_ptr<interfaces::i_protocol_server>(adapter));
163}
164
165} // namespace kcenon::network::facade
static auto generate_client_id() -> std::string
Generates a unique client ID.
static auto generate_server_id() -> std::string
Generates a unique server ID.
static auto validate_client_config(const client_config &config) -> VoidResult
Validates client configuration.
auto create_client(const client_config &config) const -> Result< std::shared_ptr< interfaces::i_protocol_client > >
Creates a QUIC client with the specified configuration.
static auto validate_server_config(const server_config &config) -> VoidResult
Validates server configuration.
auto create_server(const server_config &config) const -> Result< std::shared_ptr< interfaces::i_protocol_server > >
Creates a QUIC server with the specified configuration.
tracing_config config
Definition exporters.cpp:29
VoidResult error_void(int code, const std::string &message, const std::string &source="network_system", const std::string &details="")
VoidResult ok()
Simplified facade for creating QUIC clients and servers.
Configuration for creating a QUIC client.
Definition quic_facade.h:88
Configuration for creating a QUIC server.