use std::time::Duration;
use std::io;
use manager::{PeerManager, ManagedMessage};
use futures::sink::Sink;
use futures::stream::Stream;
use tokio_core::reactor::Handle;
const DEFAULT_PEER_CAPACITY: usize = 1000;
const DEFAULT_SINK_BUFFER_CAPACITY: usize = 100;
const DEFAULT_STREAM_BUFFER_CAPACITY: usize = 100;
const DEFAULT_HEARTBEAT_INTERVAL_MILLIS: u64 = 1 * 60 * 1000;
const DEFAULT_HEARTBEAT_TIMEOUT_MILLIS: u64 = 2 * 60 * 1000;
#[derive(Copy, Clone)]
pub struct PeerManagerBuilder {
peer: usize,
sink_buffer: usize,
stream_buffer: usize,
heartbeat_interval: Duration,
heartbeat_timeout: Duration
}
impl PeerManagerBuilder {
pub fn new() -> PeerManagerBuilder {
PeerManagerBuilder {
peer: DEFAULT_PEER_CAPACITY,
sink_buffer: DEFAULT_SINK_BUFFER_CAPACITY,
stream_buffer: DEFAULT_STREAM_BUFFER_CAPACITY,
heartbeat_interval: Duration::from_millis(DEFAULT_HEARTBEAT_INTERVAL_MILLIS),
heartbeat_timeout: Duration::from_millis(DEFAULT_HEARTBEAT_TIMEOUT_MILLIS)
}
}
pub fn with_peer_capacity(mut self, capacity: usize) -> PeerManagerBuilder {
self.peer = capacity;
self
}
pub fn with_sink_buffer_capacity(mut self, capacity: usize) -> PeerManagerBuilder {
self.sink_buffer = capacity;
self
}
pub fn with_stream_buffer_capacity(mut self, capacity: usize) -> PeerManagerBuilder {
self.stream_buffer = capacity;
self
}
pub fn with_heartbeat_interval(mut self, interval: Duration) -> PeerManagerBuilder {
self.heartbeat_interval = interval;
self
}
pub fn with_heartbeat_timeout(mut self, timeout: Duration) -> PeerManagerBuilder {
self.heartbeat_timeout = timeout;
self
}
pub fn peer_capacity(&self) -> usize {
self.peer
}
pub fn sink_buffer_capacity(&self) -> usize {
self.sink_buffer
}
pub fn stream_buffer_capacity(&self) -> usize {
self.stream_buffer
}
pub fn heartbeat_interval(&self) -> Duration {
self.heartbeat_interval
}
pub fn heartbeat_timeout(&self) -> Duration {
self.heartbeat_timeout
}
pub fn build<P>(self, handle: Handle) -> PeerManager<P>
where P: Sink<SinkError=io::Error> +
Stream<Error=io::Error>,
P::SinkItem: ManagedMessage,
P::Item: ManagedMessage {
PeerManager::from_builder(self, handle)
}
}