Skip to main content

palladium_transport/
traits.rs

1use crate::errors::TransportError;
2use crate::mailbox::MailboxSender;
3use palladium_actor::{ActorPath, AddrHash, EngineId, Envelope, MessagePayload};
4use std::future::Future;
5use std::pin::Pin;
6
7pub type TransportFuture<'a> =
8    Pin<Box<dyn Future<Output = Result<(), TransportError>> + Send + 'a>>;
9
10/// Abstraction over a message delivery backend.
11///
12/// Implementations are runtime-agnostic and non-blocking where possible.
13/// `send` is async to support network backends; in-process implementations
14/// resolve immediately.
15pub trait Transport: Send + Sync + 'static {
16    /// Synchronous non-blocking send. Returns `MailboxFull` if the
17    /// transport's outbound buffer is full.
18    fn try_send(&self, envelope: Envelope, payload: MessagePayload) -> Result<(), TransportError>;
19
20    fn send<'a>(&'a self, envelope: Envelope, payload: MessagePayload) -> TransportFuture<'a> {
21        Box::pin(async move { self.try_send(envelope, payload) })
22    }
23    fn register(&self, addr: AddrHash, mailbox: MailboxSender) -> Result<(), TransportError>;
24    fn unregister(&self, addr: AddrHash) -> Result<(), TransportError>;
25    fn advertise_path(&self, _addr: AddrHash, _path: &ActorPath) -> Result<(), TransportError> {
26        Ok(())
27    }
28    fn withdraw_path(&self, _addr: AddrHash, _path: &ActorPath) -> Result<(), TransportError> {
29        Ok(())
30    }
31    fn declare_remote_path(
32        &self,
33        _owner: EngineId,
34        _path: &ActorPath,
35    ) -> Result<(), TransportError> {
36        Ok(())
37    }
38    fn undeclare_remote_path(&self, _path: &ActorPath) -> Result<(), TransportError> {
39        Ok(())
40    }
41    fn can_route(&self, destination: AddrHash) -> bool;
42}