Skip to main content

GenericStore

Struct GenericStore 

Source
pub struct GenericStore<S, R, F>
where S: Store + Send + Sync + 'static, R: SignalingTransport + Send + Sync + 'static, F: PeerLinkFactory + Send + Sync + 'static,
{ /* private fields */ }
Expand description

Generic mesh store that works with any storage backend and transport implementation.

This is the shared code between production and simulation.

  • Production: GenericStore<LmdbStore, NostrSignalingTransport, WebRtcPeerLinkFactory>
  • Simulation: GenericStore<MemoryStore, MockSignalingTransport, MockConnectionFactory>

Implementations§

Source§

impl<S, R, F> GenericStore<S, R, F>
where S: Store + Send + Sync + 'static, R: SignalingTransport + Send + Sync + 'static, F: PeerLinkFactory + Send + Sync + 'static,

Source

pub fn new( local_store: Arc<S>, signaling: Arc<MeshRouter<R, F>>, request_timeout: Duration, debug: bool, ) -> Self

Create a new generic store

Source

pub fn new_with_routing( local_store: Arc<S>, signaling: Arc<MeshRouter<R, F>>, request_timeout: Duration, debug: bool, routing: GenericStoreRoutingConfig, ) -> Self

Create a new generic store with explicit routing configuration.

Source

pub async fn start(&self) -> Result<(), TransportError>

Start the store (begin listening for messages)

Source

pub async fn stop(&self)

Stop the store

Source

pub async fn process_signaling( &self, msg: SignalingMessage, ) -> Result<(), TransportError>

Process incoming signaling message

Source

pub fn signaling(&self) -> &Arc<MeshRouter<R, F>>

Get signaling manager reference

Source

pub async fn peer_count(&self) -> usize

Get peer count

Source

pub async fn needs_peers(&self) -> bool

Check if we need more peers

Source

pub async fn send_hello(&self) -> Result<(), TransportError>

Re-broadcast hello to refresh discovery as topology changes.

Source

pub async fn record_cashu_payment_for_peer( &self, peer_id: &str, amount_sat: u64, )

Apply an out-of-band payment credit to a peer’s routing priority.

Source

pub async fn record_cashu_receipt_from_peer( &self, peer_id: &str, amount_sat: u64, )

Record a post-delivery payment we received from a peer.

Source

pub async fn record_cashu_payment_default_from_peer(&self, peer_id: &str)

Record that a peer failed to pay after we delivered successfully.

Source

pub async fn peer_metadata_snapshot(&self) -> PeerMetadataSnapshot

Export live peer metadata for inspection/debugging.

Source

pub async fn persist_peer_metadata(&self) -> Result<Hash, StoreError>

Snapshot current peer metadata and persist it into local_store.

Uses content-addressed storage for the snapshot body and a reserved mutable pointer slot for the “latest snapshot hash”.

Source

pub async fn load_peer_metadata(&self) -> Result<bool, StoreError>

Load persisted peer metadata from local_store if available.

Source

pub async fn get_with_quote( &self, hash: &Hash, payment_sat: u64, quote_ttl: Duration, ) -> Result<Option<Vec<u8>>, StoreError>

Request data from peers after negotiating a paid quote.

If quote negotiation fails or the quoted peer does not deliver, the store falls back to the normal unpaid retrieval path to preserve liveness.

Source

pub async fn handle_data_message(&self, from_peer: &str, data: &[u8])

Handle incoming data message

Trait Implementations§

Source§

impl<S, R, F> Store for GenericStore<S, R, F>
where S: Store + Send + Sync + 'static, R: SignalingTransport + Send + Sync + 'static, F: PeerLinkFactory + Send + Sync + 'static,

Source§

fn put<'life0, 'async_trait>( &'life0 self, hash: Hash, data: Vec<u8>, ) -> Pin<Box<dyn Future<Output = Result<bool, StoreError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Store data by its hash Returns true if newly stored, false if already existed
Source§

fn get<'life0, 'life1, 'async_trait>( &'life0 self, hash: &'life1 Hash, ) -> Pin<Box<dyn Future<Output = Result<Option<Vec<u8>>, StoreError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Retrieve data by hash Returns data or None if not found
Source§

fn has<'life0, 'life1, 'async_trait>( &'life0 self, hash: &'life1 Hash, ) -> Pin<Box<dyn Future<Output = Result<bool, StoreError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Check if hash exists
Source§

fn delete<'life0, 'life1, 'async_trait>( &'life0 self, hash: &'life1 Hash, ) -> Pin<Box<dyn Future<Output = Result<bool, StoreError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Delete by hash Returns true if deleted, false if didn’t exist
Source§

fn put_many<'life0, 'async_trait>( &'life0 self, items: Vec<([u8; 32], Vec<u8>)>, ) -> Pin<Box<dyn Future<Output = Result<usize, StoreError>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Store multiple blobs. Returns the number of newly stored items.
Source§

fn set_max_bytes(&self, _max: u64)

Set maximum storage size in bytes. 0 = unlimited.
Source§

fn max_bytes(&self) -> Option<u64>

Get maximum storage size. None = unlimited.
Source§

fn stats<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = StoreStats> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Get storage statistics
Source§

fn evict_if_needed<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<u64, StoreError>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Evict unpinned items if over storage limit. Returns number of bytes freed.
Source§

fn pin<'life0, 'life1, 'async_trait>( &'life0 self, _hash: &'life1 [u8; 32], ) -> Pin<Box<dyn Future<Output = Result<(), StoreError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

Pin a hash (increment ref count). Pinned items are not evicted.
Source§

fn unpin<'life0, 'life1, 'async_trait>( &'life0 self, _hash: &'life1 [u8; 32], ) -> Pin<Box<dyn Future<Output = Result<(), StoreError>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Self: 'async_trait,

Unpin a hash (decrement ref count). Item can be evicted when count reaches 0.
Source§

fn pin_count(&self, _hash: &[u8; 32]) -> u32

Get pin count for a hash. 0 = not pinned.
Source§

fn is_pinned(&self, hash: &[u8; 32]) -> bool

Check if hash is pinned (pin count > 0)

Auto Trait Implementations§

§

impl<S, R, F> !Freeze for GenericStore<S, R, F>

§

impl<S, R, F> !RefUnwindSafe for GenericStore<S, R, F>

§

impl<S, R, F> Send for GenericStore<S, R, F>

§

impl<S, R, F> Sync for GenericStore<S, R, F>

§

impl<S, R, F> Unpin for GenericStore<S, R, F>

§

impl<S, R, F> UnsafeUnpin for GenericStore<S, R, F>

§

impl<S, R, F> !UnwindSafe for GenericStore<S, R, F>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more