summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-ffmpreg/wasm/instance.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/codeberg.org/gruf/go-ffmpreg/wasm/instance.go')
-rw-r--r--vendor/codeberg.org/gruf/go-ffmpreg/wasm/instance.go89
1 files changed, 89 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-ffmpreg/wasm/instance.go b/vendor/codeberg.org/gruf/go-ffmpreg/wasm/instance.go
new file mode 100644
index 000000000..d2eccd9e9
--- /dev/null
+++ b/vendor/codeberg.org/gruf/go-ffmpreg/wasm/instance.go
@@ -0,0 +1,89 @@
+package wasm
+
+import (
+ "context"
+ "io"
+ "unsafe"
+
+ "github.com/tetratelabs/wazero"
+ "github.com/tetratelabs/wazero/api"
+ "github.com/tetratelabs/wazero/sys"
+)
+
+// CoreFeatures are the WebAssembly Core specification
+// features our embedded binaries are compiled with.
+const CoreFeatures = api.CoreFeatureSIMD |
+ api.CoreFeatureBulkMemoryOperations |
+ api.CoreFeatureNonTrappingFloatToIntConversion |
+ api.CoreFeatureMutableGlobal |
+ api.CoreFeatureReferenceTypes |
+ api.CoreFeatureSignExtensionOps
+
+// Args encompasses a common set of
+// configuration options often passed to
+// wazero.Runtime on module instantiation.
+type Args struct {
+
+ // Optional further module configuration function.
+ // (e.g. to mount filesystem dir, set env vars, etc).
+ Config func(wazero.ModuleConfig) wazero.ModuleConfig
+
+ // Standard FDs.
+ Stdin io.Reader
+ Stdout io.Writer
+ Stderr io.Writer
+
+ // CLI args.
+ Args []string
+}
+
+// Run will run given compiled WebAssembly module
+// within the given runtime, with given arguments.
+// Returns the exit code, or error.
+func Run(
+ ctx context.Context,
+ runtime wazero.Runtime,
+ module wazero.CompiledModule,
+ args Args,
+) (rc uint32, err error) {
+
+ // Prefix arguments with module name.
+ cargs := make([]string, len(args.Args)+1)
+ cargs[0] = module.Name()
+ copy(cargs[1:], args.Args)
+
+ // Prepare new module configuration.
+ modcfg := wazero.NewModuleConfig()
+ modcfg = modcfg.WithArgs(cargs...)
+ modcfg = modcfg.WithStdin(args.Stdin)
+ modcfg = modcfg.WithStdout(args.Stdout)
+ modcfg = modcfg.WithStderr(args.Stderr)
+
+ if args.Config != nil {
+ // Pass through config fn.
+ modcfg = args.Config(modcfg)
+ }
+
+ // Instantiate the module from precompiled wasm module data.
+ mod, err := runtime.InstantiateModule(ctx, module, modcfg)
+
+ if !isNil(mod) {
+ // Ensure closed.
+ _ = mod.Close(ctx)
+ }
+
+ // Try extract exit code.
+ switch err := err.(type) {
+ case *sys.ExitError:
+ return err.ExitCode(), nil
+ default:
+ return 0, err
+ }
+}
+
+// isNil will safely check if 'v' is nil without
+// dealing with weird Go interface nil bullshit.
+func isNil(i interface{}) bool {
+ type eface struct{ Type, Data unsafe.Pointer }
+ return (*(*eface)(unsafe.Pointer(&i))).Data == nil
+}