93 lines
1.9 KiB
Go
93 lines
1.9 KiB
Go
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
|
|
// }
|