Skip to main content

EntityResync

Struct EntityResync 

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

The projector’s way back to the VM its mutations come from.

The entity cache is bounded. A patch for a key it does not hold carries only the fields that changed and cannot rebuild the entity, unless it is the mutation that created the entity. A linked VM marks those (WholeEntity::Created), so the cache stores a creation and refuses any other patch for a key it lacks, whether it evicted the key or never held it. The projector then asks the VM, which holds the whole entity, to send all of it at the end of its next batch of mutations, whether or not the key changes in it (see WholeEntityRequests).

A resend is the entity again, not a change, so it must not take the position (_seq) of the batch it arrives in: in a view ordered by recency it would rank ahead of entities that really changed there. The projector remembers the position of each requested key’s latest change — the refused patch, or any change it sees for the key after it — and stamps the resend with that, in the cache, in derived views and on the upsert it publishes. It learns a key’s changes in stream order, which the VM cannot: positions are assigned per batch, after the VM has emitted it. A resend with no remembered position (one past the bound, or from a source without a VM, which sends whole entities as changes) takes its batch’s. For an account-owned entity it also remembers the explicit account position at request time, so a whole entity produced for an old lifetime cannot land after deletion and recreation.

The generated runtime hands its VM over through crate::snapshot::register_runtime, inside Self::scope, before it emits anything. A mutation source that registers no VM marks nothing and cannot be asked: the cache takes a patch for a key it lacks for a new entity unless it remembers evicting the key, and a remembered key stays out until the source sends a mutation marked whole (arete_interpreter::Mutation::mark_whole_entity) or a source delete.

Implementations§

Source§

impl EntityResync

Source

pub fn new() -> Self

Source

pub async fn scope<F: Future>(&self, future: F) -> F::Output

Run a mutation source (the generated parser) so that the VM it registers answers this projector’s requests.

Answer requests from vm.

Source

pub fn is_linked(&self) -> bool

Source

pub fn requests(&self) -> &WholeEntityRequests

The request set, for inspection.

Trait Implementations§

Source§

impl Clone for EntityResync

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Default for EntityResync

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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: Sized + 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: Sized + 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

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