package jsruntime import ( "github.com/dop251/goja" "github.com/dop251/goja_nodejs/console" "github.com/dop251/goja_nodejs/eventloop" "github.com/dop251/goja_nodejs/require" "io/ioutil" "time" ) type JsRuntime struct { MainSrc string UseSrc string Relys Relys runtime *goja.Runtime registry *require.Registry requireModule *require.RequireModule } type Rely struct { Variable string FileName string } type Relys []Rely func NewJsRuntime(mainFileName string, useFileName string, rels Relys) (*JsRuntime, error) { jr := JsRuntime{ Relys: rels, } mainScript, err := ioutil.ReadFile(mainFileName) if err != nil { return nil, err } jr.MainSrc = string(mainScript) jr.registry = new(require.Registry) // this can be shared by multiple runtimes loop := eventloop.NewEventLoop() loop.Run(func(r *goja.Runtime) { jr.runtime = r }) jr.requireModule = jr.registry.Enable(jr.runtime) console.Enable(jr.runtime) for e := range rels { v, err := jr.requireModule.Require(rels[e].FileName) if err != nil { return nil, err } jr.runtime.Set(rels[e].Variable, v) } go func() { for { useSrc, _ := ioutil.ReadFile(mainFileName) jr.UseSrc = string(useSrc) time.Sleep(time.Second * 2) } }() return &jr, nil } func (jr *JsRuntime) Render(tpl string) string { jr.runtime.Set("HTML_SRC", tpl) runtime.Set("HTML_OUT", func(data string) { context.Writer.WriteHeader(200) context.Writer.Write([]byte(data)) return }) }