runtime.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package script
  2. import (
  3. "context"
  4. "github.com/sagernet/sing-box/script/modules/boxctx"
  5. "github.com/sagernet/sing-box/script/modules/console"
  6. "github.com/sagernet/sing-box/script/modules/eventloop"
  7. "github.com/sagernet/sing-box/script/modules/require"
  8. "github.com/sagernet/sing-box/script/modules/surge"
  9. "github.com/sagernet/sing-box/script/modules/url"
  10. E "github.com/sagernet/sing/common/exceptions"
  11. "github.com/sagernet/sing/common/logger"
  12. "github.com/sagernet/sing/common/ntp"
  13. "github.com/dop251/goja"
  14. "github.com/dop251/goja/parser"
  15. )
  16. func NewRuntime(ctx context.Context, cancel context.CancelCauseFunc) *goja.Runtime {
  17. vm := goja.New()
  18. if timeFunc := ntp.TimeFuncFromContext(ctx); timeFunc != nil {
  19. vm.SetTimeSource(timeFunc)
  20. }
  21. vm.SetParserOptions(parser.WithDisableSourceMaps)
  22. registry := require.NewRegistry(require.WithLoader(func(path string) ([]byte, error) {
  23. return nil, E.New("unsupported usage")
  24. }))
  25. registry.Enable(vm)
  26. registry.RegisterNodeModule(console.ModuleName, console.Require)
  27. registry.RegisterNodeModule(url.ModuleName, url.Require)
  28. registry.RegisterNativeModule(boxctx.ModuleName, boxctx.Require)
  29. registry.RegisterNativeModule(surge.ModuleName, surge.Require)
  30. console.Enable(vm)
  31. url.Enable(vm)
  32. eventloop.Enable(vm, cancel)
  33. return vm
  34. }
  35. func SetModules(runtime *goja.Runtime, ctx context.Context, logger logger.ContextLogger, errorHandler func(error), tag string) {
  36. boxctx.Enable(runtime, &boxctx.Context{
  37. Context: ctx,
  38. Logger: logger,
  39. Tag: tag,
  40. ErrorHandler: errorHandler,
  41. })
  42. }