package plugin import ( "errors" "runtime" "strings" "time" "apigo.cc/gojs" "apigo.cc/gojs/goja" "github.com/ssgo/u" ) const pluginName = "runtime" var _pluginObject = &PluginObject{} func init() { tsCode := gojs.MakeTSCode(_pluginObject) mappedObj := gojs.ToMap(_pluginObject) gojs.Register("apigo.cc/gojs/"+pluginName, gojs.Module{ ObjectMaker: func(vm *goja.Runtime) gojs.Map { return mappedObj }, TsCode: tsCode, Desc: "runtime api", }) } type PluginObject struct { } func (obj *PluginObject) Os() string { return runtime.GOOS } func (obj *PluginObject) NumCPU() int { return runtime.NumCPU() } func (obj *PluginObject) Arch() string { return runtime.GOARCH } func (obj *PluginObject) Sleep(timeValue any) error { var timeV time.Duration if ms := u.Int64(timeValue); ms > 0 { timeV = time.Duration(ms) * time.Millisecond } else { if v, err := time.ParseDuration(u.String(timeValue)); err == nil { timeV = v } } if timeV > time.Hour { return errors.New("sleep time too long, max 1h") } if timeV > 0 { time.Sleep(timeV) } return nil } func (obj *PluginObject) Shell(cmd string, args ...string) ([]string, error) { if len(args) == 0 && strings.ContainsRune(cmd, ' ') { args = u.SplitArgs(cmd) cmd = args[0] args = args[1:] } if r, err := u.RunCommand(cmd, args...); err == nil { return r, nil } else { return []string{}, err } } // 暂不支持,因为回调是异步的可能会发生冲突 // func (obj *PluginObject) SetTimeout(timeValue any, vm *goja.Runtime) error { // args := gojs.MakeArgs(&argsIn, vm).Check(1) // callback := args.Func(0) // timeout := time.Duration(args.Int64(1)) * time.Millisecond // if callback != nil { // go func() { // if timeout > 0 { // time.Sleep(timeout) // } // if _, err := callback(args.This, args.Arguments[2:]...); err != nil { // args.Logger.Error(err.Error()) // } // }() // } // return nil // }