Skip to main content

hashtree_network/
blob_resolver.rs

1//! Route-only composition of the shared mesh resolver.
2//!
3//! This keeps peer discovery and reliable transport outside Hashtree routing:
4//! callers register labeled [`BlobRoute`] adapters, while `MeshStoreCore` owns
5//! verification, HTL, selection, deadlines, caching, and result semantics.
6
7use 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}