mod error;
mod socket;
#[cfg(test)]
mod tests;
pub use crate::types::{
api::Receive_Type, Address, Id, Message, RatmanError as Error, Recipient, Result, TimePair,
};
pub use error::Error as ClientError;
use async_std::{
channel::{unbounded, Receiver},
task,
};
use self::socket::IpcSocket;
#[derive(Clone)]
pub struct RatmanIpc {
socket: IpcSocket,
addr: Address,
recv: Receiver<(Receive_Type, Message)>,
disc: Receiver<Address>,
}
impl RatmanIpc {
pub async fn default() -> Result<Self> {
Self::connect("127.0.0.1:9020", None, None).await
}
pub async fn default_with_addr(addr: Address, token: Id) -> Result<Self> {
Self::connect("127.0.0.1:9020", Some(addr), Some(token)).await
}
pub async fn connect(
socket_addr: &str,
addr: Option<Address>,
token: Option<Id>,
) -> Result<RatmanIpc> {
let socket = match (addr, token) {
(Some(registered), Some(token)) => {
IpcSocket::start_with_address(socket_addr, registered, token).await
}
_ => IpcSocket::start_registration(socket_addr).await,
}?;
let addr = socket.addr;
let (tx, recv) = unbounded();
let (dtx, disc) = unbounded();
task::spawn(socket::run_receive(socket.clone(), tx, dtx));
Ok(Self {
socket,
addr,
recv,
disc,
})
}
pub async fn anonymous(socket_addr: &str) -> Result<Self> {
let socket = IpcSocket::anonymous(socket_addr).await?;
let addr = socket.addr;
let (_, recv) = unbounded(); let (_, disc) = unbounded(); Ok(Self {
socket,
addr,
recv,
disc,
})
}
pub fn address(&self) -> Address {
self.addr
}
pub fn token(&self) -> Id {
self.socket.token
}
pub async fn send_to(&self, recipient: Address, payload: Vec<u8>) -> Result<()> {
self.socket.send_to(recipient, payload).await
}
pub async fn flood(&self, namespace: Address, payload: Vec<u8>, mirror: bool) -> Result<()> {
self.socket.flood(namespace, payload, mirror).await
}
pub async fn next(&self) -> Option<(Receive_Type, Message)> {
self.recv.recv().await.ok()
}
pub async fn discover(&self) -> Option<Address> {
self.disc.recv().await.ok()
}
pub async fn get_peers(&self) -> Result<Vec<Address>> {
self.socket.get_peers().await
}
}