| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- 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
- },
- })
- }
|