depot/packages/networking/ipfs-cluster/state/interface.go

57 lines
1.8 KiB
Go

// Package state holds the interface that any state implementation for
// IPFS Cluster must satisfy.
package state
// State represents the shared state of the cluster
import (
"context"
"errors"
"io"
"github.com/ipfs-cluster/ipfs-cluster/api"
)
// ErrNotFound should be returned when a pin is not part of the state.
var ErrNotFound = errors.New("pin is not part of the pinset")
// State is a wrapper to the Cluster shared state so that Pin objects can
// be easily read, written and queried. The state can be marshaled and
// unmarshaled. Implementation should be thread-safe.
type State interface {
ReadOnly
WriteOnly
// Migrate restores the serialized format of an outdated state to the
// current version.
Migrate(ctx context.Context, r io.Reader) error
// Marshal serializes the state to a byte slice.
Marshal(io.Writer) error
// Unmarshal deserializes the state from marshaled bytes.
Unmarshal(io.Reader) error
}
// ReadOnly represents the read side of a State.
type ReadOnly interface {
// List lists all the pins in the state.
List(context.Context, chan<- api.Pin) error
// Has returns true if the state is holding information for a Cid.
Has(context.Context, api.Cid) (bool, error)
// Get returns the information attacthed to this pin, if any. If the
// pin is not part of the state, it should return ErrNotFound.
Get(context.Context, api.Cid) (api.Pin, error)
}
// WriteOnly represents the write side of a State.
type WriteOnly interface {
// Add adds a pin to the State
Add(context.Context, api.Pin) error
// Rm removes a pin from the State.
Rm(context.Context, api.Cid) error
}
// BatchingState represents a state which batches write operations.
type BatchingState interface {
State
// Commit writes any batched operations.
Commit(context.Context) error
}