Files
2023-07-18 22:01:48 +08:00

132 lines
3.8 KiB
Go

package core
import (
"github.com/cdle/sillyplus/core/storage"
"github.com/dop251/goja"
)
func ErrStr(err error) string {
if err == nil {
return ""
}
return err.Error()
}
func MakeBucketObject(vm *goja.Runtime, uuid string, on_start bool, bucket storage.Bucket) *goja.Object {
obj := vm.NewObject()
obj.Set("get", func(v ...interface{}) interface{} {
return GetBucketKeyValue(bucket, v...)
})
obj.Set("getAll", func(v ...interface{}) map[string]interface{} {
var rt = map[string]interface{}{}
bucket.Foreach(func(b1, b2 []byte) error {
rt[string(b1)] = TransformBucketKeyValue(string(b2))
return nil
})
return rt
})
obj.Set("set", func(key, value interface{}) interface{} {
msg, changed, err := SetBucketKeyValue(bucket, key, value)
return map[string]interface{}{
"message": msg,
"error": ErrStr(err),
"changed": changed,
}
})
obj.Set("set2", func(key, value interface{}) interface{} {
msg, changed, err := SetBucketKeyValue2(bucket, key, value)
return map[string]interface{}{
"message": msg,
"error": ErrStr(err),
"changed": changed,
}
})
obj.Set("delete", func(key interface{}) string {
_, _, err := bucket.Set(key, "")
return ErrStr(err)
})
obj.Set("deleteAll", func() string {
return ErrStr(bucket.Delete())
})
obj.Set("keys", func() []string {
keys, err := bucket.Keys()
if err != nil {
panic(vm.NewGoError(err))
}
return keys
})
obj.Set("len", func() int {
keys, err := bucket.Keys()
if err != nil {
panic(vm.NewGoError(err))
}
return len(keys)
})
obj.Set("buckets", func() []string {
return bucket.Buckets()
})
obj.Set("_name", func() string {
return bucket.GetName()
})
obj.Set("watch", func(key string, f func(old, new interface{}, key string) *storage.Final) {
if on_start {
storage.Watch(bucket, key, func(old, new, key string) *storage.Final {
// mutex := GetMutex(uuid)
// mutex.Lock()
// defer mutex.Unlock()
return f(TransformBucketKeyValue(old), TransformBucketKeyValue(new), key)
}, uuid)
}
})
return obj
}
// vm.Set("Bucket", func(name string) interface{} {
// return vm.NewProxy(MakeBucketObject(vm, uuid, on_start, MakeBucket(name)), &goja.ProxyTrapConfig{
// Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) {
// return nil
// },
// Set: func(target *goja.Object, property string, value, receiver goja.Value) (success bool) {
// return true
// },
// })
// })
func JsBucket(vm *goja.Runtime, name string, uuid string, on_start bool) goja.Proxy {
return vm.NewProxy(MakeBucketObject(vm, uuid, on_start, MakeBucket(name)), &goja.ProxyTrapConfig{
Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) {
obj := target.Get(property)
if obj != nil {
return obj
}
result := target.Get("get").Export().(func(...interface{}) interface{})(property)
return vm.ToValue(result)
},
Set: func(target *goja.Object, property string, value, receiver goja.Value) (success bool) {
target.Get("set").Export().(func(interface{}, interface{}) interface{})(
property, value.Export(),
)
return true
},
})
}
func JsBucket2(vm *goja.Runtime, name string, uuid string, on_start bool) goja.Proxy {
return vm.NewProxy(MakeBucketObject(vm, uuid, on_start, MakeBucket(name)), &goja.ProxyTrapConfig{
Get: func(target *goja.Object, property string, receiver goja.Value) (value goja.Value) {
obj := target.Get(property)
if obj != nil {
return obj
}
result := target.Get("get").Export().(func(...interface{}) interface{})(property)
return vm.ToValue(result)
},
Set: func(target *goja.Object, property string, value, receiver goja.Value) (success bool) {
target.Get("set2").Export().(func(interface{}, interface{}) interface{})(
property, value.Export(),
)
return true
},
})
}