Skip to main content

nstreams_core/
store.rs

1use async_trait::async_trait;
2
3use crate::event::{EventVersion, StreamEvent};
4use crate::namespace::Namespace;
5
6/// Persistent event storage keyed by namespace.
7#[async_trait]
8pub trait EventStore: Send + Sync {
9    /// Ensure storage exists for the namespace.
10    async fn ensure_namespace<N: Namespace>(&self, namespace: &N) -> crate::Result<()>;
11
12    /// Allocate the next monotonic version and persist the event atomically.
13    async fn persist_next<N: Namespace>(
14        &self,
15        namespace: &N,
16        payload: &[u8],
17    ) -> crate::Result<StreamEvent>;
18
19    /// Load up to `limit` most recent events in ascending version order.
20    async fn load_history<N: Namespace>(
21        &self,
22        namespace: &N,
23        limit: u64,
24    ) -> crate::Result<Vec<StreamEvent>>;
25
26    /// Load events with version strictly greater than `after_version`.
27    async fn load_after_version<N: Namespace>(
28        &self,
29        namespace: &N,
30        after_version: EventVersion,
31        limit: u64,
32    ) -> crate::Result<Vec<StreamEvent>>;
33
34    /// Latest assigned version for the namespace, if any events exist.
35    async fn latest_version<N: Namespace>(
36        &self,
37        namespace: &N,
38    ) -> crate::Result<Option<EventVersion>>;
39}