2024-06-28 10:16:03 +02:00
//go:build linux || darwin
2024-06-25 09:58:04 +02: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
}