Skip to main content

AppState

Struct AppState 

Source
pub struct AppState {
    pub store: Arc<dyn Store>,
    pub engine: Arc<Engine>,
    pub jwt_config: Arc<JwtConfig>,
    pub worker_token: String,
    pub event_sender: Sender<Event>,
    pub event_bus: Option<WorkflowEventBus>,
    pub blob_store: Option<Arc<dyn BlobStore>>,
}
Expand description

Global application state.

Holds the shared store (runs, users, API keys, secrets) and engine, extracted by handlers using Axum’s state extraction mechanism.

§Examples

use ironflow_api::state::AppState;
use ironflow_auth::jwt::JwtConfig;
use ironflow_store::prelude::*;
use ironflow_store::store::Store;
use ironflow_engine::engine::Engine;
use ironflow_core::providers::claude::ClaudeCodeProvider;
use std::sync::Arc;

let store: Arc<dyn Store> = Arc::new(InMemoryStore::new());
let provider = Arc::new(ClaudeCodeProvider::new());
let engine = Arc::new(Engine::new(store.clone(), provider));
let jwt_config = Arc::new(JwtConfig {
    secret: "secret".to_string(),
    access_token_ttl_secs: 900,
    refresh_token_ttl_secs: 604800,
    cookie_domain: None,
    cookie_secure: false,
});
let broadcaster = ironflow_api::sse::SseBroadcaster::new();
let state = AppState::new(store, engine, jwt_config, "token".to_string(), broadcaster.sender());

Fields§

§store: Arc<dyn Store>

The unified backing store for runs, steps, users, API keys, and secrets.

§engine: Arc<Engine>

The workflow orchestration engine.

§jwt_config: Arc<JwtConfig>

JWT configuration for auth tokens.

§worker_token: String

Static token for worker-to-API authentication.

§event_sender: Sender<Event>

Broadcast sender for SSE event streaming.

§event_bus: Option<WorkflowEventBus>

Per-run event bus for real-time workflow monitoring.

When set, the GET /api/v1/runs/{id}/events route subscribes to this bus and streams WorkflowEvents via SSE. None when the engine was not configured with a bus.

§blob_store: Option<Arc<dyn BlobStore>>

Where artifact bytes live, when artifacts are enabled.

None on a deployment that has not configured artifact storage: the artifact routes answer 501 and every other endpoint is unaffected.

Implementations§

Source§

impl AppState

Source

pub fn new( store: Arc<dyn Store>, engine: Arc<Engine>, jwt_config: Arc<JwtConfig>, worker_token: String, event_sender: Sender<Event>, ) -> Self

Create a new AppState.

When the prometheus feature is enabled, a global Prometheus recorder is installed (once) and its handle is stored in the state.

§Panics

Panics if a Prometheus recorder cannot be installed (should only happen if another incompatible recorder was set elsewhere).

Source

pub fn with_blob_store(self, blob_store: Arc<dyn BlobStore>) -> Self

Enable artifacts by attaching the backend that holds their bytes.

§Examples
use std::sync::Arc;

use ironflow_api::state::AppState;
use ironflow_artifacts::blob_store::BlobStore;
use ironflow_artifacts::local::LocalBlobStore;

let blob: Arc<dyn BlobStore> = Arc::new(LocalBlobStore::new("/var/lib/ironflow/artifacts"));
state.with_blob_store(blob)
Source

pub fn with_event_bus(self, bus: WorkflowEventBus) -> Self

Attach a WorkflowEventBus for per-run SSE streaming.

When set, GET /api/v1/runs/{id}/events streams step-level events for a specific workflow run. When absent the route returns an empty SSE stream (with keep-alive).

§Examples
use ironflow_api::state::AppState;
use ironflow_engine::notify::WorkflowEventBus;

state.with_event_bus(WorkflowEventBus::new())
Source

pub fn blob_store_or_501(&self) -> Result<&Arc<dyn BlobStore>, ApiError>

The artifact backend, or a 501 error when artifacts are disabled.

§Errors

Returns ApiError::ArtifactStorageUnavailable when no backend is attached.

Source

pub async fn get_run_or_404(&self, id: Uuid) -> Result<Run, ApiError>

Fetch a run by ID or return 404.

§Errors

Returns ApiError::RunNotFound if the run does not exist. Returns ApiError::Store if there is a store error.

Source

pub async fn spawn_background_tasks(&self) -> CancellationToken

Spawn the built-in background tasks and return their shared shutdown token.

This starts:

  • Schedule sync: seeds DB rows for handler-declared schedules.
  • Schedule ticker: polls due schedules and creates runs.
  • Reaper: recovers runs abandoned by dead workers.

Call this once after building the AppState, before serving requests. Drop the returned CancellationToken (or call .cancel()) to stop all tasks gracefully.

§Examples
use ironflow_api::state::AppState;

let shutdown = state.spawn_background_tasks().await;
// ... serve requests ...
shutdown.cancel();

Trait Implementations§

Source§

impl Clone for AppState

Source§

fn clone(&self) -> AppState

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 FromRef<AppState> for Arc<dyn Store>

Source§

fn from_ref(state: &AppState) -> Self

Converts to this type from a reference to the input type.
Source§

impl FromRef<AppState> for Arc<JwtConfig>

Source§

fn from_ref(state: &AppState) -> Self

Converts to this type from a reference to the input type.

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> 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> 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> 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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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