LanDiscoveryController

Struct LanDiscoveryController 

Source
pub struct LanDiscoveryController {
    slot: Arc<RwLock<Option<Arc<LanDiscovery>>>>,
    instance_id: String,
    hostname: String,
    version: String,
    port: u16,
    auth_key: String,
    event_bus: Arc<EventBus>,
    agent_cache: RwLock<HashMap<String, LanCacheEntry>>,
}
Expand description

Controller for live start/stop of LanDiscovery in response to setting changes.

Owns the daemon slot plus the start arguments, so toggling network:lan_discovery from the UI (or from an external edit of settings.json) can start or stop the daemon without restarting the process.

Spec: specs/lan-discovery-toggle.md

Fields§

§slot: Arc<RwLock<Option<Arc<LanDiscovery>>>>§instance_id: String§hostname: String§version: String§port: u16§auth_key: String§event_bus: Arc<EventBus>§agent_cache: RwLock<HashMap<String, LanCacheEntry>>

Short-lived cache mapping agent_id → (peer_url, auth_key). Entries expire after LAN_AGENT_CACHE_TTL_SECS to handle agent migration between peers.

Implementations§

Source§

impl LanDiscoveryController

Source

pub fn new( instance_id: String, hostname: String, version: String, port: u16, event_bus: Arc<EventBus>, auth_key: String, ) -> Self

Source

pub async fn find_agent( &self, agent_id: &str, http: &Client, ) -> Option<(String, String)>

Query LAN peers for which one hosts agent_id. Returns (peer_url, auth_key) for the first peer that responds 2xx to the agent-lookup endpoint. Results — both positive and negative — are cached for LAN_AGENT_CACHE_TTL_SECS seconds to avoid a blocking peer fan-out on every inject for cloud-only agents.

Security: auth_key is broadcast in the mDNS TXT record. This is intentional and matches the same trust assumption as tier-2 loopback forwarding — LAN traffic is trusted (private network). Anyone on the LAN who can already intercept mDNS multicast can intercept the HTTP traffic too, so the key adds no exposure beyond what already exists.

Source

pub fn evict_agent(&self, agent_id: &str)

Evict a stale cache entry (e.g. after a forward to that peer failed).

Source

pub fn apply(&self, enabled: bool)

Idempotent: starts the daemon when enabled and not running, stops it when !enabled and running. Re-entrant safe.

Holds the slot’s write lock for the entire check-and-modify transaction to avoid a TOCTOU race between the is_running read and the slot mutation. apply() is called from toggle clicks and setting writes — low frequency — so briefly blocking concurrent peer-list reads is acceptable. LanDiscovery::start() and Drop are both fast (mDNS daemon construction + service register/unregister are local socket ops).

Source

pub fn get_instances(&self) -> Vec<LanInstance>

Read the current peer list. Returns empty when the daemon is not running (discovery disabled or start failed).

Auto Trait Implementations§

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<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
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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
§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. 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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,