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 fn pubkey(&self) -> &str;
55}
56
57pub use SignalingTransport as RelayTransport;
58
59#[async_trait]
64pub trait PeerLink: Send + Sync {
65 async fn send(&self, data: Vec<u8>) -> Result<(), TransportError>;
67
68 async fn recv(&self) -> Option<Vec<u8>>;
70
71 fn try_recv(&self) -> Option<Vec<u8>> {
74 None
75 }
76
77 fn is_open(&self) -> bool;
79
80 async fn close(&self);
82}
83
84pub use PeerLink as DataChannel;
85
86#[async_trait]
91pub trait PeerLinkFactory: Send + Sync {
92 async fn create_offer(
95 &self,
96 target_peer_id: &str,
97 ) -> Result<(Arc<dyn PeerLink>, String), TransportError>;
98
99 async fn accept_offer(
102 &self,
103 from_peer_id: &str,
104 offer_sdp: &str,
105 ) -> Result<(Arc<dyn PeerLink>, String), TransportError>;
106
107 async fn handle_answer(
109 &self,
110 target_peer_id: &str,
111 answer_sdp: &str,
112 ) -> Result<Arc<dyn PeerLink>, TransportError>;
113
114 async fn handle_candidate(
116 &self,
117 _peer_id: &str,
118 _candidate: IceCandidate,
119 ) -> Result<(), TransportError> {
120 Ok(())
121 }
122
123 async fn handle_candidates(
125 &self,
126 peer_id: &str,
127 candidates: Vec<IceCandidate>,
128 ) -> Result<(), TransportError> {
129 for candidate in candidates {
130 self.handle_candidate(peer_id, candidate).await?;
131 }
132 Ok(())
133 }
134
135 async fn remove_peer(&self, _peer_id: &str) -> Result<(), TransportError> {
137 Ok(())
138 }
139}
140
141pub use PeerLinkFactory as PeerConnectionFactory;
142
143#[derive(Debug, Clone)]
145pub struct MeshRouterConfig {
146 pub peer_id: String,
148 pub max_peers: usize,
150 pub hello_interval_ms: u64,
152 pub roots: Vec<String>,
154 pub debug: bool,
156}
157
158impl Default for MeshRouterConfig {
159 fn default() -> Self {
160 Self {
161 peer_id: String::new(),
162 max_peers: 10,
163 hello_interval_ms: 30000,
164 roots: Vec::new(),
165 debug: false,
166 }
167 }
168}
169
170pub type SignalingConfig = MeshRouterConfig;
171
172#[async_trait]
175impl<T: SignalingTransport + ?Sized> SignalingTransport for Arc<T> {
176 async fn connect(&self, relays: &[String]) -> Result<(), TransportError> {
177 (**self).connect(relays).await
178 }
179
180 async fn disconnect(&self) {
181 (**self).disconnect().await
182 }
183
184 async fn publish(&self, msg: SignalingMessage) -> Result<(), TransportError> {
185 (**self).publish(msg).await
186 }
187
188 async fn recv(&self) -> Option<SignalingMessage> {
189 (**self).recv().await
190 }
191
192 fn try_recv(&self) -> Option<SignalingMessage> {
193 (**self).try_recv()
194 }
195
196 fn peer_id(&self) -> &str {
197 (**self).peer_id()
198 }
199
200 fn pubkey(&self) -> &str {
201 (**self).pubkey()
202 }
203}
204
205#[async_trait]
206impl<T: PeerLink + ?Sized> PeerLink for Arc<T> {
207 async fn send(&self, data: Vec<u8>) -> Result<(), TransportError> {
208 (**self).send(data).await
209 }
210
211 async fn recv(&self) -> Option<Vec<u8>> {
212 (**self).recv().await
213 }
214
215 fn try_recv(&self) -> Option<Vec<u8>> {
216 (**self).try_recv()
217 }
218
219 fn is_open(&self) -> bool {
220 (**self).is_open()
221 }
222
223 async fn close(&self) {
224 (**self).close().await
225 }
226}