Skip to main content

hashtree_network/
lib.rs

1//! Mesh transport primitives for HashTree.
2//!
3//! This crate provides the reusable router, signaling, peer-link, and store
4//! layers for hashtree mesh networking. The default production composition uses
5//! Nostr websockets for signaling and WebRTC for direct links, but the same
6//! abstractions support LAN buses, Bluetooth transports, and simulation.
7//!
8//! # Overview
9//!
10//! - **Storage Backend**: Any [`hashtree_core::Store`] implementation
11//! - **Peer Discovery**: Any [`SignalingTransport`] implementation
12//! - **Data Exchange**: Any [`PeerLink`] / [`PeerLinkFactory`] implementation
13//! - **Protocol**: Request/response with hash-based addressing
14//! - **Adaptive Selection**: Intelligent peer selection based on performance
15//!
16//! # Example
17//!
18//! ```rust,no_run
19//! use hashtree_core::MemoryStore;
20//! use hashtree_network::{MeshStore, MeshStoreConfig};
21//! use nostr_sdk::prelude::*;
22//! use std::sync::Arc;
23//!
24//! #[tokio::main]
25//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
26//!     let local_store = Arc::new(MemoryStore::new());
27//!     let config = MeshStoreConfig::default();
28//!
29//!     let mut store = MeshStore::new(local_store, config);
30//!
31//!     // Generate or load Nostr keys
32//!     let keys = Keys::generate();
33//!
34//!     // Start P2P network
35//!     store.start(keys).await?;
36//!
37//!     // Now store.get() will try local first, then fetch from peers
38//!
39//!     Ok(())
40//! }
41//! ```
42
43pub mod channel;
44pub mod generic_store;
45pub mod mock;
46pub mod nostr;
47pub mod peer;
48pub mod peer_selector;
49pub mod protocol;
50pub mod real_factory;
51pub mod signaling;
52pub mod store;
53pub mod transport;
54pub mod types;
55
56pub use channel::{ChannelError, LatencyChannel, MockChannel, PeerChannel};
57pub use generic_store::{
58    build_hedged_wave_plan, normalize_dispatch_config, run_hedged_waves, sync_selector_peers,
59    GenericStore, GenericStoreRoutingConfig, HedgedWaveAction, ProductionStore,
60    RequestDispatchConfig, ResponseBehaviorConfig, SimStore,
61};
62pub use mock::{
63    clear_channel_registry, MockConnectionFactory, MockDataChannel, MockLatencyMode, MockRelay,
64    MockRelayTransport, MockSignalingTransport,
65};
66pub use nostr::{
67    decode_signaling_event, encode_signaling_event, NostrRelayTransport, NostrSignalingTransport,
68};
69pub use peer::{ForwardRequestCallback, Peer, PeerError};
70pub use peer_selector::{
71    peer_principal, PeerMetadataSnapshot, PeerSelector, PeerStats, PersistedPeerMetadata,
72    SelectionStrategy, SelectorSummary, PEER_METADATA_SNAPSHOT_VERSION,
73};
74pub use protocol::{
75    bytes_to_hash, create_fragment_response, create_quote_request, create_quote_response_available,
76    create_quote_response_unavailable, create_request, create_request_with_quote, create_response,
77    encode_quote_request, encode_quote_response, encode_request, encode_response, hash_to_bytes,
78    hash_to_key, is_fragmented, parse_message, DataMessage, DataQuoteRequest, DataQuoteResponse,
79    DataRequest, DataResponse, FRAGMENT_SIZE, MSG_TYPE_QUOTE_REQUEST, MSG_TYPE_QUOTE_RESPONSE,
80    MSG_TYPE_REQUEST, MSG_TYPE_RESPONSE,
81};
82pub use real_factory::{RealPeerConnectionFactory, WebRtcPeerLinkFactory};
83pub use signaling::{MeshRouter, PeerEntry, PeerRouter, SignalingManager};
84pub use store::{MeshStore, MeshStoreError, WebRTCStore, WebRTCStoreError};
85pub use transport::{
86    DataChannel, MeshRouterConfig, PeerConnectionFactory, PeerLink, PeerLinkFactory,
87    RelayTransport, SignalingConfig, SignalingTransport, TransportError,
88};
89pub use types::{
90    classifier_channel, decrement_htl_with_policy, is_polite_peer, should_forward,
91    should_forward_htl, validate_mesh_frame, ClassifierRx, ClassifierTx, ClassifyRequest,
92    ForwardRequest, ForwardRx, ForwardTx, HtlMode, HtlPolicy, IceCandidate, MeshNostrFrame,
93    MeshNostrPayload, MeshStats, MeshStoreConfig, PeerHTLConfig, PeerId, PeerPool, PeerState,
94    PoolConfig, PoolSettings, SignalingMessage, TimedSeenSet, WebRTCStats, WebRTCStoreConfig,
95    BLOB_REQUEST_POLICY, DATA_CHANNEL_LABEL, DECREMENT_AT_MAX_PROB, DECREMENT_AT_MIN_PROB, MAX_HTL,
96    MESH_DEFAULT_HTL, MESH_EVENT_POLICY, MESH_MAX_HTL, MESH_PROTOCOL, MESH_PROTOCOL_VERSION,
97    MESH_SIGNALING_EVENT_KIND, NOSTR_KIND_HASHTREE,
98};