module.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package sgutils
  2. import (
  3. "bytes"
  4. "compress/gzip"
  5. "io"
  6. "github.com/sagernet/sing-box/script/jsc"
  7. E "github.com/sagernet/sing/common/exceptions"
  8. "github.com/dop251/goja"
  9. )
  10. type SurgeUtils struct {
  11. vm *goja.Runtime
  12. }
  13. func Enable(runtime *goja.Runtime) {
  14. utils := &SurgeUtils{runtime}
  15. object := runtime.NewObject()
  16. object.Set("geoip", utils.js_stub)
  17. object.Set("ipasn", utils.js_stub)
  18. object.Set("ipaso", utils.js_stub)
  19. object.Set("ungzip", utils.js_ungzip)
  20. }
  21. func (u *SurgeUtils) js_stub(call goja.FunctionCall) goja.Value {
  22. panic(u.vm.NewGoError(E.New("not implemented")))
  23. }
  24. func (u *SurgeUtils) js_ungzip(call goja.FunctionCall) goja.Value {
  25. if len(call.Arguments) != 1 {
  26. panic(u.vm.NewGoError(E.New("invalid argument")))
  27. }
  28. binary := jsc.AssertBinary(u.vm, call.Argument(0), "binary", false)
  29. reader, err := gzip.NewReader(bytes.NewReader(binary))
  30. if err != nil {
  31. panic(u.vm.NewGoError(err))
  32. }
  33. binary, err = io.ReadAll(reader)
  34. if err != nil {
  35. panic(u.vm.NewGoError(err))
  36. }
  37. return jsc.NewUint8Array(u.vm, binary)
  38. }