Provider sending registered clients with presence

This commit is contained in:
Jedrzej Stuczynski
2019-12-19 13:49:04 +00:00
parent a8eb5ec4c2
commit 76f503a664
2 changed files with 39 additions and 17 deletions
+11 -1
View File
@@ -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<MixProviderClient> {
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
+28 -16
View File
@@ -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<FMutex<ClientLedger>>,
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<FMutex<ClientLedger>>,
) -> 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;
}