#![warn(missing_docs)]
use std::sync::Arc;
use rings_transport::core::callback::Callback;
use rings_transport::Transport;
use crate::channels::Channel;
use crate::dht::PeerRing;
use crate::message::CallbackFn;
use crate::message::MessageHandler;
use crate::message::ValidatorFn;
use crate::session::SessionSk;
use crate::storage::PersistenceStorage;
use crate::swarm::callback::SwarmCallback;
use crate::swarm::MeasureImpl;
use crate::swarm::Swarm;
use crate::types::channel::Channel as ChannelTrait;
pub struct SwarmBuilder {
ice_servers: String,
external_address: Option<String>,
dht_succ_max: u8,
dht_storage: PersistenceStorage,
session_sk: SessionSk,
session_ttl: Option<usize>,
measure: Option<MeasureImpl>,
message_callback: Option<CallbackFn>,
message_validator: Option<ValidatorFn>,
}
impl SwarmBuilder {
pub fn new(ice_servers: &str, dht_storage: PersistenceStorage, session_sk: SessionSk) -> Self {
SwarmBuilder {
ice_servers: ice_servers.to_string(),
external_address: None,
dht_succ_max: 3,
dht_storage,
session_sk,
session_ttl: None,
measure: None,
message_callback: None,
message_validator: 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 message_callback(mut self, callback: CallbackFn) -> Self {
self.message_callback = Some(callback);
self
}
pub fn message_validator(mut self, validator: ValidatorFn) -> Self {
self.message_validator = Some(validator);
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 message_handler =
MessageHandler::new(dht.clone(), self.message_callback, self.message_validator);
let transport_event_channel = Channel::new();
let transport = Transport::new(&self.ice_servers, self.external_address);
let callback = Arc::new(SwarmCallback::new(transport_event_channel.sender()).boxed());
Swarm {
transport_event_channel,
dht,
measure: self.measure,
session_sk: self.session_sk,
message_handler,
transport,
callback,
}
}
}