runtime/plugin.go

93 lines
1.9 KiB
Go
Raw Normal View History

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
// }