mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-07 21:47:02 +09:00
111 lines
3.3 KiB
Go
111 lines
3.3 KiB
Go
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()
|
|
}
|