mod config;
use std::net::SocketAddr;
use std::time::Duration;
pub use config::{Config, DEFAULT_PORT};
pub use kinship_net::Config as CoreConfig;
pub use kinship_net::{
ConfigError, Error, Event, Events, Key, KeyError, KeyId, Keyring, Member, Metrics, Seed,
SeedError, State, Stats, TokioTransport, Transport, WIRE_VERSION, generate_key, mem,
};
use kinship_net::Memberlist;
#[derive(Debug)]
pub struct Cluster {
inner: Memberlist,
}
impl Cluster {
pub async fn start(cfg: Config) -> Result<Self, Error> {
let (settings, bind) = cfg.build()?;
let transport = TokioTransport::bind(bind).await?;
let inner = Memberlist::start(settings, transport).await?;
Ok(Self { inner })
}
pub async fn start_with<T: Transport>(cfg: Config, transport: T) -> Result<Self, Error> {
let (settings, _) = cfg.build()?;
let inner = Memberlist::start(settings, transport).await?;
Ok(Self { inner })
}
pub async fn join(&self, seeds: impl IntoIterator<Item = SocketAddr>) -> Result<usize, Error> {
self.inner.join(seeds).await
}
pub async fn join_seeds(&self, seeds: impl IntoIterator<Item = Seed>) -> Result<usize, Error> {
self.inner.join_seeds(seeds).await
}
pub fn members(&self) -> Vec<Member> {
self.inner.members()
}
pub fn member(&self, name: &str) -> Option<Member> {
self.inner.member(name)
}
pub fn local(&self) -> Member {
self.inner.local()
}
pub fn local_addr(&self) -> SocketAddr {
self.inner.local_addr()
}
pub fn events(&self) -> Events {
self.inner.events()
}
pub async fn set_meta(&self, meta: impl Into<Vec<u8>>) -> Result<(), Error> {
self.inner.set_meta(meta).await
}
pub fn stats(&self) -> Stats {
self.inner.stats()
}
pub fn keyring(&self) -> Keyring {
self.inner.keyring()
}
pub async fn leave(&self, timeout: Duration) -> Result<(), Error> {
self.inner.leave(timeout).await
}
pub async fn close(&self) {
self.inner.close().await;
}
pub fn abort(&self) {
self.inner.abort();
}
pub fn is_closed(&self) -> bool {
self.inner.is_closed()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn exposes_wire_version() {
assert_eq!(WIRE_VERSION, 1);
}
}