Documentation
¶
Overview ¶
Package remote abstracts the cloud object store a volume syncs through. beardrive is provider-agnostic: any backend that can put/get/list immutable objects works. Built-in schemes:
file:///abs/path local or network-drive directory (also used in tests)
s3://bucket/prefix Amazon S3 (or S3-compatible via AWS_ENDPOINT_URL)
gs://bucket/prefix Google Cloud Storage
https://host:4173 a bdrive web server brokering one of the above —
the device needs no storage credentials at all
Remote layout: blobs/<sha256> for content, journal/<device>.jsonl for op logs. Each device writes only its own journal, so there are no concurrent writers per object and no server-side coordination is needed.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrForbidden = errors.New("forbidden")
ErrForbidden marks a refusal by the hub's authorization — the device asked correctly and was told no, which is a different thing from being offline. The syncer keys its degraded states off it: a refused push means read-only (keep pulling), a refused pull means access is gone (pause, touch nothing).
Functions ¶
func SameOrigin ¶ added in v0.15.0
SameOrigin is the exported form, for the CLI. It is the one rule that decides who may receive this device's bearer token, and it is needed at two doors: the sync backend's (here) and `bdrive share`/`init`'s HTTP client (cmd/bdrive). It used to be spelled twice — which is exactly how round 7's journal-path finding happened — so there is one copy and cmd/bdrive calls it.
Types ¶
type Backend ¶
type Backend interface {
Put(ctx context.Context, key string, r io.Reader, size int64) error
Get(ctx context.Context, key string) (io.ReadCloser, error)
List(ctx context.Context, prefix string) ([]Object, error)
Exists(ctx context.Context, key string) (bool, error)
Close() error
}
type PutSigner ¶
type PutSigner interface {
SignPut(ctx context.Context, key string, size int64, ttl time.Duration) (*SignedPut, error)
}
PutSigner is implemented by backends that can mint presigned upload URLs so clients write to storage directly. Backends without that capability (file://) simply don't implement it, and callers fall back to uploading through the server.
type ReadEvent ¶ added in v0.4.0
type ReadEvent struct {
Path string `json:"path"`
// Session is the agent session the read happened in, so the hub can join
// a run's reads to the writes journal.Op.Session carries. A client string
// — the hub pins each recorded row to the device it validated, never to
// anything in this body (see handleReadReport).
Session string `json:"session,omitempty"`
Time time.Time `json:"time,omitzero"`
}
ReadEvent is one agent file read reported to the hub for its read heatmap.
type ReadReporter ¶ added in v0.4.0
ReadReporter is the optional read-telemetry capability, in the PutSigner mold: backends that sync through a hub report the device's agent reads so the heat view can split human from agent traffic. Object-store backends simply don't implement it — there is no hub to tell.
type SignedPut ¶
type SignedPut struct {
URL string // upload here
Method string // always "PUT"
Headers map[string]string // headers that must be sent verbatim (they are signed)
Expires time.Time
}
SignedPut is a presigned direct-upload request: whoever holds the URL can PUT that one object until Expires, without ever seeing storage credentials.