package cache import ( "context" "time" "forge.cadoles.com/arcad/edge/pkg/storage" "github.com/hashicorp/golang-lru/v2/expirable" "github.com/pkg/errors" ) type BlobStore struct { store storage.BlobStore cache *expirable.LRU[string, []byte] } // DeleteBucket implements storage.BlobStore. func (s *BlobStore) DeleteBucket(ctx context.Context, name string) error { if err := s.store.DeleteBucket(ctx, name); err != nil { return errors.WithStack(err) } return nil } // ListBuckets implements storage.BlobStore. func (s *BlobStore) ListBuckets(ctx context.Context) ([]string, error) { buckets, err := s.store.ListBuckets(ctx) if err != nil { return nil, errors.WithStack(err) } return buckets, nil } // OpenBucket implements storage.BlobStore. func (s *BlobStore) OpenBucket(ctx context.Context, name string) (storage.BlobBucket, error) { bucket, err := s.store.OpenBucket(ctx, name) if err != nil { return nil, errors.WithStack(err) } return &BlobBucket{ bucket: bucket, cache: s.cache, }, nil } func NewBlobStore(store storage.BlobStore, cacheSize int, cacheTTL time.Duration) *BlobStore { return &BlobStore{ store: store, cache: expirable.NewLRU[string, []byte](cacheSize, nil, cacheTTL), } } var _ storage.BlobStore = &BlobStore{}