hashtree_network/
blob_resolver.rs1use std::future::pending;
8use std::sync::Arc;
9use std::time::Duration;
10
11use async_trait::async_trait;
12use hashtree_core::Store;
13
14use crate::{
15 MeshRouter, MeshRoutingConfig, MeshStoreCore, PeerLink, PeerLinkFactory, PoolSettings,
16 SignalingMessage, SignalingTransport, TransportError,
17};
18
19pub type BlobResolver<S> = MeshStoreCore<S, RouteOnlySignaling, RouteOnlyPeerLinks>;
20
21pub fn blob_resolver<S>(
22 local_store: Arc<S>,
23 peer_id: impl Into<String>,
24 request_timeout: Duration,
25 routing: MeshRoutingConfig,
26) -> BlobResolver<S>
27where
28 S: Store + Send + Sync + 'static,
29{
30 let peer_id = peer_id.into();
31 let signaling = Arc::new(RouteOnlySignaling {
32 peer_id: peer_id.clone(),
33 });
34 let router = Arc::new(MeshRouter::new(
35 peer_id,
36 signaling,
37 Arc::new(RouteOnlyPeerLinks),
38 PoolSettings::default(),
39 false,
40 ));
41 MeshStoreCore::new_with_routing(local_store, router, request_timeout, false, routing)
42}
43
44pub struct RouteOnlySignaling {
45 peer_id: String,
46}
47
48#[async_trait]
49impl SignalingTransport for RouteOnlySignaling {
50 async fn connect(&self, _relays: &[String]) -> Result<(), TransportError> {
51 Ok(())
52 }
53
54 async fn disconnect(&self) {}
55
56 async fn publish(&self, _msg: SignalingMessage) -> Result<(), TransportError> {
57 Err(TransportError::NotConnected)
58 }
59
60 async fn recv(&self) -> Option<SignalingMessage> {
61 pending().await
62 }
63
64 fn try_recv(&self) -> Option<SignalingMessage> {
65 None
66 }
67
68 fn peer_id(&self) -> &str {
69 &self.peer_id
70 }
71}
72
73pub struct RouteOnlyPeerLinks;
74
75#[async_trait]
76impl PeerLinkFactory for RouteOnlyPeerLinks {
77 async fn create_offer(
78 &self,
79 _target_peer_id: &str,
80 ) -> Result<(Arc<dyn PeerLink>, String), TransportError> {
81 Err(TransportError::NotConnected)
82 }
83
84 async fn accept_offer(
85 &self,
86 _from_peer_id: &str,
87 _offer_sdp: &str,
88 ) -> Result<(Arc<dyn PeerLink>, String), TransportError> {
89 Err(TransportError::NotConnected)
90 }
91
92 async fn handle_answer(
93 &self,
94 _target_peer_id: &str,
95 _answer_sdp: &str,
96 ) -> Result<Arc<dyn PeerLink>, TransportError> {
97 Err(TransportError::NotConnected)
98 }
99}