2024-06-28 08:16:03 +00:00
|
|
|
//go:build linux || darwin
|
2024-06-25 07:58:04 +00:00
|
|
|
|
|
|
|
package plugins
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"github.com/stealthrocket/wasi-go/imports"
|
|
|
|
wazergo_wasip1 "github.com/stealthrocket/wasi-go/imports/wasi_snapshot_preview1"
|
|
|
|
"github.com/stealthrocket/wazergo"
|
|
|
|
"github.com/tetratelabs/wazero"
|
|
|
|
wazero_wasip1 "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1"
|
|
|
|
)
|
|
|
|
|
|
|
|
type ContextApplier func(ctx context.Context) context.Context
|
|
|
|
|
|
|
|
// InstantiateHost instantiates the Host module according to the guest requirements (for now only SocketExtensions).
|
|
|
|
func InstantiateHost(ctx context.Context, runtime wazero.Runtime, mod wazero.CompiledModule, settings Settings) (ContextApplier, error) {
|
|
|
|
if extension := imports.DetectSocketsExtension(mod); extension != nil {
|
|
|
|
envs := []string{}
|
|
|
|
for _, env := range settings.Envs {
|
|
|
|
envs = append(envs, fmt.Sprintf("%s=%s", env, os.Getenv(env)))
|
|
|
|
}
|
|
|
|
|
|
|
|
builder := imports.NewBuilder().WithSocketsExtension("auto", mod)
|
|
|
|
if len(envs) > 0 {
|
|
|
|
builder.WithEnv(envs...)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(settings.Mounts) > 0 {
|
|
|
|
builder.WithDirs(settings.Mounts...)
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx, sys, err := builder.Instantiate(ctx, runtime)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
inst, err := wazergo.Instantiate(ctx, runtime, wazergo_wasip1.NewHostModule(*extension), wazergo_wasip1.WithWASI(sys))
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("wazergo instantiation: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return func(ctx context.Context) context.Context {
|
|
|
|
return wazergo.WithModuleInstance(ctx, inst)
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err := wazero_wasip1.Instantiate(ctx, runtime)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("wazero instantiation: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return func(ctx context.Context) context.Context {
|
|
|
|
return ctx
|
|
|
|
}, nil
|
|
|
|
}
|