1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-07 21:47:02 +09:00
any-sync/commonspace/object/tree/synctree/requestfactory.go

67 lines
2.3 KiB
Go

package synctree
import (
"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/sync/objectsync/objectmessages"
)
const batchSize = 1024 * 1024
type RequestFactory interface {
CreateHeadUpdate(t objecttree.ObjectTree, ignoredPeer string, added []*treechangeproto.RawTreeChangeWithId) (headUpdate *objectmessages.HeadUpdate, err error)
CreateNewTreeRequest(peerId, objectId string) *objectmessages.Request
CreateFullSyncRequest(peerId string, t objecttree.ObjectTree) (*objectmessages.Request, error)
CreateResponseProducer(t objecttree.ObjectTree, theirHeads, theirSnapshotPath []string) (response.ResponseProducer, error)
}
func NewRequestFactory(spaceId string) RequestFactory {
return &requestFactory{spaceId}
}
type requestFactory struct {
spaceId string
}
func (r *requestFactory) CreateHeadUpdate(t objecttree.ObjectTree, ignoredPeer string, added []*treechangeproto.RawTreeChangeWithId) (headUpdate *objectmessages.HeadUpdate, err error) {
broadcastOpts := BroadcastOptions{}
if ignoredPeer != "" {
broadcastOpts.EmptyPeers = []string{ignoredPeer}
}
snapshotPath, err := t.SnapshotPath()
if err != nil {
return
}
headUpdate = &objectmessages.HeadUpdate{
Meta: objectmessages.ObjectMeta{
ObjectId: t.Id(),
SpaceId: r.spaceId,
},
Update: &InnerHeadUpdate{
opts: broadcastOpts,
heads: t.Heads(),
changes: added,
snapshotPath: snapshotPath,
root: t.Header(),
},
}
err = headUpdate.Update.Prepare()
return
}
func (r *requestFactory) CreateNewTreeRequest(peerId, objectId string) *objectmessages.Request {
return NewRequest(peerId, r.spaceId, objectId, nil, nil, nil)
}
func (r *requestFactory) CreateFullSyncRequest(peerId string, t objecttree.ObjectTree) (*objectmessages.Request, error) {
path, err := t.SnapshotPath()
if err != nil {
return nil, err
}
return NewRequest(peerId, r.spaceId, t.Id(), t.Heads(), path, t.Header()), nil
}
func (r *requestFactory) CreateResponseProducer(t objecttree.ObjectTree, theirHeads, theirSnapshotPath []string) (response.ResponseProducer, error) {
return response.NewResponseProducer(r.spaceId, t, theirHeads, theirSnapshotPath)
}