Skip to main content

Crate resuma

Crate resuma 

Source
Expand description

§Resuma

SSR + resumability for Rust — components run on the server only; the browser resumes serialized signals and lazy handler chunks instead of re-hydrating the tree.

§Quick start

use resuma::prelude::*;

#[component]
fn Counter() -> View {
    let n = use_signal(0);
    view! {
        <button onClick={move |_| n.update(|v| *v += 1)}>{n}</button>
    }
}

#[tokio::main]
async fn main() -> std::io::Result<()> {
    ResumaApp::new()
        .page("/", || Counter::render(CounterProps::default()))
        .serve(ServeOptions::default())
        .await
}

Install the CLI: cargo install resuma. Narrative guides live at resuma-docs.fly.dev.

§Resumability model (v0.3)

  • Every #[component] is a resumable boundary — handlers register under /_resuma/handler/{Component}.js and prefetch when the boundary enters the viewport.
  • computed!, effect!, and debounce! translate Rust closures to client-replayable JS via rs2js (in resuma-macros).
  • Plain use_computed / use_effect run on SSR only; use the macros when the browser must replay derived state or side effects.
  • #[island] is optional — for heavy lazy bundles, load = "visible", or dev HMR.

§Crate layout

ModuleRole
coreSignals, View, RenderContext, ResumePayload
ssrHTML rendering + embedded resumability payload
[server]axum HTTP, ResumaApp, /_resuma/* assets
flowFlowApp, file-based pages, #[load], #[submit]
routerPage discovery scanner
cliresuma new / dev / build (feature cli)

Users depend on resuma only; resuma-macros is a separate proc-macro crate required by the build.

§Re-exports

Most apps start with prelude (use resuma::prelude::*). Macros (view!, #[component], #[server], Flow attributes) and common types are re-exported at the crate root for convenience.

Re-exports§

pub use crate::client::client_component;
pub use crate::client::client_script_url;
pub use crate::client::ClientComponent;
pub use crate::client::CLIENT_SCRIPT_PREFIX;
pub use crate::core::combine_js;
pub use crate::core::error_boundary;
pub use crate::core::error_boundary;
pub use crate::core::no_serialize;
pub use crate::core::portal;
pub use crate::core::portal;
pub use crate::core::provide_context;
pub use crate::core::provide_theme;
pub use crate::core::push_slots;
pub use crate::core::resolve_slot;
pub use crate::core::show;
pub use crate::core::show;
pub use crate::core::stream_chunk;
pub use crate::core::stream_slot;
pub use crate::core::theme_css_vars;
pub use crate::core::use_computed;
pub use crate::core::use_computed_with_js;
pub use crate::core::use_context;
pub use crate::core::use_debounce;
pub use crate::core::use_effect;
pub use crate::core::use_signal;
pub use crate::core::use_store;
pub use crate::core::use_task;
pub use crate::core::use_theme;
pub use crate::core::use_visible_task;
pub use crate::core::visible_task_js;
pub use crate::core::with_default_slot;
pub use crate::core::with_view_transition;
pub use crate::core::Child;
pub use crate::core::Component;
pub use crate::core::Computed;
pub use crate::core::ContextId;
pub use crate::core::Effect;
pub use crate::core::FlowRequest;
pub use crate::core::IntoView;
pub use crate::core::NoSerialize;
pub use crate::core::ReadSignal;
pub use crate::core::RenderContext;
pub use crate::core::RenderMode;
pub use crate::core::Result;
pub use crate::core::ResumaError;
pub use crate::core::ResumePayload;
pub use crate::core::Signal;
pub use crate::core::SlotGuard;
pub use crate::core::SlottedChild;
pub use crate::core::Store;
pub use crate::core::Theme;
pub use crate::core::View;
pub use crate::core::WriteSignal;
pub use crate::server::configure_security;
pub use crate::server::register_server_action;
pub use crate::server::set_action_middleware;
pub use crate::server::ResumaApp;
pub use crate::server::SecurityConfig;
pub use crate::server::ServeOptions;
pub use crate::server::CSRF_FIELD;
pub use crate::server::CSRF_HEADER;
pub use crate::ssr::render_to_stream;
pub use crate::ssr::render_to_string;
pub use crate::ssr::render_view;
pub use crate::ssr::PageOptions;
pub use crate::flow::apply_layouts;
pub use crate::flow::current_request;
pub use crate::flow::discover_pages;
pub use crate::flow::encode_submit_result;
pub use crate::flow::error_page;
pub use crate::flow::extract_redirect;
pub use crate::flow::form;
pub use crate::flow::form;
pub use crate::flow::load_boundary;
pub use crate::flow::not_found_page;
pub use crate::flow::redirect;
pub use crate::flow::redirect;
pub use crate::flow::register_layout;
pub use crate::flow::register_loader;
pub use crate::flow::register_loader_cache;
pub use crate::flow::register_middleware;
pub use crate::flow::register_stream_chunk;
pub use crate::flow::register_stream_loader;
pub use crate::flow::register_submit;
pub use crate::flow::try_use_load;
pub use crate::flow::try_use_load_value;
pub use crate::flow::use_load;
pub use crate::flow::with_request;
pub use crate::flow::DiscoveredPage;
pub use crate::flow::FlowApp;
pub use crate::flow::FlowError;
pub use crate::flow::FlowExtensions;
pub use crate::flow::FlowPageRegistry;
pub use crate::flow::FlowPwaConfig;
pub use crate::flow::FlowServeOptions;
pub use crate::flow::LoadValue;
pub use crate::flow::LoaderError;
pub use crate::flow::Redirect;
pub use crate::flow::SubmitError;
pub use crate::flow::SubmitValue;

Modules§

cli
Resuma developer CLI — resuma new, resuma dev, resuma build, resuma routes.
client
TypeScript / JavaScript client components — prebuilt ESM bundles outside the resumability runtime.
core
Resuma Core
flow
Resuma Flow — full-stack pages, loaders, submits, and middleware on top of ResumaApp.
prelude
Convenient re-exports for application code.
router
File-based page discovery for Resuma Flow.
server
Resuma HTTP server.
ssr
Server-Side Rendering for Resuma.

Macros§

computed
computed!([deps…], move || …) — derived signal with client replay (rs2js-translated).
debounce
debounce!([deps…], ms, move || …) — debounced client reaction (rs2js-translated).
effect
effect!([signals…], move || { … }) — client-replayable side effect (rs2js).
js
js! — raw JavaScript escape hatch for event handlers.
view
view! — JSX-like template macro.

Functions§

run
CLI entry point (cargo install resuma).

Attribute Macros§

component
#[component] — resumable component with generated props builder.
island
#[island] — optional interactive boundary for heavy or visibility-gated JS.
layout
#[layout] — Resuma Flow layout wrapper.
load
#[load] — Resuma Flow server data loader.
middleware
#[middleware] — Resuma Flow request middleware.
server
#[server] — exposes an async fn as a server action.
submit
#[submit] — Resuma Flow form submission handler.