utils.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package surge
  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 Utils struct {
  11. class jsc.Class[*Module, *Utils]
  12. }
  13. func createUtils(module *Module) jsc.Class[*Module, *Utils] {
  14. class := jsc.NewClass[*Module, *Utils](module)
  15. class.DefineMethod("geoip", (*Utils).stub)
  16. class.DefineMethod("ipasn", (*Utils).stub)
  17. class.DefineMethod("ipaso", (*Utils).stub)
  18. class.DefineMethod("ungzip", (*Utils).ungzip)
  19. class.DefineMethod("toString", (*Utils).toString)
  20. return class
  21. }
  22. func (u *Utils) stub(call goja.FunctionCall) any {
  23. return nil
  24. }
  25. func (u *Utils) ungzip(call goja.FunctionCall) any {
  26. if len(call.Arguments) != 1 {
  27. panic(u.class.Runtime().NewGoError(E.New("invalid argument")))
  28. }
  29. binary := jsc.AssertBinary(u.class.Runtime(), call.Argument(0), "binary", false)
  30. reader, err := gzip.NewReader(bytes.NewReader(binary))
  31. if err != nil {
  32. panic(u.class.Runtime().NewGoError(err))
  33. }
  34. binary, err = io.ReadAll(reader)
  35. if err != nil {
  36. panic(u.class.Runtime().NewGoError(err))
  37. }
  38. return jsc.NewUint8Array(u.class.Runtime(), binary)
  39. }
  40. func (u *Utils) toString(call goja.FunctionCall) any {
  41. return "[sing-box Surge utils]"
  42. }