diff --git a/src/provider/mod.rs b/src/provider/mod.rs index bdbd337b29..3b588fcb6d 100644 --- a/src/provider/mod.rs +++ b/src/provider/mod.rs @@ -5,6 +5,7 @@ use curve25519_dalek::montgomery::MontgomeryPoint; use curve25519_dalek::scalar::Scalar; use futures::io::Error; use futures::lock::Mutex as FMutex; +use nym_client::clients::directory::presence::MixProviderClient; use sfw_provider_requests::AuthToken; use sphinx::route::DestinationAddressBytes; use std::collections::HashMap; @@ -90,6 +91,14 @@ impl ClientLedger { self.0.insert(auth_token, client_address) } + fn current_clients(&self) -> Vec { + self.0 + .iter() + .map(|(_, &v)| Config::public_key_string(MontgomeryPoint(v))) + .map(|pub_key| MixProviderClient { pub_key }) + .collect() + } + #[allow(dead_code)] fn load(_file: PathBuf) -> Self { unimplemented!() @@ -283,6 +292,7 @@ impl ServiceProvider { self.directory_server, self.mix_network_address.clone(), self.public_key, + thread_shareable_ledger.clone(), ); let presence_future = rt.spawn(presence_notifier.run()); @@ -294,7 +304,7 @@ impl ServiceProvider { let client_future = rt.spawn(ServiceProvider::start_client_listening( self.client_network_address, self.store_dir.clone(), - thread_shareable_ledger.clone(), + thread_shareable_ledger, self.secret_key, )); // Spawn the root task diff --git a/src/provider/presence.rs b/src/provider/presence.rs index 9b08de810e..d1790b685a 100644 --- a/src/provider/presence.rs +++ b/src/provider/presence.rs @@ -1,17 +1,19 @@ -use crate::provider; -use nym_client::clients::directory; -use nym_client::clients::directory::DirectoryClient; -use std::time::Duration; - -use crate::provider::Config; +use crate::provider::{ClientLedger, Config}; use curve25519_dalek::montgomery::MontgomeryPoint; +use futures::lock::Mutex as FMutex; +use nym_client::clients::directory; use nym_client::clients::directory::presence::MixProviderPresence; use nym_client::clients::directory::requests::presence_providers_post::PresenceMixProviderPoster; +use nym_client::clients::directory::DirectoryClient; use std::net::SocketAddr; +use std::sync::Arc; +use std::time::Duration; pub struct Notifier { pub net_client: directory::Client, - presence: MixProviderPresence, + client_ledger: Arc>, + host: String, + pub_key: String, } impl Notifier { @@ -19,32 +21,42 @@ impl Notifier { directory_server_address: String, host: SocketAddr, pub_key: MontgomeryPoint, + client_ledger: Arc>, ) -> Notifier { let directory_config = directory::Config { base_url: directory_server_address, }; let net_client = directory::Client::new(directory_config); - let presence = MixProviderPresence { - host: host.to_string(), - pub_key: Config::public_key_string(pub_key), - registered_clients: vec![], - }; + Notifier { net_client, - presence, + host: host.to_string(), + pub_key: Config::public_key_string(pub_key), + client_ledger, } } - pub fn notify(&self) { + async fn make_presence(&self) -> MixProviderPresence { + let unlocked_ledger = self.client_ledger.lock().await; + + MixProviderPresence { + host: self.host.clone(), + pub_key: self.pub_key.clone(), + registered_clients: unlocked_ledger.current_clients(), + } + } + + pub fn notify(&self, presence: MixProviderPresence) { self.net_client .presence_providers_post - .post(&self.presence) + .post(&presence) .unwrap(); } pub async fn run(self) { loop { - self.notify(); + let presence = self.make_presence().await; + self.notify(presence); let delay_duration = Duration::from_secs(5); tokio::time::delay_for(delay_duration).await; }