orama/pkg/serverless/execution/lifecycle.go
2026-02-11 07:24:27 +02:00

84 lines
2.1 KiB
Go

package execution
import (
"context"
"fmt"
"github.com/tetratelabs/wazero"
"go.uber.org/zap"
)
// ModuleLifecycle manages the lifecycle of WASM modules.
type ModuleLifecycle struct {
runtime wazero.Runtime
logger *zap.Logger
}
// NewModuleLifecycle creates a new ModuleLifecycle manager.
func NewModuleLifecycle(runtime wazero.Runtime, logger *zap.Logger) *ModuleLifecycle {
return &ModuleLifecycle{
runtime: runtime,
logger: logger,
}
}
// CompileModule compiles WASM bytecode into a compiled module.
func (m *ModuleLifecycle) CompileModule(ctx context.Context, wasmCID string, wasmBytes []byte) (wazero.CompiledModule, error) {
if len(wasmBytes) == 0 {
return nil, fmt.Errorf("WASM bytes cannot be empty")
}
compiled, err := m.runtime.CompileModule(ctx, wasmBytes)
if err != nil {
return nil, fmt.Errorf("failed to compile WASM module %s: %w", wasmCID, err)
}
m.logger.Debug("Module compiled successfully",
zap.String("wasm_cid", wasmCID),
zap.Int("size_bytes", len(wasmBytes)),
)
return compiled, nil
}
// CloseModule closes a compiled module and releases its resources.
func (m *ModuleLifecycle) CloseModule(ctx context.Context, module wazero.CompiledModule, wasmCID string) error {
if module == nil {
return nil
}
if err := module.Close(ctx); err != nil {
m.logger.Warn("Failed to close module",
zap.String("wasm_cid", wasmCID),
zap.Error(err),
)
return err
}
m.logger.Debug("Module closed successfully", zap.String("wasm_cid", wasmCID))
return nil
}
// CloseModules closes multiple compiled modules.
func (m *ModuleLifecycle) CloseModules(ctx context.Context, modules map[string]wazero.CompiledModule) []error {
var errors []error
for cid, module := range modules {
if err := m.CloseModule(ctx, module, cid); err != nil {
errors = append(errors, fmt.Errorf("failed to close module %s: %w", cid, err))
}
}
return errors
}
// ValidateModule performs basic validation on compiled module.
func (m *ModuleLifecycle) ValidateModule(module wazero.CompiledModule) error {
if module == nil {
return fmt.Errorf("module is nil")
}
// Additional validation could be added here
return nil
}