use core_types::{SessionId, TransportDomain};
use transport_core::{
Endpoint, ListenerHandle, StreamSpec, TransportAdapter, TransportCapabilities, TransportSession,
};
use crate::session::LocalSession;
#[derive(Default)]
pub struct LocalTransportAdapter {
next_session: u64,
listeners: Vec<Endpoint>,
}
impl LocalTransportAdapter {
pub fn new() -> Self {
Self::default()
}
}
impl TransportAdapter for LocalTransportAdapter {
fn domain(&self) -> TransportDomain {
TransportDomain::Local
}
fn capabilities(&self) -> TransportCapabilities {
TransportCapabilities {
supports_zero_copy: true,
supports_reliable: true,
supports_multicast: false,
max_payload: 8 * 1024 * 1024,
}
}
fn bind(&mut self, endpoint: Endpoint) -> Result<ListenerHandle, core_types::RtError> {
self.listeners.push(endpoint.clone());
Ok(ListenerHandle { endpoint })
}
fn connect(
&mut self,
_endpoint: Endpoint,
) -> Result<Box<dyn TransportSession>, core_types::RtError> {
self.next_session += 1;
Ok(Box::new(LocalSession::new(SessionId::new(
self.next_session,
))))
}
fn connect_with_spec(
&mut self,
endpoint: Endpoint,
_spec: StreamSpec,
) -> Result<Box<dyn TransportSession>, core_types::RtError> {
self.connect(endpoint)
}
}