From 796b66478bc8e2c33539510bb13e8d5adaa30d40 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 1 Jun 2023 22:55:37 +0200 Subject: [PATCH] Further components rearrange --- commonspace/headsync/headsync.go | 2 +- commonspace/object/acl/syncacl/syncacl.go | 35 ++++++++++++---- .../{commongetter.go => objectmanager.go} | 40 +++++++++++-------- commonspace/objectsync/objectsync.go | 1 + commonspace/objecttreebuilder/treebuilder.go | 6 +-- commonspace/peermanager/peermanager.go | 1 + commonspace/settings/settings.go | 7 +++- commonspace/space.go | 8 ++-- commonspace/spaceservice.go | 27 ++++--------- commonspace/spacestate/shareddata.go | 6 +-- commonspace/spacestorage/inmemorystorage.go | 9 +++++ commonspace/spacestorage/spacestorage.go | 2 +- commonspace/spacestorage/spacestorage_test.go | 1 - commonspace/syncstatus/syncstatus.go | 4 +- 14 files changed, 87 insertions(+), 62 deletions(-) rename commonspace/{commongetter.go => objectmanager.go} (53%) delete mode 100644 commonspace/spacestorage/spacestorage_test.go diff --git a/commonspace/headsync/headsync.go b/commonspace/headsync/headsync.go index 0d761fd5..cfa1ca4e 100644 --- a/commonspace/headsync/headsync.go +++ b/commonspace/headsync/headsync.go @@ -73,7 +73,7 @@ func (h *headSync) Init(a *app.App) (err error) { h.syncPeriod = cfg.GetSpace().SyncPeriod h.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf) 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.peerManager = a.MustComponent(peermanager.CName).(peermanager.PeerManager) h.credentialProvider = a.MustComponent(credentialprovider.CName).(credentialprovider.CredentialProvider) diff --git a/commonspace/object/acl/syncacl/syncacl.go b/commonspace/object/acl/syncacl/syncacl.go index cc728e4a..0824b74f 100644 --- a/commonspace/object/acl/syncacl/syncacl.go +++ b/commonspace/object/acl/syncacl/syncacl.go @@ -1,18 +1,39 @@ package syncacl 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/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 { list.AclList - synchandler.SyncHandler } -func NewSyncAcl(aclList list.AclList) *SyncAcl { - return &SyncAcl{ - AclList: aclList, - SyncHandler: nil, - } +func (s *SyncAcl) HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) { + return 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 } diff --git a/commonspace/commongetter.go b/commonspace/objectmanager.go similarity index 53% rename from commonspace/commongetter.go rename to commonspace/objectmanager.go index 93c9312d..b97533c8 100644 --- a/commonspace/commongetter.go +++ b/commonspace/objectmanager.go @@ -3,9 +3,11 @@ package commonspace import ( "context" "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/tree/objecttree" "github.com/anyproto/any-sync/commonspace/object/treemanager" + "github.com/anyproto/any-sync/commonspace/settings" "github.com/anyproto/any-sync/commonspace/spacestate" "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) - c.spaceId = state.SpaceId - c.spaceIsClosed = state.SpaceIsClosed + o.spaceId = state.SpaceId + 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 } -func (c *objectManager) Run(ctx context.Context) (err error) { +func (o *objectManager) Run(ctx context.Context) (err error) { return nil } -func (c *objectManager) Close(ctx context.Context) (err error) { +func (o *objectManager) Close(ctx context.Context) (err error) { return nil } -func (c *objectManager) AddObject(object syncobjectgetter.SyncObject) { - c.reservedObjects = append(c.reservedObjects, object) +func (o *objectManager) AddObject(object syncobjectgetter.SyncObject) { + o.reservedObjects = append(o.reservedObjects, object) } -func (c *objectManager) GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error) { - if c.spaceIsClosed.Load() { +func (o *objectManager) GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error) { + if o.spaceIsClosed.Load() { return nil, ErrSpaceClosed } - if obj := c.getReservedObject(treeId); obj != nil { + if obj := o.getReservedObject(treeId); obj != 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 { - for _, obj := range c.reservedObjects { +func (o *objectManager) getReservedObject(id string) syncobjectgetter.SyncObject { + for _, obj := range o.reservedObjects { if obj != nil && obj.Id() == id { return obj } @@ -67,14 +73,14 @@ func (c *objectManager) getReservedObject(id string) syncobjectgetter.SyncObject return nil } -func (c *objectManager) GetObject(ctx context.Context, objectId string) (obj syncobjectgetter.SyncObject, err error) { - if c.spaceIsClosed.Load() { +func (o *objectManager) GetObject(ctx context.Context, objectId string) (obj syncobjectgetter.SyncObject, err error) { + if o.spaceIsClosed.Load() { return nil, ErrSpaceClosed } - if obj := c.getReservedObject(objectId); obj != nil { + if obj := o.getReservedObject(objectId); 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 { return } diff --git a/commonspace/objectsync/objectsync.go b/commonspace/objectsync/objectsync.go index 0a836cff..93b4d8de 100644 --- a/commonspace/objectsync/objectsync.go +++ b/commonspace/objectsync/objectsync.go @@ -69,6 +69,7 @@ type objectSync struct { func (s *objectSync) Init(a *app.App) (err error) { 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.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf) sharedData := a.MustComponent(spacestate.CName).(*spacestate.SpaceState) diff --git a/commonspace/objecttreebuilder/treebuilder.go b/commonspace/objecttreebuilder/treebuilder.go index cf15c49c..01259887 100644 --- a/commonspace/objecttreebuilder/treebuilder.go +++ b/commonspace/objecttreebuilder/treebuilder.go @@ -7,6 +7,7 @@ import ( "github.com/anyproto/any-sync/app/logger" "github.com/anyproto/any-sync/commonspace/headsync" "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/synctree" "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) { state := a.MustComponent(spacestate.CName).(*spacestate.SpaceState) t.spaceId = state.SpaceId - t.aclList = state.AclList t.isClosed = state.SpaceIsClosed - t.spaceStorage = state.SpaceStorage t.treesUsed = state.TreesUsed 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.headsNotifiable = a.MustComponent(headsync.CName).(headsync.HeadSync) - t.spaceStorage = state.SpaceStorage t.syncStatus = a.MustComponent(syncstatus.CName).(syncstatus.StatusUpdater) t.peerManager = a.MustComponent(peermanager.CName).(peermanager.PeerManager) t.objectSync = a.MustComponent(objectsync.CName).(objectsync.ObjectSync) diff --git a/commonspace/peermanager/peermanager.go b/commonspace/peermanager/peermanager.go index a4075f32..095a7059 100644 --- a/commonspace/peermanager/peermanager.go +++ b/commonspace/peermanager/peermanager.go @@ -11,6 +11,7 @@ import ( const CName = "common.commonspace.peermanager" type PeerManager interface { + app.Component // SendPeer sends a message to a stream by peerId SendPeer(ctx context.Context, peerId string, msg *spacesyncproto.ObjectSyncMessage) (err error) // Broadcast sends a message to all subscribed peers diff --git a/commonspace/settings/settings.go b/commonspace/settings/settings.go index 95252388..c2a55407 100644 --- a/commonspace/settings/settings.go +++ b/commonspace/settings/settings.go @@ -25,6 +25,7 @@ type Settings interface { DeleteTree(ctx context.Context, id string) (err error) SpaceDeleteRawChange(ctx context.Context) (raw *treechangeproto.RawTreeChangeWithId, err error) DeleteSpace(ctx context.Context, deleteChange *treechangeproto.RawTreeChangeWithId) (err error) + SettingsObject() SettingsObject app.ComponentRunnable } @@ -54,7 +55,7 @@ func (s *settings) Init(a *app.App) (err error) { s.treeBuilder = a.MustComponent(objecttreebuilder.CName).(objecttreebuilder.TreeBuilderComponent) sharedState := a.MustComponent(spacestate.CName).(*spacestate.SpaceState) - s.storage = sharedState.SpaceStorage + s.storage = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage) s.spaceIsDeleted = sharedState.SpaceIsDeleted deps := Deps{ @@ -115,3 +116,7 @@ func (s *settings) onSpaceDelete() { } s.spaceIsDeleted.Swap(true) } + +func (s *settings) SettingsObject() SettingsObject { + return s.settingsObject +} diff --git a/commonspace/space.go b/commonspace/space.go index a5732e5b..d870b732 100644 --- a/commonspace/space.go +++ b/commonspace/space.go @@ -89,6 +89,7 @@ type space struct { objectSync objectsync.ObjectSync syncStatus syncstatus.StatusProvider settings settings.Settings + storage spacestorage.SpaceStorage } 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.settings = s.app.MustComponent(settings.CName).(settings.Settings) s.objectSync = s.app.MustComponent(objectsync.CName).(objectsync.ObjectSync) + s.storage = s.app.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage) return nil } -func (s *space) HeadSync() headsync.HeadSyncExternal { - return s.headSync -} - func (s *space) SyncStatus() syncstatus.StatusUpdater { return s.syncStatus } func (s *space) Storage() spacestorage.SpaceStorage { - return s.state.SpaceStorage + return s.storage } func (s *space) Close() error { diff --git a/commonspace/spaceservice.go b/commonspace/spaceservice.go index 796a3daf..e157a37c 100644 --- a/commonspace/spaceservice.go +++ b/commonspace/spaceservice.go @@ -10,7 +10,6 @@ import ( "github.com/anyproto/any-sync/commonspace/deletionstate" "github.com/anyproto/any-sync/commonspace/headsync" "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/tree/objecttree" "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 } 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{ SpaceId: st.Id(), SpaceIsDeleted: spaceIsDeleted, SpaceIsClosed: spaceIsClosed, TreesUsed: &atomic.Int32{}, - AclList: aclList, - SpaceStorage: st, } if s.config.KeepTreeDataInMemory { state.TreeBuilderFunc = objecttree.BuildObjectTree @@ -188,20 +176,21 @@ func (s *spaceService) NewSpace(ctx context.Context, id string) (Space, error) { } else { syncStatus = syncstatus.NewNoOpSyncStatus() } - //lastConfiguration := s.configurationService - // - //peerManager, err := s.peermanagerProvider.NewPeerManager(ctx, id) - //if err != nil { - // return nil, err - //} + peerManager, err := s.peermanagerProvider.NewPeerManager(ctx, id) + if err != nil { + return nil, err + } spaceApp := s.app.ChildApp() spaceApp.Register(state). + Register(peerManager). + Register(newCommonStorage(st)). + Register(syncacl.New()). Register(syncStatus). - Register(NewObjectManager(s.treeManager)). Register(streamsender.New()). Register(requestsender.New()). Register(deletionstate.New()). Register(settings.New()). + Register(NewObjectManager(s.treeManager)). Register(syncclient.New()). Register(objecttreebuilder.New()). Register(objectsync.New()). diff --git a/commonspace/spacestate/shareddata.go b/commonspace/spacestate/shareddata.go index 9d6eac2f..b2a53a50 100644 --- a/commonspace/spacestate/shareddata.go +++ b/commonspace/spacestate/shareddata.go @@ -2,21 +2,17 @@ package spacestate import ( "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/spacestorage" "sync/atomic" ) -const CName = "common.commonspace.shareddata" +const CName = "common.commonspace.spacestate" type SpaceState struct { SpaceId string SpaceIsDeleted *atomic.Bool SpaceIsClosed *atomic.Bool TreesUsed *atomic.Int32 - AclList list.AclList - SpaceStorage spacestorage.SpaceStorage TreeBuilderFunc objecttree.BuildObjectTreeFunc } diff --git a/commonspace/spacestorage/inmemorystorage.go b/commonspace/spacestorage/inmemorystorage.go index b728a8a6..db1d1166 100644 --- a/commonspace/spacestorage/inmemorystorage.go +++ b/commonspace/spacestorage/inmemorystorage.go @@ -1,6 +1,7 @@ package spacestorage import ( + "github.com/anyproto/any-sync/app" "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/tree/treechangeproto" @@ -21,6 +22,14 @@ type InMemorySpaceStorage struct { 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) { aclStorage, err := liststorage.NewInMemoryAclListStorage(payload.AclWithId.Id, []*aclrecordproto.RawAclRecordWithId{payload.AclWithId}) if err != nil { diff --git a/commonspace/spacestorage/spacestorage.go b/commonspace/spacestorage/spacestorage.go index cecd3736..a4ffaecb 100644 --- a/commonspace/spacestorage/spacestorage.go +++ b/commonspace/spacestorage/spacestorage.go @@ -27,8 +27,8 @@ const ( TreeDeletedStatusDeleted = "deleted" ) -// TODO: consider moving to some file with all common interfaces etc type SpaceStorage interface { + app.Component Id() string SetSpaceDeleted() error IsSpaceDeleted() (bool, error) diff --git a/commonspace/spacestorage/spacestorage_test.go b/commonspace/spacestorage/spacestorage_test.go deleted file mode 100644 index 7ca39ae0..00000000 --- a/commonspace/spacestorage/spacestorage_test.go +++ /dev/null @@ -1 +0,0 @@ -package spacestorage diff --git a/commonspace/syncstatus/syncstatus.go b/commonspace/syncstatus/syncstatus.go index edc12175..2049c42b 100644 --- a/commonspace/syncstatus/syncstatus.go +++ b/commonspace/syncstatus/syncstatus.go @@ -102,9 +102,9 @@ func (s *syncStatusProvider) Init(a *app.App) (err error) { sharedState := a.MustComponent(spacestate.CName).(*spacestate.SpaceState) s.updateIntervalSecs = syncUpdateInterval s.updateTimeout = syncTimeout - s.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf) - s.storage = sharedState.SpaceStorage s.spaceId = sharedState.SpaceId + s.configuration = a.MustComponent(nodeconf.CName).(nodeconf.NodeConf) + s.storage = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorage) return }