hashtree_network/
transport.rs1use async_trait::async_trait;
7use std::sync::Arc;
8use thiserror::Error;
9
10use crate::types::{IceCandidate, SignalingMessage};
11
12#[derive(Debug, Error, Clone)]
14pub enum TransportError {
15 #[error("Connection failed: {0}")]
16 ConnectionFailed(String),
17 #[error("Send failed: {0}")]
18 SendFailed(String),
19 #[error("Receive failed: {0}")]
20 ReceiveFailed(String),
21 #[error("Timeout")]
22 Timeout,
23 #[error("Disconnected")]
24 Disconnected,
25 #[error("Not connected")]
26 NotConnected,
27}
28
29#[async_trait]
34pub trait SignalingTransport: Send + Sync {
35 async fn connect(&self, relays: &[String]) -> Result<(), TransportError>;
37
38 async fn disconnect(&self);
40
41 async fn publish(&self, msg: SignalingMessage) -> Result<(), TransportError>;
43
44 async fn recv(&self) -> Option<SignalingMessage>;
46
47 fn try_recv(&self) -> Option<SignalingMessage>;
49
50 fn peer_id(&self) -> &str;
52}
53
54#[async_trait]
59pub trait PeerLink: Send + Sync {
60 async fn send(&self, data: Vec<u8>) -> Result<(), TransportError>;
62
63 async fn recv(&self) -> Option<Vec<u8>>;
65
66 fn try_recv(&self) -> Option<Vec<u8>> {
69 None
70 }
71
72 fn is_open(&self) -> bool;
74
75 async fn close(&self);
77}
78
79#[async_trait]
84pub trait PeerLinkFactory: Send + Sync {
85 async fn create_offer(
88 &self,
89 target_peer_id: &str,
90 ) -> Result<(Arc<dyn PeerLink>, String), TransportError>;
91
92 async fn accept_offer(
95 &self,
96 from_peer_id: &str,
97 offer_sdp: &str,
98 ) -> Result<(Arc<dyn PeerLink>, String), TransportError>;
99
100 async fn handle_answer(
102 &self,
103 target_peer_id: &str,
104 answer_sdp: &str,
105 ) -> Result<Arc<dyn PeerLink>, TransportError>;
106
107 async fn handle_candidate(
109 &self,
110 _peer_id: &str,
111 _candidate: IceCandidate,
112 ) -> Result<(), TransportError> {
113 Ok(())
114 }
115
116 async fn handle_candidates(
118 &self,
119 peer_id: &str,
120 candidates: Vec<IceCandidate>,
121 ) -> Result<(), TransportError> {
122 for candidate in candidates {
123 self.handle_candidate(peer_id, candidate).await?;
124 }
125 Ok(())
126 }
127
128 async fn remove_peer(&self, _peer_id: &str) -> Result<(), TransportError> {
130 Ok(())
131 }
132}
133
134#[async_trait]
137impl<T: SignalingTransport + ?Sized> SignalingTransport for Arc<T> {
138 async fn connect(&self, relays: &[String]) -> Result<(), TransportError> {
139 (**self).connect(relays).await
140 }
141
142 async fn disconnect(&self) {
143 (**self).disconnect().await
144 }
145
146 async fn publish(&self, msg: SignalingMessage) -> Result<(), TransportError> {
147 (**self).publish(msg).await
148 }
149
150 async fn recv(&self) -> Option<SignalingMessage> {
151 (**self).recv().await
152 }
153
154 fn try_recv(&self) -> Option<SignalingMessage> {
155 (**self).try_recv()
156 }
157
158 fn peer_id(&self) -> &str {
159 (**self).peer_id()
160 }
161}
162
163#[async_trait]
164impl<T: PeerLink + ?Sized> PeerLink for Arc<T> {
165 async fn send(&self, data: Vec<u8>) -> Result<(), TransportError> {
166 (**self).send(data).await
167 }
168
169 async fn recv(&self) -> Option<Vec<u8>> {
170 (**self).recv().await
171 }
172
173 fn try_recv(&self) -> Option<Vec<u8>> {
174 (**self).try_recv()
175 }
176
177 fn is_open(&self) -> bool {
178 (**self).is_open()
179 }
180
181 async fn close(&self) {
182 (**self).close().await
183 }
184}