#wasi #wasmtime #component-model

omnia-sdk

SDK for building WASI component guests with Omnia runtime support

3 releases (breaking)

Uses new Rust 2024

0.30.0 Mar 31, 2026
0.29.0 Mar 27, 2026
0.28.0 Feb 24, 2026

#2490 in WebAssembly

MIT/Apache

230KB
4K SLoC

Omnia SDK

Shared traits, error types, and abstractions for building WASI guest components. This crate provides the glue between your business logic and the Omnia runtime capabilities.

Quick Start

Use the guest! macro to define your component's API surface. This wires up the necessary WASI exports and routing logic.

use omnia_sdk::{guest, Handler, Json};
use serde::{Deserialize, Serialize};

// Define your data models
#[derive(Deserialize)]
struct CreateItem {
    name: String,
}

#[derive(Serialize)]
struct ItemResponse {
    id: String,
    name: String,
}

// Define the provider (capabilities your app needs)
struct MyProvider;

// Wire up the application
guest!({
    owner: "my-org",
    provider: MyProvider,
    http: [
        "/items": post(CreateItem with_body, ItemResponse),
    ],
});

// Implement the handler for the request
impl Handler<MyProvider> for CreateItem {
    type Response = ItemResponse;

    async fn handle(self, _provider: &MyProvider) -> Result<Self::Response, omnia_sdk::Error> {
        Ok(ItemResponse {
            id: "123".to_string(),
            name: self.name,
        })
    }
}

Capabilities

The SDK exposes trait-based abstractions for host capabilities. When compiled to wasm32, these delegate to WASI host calls.

Trait Purpose
Config Read configuration values from the host.
HttpRequest Make outbound HTTP requests.
Publish Publish messages to a topic.
StateStore Get/set/delete key-value state with optional TTL.
Identity Obtain access tokens from an identity provider.
TableStore Execute SQL queries and statements via the ORM layer.
Broadcast Send events over WebSocket channels.

Example: Using Capabilities

use omnia_sdk::{StateStore, Publish, Message};

async fn process(provider: &impl StateStore + Publish) -> anyhow::Result<()> {
    // Store some state
    provider.set("last_run", b"now", None).await?;

    // Publish a message
    let msg = Message::new(b"job_completed");
    provider.send("jobs.events", &msg).await?;

    Ok(())
}

Error Handling

The crate provides an Error enum with HTTP-aware variants (BadRequest, NotFound, ServerError, BadGateway) and helper macros for ergonomic error creation.

use omnia_sdk::{bad_request, server_error, not_found};

fn validate(name: &str) -> Result<(), omnia_sdk::Error> {
    if name.is_empty() {
        return Err(bad_request!("name cannot be empty"));
    }
    Ok(())
}

Architecture

See the workspace documentation for the full architecture guide.

License

MIT OR Apache-2.0

Dependencies

~8–44MB
~641K SLoC