Skip to content

Commit

Permalink
feat: wasi-component-adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
apskhem committed Dec 14, 2023
1 parent ba5e604 commit 0eedb8c
Show file tree
Hide file tree
Showing 15 changed files with 3,922 additions and 4 deletions.
1 change: 1 addition & 0 deletions hermes/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ resolver = "2"
members = [
"bin",
"crates/cardano-chain-follower",
"crates/wasi-component-adapter",
]

[workspace.package]
Expand Down
20 changes: 16 additions & 4 deletions hermes/Earthfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,24 @@ VERSION 0.7
fork-wasi-component-adapter:
LOCALLY

RUN if [ -e crates/wasi-component-adapter/Earthfile ]; then mv crates/wasi-component-adapter/Earthfile crates/Earthfile-tmp; fi && \
rm -rf crates/wasi-component-adapter/ || true && \
# The location the Earthfile for the local `wasi` crate.
ARG wasi_earthfile=crates/wasi-component-adapter/Earthfile
# The location to store the Earthfile during running the script.
ARG wasi_tmp_earthfile=crates/Earthfile-tmp
# The local directory to place the extracted `wasi` crate.
ARG wasi_local_dir=crates/wasi-component-adapter
# The location after the `wasmtime` repo was cloned.
ARG wasi_git_dir=wasmtime/crates/wasi-preview1-component-adapter

# First, it needs to move the existing Earthfile to the temporary location.
# Then remove the existing local one. Clone and extract it from the repo.
# And finally move the Earthfile back.
RUN if [ -e $wasi_earthfile ]; then mv $wasi_earthfile $wasi_tmp_earthfile; fi && \
rm -rf $wasi_local_dir/ || true && \
git clone --depth 1 https://github.com/bytecodealliance/wasmtime.git && \
mv wasmtime/crates/wasi-preview1-component-adapter crates/wasi-component-adapter && \
mv $wasi_git_dir $wasi_local_dir && \
rm -rf wasmtime/ && \
if [ -e crates/Earthfile-tmp ]; then mv crates/Earthfile-tmp crates/wasi-component-adapter/Earthfile; fi
if [ -e $wasi_tmp_earthfile ]; then mv $wasi_tmp_earthfile $wasi_earthfile; fi

# Set up our target toolchains, and copy our files.
builder:
Expand Down
29 changes: 29 additions & 0 deletions hermes/crates/wasi-component-adapter/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
[package]
name = "wasi-preview1-component-adapter"
version.workspace = true
authors.workspace = true
edition.workspace = true
publish = false

[lints]
workspace = true

[dependencies]
wasi = { version = "0.11.0", default-features = false }
wit-bindgen = { workspace = true, default-features = false, features = ["macros"] }
byte-array-literals = { workspace = true }

[build-dependencies]
wasm-encoder = { workspace = true }
object = { workspace = true, default-features = false, features = ["archive"] }

[lib]
test = false
crate-type = ["cdylib"]
name = "wasi_snapshot_preview1"

[features]
default = ["reactor"]
reactor = []
command = []
proxy = []
3 changes: 3 additions & 0 deletions hermes/crates/wasi-component-adapter/Earthfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Set up our target toolchains, and copy our files.
builder:
FROM github.com/input-output-hk/catalyst-ci/earthly/rust:v2.0.3+rust-base
63 changes: 63 additions & 0 deletions hermes/crates/wasi-component-adapter/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# `wasi_snapshot_preview1.wasm`

> **Note**: This repository is a work in progress. This is intended to be an
> internal tool which not everyone has to look at but many might rely on. You
> may need to reach out via issues or
> [Zulip](https://bytecodealliance.zulipchat.com/) to learn more about this
> repository.
This repository currently contains an implementation of a WebAssembly module:
`wasi_snapshot_preview1.wasm`. This module bridges the `wasi_snapshot_preview1`
ABI to the preview2 ABI of the component model. At this time the preview2 APIs
themselves are not done being specified so a local copy of `wit/*.wit` is used
instead.

## Building

This adapter can be built with:

```sh
$ cargo build -p wasi-preview1-component-adapter --target wasm32-unknown-unknown --release
```

And the artifact will be located at
`target/wasm32-unknown-unknown/release/wasi_snapshot_preview1.wasm`.

This by default builds a "reactor" adapter which means that it only provides
adaptation from preview1 to preview2. Alternatively you can also build a
"command" adapter by passing `--features command --no-default-features` which
will additionally export a `run` function entrypoint. This is suitable for use
with preview1 binaries that export a `_start` function.

Alternatively the latest copy of the command and reactor adapters can be
[downloaded from the `dev` tag assets][dev-tag]

[dev-tag]: https://github.com/bytecodealliance/wasmtime/releases/tag/dev

## Using

With a `wasi_snapshot_preview1.wasm` file on-hand you can create a component
from a module that imports WASI functions using the [`wasm-tools`
CLI](https://github.com/bytecodealliance/wasm-tools)

```sh
$ cat foo.rs
fn main() {
println!("Hello, world!");
}
$ rustc foo.rs --target wasm32-wasi
$ wasm-tools print foo.wasm | grep '(import'
(import "wasi_snapshot_preview1" "fd_write" (func ...
(import "wasi_snapshot_preview1" "environ_get" (func ...
(import "wasi_snapshot_preview1" "environ_sizes_get" ...
(import "wasi_snapshot_preview1" "proc_exit" (func ...
$ wasm-tools component new foo.wasm --adapt wasi_snapshot_preview1.wasm -o component.wasm

# Inspect the generated `component.wasm`
$ wasm-tools validate component.wasm --features component-model
$ wasm-tools component wit component.wasm
```
Here the `component.wasm` that's generated is a ready-to-run component which
imports wasi preview2 functions and is compatible with the wasi-preview1-using
module internally.
Loading

0 comments on commit 0eedb8c

Please sign in to comment.