From 2e38c5e38ee9dc9ed55fe13ee3ab9c763ea41a10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Thu, 9 Feb 2023 16:55:01 +0100 Subject: [PATCH] nym-sdk: remove a few unwraps related to creating reply surb storage (#3006) --- .../reply_storage/backend/browser_backend.rs | 9 ++++++--- .../reply_storage/backend/fs_backend/error.rs | 5 +++++ .../reply_storage/backend/fs_backend/mod.rs | 12 ++++++++++-- .../client/replies/reply_storage/backend/mod.rs | 14 ++++++++++---- sdk/rust/nym-sdk/src/error.rs | 5 +++++ sdk/rust/nym-sdk/src/mixnet/client.rs | 16 ++++++++++++---- 6 files changed, 48 insertions(+), 13 deletions(-) diff --git a/clients/client-core/src/client/replies/reply_storage/backend/browser_backend.rs b/clients/client-core/src/client/replies/reply_storage/backend/browser_backend.rs index 4aa9dee63a..2753d765cd 100644 --- a/clients/client-core/src/client/replies/reply_storage/backend/browser_backend.rs +++ b/clients/client-core/src/client/replies/reply_storage/backend/browser_backend.rs @@ -29,13 +29,16 @@ impl Backend { impl ReplyStorageBackend for Backend { type StorageError = ::StorageError; - async fn new(debug_config: &crate::config::DebugConfig, _db_path: Option) -> Self { - Backend { + async fn new( + debug_config: &crate::config::DebugConfig, + _db_path: Option, + ) -> Result { + Ok(Backend { empty: Empty { min_surb_threshold: debug_config.minimum_reply_surb_storage_threshold, max_surb_threshold: debug_config.maximum_reply_surb_storage_threshold, }, - } + }) } async fn flush_surb_storage( diff --git a/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/error.rs b/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/error.rs index 824b67e019..84cac2f7ec 100644 --- a/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/error.rs +++ b/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/error.rs @@ -56,4 +56,9 @@ pub enum StorageError { details: String, // err: Option> }, + + #[error("failed to create storage")] + FailedToCreateStorage { + source: Box, + }, } diff --git a/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/mod.rs b/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/mod.rs index ce75b6afcd..070344a21c 100644 --- a/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/mod.rs +++ b/clients/client-core/src/client/replies/reply_storage/backend/fs_backend/mod.rs @@ -368,10 +368,18 @@ impl Backend { impl ReplyStorageBackend for Backend { type StorageError = error::StorageError; - async fn new(debug_config: &crate::config::DebugConfig, db_path: Option) -> Self { + async fn new( + debug_config: &crate::config::DebugConfig, + db_path: Option, + ) -> Result { non_wasm_helpers::setup_fs_reply_surb_backend(db_path, debug_config) .await - .unwrap() + .map_err(|err| { + log::error!("Failed to create storage: {err}"); + Self::StorageError::FailedToCreateStorage { + source: Box::new(err), + } + }) } fn is_active(&self) -> bool { diff --git a/clients/client-core/src/client/replies/reply_storage/backend/mod.rs b/clients/client-core/src/client/replies/reply_storage/backend/mod.rs index e1727795d0..3113b3a95d 100644 --- a/clients/client-core/src/client/replies/reply_storage/backend/mod.rs +++ b/clients/client-core/src/client/replies/reply_storage/backend/mod.rs @@ -30,11 +30,14 @@ pub struct Empty { impl ReplyStorageBackend for Empty { type StorageError = UndefinedError; - async fn new(debug_config: &crate::config::DebugConfig, _db_path: Option) -> Self { - Self { + async fn new( + debug_config: &crate::config::DebugConfig, + _db_path: Option, + ) -> Result { + Ok(Self { min_surb_threshold: debug_config.minimum_reply_surb_storage_threshold, max_surb_threshold: debug_config.maximum_reply_surb_storage_threshold, - } + }) } async fn flush_surb_storage( @@ -70,7 +73,10 @@ impl ReplyStorageBackend for Empty { pub trait ReplyStorageBackend: Sized { type StorageError: Error + 'static; - async fn new(debug_config: &crate::config::DebugConfig, db_path: Option) -> Self; + async fn new( + debug_config: &crate::config::DebugConfig, + db_path: Option, + ) -> Result; fn is_active(&self) -> bool { true diff --git a/sdk/rust/nym-sdk/src/error.rs b/sdk/rust/nym-sdk/src/error.rs index c801fc121f..fb1ce1c8ff 100644 --- a/sdk/rust/nym-sdk/src/error.rs +++ b/sdk/rust/nym-sdk/src/error.rs @@ -33,6 +33,11 @@ pub enum Error { ReregisteringGatewayNotSupported, #[error("no gateway key set")] NoGatewayKeySet, + + #[error("failed to create reply storage backend: {source}")] + StorageError { + source: Box, + }, } pub type Result = std::result::Result; diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index 61e70175d0..ad8628f4ef 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -69,11 +69,12 @@ impl MixnetClientBuilder { pub async fn build(self) -> Result> where B: ReplyStorageBackend + Send + Sync + 'static, + ::StorageError: Send + Sync, { let config = self.config.unwrap_or_default(); let storage_paths = self.storage_paths; - let mut client = DisconnectedMixnetClient::new(Some(config), storage_paths).await; + let mut client = DisconnectedMixnetClient::new(Some(config), storage_paths).await?; if let Some(keys) = self.keys { client.set_keys(keys); @@ -121,15 +122,22 @@ where async fn new( config: Option, paths: Option, - ) -> DisconnectedMixnetClient { + ) -> Result> + where + ::StorageError: Send + Sync, + { let config = config.unwrap_or_default(); let reply_surb_database_path = paths.as_ref().map(|p| p.reply_surb_database_path.clone()); let reply_storage_backend = - ReplyStorageBackend::new(&config.debug_config, reply_surb_database_path).await; + ReplyStorageBackend::new(&config.debug_config, reply_surb_database_path) + .await + .map_err(|err| Error::StorageError { + source: Box::new(err), + })?; - create_new_client_with_custom_storage(Some(config), paths, reply_storage_backend).unwrap() + create_new_client_with_custom_storage(Some(config), paths, reply_storage_backend) } /// Client keys are generated at client creation if none were found. The gateway shared