use std::net::{SocketAddr, ToSocketAddrs};
use eyre::Result;
use tendermint::{node, public_key::PublicKey};
pub struct BindInfo<A>
where
A: ToSocketAddrs,
{
pub advertise_addrs: A,
pub bind_addrs: A,
pub public_key: PublicKey,
}
pub struct ConnectInfo<A>
where
A: ToSocketAddrs,
{
pub addrs: A,
pub id: node::Id,
}
#[derive(Clone, Copy, Hash, Eq, PartialEq)]
pub enum StreamId {
Pex,
}
pub enum Direction<Conn> {
Incoming(Conn),
Outgoing(Conn),
}
pub trait StreamSend {
fn send<B: AsRef<[u8]>>(msg: B) -> Result<()>;
}
pub trait Connection: Send {
type Error;
type StreamRead: Iterator<Item = Result<Vec<u8>>> + Send;
type StreamSend: StreamSend;
fn advertised_addrs(&self) -> Vec<SocketAddr>;
fn close(&self) -> Result<()>;
fn local_addr(&self) -> SocketAddr;
fn open_bidirectional(
&self,
stream_id: StreamId,
) -> Result<(Self::StreamRead, Self::StreamSend), Self::Error>;
fn public_key(&self) -> PublicKey;
fn remote_addr(&self) -> SocketAddr;
}
pub trait Endpoint<A>: Send
where
A: ToSocketAddrs,
{
type Connection;
fn connect(&self, info: ConnectInfo<A>) -> Result<Self::Connection>;
fn listen_addrs(&self) -> Vec<SocketAddr>;
}
pub trait Transport<A>
where
A: ToSocketAddrs,
{
type Connection: Connection;
type Endpoint: Endpoint<A, Connection = <Self as Transport<A>>::Connection> + Drop;
type Incoming: Iterator<Item = Result<<Self as Transport<A>>::Connection>> + Send;
fn bind(self, bind_info: BindInfo<A>) -> Result<(Self::Endpoint, Self::Incoming)>;
}