Files
cairnquire/apps/server/internal/sync/protocol.go
2026-06-01 10:53:28 -04:00

120 lines
3.6 KiB
Go

package sync
import "time"
// ChangeType represents the type of file change in a delta.
type ChangeType string
const (
ChangeCreate ChangeType = "create"
ChangeUpdate ChangeType = "update"
ChangeDelete ChangeType = "delete"
ChangeRename ChangeType = "rename"
)
// ResolutionStrategy defines how to resolve a sync conflict.
type ResolutionStrategy string
const (
ResolutionLastWriteWins ResolutionStrategy = "last-write-wins"
ResolutionRenameBoth ResolutionStrategy = "rename-both"
ResolutionManualMerge ResolutionStrategy = "manual-merge"
ResolutionServerWins ResolutionStrategy = "server-wins"
ResolutionClientWins ResolutionStrategy = "client-wins"
)
// FileEntry represents a single file in a snapshot.
type FileEntry struct {
Path string `json:"path"`
Hash string `json:"hash"`
Size int64 `json:"size"`
Modified time.Time `json:"modified"`
}
// Snapshot represents a point-in-time view of the filesystem.
type Snapshot struct {
ID string `json:"id"`
DeviceID string `json:"deviceId"`
UserID string `json:"userId,omitempty"`
CreatedAt time.Time `json:"createdAt"`
Files []FileEntry `json:"files"`
}
// Change represents a single file change.
type Change struct {
Type ChangeType `json:"type"`
Path string `json:"path"`
OldPath string `json:"oldPath,omitempty"`
Hash string `json:"hash,omitempty"`
Content string `json:"content,omitempty"`
Size int64 `json:"size,omitempty"`
Modified time.Time `json:"modified,omitempty"`
}
// Delta is a list of changes since a snapshot.
type Delta struct {
Changes []Change `json:"changes"`
}
// Conflict represents a file changed on both client and server.
type Conflict struct {
Path string `json:"path"`
ServerHash string `json:"serverHash"`
ClientHash string `json:"clientHash"`
ServerModified time.Time `json:"serverModified"`
ClientModified time.Time `json:"clientModified"`
Strategy ResolutionStrategy `json:"strategy,omitempty"`
}
// DeltaResult is the server's response to a delta upload.
type DeltaResult struct {
ServerDelta []Change `json:"serverDelta"`
Conflicts []Conflict `json:"conflicts"`
NewSnapshotID string `json:"newSnapshotId,omitempty"`
}
// Resolution is a user's choice for resolving a conflict.
type Resolution struct {
Path string `json:"path"`
Strategy ResolutionStrategy `json:"strategy"`
NewPath string `json:"newPath,omitempty"` // for rename-both
Hash string `json:"hash,omitempty"`
Content string `json:"content,omitempty"`
}
// InitRequest starts a new sync session.
type InitRequest struct {
DeviceID string `json:"deviceId"`
RootPath string `json:"rootPath"`
}
// InitResponse returns the server's current snapshot.
type InitResponse struct {
SnapshotID string `json:"snapshotId"`
ServerSnapshot []FileEntry `json:"serverSnapshot"`
}
// DeltaRequest uploads client changes.
type DeltaRequest struct {
SnapshotID string `json:"snapshotId"`
ClientDelta []Change `json:"clientDelta"`
}
// DeltaResponse returns server changes and conflicts.
type DeltaResponse struct {
ServerDelta []Change `json:"serverDelta"`
Conflicts []Conflict `json:"conflicts"`
NewSnapshotID string `json:"newSnapshotId,omitempty"`
}
// ResolveRequest uploads conflict resolutions.
type ResolveRequest struct {
SnapshotID string `json:"snapshotId"`
Resolutions []Resolution `json:"resolutions"`
}
// ResolveResponse confirms the new snapshot.
type ResolveResponse struct {
NewSnapshotID string `json:"newSnapshotId"`
}