v2fly/common/environment/transientstorageimpl/storage.go

79 lines
1.9 KiB
Go

package transientstorageimpl
//go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen
import (
"context"
"github.com/v2fly/v2ray-core/v5/features/extension/storage"
"strings"
"sync"
)
func NewScopedTransientStorageImpl() storage.ScopedTransientStorage {
return &scopedTransientStorageImpl{scopes: map[string]storage.ScopedTransientStorage{}, values: map[string]interface{}{}}
}
type scopedTransientStorageImpl struct {
access sync.Mutex
scopes map[string]storage.ScopedTransientStorage
values map[string]interface{}
}
func (s *scopedTransientStorageImpl) ScopedTransientStorage() {
panic("implement me")
}
func (s *scopedTransientStorageImpl) Put(ctx context.Context, key string, value interface{}) error {
s.access.Lock()
defer s.access.Unlock()
s.values[key] = value
return nil
}
func (s *scopedTransientStorageImpl) Get(ctx context.Context, key string) (interface{}, error) {
s.access.Lock()
defer s.access.Unlock()
sw, ok := s.values[key]
if !ok {
return nil, newError("unable to find ")
}
return sw, nil
}
func (s *scopedTransientStorageImpl) List(ctx context.Context, keyPrefix string) ([]string, error) {
s.access.Lock()
defer s.access.Unlock()
var ret []string
for key, _ := range s.values {
if strings.HasPrefix(key, keyPrefix) {
ret = append(ret, key)
}
}
return ret, nil
}
func (s *scopedTransientStorageImpl) Clear(ctx context.Context) {
s.access.Lock()
defer s.access.Unlock()
s.values = map[string]interface{}{}
}
func (s *scopedTransientStorageImpl) NarrowScope(ctx context.Context, key string) (storage.ScopedTransientStorage, error) {
s.access.Lock()
defer s.access.Unlock()
sw, ok := s.scopes[key]
if !ok {
scope := NewScopedTransientStorageImpl()
s.scopes[key] = scope
return scope, nil
}
return sw, nil
}
func (s *scopedTransientStorageImpl) DropScope(ctx context.Context, key string) error {
s.access.Lock()
defer s.access.Unlock()
delete(s.scopes, key)
return nil
}