feat: working version

1. implemented filesystem storage, NATS object storage
and saving to Vault.
2. Test coverage is fine for filesystem and Vault
(and NATS object does not really require extensive tests)
This commit is contained in:
2025-07-27 19:02:05 +03:00
parent 854de3865b
commit 48878e8433
13 changed files with 265 additions and 153 deletions

View File

@@ -1,41 +1,22 @@
package natsobj
import (
"errors"
"code.uint32.ru/tiny/storage/internal/errinternal"
"github.com/nats-io/nats.go"
)
var (
ErrNotFound = errinternal.ErrNotFound
)
type Storage struct {
store nats.ObjectStore
conn *nats.Conn
}
func Open(bucket, url string) (*Storage, error) {
nc, err := nats.Connect(url)
if err != nil {
return nil, err
}
js, err := nc.JetStream()
if err != nil {
return nil, err
}
cfg := &nats.ObjectStoreConfig{
Bucket: bucket,
Description: "tiny storage bucket",
MaxBytes: -1,
Storage: nats.FileStorage,
Compression: true,
}
store, err := js.CreateObjectStore(cfg)
if err != nil {
return nil, err
}
st := &Storage{store: store, conn: nc}
return st, nil
func New(store nats.ObjectStore) *Storage {
return &Storage{store: store}
}
func (n *Storage) Save(key string, data []byte) error {
@@ -47,7 +28,9 @@ func (n *Storage) Save(key string, data []byte) error {
func (n *Storage) Load(key string) ([]byte, error) {
b, err := n.store.GetBytes(key)
if err != nil {
if err != nil && errors.Is(err, nats.ErrObjectNotFound) {
return nil, errors.Join(ErrNotFound, err)
} else if err != nil {
return nil, err
}
@@ -55,15 +38,12 @@ func (n *Storage) Load(key string) ([]byte, error) {
}
func (n *Storage) Delete(key string) error {
if err := n.store.Delete(key); err != nil {
err := n.store.Delete(key)
if err != nil && errors.Is(err, nats.ErrObjectNotFound) {
return nil
} else if err != nil {
return err
}
return nil
}
func (n *Storage) Close() error {
n.conn.Close()
return nil
}