// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package interfaces

import (
	wire "v.io/syncbase/v23/services/syncbase/nosql"
	"v.io/v23/security/access"
)

// Sync defines methods for data exchange between Syncbases.
// TODO(hpucha): Flesh this out further.
type Sync interface {
	// GetDeltas returns the responder's current generation vector and all
	// the missing log records when compared to the initiator's generation
	// vector. This process happens one Database at a time encompassing all
	// the SyncGroups common to the initiator and the responder. For each
	// Database, the initiator sends a DeltaReq. In response, the
	// responder sends a "Start" DeltaResp record, all the missing log
	// records, the responder's genvector, and a "Finish" DeltaResp
	// record. The initiator parses the stream between a Start and a Finish
	// record as the response to its DeltaReq, and then moves on to the
	// next Database in common with this responder.
	GetDeltas() stream<DeltaReq, DeltaResp> error {access.Read}

	// SyncGroup-related methods.

	// PublishSyncGroup is typically invoked on a "central" peer to publish
	// the SyncGroup.
	PublishSyncGroup(sg SyncGroup) error {access.Write}

	// JoinSyncGroupAtAdmin is invoked by a prospective SyncGroup member's
	// Syncbase on a SyncGroup admin. It checks whether the requestor is
	// allowed to join the named SyncGroup, and if so, adds the requestor to
	// the SyncGroup.
	JoinSyncGroupAtAdmin(sgName, joinerName string, myInfo wire.SyncGroupMemberInfo) (SyncGroup | error) {access.Read}

	// BlobSync methods.
	// FetchBlob returns the requested blob.
	FetchBlob(br wire.BlobRef) error {access.Read}
}
