1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-12 02:30:41 +09:00

WIP handling sync requests

This commit is contained in:
mcrakhman 2022-07-15 10:14:39 +02:00 committed by Mikhail Iudin
parent 9247866bb6
commit e7469c848c
No known key found for this signature in database
GPG key ID: FAAAA8BAABDFF1C0
3 changed files with 66 additions and 0 deletions

View file

@ -38,6 +38,7 @@ type ACLTree interface {
ACLState() *ACLState
AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*Change, error)
AddChanges(ctx context.Context, changes ...*Change) (AddResult, error)
AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error)
Heads() []string
Root() *Change
Iterate(func(change *Change) bool)
@ -245,6 +246,20 @@ func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuild
return ch, nil
}
func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (AddResult, error) {
var aclChanges []*Change
for _, ch := range rawChanges {
change, err := NewFromRawChange(ch)
// TODO: think what if we will have incorrect signatures on rawChanges, how everything will work
if err != nil {
continue
}
aclChanges = append(aclChanges, change)
}
return a.AddChanges(ctx, aclChanges...)
}
func (a *aclTree) AddChanges(ctx context.Context, changes ...*Change) (AddResult, error) {
a.Lock()
// TODO: make proper error handling, because there are a lot of corner cases where this will break

View file

@ -0,0 +1,43 @@
package sync
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice"
)
type requestHander struct {
treeCache treecache.Service
client SyncClient
}
func (r *requestHander) HandleHeadUpdate(ctx context.Context, senderId string, update *syncpb.SyncHeadUpdate) error {
err := r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error {
_, err := tree.AddRawChanges(ctx, update.Changes...)
if err != nil {
return err
}
shouldFullSync := !r.compareHeads(update.Heads, tree.Heads())
return nil
})
if err != nil {
return err
}
return nil
}
func (r *requestHander) compareHeads(syncHeads []*syncpb.SyncHead, heads []string) bool {
for _, head := range syncHeads {
if slice.FindPos(heads, head.Id) == -1 {
return false
}
}
return true
}
func (r *requestHander) prepareFullSyncRequest(tree acltree.ACLTree) (*syncpb.SyncFullRequest, error) {
}

View file

@ -0,0 +1,8 @@
package sync
import "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/syncpb"
type SyncClient interface {
NotifyHeadsChanged(update *syncpb.SyncHeadUpdate) error
RequestFullSync(id string, request *syncpb.SyncFullRequest) error
}