1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-09 17:44:59 +09:00

Merge pull request #27 from anytypeio/proto-fixes

#26 Proto: full message coverage with comments; proto fixes, scenarios
This commit is contained in:
Roman Khafizianov 2019-11-13 12:37:38 +02:00 committed by GitHub
commit c1c5d9df58
Signed by: github
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 4282 additions and 2628 deletions

View file

@ -33,8 +33,8 @@ func TestAccountCreate(t *testing.T) {
accountCreateResp := mw.AccountCreate(&pb.RpcAccountCreateRequest{Name: "name_test", Avatar: &pb.RpcAccountCreateRequestAvatarOfAvatarLocalPath{"testdata/pic1.jpg"}})
require.Equal(t, "name_test", accountCreateResp.Account.Name, "AccountCreateResponse has account with wrong name '%s'", accountCreateResp.Account.Name)
imageGetBlobResp := mw.ImageGetBlob(&pb.RpcImageGetBlobRequest{Id: accountCreateResp.Account.Avatar.GetImage().Id, Size_: pb.ModelImage_SMALL})
require.Equal(t, pb.RpcImageGetBlobResponseError_NULL, imageGetBlobResp.Error.Code, "ImageGetBlobResponse contains error: %+v", imageGetBlobResp.Error)
imageGetBlobResp := mw.ImageGetBlob(&pb.RpcIpfsImageGetBlobRequest{Id: accountCreateResp.Account.Avatar.GetImage().Id, Size_: pb.ModelImage_SMALL})
require.Equal(t, pb.RpcIpfsImageGetBlobResponseError_NULL, imageGetBlobResp.Error.Code, "ImageGetBlobResponse contains error: %+v", imageGetBlobResp.Error)
require.True(t, len(imageGetBlobResp.Blob) > 0, "ava size should be greater than 0")
err := mw.Stop()

View file

@ -9,9 +9,9 @@ import (
"github.com/textileio/go-textile/ipfs"
)
func (mw *Middleware) IpfsGetFile(req *pb.RpcIpfsGetFileRequest) *pb.RpcIpfsGetFileResponse {
response := func(data []byte, media string, name string, code pb.RpcIpfsGetFileResponseErrorCode, err error) *pb.RpcIpfsGetFileResponse {
m := &pb.RpcIpfsGetFileResponse{Data: data, Media: media, Error: &pb.RpcIpfsGetFileResponseError{Code: code}}
func (mw *Middleware) IpfsGetFile(req *pb.RpcIpfsFileGetRequest) *pb.RpcIpfsFileGetResponse {
response := func(data []byte, media string, name string, code pb.RpcIpfsFileGetResponseErrorCode, err error) *pb.RpcIpfsFileGetResponse {
m := &pb.RpcIpfsFileGetResponse{Data: data, Media: media, Error: &pb.RpcIpfsFileGetResponseError{Code: code}}
if err != nil {
m.Error.Description = err.Error()
}
@ -22,18 +22,18 @@ func (mw *Middleware) IpfsGetFile(req *pb.RpcIpfsGetFileRequest) *pb.RpcIpfsGetF
reader, info, err := mw.Anytype.Textile.Node().FileContent(req.Id)
if err != nil {
if err == core2.ErrFileNotFound {
return response(nil, "", "", pb.RpcIpfsGetFileResponseError_NOT_FOUND, err)
return response(nil, "", "", pb.RpcIpfsFileGetResponseError_NOT_FOUND, err)
}
return response(nil, "", "", pb.RpcIpfsGetFileResponseError_UNKNOWN_ERROR, err)
return response(nil, "", "", pb.RpcIpfsFileGetResponseError_UNKNOWN_ERROR, err)
}
data, err := ioutil.ReadAll(reader)
if err != nil {
return response(nil, "", "", pb.RpcIpfsGetFileResponseError_UNKNOWN_ERROR, err)
return response(nil, "", "", pb.RpcIpfsFileGetResponseError_UNKNOWN_ERROR, err)
}
return response(data, info.Media, info.Name, pb.RpcIpfsGetFileResponseError_NULL, nil)
return response(data, info.Media, info.Name, pb.RpcIpfsFileGetResponseError_NULL, nil)
}
/*
@ -68,9 +68,9 @@ func IpfsGetData(b []byte) []byte {
*/
func (mw *Middleware) ImageGetBlob(req *pb.RpcImageGetBlobRequest) *pb.RpcImageGetBlobResponse {
response := func(blob []byte, code pb.RpcImageGetBlobResponseErrorCode, err error) *pb.RpcImageGetBlobResponse {
m := &pb.RpcImageGetBlobResponse{Blob: blob, Error: &pb.RpcImageGetBlobResponseError{Code: code}}
func (mw *Middleware) ImageGetBlob(req *pb.RpcIpfsImageGetBlobRequest) *pb.RpcIpfsImageGetBlobResponse {
response := func(blob []byte, code pb.RpcIpfsImageGetBlobResponseErrorCode, err error) *pb.RpcIpfsImageGetBlobResponse {
m := &pb.RpcIpfsImageGetBlobResponse{Blob: blob, Error: &pb.RpcIpfsImageGetBlobResponseError{Code: code}}
if err != nil {
m.Error.Description = err.Error()
}
@ -81,11 +81,11 @@ func (mw *Middleware) ImageGetBlob(req *pb.RpcImageGetBlobRequest) *pb.RpcImageG
data, err := ipfs.DataAtPath(mw.Anytype.Textile.Node().Ipfs(), req.Id+"/0/"+strings.ToLower(req.GetSize_().String())+"/content")
if err != nil {
if err == core2.ErrFileNotFound {
return response(nil, pb.RpcImageGetBlobResponseError_NOT_FOUND, err)
return response(nil, pb.RpcIpfsImageGetBlobResponseError_NOT_FOUND, err)
}
return response(nil, pb.RpcImageGetBlobResponseError_UNKNOWN_ERROR, err)
return response(nil, pb.RpcIpfsImageGetBlobResponseError_UNKNOWN_ERROR, err)
}
return response(data, pb.RpcImageGetBlobResponseError_NULL, nil)
return response(data, pb.RpcIpfsImageGetBlobResponseError_NULL, nil)
}

File diff suppressed because it is too large Load diff

View file

@ -24,32 +24,33 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
func init() { proto.RegisterFile("service.proto", fileDescriptor_a0b84a42fa06f626) }
var fileDescriptor_a0b84a42fa06f626 = []byte{
// 396 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x94, 0x4f, 0x4e, 0xf2, 0x40,
0x18, 0x87, 0x21, 0x5f, 0xf2, 0xa1, 0x23, 0x10, 0x33, 0x4b, 0x12, 0x2a, 0xff, 0x8c, 0xae, 0x66,
0xa1, 0x27, 0x10, 0x16, 0x60, 0x82, 0x1a, 0x41, 0x25, 0x92, 0xb8, 0x28, 0xc3, 0x1b, 0xd2, 0x58,
0x66, 0x6a, 0x3b, 0x90, 0x70, 0x0b, 0x6f, 0xe3, 0x15, 0x5c, 0xb2, 0x74, 0x69, 0xe0, 0x22, 0xa6,
0xed, 0xeb, 0x98, 0x96, 0xb6, 0x6c, 0xe7, 0x79, 0x7e, 0x4f, 0xc9, 0x4c, 0x02, 0x29, 0x79, 0xe0,
0x2e, 0x2d, 0x0e, 0xcc, 0x71, 0xa5, 0x92, 0xb4, 0x60, 0x8a, 0x95, 0x5a, 0x39, 0x50, 0x29, 0x73,
0x39, 0x9f, 0x9b, 0x62, 0xea, 0x85, 0xe0, 0xe2, 0xe3, 0x80, 0x94, 0x3b, 0xb6, 0x05, 0x42, 0x75,
0x10, 0xd0, 0x11, 0x29, 0x8e, 0x4c, 0xdb, 0x06, 0xd5, 0x71, 0xc1, 0x54, 0x40, 0x1b, 0x0c, 0xc7,
0x6c, 0xe0, 0x70, 0x16, 0x22, 0x16, 0x32, 0x36, 0x80, 0xb7, 0x05, 0x78, 0xaa, 0xd2, 0xcc, 0x74,
0x3c, 0x47, 0x0a, 0x0f, 0xe8, 0x98, 0x94, 0x42, 0x32, 0x00, 0x2e, 0x97, 0xe0, 0xd2, 0xc4, 0x15,
0x42, 0x9d, 0x6e, 0x65, 0x4b, 0xd8, 0x7e, 0x21, 0xe5, 0x2b, 0xce, 0xe5, 0x42, 0xe8, 0x78, 0x74,
0x87, 0x70, 0xa7, 0x7e, 0xba, 0xc7, 0xfa, 0xfb, 0xe9, 0xc8, 0xf0, 0x52, 0x9a, 0x89, 0xbb, 0xd8,
0xad, 0xb4, 0xb2, 0xa5, 0x9d, 0xf6, 0x10, 0x6c, 0xe0, 0x2a, 0xa5, 0x1d, 0xc2, 0x3d, 0x6d, 0x2d,
0x61, 0xfb, 0x99, 0x14, 0xaf, 0xe7, 0xe6, 0x0c, 0xba, 0xa0, 0xda, 0xb6, 0x9c, 0xc4, 0xd2, 0x01,
0x62, 0x5d, 0x50, 0xcc, 0x87, 0x29, 0xe9, 0x1d, 0x09, 0xd3, 0xf7, 0x84, 0x3c, 0x81, 0xeb, 0x59,
0x52, 0x74, 0x41, 0xd1, 0x5a, 0x64, 0x83, 0x20, 0x58, 0xfd, 0x56, 0xeb, 0x19, 0x06, 0x26, 0x7b,
0xa4, 0xd0, 0x97, 0xb3, 0x21, 0x88, 0x29, 0xad, 0x46, 0xec, 0xbe, 0x9c, 0x31, 0xff, 0x58, 0xc7,
0x8c, 0x34, 0x8c, 0xa5, 0x5b, 0x72, 0xd8, 0xb6, 0x25, 0x7f, 0xbd, 0x73, 0x40, 0xd0, 0x93, 0x88,
0x1c, 0x9c, 0x33, 0x1f, 0xe8, 0x5a, 0x2d, 0x5d, 0xc0, 0xde, 0x03, 0x39, 0x0a, 0x8e, 0xf1, 0xf5,
0xeb, 0x09, 0x83, 0xd8, 0xdb, 0x37, 0xb2, 0x94, 0x58, 0xf5, 0xd1, 0x99, 0xa6, 0x55, 0x43, 0x94,
0x59, 0xd5, 0x0a, 0x56, 0x81, 0x1c, 0x07, 0xa0, 0x67, 0x79, 0x4a, 0xba, 0xab, 0x1b, 0xb9, 0x04,
0x7a, 0x96, 0xb0, 0x43, 0xce, 0x7c, 0x41, 0x7f, 0xe0, 0x7c, 0xbf, 0x18, 0x7e, 0xa6, 0x5d, 0xfd,
0xdc, 0x18, 0xf9, 0xf5, 0xc6, 0xc8, 0x7f, 0x6f, 0x8c, 0xfc, 0xfb, 0xd6, 0xc8, 0xad, 0xb7, 0x46,
0xee, 0x6b, 0x6b, 0xe4, 0xc6, 0xff, 0x6c, 0x6b, 0x32, 0xf9, 0x1f, 0xfc, 0xbf, 0x5c, 0xfe, 0x04,
0x00, 0x00, 0xff, 0xff, 0xfc, 0x61, 0x96, 0x16, 0x89, 0x04, 0x00, 0x00,
// 406 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0x4f, 0x6f, 0xda, 0x30,
0x18, 0x87, 0x41, 0x93, 0xc6, 0xe6, 0x01, 0x9a, 0x7c, 0x44, 0x22, 0xe3, 0xdf, 0x34, 0x76, 0xf1,
0x61, 0xfb, 0x04, 0x83, 0x03, 0x20, 0xb1, 0x56, 0x85, 0xb6, 0x48, 0x48, 0x3d, 0x04, 0xf3, 0x16,
0x45, 0x0d, 0x76, 0x1a, 0x1b, 0x24, 0xbe, 0x45, 0xbf, 0x52, 0x6f, 0x3d, 0x72, 0xec, 0xb1, 0x82,
0x2f, 0x52, 0x25, 0x79, 0xeb, 0x2a, 0x90, 0x84, 0x5e, 0xfd, 0x3c, 0xbf, 0xc7, 0x28, 0xb2, 0x20,
0x25, 0x05, 0xfe, 0xda, 0xe1, 0xc0, 0x3c, 0x5f, 0x6a, 0x49, 0x0b, 0xb6, 0xd8, 0xe8, 0x8d, 0x07,
0x95, 0x32, 0x97, 0xcb, 0xa5, 0x2d, 0xe6, 0x2a, 0x02, 0x7f, 0x1e, 0xbf, 0x90, 0x72, 0xd7, 0x75,
0x40, 0xe8, 0x2e, 0x02, 0x3a, 0x21, 0xc5, 0x89, 0xed, 0xba, 0xa0, 0xbb, 0x3e, 0xd8, 0x1a, 0x68,
0x83, 0xe1, 0x98, 0x8d, 0x3c, 0xce, 0x22, 0xc4, 0x22, 0xc6, 0x46, 0x70, 0xbf, 0x02, 0xa5, 0x2b,
0xcd, 0x4c, 0x47, 0x79, 0x52, 0x28, 0xa0, 0x53, 0x52, 0x8a, 0xc8, 0x08, 0xb8, 0x5c, 0x83, 0x4f,
0x13, 0x57, 0x08, 0x4d, 0xba, 0x95, 0x2d, 0x61, 0xfb, 0x86, 0x94, 0xff, 0x71, 0x2e, 0x57, 0xc2,
0xc4, 0xe3, 0x3b, 0x84, 0x47, 0xf5, 0x9f, 0x27, 0xac, 0xf7, 0x9f, 0x8e, 0x0c, 0x3f, 0x4a, 0x33,
0x71, 0x77, 0xf0, 0x55, 0x5a, 0xd9, 0xd2, 0x51, 0x7b, 0x0c, 0x2e, 0x70, 0x9d, 0xd2, 0x8e, 0xe0,
0x89, 0xb6, 0x91, 0xb0, 0xcd, 0x49, 0x71, 0xb0, 0xb4, 0x17, 0xd0, 0x03, 0xdd, 0x71, 0xe5, 0x8c,
0xb6, 0x63, 0xab, 0x81, 0x77, 0xab, 0x58, 0xc8, 0x59, 0x0f, 0x34, 0x0b, 0x0c, 0xd3, 0xff, 0xfd,
0x01, 0x13, 0x2f, 0xb9, 0x20, 0xe4, 0x1a, 0x7c, 0xe5, 0x48, 0xd1, 0x03, 0x4d, 0x6b, 0xb1, 0x21,
0x82, 0x70, 0xf5, 0x96, 0xae, 0x67, 0x18, 0x98, 0xec, 0x93, 0xc2, 0x50, 0x2e, 0xc6, 0x20, 0xe6,
0xb4, 0x1a, 0xb3, 0x87, 0x72, 0xc1, 0x82, 0x63, 0x13, 0xb3, 0xd2, 0x30, 0x96, 0xce, 0xc8, 0xd7,
0x8e, 0x2b, 0xf9, 0xdd, 0xb9, 0x07, 0x82, 0xfe, 0x88, 0xc9, 0xe1, 0x39, 0x0b, 0x80, 0xa9, 0xd5,
0xd2, 0x05, 0xec, 0x5d, 0x92, 0x6f, 0xe1, 0x31, 0xbe, 0x83, 0x7a, 0xc2, 0xe0, 0xe0, 0x15, 0x34,
0xb2, 0x94, 0x83, 0xea, 0x95, 0x37, 0x4f, 0xab, 0x46, 0x28, 0xb3, 0x6a, 0x14, 0xac, 0x02, 0xf9,
0x1e, 0x82, 0xbe, 0xa3, 0xb4, 0xf4, 0x37, 0xff, 0xe5, 0x1a, 0xe8, 0xaf, 0x84, 0x1d, 0x72, 0x16,
0x08, 0xe6, 0x82, 0xf6, 0x69, 0x31, 0xba, 0xa6, 0x53, 0x7d, 0xda, 0x59, 0xf9, 0xed, 0xce, 0xca,
0xbf, 0xec, 0xac, 0xfc, 0xc3, 0xde, 0xca, 0x6d, 0xf7, 0x56, 0xee, 0x79, 0x6f, 0xe5, 0xa6, 0x9f,
0x5c, 0x67, 0x36, 0xfb, 0x1c, 0xfe, 0xd3, 0xfc, 0x7d, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x9f, 0x2a,
0x77, 0x4e, 0x93, 0x04, 0x00, 0x00,
}
// This is a compile-time assertion to ensure that this generated file
@ -64,7 +65,7 @@ type ClientCommandsHandler interface {
AccountRecover(*pb.RpcAccountRecoverRequest) *pb.RpcAccountRecoverResponse
AccountCreate(*pb.RpcAccountCreateRequest) *pb.RpcAccountCreateResponse
AccountSelect(*pb.RpcAccountSelectRequest) *pb.RpcAccountSelectResponse
ImageGetBlob(*pb.RpcImageGetBlobRequest) *pb.RpcImageGetBlobResponse
ImageGetBlob(*pb.RpcIpfsImageGetBlobRequest) *pb.RpcIpfsImageGetBlobResponse
VersionGet(*pb.RpcVersionGetRequest) *pb.RpcVersionGetResponse
LogSend(*pb.RpcLogSendRequest) *pb.RpcLogSendResponse
BlockOpen(*pb.RpcBlockOpenRequest) *pb.RpcBlockOpenResponse
@ -128,9 +129,9 @@ func AccountSelect(b []byte) []byte {
}
func ImageGetBlob(b []byte) []byte {
in := new(pb.RpcImageGetBlobRequest)
in := new(pb.RpcIpfsImageGetBlobRequest)
if err := in.Unmarshal(b); err != nil {
resp, _ := (&pb.RpcImageGetBlobResponse{Error: &pb.RpcImageGetBlobResponseError{Code: pb.RpcImageGetBlobResponseError_BAD_INPUT, Description: err.Error()}}).Marshal()
resp, _ := (&pb.RpcIpfsImageGetBlobResponse{Error: &pb.RpcIpfsImageGetBlobResponseError{Code: pb.RpcIpfsImageGetBlobResponseError_BAD_INPUT, Description: err.Error()}}).Marshal()
return resp
}
resp, _ := clientCommandsHandler.ImageGetBlob(in).Marshal()

View file

@ -22,6 +22,8 @@ var _ = math.Inf
// proto package needs to be updated.
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
//
// Change contains single block change or list of block changes.
type Change struct {
}
@ -58,6 +60,8 @@ func (m *Change) XXX_DiscardUnknown() {
var xxx_messageInfo_Change proto.InternalMessageInfo
//
// Change.Block contains only one, single change for one block.
type ChangeBlock struct {
}
@ -876,6 +880,8 @@ func (*ChangeBlockContentText) XXX_OneofWrappers() []interface{} {
}
}
//
// Change.Single contains only one, single change, but for a list of blocks.
type ChangeSingle struct {
}
@ -913,7 +919,8 @@ func (m *ChangeSingle) XXX_DiscardUnknown() {
var xxx_messageInfo_ChangeSingle proto.InternalMessageInfo
type ChangeSingleBlocksList struct {
Id []string `protobuf:"bytes,1,rep,name=id,proto3" json:"id,omitempty"`
Id []string `protobuf:"bytes,1,rep,name=id,proto3" json:"id,omitempty"`
Author *ModelAccount `protobuf:"bytes,2,opt,name=author,proto3" json:"author,omitempty"`
// Types that are valid to be assigned to Change:
// *ChangeSingleBlocksListChangeOfText
// *ChangeSingleBlocksListChangeOfFields
@ -967,31 +974,31 @@ type isChangeSingleBlocksListChange interface {
}
type ChangeSingleBlocksListChangeOfText struct {
Text *ChangeBlockContentText `protobuf:"bytes,2,opt,name=text,proto3,oneof" json:"text,omitempty"`
Text *ChangeBlockContentText `protobuf:"bytes,3,opt,name=text,proto3,oneof" json:"text,omitempty"`
}
type ChangeSingleBlocksListChangeOfFields struct {
Fields *ChangeBlockFields `protobuf:"bytes,3,opt,name=fields,proto3,oneof" json:"fields,omitempty"`
Fields *ChangeBlockFields `protobuf:"bytes,4,opt,name=fields,proto3,oneof" json:"fields,omitempty"`
}
type ChangeSingleBlocksListChangeOfPremissions struct {
Premissions *ChangeBlockPermissions `protobuf:"bytes,4,opt,name=premissions,proto3,oneof" json:"premissions,omitempty"`
Premissions *ChangeBlockPermissions `protobuf:"bytes,5,opt,name=premissions,proto3,oneof" json:"premissions,omitempty"`
}
type ChangeSingleBlocksListChangeOfChildrenIds struct {
ChildrenIds *ChangeBlockChildrenIds `protobuf:"bytes,5,opt,name=childrenIds,proto3,oneof" json:"childrenIds,omitempty"`
ChildrenIds *ChangeBlockChildrenIds `protobuf:"bytes,6,opt,name=childrenIds,proto3,oneof" json:"childrenIds,omitempty"`
}
type ChangeSingleBlocksListChangeOfPage struct {
Page *ChangeBlockContentPage `protobuf:"bytes,6,opt,name=page,proto3,oneof" json:"page,omitempty"`
Page *ChangeBlockContentPage `protobuf:"bytes,7,opt,name=page,proto3,oneof" json:"page,omitempty"`
}
type ChangeSingleBlocksListChangeOfDashboard struct {
Dashboard *ChangeBlockContentDashboard `protobuf:"bytes,7,opt,name=dashboard,proto3,oneof" json:"dashboard,omitempty"`
Dashboard *ChangeBlockContentDashboard `protobuf:"bytes,8,opt,name=dashboard,proto3,oneof" json:"dashboard,omitempty"`
}
type ChangeSingleBlocksListChangeOfVideo struct {
Video *ChangeBlockContentVideo `protobuf:"bytes,8,opt,name=video,proto3,oneof" json:"video,omitempty"`
Video *ChangeBlockContentVideo `protobuf:"bytes,9,opt,name=video,proto3,oneof" json:"video,omitempty"`
}
type ChangeSingleBlocksListChangeOfImage struct {
Image *ChangeBlockContentImage `protobuf:"bytes,9,opt,name=image,proto3,oneof" json:"image,omitempty"`
Image *ChangeBlockContentImage `protobuf:"bytes,10,opt,name=image,proto3,oneof" json:"image,omitempty"`
}
type ChangeSingleBlocksListChangeOfFile struct {
File *ChangeBlockContentFile `protobuf:"bytes,10,opt,name=file,proto3,oneof" json:"file,omitempty"`
File *ChangeBlockContentFile `protobuf:"bytes,11,opt,name=file,proto3,oneof" json:"file,omitempty"`
}
func (*ChangeSingleBlocksListChangeOfText) isChangeSingleBlocksListChange() {}
@ -1018,6 +1025,13 @@ func (m *ChangeSingleBlocksList) GetId() []string {
return nil
}
func (m *ChangeSingleBlocksList) GetAuthor() *ModelAccount {
if m != nil {
return m.Author
}
return nil
}
func (m *ChangeSingleBlocksList) GetText() *ChangeBlockContentText {
if x, ok := m.GetChange().(*ChangeSingleBlocksListChangeOfText); ok {
return x.Text
@ -1096,6 +1110,8 @@ func (*ChangeSingleBlocksList) XXX_OneofWrappers() []interface{} {
}
}
//
// Change.Multiple contains array of changes, for a list of blocks each.
type ChangeMultiple struct {
}
@ -1133,7 +1149,8 @@ func (m *ChangeMultiple) XXX_DiscardUnknown() {
var xxx_messageInfo_ChangeMultiple proto.InternalMessageInfo
type ChangeMultipleBlocksList struct {
Changes []*ChangeSingleBlocksList `protobuf:"bytes,1,rep,name=changes,proto3" json:"changes,omitempty"`
Author *ModelAccount `protobuf:"bytes,1,opt,name=author,proto3" json:"author,omitempty"`
Changes []*ChangeSingleBlocksList `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"`
}
func (m *ChangeMultipleBlocksList) Reset() { *m = ChangeMultipleBlocksList{} }
@ -1169,6 +1186,13 @@ func (m *ChangeMultipleBlocksList) XXX_DiscardUnknown() {
var xxx_messageInfo_ChangeMultipleBlocksList proto.InternalMessageInfo
func (m *ChangeMultipleBlocksList) GetAuthor() *ModelAccount {
if m != nil {
return m.Author
}
return nil
}
func (m *ChangeMultipleBlocksList) GetChanges() []*ChangeSingleBlocksList {
if m != nil {
return m.Changes
@ -1198,55 +1222,57 @@ func init() {
func init() { proto.RegisterFile("changes.proto", fileDescriptor_b16a38c6509bd894) }
var fileDescriptor_b16a38c6509bd894 = []byte{
// 759 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0xcf, 0x6e, 0xd3, 0x4a,
0x14, 0xc6, 0xed, 0xd4, 0xce, 0x9f, 0x93, 0x7b, 0xab, 0xab, 0x51, 0xaf, 0x64, 0x59, 0x55, 0x14,
0xca, 0x82, 0x80, 0x8a, 0x91, 0x8a, 0x04, 0x48, 0x5d, 0x14, 0xa5, 0x7f, 0x48, 0x25, 0x8a, 0x8a,
0x53, 0x58, 0xb0, 0x73, 0xe2, 0x69, 0x32, 0xaa, 0x63, 0x5b, 0xf6, 0xb4, 0x34, 0x2b, 0xd6, 0xec,
0x58, 0xf3, 0x10, 0xac, 0x90, 0x78, 0x05, 0x96, 0x5d, 0x21, 0x36, 0x48, 0xd0, 0x6e, 0x78, 0x0c,
0x74, 0x66, 0x1c, 0xdb, 0x8d, 0xac, 0x24, 0x12, 0xdd, 0x65, 0x26, 0xe7, 0xf7, 0xcd, 0x37, 0x33,
0x67, 0x3e, 0x19, 0xfe, 0xed, 0x0f, 0x1d, 0x7f, 0x40, 0x63, 0x2b, 0x8c, 0x02, 0x1e, 0x90, 0x8a,
0xe3, 0x8f, 0xf9, 0x38, 0xa4, 0xe6, 0x3f, 0xa3, 0xc0, 0xa5, 0x5e, 0x32, 0xbd, 0xf6, 0xe9, 0x3f,
0x28, 0x6f, 0x8b, 0x42, 0xf3, 0x17, 0x80, 0xde, 0xf6, 0x82, 0xfe, 0x89, 0xf9, 0x18, 0xca, 0x7b,
0x8c, 0x7a, 0x6e, 0x4c, 0xee, 0x43, 0xf9, 0x58, 0xfc, 0x32, 0xd4, 0xa6, 0xda, 0xaa, 0x6f, 0xfc,
0x6f, 0x25, 0x32, 0xd6, 0x01, 0xaa, 0x58, 0x5d, 0x1e, 0x9d, 0xf6, 0xb9, 0x9d, 0x14, 0x99, 0x2f,
0xa1, 0x7e, 0x48, 0xa3, 0x11, 0x8b, 0x63, 0x16, 0xf8, 0x31, 0x69, 0x43, 0x3d, 0xcc, 0x86, 0x89,
0x44, 0x73, 0x4a, 0x42, 0x2c, 0x69, 0xe5, 0x30, 0x3b, 0x0f, 0x99, 0x0f, 0xa0, 0xbe, 0x3d, 0x64,
0x9e, 0x1b, 0x51, 0x7f, 0xdf, 0x8d, 0x49, 0x13, 0xea, 0xfd, 0x6c, 0x68, 0xa8, 0xcd, 0xa5, 0x56,
0xcd, 0xce, 0x4f, 0x99, 0x1f, 0x6b, 0x50, 0xd9, 0x0e, 0x7c, 0x4e, 0x7d, 0x6e, 0xbe, 0x03, 0xed,
0xd0, 0x19, 0x50, 0xb2, 0x05, 0x7a, 0xcc, 0xc7, 0x1e, 0x15, 0x16, 0x96, 0x37, 0xee, 0x14, 0x5a,
0x48, 0x20, 0x0b, 0x09, 0xab, 0x8b, 0xe5, 0x1d, 0xc5, 0x96, 0x1c, 0x59, 0x07, 0xbd, 0x87, 0x45,
0x46, 0x49, 0xec, 0x61, 0xa5, 0x48, 0x00, 0xab, 0x45, 0x51, 0xbb, 0x0a, 0x65, 0x79, 0xf8, 0xe6,
0x7b, 0x15, 0x6a, 0x3b, 0x4e, 0x3c, 0xec, 0x05, 0x4e, 0xe4, 0x92, 0x9d, 0xeb, 0x36, 0xd6, 0x67,
0xda, 0x48, 0xb1, 0x9b, 0xf2, 0xf2, 0x59, 0x05, 0x6d, 0x8f, 0x79, 0x94, 0x98, 0x50, 0xe9, 0xcb,
0x45, 0x84, 0x91, 0x5a, 0x47, 0xb1, 0x27, 0x13, 0xf2, 0xa4, 0x1c, 0x4e, 0x85, 0xf8, 0xbc, 0x93,
0x42, 0x35, 0xab, 0x8b, 0xe5, 0xd2, 0x9d, 0xc3, 0x29, 0xd9, 0x85, 0x4a, 0x18, 0xd1, 0x33, 0x46,
0xdf, 0x1a, 0x4b, 0xc2, 0xdf, 0xdd, 0xf9, 0x12, 0x87, 0x12, 0x40, 0x1f, 0x09, 0x9b, 0xb3, 0xfd,
0x45, 0x05, 0x7d, 0x7f, 0x84, 0xb7, 0x38, 0xcb, 0xf7, 0xd3, 0xeb, 0xbe, 0x5b, 0x33, 0x17, 0x15,
0x72, 0xd3, 0xc6, 0xf7, 0xa6, 0x8d, 0xdf, 0x5b, 0x40, 0x63, 0xae, 0xf3, 0xd7, 0xcc, 0xa5, 0xc1,
0xcd, 0x39, 0x17, 0x72, 0x7f, 0xe9, 0x5c, 0x6a, 0xcc, 0x74, 0xfe, 0xad, 0x04, 0xda, 0x11, 0x3d,
0xe7, 0x64, 0x05, 0x34, 0x4e, 0xcf, 0x33, 0xd7, 0x62, 0x94, 0x3d, 0xa7, 0x45, 0x9a, 0x04, 0x75,
0xa6, 0x5b, 0x78, 0x0b, 0xf4, 0x91, 0x13, 0x9d, 0xc4, 0x89, 0xdf, 0x05, 0x04, 0x0e, 0xb0, 0x1c,
0x05, 0x04, 0x47, 0x9a, 0x00, 0x3c, 0x18, 0x0c, 0x3c, 0xea, 0xf4, 0x3c, 0x6a, 0x68, 0x4d, 0xb5,
0x55, 0xed, 0x28, 0x76, 0x6e, 0x8e, 0xbc, 0x00, 0xc0, 0x52, 0x1a, 0x1d, 0x8d, 0x43, 0x6a, 0xe8,
0x0b, 0x3c, 0xb8, 0x74, 0x1d, 0xc9, 0xa0, 0x5e, 0xa6, 0x40, 0x1a, 0x50, 0xeb, 0x0f, 0x69, 0xff,
0x44, 0x2c, 0x58, 0x4e, 0x16, 0xcc, 0xa6, 0xc4, 0x15, 0xe3, 0x80, 0xba, 0x46, 0x25, 0xf9, 0x77,
0x32, 0x91, 0x3b, 0xd8, 0xdf, 0x1a, 0x94, 0xbb, 0xcc, 0x1f, 0x78, 0xd4, 0xfc, 0xa1, 0x01, 0x08,
0x03, 0xf1, 0x73, 0x16, 0x73, 0xb2, 0x0c, 0x25, 0xe6, 0x26, 0x79, 0x56, 0x62, 0x2e, 0x79, 0x92,
0x9c, 0xbc, 0x7c, 0xe4, 0x6b, 0xa9, 0x73, 0x19, 0xd6, 0x05, 0xd6, 0xd3, 0xdb, 0x79, 0x94, 0x66,
0xb6, 0x3c, 0xdd, 0xd5, 0x62, 0x56, 0x26, 0x7c, 0x47, 0x99, 0x84, 0x37, 0xd9, 0x85, 0x7a, 0x18,
0xd1, 0x34, 0xad, 0x35, 0x01, 0xdf, 0x2a, 0x86, 0x73, 0x71, 0xdd, 0x51, 0xec, 0x3c, 0x87, 0x32,
0xf9, 0x84, 0xd6, 0x67, 0xc9, 0xe4, 0x92, 0x1d, 0x65, 0x72, 0x1c, 0xee, 0x3f, 0x74, 0x06, 0xf2,
0xa8, 0xe7, 0xee, 0x1f, 0x23, 0x1b, 0xf7, 0x8f, 0x04, 0x79, 0x06, 0x35, 0x77, 0x92, 0x9d, 0xe2,
0x2e, 0xf2, 0x0d, 0x56, 0x88, 0xa7, 0x51, 0x8b, 0x57, 0x9a, 0xb2, 0x64, 0x13, 0xf4, 0x33, 0x7c,
0x2b, 0x46, 0x55, 0x88, 0xdc, 0x9e, 0x2d, 0x22, 0x9e, 0x15, 0x76, 0xa8, 0x60, 0x10, 0x66, 0x18,
0x11, 0x46, 0x6d, 0x11, 0x58, 0xa4, 0x09, 0xc2, 0x82, 0xc1, 0xcd, 0x1f, 0x33, 0x8f, 0x1a, 0xb0,
0xc8, 0xe6, 0x31, 0x42, 0x71, 0xf3, 0x48, 0xe4, 0x5a, 0xed, 0x15, 0x54, 0x0f, 0x4e, 0x3d, 0xce,
0x42, 0x8f, 0x9a, 0xfb, 0xd7, 0x5a, 0x6d, 0x13, 0x5b, 0x55, 0x7c, 0x1b, 0x88, 0x7e, 0x2b, 0xb8,
0x1d, 0xd9, 0xa2, 0x56, 0xc6, 0xd8, 0x13, 0xa2, 0xbd, 0xfa, 0xf5, 0xb2, 0xa1, 0x5e, 0x5c, 0x36,
0xd4, 0x9f, 0x97, 0x0d, 0xf5, 0xc3, 0x55, 0x43, 0xb9, 0xb8, 0x6a, 0x28, 0xdf, 0xaf, 0x1a, 0xca,
0x9b, 0x52, 0xd8, 0xeb, 0x95, 0xc5, 0x57, 0xc5, 0xc3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x87,
0x43, 0x0e, 0x1e, 0x7d, 0x08, 0x00, 0x00,
// 789 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0x4f, 0x6f, 0xd3, 0x4c,
0x10, 0xc6, 0xed, 0x34, 0x76, 0x92, 0xc9, 0xfb, 0x56, 0x7a, 0x57, 0x7d, 0x91, 0x65, 0x55, 0x51,
0x28, 0x07, 0x02, 0x2a, 0x46, 0x2a, 0x12, 0x20, 0xf5, 0x50, 0x48, 0xff, 0x90, 0x4a, 0x14, 0x15,
0xa7, 0xe2, 0xc0, 0xcd, 0xb1, 0xb7, 0xc9, 0xaa, 0x8e, 0x6d, 0xd9, 0x9b, 0xd2, 0x9c, 0x38, 0x71,
0xe0, 0x80, 0xe0, 0x88, 0xf8, 0x1c, 0x48, 0x7c, 0x05, 0x8e, 0x3d, 0x21, 0x8e, 0xd0, 0x7e, 0x11,
0x34, 0x6b, 0xc7, 0x76, 0xa3, 0x28, 0xb1, 0x44, 0x6f, 0xdd, 0xed, 0xfc, 0x9e, 0x7d, 0x66, 0x77,
0x66, 0x62, 0xf8, 0xd7, 0x1e, 0x58, 0x5e, 0x9f, 0x46, 0x46, 0x10, 0xfa, 0xdc, 0x27, 0x15, 0xcb,
0x1b, 0xf3, 0x71, 0x40, 0xf5, 0x7f, 0x86, 0xbe, 0x43, 0xdd, 0x64, 0x7b, 0xed, 0xe3, 0x7f, 0xa0,
0x6e, 0x8b, 0x40, 0xfd, 0x37, 0x80, 0xd2, 0x76, 0x7d, 0xfb, 0x44, 0x7f, 0x04, 0xea, 0x1e, 0xa3,
0xae, 0x13, 0x91, 0x7b, 0xa0, 0x1e, 0x8b, 0xbf, 0x34, 0xb9, 0x29, 0xb7, 0xea, 0x1b, 0xff, 0x1b,
0x89, 0x8c, 0x71, 0x80, 0x2a, 0x46, 0x97, 0x87, 0x23, 0x9b, 0x9b, 0x49, 0x90, 0xfe, 0x12, 0xea,
0x87, 0x34, 0x1c, 0xb2, 0x28, 0x62, 0xbe, 0x17, 0x91, 0x36, 0xd4, 0x83, 0x6c, 0x99, 0x48, 0x34,
0xa7, 0x24, 0xc4, 0x91, 0x46, 0x0e, 0x33, 0xf3, 0x90, 0x7e, 0x1f, 0xea, 0xdb, 0x03, 0xe6, 0x3a,
0x21, 0xf5, 0xf6, 0x9d, 0x88, 0x34, 0xa1, 0x6e, 0x67, 0x4b, 0x4d, 0x6e, 0x2e, 0xb5, 0x6a, 0x66,
0x7e, 0x4b, 0xff, 0x52, 0x83, 0xca, 0xb6, 0xef, 0x71, 0xea, 0x71, 0xfd, 0x2d, 0x94, 0x0f, 0xad,
0x3e, 0x25, 0x5b, 0xa0, 0x44, 0x7c, 0xec, 0x52, 0x61, 0x61, 0x79, 0xe3, 0xf6, 0x4c, 0x0b, 0x09,
0x64, 0x20, 0x61, 0x74, 0x31, 0xbc, 0x23, 0x99, 0x31, 0x47, 0xd6, 0x41, 0xe9, 0x61, 0x90, 0x56,
0x12, 0x39, 0xac, 0xcc, 0x12, 0xc0, 0x68, 0x11, 0xd4, 0xae, 0x82, 0x1a, 0x5f, 0xbe, 0xfe, 0x5e,
0x86, 0xda, 0x8e, 0x15, 0x0d, 0x7a, 0xbe, 0x15, 0x3a, 0x64, 0xe7, 0xaa, 0x8d, 0xf5, 0xb9, 0x36,
0x52, 0xec, 0xba, 0xbc, 0x7c, 0x95, 0xa1, 0xbc, 0xc7, 0x5c, 0x4a, 0x74, 0xa8, 0xd8, 0xf1, 0x21,
0xc2, 0x48, 0xad, 0x23, 0x99, 0x93, 0x8d, 0xf8, 0xa6, 0x2c, 0x4e, 0x85, 0xf8, 0xa2, 0x9b, 0x42,
0x35, 0xa3, 0x8b, 0xe1, 0xb1, 0x3b, 0x8b, 0x53, 0xb2, 0x0b, 0x95, 0x20, 0xa4, 0xa7, 0x8c, 0xbe,
0xd1, 0x96, 0x84, 0xbf, 0x3b, 0x8b, 0x25, 0x0e, 0x63, 0x00, 0x7d, 0x24, 0x6c, 0xce, 0xf6, 0x37,
0x19, 0x94, 0xfd, 0x21, 0xbe, 0xe2, 0x3c, 0xdf, 0x4f, 0xae, 0xfa, 0x6e, 0xcd, 0x3d, 0x54, 0xc8,
0x4d, 0x1b, 0xdf, 0x9b, 0x36, 0x7e, 0xb7, 0x80, 0xc6, 0x42, 0xe7, 0xaf, 0x98, 0x43, 0xfd, 0xeb,
0x73, 0x2e, 0xe4, 0xfe, 0xd2, 0x79, 0xac, 0x31, 0xd7, 0xf9, 0x8f, 0x12, 0x94, 0x8f, 0xe8, 0x19,
0x27, 0x2b, 0x50, 0xe6, 0xf4, 0x2c, 0x73, 0x2d, 0x56, 0x59, 0x3b, 0x15, 0x29, 0x12, 0xd4, 0x99,
0x2e, 0xe1, 0x2d, 0x50, 0x86, 0x56, 0x78, 0x12, 0x25, 0x7e, 0x0b, 0x08, 0x1c, 0x60, 0x38, 0x0a,
0x08, 0x8e, 0x34, 0x01, 0xb8, 0xdf, 0xef, 0xbb, 0xd4, 0xea, 0xb9, 0x54, 0x2b, 0x37, 0xe5, 0x56,
0xb5, 0x23, 0x99, 0xb9, 0x3d, 0xf2, 0x02, 0x00, 0x43, 0x69, 0x78, 0x34, 0x0e, 0xa8, 0xa6, 0x14,
0x68, 0xb8, 0xf4, 0x9c, 0x98, 0x41, 0xbd, 0x4c, 0x81, 0x34, 0xa0, 0x66, 0x0f, 0xa8, 0x7d, 0x22,
0x0e, 0x54, 0x93, 0x03, 0xb3, 0x2d, 0xf1, 0xc4, 0xb8, 0xa0, 0x8e, 0x56, 0x49, 0xfe, 0x3b, 0xd9,
0xc8, 0x5d, 0xec, 0x67, 0x05, 0xd4, 0x2e, 0xf3, 0xfa, 0x2e, 0xd5, 0x3f, 0x28, 0x00, 0xc2, 0x40,
0xf4, 0x9c, 0x45, 0x9c, 0x2c, 0x43, 0x89, 0x39, 0xc9, 0x3c, 0x2b, 0x31, 0x87, 0x18, 0xa0, 0x5a,
0x23, 0x3e, 0xf0, 0xc3, 0xa4, 0xcd, 0x6f, 0x4c, 0x79, 0x7f, 0x6a, 0xdb, 0xfe, 0xc8, 0xe3, 0x66,
0x12, 0x45, 0x1e, 0x27, 0x2f, 0x15, 0xdf, 0xe8, 0x5a, 0x1a, 0x1d, 0x0f, 0xf7, 0x19, 0xa9, 0xa6,
0xaf, 0xf9, 0x30, 0x9d, 0xf1, 0x65, 0xc1, 0xae, 0xce, 0x66, 0xe3, 0x5f, 0x84, 0x8e, 0x34, 0x19,
0xf6, 0x64, 0x17, 0xea, 0x41, 0x48, 0xd3, 0xe9, 0xae, 0x08, 0xf8, 0xe6, 0x6c, 0x38, 0x37, 0xde,
0x3b, 0x92, 0x99, 0xe7, 0x50, 0x26, 0x3f, 0xd1, 0xd5, 0x79, 0x32, 0xb9, 0x5f, 0x02, 0x94, 0xc9,
0x71, 0x98, 0x7f, 0x60, 0xf5, 0xa9, 0xb8, 0xfc, 0x85, 0xf9, 0xe3, 0x88, 0xc7, 0xfc, 0x91, 0x20,
0xcf, 0xa0, 0xe6, 0x4c, 0x66, 0xad, 0x56, 0x9d, 0x2a, 0xc8, 0x99, 0x78, 0x3a, 0x9a, 0xb1, 0x04,
0x52, 0x96, 0x6c, 0x82, 0x72, 0x8a, 0xbd, 0xa5, 0xd5, 0x84, 0xc8, 0xad, 0xf9, 0x22, 0xa2, 0x0d,
0xb1, 0xa2, 0x05, 0x83, 0x30, 0xc3, 0x91, 0xa2, 0x41, 0x11, 0x58, 0x4c, 0x1f, 0x84, 0x05, 0x83,
0xc9, 0x1f, 0x33, 0x97, 0x6a, 0xf5, 0x22, 0xc9, 0xe3, 0xc8, 0xc5, 0xe4, 0x91, 0xc8, 0x95, 0xe6,
0x3b, 0x19, 0xaa, 0x07, 0x23, 0x97, 0xb3, 0xc0, 0xa5, 0xfa, 0xf8, 0x4a, 0x6d, 0x66, 0xb5, 0x28,
0x17, 0xaa, 0xc5, 0x4d, 0xec, 0x05, 0xf1, 0xf1, 0xa1, 0x95, 0x9a, 0x4b, 0xb3, 0x9e, 0x33, 0xee,
0x01, 0x23, 0x3b, 0xc3, 0x9c, 0x10, 0xed, 0xd5, 0xef, 0x17, 0x0d, 0xf9, 0xfc, 0xa2, 0x21, 0xff,
0xba, 0x68, 0xc8, 0x9f, 0x2e, 0x1b, 0xd2, 0xf9, 0x65, 0x43, 0xfa, 0x79, 0xd9, 0x90, 0x5e, 0x97,
0x82, 0x5e, 0x4f, 0x15, 0x9f, 0x2d, 0x0f, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x17, 0x7a, 0x26,
0x2c, 0xde, 0x08, 0x00, 0x00,
}
func (m *Change) Marshal() (dAtA []byte, err error) {
@ -1981,6 +2007,18 @@ func (m *ChangeSingleBlocksList) MarshalToSizedBuffer(dAtA []byte) (int, error)
}
}
}
if m.Author != nil {
{
size, err := m.Author.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
}
if len(m.Id) > 0 {
for iNdEx := len(m.Id) - 1; iNdEx >= 0; iNdEx-- {
i -= len(m.Id[iNdEx])
@ -2010,7 +2048,7 @@ func (m *ChangeSingleBlocksListChangeOfText) MarshalToSizedBuffer(dAtA []byte) (
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
dAtA[i] = 0x1a
}
return len(dAtA) - i, nil
}
@ -2031,7 +2069,7 @@ func (m *ChangeSingleBlocksListChangeOfFields) MarshalToSizedBuffer(dAtA []byte)
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x1a
dAtA[i] = 0x22
}
return len(dAtA) - i, nil
}
@ -2052,7 +2090,7 @@ func (m *ChangeSingleBlocksListChangeOfPremissions) MarshalToSizedBuffer(dAtA []
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x22
dAtA[i] = 0x2a
}
return len(dAtA) - i, nil
}
@ -2073,7 +2111,7 @@ func (m *ChangeSingleBlocksListChangeOfChildrenIds) MarshalToSizedBuffer(dAtA []
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x2a
dAtA[i] = 0x32
}
return len(dAtA) - i, nil
}
@ -2094,7 +2132,7 @@ func (m *ChangeSingleBlocksListChangeOfPage) MarshalToSizedBuffer(dAtA []byte) (
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x32
dAtA[i] = 0x3a
}
return len(dAtA) - i, nil
}
@ -2115,7 +2153,7 @@ func (m *ChangeSingleBlocksListChangeOfDashboard) MarshalToSizedBuffer(dAtA []by
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x3a
dAtA[i] = 0x42
}
return len(dAtA) - i, nil
}
@ -2136,7 +2174,7 @@ func (m *ChangeSingleBlocksListChangeOfVideo) MarshalToSizedBuffer(dAtA []byte)
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x42
dAtA[i] = 0x4a
}
return len(dAtA) - i, nil
}
@ -2157,7 +2195,7 @@ func (m *ChangeSingleBlocksListChangeOfImage) MarshalToSizedBuffer(dAtA []byte)
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x4a
dAtA[i] = 0x52
}
return len(dAtA) - i, nil
}
@ -2178,7 +2216,7 @@ func (m *ChangeSingleBlocksListChangeOfFile) MarshalToSizedBuffer(dAtA []byte) (
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x52
dAtA[i] = 0x5a
}
return len(dAtA) - i, nil
}
@ -2236,9 +2274,21 @@ func (m *ChangeMultipleBlocksList) MarshalToSizedBuffer(dAtA []byte) (int, error
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
dAtA[i] = 0x12
}
}
if m.Author != nil {
{
size, err := m.Author.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintChanges(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
@ -2616,6 +2666,10 @@ func (m *ChangeSingleBlocksList) Size() (n int) {
n += 1 + l + sovChanges(uint64(l))
}
}
if m.Author != nil {
l = m.Author.Size()
n += 1 + l + sovChanges(uint64(l))
}
if m.Change != nil {
n += m.Change.Size()
}
@ -2745,6 +2799,10 @@ func (m *ChangeMultipleBlocksList) Size() (n int) {
}
var l int
_ = l
if m.Author != nil {
l = m.Author.Size()
n += 1 + l + sovChanges(uint64(l))
}
if len(m.Changes) > 0 {
for _, e := range m.Changes {
l = e.Size()
@ -4156,6 +4214,42 @@ func (m *ChangeSingleBlocksList) Unmarshal(dAtA []byte) error {
m.Id = append(m.Id, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Author", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowChanges
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthChanges
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthChanges
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Author == nil {
m.Author = &ModelAccount{}
}
if err := m.Author.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Text", wireType)
}
@ -4190,7 +4284,7 @@ func (m *ChangeSingleBlocksList) Unmarshal(dAtA []byte) error {
}
m.Change = &ChangeSingleBlocksListChangeOfText{v}
iNdEx = postIndex
case 3:
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Fields", wireType)
}
@ -4225,7 +4319,7 @@ func (m *ChangeSingleBlocksList) Unmarshal(dAtA []byte) error {
}
m.Change = &ChangeSingleBlocksListChangeOfFields{v}
iNdEx = postIndex
case 4:
case 5:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Premissions", wireType)
}
@ -4260,7 +4354,7 @@ func (m *ChangeSingleBlocksList) Unmarshal(dAtA []byte) error {
}
m.Change = &ChangeSingleBlocksListChangeOfPremissions{v}
iNdEx = postIndex
case 5:
case 6:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ChildrenIds", wireType)
}
@ -4295,7 +4389,7 @@ func (m *ChangeSingleBlocksList) Unmarshal(dAtA []byte) error {
}
m.Change = &ChangeSingleBlocksListChangeOfChildrenIds{v}
iNdEx = postIndex
case 6:
case 7:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Page", wireType)
}
@ -4330,7 +4424,7 @@ func (m *ChangeSingleBlocksList) Unmarshal(dAtA []byte) error {
}
m.Change = &ChangeSingleBlocksListChangeOfPage{v}
iNdEx = postIndex
case 7:
case 8:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Dashboard", wireType)
}
@ -4365,7 +4459,7 @@ func (m *ChangeSingleBlocksList) Unmarshal(dAtA []byte) error {
}
m.Change = &ChangeSingleBlocksListChangeOfDashboard{v}
iNdEx = postIndex
case 8:
case 9:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Video", wireType)
}
@ -4400,7 +4494,7 @@ func (m *ChangeSingleBlocksList) Unmarshal(dAtA []byte) error {
}
m.Change = &ChangeSingleBlocksListChangeOfVideo{v}
iNdEx = postIndex
case 9:
case 10:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Image", wireType)
}
@ -4435,7 +4529,7 @@ func (m *ChangeSingleBlocksList) Unmarshal(dAtA []byte) error {
}
m.Change = &ChangeSingleBlocksListChangeOfImage{v}
iNdEx = postIndex
case 10:
case 11:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field File", wireType)
}
@ -4577,6 +4671,42 @@ func (m *ChangeMultipleBlocksList) Unmarshal(dAtA []byte) error {
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Author", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowChanges
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthChanges
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthChanges
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Author == nil {
m.Author = &ModelAccount{}
}
if err := m.Author.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType)
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -3,7 +3,13 @@ package anytype;
option go_package = "pb";
import "models.proto";
/*
* Change contains single block change or list of block changes.
*/
message Change {
/*
* Change.Block contains only one, single change for one block.
*/
message Block {
message Fields {
Model.Struct fields = 1;
@ -72,26 +78,34 @@ message Change {
}
}
/*
* Change.Single contains only one, single change, but for a list of blocks.
*/
message Single {
message BlocksList {
repeated string id = 1;
Model.Account author = 2;
oneof change {
Block.Content.Text text = 2;
Block.Fields fields = 3;
Block.Permissions premissions = 4;
Block.ChildrenIds childrenIds = 5;
Block.Content.Page page = 6;
Block.Content.Dashboard dashboard = 7;
Block.Content.Video video = 8;
Block.Content.Image image = 9;
Block.Content.File file = 10;
Block.Content.Text text = 3;
Block.Fields fields = 4;
Block.Permissions premissions = 5;
Block.ChildrenIds childrenIds = 6;
Block.Content.Page page = 7;
Block.Content.Dashboard dashboard = 8;
Block.Content.Video video = 9;
Block.Content.Image image = 10;
Block.Content.File file = 11;
}
}
}
/*
* Change.Multiple contains array of changes, for a list of blocks each.
*/
message Multiple {
message BlocksList {
repeated Single.BlocksList changes = 1;
Model.Account author = 1;
repeated Single.BlocksList changes = 2;
}
}

View file

@ -5,13 +5,32 @@ option go_package = "pb";
import "models.proto";
import "changes.proto";
/*
* Rpc is a namespace, that agregates all of the service commands between client and middleware.
* Structure: Topic > Subtopic > Subsub... > Action > (Request, Response).
* Request message from a client.
* Response message from a middleware.
*/
message Rpc {
/*
* Namespace, that agregates subtopics and actions, that relates to blocks.
*/
message Block {
/*
* Block history: switch between versions (lib context: switch block head), move forward or backward
* **Example scenario**
* 1. User -> MacOS Front: CMD+Z
* 2. Front -> MW: Rpc.Block.History.Move.Request(blockId, false)
* 3. MW -> Lib: ?? TODO
* 4. Lib: switches current block header to a previous one
* 5. Lib -> MW: prev version of block
* 6. MW -> Front: BlockShow(block.prevVersion)
*/
message History {
message Move {
message Request {
string blockId = 1;
bool moveForward = 2;
bool moveForward = 2; // Move direction. If true,
}
message Response {
@ -33,6 +52,23 @@ message Rpc {
}
}
/*
* Works with a smart blocks (block-organizers, like page, dashboard etc)
* **Example scenario**
* 1A. On front-end start.
* 1. Front -> MW: Rpc.Block.Open.Request(dashboard.id)
* 2. MW -> Front: BlockShow(dashboard)
* 3. MW -> Front: Rpc.Block.Open.Response(err)
* 1B. User clicks on a page icon on the dashboard.
* 1. Front -> MW: Rpc.Block.Close.Request(dashboard.id)
* Get close response first, then open request:
* 2. MW -> Front: Rpc.Block.Close.Response(err)
* 3. Front -> MW: Rpc.Block.Open.Request(page.id)
* 4. MW -> Front: BlockShow(<page, blocks>)
* 5. MW -> Front: Rpc.Block.Open.Response(err)
* Image/Video/File blocks then:
* 6. MW -> Front: BlockShow(<blocks>)
*/
message Open {
message Request {
string id = 1;
@ -55,6 +91,21 @@ message Rpc {
}
}
/*
* Create a Smart/Internal block. Request can contain a block with a content, or it can be an empty block with a specific block.content.
* **Example scenario**
* 1A. Create Page on a dashboard
* 1. Front -> MW: Rpc.Block.Create.Request(targetId:dashboard.id, position:after, block: emtpy block with page content and id = "")
* 2. Front -> MW: Rpc.Block.Close.Request(block: dashboard.id)
* 3. Front <- MW: Rpc.Block.Close.Response(err)
* 4. Front <- MW: Rpc.Block.Create.Response(page.id)
* 5. Front <- MW: Rpc.Block.Open.Response(err)
* 6. Front <- MW: Event.Block.Show(page)
* 1B. Create Page on a Page
* 1. Front -> MW: Rpc.Block.Create.Request(targetId:dashboard.id, position:after, block: emtpy block with page content and id = "")
* 2. Front <- MW: Rpc.Block.Create.Response(newPage.id)
* 3. Front <- MW: Event.Block.Show(newPage)
*/
message Create {
message Request {
Model.Block block = 1;
@ -64,6 +115,7 @@ message Rpc {
message Response {
Error error = 1;
string blockId = 2;
message Error {
Code code = 1;
@ -79,6 +131,22 @@ message Rpc {
}
}
/*
* Update a Smart/Internal block. Request can contain a content/field/permission/children update
* **Example scenarios**
* Case A. Update text block on page
* 1. TODO
* Case B. Update page on dashboard
* 1. TODO
* Case C. Update page on page
* 1. TODO
* Case D. Update page permission on a dashboard
* 1. TODO
* Case E. Update page children of the same page
* 1. TODO
* Case F. Update children of a layout block on a page
* 1. TODO
*/
message Update {
message Request {
Change.Multiple.BlocksList changes = 1;
@ -100,8 +168,37 @@ message Rpc {
}
}
}
/*
* Block.Close it means unsubscribe from a block.
* Precondition: block should be opened.
*/
message Close {
message Request {
string id = 1;
}
message Response {
Error error = 1;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
// ...
}
}
}
}
}
/*
* Namespace, that agregates subtopics and actions, that relates to wallet.
*/
message Wallet {
message Create {
/**
@ -164,6 +261,9 @@ message Rpc {
}
}
/*
* Namespace, that agregates subtopics and actions, that relates to account.
*/
message Account {
message Create {
/**
@ -270,32 +370,10 @@ message Rpc {
}
}
message Version {
message Get {
message Request {}
message Response {
Error error = 1;
string version = 2;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
VERSION_IS_EMPTY = 3;
NOT_FOUND = 101;
TIMEOUT = 102;
}
}
}
}
}
/*
* Namespace, that agregates log subtopics and actions.
* Usage: send request with topic (Level) and description (message) from client to middleware to log.
*/
message Log {
message Send {
message Request {
@ -332,9 +410,42 @@ message Rpc {
}
}
message Ipfs {
/*
* Get info about a version of a middleware.
* Info is a string, that contains: BuildDate, GitCommit, GitBranch, GitState
*/
message Version {
message Get {
message File {
message Request {}
message Response {
Error error = 1;
string version = 2; // BuildDate, GitCommit, GitBranch, GitState
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
VERSION_IS_EMPTY = 3;
NOT_FOUND = 101;
TIMEOUT = 102;
}
}
}
}
}
/*
* Namespace, that agregates subtopics and actions to work with IPFS directly (get files, blobs, images, etc)
*/
message Ipfs {
message File {
message Get {
message Request {
string id = 1;
}
@ -361,63 +472,63 @@ message Rpc {
}
}
}
}
message Image {
message Get {
message Blob {
message Request {
string id = 1;
Model.Image.Size size = 2;
message Image {
message Get {
message Blob {
message Request {
string id = 1;
Model.Image.Size size = 2;
}
message Response {
Error error = 1;
bytes blob = 2;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
// ...
NOT_FOUND = 101;
TIMEOUT = 102;
}
}
}
}
message Response {
Error error = 1;
bytes blob = 2;
message File {
message Request {
string id = 1;
Model.Image.Size size = 2;
}
message Error {
Code code = 1;
string description = 2;
message Response {
Error error = 1;
string localPath = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
// ...
message Error {
Code code = 1;
string description = 2;
NOT_FOUND = 101;
TIMEOUT = 102;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
// ...
NOT_FOUND = 101;
TIMEOUT = 102;
}
}
}
}
}
message File {
message Request {
string id = 1;
Model.Image.Size size = 2;
}
message Response {
Error error = 1;
string localPath = 2;
message Error {
Code code = 1;
string description = 2;
enum Code {
NULL = 0;
UNKNOWN_ERROR = 1;
BAD_INPUT = 2;
// ...
NOT_FOUND = 101;
TIMEOUT = 102;
}
}
}
}
}
}
}
}

View file

@ -5,19 +5,23 @@ option go_package = "pb";
import "models.proto";
import "changes.proto";
/*
* Event type of message, that could be sent from a middleware to the corresponding front-end.
*/
message Event {
oneof message {
Account.Show accountShow = 1; // show wallet's accounts that were loaded from local or remote source
Block.Show blockShow = 2;
Block.Update blockUpdate = 3;
Block.Create blockCreate = 4;
Block.Add blockAdd = 2;
Block.ShowFullscreen blockShowFullscreen = 3;
Block.Update blockUpdate = 4;
Block.Delete blockDelete = 5;
User.Block.TextRange userBlockTextRange = 5;
User.Block.Join userBlockJoin = 6;
User.Block.Left userBlockLeft = 7;
User.Block.SelectRange userBlockSelectRange = 8;
User.Block.TextRange userBlockTextRange = 6;
User.Block.Join userBlockJoin = 7;
User.Block.Left userBlockLeft = 8;
User.Block.SelectRange userBlockSelectRange = 9;
Block.FilesUpload filesUpload = 9;
Block.FilesUpload filesUpload = 10;
}
message Account {
@ -29,20 +33,41 @@ message Event {
Model.Account account = 2; // An Account, that has been found for the mnemonic
}
}
message Block {
message Show {
Model.Block block = 1;
/*
* Event to show internal blocks on a client.
* Example Scenarios
* A. Block Creation
* 1. Block A have been created on a client C1
* 2. Client C2 receives Event.Block.Add(Block A), Event.Block.Update(Page.children)
* B. Partial block load
* 1. Client C1 opens Page1, that contains, for example, 133 blocks.
* 2. M -> F: ShowFullScreen(Root, blocks1-50)
* 3. M -> F: Block.Add(blocks51-100)
* 3. M -> F: Block.Add(blocks101-133)
*/
message Add {
repeated Model.Block blocks = 1; // id -> block
}
/*
* Works with a smart blocks: Page, Dashboard
* Dashboard opened, click on a page, Rpc.Block.open, Block.ShowFullscreen(PageBlock)
*/
message ShowFullscreen {
string rootId = 1; // Root block id
repeated Model.Block blocks = 2; // children of the root block
}
/*
* Updates from different clients, or from the local middleware
* Example scenarios:
* Page opened, TextBlock updated on a different client, BlockUpdate(changes)
*/
message Update {
Change.Multiple.BlocksList changes = 1;
}
message Create {
Model.Block block = 1;
}
/**
* Middleware to front end event message, that will be sent on one of this scenarios:
* Precondition: user A opened a block
@ -52,7 +77,14 @@ message Event {
message FilesUpload {
repeated string filePath = 1; // filepaths to the files
string blockId = 2; // if empty => create new blocks
}
}
/*
*
*/
message Delete {
string blockId = 1;
}
}
message User {

View file

@ -37,6 +37,10 @@ message Model {
}
message Content {
/*
* Layout have no visual representation, but affects on blocks, that it contains.
* Row/Column layout blocks creates only automatically, after some of a D&D operations, for example
*/
message Layout {
Style style = 1;
@ -46,12 +50,22 @@ message Model {
}
}
/*
* Divider: block, that contains only one horizontal thin line
*/
message Div {}
/*
* Bookmark is to keep a web-link and to preview a content.
*/
message Bookmark {
// Model.Link.Preview preview = 1;
}
/*
* Block type to organize pages on the main screen (main purpose)
* It also can be mounted on a page.
*/
message Dashboard {
enum Style {
MAIN_SCREEN = 0;
@ -66,6 +80,34 @@ message Model {
}
message Text {
string text = 1;
Style style = 2;
Marks marksList = 3; // list of marks to apply to the text
bool toggleable = 4; // can be toggled or not
MarkerType markerType = 5; // if no  it's not a list. If number/bullet it should be a list with its list-siblings.
bool checkable = 6; // can be checked or not
bool checked = 7;
message Mark {
Range range = 1; // range of symbols to apply this mark. From(symbol) To(symbol)
Type type = 2;
string param = 3; // link, color, etc
enum Type {
STRIKETHROUGH = 0;
KEYBOARD = 1;
ITALIC = 2;
BOLD = 3;
LINK = 4;
}
}
message Marks {
repeated Mark marks = 1;
}
enum Style {
p = 0;
h1 = 1;
@ -81,35 +123,6 @@ message Model {
number = 1;
bullet = 2;
}
message Marks {
repeated Mark marks = 1;
}
message Mark {
enum Type {
STRIKETHROUGH = 0;
KEYBOARD = 1;
ITALIC = 2;
BOLD = 3;
LINK = 4;
}
Range range = 1;
Type type = 2;
string param = 3; // link, color, etc
}
string text = 1;
Style style = 2;
Marks marksList = 3;
bool toggleable = 4;
MarkerType markerType = 5;
bool checkable = 6;
bool checked = 7;
}
message Video {
@ -118,17 +131,17 @@ message Model {
Preview preview = 3;
message Preview {
bytes thumbnail = 1;
string name = 2;
string name = 1;
string icon = 2;
int32 width = 3;
}
enum State {
EMPTY = 0;
UPLOADING = 1;
PREVIEW = 2;
DOWNLOADING = 3;
DONE = 4;
EMPTY = 0; // There is no video and preview, it's an empty block, that waits videos.
UPLOADING = 1; // There is stil no video/preview, but video already uploading
PREVIEW = 2; // Video exists, preview downloaded, but video  not.
DOWNLOADING = 3; // Video exists, preview downloaded, but video downloading
DONE = 4; // Video and preview downloaded
}
}
@ -138,24 +151,24 @@ message Model {
Preview preview = 3;
message Preview {
bytes thumbnail = 1;
string name = 2;
string name = 1;
string icon = 2;
int32 width = 3;
}
enum State {
EMPTY = 0;
UPLOADING = 1;
PREVIEW = 2;
DOWNLOADING = 3;
DONE = 4;
EMPTY = 0; // There is no image and preview, it's an empty block, that waits image.
UPLOADING = 1; // There is stil no image/preview, but image already uploading
PREVIEW = 2; // Image exists, preview downloaded, but image  not.
DOWNLOADING = 3; // Image exists, preview downloaded, but image downloading
DONE = 4; // Image and preview downloaded
}
}
message File {
string localFilePath = 1;
string localFilePath = 1; // Path to the file on a local machine
State state = 2;
Preview preview = 3;
Preview preview = 3; // Content to show before the main content is downladed
message Preview {
string name = 1;
@ -163,20 +176,20 @@ message Model {
}
enum State {
EMPTY = 0;
UPLOADING = 1;
PREVIEW = 2;
DOWNLOADING = 3;
DONE = 4;
EMPTY = 0; // There is no file and preview, it's an empty block, that waits files.
UPLOADING = 1; // There is stil no file/preview, but file already uploading
PREVIEW = 2; // File exists, preview downloaded, but file  not.
DOWNLOADING = 3; // File exists, preview downloaded, but file downloading
DONE = 4; // File and preview downloaded
}
}
message Page {
enum Style {
EMPTY = 0;
TASK = 1;
BOOKMARK = 2;
SET = 3;
EMPTY = 0; // Ordinary page, without additional fields
TASK = 1; // Page with a task fields
BOOKMARK = 2; // Page with a bookmark fields
SET = 3; // Page, that organize a set of blocks by a specific criterio
// ...
}
@ -185,6 +198,9 @@ message Model {
}
}
/*
* General purpose structure, uses in Mark.
*/
message Range {
int32 from = 1;
int32 to = 2;
@ -221,7 +237,7 @@ message Model {
}
/**
* Contains basic information about user account
* Contains basic information about a user account
*/
message Account {
string id = 1; // User's thread id

View file

@ -11,7 +11,7 @@ service ClientCommands {
rpc AccountCreate (anytype.Rpc.Account.Create.Request) returns (anytype.Rpc.Account.Create.Response);
rpc AccountSelect (anytype.Rpc.Account.Select.Request) returns (anytype.Rpc.Account.Select.Response);
rpc ImageGetBlob (anytype.Rpc.Image.Get.Blob.Request) returns (anytype.Rpc.Image.Get.Blob.Response);
rpc ImageGetBlob (anytype.Rpc.Ipfs.Image.Get.Blob.Request) returns (anytype.Rpc.Ipfs.Image.Get.Blob.Response);
rpc VersionGet (anytype.Rpc.Version.Get.Request) returns (anytype.Rpc.Version.Get.Response);
rpc LogSend (anytype.Rpc.Log.Send.Request) returns (anytype.Rpc.Log.Send.Response);