You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
Alex Crichton 83029e3fb0
Add `rust-version.workspace = true` to all crates (#9112)
3 months ago
..
artefacts wasi-adapter: Implement provider crate that embeds the adapter binaries [v2] (#8874) 4 months ago
src wasi-adapter: Implement provider crate that embeds the adapter binaries [v2] (#8874) 4 months ago
.gitignore wasi-adapter: Implement provider crate that embeds the adapter binaries [v2] (#8874) 4 months ago
Cargo.toml.in Add `rust-version.workspace = true` to all crates (#9112) 3 months ago
README.md chore(adapters): add README (#9059) 3 months ago

README.md

wasi-preview1-component-adapter-provider

A Bytecode Alliance project

A utility library containing binaries for WASI Preview1 adapters for easy use from Rust.

Crates.io version Download docs.rs docs

wasi-preview1-component-adapter-provider contains the raw bytes of the WASI Preview1 to Preview2 adapters (Reactor, Command, and Proxy).

For example, if you wanted to write the adapter bytes back into a .wasm binary:

use wasi_preview1_component_adapter_provider::WASI_SNAPSHOT_PREVIEW1_REACTOR_ADAPTER;

fn main() {
    std::fs::write(
        "wasi_snapshot_preview1.reactor.wasm",
        WASI_SNAPSHOT_PREVIEW1_REACTOR_ADAPTER
    ).expect("failed to write bytes to file");
}

A more realistic use-case is performing the adaptation step of preparing a WASI Preview2 component from an existing WASI Preview1 component:

use wasi_preview1_component_adapter_provider::WASI_SNAPSHOT_PREVIEW1_REACTOR_ADAPTER;
use wit_component::ComponentEncoder;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let wasm_p1_bytes = std::fs::read("path/to/your/your-component.p1.wasm");

    let wasm_p2_bytes = ComponentEncoder::default()
        .module(&wasm_module_bytes)?
        .adapter(
            "wasi_snapshot_preview1",
            WASI_SNAPSHOT_PREVIEW1_REACTOR_ADAPTER,
        )?
        .validate(true)
        .encode()?;

    std::fs::write("your-component.p2.wasm", wasm_p2_bytes)?;

    Ok(())
}

What is a component adapter?

Code compiled to WebAssembly as described by the base WebAssembly Spec is considered a WebAssembly "module" or "core module".

To robustly support rich types, composition, and easier interoperability, the Component Model was created and is the spec that governs the idea of a "WebAssembly component". The component model wraps any existing WebAssembly core module(s) and extends them with additional features.

To standardize underlying system interoperability (ex. reading files, system time) in code compiled to WebAssembly, the WebAssembly System Interface ("WASI") was created. WASI is implemented by language tool chains (ex. Rust supports wasm32-wasi/wasm32-wasip1 as a target, with support for wasm32-wasip2 on the way), and enables compiling a WebAssembly component that utilizes the interfaces that make up WASI Preview1.

In the ongoing work of building WASI, WASI Preview2 which contains more functionality has been released -- but building directly to Preview2 is not yet integrated into language toolchains. However, Preview1 components (which can be produced by curren toolchains) can be adapted to WASI Preview2.

This is where component adapters come in.

Component Adapters are WebAssembly binaries that contain logic that can take any WebAssembly binary implemented in terms of WASI Preview1 and convert them to WASI Preview2.

This crate contains the binary content of those the adapter WebAssembly binaries, made accessible as constant arrays of bytes (const &[u8]).