diff --git a/commonspace/headsync/headsync.go b/commonspace/headsync/headsync.go index 3f5bcd25..b838bd8b 100644 --- a/commonspace/headsync/headsync.go +++ b/commonspace/headsync/headsync.go @@ -57,7 +57,7 @@ type headSync struct { peerManager peermanager.PeerManager treeManager treemanager.TreeManager credentialProvider credentialprovider.CredentialProvider - syncStatus syncstatus.StatusProvider + syncStatus syncstatus.StatusService deletionState deletionstate.ObjectDeletionState } @@ -77,7 +77,7 @@ func (h *headSync) Init(a *app.App) (err error) { h.diff = ldiff.New(16, 16) h.peerManager = a.MustComponent(peermanager.CName).(peermanager.PeerManager) h.credentialProvider = a.MustComponent(credentialprovider.CName).(credentialprovider.CredentialProvider) - h.syncStatus = a.MustComponent(syncstatus.CName).(syncstatus.StatusProvider) + h.syncStatus = a.MustComponent(syncstatus.CName).(syncstatus.StatusService) h.treeManager = a.MustComponent(treemanager.CName).(treemanager.TreeManager) h.deletionState = a.MustComponent(deletionstate.CName).(deletionstate.ObjectDeletionState) h.syncer = newDiffSyncer(h) diff --git a/commonspace/space.go b/commonspace/space.go index 66457a99..d2bbc68b 100644 --- a/commonspace/space.go +++ b/commonspace/space.go @@ -90,7 +90,7 @@ type space struct { treeBuilder objecttreebuilder.TreeBuilderComponent headSync headsync.HeadSync objectSync objectsync.ObjectSync - syncStatus syncstatus.StatusProvider + syncStatus syncstatus.StatusService settings settings.Settings storage spacestorage.SpaceStorage aclList list.AclList @@ -164,7 +164,7 @@ func (s *space) Init(ctx context.Context) (err error) { } s.treeBuilder = s.app.MustComponent(objecttreebuilder.CName).(objecttreebuilder.TreeBuilderComponent) s.headSync = s.app.MustComponent(headsync.CName).(headsync.HeadSync) - s.syncStatus = s.app.MustComponent(syncstatus.CName).(syncstatus.StatusProvider) + s.syncStatus = s.app.MustComponent(syncstatus.CName).(syncstatus.StatusService) 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) diff --git a/commonspace/spaceservice.go b/commonspace/spaceservice.go index dee912ee..3e441aea 100644 --- a/commonspace/spaceservice.go +++ b/commonspace/spaceservice.go @@ -23,6 +23,7 @@ import ( "github.com/anyproto/any-sync/commonspace/spacestate" "github.com/anyproto/any-sync/commonspace/spacestorage" "github.com/anyproto/any-sync/commonspace/spacesyncproto" + "github.com/anyproto/any-sync/commonspace/syncstatus" "github.com/anyproto/any-sync/metric" "github.com/anyproto/any-sync/net/peer" "github.com/anyproto/any-sync/net/pool" @@ -53,16 +54,17 @@ type SpaceService interface { } type spaceService struct { - config config.Config - account accountservice.Service - configurationService nodeconf.Service - storageProvider spacestorage.SpaceStorageProvider - peermanagerProvider peermanager.PeerManagerProvider - credentialProvider credentialprovider.CredentialProvider - treeManager treemanager.TreeManager - pool pool.Pool - metric metric.Metric - app *app.App + config config.Config + account accountservice.Service + configurationService nodeconf.Service + storageProvider spacestorage.SpaceStorageProvider + peerManagerProvider peermanager.PeerManagerProvider + credentialProvider credentialprovider.CredentialProvider + statusServiceProvider syncstatus.StatusServiceProvider + treeManager treemanager.TreeManager + pool pool.Pool + metric metric.Metric + app *app.App } func (s *spaceService) Init(a *app.App) (err error) { @@ -71,7 +73,8 @@ func (s *spaceService) Init(a *app.App) (err error) { s.storageProvider = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorageProvider) s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) s.treeManager = a.MustComponent(treemanager.CName).(treemanager.TreeManager) - s.peermanagerProvider = a.MustComponent(peermanager.CName).(peermanager.PeerManagerProvider) + s.peerManagerProvider = a.MustComponent(peermanager.CName).(peermanager.PeerManagerProvider) + s.statusServiceProvider = a.MustComponent(syncstatus.CName).(syncstatus.StatusServiceProvider) s.pool = a.MustComponent(pool.CName).(pool.Pool) s.metric, _ = a.Component(metric.CName).(metric.Metric) s.app = a @@ -162,14 +165,16 @@ func (s *spaceService) NewSpace(ctx context.Context, id string) (Space, error) { } else { state.TreeBuilderFunc = objecttree.BuildEmptyDataObjectTree } - peerManager, err := s.peermanagerProvider.NewPeerManager(ctx, id) + peerManager, err := s.peerManagerProvider.NewPeerManager(ctx, id) if err != nil { return nil, err } + statusService := s.statusServiceProvider.NewStatusService() spaceApp := s.app.ChildApp() spaceApp.Register(state). Register(peerManager). Register(newCommonStorage(st)). + Register(statusService). Register(syncacl.New()). Register(requestmanager.New()). Register(deletionstate.New()). diff --git a/commonspace/spaceutils_test.go b/commonspace/spaceutils_test.go index 848d3c89..c1d40f5c 100644 --- a/commonspace/spaceutils_test.go +++ b/commonspace/spaceutils_test.go @@ -170,6 +170,25 @@ func (m *mockPeerManagerProvider) NewPeerManager(ctx context.Context, spaceId st return &mockPeerManager{}, nil } +// +// Mock StatusServiceProvider +// + +type mockStatusServiceProvider struct { +} + +func (m *mockStatusServiceProvider) Init(a *app.App) (err error) { + return nil +} + +func (m *mockStatusServiceProvider) Name() (name string) { + return syncstatus.CName +} + +func (m *mockStatusServiceProvider) NewStatusService() syncstatus.StatusService { + return syncstatus.NewNoOpSyncStatus() +} + // // Mock Pool // @@ -339,8 +358,8 @@ func newFixture(t *testing.T) *spaceFixture { } fx.app.Register(fx.account). Register(fx.config). - Register(syncstatus.NewNoOpSyncStatus()). Register(credentialprovider.NewNoOp()). + Register(&mockStatusServiceProvider{}). Register(fx.configurationService). Register(fx.storageProvider). Register(fx.peermanagerProvider). diff --git a/commonspace/syncstatus/noop.go b/commonspace/syncstatus/noop.go index 10ef80ac..79424d3f 100644 --- a/commonspace/syncstatus/noop.go +++ b/commonspace/syncstatus/noop.go @@ -5,7 +5,7 @@ import ( "github.com/anyproto/any-sync/app" ) -func NewNoOpSyncStatus() StatusProvider { +func NewNoOpSyncStatus() StatusService { return &noOpSyncStatus{} } diff --git a/commonspace/syncstatus/syncstatus.go b/commonspace/syncstatus/syncstatus.go index 2049c42b..32c287fa 100644 --- a/commonspace/syncstatus/syncstatus.go +++ b/commonspace/syncstatus/syncstatus.go @@ -46,7 +46,12 @@ type StatusWatcher interface { SetUpdateReceiver(updater UpdateReceiver) } -type StatusProvider interface { +type StatusServiceProvider interface { + app.Component + NewStatusService() StatusService +} + +type StatusService interface { app.ComponentRunnable StatusUpdater StatusWatcher @@ -72,7 +77,7 @@ type treeStatus struct { heads []string } -type syncStatusProvider struct { +type syncStatusService struct { sync.Mutex configuration nodeconf.NodeConf periodicSync periodicsync.PeriodicSync @@ -91,14 +96,14 @@ type syncStatusProvider struct { updateTimeout time.Duration } -func NewSyncStatusProvider() StatusProvider { - return &syncStatusProvider{ +func NewSyncStatusProvider() StatusService { + return &syncStatusService{ treeHeads: map[string]treeHeadsEntry{}, watchers: map[string]struct{}{}, } } -func (s *syncStatusProvider) Init(a *app.App) (err error) { +func (s *syncStatusService) Init(a *app.App) (err error) { sharedState := a.MustComponent(spacestate.CName).(*spacestate.SpaceState) s.updateIntervalSecs = syncUpdateInterval s.updateTimeout = syncTimeout @@ -108,18 +113,18 @@ func (s *syncStatusProvider) Init(a *app.App) (err error) { return } -func (s *syncStatusProvider) Name() (name string) { +func (s *syncStatusService) Name() (name string) { return CName } -func (s *syncStatusProvider) SetUpdateReceiver(updater UpdateReceiver) { +func (s *syncStatusService) SetUpdateReceiver(updater UpdateReceiver) { s.Lock() defer s.Unlock() s.updateReceiver = updater } -func (s *syncStatusProvider) Run(ctx context.Context) error { +func (s *syncStatusService) Run(ctx context.Context) error { s.periodicSync = periodicsync.NewPeriodicSync( s.updateIntervalSecs, s.updateTimeout, @@ -129,7 +134,7 @@ func (s *syncStatusProvider) Run(ctx context.Context) error { return nil } -func (s *syncStatusProvider) HeadsChange(treeId string, heads []string) { +func (s *syncStatusService) HeadsChange(treeId string, heads []string) { s.Lock() defer s.Unlock() @@ -144,7 +149,7 @@ func (s *syncStatusProvider) HeadsChange(treeId string, heads []string) { s.stateCounter++ } -func (s *syncStatusProvider) SetNodesOnline(senderId string, online bool) { +func (s *syncStatusService) SetNodesOnline(senderId string, online bool) { if !s.isSenderResponsible(senderId) { return } @@ -155,7 +160,7 @@ func (s *syncStatusProvider) SetNodesOnline(senderId string, online bool) { s.nodesOnline = online } -func (s *syncStatusProvider) update(ctx context.Context) (err error) { +func (s *syncStatusService) update(ctx context.Context) (err error) { s.treeStatusBuf = s.treeStatusBuf[:0] s.Lock() @@ -184,7 +189,7 @@ func (s *syncStatusProvider) update(ctx context.Context) (err error) { return } -func (s *syncStatusProvider) HeadsReceive(senderId, treeId string, heads []string) { +func (s *syncStatusService) HeadsReceive(senderId, treeId string, heads []string) { s.Lock() defer s.Unlock() @@ -213,7 +218,7 @@ func (s *syncStatusProvider) HeadsReceive(senderId, treeId string, heads []strin s.treeHeads[treeId] = curTreeHeads } -func (s *syncStatusProvider) Watch(treeId string) (err error) { +func (s *syncStatusService) Watch(treeId string) (err error) { s.Lock() defer s.Unlock() _, ok := s.treeHeads[treeId] @@ -243,7 +248,7 @@ func (s *syncStatusProvider) Watch(treeId string) (err error) { return } -func (s *syncStatusProvider) Unwatch(treeId string) { +func (s *syncStatusService) Unwatch(treeId string) { s.Lock() defer s.Unlock() @@ -252,14 +257,14 @@ func (s *syncStatusProvider) Unwatch(treeId string) { } } -func (s *syncStatusProvider) StateCounter() uint64 { +func (s *syncStatusService) StateCounter() uint64 { s.Lock() defer s.Unlock() return s.stateCounter } -func (s *syncStatusProvider) RemoveAllExcept(senderId string, differentRemoteIds []string, stateCounter uint64) { +func (s *syncStatusService) RemoveAllExcept(senderId string, differentRemoteIds []string, stateCounter uint64) { // if sender is not a responsible node, then this should have no effect if !s.isSenderResponsible(senderId) { return @@ -282,11 +287,11 @@ func (s *syncStatusProvider) RemoveAllExcept(senderId string, differentRemoteIds } } -func (s *syncStatusProvider) Close(ctx context.Context) error { +func (s *syncStatusService) Close(ctx context.Context) error { s.periodicSync.Close() return nil } -func (s *syncStatusProvider) isSenderResponsible(senderId string) bool { +func (s *syncStatusService) isSenderResponsible(senderId string) bool { return slices.Contains(s.configuration.NodeIds(s.spaceId), senderId) }