mirror of
				https://github.com/traefik/traefik.git
				synced 2025-10-31 16:31:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| //go:build linux || darwin
 | |
| 
 | |
| 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
 | |
| }
 |