buildr/modules/plugin/discovery.go

71 lines
2.2 KiB
Go
Raw Normal View History

2023-06-18 12:34:20 +00:00
package plugin
import (
"context"
"errors"
"fmt"
"connectrpc.com/connect"
2023-06-18 12:34:20 +00:00
"github.com/tetratelabs/wazero"
"github.com/tetratelabs/wazero/api"
"github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1"
wasiv1 "code.icb4dc0.de/buildr/api/generated/wasi/v1"
"code.icb4dc0.de/buildr/api/generated/wasi/v1/rpcv1connect"
"code.icb4dc0.de/buildr/common/wasirpc"
2023-06-18 12:34:20 +00:00
)
var dummyWithResult = func(ctx context.Context, m api.Module, offset, byteCount uint32) (result uint64) { return 0 }
func DiscoverInventory(ctx context.Context, payload []byte) (inventory *wasiv1.PluginInventoryResponse, err error) {
2023-06-18 12:34:20 +00:00
runtimeConfig := wazero.
NewRuntimeConfig().
WithCloseOnContextDone(true)
r := wazero.NewRuntimeWithConfig(ctx, runtimeConfig)
defer func() {
closeCtx, cancel := context.WithTimeout(context.Background(), runtimeClosingTimeout)
2023-06-18 12:34:20 +00:00
defer cancel()
2023-06-22 16:06:56 +00:00
err = errors.Join(err, r.Close(closeCtx))
2023-06-18 12:34:20 +00:00
}()
_, err = r.NewHostModuleBuilder("buildr").
NewFunctionBuilder().WithFunc(dummyWithResult).Export("log_msg").
2023-06-18 12:34:20 +00:00
NewFunctionBuilder().WithFunc(dummyWithResult).Export("get_state").
NewFunctionBuilder().WithFunc(dummyWithResult).Export("set_state").
NewFunctionBuilder().WithFunc(dummyWithResult).Export("exec").
NewFunctionBuilder().WithFunc(dummyWithResult).Export("lookPath").
2023-06-18 12:34:20 +00:00
Instantiate(ctx)
if err != nil {
return nil, fmt.Errorf("failed to instantiate host module builder: %w", err)
}
closer, err := wasi_snapshot_preview1.Instantiate(ctx, r)
if err != nil {
return nil, fmt.Errorf("failed to instantiate wasi snapshot preview1: %w", err)
}
defer func() {
err = errors.Join(err, closer.Close(context.Background()))
}()
mod, err := r.Instantiate(ctx, payload)
if err != nil {
return nil, fmt.Errorf("failed to instantiate WASI plugin: %w", err)
}
moduleClient, err := wasirpc.NewModuleClient(mod)
2023-06-18 12:34:20 +00:00
if err != nil {
return nil, fmt.Errorf("failed to create module client: %w", err)
2023-06-18 12:34:20 +00:00
}
wasiClient := rpcv1connect.NewWasiExecutorServiceClient(moduleClient, "wasi://pluginToBeDiscovered")
resp, err := wasiClient.PluginInventory(ctx, connect.NewRequest(new(wasiv1.PluginInventoryRequest)))
if err != nil {
return nil, fmt.Errorf("failed to call plugin inventory: %w", err)
2023-06-18 12:34:20 +00:00
}
return resp.Msg, nil
2023-06-18 12:34:20 +00:00
}