use async_trait::async_trait;
use bytes::Bytes;
use std::net::SocketAddr;
use crate::error::Result;
#[derive(Debug, Clone)]
pub enum TransportEvent {
Connected,
Disconnected { reason: Option<String> },
Data(Bytes),
Error(String),
}
#[async_trait]
pub trait TransportSender: Send + Sync {
async fn send(&self, data: Bytes) -> Result<()>;
fn try_send(&self, data: Bytes) -> Result<()>;
fn is_connected(&self) -> bool;
async fn close(&self) -> Result<()>;
}
#[async_trait]
pub trait TransportReceiver: Send {
async fn recv(&mut self) -> Option<TransportEvent>;
}
#[async_trait]
pub trait Transport: Send + Sync {
type Sender: TransportSender;
type Receiver: TransportReceiver;
async fn connect(addr: &str) -> Result<(Self::Sender, Self::Receiver)>
where
Self: Sized;
fn local_addr(&self) -> Option<SocketAddr>;
fn remote_addr(&self) -> Option<SocketAddr>;
}
#[async_trait]
pub trait TransportServer: Send + Sync {
type Sender: TransportSender;
type Receiver: TransportReceiver;
async fn accept(&mut self) -> Result<(Self::Sender, Self::Receiver, SocketAddr)>;
fn local_addr(&self) -> Result<SocketAddr>;
async fn close(&self) -> Result<()>;
}