54 lines
1.8 KiB
Go
54 lines
1.8 KiB
Go
package storage
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
"time"
|
|
)
|
|
|
|
// ErrConditionNotMet reports that an object changed or already existed before a
|
|
// conditional write could be committed.
|
|
var ErrConditionNotMet = errors.New("object write condition not met")
|
|
|
|
// ReaderUploader streams caller-owned, already-opened content to object storage.
|
|
// Callers retain source-selection and filesystem-confinement policy.
|
|
type ReaderUploader interface {
|
|
UploadReader(ctx context.Context, source io.Reader, key string, opts UploadOptions) (ObjectInfo, error)
|
|
}
|
|
|
|
// ObjectStore is a remote object storage boundary used by prepare, restore, and publish work.
|
|
//
|
|
// Key invariant:
|
|
// callers pass full bucket-relative object keys. Backend implementations do not
|
|
// infer Narratio session semantics and do not prepend root prefixes.
|
|
type ObjectStore interface {
|
|
List(ctx context.Context, prefix string) ([]ObjectInfo, error)
|
|
Read(ctx context.Context, key string) (ObjectInfo, io.ReadCloser, error)
|
|
Download(ctx context.Context, key, localPath string) error
|
|
Upload(ctx context.Context, localPath, key string, opts UploadOptions) (ObjectInfo, error)
|
|
UploadConditional(ctx context.Context, source io.Reader, key string, opts UploadOptions, condition WriteCondition) (ObjectInfo, error)
|
|
Exists(ctx context.Context, key string) (bool, error)
|
|
}
|
|
|
|
// ObjectInfo describes one object in remote storage.
|
|
type ObjectInfo struct {
|
|
Key string
|
|
Size int64
|
|
ETag string
|
|
LastModified *time.Time
|
|
}
|
|
|
|
// UploadOptions configures optional object upload metadata.
|
|
type UploadOptions struct {
|
|
Metadata map[string]string
|
|
ContentType string
|
|
}
|
|
|
|
// WriteCondition protects a mutable object update against a stale snapshot.
|
|
// Exactly one condition is required by UploadConditional.
|
|
type WriteCondition struct {
|
|
MatchETag string
|
|
RequireAbsent bool
|
|
}
|