61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
//go:build !no_script
|
|
|
|
package js
|
|
|
|
import (
|
|
"github.com/Dreamacro/clash/log"
|
|
"github.com/dop251/goja"
|
|
"github.com/dop251/goja_nodejs/console"
|
|
"github.com/dop251/goja_nodejs/eventloop"
|
|
"github.com/dop251/goja_nodejs/require"
|
|
)
|
|
|
|
func init() {
|
|
logPrinter := console.RequireWithPrinter(&JsLog{})
|
|
require.RegisterNativeModule("console", logPrinter)
|
|
contextFuncLoader := newContext()
|
|
require.RegisterNativeModule("context", contextFuncLoader)
|
|
}
|
|
|
|
func preSetting(rt *goja.Runtime) {
|
|
registry := new(require.Registry)
|
|
registry.Enable(rt)
|
|
|
|
console.Enable(rt)
|
|
enable(rt)
|
|
eventloop.EnableConsole(true)
|
|
}
|
|
|
|
func getLoop() *eventloop.EventLoop {
|
|
loop := eventloop.NewEventLoop(func(loop *eventloop.EventLoop) {
|
|
loop.Run(func(runtime *goja.Runtime) {
|
|
preSetting(runtime)
|
|
})
|
|
})
|
|
|
|
return loop
|
|
}
|
|
|
|
func compiler(name, code string) (*goja.Program, error) {
|
|
return goja.Compile(name, code, false)
|
|
}
|
|
|
|
func run(loop *eventloop.EventLoop, program *goja.Program, args map[string]any, callback func(any, error)) {
|
|
loop.Run(func(runtime *goja.Runtime) {
|
|
for k, v := range args {
|
|
runtime.SetFieldNameMapper(goja.TagFieldNameMapper("json", true))
|
|
err := runtime.Set(k, v)
|
|
if err != nil {
|
|
log.Errorln("Args to script failed, %s", err.Error())
|
|
}
|
|
}
|
|
|
|
v, err := runtime.RunProgram(program)
|
|
if v == nil {
|
|
callback(nil, err)
|
|
} else {
|
|
callback(v.Export(), err)
|
|
}
|
|
})
|
|
}
|