diff --git a/common/client-core/gateways-storage/src/backend/fs_backend/mod.rs b/common/client-core/gateways-storage/src/backend/fs_backend/mod.rs index c83a5bbd68c..db89a3b83fa 100644 --- a/common/client-core/gateways-storage/src/backend/fs_backend/mod.rs +++ b/common/client-core/gateways-storage/src/backend/fs_backend/mod.rs @@ -15,6 +15,7 @@ pub mod error; mod manager; mod models; +#[derive(Clone)] pub struct OnDiskGatewaysDetails { manager: StorageManager, } diff --git a/common/client-core/gateways-storage/src/backend/mem_backend.rs b/common/client-core/gateways-storage/src/backend/mem_backend.rs index 70560995e9e..48235aaf1ff 100644 --- a/common/client-core/gateways-storage/src/backend/mem_backend.rs +++ b/common/client-core/gateways-storage/src/backend/mem_backend.rs @@ -20,12 +20,12 @@ pub enum InMemStorageError { MalformedGateway(#[from] BadGateway), } -#[derive(Debug, Default)] +#[derive(Clone, Debug, Default)] pub struct InMemGatewaysDetails { inner: Arc>, } -#[derive(Debug, Default)] +#[derive(Clone, Debug, Default)] struct InMemStorageInner { active_gateway: Option, gateways: HashMap, diff --git a/common/client-core/src/client/base_client/storage/mod.rs b/common/client-core/src/client/base_client/storage/mod.rs index cccb3fa9d72..5129a5fc41d 100644 --- a/common/client-core/src/client/base_client/storage/mod.rs +++ b/common/client-core/src/client/base_client/storage/mod.rs @@ -63,7 +63,7 @@ pub trait MixnetClientStorage { fn gateway_details_store(&self) -> &Self::GatewaysDetailsStore; } -#[derive(Default)] +#[derive(Clone, Default)] pub struct Ephemeral { key_store: InMemEphemeralKeys, reply_store: reply_storage::Empty, @@ -114,6 +114,7 @@ impl MixnetClientStorage for Ephemeral { } } +#[derive(Clone)] #[cfg(all( not(target_arch = "wasm32"), feature = "fs-surb-storage", diff --git a/common/client-core/src/client/key_manager/persistence.rs b/common/client-core/src/client/key_manager/persistence.rs index 2bff78ee362..f781cd3da6e 100644 --- a/common/client-core/src/client/key_manager/persistence.rs +++ b/common/client-core/src/client/key_manager/persistence.rs @@ -4,6 +4,7 @@ use crate::client::key_manager::ClientKeys; use async_trait::async_trait; use std::error::Error; +use std::sync::Arc; use tokio::sync::Mutex; #[cfg(not(target_arch = "wasm32"))] @@ -64,6 +65,7 @@ pub enum OnDiskKeysError { }, } +#[derive(Clone)] #[cfg(not(target_arch = "wasm32"))] pub struct OnDiskKeys { paths: ClientKeysPaths, @@ -193,9 +195,9 @@ impl KeyStore for OnDiskKeys { } } -#[derive(Default)] +#[derive(Clone, Default)] pub struct InMemEphemeralKeys { - keys: Mutex>, + keys: Arc>>, } #[derive(Debug, thiserror::Error)] diff --git a/common/client-core/surb-storage/src/backend/fs_backend/mod.rs b/common/client-core/surb-storage/src/backend/fs_backend/mod.rs index 6f68c592013..4914f6621f3 100644 --- a/common/client-core/surb-storage/src/backend/fs_backend/mod.rs +++ b/common/client-core/surb-storage/src/backend/fs_backend/mod.rs @@ -22,7 +22,7 @@ mod error; mod manager; mod models; -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct Backend { temporary_old_path: Option, database_path: PathBuf, diff --git a/common/client-core/surb-storage/src/backend/mod.rs b/common/client-core/surb-storage/src/backend/mod.rs index e195051e4e8..8bef5a9aaf5 100644 --- a/common/client-core/surb-storage/src/backend/mod.rs +++ b/common/client-core/surb-storage/src/backend/mod.rs @@ -19,7 +19,7 @@ pub mod fs_backend; #[error("no information provided")] pub struct UndefinedError; -#[derive(Debug)] +#[derive(Clone, Debug)] pub struct Empty { // we need to keep 'basic' metadata here to "load" the CombinedReplyStorage pub min_surb_threshold: usize, diff --git a/common/credential-storage/src/storage.rs b/common/credential-storage/src/storage.rs index 4c0602ea855..bc2a6ac7d5f 100644 --- a/common/credential-storage/src/storage.rs +++ b/common/credential-storage/src/storage.rs @@ -19,7 +19,7 @@ use std::error::Error; // `SELECT total_tickets, used_tickets FROM ecash_ticketbook WHERE expiration_date >= ?`, today_date // then for each calculate the diff total_tickets - used_tickets and multiply the result by the size of the ticket #[async_trait] -pub trait Storage: Send + Sync { +pub trait Storage: Clone + Send + Sync { type StorageError: Error; async fn close(&self); diff --git a/sdk/rust/nym-sdk/examples/manually_handle_storage.rs b/sdk/rust/nym-sdk/examples/manually_handle_storage.rs index a7fb1827436..05ce8ebf018 100644 --- a/sdk/rust/nym-sdk/examples/manually_handle_storage.rs +++ b/sdk/rust/nym-sdk/examples/manually_handle_storage.rs @@ -40,6 +40,7 @@ async fn main() { client.disconnect().await; } +#[derive(Clone)] #[allow(unused)] struct MockClientStorage { pub key_store: MockKeyStore, @@ -96,6 +97,7 @@ impl MixnetClientStorage for MockClientStorage { } } +#[derive(Clone)] struct MockKeyStore; #[async_trait] @@ -115,6 +117,7 @@ impl KeyStore for MockKeyStore { } } +#[derive(Clone)] struct MockGatewayDetailsStore; #[async_trait] diff --git a/sdk/rust/nym-sdk/src/bandwidth/client.rs b/sdk/rust/nym-sdk/src/bandwidth/client.rs index 68a4edb3478..e1ca5881856 100644 --- a/sdk/rust/nym-sdk/src/bandwidth/client.rs +++ b/sdk/rust/nym-sdk/src/bandwidth/client.rs @@ -17,22 +17,22 @@ use zeroize::Zeroizing; /// The way to create this client is by calling /// [`crate::mixnet::DisconnectedMixnetClient::create_bandwidth_client`] on the associated mixnet /// client. -pub struct BandwidthAcquireClient<'a, St: Storage> { +pub struct BandwidthAcquireClient { client: DirectSigningHttpRpcNyxdClient, - storage: &'a St, + storage: St, client_id: Zeroizing>, ticketbook_type: TicketType, } -impl<'a, St> BandwidthAcquireClient<'a, St> +impl BandwidthAcquireClient where - St: Storage, + St: Storage + Clone, ::StorageError: Send + Sync + 'static, { pub(crate) fn new( network_details: NymNetworkDetails, mnemonic: String, - storage: &'a St, + storage: St, client_id: Vec, ticketbook_type: TicketType, ) -> Result { @@ -55,7 +55,7 @@ where pub async fn acquire(&self) -> Result<()> { issue_credential( &self.client, - self.storage, + &self.storage, self.client_id.deref(), self.ticketbook_type, ) diff --git a/sdk/rust/nym-sdk/src/mixnet/client.rs b/sdk/rust/nym-sdk/src/mixnet/client.rs index 4c10ec3d768..74f1536ed77 100644 --- a/sdk/rust/nym-sdk/src/mixnet/client.rs +++ b/sdk/rust/nym-sdk/src/mixnet/client.rs @@ -108,7 +108,7 @@ impl MixnetClientBuilder { impl MixnetClientBuilder where - S: MixnetClientStorage + 'static, + S: MixnetClientStorage + Clone + 'static, S::ReplyStore: Send + Sync, S::GatewaysDetailsStore: Sync, ::StorageError: Sync + Send, @@ -326,7 +326,7 @@ where /// client. pub struct DisconnectedMixnetClient where - S: MixnetClientStorage, + S: MixnetClientStorage + Clone, { /// Client configuration config: Config, @@ -371,7 +371,7 @@ where impl DisconnectedMixnetClient where - S: MixnetClientStorage + 'static, + S: MixnetClientStorage + Clone + 'static, S::ReplyStore: Send + Sync, S::GatewaysDetailsStore: Sync, ::StorageError: Sync + Send, @@ -622,7 +622,7 @@ where BandwidthAcquireClient::new( self.config.network_details.clone(), mnemonic, - self.storage.credential_store(), + self.storage.credential_store().clone(), client_id, ticketbook_type, )