Stream: wasmtime

Topic: Explicitly using wasi:* in component


view this post on Zulip Jeff Parsons (Sep 18 2023 at 22:16):

I am trying to export a wasi-http incoming-handler from my component. I have copied Wasmtime's version of the WASI wit files into a deps/ directory alongside the definition of my world (in both the guest and host crates), and that seems to be enough to make cargo-component happy (able to resolve references to WASI stuff). However, the Wasmtime side of things using component::bindgen! is not so happy:

error: failed to find package `wasi:http` in `deps` directory
            --> /home/jeff/aaa/wit/deps/job-server.wit:7:12
             |
           7 |     export wasi:http/incoming-handler
             |            ^--------
 --> src/main.rs:7:1
  |
7 | wasmtime::component::bindgen!("job-server" in "wit/deps");
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: this error originates in the macro `wasmtime::component::bindgen` (in Nightly builds, run with -Z macro-backtrace for more info)

I can't find any options on the component::bindgen! macro to tell it how to resolve dependencies referenced in my world definition.

Here is my component world:

package jeffparsons:job-server

world job-server {
    export hello-world: func() -> string

    export wasi:http/incoming-handler
}

And here's what my host's wit/ dir looks like:

~/Projects/aaa took 5s> find -L wit
wit
wit/deps
wit/deps/wasi
wit/deps/wasi/filesystem
wit/deps/wasi/filesystem/world.wit
wit/deps/wasi/filesystem/types.wit
wit/deps/wasi/filesystem/preopens.wit
wit/deps/wasi/logging
wit/deps/wasi/logging/logging.wit
wit/deps/wasi/clocks
wit/deps/wasi/clocks/timezone.wit
wit/deps/wasi/clocks/monotonic-clock.wit
wit/deps/wasi/clocks/wall-clock.wit
wit/deps/wasi/io
wit/deps/wasi/io/streams.wit
wit/deps/wasi/poll
wit/deps/wasi/poll/poll.wit
wit/deps/wasi/random
wit/deps/wasi/random/insecure-seed.wit
wit/deps/wasi/random/insecure.wit
wit/deps/wasi/random/random.wit
wit/deps/wasi/cli
wit/deps/wasi/cli/command.wit
wit/deps/wasi/cli/run.wit
wit/deps/wasi/cli/stdio.wit
wit/deps/wasi/cli/terminal.wit
wit/deps/wasi/cli/reactor.wit
wit/deps/wasi/cli/environment.wit
wit/deps/wasi/cli/exit.wit
wit/deps/wasi/http
wit/deps/wasi/http/proxy.wit
wit/deps/wasi/http/types.wit
wit/deps/wasi/http/incoming-handler.wit
wit/deps/wasi/http/outgoing-handler.wit
wit/deps/wasi/sockets
wit/deps/wasi/sockets/tcp-create-socket.wit
wit/deps/wasi/sockets/udp-create-socket.wit
wit/deps/wasi/sockets/ip-name-lookup.wit
wit/deps/wasi/sockets/tcp.wit
wit/deps/wasi/sockets/udp.wit
wit/deps/wasi/sockets/network.wit
wit/deps/wasi/sockets/instance-network.wit
wit/deps/job-server.wit

Is this something that is meant to be possible (yet)? Hopefully I've just missed something simple!

From my Cargo.lock:

[[package]]
name = "wasmtime"
version = "13.0.0"
source = "git+https://github.com/bytecodealliance/wasmtime.git?branch=release-13.0.0#d57fc24b5370e05697d718ff1e8412acd04e7bc4"

Thanks! :bow:

(P.S. I'm not sure if this is the right venue for these sorts of end-user questions — please point me in the right direction if not!)

view this post on Zulip Pat Hickey (Sep 18 2023 at 22:18):

this is a totally fine venue for these questions

view this post on Zulip Pat Hickey (Sep 18 2023 at 22:18):

i think you just need to move the contents of wit/deps/wasi to wit/deps

view this post on Zulip Jeff Parsons (Sep 19 2023 at 06:25):

Thanks! I eventually got this working by structuring my wit/ dir like this:

wit/job-server.wit
wit/deps
wit/deps/filesystem
wit/deps/filesystem/world.wit

And invoking the bindgen! macro like this:

wasmtime::component::bindgen!("jeffparsons:job-server/job-server");

I think my mental model of how it would be looking for *.wit files was just wrong; I expected it to be looking for files from some common root, rather than always looking for dependencies beneath a deps/ directory as a sibling of the package you're generating bindings for.

I've started using wit-deps to manage this dir, so in practice the wit/job-server.wit listed above is actually a symlink to wit/deps/job-server/world.wit. It feels a bit weird, but it works!!


Last updated: Dec 23 2024 at 13:07 UTC