21 std::atomic<uint64_t> g_client_id_counter{0};
24 std::atomic<uint64_t> g_server_id_counter{0};
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;
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;
47 return error_void(-1,
"quic_facade: host cannot be empty",
"quic_facade");
52 return error_void(-1,
"quic_facade: port must be between 1 and 65535",
"quic_facade");
55 if (
config.max_idle_timeout_ms == 0)
57 return error_void(-1,
"quic_facade: max_idle_timeout_ms must be positive",
"quic_facade");
67 return error_void(-1,
"quic_facade: port must be between 1 and 65535",
"quic_facade");
70 if (
config.cert_path.empty())
72 return error_void(-1,
"quic_facade: cert_path cannot be empty",
"quic_facade");
75 if (
config.key_path.empty())
77 return error_void(-1,
"quic_facade: key_path cannot be empty",
"quic_facade");
80 if (
config.max_idle_timeout_ms == 0)
82 return error_void(-1,
"quic_facade: max_idle_timeout_ms must be positive",
"quic_facade");
85 if (
config.max_connections == 0)
87 return error_void(-1,
"quic_facade: max_connections must be positive",
"quic_facade");
96 auto validation = validate_client_config(
config);
97 if (validation.is_err())
100 validation.error().code, validation.error().message,
"quic_facade");
103 const auto client_id =
config.client_id.empty() ? generate_client_id() :
config.client_id;
105 auto adapter = std::make_shared<internal::adapters::quic_client_adapter>(client_id);
110 adapter->set_alpn_protocols({
config.alpn});
115 adapter->set_ca_cert_path(*
config.ca_cert_path);
120 adapter->set_client_cert(*
config.client_cert_path, *
config.client_key_path);
123 adapter->set_verify_server(
config.verify_server);
124 adapter->set_max_idle_timeout(
config.max_idle_timeout_ms);
126 return ok(std::shared_ptr<interfaces::i_protocol_client>(adapter));
132 auto validation = validate_server_config(
config);
133 if (validation.is_err())
136 validation.error().code, validation.error().message,
"quic_facade");
139 const auto server_id =
config.server_id.empty() ? generate_server_id() :
config.server_id;
141 auto adapter = std::make_shared<internal::adapters::quic_server_adapter>(server_id);
144 adapter->set_cert_path(
config.cert_path);
145 adapter->set_key_path(
config.key_path);
150 adapter->set_alpn_protocols({
config.alpn});
155 adapter->set_ca_cert_path(*
config.ca_cert_path);
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);
162 return ok(std::shared_ptr<interfaces::i_protocol_server>(adapter));
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.
VoidResult error_void(int code, const std::string &message, const std::string &source="network_system", const std::string &details="")
Simplified facade for creating QUIC clients and servers.
Configuration for creating a QUIC client.
Configuration for creating a QUIC server.