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§
Sourcefn register(&mut self, device_id: &str) -> Result<RosterEntry, RelayError>
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.
Sourcefn push(
&mut self,
device_id: &str,
ops: &[OpRecord],
) -> Result<PushOutcome, RelayError>
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.
Sourcefn pull(
&mut self,
device_id: &str,
since: &Frontier,
) -> Result<PullResult, RelayError>
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.
Sourcefn ack(
&mut self,
device_id: &str,
frontier: Hlc,
) -> Result<AckOutcome, RelayError>
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.
Sourcefn checkpoint_put(
&mut self,
device_id: &str,
checkpoint: &Checkpoint,
) -> Result<bool, RelayError>
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.
Sourcefn checkpoint_get(&mut self) -> Result<Option<Checkpoint>, RelayError>
fn checkpoint_get(&mut self) -> Result<Option<Checkpoint>, RelayError>
The latest stored checkpoint (dominance-monotone pointer), if any.
Sourcefn roster(&mut self) -> Result<Vec<RosterEntry>, RelayError>
fn roster(&mut self) -> Result<Vec<RosterEntry>, RelayError>
The device registry.
Sourcefn stable_frontier(&mut self) -> Result<Option<Hlc>, RelayError>
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).
Sourcefn gc(&mut self) -> Result<GcReport, RelayError>
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".