Skip to main content

Stream

Struct Stream 

Source
pub struct Stream<T> { /* private fields */ }
Expand description

Defines a typed best-effort resumable message Stream owned by one Flow type.

Register the same definition in exactly one crate::PersistenceSchema. Clones share identity and may be used at Client and Step call sites. T implements Value when messages are written or read. Prefer a module-level std::sync::LazyLock definition. Capacity is a shared approximate retention budget across executions of the Flow type, not a maximum message size. Old messages can be trimmed. Streams are progress output, not durable proof that an application mutation committed. The shared budget covers one Flow type and Stream name across all Flow IDs. Background trimming removes oldest messages. At capacity a Client write can return ResourceExhausted; a message larger than the capacity can never fit and must not be retried unchanged.

Step writes also heartbeat without clearing the last checkpoint. They can be observed before the handler finishes and can repeat after retry or replay. Client reads use opaque resume tokens; pass each token unchanged. Use crate::Client::read_stream_with_timeout for forward long polling and crate::Client::list_stream_messages for newest-first retained pages.

use dex_sdk::{Context, HandlerResult, Stream};
use std::sync::LazyLock;
static PROGRESS: LazyLock<Stream<String>> =
    LazyLock::new(|| Stream::new("progress", 1024 * 1024));
fn report_progress(context: &mut Context) -> HandlerResult<()> {
    let writer = PROGRESS.buffered_text(context)?;
    writer.write("Processing started")?;
    writer.write("Processing finished")?;
    Ok(())
}

Implementations§

Source§

impl<T> Stream<T>

Source

pub fn new(name: impl Into<String>, stream_capacity_bytes: i64) -> Self

Creates a Stream with a positive approximate budget shared by all instances of its Flow.

§Panics

Panics when name is empty or stream_capacity_bytes is not positive.

Source

pub fn name(&self) -> &str

Returns the stable logical Stream name.

Source

pub fn stream_capacity_bytes(&self) -> i64

Returns the approximate shared byte budget.

Source

pub fn write(&self, context: &mut Context, value: T) -> HandlerResult<()>
where T: Value,

Appends one message immediately from the current Step execution.

§Errors

Returns crate::HandlerError for RPC or Flow timeout Contexts, unregistered Streams, encoding failures, cancellation, or a closed Worker output stream. Dex storage failures are not acknowledged.

Source§

impl Stream<String>

Source

pub fn buffered_text( &self, context: &mut Context, ) -> HandlerResult<BufferedTextStream>

Creates an invocation-managed writer with a one-second interval and 16 KiB threshold.

The Worker flushes remaining text before the handler result or error. The writer preserves chunks exactly, ignores empty chunks, and never splits a chunk. An empty buffer does not heartbeat. Retry does not restore unsent text and can repeat batches already sent. The threshold is soft: one large chunk can exceed it. See Stream for an example; the invocation owns final flushing.

§Errors

Returns HandlerError unless this registered String Stream is used by an active Step.

Source

pub fn buffered_text_with_options( &self, context: &mut Context, options: BufferedTextStreamOptions, ) -> HandlerResult<BufferedTextStream>

Creates an invocation-managed writer with explicit buffering settings.

§Errors

Returns HandlerError for invalid settings, an unregistered Stream, cancellation, or a Context that does not belong to a Step.

Trait Implementations§

Source§

impl<T: Clone> Clone for Stream<T>

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<T: Debug> Debug for Stream<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<T> Forget for Stream<T>

§

impl<T> Freeze for Stream<T>
where PhantomData<fn() -> T>: Freeze,

§

impl<T> RefUnwindSafe for Stream<T>
where PhantomData<fn() -> T>: RefUnwindSafe,

§

impl<T> Send for Stream<T>
where PhantomData<fn() -> T>: Send,

§

impl<T> Sync for Stream<T>
where PhantomData<fn() -> T>: Sync,

§

impl<T> Unpin for Stream<T>
where PhantomData<fn() -> T>: Unpin,

§

impl<T> UnsafeUnpin for Stream<T>
where PhantomData<fn() -> T>: UnsafeUnpin,

§

impl<T> UnwindSafe for Stream<T>
where PhantomData<fn() -> T>: UnwindSafe,

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