Stream: wasmtime

Topic: How do you run a function exported in an interface?


view this post on Zulip Xandaros (Mar 21 2024 at 22:27):

Currently playing around with components, trying to understand how everything fits together. I think I understand the gist of it, but I really struggle with running a function exported from an interface.

I'm using this WIT:

package cluster:main@0.1.0;

interface main {
    test: func(message: string);
}

interface runnable {
    run: func();
}

world cluster {
    import main;
    export runnable;
}

If, instead of export runnable;, I use export run: func();, I can use instance.get_typed_func::<(), ()>(&mut store, "run") on the instance of the component to get a function I can then execute.
However, how do I get this run function if the world is instead exporting this runnable interface?

Using the same invocation, get_typed_func returns an Err. Instead of "run", I have also tried "runnable/run", "cluster:main/run", and some other variations to no avail. The documentation is not particularly helpful here, the Instance::exports function does not appear very helpful either. The option to list everything that is being exported would be quite useful here.

view this post on Zulip Lann Martin (Mar 21 2024 at 23:04):

You can do this with the wasm-tools cli command e.g. wasm-tools dump <wasm> | grep Export

view this post on Zulip Lann Martin (Mar 21 2024 at 23:08):

Programmatically there is also a more recently added introspection mechanism that gives more detail. You can access that via https://docs.rs/wasmtime/latest/wasmtime/component/struct.Linker.html#method.substituted_component_type

view this post on Zulip Xandaros (Mar 21 2024 at 23:29):

Aha! Thank you very much!

I did try wasm-tools component wit, but that wasn't very helpful. With wasm-tools dump, I do find cluster:main/runnable@0.1.0#run, but that is not immediately runnable like that, either.
With the introspection, though, I noticed that it's a separate instance, and I can get the function with

instance
        .exports(&mut store)
        .instance("cluster:main/runnable@0.1.0")
        .unwrap()
        .typed_func::<(), ()>("run")
        .unwrap();

This does mean I need to know the exact version, but I suppose I can use the introspection API to match it more loosely.

I will say, though, substituted_component_type is not something I would have thought useful from the name, nor would I have expected to look for something in Linker. It makes sense in hindsight, though.

view this post on Zulip Alex Crichton (Mar 21 2024 at 23:38):

FWIW the main branch has Component::component_type which should be much more discoverable

view this post on Zulip Xandaros (Mar 21 2024 at 23:56):

Oh yeah, that is much better. Especially with that documentation - very nice


Last updated: Oct 23 2024 at 20:03 UTC