1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-08 05:57:03 +09:00
any-sync/commonspace/object/tree/synctree/responsecollector.go
2024-11-06 19:15:07 +01:00

79 lines
2.2 KiB
Go

package synctree
import (
"context"
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
"github.com/anyproto/any-sync/commonspace/object/tree/synctree/response"
"github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
"github.com/anyproto/any-sync/commonspace/object/tree/treestorage"
"github.com/anyproto/any-sync/commonspace/sync/syncdeps"
)
type fullResponseCollector struct {
deps BuildDeps
heads []string
root *treechangeproto.RawTreeChangeWithId
changes []*treechangeproto.RawTreeChangeWithId
objectTree objecttree.ObjectTree
}
func newFullResponseCollector(deps BuildDeps) *fullResponseCollector {
return &fullResponseCollector{
deps: deps,
}
}
func (r *fullResponseCollector) CollectResponse(ctx context.Context, peerId, objectId string, resp syncdeps.Response) error {
treeResp, ok := resp.(*response.Response)
if !ok {
return ErrUnexpectedResponseType
}
if r.objectTree == nil {
createPayload := treestorage.TreeStorageCreatePayload{
RootRawChange: treeResp.Root,
Changes: treeResp.Changes,
Heads: treeResp.Heads,
}
validator := r.deps.ValidateObjectTree
if validator == nil {
validator = objecttree.ValidateRawTreeDefault
}
objTree, err := validator(createPayload, r.deps.SpaceStorage, r.deps.AclList)
if err != nil {
return err
}
r.objectTree = objTree
return nil
}
r.objectTree.Lock()
defer r.objectTree.Unlock()
_, err := r.objectTree.AddRawChanges(ctx, objecttree.RawChangesPayload{
NewHeads: treeResp.Heads,
RawChanges: treeResp.Changes,
})
if err != nil {
return err
}
return nil
}
func (r *fullResponseCollector) NewResponse() syncdeps.Response {
return &response.Response{}
}
type responseCollector struct {
handler syncdeps.ObjectSyncHandler
}
func newResponseCollector(handler syncdeps.ObjectSyncHandler) *responseCollector {
return &responseCollector{handler: handler}
}
func (r *responseCollector) CollectResponse(ctx context.Context, peerId, objectId string, resp syncdeps.Response) error {
return r.handler.HandleResponse(ctx, peerId, objectId, resp)
}
func (r *responseCollector) NewResponse() syncdeps.Response {
return &response.Response{}
}