#wasm-component #wasi #wasm-module #wasm-binary #adapter #system-interface

wasi-preview1-component-adapter-provider

Embedded wasi-preview1-component-adapter binaries

3 stable releases

new 24.0.0 Aug 20, 2024
23.0.2 Aug 12, 2024
23.0.1 Jul 22, 2024

#748 in WebAssembly

Download history 156/week @ 2024-07-20 359/week @ 2024-07-27 363/week @ 2024-08-03 699/week @ 2024-08-10 7170/week @ 2024-08-17

8,674 downloads per month
Used in 6 crates (4 directly)

Apache-2.0 WITH LLVM-exception

45KB

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]).

No runtime deps