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 bluetooth;
44pub mod bluetooth_peer;
45pub mod cashu;
46pub mod channel;
47pub mod local_bus;
48pub mod manager;
49pub mod mesh_session;
50pub mod mesh_store_core;
51pub mod mock;
52pub mod multicast;
53pub mod nostr;
54pub mod peer;
55pub mod peer_selector;
56pub mod protocol;
57pub mod pubsub_strategy;
58pub mod real_factory;
59pub mod relay_bridge;
60pub mod root_events;
61pub mod runtime_control;
62pub mod runtime_peer;
63pub mod runtime_state;
64pub mod session;
65pub mod signaling;
66pub mod store;
67pub mod transport;
68pub mod types;
69pub mod wifi_aware;
70
71pub use bluetooth::{
72    install_mobile_bluetooth_bridge, BluetoothBackendState, BluetoothConfig, BluetoothMesh,
73    BluetoothPeerRegistrar, BluetoothRuntimeContext, MobileBluetoothBridge, PendingBluetoothLink,
74};
75pub use bluetooth_peer::{BluetoothFrame, BluetoothLink, BluetoothPeer};
76pub use cashu::{
77    cashu_mint_metadata_path, CashuMintMetadataRecord, CashuMintMetadataStore, CashuQuoteState,
78    CashuRoutingConfig, ExpectedSettlement, NegotiatedQuote, CASHU_MINT_METADATA_VERSION,
79};
80pub use channel::{ChannelError, LatencyChannel, MockChannel, PeerChannel};
81pub use local_bus::{LocalNostrBus, SharedLocalNostrBus};
82pub use manager::{
83    PeerClassifier, PeerEntry as RuntimePeerEntry, PeerStatus, WebRTCConfig, WebRTCManager,
84    WebRTCState,
85};
86pub use mesh_session::{
87    forward_mesh_frame_to_sessions, resolve_root_from_local_buses_with_source,
88    resolve_root_from_peer_sessions, MeshSession,
89};
90pub use mesh_store_core::{
91    build_hedged_wave_plan, normalize_dispatch_config, run_hedged_waves, sync_selector_peers,
92    DataPumpStats, HedgedWaveAction, MeshReadSource, MeshRoutingConfig, MeshStoreCore,
93    ProductionMeshStore, PubsubDeliveryMode, PubsubEvent, PubsubPublishStats,
94    RequestDispatchConfig, ResponseBehaviorConfig, SimMeshStore,
95};
96pub use mock::{
97    clear_channel_registry, MockConnectionFactory, MockDataChannel, MockLatencyMode, MockRelay,
98    MockRelayTransport,
99};
100pub use multicast::{MulticastConfig, MulticastNostrBus};
101pub use nostr::{decode_signaling_event, encode_signaling_event, NostrRelayTransport};
102pub use peer::{ContentStore, Peer, PendingRequest};
103pub use peer_selector::{
104    peer_principal, PeerMetadataSnapshot, PeerSelector, PeerStats, PersistedPeerMetadata,
105    SelectionStrategy, SelectorSummary, PEER_METADATA_SNAPSHOT_VERSION,
106};
107pub use protocol::{
108    bytes_to_hash, create_fragment_response, create_pubsub_frame, create_pubsub_interest,
109    create_pubsub_inventory, create_pubsub_want, create_quote_request,
110    create_quote_response_available, create_quote_response_unavailable, create_request,
111    create_request_with_quote, create_response, encode_chunk, encode_payment, encode_payment_ack,
112    encode_peer_hints, encode_pubsub_frame, encode_pubsub_interest, encode_pubsub_inventory,
113    encode_pubsub_want, encode_quote_request, encode_quote_response, encode_request,
114    encode_response, hash_to_bytes, hash_to_key, is_fragmented, parse_message, DataChunk,
115    DataMessage, DataPayment, DataPaymentAck, DataQuoteRequest, DataQuoteResponse, DataRequest,
116    DataResponse, PeerHints, PubsubFrame, PubsubInterest, PubsubInventory, PubsubWant,
117    FRAGMENT_SIZE, MSG_TYPE_CHUNK, MSG_TYPE_PAYMENT, MSG_TYPE_PAYMENT_ACK, MSG_TYPE_PEER_HINTS,
118    MSG_TYPE_PUBSUB_FRAME, MSG_TYPE_PUBSUB_INTEREST, MSG_TYPE_PUBSUB_INVENTORY,
119    MSG_TYPE_PUBSUB_WANT, MSG_TYPE_QUOTE_REQUEST, MSG_TYPE_QUOTE_RESPONSE, MSG_TYPE_REQUEST,
120    MSG_TYPE_RESPONSE,
121};
122pub use pubsub_strategy::{
123    reciprocal_upload_weight, reciprocal_virtual_finish, select_reciprocal_outbound_job,
124    stable_pubsub_score, OutboundJobCandidate, OutboundJobSelection, PeerTrafficSnapshot,
125    PubsubCandidate, PubsubSchedulerConfig, PubsubSchedulingPolicy, PubsubSelection,
126};
127pub use real_factory::WebRtcPeerLinkFactory;
128pub use relay_bridge::{
129    MeshEventStore, MeshRelayClient, SharedMeshEventStore, SharedMeshRelayClient,
130};
131pub use root_events::{
132    build_root_filter, hashtree_event_identifier, is_hashtree_labeled_event, pick_latest_event,
133    root_event_from_peer, PeerRootEvent, HASHTREE_KIND, HASHTREE_LABEL,
134};
135pub use runtime_control::{
136    can_track_source_peer, cleanup_stale_peers, create_signaling_event, dispatch_signaling_message,
137    forward_mesh_frame_from_runtime, handle_peer_state_event, handle_signaling_event,
138    handle_signaling_message, PeerStateEvent,
139};
140pub use runtime_peer::{
141    can_track_signal_path_peer, remember_peer_signal_path, ConnectionState, MeshPeerEntry,
142    PeerDirection, PeerSignalPath, PeerTransport, TransportPeerRegistrar,
143};
144pub use runtime_state::MeshRuntimeState;
145pub use session::MeshPeer;
146#[cfg(test)]
147pub use session::TestMeshPeer;
148pub use signaling::{MeshRouter, PeerEntry};
149pub use store::{MeshStore, MeshStoreError};
150pub use transport::{PeerLink, PeerLinkFactory, SignalingTransport, TransportError};
151pub use types::{
152    classifier_channel, decrement_htl_with_policy, is_polite_peer, should_forward,
153    should_forward_htl, validate_mesh_frame, ClassifierRx, ClassifierTx, ClassifyRequest, HtlMode,
154    HtlPolicy, IceCandidate, KnownPeerRecord, KnownPeerSnapshot, MeshNostrFrame, MeshNostrPayload,
155    MeshStats, MeshStoreConfig, PeerHTLConfig, PeerId, PeerPool, PeerState, PoolConfig,
156    PoolSettings, SignalingMessage, TimedSeenSet, WebRTCStats, BLOB_REQUEST_POLICY,
157    DATA_CHANNEL_LABEL, DECREMENT_AT_MAX_PROB, DECREMENT_AT_MIN_PROB, MAX_HTL, MESH_DEFAULT_HTL,
158    MESH_EVENT_POLICY, MESH_MAX_HTL, MESH_PROTOCOL, MESH_PROTOCOL_VERSION,
159    MESH_SIGNALING_EVENT_KIND, NOSTR_KIND_HASHTREE,
160};
161pub use wifi_aware::{
162    install_mobile_wifi_aware_bridge, mobile_wifi_aware_bridge, MobileWifiAwareBridge,
163    WifiAwareConfig, WifiAwareEvent, WifiAwareNostrBus, WIFI_AWARE_SOURCE,
164};