Provider sending registered clients with presence
This commit is contained in:
+11
-1
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user