package clientspace import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "time" ) const CName = "client.clientspace" var log = logger.NewNamed(CName) func New() Service { return &service{} } type Service interface { GetSpace(ctx context.Context, id string) (commonspace.Space, error) CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (commonspace.Space, error) DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (commonspace.Space, error) app.ComponentRunnable } type service struct { conf commonspace.Config spaceCache ocache.OCache commonSpace commonspace.SpaceService spaceStorageProvider spacestorage.SpaceStorageProvider } func (s *service) Init(a *app.App) (err error) { s.conf = a.MustComponent("config").(commonspace.ConfigGetter).GetSpace() s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.SpaceService) s.spaceStorageProvider = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorageProvider) s.spaceCache = ocache.New( s.loadSpace, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), ocache.WithTTL(time.Duration(s.conf.GCTTL)*time.Second), ) return spacesyncproto.DRPCRegisterSpaceSync(a.MustComponent(server.CName).(server.DRPCServer), &rpcHandler{s}) } func (s *service) Name() (name string) { return CName } func (s *service) Run(ctx context.Context) (err error) { return } func (s *service) CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (container commonspace.Space, err error) { id, err := s.commonSpace.CreateSpace(ctx, payload) if err != nil { return } obj, err := s.spaceCache.Get(ctx, id) if err != nil { return } return obj.(commonspace.Space), nil } func (s *service) DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (container commonspace.Space, err error) { id, err := s.commonSpace.DeriveSpace(ctx, payload) if err != nil { return } obj, err := s.spaceCache.Get(ctx, id) if err != nil { return } return obj.(commonspace.Space), nil } func (s *service) GetSpace(ctx context.Context, id string) (container commonspace.Space, err error) { v, err := s.spaceCache.Get(ctx, id) if err != nil { return } return v.(commonspace.Space), nil } func (s *service) loadSpace(ctx context.Context, id string) (value ocache.Object, err error) { cc, err := s.commonSpace.NewSpace(ctx, id) if err != nil { return } ns, err := newClientSpace(cc) if err != nil { return } ns.SyncStatus().(syncstatus.StatusWatcher).SetUpdateReceiver(&statusReceiver{}) if err = ns.Init(ctx); err != nil { return } return ns, nil } func (s *service) Close(ctx context.Context) (err error) { return s.spaceCache.Close() }