55 lines
1.7 KiB
Go
55 lines
1.7 KiB
Go
package syncacl
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/anyproto/any-sync/commonspace/object/acl/list"
|
|
"github.com/anyproto/any-sync/consensus/consensusproto"
|
|
)
|
|
|
|
type RequestFactory interface {
|
|
CreateHeadUpdate(l list.AclList, added []*consensusproto.RawRecordWithId) (msg *consensusproto.LogSyncMessage)
|
|
CreateFullSyncRequest(l list.AclList, theirHead string) (req *consensusproto.LogSyncMessage, err error)
|
|
CreateFullSyncResponse(l list.AclList, theirHead string) (*consensusproto.LogSyncMessage, error)
|
|
}
|
|
|
|
type requestFactory struct{}
|
|
|
|
func NewRequestFactory() RequestFactory {
|
|
return &requestFactory{}
|
|
}
|
|
|
|
func (r *requestFactory) CreateHeadUpdate(l list.AclList, added []*consensusproto.RawRecordWithId) (msg *consensusproto.LogSyncMessage) {
|
|
return consensusproto.WrapHeadUpdate(&consensusproto.LogHeadUpdate{
|
|
Head: l.Head().Id,
|
|
Records: added,
|
|
}, l.Root())
|
|
}
|
|
|
|
func (r *requestFactory) CreateFullSyncRequest(l list.AclList, theirHead string) (req *consensusproto.LogSyncMessage, err error) {
|
|
if !l.HasHead(theirHead) {
|
|
return consensusproto.WrapFullRequest(&consensusproto.LogFullSyncRequest{
|
|
Head: l.Head().Id,
|
|
}, l.Root()), nil
|
|
}
|
|
records, err := l.RecordsAfter(context.Background(), theirHead)
|
|
if err != nil {
|
|
return
|
|
}
|
|
return consensusproto.WrapFullRequest(&consensusproto.LogFullSyncRequest{
|
|
Head: l.Head().Id,
|
|
Records: records,
|
|
}, l.Root()), nil
|
|
}
|
|
|
|
func (r *requestFactory) CreateFullSyncResponse(l list.AclList, theirHead string) (resp *consensusproto.LogSyncMessage, err error) {
|
|
records, err := l.RecordsAfter(context.Background(), theirHead)
|
|
if err != nil {
|
|
return
|
|
}
|
|
return consensusproto.WrapFullResponse(&consensusproto.LogFullSyncResponse{
|
|
Head: l.Head().Id,
|
|
Records: records,
|
|
}, l.Root()), nil
|
|
}
|