Skip to main content

BrowserView

Struct BrowserView 

Source
pub struct BrowserView { /* private fields */ }
Expand description

One browser, plus everyone watching it.

Implementations§

Source§

impl BrowserView

Source

pub async fn note_disconnect( self: &Arc<Self>, client_id: &str, was_watching: bool, ) -> bool

The connection holding control dropped. Starts the stated grace period, after which control reverts to the agent — an agent is never parked forever behind a controller who is not coming back.

Returns whether this connection actually held control, i.e. whether this call took ownership of the disconnect clock. The caller uses that to keep Self::note_watcher_disconnect off a view whose holder just left: both arm a grace timer, with DIFFERENT require_unwatched semantics (see Self::spawn_grace_timer_inner), and each bumps control.generation, retiring the other’s timer. Exactly one of the two owns any given disconnect.

was_watching is why collapsing the two calls does not silently pick the holder semantics for everybody. The ordinary drawer is the holder AND the only subscriber, and for it the WATCHER semantics are the load-bearing ones: a drawer that comes back inside the window is precisely what says the person’s sign-in window is still theirs. So the single surviving timer takes require_unwatched from whether this connection was the last drawer watching — see the arming site below.

Source

pub async fn note_run_ended(self: &Arc<Self>)

The run that owned this browser ended: no ceremony, the user’s browser again.

Deliberately a method on the VIEW, not a registry lookup by key. The run-end signal is asynchronous (see mcp_assistant::BrowserViewGuard), so re-resolving the key at fire time can land on whatever view holds it by then — clearing the strip and re-opening input to everyone on a SUCCESSOR run’s browser while its agent is actively driving. Holding the Arc makes the signal act on the identity it was created for, and a late arrival for a replaced view is then simply inert.

Source

pub async fn note_watcher_disconnect(self: &Arc<Self>)

A connection that was WATCHING this view went away.

Distinct from Self::note_disconnect, which is about the control HOLDER — and the distinction is the whole point. The ordinary sign-in flow never involves Take control (the strip IS the affordance, and require_control admits input while a sign-in is pending so the person can type without pressing anything), so their window has no holder for note_disconnect to match. Since round 8 that window OUTLIVES the run: an agent-side ending may not clear a strip somebody is standing at. So this is the only signal left that says they are not coming back, and without it a person who closed the laptop mid-sign-in would leave the blackout latched for the daemon’s life — wedging every later run’s browse call behind it.

Armed only when nobody is watching any more: another connection still subscribed means the drawer is still there. Re-checked at expiry too.

Never called for a connection that held control: the registry keys this off note_disconnect’s return value, because the ordinary drawer is BOTH holder and watcher and the two arm grace timers with different semantics. The holder.is_some() guard below covers the other shape — someone ELSE is driving — and cannot see this connection’s own holder record, which note_disconnect clears before returning.

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

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,

Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<S> FromSample<S> for S

Source§

fn from_sample_(s: S) -> S

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<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

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

Source§

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

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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> ToSample<U> for T
where U: FromSample<T>,

Source§

fn to_sample_(self) -> U

Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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