#![warn(missing_docs)]
use std::sync::Arc;
use std::sync::RwLock;
use crate::dht::PeerRing;
use crate::dht::VNodeStorage;
use crate::measure::MeasureImpl;
use crate::session::SessionSk;
use crate::swarm::callback::SharedSwarmCallback;
use crate::swarm::callback::SwarmCallback;
use crate::swarm::transport::SwarmTransport;
use crate::swarm::Swarm;
struct DefaultCallback;
impl SwarmCallback for DefaultCallback {}
pub struct SwarmBuilder {
network_id: u32,
ice_servers: String,
external_address: Option<String>,
dht_succ_max: u8,
dht_storage: VNodeStorage,
session_sk: SessionSk,
session_ttl: Option<usize>,
measure: Option<MeasureImpl>,
callback: Option<SharedSwarmCallback>,
}
impl SwarmBuilder {
pub fn new(
network_id: u32,
ice_servers: &str,
dht_storage: VNodeStorage,
session_sk: SessionSk,
) -> Self {
SwarmBuilder {
network_id,
ice_servers: ice_servers.to_string(),
external_address: None,
dht_succ_max: 3,
dht_storage,
session_sk,
session_ttl: None,
measure: None,
callback: None,
}
}
pub fn dht_succ_max(mut self, succ_max: u8) -> Self {
self.dht_succ_max = succ_max;
self
}
pub fn external_address(mut self, external_address: String) -> Self {
self.external_address = Some(external_address);
self
}
pub fn session_ttl(mut self, ttl: usize) -> Self {
self.session_ttl = Some(ttl);
self
}
pub fn measure(mut self, implement: MeasureImpl) -> Self {
self.measure = Some(implement);
self
}
pub fn callback(mut self, callback: SharedSwarmCallback) -> Self {
self.callback = Some(callback);
self
}
pub fn build(self) -> Swarm {
let dht_did = self.session_sk.account_did();
let dht = Arc::new(PeerRing::new_with_storage(
dht_did,
self.dht_succ_max,
self.dht_storage,
));
let callback = RwLock::new(
self.callback
.unwrap_or_else(|| Arc::new(DefaultCallback {})),
);
let transport = Arc::new(SwarmTransport::new(
self.network_id,
&self.ice_servers,
self.external_address,
self.session_sk,
dht.clone(),
self.measure,
));
Swarm {
dht,
transport,
callback,
}
}
}