1
0

node_bucket.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package core
  2. import (
  3. "github.com/cdle/sillyplus/core/storage"
  4. "github.com/dop251/goja"
  5. )
  6. func ErrStr(err error) string {
  7. if err == nil {
  8. return ""
  9. }
  10. return err.Error()
  11. }
  12. func MakeBucketObject(vm *goja.Runtime, uuid string, on_start bool, bucket storage.Bucket) *goja.Object {
  13. obj := vm.NewObject()
  14. obj.Set("get", func(v ...interface{}) interface{} {
  15. return GetBucketKeyValue(bucket, v...)
  16. })
  17. obj.Set("getAll", func(v ...interface{}) map[string]interface{} {
  18. var rt = map[string]interface{}{}
  19. bucket.Foreach(func(b1, b2 []byte) error {
  20. rt[string(b1)] = TransformBucketKeyValue(string(b2))
  21. return nil
  22. })
  23. return rt
  24. })
  25. obj.Set("set", func(key, value interface{}) interface{} {
  26. msg, changed, err := SetBucketKeyValue(bucket, key, value)
  27. return map[string]interface{}{
  28. "message": msg,
  29. "error": ErrStr(err),
  30. "changed": changed,
  31. }
  32. })
  33. obj.Set("set2", func(key, value interface{}) interface{} {
  34. msg, changed, err := SetBucketKeyValue2(bucket, key, value)
  35. return map[string]interface{}{
  36. "message": msg,
  37. "error": ErrStr(err),
  38. "changed": changed,
  39. }
  40. })
  41. obj.Set("delete", func(key interface{}) string {
  42. _, _, err := bucket.Set(key, "")
  43. return ErrStr(err)
  44. })
  45. obj.Set("deleteAll", func() string {
  46. return ErrStr(bucket.Delete())
  47. })
  48. obj.Set("keys", func() []string {
  49. keys, err := bucket.Keys()
  50. if err != nil {
  51. panic(vm.NewGoError(err))
  52. }
  53. return keys
  54. })
  55. obj.Set("len", func() int {
  56. keys, err := bucket.Keys()
  57. if err != nil {
  58. panic(vm.NewGoError(err))
  59. }
  60. return len(keys)
  61. })
  62. obj.Set("buckets", func() []string {
  63. return bucket.Buckets()
  64. })
  65. obj.Set("_name", func() string {
  66. return bucket.GetName()
  67. })
  68. obj.Set("watch", func(key string, f func(old, new interface{}, key string) *storage.Final) {
  69. if on_start {
  70. storage.Watch(bucket, key, func(old, new, key string) *storage.Final {
  71. // mutex := GetMutex(uuid)
  72. // mutex.Lock()
  73. // defer mutex.Unlock()
  74. return f(TransformBucketKeyValue(old), TransformBucketKeyValue(new), key)
  75. }, uuid)
  76. }
  77. })
  78. return obj
  79. }
  80. // vm.Set("Bucket", func(name string) interface{} {
  81. // return vm.NewProxy(MakeBucketObject(vm, uuid, on_start, MakeBucket(name)), &goja.ProxyTrapConfig{
  82. // Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) {
  83. // return nil
  84. // },
  85. // Set: func(target *goja.Object, property string, value, receiver goja.Value) (success bool) {
  86. // return true
  87. // },
  88. // })
  89. // })
  90. func JsBucket(vm *goja.Runtime, name string, uuid string, on_start bool) goja.Proxy {
  91. return vm.NewProxy(MakeBucketObject(vm, uuid, on_start, MakeBucket(name)), &goja.ProxyTrapConfig{
  92. Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) {
  93. obj := target.Get(property)
  94. if obj != nil {
  95. return obj
  96. }
  97. result := target.Get("get").Export().(func(...interface{}) interface{})(property)
  98. return vm.ToValue(result)
  99. },
  100. Set: func(target *goja.Object, property string, value, receiver goja.Value) (success bool) {
  101. target.Get("set").Export().(func(interface{}, interface{}) interface{})(
  102. property, value.Export(),
  103. )
  104. return true
  105. },
  106. })
  107. }
  108. func JsBucket2(vm *goja.Runtime, name string, uuid string, on_start bool) goja.Proxy {
  109. return vm.NewProxy(MakeBucketObject(vm, uuid, on_start, MakeBucket(name)), &goja.ProxyTrapConfig{
  110. Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) {
  111. obj := target.Get(property)
  112. if obj != nil {
  113. return obj
  114. }
  115. result := target.Get("get").Export().(func(...interface{}) interface{})(property)
  116. return vm.ToValue(result)
  117. },
  118. Set: func(target *goja.Object, property string, value, receiver goja.Value) (success bool) {
  119. target.Get("set2").Export().(func(interface{}, interface{}) interface{})(
  120. property, value.Export(),
  121. )
  122. return true
  123. },
  124. })
  125. }