network/pkg/contracts/storage.go
2026-01-20 10:03:55 +02:00

71 lines
2.9 KiB
Go

package contracts
import (
"context"
"io"
)
// StorageProvider defines the interface for decentralized storage operations.
// Implementations typically use IPFS Cluster for distributed content storage.
type StorageProvider interface {
// Add uploads content to the storage network and returns metadata.
// The content is read from the provided reader and associated with the given name.
// Returns information about the stored content including its CID (Content IDentifier).
Add(ctx context.Context, reader io.Reader, name string) (*AddResponse, error)
// Pin ensures content is persistently stored across the network.
// The CID identifies the content, name provides a human-readable label,
// and replicationFactor specifies how many nodes should store the content.
Pin(ctx context.Context, cid string, name string, replicationFactor int) (*PinResponse, error)
// PinStatus retrieves the current replication status of pinned content.
// Returns detailed information about which peers are storing the content
// and the current state of the pin operation.
PinStatus(ctx context.Context, cid string) (*PinStatus, error)
// Get retrieves content from the storage network by its CID.
// The ipfsAPIURL parameter specifies which IPFS API endpoint to query.
// Returns a ReadCloser that must be closed by the caller.
Get(ctx context.Context, cid string, ipfsAPIURL string) (io.ReadCloser, error)
// Unpin removes a pin, allowing the content to be garbage collected.
// This does not immediately delete the content but makes it eligible for removal.
Unpin(ctx context.Context, cid string) error
// Health checks if the storage service is operational.
// Returns an error if the service is unavailable or unhealthy.
Health(ctx context.Context) error
// GetPeerCount returns the number of storage peers in the cluster.
// Useful for monitoring cluster health and connectivity.
GetPeerCount(ctx context.Context) (int, error)
// Close gracefully shuts down the storage client and releases resources.
Close(ctx context.Context) error
}
// AddResponse represents the result of adding content to storage.
type AddResponse struct {
Name string `json:"name"`
Cid string `json:"cid"`
Size int64 `json:"size"`
}
// PinResponse represents the result of a pin operation.
type PinResponse struct {
Cid string `json:"cid"`
Name string `json:"name"`
}
// PinStatus represents the replication status of pinned content.
type PinStatus struct {
Cid string `json:"cid"`
Name string `json:"name"`
Status string `json:"status"` // "pinned", "pinning", "queued", "unpinned", "error"
ReplicationMin int `json:"replication_min"`
ReplicationMax int `json:"replication_max"`
ReplicationFactor int `json:"replication_factor"`
Peers []string `json:"peers"` // List of peer IDs storing the content
Error string `json:"error,omitempty"`
}