Skip to main content

ErasureCascadeObserver

Struct ErasureCascadeObserver 

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

L2 observer that drives the E-user-3 cascade. On every UserErasureScheduled event it:

  1. Looks up the user’s encrypted-PII rows via the attached PiiRowStore.
  2. Calls PiiRowStore::tombstone to mark every row soft-deleted.
  3. Invokes the attached DekShredder to drop the underlying DEK.
  4. Records an ErasureCompletion the caller can convert into a UserErasureCompleted event on the next tick.

The observer holds its own cursor — the router still centralises dedup + gap detection via the Projection trait.

Implementations§

Source§

impl ErasureCascadeObserver

Source

pub fn new(rows: Box<dyn PiiRowStore>, shredder: Box<dyn DekShredder>) -> Self

Construct the observer with concrete backends.

Source

pub fn drain_completions(&mut self) -> Vec<ErasureCompletion>

Drain accumulated ErasureCompletions. The caller feeds each one back into an ActionContext::emit_event(UserErasureCompleted { ... }) so the next WAL tick anchors the receipt.

Source

pub fn pii_rows(&self) -> &dyn PiiRowStore

Borrow the store for inspection — tests only.

Source

pub fn shredder(&self) -> &dyn DekShredder

Borrow the shredder for inspection — tests only.

Source

pub fn into_completed_event( completion: &ErasureCompletion, schema_version: u16, transparency_log_index: u64, ) -> UserErasureCompleted

Convenience — build a UserErasureCompleted event from a drained completion. The caller chooses the schema_version / transparency log index from its own anchor; this helper wires the remaining five fields.

Source

pub fn per_region_events( completion: &ErasureCompletion, schema_version: u16, ) -> Vec<PerRegionErasureProgress>

Convenience — fan out a completion’s per-region progress entries as PerRegionErasureProgress events (two-phase commit). Single-region backends emit one event; multi- region backends emit one event per participating region. The caller emits these before the terminal UserErasureCompleted receipt so external consumers see the full erasure transcript.

Trait Implementations§

Source§

impl Projection for ErasureCascadeObserver

Source§

fn observes(&self) -> &[TypeCode]

TypeCodes this projection observes — the router filters incoming events against this slice.
Source§

fn on_event( &mut self, event: &EventRecord, ctx: &ProjectionContext<'_>, ) -> Result<(), ProjectionError>

Apply an event. Called only after router-side dedup + gap checks have succeeded. Implementations must: Read more
Source§

fn on_state_change( &mut self, _new_state: ObserverState, ) -> Result<(), ProjectionError>

React to a worker-state transition (Passive ↔ Active ↔ Draining). Default is no-op.
Source§

fn last_applied(&self) -> Option<(u64, Tick)>

Last (sequence, tick) applied — None if the projection is fresh.

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