1use crate::PeerId;
2use as_any::AsAny;
3use sfo_split::{RHalf, Splittable, WHalf};
4use std::any::Any;
5use std::sync::Arc;
6use tokio::io::{AsyncRead, AsyncWrite};
7
8pub trait CmdTunnelMeta: Send + Sync + 'static {}
9
10impl<T: Send + Sync + 'static> CmdTunnelMeta for T {}
11
12pub trait CmdTunnelRead<M: CmdTunnelMeta>:
13 Send + AsyncRead + 'static + Unpin + Any + AsAny
14{
15 fn get_local_peer_id(&self) -> PeerId;
16 fn get_remote_peer_id(&self) -> PeerId;
17 fn get_tunnel_meta(&self) -> Option<Arc<M>> {
18 None
19 }
20}
21
22pub trait CmdTunnelWrite<M: CmdTunnelMeta>:
23 AsyncWrite + Send + 'static + Unpin + Any + AsAny
24{
25 fn get_local_peer_id(&self) -> PeerId;
26 fn get_remote_peer_id(&self) -> PeerId;
27 fn get_tunnel_meta(&self) -> Option<Arc<M>> {
28 None
29 }
30}
31
32pub type CmdTunnel<R, W> = Splittable<R, W>;
33pub type CmdTunnelRHalf<R, W> = RHalf<R, W>;
34pub type CmdTunnelWHalf<R, W> = WHalf<R, W>;