pub struct Registry { /* private fields */ }Expand description
SQLite registry handle. SQLite-level WAL + busy_timeout handles
concurrent reader/writer coordination across processes; we no longer
hold a long-lived exclusive file lock for the lifetime of the
handle. A short exclusive lock is taken only across the
schema-migration window in open_at to serialise initial
CREATE TABLE / CREATE INDEX against a concurrent first open.
Implementations§
Source§impl Registry
impl Registry
Sourcepub fn bidi_lock_acquire(
&self,
browser_name: &str,
timeout: Duration,
) -> Result<BidiLockGuard>
pub fn bidi_lock_acquire( &self, browser_name: &str, timeout: Duration, ) -> Result<BidiLockGuard>
Acquire the BiDi lock for browser_name. Blocks until granted or
timeout elapses. On contention, evicts a stale row whose holder
PID is no longer alive.
Polling rather than file-locking on the row: the registry’s
process-level file lock already serializes connections, and the
acquire path is single-row + atomic. We re-poll every
[POLL_INTERVAL] until success or timeout.
Sourcepub fn bidi_lock_holder(
&self,
browser_name: &str,
) -> Result<Option<BidiLockRow>>
pub fn bidi_lock_holder( &self, browser_name: &str, ) -> Result<Option<BidiLockRow>>
Read the current lock holder for diagnostics / tests. Returns
None if no row exists.
Source§impl Registry
impl Registry
Sourcepub fn scratch_get(&self, browser_name: &str) -> Result<Option<ScratchRow>>
pub fn scratch_get(&self, browser_name: &str) -> Result<Option<ScratchRow>>
Read the scratch row for browser_name. Returns None if no row.
Sourcepub fn scratch_upsert(&self, browser_name: &str, target_id: &str) -> Result<()>
pub fn scratch_upsert(&self, browser_name: &str, target_id: &str) -> Result<()>
Insert or replace the scratch row for browser_name. Used both when
creating the first scratch and when recovering a wedged one.
Sourcepub fn scratch_touch(&self, browser_name: &str) -> Result<()>
pub fn scratch_touch(&self, browser_name: &str) -> Result<()>
Bump last_used_at for the scratch row (no-op if absent). Called
after a successful op so the row reflects actual recency for
diagnostics.
Sourcepub fn scratch_delete(&self, browser_name: &str) -> Result<()>
pub fn scratch_delete(&self, browser_name: &str) -> Result<()>
Remove the scratch row (used by recovery to mark the prior target dead before re-creating). Idempotent.
Source§impl Registry
impl Registry
Sourcepub fn tab_get(&self, browser_name: &str, name: &str) -> Result<Option<TabRow>>
pub fn tab_get(&self, browser_name: &str, name: &str) -> Result<Option<TabRow>>
Read a single tab by composite key.
Sourcepub fn tabs_list_for(&self, browser_name: &str) -> Result<Vec<TabRow>>
pub fn tabs_list_for(&self, browser_name: &str) -> Result<Vec<TabRow>>
All tabs for a browser, sorted by name (stable for tab list output).
Sourcepub fn tab_upsert(
&self,
browser_name: &str,
name: &str,
target_id: &str,
last_url: &str,
daemon_created: bool,
) -> Result<()>
pub fn tab_upsert( &self, browser_name: &str, name: &str, target_id: &str, last_url: &str, daemon_created: bool, ) -> Result<()>
Insert or replace a tab. Bumps last_used_at to “now”.
Sourcepub fn tab_touch(&self, browser_name: &str, name: &str) -> Result<()>
pub fn tab_touch(&self, browser_name: &str, name: &str) -> Result<()>
Bump last_used_at without rewriting other columns. No-op if absent.
Sourcepub fn tab_set_url(
&self,
browser_name: &str,
name: &str,
url: &str,
) -> Result<()>
pub fn tab_set_url( &self, browser_name: &str, name: &str, url: &str, ) -> Result<()>
Rewrite just last_url (after a successful Page.navigate).
Sourcepub fn tab_delete(&self, browser_name: &str, name: &str) -> Result<()>
pub fn tab_delete(&self, browser_name: &str, name: &str) -> Result<()>
Delete by composite key. Idempotent.
Sourcepub fn tabs_count_daemon_created(&self, browser_name: &str) -> Result<usize>
pub fn tabs_count_daemon_created(&self, browser_name: &str) -> Result<usize>
Count daemon_created = true rows for a browser. Used by the
orchestration layer to decide when to recycle under budget pressure.
Source§impl Registry
impl Registry
Sourcepub fn open_in_memory() -> Result<Self>
pub fn open_in_memory() -> Result<Self>
Open an in-memory registry (tests only). No file lock taken.
Sourcepub fn insert(&self, row: &BrowserRow) -> Result<()>
pub fn insert(&self, row: &BrowserRow) -> Result<()>
Insert (or replace) a row.
Sourcepub fn delete(&self, name: &str) -> Result<()>
pub fn delete(&self, name: &str) -> Result<()>
Delete a row by name. No error if it does not exist.
Sourcepub fn get_by_name(&self, name: &str) -> Result<Option<BrowserRow>>
pub fn get_by_name(&self, name: &str) -> Result<Option<BrowserRow>>
Look up a row by name.
Sourcepub fn list_all(&self) -> Result<Vec<BrowserRow>>
pub fn list_all(&self) -> Result<Vec<BrowserRow>>
All rows, no liveness check, ordered by started_at DESC.
Sourcepub fn list_alive(&self) -> Result<Vec<BrowserRow>>
pub fn list_alive(&self) -> Result<Vec<BrowserRow>>
All alive rows. Dead-PID rows are deleted as a side-effect; rows whose endpoint is temporarily unreachable are omitted but retained.
Sourcepub fn first_alive_by_kind(&self, kind: Kind) -> Result<Option<BrowserRow>>
pub fn first_alive_by_kind(&self, kind: Kind) -> Result<Option<BrowserRow>>
First alive row of the given kind (most recent first). Dead-PID matches are pruned; endpoint-unreachable rows are retained.
Sourcepub fn most_recent_alive(&self) -> Result<Option<BrowserRow>>
pub fn most_recent_alive(&self) -> Result<Option<BrowserRow>>
Most recently started alive row across all kinds.
Auto Trait Implementations§
impl !Freeze for Registry
impl !RefUnwindSafe for Registry
impl !Sync for Registry
impl !UnwindSafe for Registry
impl Send for Registry
impl Unpin for Registry
impl UnsafeUnpin for Registry
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
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