Skip to main content

MeshRouter

Struct MeshRouter 

Source
pub struct MeshRouter<R: SignalingTransport, F: PeerLinkFactory> { /* private fields */ }
Expand description

Mesh router handles peer discovery and negotiated link establishment.

This is the shared routing logic between production transports and simulation. It uses traits for signaling transport and negotiated link factories so the same router can drive Nostr websockets, LAN buses, BLE, WebRTC, or mocks.

Uses the standard concurrent-offer “perfect negotiation” pattern:

  • Both peers can send offers when they discover each other
  • On collision (both sent offers), “polite” peer backs off and accepts incoming
  • This ensures connections form even when one peer is satisfied but can accept

Implementations§

Source§

impl<R: SignalingTransport + 'static, F: PeerLinkFactory + 'static> MeshRouter<R, F>

Source

pub fn new( peer_id: String, transport: Arc<R>, conn_factory: Arc<F>, pools: PoolSettings, debug: bool, ) -> Self

Create a new mesh router.

Source

pub fn set_classifier(&mut self, tx: Sender<ClassifyRequest>)

Set classifier for peer pool assignment

Source

pub fn peer_id(&self) -> &str

Get our peer ID

Source

pub async fn send_hello(&self, roots: Vec<String>) -> Result<(), TransportError>

Send hello broadcast

Source

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

Handle incoming signaling message

This is the core signaling logic shared between production and simulation.

Source

pub async fn peer_count(&self) -> usize

Get connected peer count

Source

pub async fn peer_ids(&self) -> Vec<String>

Get peer IDs

Source

pub async fn get_channel(&self, peer_id: &str) -> Option<Arc<dyn PeerLink>>

Get a peer’s channel

Source

pub async fn remove_peer(&self, peer_id: &str) -> Option<Arc<dyn PeerLink>>

Remove a peer and any pending offer state.

Source

pub async fn needs_peers(&self) -> bool

Check if we need more peers (below satisfied in any pool)

Source

pub async fn can_accept(&self) -> bool

Check if we can accept more peers (below max in any pool)

Auto Trait Implementations§

§

impl<R, F> !Freeze for MeshRouter<R, F>

§

impl<R, F> !RefUnwindSafe for MeshRouter<R, F>

§

impl<R, F> Send for MeshRouter<R, F>

§

impl<R, F> Sync for MeshRouter<R, F>

§

impl<R, F> Unpin for MeshRouter<R, F>

§

impl<R, F> UnsafeUnpin for MeshRouter<R, F>

§

impl<R, F> !UnwindSafe for MeshRouter<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