Skip to main content

SessionManager

Struct SessionManager 

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

A coordinator pairing one Site implementation with one BrowserSession.

The manager:

§Concurrency

The internal Mutex<SessionState> guards only the cookie snapshot and last_refresh timestamp — it is not held across Site::refresh / Site::validate calls. Concurrent callers of refresh / refresh_with_seed / validate will therefore drive the underlying browser simultaneously, which is generally unsafe (interleaved navigations, seed cookies overwritten before the refresh navigation reads them). Callers that share a SessionManager across tasks must externally serialise these calls. A future release may move the lock to cover the full call; until then, Phase 3+ multi-account pools / schedulers are expected to own the serialisation boundary.

§Example

use std::sync::Arc;
use tail_fin_common::{BrowserSession, SessionManager};
use tail_fin_twitter::TwitterSite;

let session = BrowserSession::builder().build().await?;
let manager = SessionManager::new(Arc::new(TwitterSite), session);

// Force refresh:
manager.refresh().await?;

// Check validity:
let status = manager.validate().await?;

Implementations§

Source§

impl SessionManager

Source

pub fn new(site: Arc<dyn Site>, browser: BrowserSession) -> SessionManager

Create a manager wrapping a site + browser session. Initial cookie snapshot is empty — call refresh() or reload_cookies() to populate.

Source

pub fn site(&self) -> &Arc<dyn Site>

Return the site this manager is scoped to.

Source

pub fn browser(&self) -> &Arc<BrowserSession>

Return the browser session.

Source

pub async fn refresh(&self) -> Result<Vec<Value>, SiteError>

Force a server-side refresh. Updates internal cookie snapshot.

Does NOT respect refresh_interval_min — for debounced refresh, use refresh_if_stale.

Source

pub async fn refresh_with_seed( &self, seed: &[Value], ) -> Result<Vec<Value>, SiteError>

Inject seed cookies into the browser, then call Site::refresh.

Use when the caller already has a (possibly stale) cookie set the site accepts as “proof of prior session” — the refresh navigation uses them to obtain fresh server-issued cookies.

An empty seed slice skips the injection and is equivalent to calling SessionManager::refresh directly.

Like refresh, this does NOT respect refresh_interval_min.

Source

pub async fn refresh_if_stale(&self) -> Result<Option<Vec<Value>>, SiteError>

Refresh only if the last refresh is older than site.refresh_interval_min(). Returns Some(cookies) on actual refresh, None if debounced.

Source

pub async fn validate(&self) -> Result<SessionStatus, SiteError>

Validate session liveness via the site’s validate hook.

Source

pub async fn cookies(&self) -> Vec<Value>

Snapshot of the current cookies held by this manager. Initially empty until first refresh() or reload_cookies().

Source

pub async fn reload_cookies(&self) -> Result<Vec<Value>, SiteError>

Reload cookies from the browser without triggering server-side refresh. Useful if cookies were updated via some path outside the manager.

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<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> PolicyExt for T
where T: ?Sized,

Source§

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

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