mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-08 05:57:03 +09:00
222 lines
7 KiB
Go
222 lines
7 KiB
Go
package clientdebugrpc
|
|
|
|
import (
|
|
"context"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/debug/clientdebugrpc/clientdebugrpcproto"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileservice"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
|
"github.com/ipfs/go-cid"
|
|
"go.uber.org/zap"
|
|
"io"
|
|
"math/rand"
|
|
"os"
|
|
)
|
|
|
|
type rpcHandler struct {
|
|
spaceService clientspace.Service
|
|
storageService storage.ClientStorage
|
|
docService document.Service
|
|
account accountservice.Service
|
|
file fileservice.FileService
|
|
}
|
|
|
|
func (r *rpcHandler) Watch(ctx context.Context, request *clientdebugrpcproto.WatchRequest) (resp *clientdebugrpcproto.WatchResponse, err error) {
|
|
space, err := r.spaceService.GetSpace(context.Background(), request.SpaceId)
|
|
if err != nil {
|
|
return
|
|
}
|
|
watcher := space.SyncStatus().(syncstatus.StatusWatcher)
|
|
watcher.Watch(request.TreeId)
|
|
resp = &clientdebugrpcproto.WatchResponse{}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) Unwatch(ctx context.Context, request *clientdebugrpcproto.UnwatchRequest) (resp *clientdebugrpcproto.UnwatchResponse, err error) {
|
|
space, err := r.spaceService.GetSpace(context.Background(), request.SpaceId)
|
|
if err != nil {
|
|
return
|
|
}
|
|
watcher := space.SyncStatus().(syncstatus.StatusWatcher)
|
|
watcher.Unwatch(request.TreeId)
|
|
resp = &clientdebugrpcproto.UnwatchResponse{}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) LoadSpace(ctx context.Context, request *clientdebugrpcproto.LoadSpaceRequest) (resp *clientdebugrpcproto.LoadSpaceResponse, err error) {
|
|
_, err = r.spaceService.GetSpace(context.Background(), request.SpaceId)
|
|
if err != nil {
|
|
return
|
|
}
|
|
resp = &clientdebugrpcproto.LoadSpaceResponse{}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) CreateSpace(ctx context.Context, request *clientdebugrpcproto.CreateSpaceRequest) (resp *clientdebugrpcproto.CreateSpaceResponse, err error) {
|
|
key, err := symmetric.NewRandom()
|
|
if err != nil {
|
|
return
|
|
}
|
|
sp, err := r.spaceService.CreateSpace(context.Background(), commonspace.SpaceCreatePayload{
|
|
SigningKey: r.account.Account().SignKey,
|
|
EncryptionKey: r.account.Account().EncKey,
|
|
ReadKey: key.Bytes(),
|
|
ReplicationKey: rand.Uint64(),
|
|
})
|
|
if err != nil {
|
|
return
|
|
}
|
|
id := sp.Id()
|
|
if err != nil {
|
|
return
|
|
}
|
|
resp = &clientdebugrpcproto.CreateSpaceResponse{Id: id}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) DeriveSpace(ctx context.Context, request *clientdebugrpcproto.DeriveSpaceRequest) (resp *clientdebugrpcproto.DeriveSpaceResponse, err error) {
|
|
sp, err := r.spaceService.DeriveSpace(context.Background(), commonspace.SpaceDerivePayload{
|
|
SigningKey: r.account.Account().SignKey,
|
|
EncryptionKey: r.account.Account().EncKey,
|
|
})
|
|
if err != nil {
|
|
return
|
|
}
|
|
id := sp.Id()
|
|
if err != nil {
|
|
return
|
|
}
|
|
resp = &clientdebugrpcproto.DeriveSpaceResponse{Id: id}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) CreateDocument(ctx context.Context, request *clientdebugrpcproto.CreateDocumentRequest) (resp *clientdebugrpcproto.CreateDocumentResponse, err error) {
|
|
id, err := r.docService.CreateDocument(request.SpaceId)
|
|
if err != nil {
|
|
return
|
|
}
|
|
resp = &clientdebugrpcproto.CreateDocumentResponse{Id: id}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) DeleteDocument(ctx context.Context, request *clientdebugrpcproto.DeleteDocumentRequest) (resp *clientdebugrpcproto.DeleteDocumentResponse, err error) {
|
|
err = r.docService.DeleteDocument(request.SpaceId, request.DocumentId)
|
|
if err != nil {
|
|
return
|
|
}
|
|
resp = &clientdebugrpcproto.DeleteDocumentResponse{}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) AddText(ctx context.Context, request *clientdebugrpcproto.AddTextRequest) (resp *clientdebugrpcproto.AddTextResponse, err error) {
|
|
root, head, err := r.docService.AddText(request.SpaceId, request.DocumentId, request.Text, request.IsSnapshot)
|
|
if err != nil {
|
|
return
|
|
}
|
|
resp = &clientdebugrpcproto.AddTextResponse{
|
|
DocumentId: request.DocumentId,
|
|
HeadId: head,
|
|
RootId: root,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) DumpTree(ctx context.Context, request *clientdebugrpcproto.DumpTreeRequest) (resp *clientdebugrpcproto.DumpTreeResponse, err error) {
|
|
dump, err := r.docService.DumpDocumentTree(request.SpaceId, request.DocumentId)
|
|
if err != nil {
|
|
return
|
|
}
|
|
resp = &clientdebugrpcproto.DumpTreeResponse{
|
|
Dump: dump,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) AllTrees(ctx context.Context, request *clientdebugrpcproto.AllTreesRequest) (resp *clientdebugrpcproto.AllTreesResponse, err error) {
|
|
heads, err := r.docService.AllDocumentHeads(request.SpaceId)
|
|
if err != nil {
|
|
return
|
|
}
|
|
var trees []*clientdebugrpcproto.Tree
|
|
for _, head := range heads {
|
|
trees = append(trees, &clientdebugrpcproto.Tree{
|
|
Id: head.Id,
|
|
Heads: head.Heads,
|
|
})
|
|
}
|
|
resp = &clientdebugrpcproto.AllTreesResponse{Trees: trees}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) AllSpaces(ctx context.Context, request *clientdebugrpcproto.AllSpacesRequest) (resp *clientdebugrpcproto.AllSpacesResponse, err error) {
|
|
ids, err := r.storageService.AllSpaceIds()
|
|
if err != nil {
|
|
return
|
|
}
|
|
resp = &clientdebugrpcproto.AllSpacesResponse{SpaceIds: ids}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) TreeParams(ctx context.Context, request *clientdebugrpcproto.TreeParamsRequest) (resp *clientdebugrpcproto.TreeParamsResponse, err error) {
|
|
root, heads, err := r.docService.TreeParams(request.SpaceId, request.DocumentId)
|
|
if err != nil {
|
|
return
|
|
}
|
|
resp = &clientdebugrpcproto.TreeParamsResponse{
|
|
RootId: root,
|
|
HeadIds: heads,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (r *rpcHandler) PutFile(ctx context.Context, request *clientdebugrpcproto.PutFileRequest) (*clientdebugrpcproto.PutFileResponse, error) {
|
|
f, err := os.Open(request.Path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer f.Close()
|
|
n, err := r.file.AddFile(ctx, f)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &clientdebugrpcproto.PutFileResponse{
|
|
Hash: n.Cid().String(),
|
|
}, nil
|
|
}
|
|
|
|
func (r *rpcHandler) GetFile(ctx context.Context, request *clientdebugrpcproto.GetFileRequest) (*clientdebugrpcproto.GetFileResponse, error) {
|
|
c, err := cid.Parse(request.Hash)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
f, err := os.Create(request.Path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer f.Close()
|
|
|
|
rd, err := r.file.GetFile(ctx, c)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rd.Close()
|
|
wr, err := io.Copy(f, rd)
|
|
if err != nil && err != io.EOF {
|
|
return nil, err
|
|
}
|
|
log.Info("copied bytes", zap.Int64("size", wr))
|
|
return &clientdebugrpcproto.GetFileResponse{
|
|
Path: request.Path,
|
|
}, nil
|
|
}
|
|
|
|
func (r *rpcHandler) DeleteFile(ctx context.Context, request *clientdebugrpcproto.DeleteFileRequest) (*clientdebugrpcproto.DeleteFileResponse, error) {
|
|
//TODO implement me
|
|
panic("implement me")
|
|
}
|