assert.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package jsc
  2. import (
  3. "net/http"
  4. F "github.com/sagernet/sing/common/format"
  5. "github.com/dop251/goja"
  6. )
  7. func IsNil(value goja.Value) bool {
  8. return value == nil || goja.IsUndefined(value) || goja.IsNull(value)
  9. }
  10. func AssertObject(vm *goja.Runtime, value goja.Value, name string, nilable bool) *goja.Object {
  11. if IsNil(value) {
  12. if nilable {
  13. return nil
  14. }
  15. panic(vm.NewTypeError(F.ToString("invalid argument: missing ", name)))
  16. }
  17. objectValue, isObject := value.(*goja.Object)
  18. if !isObject {
  19. panic(vm.NewTypeError(F.ToString("invalid argument: ", name, ": expected object, but got ", value)))
  20. }
  21. return objectValue
  22. }
  23. func AssertString(vm *goja.Runtime, value goja.Value, name string, nilable bool) string {
  24. if IsNil(value) {
  25. if nilable {
  26. return ""
  27. }
  28. panic(vm.NewTypeError(F.ToString("invalid argument: missing ", name)))
  29. }
  30. stringValue, isString := value.Export().(string)
  31. if !isString {
  32. panic(vm.NewTypeError(F.ToString("invalid argument: ", name, ": expected string, but got ", value)))
  33. }
  34. return stringValue
  35. }
  36. func AssertInt(vm *goja.Runtime, value goja.Value, name string, nilable bool) int64 {
  37. if IsNil(value) {
  38. if nilable {
  39. return 0
  40. }
  41. panic(vm.NewTypeError(F.ToString("invalid argument: missing ", name)))
  42. }
  43. integerValue, isNumber := value.Export().(int64)
  44. if !isNumber {
  45. panic(vm.NewTypeError(F.ToString("invalid argument: ", name, ": expected integer, but got ", value)))
  46. }
  47. return integerValue
  48. }
  49. func AssertBool(vm *goja.Runtime, value goja.Value, name string, nilable bool) bool {
  50. if IsNil(value) {
  51. if nilable {
  52. return false
  53. }
  54. panic(vm.NewTypeError(F.ToString("invalid argument: missing ", name)))
  55. }
  56. boolValue, isBool := value.Export().(bool)
  57. if !isBool {
  58. panic(vm.NewTypeError(F.ToString("invalid argument: ", name, ": expected boolean, but got ", value)))
  59. }
  60. return boolValue
  61. }
  62. func AssertBinary(vm *goja.Runtime, value goja.Value, name string, nilable bool) []byte {
  63. if IsNil(value) {
  64. if nilable {
  65. return nil
  66. }
  67. panic(vm.NewTypeError(F.ToString("invalid argument: missing ", name)))
  68. }
  69. switch exportedValue := value.Export().(type) {
  70. case []byte:
  71. return exportedValue
  72. case goja.ArrayBuffer:
  73. return exportedValue.Bytes()
  74. default:
  75. panic(vm.NewTypeError(F.ToString("invalid argument: ", name, ": expected Uint8Array or ArrayBuffer, but got ", value)))
  76. }
  77. }
  78. func AssertStringBinary(vm *goja.Runtime, value goja.Value, name string, nilable bool) []byte {
  79. if IsNil(value) {
  80. if nilable {
  81. return nil
  82. }
  83. panic(vm.NewTypeError(F.ToString("invalid argument: missing ", name)))
  84. }
  85. switch exportedValue := value.Export().(type) {
  86. case string:
  87. return []byte(exportedValue)
  88. case []byte:
  89. return exportedValue
  90. case goja.ArrayBuffer:
  91. return exportedValue.Bytes()
  92. default:
  93. panic(vm.NewTypeError(F.ToString("invalid argument: ", name, ": expected string, Uint8Array or ArrayBuffer, but got ", value)))
  94. }
  95. }
  96. func AssertFunction(vm *goja.Runtime, value goja.Value, name string) goja.Callable {
  97. if IsNil(value) {
  98. panic(vm.NewTypeError(F.ToString("invalid argument: missing ", name)))
  99. }
  100. functionValue, isFunction := goja.AssertFunction(value)
  101. if !isFunction {
  102. panic(vm.NewTypeError(F.ToString("invalid argument: ", name, ": expected function, but got ", value)))
  103. }
  104. return functionValue
  105. }
  106. func AssertHTTPHeader(vm *goja.Runtime, value goja.Value, name string) http.Header {
  107. headersObject := AssertObject(vm, value, name, true)
  108. if headersObject == nil {
  109. return nil
  110. }
  111. return ObjectToHeaders(vm, headersObject, name)
  112. }