From 0f6c356f39f2f400dc408e6c74aff47c2cc0ec5b Mon Sep 17 00:00:00 2001 From: Simon Wicky Date: Mon, 27 Oct 2025 13:35:36 +0100 Subject: [PATCH] configurable mixnet client startup timeout --- nym-registration-client/src/builder/config.rs | 58 +++++++++---------- nym-registration-client/src/builder/mod.rs | 7 +-- nym-registration-client/src/lib.rs | 3 +- 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/nym-registration-client/src/builder/config.rs b/nym-registration-client/src/builder/config.rs index d1a342faa9..2362c51817 100644 --- a/nym-registration-client/src/builder/config.rs +++ b/nym-registration-client/src/builder/config.rs @@ -19,6 +19,7 @@ use tokio_util::sync::CancellationToken; use crate::error::RegistrationClientError; const VPN_AVERAGE_PACKET_DELAY: Duration = Duration::from_millis(15); +const MIXNET_CLIENT_STARTUP_TIMEOUT: Duration = Duration::from_secs(30); #[derive(Clone)] pub struct NymNodeWithKeys { @@ -31,6 +32,7 @@ pub struct BuilderConfig { pub exit_node: NymNodeWithKeys, pub data_path: Option, pub mixnet_client_config: MixnetClientConfig, + pub mixnet_client_startup_timeout: Duration, pub two_hops: bool, pub user_agent: UserAgent, pub custom_topology_provider: Box, @@ -56,37 +58,6 @@ pub struct MixnetClientConfig { } impl BuilderConfig { - /// Creates a new BuilderConfig with all required parameters. - /// - /// However, consider using `BuilderConfig::builder()` instead. - #[allow(clippy::too_many_arguments)] - pub fn new( - entry_node: NymNodeWithKeys, - exit_node: NymNodeWithKeys, - data_path: Option, - mixnet_client_config: MixnetClientConfig, - two_hops: bool, - user_agent: UserAgent, - custom_topology_provider: Box, - network_env: NymNetworkDetails, - cancel_token: CancellationToken, - #[cfg(unix)] connection_fd_callback: Arc, - ) -> Self { - Self { - entry_node, - exit_node, - data_path, - mixnet_client_config, - two_hops, - user_agent, - custom_topology_provider, - network_env, - cancel_token, - #[cfg(unix)] - connection_fd_callback, - } - } - /// Creates a builder for BuilderConfig /// /// This is the preferred way to construct a BuilderConfig. @@ -287,6 +258,7 @@ pub struct BuilderConfigBuilder { exit_node: Option, data_path: Option, mixnet_client_config: Option, + mixnet_client_startup_timeout: Duration, two_hops: bool, user_agent: Option, custom_topology_provider: Option>, @@ -298,39 +270,58 @@ pub struct BuilderConfigBuilder { impl BuilderConfigBuilder { pub fn new() -> Self { - Self::default() + Self { + mixnet_client_startup_timeout: MIXNET_CLIENT_STARTUP_TIMEOUT, + ..Default::default() + } } + #[must_use] pub fn entry_node(mut self, entry_node: NymNodeWithKeys) -> Self { self.entry_node = Some(entry_node); self } + #[must_use] pub fn exit_node(mut self, exit_node: NymNodeWithKeys) -> Self { self.exit_node = Some(exit_node); self } + #[must_use] pub fn data_path(mut self, data_path: Option) -> Self { self.data_path = data_path; self } + #[must_use] pub fn mixnet_client_config(mut self, mixnet_client_config: MixnetClientConfig) -> Self { self.mixnet_client_config = Some(mixnet_client_config); self } + #[must_use] + pub fn mixnet_client_startup_timeout( + mut self, + mixnet_client_startup_timeout: Duration, + ) -> Self { + self.mixnet_client_startup_timeout = mixnet_client_startup_timeout; + self + } + + #[must_use] pub fn two_hops(mut self, two_hops: bool) -> Self { self.two_hops = two_hops; self } + #[must_use] pub fn user_agent(mut self, user_agent: UserAgent) -> Self { self.user_agent = Some(user_agent); self } + #[must_use] pub fn custom_topology_provider( mut self, custom_topology_provider: Box, @@ -339,11 +330,13 @@ impl BuilderConfigBuilder { self } + #[must_use] pub fn network_env(mut self, network_env: NymNetworkDetails) -> Self { self.network_env = Some(network_env); self } + #[must_use] pub fn cancel_token(mut self, cancel_token: CancellationToken) -> Self { self.cancel_token = Some(cancel_token); self @@ -371,6 +364,7 @@ impl BuilderConfigBuilder { mixnet_client_config: self .mixnet_client_config .ok_or(BuilderConfigError::MissingMixnetClientConfig)?, + mixnet_client_startup_timeout: self.mixnet_client_startup_timeout, two_hops: self.two_hops, user_agent: self .user_agent diff --git a/nym-registration-client/src/builder/mod.rs b/nym-registration-client/src/builder/mod.rs index e981871684..7993f922d2 100644 --- a/nym-registration-client/src/builder/mod.rs +++ b/nym-registration-client/src/builder/mod.rs @@ -12,15 +12,12 @@ use nym_validator_client::{ QueryHttpRpcNyxdClient, nyxd::{Config as NyxdClientConfig, NyxdClient}, }; -use std::time::Duration; use crate::{RegistrationClient, config::RegistrationClientConfig, error::RegistrationClientError}; use config::BuilderConfig; pub(crate) mod config; -pub(crate) const MIXNET_CLIENT_STARTUP_TIMEOUT: Duration = Duration::from_secs(30); - pub struct RegistrationClientBuilder { pub config: BuilderConfig, } @@ -49,7 +46,7 @@ impl RegistrationClientBuilder { let builder = MixnetClientBuilder::new_with_storage(mixnet_client_storage) .event_tx(EventSender(event_tx)); let mixnet_client = tokio::time::timeout( - MIXNET_CLIENT_STARTUP_TIMEOUT, + self.config.mixnet_client_startup_timeout, self.config.build_and_connect_mixnet_client(builder), ) .await??; @@ -59,7 +56,7 @@ impl RegistrationClientBuilder { } else { let builder = MixnetClientBuilder::new_ephemeral().event_tx(EventSender(event_tx)); let mixnet_client = tokio::time::timeout( - MIXNET_CLIENT_STARTUP_TIMEOUT, + self.config.mixnet_client_startup_timeout, self.config.build_and_connect_mixnet_client(builder), ) .await??; diff --git a/nym-registration-client/src/lib.rs b/nym-registration-client/src/lib.rs index 0ba6fea90e..8d74305778 100644 --- a/nym-registration-client/src/lib.rs +++ b/nym-registration-client/src/lib.rs @@ -19,7 +19,8 @@ mod types; pub use builder::RegistrationClientBuilder; pub use builder::config::{ - BuilderConfig as RegistrationClientBuilderConfig, MixnetClientConfig, + BuilderConfig as RegistrationClientBuilderConfig, + BuilderConfigBuilder as RegistrationClientBuilderConfigBuilder, MixnetClientConfig, NymNodeWithKeys as RegistrationNymNode, }; pub use error::RegistrationClientError;