Content-addressed transport contract for blob operations between cluster nodes.
Core code depends only on this behaviour. Concrete transports live outside the core application so their protocol dependencies do not leak into the storage domain.
Summary
Types
@type blob_info() :: %{hash: String.t(), size: non_neg_integer()}
@type node_ref() :: term()
@type options() :: keyword()
@type range() :: nil | :all | {non_neg_integer(), non_neg_integer()}
@type staged_source() :: ExStorageService.BlobStore.StagedBlob.t() | ExStorageService.BlobStore.Source.t()
Callbacks
@callback delete_blob(ExStorageService.Context.t(), node_ref(), String.t(), options()) :: :ok | {:error, term()}
@callback health(ExStorageService.Context.t(), node_ref(), options()) :: :ok | {:error, term()}
@callback open_blob( ExStorageService.Context.t(), node_ref(), String.t(), range(), options() ) :: {:ok, ExStorageService.BlobStore.Source.t()} | {:error, term()}
@callback put_blob( ExStorageService.Context.t(), node_ref(), staged_source(), ExStorageService.Cluster.BlobDescriptor.t(), options() ) :: {:ok, ExStorageService.Cluster.ReplicaAck.t()} | {:error, term()}