key_range.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. //go:build js && wasm
  2. // +build js,wasm
  3. package idb
  4. import (
  5. "syscall/js"
  6. "github.com/hack-pad/safejs"
  7. )
  8. var (
  9. jsIDBKeyRange safejs.Value
  10. )
  11. func init() {
  12. var err error
  13. jsIDBKeyRange, err = safejs.Global().Get("IDBKeyRange")
  14. if err != nil {
  15. panic(err)
  16. }
  17. }
  18. // KeyRange represents a continuous interval over some data type that is used for keys. Records can be retrieved from ObjectStore and Index objects using keys or a range of keys.
  19. type KeyRange struct {
  20. jsKeyRange safejs.Value
  21. }
  22. func wrapKeyRange(jsKeyRange safejs.Value) *KeyRange {
  23. return &KeyRange{jsKeyRange}
  24. }
  25. // NewKeyRangeBound creates a new key range with the specified upper and lower bounds.
  26. // The bounds can be open (that is, the bounds exclude the endpoint values) or closed (that is, the bounds include the endpoint values).
  27. func NewKeyRangeBound(lower, upper js.Value, lowerOpen, upperOpen bool) (*KeyRange, error) {
  28. keyRange, err := jsIDBKeyRange.Call("bound", lower, upper, lowerOpen, upperOpen)
  29. if err != nil {
  30. return nil, tryAsDOMException(err)
  31. }
  32. return wrapKeyRange(keyRange), nil
  33. }
  34. // NewKeyRangeLowerBound creates a new key range with only a lower bound.
  35. func NewKeyRangeLowerBound(lower js.Value, open bool) (*KeyRange, error) {
  36. keyRange, err := jsIDBKeyRange.Call("lowerBound", lower, open)
  37. if err != nil {
  38. return nil, tryAsDOMException(err)
  39. }
  40. return wrapKeyRange(keyRange), nil
  41. }
  42. // NewKeyRangeUpperBound creates a new key range with only an upper bound.
  43. func NewKeyRangeUpperBound(upper js.Value, open bool) (*KeyRange, error) {
  44. keyRange, err := jsIDBKeyRange.Call("upperBound", upper, open)
  45. if err != nil {
  46. return nil, tryAsDOMException(err)
  47. }
  48. return wrapKeyRange(keyRange), nil
  49. }
  50. // NewKeyRangeOnly creates a new key range containing a single value.
  51. func NewKeyRangeOnly(only js.Value) (*KeyRange, error) {
  52. keyRange, err := jsIDBKeyRange.Call("only", only)
  53. if err != nil {
  54. return nil, tryAsDOMException(err)
  55. }
  56. return wrapKeyRange(keyRange), nil
  57. }
  58. // Lower returns the lower bound of the key range.
  59. func (k *KeyRange) Lower() (js.Value, error) {
  60. lower, err := k.jsKeyRange.Get("lower")
  61. return safejs.Unsafe(lower), err
  62. }
  63. // Upper returns the upper bound of the key range.
  64. func (k *KeyRange) Upper() (js.Value, error) {
  65. upper, err := k.jsKeyRange.Get("upper")
  66. return safejs.Unsafe(upper), err
  67. }
  68. // LowerOpen returns false if the lower-bound value is included in the key range.
  69. func (k *KeyRange) LowerOpen() (bool, error) {
  70. lowerOpen, err := k.jsKeyRange.Get("lowerOpen")
  71. if err != nil {
  72. return false, err
  73. }
  74. return lowerOpen.Bool()
  75. }
  76. // UpperOpen returns false if the upper-bound value is included in the key range.
  77. func (k *KeyRange) UpperOpen() (bool, error) {
  78. upperOpen, err := k.jsKeyRange.Get("upperOpen")
  79. if err != nil {
  80. return false, err
  81. }
  82. return upperOpen.Bool()
  83. }
  84. // Includes returns a boolean indicating whether a specified key is inside the key range.
  85. func (k *KeyRange) Includes(key js.Value) (bool, error) {
  86. includes, err := k.jsKeyRange.Call("includes", key)
  87. if err != nil {
  88. return false, tryAsDOMException(err)
  89. }
  90. return includes.Bool()
  91. }