use crate::{command::ConnectionInfo, error::TransportError, packet::Packet, SessionId};
use async_trait::async_trait;
#[async_trait]
pub trait Connection: Send + Sync + std::any::Any {
async fn send(&mut self, packet: Packet) -> Result<(), TransportError>;
async fn close(&mut self) -> Result<(), TransportError>;
fn session_id(&self) -> SessionId;
fn set_session_id(&mut self, session_id: SessionId);
fn connection_info(&self) -> ConnectionInfo;
fn is_connected(&self) -> bool;
async fn flush(&mut self) -> Result<(), TransportError>;
fn event_stream(
&self,
) -> Option<tokio::sync::broadcast::Receiver<crate::event::TransportEvent>>;
fn set_frame_policy(&self, _policy: crate::packet::FramePolicy) {}
}
#[async_trait]
pub trait Server: Send + Sync {
async fn accept(&mut self) -> Result<Box<dyn Connection>, TransportError>;
fn local_addr(&self) -> Result<std::net::SocketAddr, TransportError>;
async fn shutdown(&mut self) -> Result<(), TransportError>;
}
#[async_trait]
pub trait ConnectionFactory: Send + Sync {
async fn connect(&self) -> Result<Box<dyn Connection>, TransportError>;
}