Skip to main content

Store

Struct Store 

Source
pub struct Store {
    pub path: PathBuf,
    /* private fields */
}
Expand description

An append-only event stream backed by a directory on disk.

Open one with new. Store is cheaply Cloneable: every clone shares the same underlying database, broadcast channel, and content-addressed store, so clone it freely across tasks and threads instead of wrapping it in an Arc.

See the module docs for the topic and retention model.

Fields§

§path: PathBuf

Directory backing this store (the path passed to new).

Implementations§

Source§

impl Store

Source

pub fn new(path: PathBuf) -> Result<Store, StoreError>

Open the store at path, creating the directory layout if it does not exist. Spawns a background worker that garbage-collects expired frames.

§Errors

Returns StoreError::Locked if another process already holds the store open, or StoreError::Other for any other database error.

use xs::Store;

let store = Store::new("./clipboard-store".into())?;
Source

pub fn with_base_engine(self, base: EngineState) -> Self

Set a base engine the processor engines clone.

A program that embeds xs prepares an EngineState with its own commands, env, and consts; prepared_base clones it per spawn and adds the store commands, so the actor, service, and action processors get those commands. Shared across Store clones, so set it once, before the processors spawn. No base set: Engine::new().

Source

pub fn base_engine(&self) -> Option<&EngineState>

The base engine an embedder attached via [with_base_engine], if any.

Source

pub async fn wait_for_gc(&self)

Wait until the background garbage-collection worker has processed every task queued so far. Useful in tests to observe TTL eviction deterministically.

Source

pub async fn read(&self, options: ReadOptions) -> Receiver<Frame>

Read frames into an async channel according to options.

By default this replays matching historical frames oldest-first and then closes the channel. With FollowOption::On it instead keeps the channel open and streams new appends as they arrive. When following, a single ephemeral xs.threshold frame is emitted to mark the boundary between replayed history and live events.

The returned Receiver is bounded; dropping it stops the read. For a blocking, non-async caller use read_sync.

use xs::{Store, ReadOptions, FollowOption};

let mut rx = store
    .read(ReadOptions::builder().follow(FollowOption::On).build())
    .await;
while let Some(frame) = rx.recv().await {
    if frame.topic == "xs.threshold" {
        // caught up to live; everything after this is new
        continue;
    }
    println!("{} {}", frame.id, frame.topic);
}
Source

pub fn read_sync( &self, options: ReadOptions, ) -> impl Iterator<Item = Frame> + '_

Replay matching historical frames as a blocking iterator.

This honours the topic, from, after, limit, and last parts of ReadOptions but ignores follow: it never streams live appends. Use read when you need to follow.

use xs::{Store, ReadOptions};

let opts = ReadOptions::builder().topic("clip.*".to_string()).last(10).build();
for frame in store.read_sync(opts) {
    println!("{} {}", frame.id, frame.topic);
}
Source

pub fn nu_modules_at(&self, as_of: &Scru128Id) -> HashMap<String, Integrity>

Returns the current module state as of a given point in the stream.

Scans all frames up to (and including) as_of and returns a mapping of module name to CAS hash for the latest frame on each xs.module.<name> topic. Resolve the set of registered Nushell modules as of a given frame ID.

Scans xs.module.<name> frames up to and including as_of and returns a map from module name to the content hash of its latest definition. Used by the scripting runtime; rarely needed when embedding the store directly.

Source

pub fn get(&self, id: &Scru128Id) -> Option<Frame>

Fetch a single frame by ID, or None if no such frame exists.

Source

pub fn remove(&self, id: &Scru128Id) -> Result<(), Error>

Delete a frame and its topic index entries. Removing a frame that does not exist is a no-op and returns Ok(()).

This removes the stream entry only; any payload bytes in the content-addressed store are left in place.

Source

pub async fn cas_reader(&self, hash: Integrity) -> Result<Reader>

Open a streaming reader for the payload identified by hash.

Source

pub fn cas_reader_sync(&self, hash: Integrity) -> Result<SyncReader>

Blocking variant of cas_reader.

Source

pub async fn cas_writer(&self) -> Result<Writer>

Open a streaming writer; finish it to obtain the payload’s integrity hash.

Source

pub fn cas_writer_sync(&self) -> Result<SyncWriter>

Blocking variant of cas_writer.

Source

pub async fn cas_insert(&self, content: impl AsRef<[u8]>) -> Result<Integrity>

Store content and return its integrity hash, ready to attach to a Frame::hash.

Source

pub fn cas_insert_sync(&self, content: impl AsRef<[u8]>) -> Result<Integrity>

Blocking variant of cas_insert.

Source

pub async fn cas_insert_bytes(&self, bytes: &[u8]) -> Result<Integrity>

Convenience wrapper over cas_insert for a byte slice.

Source

pub fn cas_insert_bytes_sync(&self, bytes: &[u8]) -> Result<Integrity>

Blocking variant of cas_insert_bytes.

Source

pub async fn cas_read(&self, hash: &Integrity) -> Result<Vec<u8>>

Read back the full payload for hash into a Vec<u8>.

Source

pub fn cas_read_sync(&self, hash: &Integrity) -> Result<Vec<u8>>

Blocking variant of cas_read.

Source

pub fn insert_frame(&self, frame: &Frame) -> Result<(), Error>

Persist a frame exactly as given, including its existing id, without broadcasting it to live readers or scheduling TTL garbage collection.

Most callers want append instead, which assigns a fresh ID, handles ephemeral and Last retention, and notifies subscribers. Use insert_frame only when you are reconstructing a stream with predetermined IDs (for example when restoring a backup).

Source

pub fn append(&self, frame: Frame) -> Result<Frame, Error>

Append a frame to the stream and return it with its freshly assigned id.

This is the primary write path. It:

  • assigns a new time-sortable ID (overwriting any ID on the input);
  • validates the topic (see validate_topic);
  • persists the frame, unless its TTL is TTL::Ephemeral, in which case it is only broadcast to live readers;
  • schedules garbage collection for TTL::Last retention;
  • broadcasts the frame to everyone currently in a following read.

Appends are serialized internally, so frames are assigned IDs and delivered to subscribers in a consistent order.

§Errors

Returns an error if the topic is invalid or the underlying write fails.

use xs::{Store, Frame, TTL};

let hash = store.cas_insert("hello clipboard").await?;
let frame = store.append(
    Frame::builder("clip.add").hash(hash).ttl(TTL::Last(100)).build(),
)?;
println!("appended {}", frame.id);

Trait Implementations§

Source§

impl Clone for Store

Source§

fn clone(&self) -> Store

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 !RefUnwindSafe for Store

§

impl !UnwindSafe for Store

§

impl Freeze for Store

§

impl Send for Store

§

impl Sync for Store

§

impl Unpin for Store

§

impl UnsafeUnpin for Store

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> CompatExt for T

Source§

fn compat(self) -> Compat<T>
where T: Sized,

Applies the Compat adapter by value. Read more
Source§

fn compat_ref(&self) -> Compat<&T>

Applies the Compat adapter by shared reference. Read more
Source§

fn compat_mut(&mut self) -> Compat<&mut T>

Applies the Compat adapter by mutable reference. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

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> 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> IntoSpanned for T

Source§

fn into_spanned(self, span: Span) -> Spanned<T>

Wrap items together with a span into Spanned. Read more
Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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 = Infallible

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<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