pub struct ChannelSupervisor { /* private fields */ }Expand description
Runtime supervisor for the approval-transport channels. Held as an
Arc on crate::session::ServerState (lazy-initialized at boot by
spawn_channel_pollers) so the host-gated messaging.config.set handler
can reach it to spawn a channel’s watcher the instant the user enables it —
no daemon/app restart (U1).
Implementations§
Source§impl ChannelSupervisor
impl ChannelSupervisor
Sourcepub fn new(
host: Arc<HostState>,
cancel_tx: Sender<bool>,
spawn: Box<dyn Fn(ChannelId, &Arc<HostState>, &Arc<Mutex<HashMap<ChannelId, ChannelLiveness>>>, Receiver<bool>) -> Result<(), String> + Sync + Send>,
) -> ChannelSupervisor
pub fn new( host: Arc<HostState>, cancel_tx: Sender<bool>, spawn: Box<dyn Fn(ChannelId, &Arc<HostState>, &Arc<Mutex<HashMap<ChannelId, ChannelLiveness>>>, Receiver<bool>) -> Result<(), String> + Sync + Send>, ) -> ChannelSupervisor
Build a supervisor over the given host, cancel signal, and spawn closure.
The boot path (spawn_channel_pollers) constructs it, records the
channels it already spawned via Self::mark_spawned, and stores it on
ServerState.
Sourcepub fn liveness(&self) -> Arc<Mutex<HashMap<ChannelId, ChannelLiveness>>> ⓘ
pub fn liveness(&self) -> Arc<Mutex<HashMap<ChannelId, ChannelLiveness>>> ⓘ
The shared liveness map (so the boot path can hand the SAME Arc to the
adapters it spawns, and messaging.status can read it).
Sourcepub fn cancel_all(&self)
pub fn cancel_all(&self)
Stop every spawned adapter loop (boot + runtime) by flipping the shared cancel signal. Called by the daemon shutdown path. Idempotent.
Sourcepub fn mark_spawned(&self, channel: ChannelId)
pub fn mark_spawned(&self, channel: ChannelId)
Record that channel’s watcher is already running (called by the boot
path for each channel it spawned at startup). Idempotent.
Sourcepub fn is_spawned(&self, channel: ChannelId) -> bool
pub fn is_spawned(&self, channel: ChannelId) -> bool
Whether channel’s watcher is currently spawned. Read by
messaging.status for the watcher_running field (U2).
Sourcepub fn ensure_spawned(&self, channel: ChannelId) -> Result<(), String>
pub fn ensure_spawned(&self, channel: ChannelId) -> Result<(), String>
Ensure channel’s watcher is spawned (U1 — the invisible-restart fix).
Idempotent: if the channel is already live, this is a no-op and returns
Ok(()). Otherwise it calls the spawn closure with a fresh cancel
receiver, records the channel as live on success, and returns the
closure’s result. A spawn error leaves the channel NOT marked live (so a
later retry can re-attempt).
Called from messaging.config.set after a successful off→on transition.
Disable does NOT abort the loop (KTD1) — poll_once/observe_and_notify
already gate on the enabled flag, so a disabled channel does zero work
per tick; aborting would only add lifecycle complexity.
Sourcepub fn record_send_success(&self, channel: ChannelId)
pub fn record_send_success(&self, channel: ChannelId)
Record a successful send for channel into the shared liveness (U3).
Stamps now, marks ok, clears any prior error.
Sourcepub fn record_send_failure(&self, channel: ChannelId, reason: impl Into<String>)
pub fn record_send_failure(&self, channel: ChannelId, reason: impl Into<String>)
Record a failed send for channel (hard error OR soft sent:false)
into the shared liveness (U3). Stamps now, marks not-ok, stores the
reason.
Sourcepub fn liveness_snapshot(&self, channel: ChannelId) -> ChannelLiveness
pub fn liveness_snapshot(&self, channel: ChannelId) -> ChannelLiveness
Snapshot channel’s liveness (default if no send recorded yet). Read by
messaging.status.
Auto Trait Implementations§
impl !Freeze for ChannelSupervisor
impl !RefUnwindSafe for ChannelSupervisor
impl !UnwindSafe for ChannelSupervisor
impl Send for ChannelSupervisor
impl Sync for ChannelSupervisor
impl Unpin for ChannelSupervisor
impl UnsafeUnpin for ChannelSupervisor
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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