Further components rearrange

This commit is contained in:
mcrakhman 2023-06-01 22:55:37 +02:00
parent eeb87dd144
commit 796b66478b
No known key found for this signature in database
GPG Key ID: DED12CFEF5B8396B
14 changed files with 87 additions and 62 deletions

View File

@ -73,7 +73,7 @@ func (h *headSync) Init(a *app.App) (err error) {
h.syncPeriod = cfg.GetSpace().SyncPeriod h.syncPeriod = cfg.GetSpace().SyncPeriod
h.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf) h.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf)
h.log = log.With(zap.String("spaceId", h.spaceId)) h.log = log.With(zap.String("spaceId", h.spaceId))
h.storage = a.MustComponent("spacestorage").(spacestorage.SpaceStorage) h.storage = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage)
h.diff = ldiff.New(16, 16) h.diff = ldiff.New(16, 16)
h.peerManager = a.MustComponent(peermanager.CName).(peermanager.PeerManager) h.peerManager = a.MustComponent(peermanager.CName).(peermanager.PeerManager)
h.credentialProvider = a.MustComponent(credentialprovider.CName).(credentialprovider.CredentialProvider) h.credentialProvider = a.MustComponent(credentialprovider.CName).(credentialprovider.CredentialProvider)

View File

@ -1,18 +1,39 @@
package syncacl package syncacl
import ( import (
"context"
"github.com/anyproto/any-sync/accountservice"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/commonspace/object/acl/list" "github.com/anyproto/any-sync/commonspace/object/acl/list"
"github.com/anyproto/any-sync/commonspace/objectsync/synchandler" "github.com/anyproto/any-sync/commonspace/spacestorage"
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
) )
const CName = "common.acl.syncacl"
func New() *SyncAcl {
return &SyncAcl{}
}
type SyncAcl struct { type SyncAcl struct {
list.AclList list.AclList
synchandler.SyncHandler
} }
func NewSyncAcl(aclList list.AclList) *SyncAcl { func (s *SyncAcl) HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) {
return &SyncAcl{ return nil
AclList: aclList,
SyncHandler: nil,
} }
func (s *SyncAcl) Init(a *app.App) (err error) {
storage := a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage)
aclStorage, err := storage.AclStorage()
if err != nil {
return err
}
acc := a.MustComponent(accountservice.CName).(accountservice.Service)
s.AclList, err = list.BuildAclListWithIdentity(acc.Account(), aclStorage)
return err
}
func (s *SyncAcl) Name() (name string) {
return CName
} }

View File

@ -3,9 +3,11 @@ package commonspace
import ( import (
"context" "context"
"github.com/anyproto/any-sync/app" "github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl"
"github.com/anyproto/any-sync/commonspace/object/syncobjectgetter" "github.com/anyproto/any-sync/commonspace/object/syncobjectgetter"
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree" "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
"github.com/anyproto/any-sync/commonspace/object/treemanager" "github.com/anyproto/any-sync/commonspace/object/treemanager"
"github.com/anyproto/any-sync/commonspace/settings"
"github.com/anyproto/any-sync/commonspace/spacestate" "github.com/anyproto/any-sync/commonspace/spacestate"
"sync/atomic" "sync/atomic"
) )
@ -29,37 +31,41 @@ func NewObjectManager(manager treemanager.TreeManager) ObjectManager {
} }
} }
func (c *objectManager) Init(a *app.App) (err error) { func (o *objectManager) Init(a *app.App) (err error) {
state := a.MustComponent(spacestate.CName).(*spacestate.SpaceState) state := a.MustComponent(spacestate.CName).(*spacestate.SpaceState)
c.spaceId = state.SpaceId o.spaceId = state.SpaceId
c.spaceIsClosed = state.SpaceIsClosed o.spaceIsClosed = state.SpaceIsClosed
settingsObject := a.MustComponent(settings.CName).(settings.Settings).SettingsObject()
acl := a.MustComponent(syncacl.CName).(*syncacl.SyncAcl)
o.AddObject(settingsObject)
o.AddObject(acl)
return nil return nil
} }
func (c *objectManager) Run(ctx context.Context) (err error) { func (o *objectManager) Run(ctx context.Context) (err error) {
return nil return nil
} }
func (c *objectManager) Close(ctx context.Context) (err error) { func (o *objectManager) Close(ctx context.Context) (err error) {
return nil return nil
} }
func (c *objectManager) AddObject(object syncobjectgetter.SyncObject) { func (o *objectManager) AddObject(object syncobjectgetter.SyncObject) {
c.reservedObjects = append(c.reservedObjects, object) o.reservedObjects = append(o.reservedObjects, object)
} }
func (c *objectManager) GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error) { func (o *objectManager) GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error) {
if c.spaceIsClosed.Load() { if o.spaceIsClosed.Load() {
return nil, ErrSpaceClosed return nil, ErrSpaceClosed
} }
if obj := c.getReservedObject(treeId); obj != nil { if obj := o.getReservedObject(treeId); obj != nil {
return obj.(objecttree.ObjectTree), nil return obj.(objecttree.ObjectTree), nil
} }
return c.TreeManager.GetTree(ctx, spaceId, treeId) return o.TreeManager.GetTree(ctx, spaceId, treeId)
} }
func (c *objectManager) getReservedObject(id string) syncobjectgetter.SyncObject { func (o *objectManager) getReservedObject(id string) syncobjectgetter.SyncObject {
for _, obj := range c.reservedObjects { for _, obj := range o.reservedObjects {
if obj != nil && obj.Id() == id { if obj != nil && obj.Id() == id {
return obj return obj
} }
@ -67,14 +73,14 @@ func (c *objectManager) getReservedObject(id string) syncobjectgetter.SyncObject
return nil return nil
} }
func (c *objectManager) GetObject(ctx context.Context, objectId string) (obj syncobjectgetter.SyncObject, err error) { func (o *objectManager) GetObject(ctx context.Context, objectId string) (obj syncobjectgetter.SyncObject, err error) {
if c.spaceIsClosed.Load() { if o.spaceIsClosed.Load() {
return nil, ErrSpaceClosed return nil, ErrSpaceClosed
} }
if obj := c.getReservedObject(objectId); obj != nil { if obj := o.getReservedObject(objectId); obj != nil {
return obj, nil return obj, nil
} }
t, err := c.TreeManager.GetTree(ctx, c.spaceId, objectId) t, err := o.TreeManager.GetTree(ctx, o.spaceId, objectId)
if err != nil { if err != nil {
return return
} }

View File

@ -69,6 +69,7 @@ type objectSync struct {
func (s *objectSync) Init(a *app.App) (err error) { func (s *objectSync) Init(a *app.App) (err error) {
s.syncClient = a.MustComponent(syncclient.CName).(syncclient.SyncClient) s.syncClient = a.MustComponent(syncclient.CName).(syncclient.SyncClient)
s.spaceStorage = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage)
s.objectGetter = a.MustComponent(treemanager.CName).(treemanager.TreeManager).(syncobjectgetter.SyncObjectGetter) s.objectGetter = a.MustComponent(treemanager.CName).(treemanager.TreeManager).(syncobjectgetter.SyncObjectGetter)
s.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf) s.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf)
sharedData := a.MustComponent(spacestate.CName).(*spacestate.SpaceState) sharedData := a.MustComponent(spacestate.CName).(*spacestate.SpaceState)

View File

@ -7,6 +7,7 @@ import (
"github.com/anyproto/any-sync/app/logger" "github.com/anyproto/any-sync/app/logger"
"github.com/anyproto/any-sync/commonspace/headsync" "github.com/anyproto/any-sync/commonspace/headsync"
"github.com/anyproto/any-sync/commonspace/object/acl/list" "github.com/anyproto/any-sync/commonspace/object/acl/list"
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl"
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree" "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
"github.com/anyproto/any-sync/commonspace/object/tree/synctree" "github.com/anyproto/any-sync/commonspace/object/tree/synctree"
"github.com/anyproto/any-sync/commonspace/object/tree/synctree/updatelistener" "github.com/anyproto/any-sync/commonspace/object/tree/synctree/updatelistener"
@ -76,14 +77,13 @@ type treeBuilder struct {
func (t *treeBuilder) Init(a *app.App) (err error) { func (t *treeBuilder) Init(a *app.App) (err error) {
state := a.MustComponent(spacestate.CName).(*spacestate.SpaceState) state := a.MustComponent(spacestate.CName).(*spacestate.SpaceState)
t.spaceId = state.SpaceId t.spaceId = state.SpaceId
t.aclList = state.AclList
t.isClosed = state.SpaceIsClosed t.isClosed = state.SpaceIsClosed
t.spaceStorage = state.SpaceStorage
t.treesUsed = state.TreesUsed t.treesUsed = state.TreesUsed
t.builder = state.TreeBuilderFunc t.builder = state.TreeBuilderFunc
t.aclList = a.MustComponent(syncacl.CName).(*syncacl.SyncAcl)
t.spaceStorage = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage)
t.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf) t.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf)
t.headsNotifiable = a.MustComponent(headsync.CName).(headsync.HeadSync) t.headsNotifiable = a.MustComponent(headsync.CName).(headsync.HeadSync)
t.spaceStorage = state.SpaceStorage
t.syncStatus = a.MustComponent(syncstatus.CName).(syncstatus.StatusUpdater) t.syncStatus = a.MustComponent(syncstatus.CName).(syncstatus.StatusUpdater)
t.peerManager = a.MustComponent(peermanager.CName).(peermanager.PeerManager) t.peerManager = a.MustComponent(peermanager.CName).(peermanager.PeerManager)
t.objectSync = a.MustComponent(objectsync.CName).(objectsync.ObjectSync) t.objectSync = a.MustComponent(objectsync.CName).(objectsync.ObjectSync)

View File

@ -11,6 +11,7 @@ import (
const CName = "common.commonspace.peermanager" const CName = "common.commonspace.peermanager"
type PeerManager interface { type PeerManager interface {
app.Component
// SendPeer sends a message to a stream by peerId // SendPeer sends a message to a stream by peerId
SendPeer(ctx context.Context, peerId string, msg *spacesyncproto.ObjectSyncMessage) (err error) SendPeer(ctx context.Context, peerId string, msg *spacesyncproto.ObjectSyncMessage) (err error)
// Broadcast sends a message to all subscribed peers // Broadcast sends a message to all subscribed peers

View File

@ -25,6 +25,7 @@ type Settings interface {
DeleteTree(ctx context.Context, id string) (err error) DeleteTree(ctx context.Context, id string) (err error)
SpaceDeleteRawChange(ctx context.Context) (raw *treechangeproto.RawTreeChangeWithId, err error) SpaceDeleteRawChange(ctx context.Context) (raw *treechangeproto.RawTreeChangeWithId, err error)
DeleteSpace(ctx context.Context, deleteChange *treechangeproto.RawTreeChangeWithId) (err error) DeleteSpace(ctx context.Context, deleteChange *treechangeproto.RawTreeChangeWithId) (err error)
SettingsObject() SettingsObject
app.ComponentRunnable app.ComponentRunnable
} }
@ -54,7 +55,7 @@ func (s *settings) Init(a *app.App) (err error) {
s.treeBuilder = a.MustComponent(objecttreebuilder.CName).(objecttreebuilder.TreeBuilderComponent) s.treeBuilder = a.MustComponent(objecttreebuilder.CName).(objecttreebuilder.TreeBuilderComponent)
sharedState := a.MustComponent(spacestate.CName).(*spacestate.SpaceState) sharedState := a.MustComponent(spacestate.CName).(*spacestate.SpaceState)
s.storage = sharedState.SpaceStorage s.storage = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage)
s.spaceIsDeleted = sharedState.SpaceIsDeleted s.spaceIsDeleted = sharedState.SpaceIsDeleted
deps := Deps{ deps := Deps{
@ -115,3 +116,7 @@ func (s *settings) onSpaceDelete() {
} }
s.spaceIsDeleted.Swap(true) s.spaceIsDeleted.Swap(true)
} }
func (s *settings) SettingsObject() SettingsObject {
return s.settingsObject
}

View File

@ -89,6 +89,7 @@ type space struct {
objectSync objectsync.ObjectSync objectSync objectsync.ObjectSync
syncStatus syncstatus.StatusProvider syncStatus syncstatus.StatusProvider
settings settings.Settings settings settings.Settings
storage spacestorage.SpaceStorage
} }
func (s *space) DeleteTree(ctx context.Context, id string) (err error) { func (s *space) DeleteTree(ctx context.Context, id string) (err error) {
@ -125,19 +126,16 @@ func (s *space) Init(ctx context.Context) (err error) {
s.syncStatus = s.app.MustComponent(syncstatus.CName).(syncstatus.StatusProvider) s.syncStatus = s.app.MustComponent(syncstatus.CName).(syncstatus.StatusProvider)
s.settings = s.app.MustComponent(settings.CName).(settings.Settings) s.settings = s.app.MustComponent(settings.CName).(settings.Settings)
s.objectSync = s.app.MustComponent(objectsync.CName).(objectsync.ObjectSync) s.objectSync = s.app.MustComponent(objectsync.CName).(objectsync.ObjectSync)
s.storage = s.app.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage)
return nil return nil
} }
func (s *space) HeadSync() headsync.HeadSyncExternal {
return s.headSync
}
func (s *space) SyncStatus() syncstatus.StatusUpdater { func (s *space) SyncStatus() syncstatus.StatusUpdater {
return s.syncStatus return s.syncStatus
} }
func (s *space) Storage() spacestorage.SpaceStorage { func (s *space) Storage() spacestorage.SpaceStorage {
return s.state.SpaceStorage return s.storage
} }
func (s *space) Close() error { func (s *space) Close() error {

View File

@ -10,7 +10,6 @@ import (
"github.com/anyproto/any-sync/commonspace/deletionstate" "github.com/anyproto/any-sync/commonspace/deletionstate"
"github.com/anyproto/any-sync/commonspace/headsync" "github.com/anyproto/any-sync/commonspace/headsync"
"github.com/anyproto/any-sync/commonspace/object/acl/aclrecordproto" "github.com/anyproto/any-sync/commonspace/object/acl/aclrecordproto"
"github.com/anyproto/any-sync/commonspace/object/acl/list"
"github.com/anyproto/any-sync/commonspace/object/acl/syncacl" "github.com/anyproto/any-sync/commonspace/object/acl/syncacl"
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree" "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
"github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto" "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
@ -159,22 +158,11 @@ func (s *spaceService) NewSpace(ctx context.Context, id string) (Space, error) {
return nil, err return nil, err
} }
spaceIsDeleted.Swap(isDeleted) spaceIsDeleted.Swap(isDeleted)
aclStorage, err := st.AclStorage()
if err != nil {
return nil, err
}
aclList, err := list.BuildAclListWithIdentity(s.account.Account(), aclStorage)
if err != nil {
return nil, err
}
aclList = syncacl.NewSyncAcl(aclList)
state := &spacestate.SpaceState{ state := &spacestate.SpaceState{
SpaceId: st.Id(), SpaceId: st.Id(),
SpaceIsDeleted: spaceIsDeleted, SpaceIsDeleted: spaceIsDeleted,
SpaceIsClosed: spaceIsClosed, SpaceIsClosed: spaceIsClosed,
TreesUsed: &atomic.Int32{}, TreesUsed: &atomic.Int32{},
AclList: aclList,
SpaceStorage: st,
} }
if s.config.KeepTreeDataInMemory { if s.config.KeepTreeDataInMemory {
state.TreeBuilderFunc = objecttree.BuildObjectTree state.TreeBuilderFunc = objecttree.BuildObjectTree
@ -188,20 +176,21 @@ func (s *spaceService) NewSpace(ctx context.Context, id string) (Space, error) {
} else { } else {
syncStatus = syncstatus.NewNoOpSyncStatus() syncStatus = syncstatus.NewNoOpSyncStatus()
} }
//lastConfiguration := s.configurationService peerManager, err := s.peermanagerProvider.NewPeerManager(ctx, id)
// if err != nil {
//peerManager, err := s.peermanagerProvider.NewPeerManager(ctx, id) return nil, err
//if err != nil { }
// return nil, err
//}
spaceApp := s.app.ChildApp() spaceApp := s.app.ChildApp()
spaceApp.Register(state). spaceApp.Register(state).
Register(peerManager).
Register(newCommonStorage(st)).
Register(syncacl.New()).
Register(syncStatus). Register(syncStatus).
Register(NewObjectManager(s.treeManager)).
Register(streamsender.New()). Register(streamsender.New()).
Register(requestsender.New()). Register(requestsender.New()).
Register(deletionstate.New()). Register(deletionstate.New()).
Register(settings.New()). Register(settings.New()).
Register(NewObjectManager(s.treeManager)).
Register(syncclient.New()). Register(syncclient.New()).
Register(objecttreebuilder.New()). Register(objecttreebuilder.New()).
Register(objectsync.New()). Register(objectsync.New()).

View File

@ -2,21 +2,17 @@ package spacestate
import ( import (
"github.com/anyproto/any-sync/app" "github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/commonspace/object/acl/list"
"github.com/anyproto/any-sync/commonspace/object/tree/objecttree" "github.com/anyproto/any-sync/commonspace/object/tree/objecttree"
"github.com/anyproto/any-sync/commonspace/spacestorage"
"sync/atomic" "sync/atomic"
) )
const CName = "common.commonspace.shareddata" const CName = "common.commonspace.spacestate"
type SpaceState struct { type SpaceState struct {
SpaceId string SpaceId string
SpaceIsDeleted *atomic.Bool SpaceIsDeleted *atomic.Bool
SpaceIsClosed *atomic.Bool SpaceIsClosed *atomic.Bool
TreesUsed *atomic.Int32 TreesUsed *atomic.Int32
AclList list.AclList
SpaceStorage spacestorage.SpaceStorage
TreeBuilderFunc objecttree.BuildObjectTreeFunc TreeBuilderFunc objecttree.BuildObjectTreeFunc
} }

View File

@ -1,6 +1,7 @@
package spacestorage package spacestorage
import ( import (
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/commonspace/object/acl/aclrecordproto" "github.com/anyproto/any-sync/commonspace/object/acl/aclrecordproto"
"github.com/anyproto/any-sync/commonspace/object/acl/liststorage" "github.com/anyproto/any-sync/commonspace/object/acl/liststorage"
"github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto" "github.com/anyproto/any-sync/commonspace/object/tree/treechangeproto"
@ -21,6 +22,14 @@ type InMemorySpaceStorage struct {
sync.Mutex sync.Mutex
} }
func (i *InMemorySpaceStorage) Init(a *app.App) (err error) {
return nil
}
func (i *InMemorySpaceStorage) Name() (name string) {
return CName
}
func NewInMemorySpaceStorage(payload SpaceStorageCreatePayload) (SpaceStorage, error) { func NewInMemorySpaceStorage(payload SpaceStorageCreatePayload) (SpaceStorage, error) {
aclStorage, err := liststorage.NewInMemoryAclListStorage(payload.AclWithId.Id, []*aclrecordproto.RawAclRecordWithId{payload.AclWithId}) aclStorage, err := liststorage.NewInMemoryAclListStorage(payload.AclWithId.Id, []*aclrecordproto.RawAclRecordWithId{payload.AclWithId})
if err != nil { if err != nil {

View File

@ -27,8 +27,8 @@ const (
TreeDeletedStatusDeleted = "deleted" TreeDeletedStatusDeleted = "deleted"
) )
// TODO: consider moving to some file with all common interfaces etc
type SpaceStorage interface { type SpaceStorage interface {
app.Component
Id() string Id() string
SetSpaceDeleted() error SetSpaceDeleted() error
IsSpaceDeleted() (bool, error) IsSpaceDeleted() (bool, error)

View File

@ -1 +0,0 @@
package spacestorage

View File

@ -102,9 +102,9 @@ func (s *syncStatusProvider) Init(a *app.App) (err error) {
sharedState := a.MustComponent(spacestate.CName).(*spacestate.SpaceState) sharedState := a.MustComponent(spacestate.CName).(*spacestate.SpaceState)
s.updateIntervalSecs = syncUpdateInterval s.updateIntervalSecs = syncUpdateInterval
s.updateTimeout = syncTimeout s.updateTimeout = syncTimeout
s.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf)
s.storage = sharedState.SpaceStorage
s.spaceId = sharedState.SpaceId s.spaceId = sharedState.SpaceId
s.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf)
s.storage = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage)
return return
} }