Skip to main content

FleetFeed

Struct FleetFeed 

Source
pub struct FleetFeed {
    epoch: String,
    hostname: String,
    channel: String,
    version: String,
    os: String,
    install_id: Option<String>,
    tx: Sender<FleetSnapshot>,
    viewer_port: Arc<AtomicU16>,
    streams: Arc<AtomicUsize>,
    heartbeat: Duration,
}

Fields§

§epoch: String

16 lowercase hex chars, new on every srv launch: a client that sees a different epoch knows the instance restarted and takes the snapshot as-is rather than comparing revs.

§hostname: String§channel: String§version: String§os: String§install_id: Option<String>

This install’s WAN instance id; None without a WAN identity store.

§tx: Sender<FleetSnapshot>§viewer_port: Arc<AtomicU16>

Where the viewer port is read from on each look; 0 = not up.

§streams: Arc<AtomicUsize>§heartbeat: Duration

Implementations§

Source§

impl FleetFeed

Source

pub fn new(hostname: String, channel: String, version: String) -> Self

Source

pub fn with_viewer_port(self, port: Arc<AtomicU16>) -> Self

Read the viewer port from port (ViewerService::advertised_port_handle).

Source

pub fn with_install_id(self, install_id: Option<String>) -> Self

Set the install id the body reports (fleet_source::install_id).

Source

pub fn hostname(&self) -> &str

Source

pub fn channel(&self) -> &str

Source

pub fn version(&self) -> &str

Source

pub fn os(&self) -> &str

Source

pub fn snapshot(&self) -> FleetSnapshot

Source

pub fn subscribe(&self) -> Receiver<FleetSnapshot>

A receiver that wakes on every change, for the presence publisher.

Source

pub fn event_id(&self, snapshot: &FleetSnapshot) -> String

<epoch>:<rev>: the SSE id, and (quoted) the snapshot’s ETag.

Source

pub fn body_json(&self, snapshot: &FleetSnapshot) -> String

The /agentmux/fleet body, on one line, with now_ms read as it is served, so a peer can tell how long a state has held without trusting its own clock against this one. now_ms is not part of the snapshot: it never bumps rev or changes the ETag.

Source

fn body_json_at(&self, snapshot: &FleetSnapshot, now_ms: u64) -> String

Source

pub fn observe_fleet(&self, observation: FleetObservation) -> bool

Record the current fleet; bumps rev and wakes every stream only if it differs from the last one (names, kinds, channel count, any agent’s state or line, or the viewer port). Returns whether it did.

Source

pub fn spawn_change_detection<F>( self: Arc<Self>, observe: F, token: CancellationToken, )
where F: Fn() -> FleetObservation + Send + Sync + 'static,

Start the change-detection task: observe is read now, then every CHANGE_POLL_INTERVAL on a blocking thread (it reads the store and the shared registry) until token is cancelled (srv shutdown), the same stop signal the WAL checkpoint loop watches.

Source

pub fn open_stream( self: &Arc<Self>, last_event_id: Option<&str>, ) -> Option<impl Stream<Item = Result<Bytes, Infallible>> + Send + 'static>

Open one event stream, or None when MAX_STREAMS are already open.

The slot is held by a guard moved into the stream, so it is released whenever the stream is dropped: when hyper drops the response body after the client goes away (noticed at the latest on the next heartbeat write), or if the response is never sent at all.

With last_event_id equal to the current <epoch>:<rev> the client is already up to date and gets no initial event, only later ones.

Source

fn event_bytes(&self, snapshot: &FleetSnapshot) -> Bytes

One fleet event. body_json is serde output, so it holds no raw newline that could break the data: line.

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 + Send + Sync> ⓘ

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<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

§

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: Sized + 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: Sized + 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