Skip to main content

Relay

Trait Relay 

Source
pub trait Relay {
    // Required methods
    fn register(&mut self, device_id: &str) -> Result<RosterEntry, RelayError>;
    fn push(
        &mut self,
        device_id: &str,
        ops: &[OpRecord],
    ) -> Result<PushOutcome, RelayError>;
    fn pull(
        &mut self,
        device_id: &str,
        since: &Frontier,
    ) -> Result<PullResult, RelayError>;
    fn ack(
        &mut self,
        device_id: &str,
        frontier: Hlc,
    ) -> Result<AckOutcome, RelayError>;
    fn checkpoint_put(
        &mut self,
        device_id: &str,
        checkpoint: &Checkpoint,
    ) -> Result<bool, RelayError>;
    fn checkpoint_get(&mut self) -> Result<Option<Checkpoint>, RelayError>;
    fn roster(&mut self) -> Result<Vec<RosterEntry>, RelayError>;
    fn stable_frontier(&mut self) -> Result<Option<Hlc>, RelayError>;
    fn gc(&mut self) -> Result<GcReport, RelayError>;
}
Expand description

The relay contract — see the module docs. All methods take &mut self because every contact updates roster liveness (and runs the eviction sweep) even on logically-read-only calls.

Required Methods§

Source

fn register(&mut self, device_id: &str) -> Result<RosterEntry, RelayError>

Enroll (or touch) a device on the roster. Idempotent; push/pull/ack auto-register on first contact.

Source

fn push( &mut self, device_id: &str, ops: &[OpRecord], ) -> Result<PushOutcome, RelayError>

Admit device_id’s own journal-durable ops (in seq order) onto its relay-held chain. Contract (B1, binding): the caller transmits only ops that are already journal-durable on the device.

Source

fn pull( &mut self, device_id: &str, since: &Frontier, ) -> Result<PullResult, RelayError>

Every retained op above since (per-device seq cursor) + the latest checkpoint pointer.

Source

fn ack( &mut self, device_id: &str, frontier: Hlc, ) -> Result<AckOutcome, RelayError>

Record a device’s fold frontier. Contract (B4, binding): the device acks only what it has DURABLY folded (journaled), never merely received.

Source

fn checkpoint_put( &mut self, device_id: &str, checkpoint: &Checkpoint, ) -> Result<bool, RelayError>

Store a device-computed checkpoint. Verified, deduped on checkpoint_hash (whole-record content address — contract from B4). Returns false when the identical checkpoint was already stored.

Source

fn checkpoint_get(&mut self) -> Result<Option<Checkpoint>, RelayError>

The latest stored checkpoint (dominance-monotone pointer), if any.

Source

fn roster(&mut self) -> Result<Vec<RosterEntry>, RelayError>

The device registry.

Source

fn stable_frontier(&mut self) -> Result<Option<Hlc>, RelayError>

min(acked) over active roster devices; None while any active device has never acked (nothing is droppable then).

Source

fn gc(&mut self) -> Result<GcReport, RelayError>

Drop every op that is BOTH at/below the stable frontier AND covered by a stored checkpoint. Never drops anything else.

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§