mirror of https://github.com/stashapp/stash.git
65 lines
1.1 KiB
Go
65 lines
1.1 KiB
Go
package javascript
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
|
|
"github.com/dop251/goja"
|
|
)
|
|
|
|
type VM struct {
|
|
*goja.Runtime
|
|
|
|
Progress chan float64
|
|
SessionCookie *http.Cookie
|
|
GQLHandler http.Handler
|
|
}
|
|
|
|
func NewVM() *VM {
|
|
return &VM{Runtime: goja.New()}
|
|
}
|
|
|
|
type APIAdder interface {
|
|
AddToVM(globalName string, vm *VM) error
|
|
}
|
|
|
|
type ObjectValueDef struct {
|
|
Name string
|
|
Value interface{}
|
|
}
|
|
|
|
type setter interface {
|
|
Set(name string, value interface{}) error
|
|
}
|
|
|
|
func Compile(path string) (*goja.Program, error) {
|
|
js, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to read file: %w", err)
|
|
}
|
|
return goja.Compile(path, string(js), true)
|
|
}
|
|
|
|
func CompileScript(name, script string) (*goja.Program, error) {
|
|
return goja.Compile(name, string(script), true)
|
|
}
|
|
|
|
func SetAll(s setter, defs ...ObjectValueDef) error {
|
|
for _, def := range defs {
|
|
if err := s.Set(def.Name, def.Value); err != nil {
|
|
return fmt.Errorf("failed to set %s: %w", def.Name, err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (v *VM) Throw(err error) {
|
|
e, newErr := v.New(v.Get("Error"), v.ToValue(err))
|
|
if newErr != nil {
|
|
panic(newErr)
|
|
}
|
|
|
|
panic(e)
|
|
}
|