Skip to main content

AppNode

Struct AppNode 

Source
pub struct AppNode<Op> {
    pub app_id: String,
    pub instance_id: String,
    /* private fields */
}
Expand description

The central node handle used by application code.

Generic over the operation type Op — the application supplies its own operation enum and AppNode handles serialization, loopback broadcast, and error logging consistently across all operation store backends.

Construct via the named constructors rather than directly:

let node = AppNode::<Op>::grpc("http://[::1]:50051".into(), "my-app-id", "my-instance")?;

Fields§

§app_id: String§instance_id: String

Implementations§

Source§

impl<Op: Clone + Serialize + Send + 'static> AppNode<Op>

Source

pub async fn local( pool: SqlitePool, app_id: impl Into<String>, instance_id: impl Into<String>, ) -> Result<Self, Error>

Create a local-only AppNode backed by a SQLite store.

Operations are persisted locally and never forwarded to a remote node.

Source

pub async fn grpc_with_local( pool: SqlitePool, grpc_addr: String, app_id: impl Into<String>, instance_id: impl Into<String>, ) -> Result<Self, ConnectError>

Create an AppNode that persists to a local SQLite store and forwards to lores-node via gRPC, using the local row id as an idempotency key.

If gRPC delivery fails the operation is retained locally for a future drain attempt.

Source

pub fn grpc( grpc_addr: String, app_id: impl Into<String>, instance_id: impl Into<String>, ) -> Result<Self, ConnectError>

Create an AppNode connected to an external lores-node via gRPC.

Uses a lazy connection — no network call until the first publish.

Source

pub fn subscribe(&self) -> Receiver<AppNodeOperation<Op>>

Subscribe to operations published through this node (loopback).

Source

pub fn subscribe_errors(&self) -> Receiver<Option<NodeError>>

Watch the current node error state.

The receiver immediately reflects the current value, so callers that subscribe after an error was set will see it right away.

Source

pub fn subscribe_node_events(&self) -> Receiver<NodeEvent>

Source

pub async fn node_info( &self, node_id: impl Into<String>, ) -> Result<NodeInfo, GetNodeError>

Fetch information about a node in the same region.

Source

pub async fn replay(&self) -> Result<(), StoreError>
where Op: for<'de> Deserialize<'de>,

Replay all locally-stored operations, broadcasting each through the event channel.

Source

pub async fn publish(&self, operation: &Op) -> Result<(), StoreError>

Serialize and publish an operation, then broadcast it locally.

Source

pub async fn run(&self)
where Op: for<'de> Deserialize<'de>,

Drive the remote subscription in a loop, broadcasting incoming operations and errors to all subscribers.

Retries on all transient failures with exponential backoff (1 s → 60 s). The backoff resets whenever the error variant changes (e.g. GrpcUnavailableRegionNotBound). Call it with tokio::spawn from your application’s main.

Trait Implementations§

Source§

impl<Op> Clone for AppNode<Op>

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

Auto Trait Implementations§

§

impl<Op> !RefUnwindSafe for AppNode<Op>

§

impl<Op> !UnwindSafe for AppNode<Op>

§

impl<Op> Freeze for AppNode<Op>
where OperationConsumer<Op>: Freeze,

§

impl<Op> Send for AppNode<Op>
where OperationConsumer<Op>: Send,

§

impl<Op> Sync for AppNode<Op>
where OperationConsumer<Op>: Sync,

§

impl<Op> Unpin for AppNode<Op>
where OperationConsumer<Op>: Unpin,

§

impl<Op> UnsafeUnpin for AppNode<Op>
where OperationConsumer<Op>: UnsafeUnpin,

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

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
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, <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.
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