Help us shape the future of Go! Take the 2026 Go Developer Survey

storage

package module
v0.3.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 23, 2026 License: Apache-2.0 Imports: 7 Imported by: 0

Documentation

Overview

Package storage stores files for an app (ADR-0075): a Store is a bucket of objects addressed by key, with drivers for the local disk (development) and S3-compatible services (Amazon S3, DigitalOcean Spaces, Cloudflare R2, MinIO). The Dev Portal's Storage screen and the operators' API (/ops/storage) work on any Store.

Stability: experimental (ADR-0054).

Index

Constants

View Source
const (
	// MaxKeyLength bounds a key, as S3 does.
	MaxKeyLength = 1024
	// MaxListLimit bounds a List page.
	MaxListLimit = 1000
	// DefaultListLimit is a List page without a limit.
	DefaultListLimit = 200
	// MaxSignedURLExpiry bounds a signed URL's life (7 days, as S3 does).
	MaxSignedURLExpiry = 7 * 24 * time.Hour
)

Limits.

Variables

View Source
var (
	// ErrNotFound reports a key with no object.
	ErrNotFound = errors.New("storage: object not found")
	// ErrInvalidKey reports a key [ValidKey] refuses.
	ErrInvalidKey = errors.New("storage: invalid key")
	// ErrUnavailable reports a driver that can't reach its service.
	ErrUnavailable = errors.New("storage: unavailable")
)

Errors a Store returns.

Functions

func ClampExpiry

func ClampExpiry(d time.Duration) time.Duration

ClampExpiry bounds a signed URL's expiry: at least a second, at most MaxSignedURLExpiry; zero means an hour.

func ContentTypeFor

func ContentTypeFor(key string) string

ContentTypeFor guesses a content type from a key's extension, falling back to application/octet-stream.

func DirectoryMarker

func DirectoryMarker(prefix string) string

DirectoryMarker is the key of the object that makes an empty "directory" exist: prefix + "/.keep". Listings hide it.

func IsDirectoryMarker

func IsDirectoryMarker(key string) bool

IsDirectoryMarker reports a key DirectoryMarker made.

func ValidKey

func ValidKey(key string) bool

ValidKey reports whether key can name an object: 1 to MaxKeyLength bytes of valid UTF-8, no leading slash, no empty or "." or ".." segment, no control characters.

func ValidPrefix

func ValidPrefix(prefix string) bool

ValidPrefix reports whether prefix can select objects: empty, or a valid key optionally ending with a slash.

func ValidSignedMethod

func ValidSignedMethod(method string) bool

ValidSignedMethod reports a method Store.SignedURL accepts.

Types

type Info

type Info struct {
	// Driver is local, s3, spaces, r2 or minio.
	Driver string `json:"driver"`
	Bucket string `json:"bucket"`
	// Endpoint is the service's address (the directory for local).
	Endpoint string `json:"endpoint,omitempty"`
	Region   string `json:"region,omitempty"`
	// Local reports a store on this machine, safe to change freely.
	Local bool `json:"local"`
	// PublicURL is where objects are reachable without a signature, when
	// the bucket is public; empty otherwise.
	PublicURL string `json:"public_url,omitempty"`
}

Info describes a store for operators and the portal.

type ListOptions

type ListOptions struct {
	// Prefix keeps keys starting with it.
	Prefix string
	// Recursive lists every key under the prefix; otherwise keys with a
	// slash after the prefix are folded into Prefixes (directories).
	Recursive bool
	// Cursor continues a previous page.
	Cursor string
	// Limit is the page size (default [DefaultListLimit], at most
	// [MaxListLimit]).
	Limit int
}

ListOptions select a page of objects.

type Object

type Object struct {
	Key          string            `json:"key"`
	Size         int64             `json:"size"`
	ContentType  string            `json:"content_type"`
	ETag         string            `json:"etag,omitempty"`
	LastModified time.Time         `json:"last_modified"`
	Metadata     map[string]string `json:"metadata,omitempty"`
}

Object describes a stored object.

func Move

func Move(ctx context.Context, s Store, src, dst string) (Object, error)

Move copies src to dst and deletes src. It is a helper for every Store, since object stores have no rename.

type Page

type Page struct {
	Objects []Object `json:"objects"`
	// Prefixes are the "directories" folded when not recursive.
	Prefixes []string `json:"prefixes"`
	// NextCursor continues the listing; empty at the end.
	NextCursor string `json:"next_cursor,omitempty"`
}

Page is one page of a listing.

type PutOptions

type PutOptions struct {
	// ContentType of the object; guessed from the key when empty.
	ContentType string
	// Metadata is kept with the object (S3 user metadata; a sidecar file
	// on disk). Keys are lowercased; values must be plain text.
	Metadata map[string]string
}

PutOptions describe an upload.

type Store

type Store interface {
	// Info describes the store.
	Info() Info
	// Ping checks the service answers; [ErrUnavailable] wraps the reason.
	Ping(ctx context.Context) error
	// Put stores r under key, replacing any object there.
	Put(ctx context.Context, key string, r io.Reader, size int64, opts PutOptions) (Object, error)
	// Get opens the object for reading; the caller closes it.
	Get(ctx context.Context, key string) (io.ReadCloser, Object, error)
	// Stat describes the object without reading it.
	Stat(ctx context.Context, key string) (Object, error)
	// Delete removes the object; a missing key isn't an error.
	Delete(ctx context.Context, key string) error
	// Copy duplicates src to dst.
	Copy(ctx context.Context, src, dst string) (Object, error)
	// List returns a page of objects under a prefix.
	List(ctx context.Context, opts ListOptions) (Page, error)
	// SignedURL returns a URL that lets its holder GET (download) or PUT
	// (upload) the key until expiry, without other credentials.
	SignedURL(ctx context.Context, key string, method string, expiry time.Duration) (string, error)
}

A Store is a bucket of objects. Implementations are safe for concurrent use.

Directories

Path Synopsis
Package local stores objects on the local disk: development's storage driver (ADR-0075).
Package local stores objects on the local disk: development's storage driver (ADR-0075).
Package logarchive keeps an app's log records in its file storage (ADR-0079).
Package logarchive keeps an app's log records in its file storage (ADR-0079).
Package s3 stores objects in an S3-compatible service: Amazon S3, DigitalOcean Spaces, Cloudflare R2 or MinIO (ADR-0075), through the MinIO client.
Package s3 stores objects in an S3-compatible service: Amazon S3, DigitalOcean Spaces, Cloudflare R2 or MinIO (ADR-0075), through the MinIO client.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL