use std::net::SocketAddr;
use std::sync::Arc;
use anyhow::{Result, bail};
use async_trait::async_trait;
use bytes::Bytes;
#[derive(Debug, Clone)]
pub enum RelayDisconnectReason {
Closed,
ReadError(String),
Unknown,
}
impl std::fmt::Display for RelayDisconnectReason {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Closed => write!(f, "channel closed"),
Self::ReadError(e) => write!(f, "read error: {e}"),
Self::Unknown => write!(f, "unknown"),
}
}
}
#[derive(Debug, Clone)]
pub enum RelayTransportEvent {
Connected,
PacketReceived(Bytes),
Disconnected(RelayDisconnectReason),
}
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
pub trait RelayTransport: crate::sync_marker::MaybeSendSync {
async fn send(&self, data: Bytes) -> Result<()>;
async fn disconnect(&self);
async fn reconnect(
&self,
endpoint: SocketAddr,
) -> Result<(
Arc<dyn RelayTransport>,
async_channel::Receiver<RelayTransportEvent>,
)> {
bail!("relay transport does not support reconnecting to {endpoint}")
}
}
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
pub trait RelayTransportFactory: crate::sync_marker::MaybeSendSync {
async fn connect(
&self,
) -> Result<(
Arc<dyn RelayTransport>,
async_channel::Receiver<RelayTransportEvent>,
)>;
}