Skip to content
This repository was archived by the owner on Jul 10, 2025. It is now read-only.
This repository was archived by the owner on Jul 10, 2025. It is now read-only.

Accessing host context from within runtime - passing arguments to function invocations #98

@joepio

Description

@joepio

I want to give my plugins access to stuff on the host's database. What I'd normally do, is pass my Store struct around, which contains methods that you can do to get access to the database. Of course I can't do this with plugins, as the Store cannot pass the memory boundary. So what I could do, is create a query function in my host, and expose that in the plugin runtime. That query function will still need to access my Store. In some programming languages, you might use some global context and take the Store from there, but that's not an option in Rust I think: I need to pass my Store explicitly to my new query function. But how can I do this?

However, I have no idea on how I can then pass some context to my runtime, so that my runtime knows which Store it will need to get data from.

What I think I need, is define something like this in my host:

fn my_complex_imported_function(query: Query, host_store: Store) -> ComplexHostToGuest {
    host_store.perform_query(query)
}

But my protocol needs to have something like this:

fn my_complex_imported_function(query: Query) -> ComplexHostToGuest

See what I'm getting at? Maybe I'm approaching this all wrong, but I fail to see how I can pass something to host functions from the host itself.

Maybe Runtime::new() could take a Context argument, which the user defines. This context is then passed to every function in the host's context, as the first argument. Not sure how difficult this is, but seems reasonable, as the user will have the context known when instantiating the Runtime. Note that this Context does not need to be available in the Runtime itself, but only by the host. This means that we could pass arguments that are not properly mapped using fp-bindgen, such as my Store in the example above.

note: @Zagitta has already let me know in Discord that they're working on a prototype to do something like this

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions