This commit is contained in:
Sergey Cherepanov 2022-12-22 14:01:36 +03:00
commit 0b27fe7642
No known key found for this signature in database
GPG Key ID: 87F8EDE8FBDF637C
81 changed files with 3745 additions and 939 deletions

View File

@ -986,6 +986,182 @@ func (m *TreeParamsResponse) GetHeadIds() []string {
return nil return nil
} }
type WatchRequest struct {
SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"`
TreeId string `protobuf:"bytes,2,opt,name=treeId,proto3" json:"treeId,omitempty"`
}
func (m *WatchRequest) Reset() { *m = WatchRequest{} }
func (m *WatchRequest) String() string { return proto.CompactTextString(m) }
func (*WatchRequest) ProtoMessage() {}
func (*WatchRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_fc31080c27db9707, []int{21}
}
func (m *WatchRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *WatchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_WatchRequest.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *WatchRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_WatchRequest.Merge(m, src)
}
func (m *WatchRequest) XXX_Size() int {
return m.Size()
}
func (m *WatchRequest) XXX_DiscardUnknown() {
xxx_messageInfo_WatchRequest.DiscardUnknown(m)
}
var xxx_messageInfo_WatchRequest proto.InternalMessageInfo
func (m *WatchRequest) GetSpaceId() string {
if m != nil {
return m.SpaceId
}
return ""
}
func (m *WatchRequest) GetTreeId() string {
if m != nil {
return m.TreeId
}
return ""
}
type WatchResponse struct {
}
func (m *WatchResponse) Reset() { *m = WatchResponse{} }
func (m *WatchResponse) String() string { return proto.CompactTextString(m) }
func (*WatchResponse) ProtoMessage() {}
func (*WatchResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_fc31080c27db9707, []int{22}
}
func (m *WatchResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *WatchResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_WatchResponse.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *WatchResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_WatchResponse.Merge(m, src)
}
func (m *WatchResponse) XXX_Size() int {
return m.Size()
}
func (m *WatchResponse) XXX_DiscardUnknown() {
xxx_messageInfo_WatchResponse.DiscardUnknown(m)
}
var xxx_messageInfo_WatchResponse proto.InternalMessageInfo
type UnwatchRequest struct {
SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"`
TreeId string `protobuf:"bytes,2,opt,name=treeId,proto3" json:"treeId,omitempty"`
}
func (m *UnwatchRequest) Reset() { *m = UnwatchRequest{} }
func (m *UnwatchRequest) String() string { return proto.CompactTextString(m) }
func (*UnwatchRequest) ProtoMessage() {}
func (*UnwatchRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_fc31080c27db9707, []int{23}
}
func (m *UnwatchRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *UnwatchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_UnwatchRequest.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *UnwatchRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_UnwatchRequest.Merge(m, src)
}
func (m *UnwatchRequest) XXX_Size() int {
return m.Size()
}
func (m *UnwatchRequest) XXX_DiscardUnknown() {
xxx_messageInfo_UnwatchRequest.DiscardUnknown(m)
}
var xxx_messageInfo_UnwatchRequest proto.InternalMessageInfo
func (m *UnwatchRequest) GetSpaceId() string {
if m != nil {
return m.SpaceId
}
return ""
}
func (m *UnwatchRequest) GetTreeId() string {
if m != nil {
return m.TreeId
}
return ""
}
type UnwatchResponse struct {
}
func (m *UnwatchResponse) Reset() { *m = UnwatchResponse{} }
func (m *UnwatchResponse) String() string { return proto.CompactTextString(m) }
func (*UnwatchResponse) ProtoMessage() {}
func (*UnwatchResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_fc31080c27db9707, []int{24}
}
func (m *UnwatchResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *UnwatchResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_UnwatchResponse.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *UnwatchResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_UnwatchResponse.Merge(m, src)
}
func (m *UnwatchResponse) XXX_Size() int {
return m.Size()
}
func (m *UnwatchResponse) XXX_DiscardUnknown() {
xxx_messageInfo_UnwatchResponse.DiscardUnknown(m)
}
var xxx_messageInfo_UnwatchResponse proto.InternalMessageInfo
type PutFileRequest struct { type PutFileRequest struct {
Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
SpaceId string `protobuf:"bytes,2,opt,name=spaceId,proto3" json:"spaceId,omitempty"` SpaceId string `protobuf:"bytes,2,opt,name=spaceId,proto3" json:"spaceId,omitempty"`
@ -995,7 +1171,7 @@ func (m *PutFileRequest) Reset() { *m = PutFileRequest{} }
func (m *PutFileRequest) String() string { return proto.CompactTextString(m) } func (m *PutFileRequest) String() string { return proto.CompactTextString(m) }
func (*PutFileRequest) ProtoMessage() {} func (*PutFileRequest) ProtoMessage() {}
func (*PutFileRequest) Descriptor() ([]byte, []int) { func (*PutFileRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_fc31080c27db9707, []int{21} return fileDescriptor_fc31080c27db9707, []int{25}
} }
func (m *PutFileRequest) XXX_Unmarshal(b []byte) error { func (m *PutFileRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
@ -1046,7 +1222,7 @@ func (m *PutFileResponse) Reset() { *m = PutFileResponse{} }
func (m *PutFileResponse) String() string { return proto.CompactTextString(m) } func (m *PutFileResponse) String() string { return proto.CompactTextString(m) }
func (*PutFileResponse) ProtoMessage() {} func (*PutFileResponse) ProtoMessage() {}
func (*PutFileResponse) Descriptor() ([]byte, []int) { func (*PutFileResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_fc31080c27db9707, []int{22} return fileDescriptor_fc31080c27db9707, []int{26}
} }
func (m *PutFileResponse) XXX_Unmarshal(b []byte) error { func (m *PutFileResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
@ -1091,7 +1267,7 @@ func (m *GetFileRequest) Reset() { *m = GetFileRequest{} }
func (m *GetFileRequest) String() string { return proto.CompactTextString(m) } func (m *GetFileRequest) String() string { return proto.CompactTextString(m) }
func (*GetFileRequest) ProtoMessage() {} func (*GetFileRequest) ProtoMessage() {}
func (*GetFileRequest) Descriptor() ([]byte, []int) { func (*GetFileRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_fc31080c27db9707, []int{23} return fileDescriptor_fc31080c27db9707, []int{27}
} }
func (m *GetFileRequest) XXX_Unmarshal(b []byte) error { func (m *GetFileRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
@ -1142,7 +1318,7 @@ func (m *GetFileResponse) Reset() { *m = GetFileResponse{} }
func (m *GetFileResponse) String() string { return proto.CompactTextString(m) } func (m *GetFileResponse) String() string { return proto.CompactTextString(m) }
func (*GetFileResponse) ProtoMessage() {} func (*GetFileResponse) ProtoMessage() {}
func (*GetFileResponse) Descriptor() ([]byte, []int) { func (*GetFileResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_fc31080c27db9707, []int{24} return fileDescriptor_fc31080c27db9707, []int{28}
} }
func (m *GetFileResponse) XXX_Unmarshal(b []byte) error { func (m *GetFileResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
@ -1186,7 +1362,7 @@ func (m *DeleteFileRequest) Reset() { *m = DeleteFileRequest{} }
func (m *DeleteFileRequest) String() string { return proto.CompactTextString(m) } func (m *DeleteFileRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteFileRequest) ProtoMessage() {} func (*DeleteFileRequest) ProtoMessage() {}
func (*DeleteFileRequest) Descriptor() ([]byte, []int) { func (*DeleteFileRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_fc31080c27db9707, []int{25} return fileDescriptor_fc31080c27db9707, []int{29}
} }
func (m *DeleteFileRequest) XXX_Unmarshal(b []byte) error { func (m *DeleteFileRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
@ -1229,7 +1405,7 @@ func (m *DeleteFileResponse) Reset() { *m = DeleteFileResponse{} }
func (m *DeleteFileResponse) String() string { return proto.CompactTextString(m) } func (m *DeleteFileResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteFileResponse) ProtoMessage() {} func (*DeleteFileResponse) ProtoMessage() {}
func (*DeleteFileResponse) Descriptor() ([]byte, []int) { func (*DeleteFileResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_fc31080c27db9707, []int{26} return fileDescriptor_fc31080c27db9707, []int{30}
} }
func (m *DeleteFileResponse) XXX_Unmarshal(b []byte) error { func (m *DeleteFileResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b) return m.Unmarshal(b)
@ -1280,6 +1456,10 @@ func init() {
proto.RegisterType((*LoadSpaceResponse)(nil), "clientapi.LoadSpaceResponse") proto.RegisterType((*LoadSpaceResponse)(nil), "clientapi.LoadSpaceResponse")
proto.RegisterType((*TreeParamsRequest)(nil), "clientapi.TreeParamsRequest") proto.RegisterType((*TreeParamsRequest)(nil), "clientapi.TreeParamsRequest")
proto.RegisterType((*TreeParamsResponse)(nil), "clientapi.TreeParamsResponse") proto.RegisterType((*TreeParamsResponse)(nil), "clientapi.TreeParamsResponse")
proto.RegisterType((*WatchRequest)(nil), "clientapi.WatchRequest")
proto.RegisterType((*WatchResponse)(nil), "clientapi.WatchResponse")
proto.RegisterType((*UnwatchRequest)(nil), "clientapi.UnwatchRequest")
proto.RegisterType((*UnwatchResponse)(nil), "clientapi.UnwatchResponse")
proto.RegisterType((*PutFileRequest)(nil), "clientapi.PutFileRequest") proto.RegisterType((*PutFileRequest)(nil), "clientapi.PutFileRequest")
proto.RegisterType((*PutFileResponse)(nil), "clientapi.PutFileResponse") proto.RegisterType((*PutFileResponse)(nil), "clientapi.PutFileResponse")
proto.RegisterType((*GetFileRequest)(nil), "clientapi.GetFileRequest") proto.RegisterType((*GetFileRequest)(nil), "clientapi.GetFileRequest")
@ -1291,54 +1471,58 @@ func init() {
func init() { proto.RegisterFile("api/apiproto/protos/api.proto", fileDescriptor_fc31080c27db9707) } func init() { proto.RegisterFile("api/apiproto/protos/api.proto", fileDescriptor_fc31080c27db9707) }
var fileDescriptor_fc31080c27db9707 = []byte{ var fileDescriptor_fc31080c27db9707 = []byte{
// 746 bytes of a gzipped FileDescriptorProto // 813 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x4f, 0x4f, 0xdb, 0x4e, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x96, 0x4d, 0x4f, 0xdb, 0x4c,
0x10, 0xc5, 0x21, 0x10, 0x32, 0xfc, 0x94, 0x90, 0xe5, 0x8f, 0xfc, 0x73, 0x89, 0x95, 0xae, 0x04, 0x10, 0xc7, 0x71, 0x08, 0x90, 0x0c, 0x3c, 0x31, 0x59, 0x20, 0x8f, 0xeb, 0x12, 0x2b, 0x5d, 0x09,
0x8d, 0x54, 0x04, 0x2a, 0xbd, 0xb4, 0x97, 0x0a, 0x4a, 0x44, 0x15, 0x95, 0x4a, 0x34, 0xd0, 0x4b, 0x1a, 0xa9, 0x08, 0x54, 0x7a, 0x69, 0x7b, 0xa8, 0x78, 0x89, 0xa8, 0xa2, 0x52, 0x89, 0x06, 0x50,
0x6f, 0x5b, 0xbc, 0x52, 0x2c, 0x25, 0xb1, 0x1b, 0x3b, 0x15, 0xa7, 0x7e, 0x86, 0x7e, 0xac, 0x4a, 0xa5, 0xde, 0xb6, 0xf1, 0x4a, 0xb1, 0x94, 0xc4, 0x6e, 0xec, 0xb4, 0x9c, 0xfa, 0x19, 0xfa, 0xb1,
0xbd, 0x70, 0xec, 0xb1, 0x82, 0x2f, 0x52, 0xad, 0xbd, 0xf6, 0xee, 0xac, 0x1d, 0x50, 0xc5, 0x05, 0xda, 0x1b, 0xc7, 0x1e, 0x2b, 0xf8, 0x22, 0xd5, 0xda, 0x6b, 0xef, 0x8b, 0x13, 0xa2, 0x2a, 0x17,
0x76, 0x77, 0x66, 0xde, 0x7b, 0xeb, 0x9d, 0x79, 0x0a, 0xb4, 0x59, 0xe8, 0x1f, 0xb0, 0xd0, 0x0f, 0xd8, 0xd9, 0x99, 0xf9, 0xcf, 0xd8, 0x3b, 0xfe, 0x6d, 0xa0, 0x4e, 0x02, 0xef, 0x80, 0x04, 0x5e,
0xa7, 0x41, 0x1c, 0x1c, 0x24, 0x7f, 0x23, 0xb1, 0xdf, 0x4f, 0x96, 0xa4, 0x7e, 0x35, 0xf2, 0xf9, 0x30, 0xf2, 0x23, 0xff, 0x20, 0xfe, 0x1b, 0x32, 0x7b, 0x3f, 0x5e, 0xa2, 0x72, 0xb7, 0xef, 0xd1,
0x24, 0x66, 0xa1, 0x4f, 0x37, 0x80, 0x9c, 0x4c, 0x39, 0x8b, 0xf9, 0x45, 0xc8, 0xae, 0xf8, 0x80, 0x61, 0x44, 0x02, 0x0f, 0x6f, 0x02, 0x3a, 0x1d, 0x51, 0x12, 0xd1, 0xcb, 0x80, 0x74, 0x69, 0x87,
0x7f, 0x9d, 0xf1, 0x28, 0xa6, 0x3b, 0xb0, 0x8e, 0x4e, 0xa3, 0x30, 0x98, 0x44, 0x9c, 0x34, 0xa0, 0x7e, 0x19, 0xd3, 0x30, 0xc2, 0x3b, 0xb0, 0xa1, 0xec, 0x86, 0x81, 0x3f, 0x0c, 0x29, 0xaa, 0x40,
0xe2, 0x7b, 0xb6, 0xd5, 0xb1, 0xba, 0xf5, 0x41, 0xc5, 0xf7, 0x44, 0x71, 0x8f, 0x4f, 0xfd, 0x6f, 0xc1, 0x73, 0x2d, 0xa3, 0x61, 0x34, 0xcb, 0x9d, 0x82, 0xe7, 0xb2, 0xe4, 0x16, 0x1d, 0x79, 0x5f,
0x85, 0x62, 0x74, 0x3a, 0xa7, 0xf8, 0x05, 0x6c, 0xa6, 0x1c, 0xbd, 0xe0, 0x6a, 0x36, 0xe6, 0x93, 0x73, 0xc9, 0xca, 0xee, 0x94, 0xe4, 0xe7, 0xb0, 0x95, 0xd4, 0x68, 0xf9, 0xdd, 0xf1, 0x80, 0x0e,
0x58, 0xd6, 0x13, 0x1b, 0x6a, 0x91, 0xa8, 0xec, 0x67, 0xd9, 0xd9, 0x96, 0x76, 0x61, 0xcb, 0x2c, 0x23, 0x9e, 0x8f, 0x2c, 0x58, 0x09, 0x59, 0x66, 0x3b, 0x8d, 0x4e, 0x4d, 0xdc, 0x84, 0x9a, 0x9e,
0x99, 0x03, 0xfe, 0x11, 0x36, 0x7b, 0x7c, 0xc4, 0xff, 0x01, 0x9c, 0xb8, 0x00, 0x9e, 0x4c, 0xee, 0x32, 0x45, 0xfc, 0x03, 0x6c, 0xb5, 0x68, 0x9f, 0xfe, 0x83, 0x38, 0x72, 0x00, 0x5c, 0x1e, 0xdc,
0x7b, 0x76, 0x25, 0x09, 0x6a, 0x27, 0xd4, 0x86, 0x2d, 0x13, 0x32, 0x25, 0xa7, 0xdf, 0xa1, 0x71, 0x76, 0xad, 0x42, 0xec, 0x94, 0x76, 0xb0, 0x05, 0x35, 0x5d, 0x32, 0x29, 0x8e, 0xbf, 0x43, 0xe5,
0xec, 0x79, 0x97, 0xfc, 0xfa, 0xf1, 0x2c, 0x84, 0x40, 0x35, 0xe6, 0xd7, 0xb1, 0xbd, 0x98, 0x44, 0xd8, 0x75, 0xaf, 0xe8, 0xcd, 0xfc, 0x55, 0x10, 0x82, 0x62, 0x44, 0x6f, 0x22, 0x6b, 0x31, 0xf6,
0x92, 0xb5, 0xa8, 0xf1, 0xa3, 0x8b, 0x09, 0x0b, 0xa3, 0x61, 0x10, 0xdb, 0xd5, 0x8e, 0xd5, 0x5d, 0xc4, 0x6b, 0x96, 0xe3, 0x85, 0x97, 0x43, 0x12, 0x84, 0x3d, 0x3f, 0xb2, 0x8a, 0x0d, 0xa3, 0x59,
0x19, 0x68, 0x27, 0x94, 0x41, 0x33, 0xe7, 0x97, 0xdf, 0x03, 0xd3, 0x58, 0x05, 0x9a, 0x2d, 0x58, 0xea, 0x48, 0x3b, 0x98, 0x80, 0x99, 0xd5, 0xe7, 0xef, 0x43, 0x2d, 0x63, 0xe4, 0xca, 0xd4, 0x60,
0x1e, 0x72, 0xe6, 0xe5, 0x12, 0xe4, 0x4e, 0x9c, 0x4f, 0x83, 0x40, 0xd4, 0xa4, 0x02, 0xe4, 0x8e, 0xb9, 0x47, 0x89, 0x9b, 0xb5, 0xc0, 0x2d, 0xb6, 0x3f, 0xf2, 0x7d, 0x96, 0x93, 0x34, 0xc0, 0x2d,
0xbe, 0x87, 0x66, 0x6f, 0x36, 0x0e, 0x2f, 0xa7, 0x9c, 0x3f, 0xfe, 0x4b, 0xee, 0xc2, 0x9a, 0x02, 0xfc, 0x0e, 0xcc, 0xd6, 0x78, 0x10, 0x5c, 0x8d, 0x28, 0x9d, 0xff, 0x4d, 0xee, 0xc2, 0xba, 0x10,
0x93, 0x82, 0x09, 0x54, 0xbd, 0xd9, 0x38, 0x94, 0x50, 0xc9, 0x9a, 0x3e, 0x87, 0xe6, 0xf1, 0x68, 0xe3, 0x0d, 0x23, 0x28, 0xba, 0xe3, 0x41, 0xc0, 0xa5, 0xe2, 0x35, 0x7e, 0x06, 0xe6, 0x71, 0xbf,
0x24, 0xd2, 0xa2, 0x87, 0x7b, 0x63, 0x0f, 0xaa, 0x22, 0xd3, 0xec, 0x04, 0xb2, 0x01, 0x4b, 0xe2, 0xcf, 0xc2, 0xc2, 0xd9, 0xb3, 0xb1, 0x07, 0x45, 0x16, 0xa9, 0x4f, 0x02, 0xda, 0x84, 0x25, 0xf6,
0x6e, 0x91, 0x5d, 0xe9, 0x2c, 0x76, 0xeb, 0x83, 0x74, 0x43, 0x5f, 0xc3, 0x9a, 0x82, 0x96, 0x12, 0x6c, 0xa1, 0x55, 0x68, 0x2c, 0x36, 0xcb, 0x9d, 0xc4, 0xc0, 0xaf, 0x60, 0x5d, 0x48, 0xf3, 0x16,
0x76, 0x60, 0x29, 0x16, 0x07, 0xb6, 0xd5, 0x59, 0xec, 0xae, 0x1e, 0x36, 0xf7, 0xf3, 0x29, 0xd9, 0x76, 0x60, 0x29, 0x62, 0x1b, 0x96, 0xd1, 0x58, 0x6c, 0xae, 0x1e, 0x9a, 0xfb, 0xd9, 0x57, 0xb2,
0x4f, 0xa4, 0xa6, 0x51, 0x4a, 0x92, 0xd2, 0xa4, 0xb7, 0x33, 0x59, 0xf4, 0x00, 0x5a, 0xda, 0x99, 0x1f, 0xb7, 0x9a, 0x78, 0x31, 0x8a, 0x53, 0xe3, 0xd9, 0x4e, 0xdb, 0xc2, 0x07, 0x50, 0x95, 0xf6,
0xc4, 0x73, 0x60, 0x45, 0x8a, 0x4b, 0x21, 0xeb, 0x83, 0x7c, 0x4f, 0xf7, 0x60, 0xed, 0x2c, 0x60, 0xb8, 0x9e, 0x0d, 0x25, 0xde, 0x5c, 0x22, 0x59, 0xee, 0x64, 0x36, 0xde, 0x83, 0xf5, 0x73, 0x9f,
0x9e, 0x3e, 0x37, 0xf7, 0xdc, 0x6d, 0x1d, 0x5a, 0x5a, 0xb6, 0xec, 0xba, 0x0f, 0xd0, 0x12, 0xb2, 0xb8, 0xf2, 0x77, 0xf3, 0xc0, 0xb3, 0x6d, 0x40, 0x55, 0x8a, 0xe6, 0x53, 0xf7, 0x1e, 0xaa, 0xac,
0xce, 0xd9, 0x94, 0x8d, 0xa3, 0xc7, 0x3f, 0xca, 0x29, 0x10, 0x1d, 0x4e, 0xde, 0x41, 0xf5, 0x83, 0xad, 0x0b, 0x32, 0x22, 0x83, 0x70, 0xfe, 0x43, 0x39, 0x03, 0x24, 0xcb, 0xf1, 0x67, 0x10, 0xf3,
0xa5, 0xf7, 0x83, 0xe0, 0x49, 0x3b, 0x26, 0xfb, 0xae, 0xd9, 0x96, 0xbe, 0x81, 0xc6, 0xf9, 0x2c, 0x60, 0xc8, 0xf3, 0xc0, 0xea, 0x24, 0x13, 0x93, 0xbe, 0xd7, 0xd4, 0xc4, 0x47, 0xb0, 0xf6, 0x91,
0x3e, 0xf5, 0x47, 0xf9, 0xbd, 0x08, 0x54, 0x43, 0x16, 0x0f, 0xb3, 0xa7, 0x15, 0x6b, 0x5d, 0x67, 0x44, 0xdd, 0xde, 0xec, 0x8e, 0x6a, 0xb0, 0xcc, 0xde, 0xa8, 0x98, 0xc1, 0xc4, 0xc2, 0x26, 0xfc,
0x05, 0xdf, 0x75, 0x07, 0x9a, 0x79, 0xbd, 0xea, 0x8d, 0x21, 0x8b, 0x72, 0x00, 0xb1, 0xa6, 0xaf, 0xc7, 0x15, 0xf8, 0x93, 0x9e, 0x40, 0xe5, 0x7a, 0xf8, 0x6d, 0x3e, 0xd1, 0x2a, 0x98, 0x99, 0x06,
0xa0, 0xf1, 0x8e, 0x9b, 0x34, 0x66, 0x56, 0x4e, 0x5d, 0x51, 0xd4, 0x82, 0x20, 0xaf, 0x54, 0x04, 0x97, 0x7d, 0x03, 0x95, 0x8b, 0x71, 0x74, 0xe6, 0xf5, 0xb3, 0x13, 0x40, 0x50, 0x0c, 0x48, 0xd4,
0xa6, 0x42, 0xfa, 0x0c, 0x5a, 0xe9, 0xb8, 0x3f, 0xc0, 0x91, 0x9a, 0xa0, 0x4a, 0x4c, 0x21, 0x0f, 0x4b, 0x87, 0x90, 0xad, 0xe5, 0x52, 0x05, 0xf5, 0x54, 0x76, 0xc0, 0xcc, 0xf2, 0xc5, 0x14, 0xf7,
0x7f, 0xd5, 0xa0, 0x7e, 0x92, 0xf4, 0xcf, 0x71, 0xe8, 0x93, 0x33, 0x58, 0xd5, 0xfc, 0x94, 0xb4, 0x48, 0x98, 0x09, 0xb0, 0x35, 0x7e, 0x09, 0x95, 0xb7, 0x54, 0x2f, 0xa3, 0x47, 0x65, 0xa5, 0x0b,
0xb5, 0xd6, 0x2a, 0xba, 0xaf, 0xe3, 0xce, 0x0b, 0x4b, 0xb9, 0x67, 0xb0, 0xaa, 0x19, 0x2c, 0x42, 0xa2, 0x34, 0x2b, 0x90, 0x65, 0x8a, 0x02, 0x7a, 0x87, 0xf8, 0x29, 0x54, 0x13, 0x30, 0xcd, 0xa8,
0x2b, 0xda, 0x31, 0x42, 0x2b, 0xf3, 0xe5, 0x4f, 0xd0, 0xc0, 0xa6, 0x4a, 0x3a, 0x05, 0x7e, 0xc3, 0x91, 0xe0, 0x5a, 0x04, 0x26, 0x92, 0x87, 0xbf, 0x4a, 0x50, 0x3e, 0x8d, 0x27, 0xfd, 0x38, 0xf0,
0x45, 0x9d, 0xa7, 0xf7, 0x64, 0x28, 0x58, 0x6c, 0x97, 0x08, 0xb6, 0xd4, 0x9c, 0x11, 0x6c, 0xb9, 0xd0, 0x39, 0xac, 0x4a, 0xe4, 0x47, 0x75, 0xe9, 0x23, 0xc8, 0xdf, 0x13, 0xb6, 0x33, 0xcd, 0xcd,
0xd7, 0x92, 0x23, 0xa8, 0x49, 0xaf, 0x23, 0xff, 0x6b, 0xd9, 0xd8, 0x7f, 0x1d, 0xa7, 0x2c, 0x24, 0xdb, 0x3d, 0x87, 0x55, 0xe9, 0x2a, 0x50, 0xd4, 0xf2, 0x17, 0x87, 0xa2, 0x36, 0xe9, 0x06, 0xb9,
0x11, 0x4e, 0x60, 0x25, 0x73, 0x1f, 0xa2, 0xe7, 0x19, 0xfe, 0xe6, 0x3c, 0x29, 0x8d, 0x49, 0x90, 0x86, 0x8a, 0x8a, 0x7f, 0xd4, 0xc8, 0xd5, 0xd7, 0x78, 0x6f, 0x3f, 0x79, 0x20, 0x42, 0xc8, 0xaa,
0x3e, 0x80, 0x9a, 0x16, 0xb2, 0x6d, 0x58, 0x05, 0x9a, 0x49, 0xa7, 0x3d, 0x27, 0xaa, 0xf4, 0x64, 0x60, 0x57, 0x64, 0x27, 0x5e, 0x23, 0x8a, 0xec, 0xe4, 0x5b, 0x01, 0x1d, 0xc1, 0x0a, 0xa7, 0x32,
0x56, 0x84, 0xf4, 0x18, 0xd6, 0x87, 0xf4, 0x14, 0xbc, 0xeb, 0x14, 0xea, 0xb9, 0x01, 0x11, 0x23, 0x7a, 0x24, 0x45, 0xab, 0x37, 0x85, 0x6d, 0x4f, 0x72, 0x71, 0x85, 0x53, 0x28, 0xa5, 0x9c, 0x44,
0x13, 0x59, 0x95, 0xb3, 0x5d, 0x1e, 0x54, 0x38, 0xb9, 0xd3, 0x20, 0x1c, 0xd3, 0xad, 0x10, 0x4e, 0x72, 0x9c, 0x46, 0x62, 0xfb, 0xf1, 0x44, 0x1f, 0x17, 0x69, 0x03, 0x88, 0xef, 0x1a, 0x6d, 0x6b,
0xc1, 0x9c, 0xc4, 0x33, 0xc9, 0x29, 0x46, 0xcf, 0x84, 0x9d, 0x01, 0x3d, 0x93, 0x39, 0xf4, 0x47, 0x50, 0x53, 0xe8, 0x61, 0xd7, 0xa7, 0x78, 0x45, 0x3f, 0x29, 0x34, 0x95, 0x7e, 0x34, 0x48, 0x2b,
0x50, 0x93, 0x63, 0x8a, 0x10, 0xf0, 0xd0, 0x23, 0x04, 0x73, 0xaa, 0xfb, 0x00, 0x6a, 0x30, 0xd1, 0xfd, 0xe4, 0x28, 0x7b, 0x06, 0xe5, 0x0c, 0x95, 0x48, 0x8b, 0x54, 0xa0, 0x6a, 0x6f, 0x4f, 0x76,
0x1b, 0x15, 0x06, 0xdb, 0x69, 0xcf, 0x89, 0xa6, 0x50, 0x6f, 0x77, 0x7f, 0xde, 0xba, 0xd6, 0xcd, 0x0a, 0x9d, 0x8c, 0x89, 0x8a, 0x8e, 0xce, 0x55, 0x45, 0x27, 0x87, 0x51, 0xf4, 0x1a, 0x96, 0x62,
0xad, 0x6b, 0xfd, 0xb9, 0x75, 0xad, 0x1f, 0x77, 0xee, 0xc2, 0xcd, 0x9d, 0xbb, 0xf0, 0xfb, 0xce, 0xda, 0xa0, 0xff, 0xa5, 0x30, 0x99, 0x60, 0xb6, 0x95, 0x77, 0x88, 0x23, 0xe6, 0x50, 0x51, 0x8e,
0x5d, 0xf8, 0xfc, 0x9f, 0xfe, 0x4b, 0xeb, 0xcb, 0x72, 0xf2, 0xef, 0xe5, 0xdf, 0x00, 0x00, 0x00, 0x58, 0x85, 0x95, 0x72, 0xc4, 0x1a, 0x83, 0x98, 0x02, 0x67, 0x88, 0xa2, 0xa0, 0x72, 0x49, 0x51,
0xff, 0xff, 0x0e, 0x8d, 0x9b, 0x46, 0x80, 0x09, 0x00, 0x00, 0xd0, 0x91, 0x73, 0x04, 0x2b, 0x1c, 0x12, 0x8a, 0x82, 0x8a, 0x1c, 0x45, 0x41, 0x67, 0x4a, 0x1b,
0x40, 0x60, 0x41, 0x99, 0x90, 0x1c, 0x56, 0xec, 0xfa, 0x14, 0x6f, 0x22, 0x75, 0xb2, 0xfb, 0xf3,
0xce, 0x31, 0x6e, 0xef, 0x1c, 0xe3, 0xcf, 0x9d, 0x63, 0xfc, 0xb8, 0x77, 0x16, 0x6e, 0xef, 0x9d,
0x85, 0xdf, 0xf7, 0xce, 0xc2, 0xa7, 0x35, 0xf9, 0x17, 0xe9, 0xe7, 0xe5, 0xf8, 0xdf, 0x8b, 0xbf,
0x01, 0x00, 0x00, 0xff, 0xff, 0x55, 0x8b, 0x17, 0x27, 0xa8, 0x0a, 0x00, 0x00,
} }
func (m *CreateSpaceRequest) Marshal() (dAtA []byte, err error) { func (m *CreateSpaceRequest) Marshal() (dAtA []byte, err error) {
@ -2022,6 +2206,126 @@ func (m *TreeParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil return len(dAtA) - i, nil
} }
func (m *WatchRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *WatchRequest) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *WatchRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if len(m.TreeId) > 0 {
i -= len(m.TreeId)
copy(dAtA[i:], m.TreeId)
i = encodeVarintApi(dAtA, i, uint64(len(m.TreeId)))
i--
dAtA[i] = 0x12
}
if len(m.SpaceId) > 0 {
i -= len(m.SpaceId)
copy(dAtA[i:], m.SpaceId)
i = encodeVarintApi(dAtA, i, uint64(len(m.SpaceId)))
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
func (m *WatchResponse) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *WatchResponse) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *WatchResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
return len(dAtA) - i, nil
}
func (m *UnwatchRequest) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *UnwatchRequest) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *UnwatchRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if len(m.TreeId) > 0 {
i -= len(m.TreeId)
copy(dAtA[i:], m.TreeId)
i = encodeVarintApi(dAtA, i, uint64(len(m.TreeId)))
i--
dAtA[i] = 0x12
}
if len(m.SpaceId) > 0 {
i -= len(m.SpaceId)
copy(dAtA[i:], m.SpaceId)
i = encodeVarintApi(dAtA, i, uint64(len(m.SpaceId)))
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
func (m *UnwatchResponse) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *UnwatchResponse) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *UnwatchResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
return len(dAtA) - i, nil
}
func (m *PutFileRequest) Marshal() (dAtA []byte, err error) { func (m *PutFileRequest) Marshal() (dAtA []byte, err error) {
size := m.Size() size := m.Size()
dAtA = make([]byte, size) dAtA = make([]byte, size)
@ -2520,6 +2824,58 @@ func (m *TreeParamsResponse) Size() (n int) {
return n return n
} }
func (m *WatchRequest) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.SpaceId)
if l > 0 {
n += 1 + l + sovApi(uint64(l))
}
l = len(m.TreeId)
if l > 0 {
n += 1 + l + sovApi(uint64(l))
}
return n
}
func (m *WatchResponse) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
return n
}
func (m *UnwatchRequest) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.SpaceId)
if l > 0 {
n += 1 + l + sovApi(uint64(l))
}
l = len(m.TreeId)
if l > 0 {
n += 1 + l + sovApi(uint64(l))
}
return n
}
func (m *UnwatchResponse) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
return n
}
func (m *PutFileRequest) Size() (n int) { func (m *PutFileRequest) Size() (n int) {
if m == nil { if m == nil {
return 0 return 0
@ -4480,6 +4836,334 @@ func (m *TreeParamsResponse) Unmarshal(dAtA []byte) error {
} }
return nil return nil
} }
func (m *WatchRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: WatchRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: WatchRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthApi
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthApi
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.SpaceId = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthApi
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthApi
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.TreeId = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipApi(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthApi
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *WatchResponse) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: WatchResponse: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: WatchResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
iNdEx = preIndex
skippy, err := skipApi(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthApi
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *UnwatchRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: UnwatchRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: UnwatchRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthApi
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthApi
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.SpaceId = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthApi
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthApi
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.TreeId = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipApi(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthApi
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *UnwatchResponse) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowApi
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: UnwatchResponse: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: UnwatchResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
iNdEx = preIndex
skippy, err := skipApi(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthApi
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *PutFileRequest) Unmarshal(dAtA []byte) error { func (m *PutFileRequest) Unmarshal(dAtA []byte) error {
l := len(dAtA) l := len(dAtA)
iNdEx := 0 iNdEx := 0

View File

@ -50,6 +50,8 @@ type DRPCClientApiClient interface {
AllTrees(ctx context.Context, in *AllTreesRequest) (*AllTreesResponse, error) AllTrees(ctx context.Context, in *AllTreesRequest) (*AllTreesResponse, error)
AllSpaces(ctx context.Context, in *AllSpacesRequest) (*AllSpacesResponse, error) AllSpaces(ctx context.Context, in *AllSpacesRequest) (*AllSpacesResponse, error)
LoadSpace(ctx context.Context, in *LoadSpaceRequest) (*LoadSpaceResponse, error) LoadSpace(ctx context.Context, in *LoadSpaceRequest) (*LoadSpaceResponse, error)
Watch(ctx context.Context, in *WatchRequest) (*WatchResponse, error)
Unwatch(ctx context.Context, in *UnwatchRequest) (*UnwatchResponse, error)
PutFile(ctx context.Context, in *PutFileRequest) (*PutFileResponse, error) PutFile(ctx context.Context, in *PutFileRequest) (*PutFileResponse, error)
GetFile(ctx context.Context, in *GetFileRequest) (*GetFileResponse, error) GetFile(ctx context.Context, in *GetFileRequest) (*GetFileResponse, error)
DeleteFile(ctx context.Context, in *DeleteFileRequest) (*DeleteFileResponse, error) DeleteFile(ctx context.Context, in *DeleteFileRequest) (*DeleteFileResponse, error)
@ -155,6 +157,24 @@ func (c *drpcClientApiClient) LoadSpace(ctx context.Context, in *LoadSpaceReques
return out, nil return out, nil
} }
func (c *drpcClientApiClient) Watch(ctx context.Context, in *WatchRequest) (*WatchResponse, error) {
out := new(WatchResponse)
err := c.cc.Invoke(ctx, "/clientapi.ClientApi/Watch", drpcEncoding_File_api_apiproto_protos_api_proto{}, in, out)
if err != nil {
return nil, err
}
return out, nil
}
func (c *drpcClientApiClient) Unwatch(ctx context.Context, in *UnwatchRequest) (*UnwatchResponse, error) {
out := new(UnwatchResponse)
err := c.cc.Invoke(ctx, "/clientapi.ClientApi/Unwatch", drpcEncoding_File_api_apiproto_protos_api_proto{}, in, out)
if err != nil {
return nil, err
}
return out, nil
}
func (c *drpcClientApiClient) PutFile(ctx context.Context, in *PutFileRequest) (*PutFileResponse, error) { func (c *drpcClientApiClient) PutFile(ctx context.Context, in *PutFileRequest) (*PutFileResponse, error) {
out := new(PutFileResponse) out := new(PutFileResponse)
err := c.cc.Invoke(ctx, "/clientapi.ClientApi/PutFile", drpcEncoding_File_api_apiproto_protos_api_proto{}, in, out) err := c.cc.Invoke(ctx, "/clientapi.ClientApi/PutFile", drpcEncoding_File_api_apiproto_protos_api_proto{}, in, out)
@ -193,6 +213,8 @@ type DRPCClientApiServer interface {
AllTrees(context.Context, *AllTreesRequest) (*AllTreesResponse, error) AllTrees(context.Context, *AllTreesRequest) (*AllTreesResponse, error)
AllSpaces(context.Context, *AllSpacesRequest) (*AllSpacesResponse, error) AllSpaces(context.Context, *AllSpacesRequest) (*AllSpacesResponse, error)
LoadSpace(context.Context, *LoadSpaceRequest) (*LoadSpaceResponse, error) LoadSpace(context.Context, *LoadSpaceRequest) (*LoadSpaceResponse, error)
Watch(context.Context, *WatchRequest) (*WatchResponse, error)
Unwatch(context.Context, *UnwatchRequest) (*UnwatchResponse, error)
PutFile(context.Context, *PutFileRequest) (*PutFileResponse, error) PutFile(context.Context, *PutFileRequest) (*PutFileResponse, error)
GetFile(context.Context, *GetFileRequest) (*GetFileResponse, error) GetFile(context.Context, *GetFileRequest) (*GetFileResponse, error)
DeleteFile(context.Context, *DeleteFileRequest) (*DeleteFileResponse, error) DeleteFile(context.Context, *DeleteFileRequest) (*DeleteFileResponse, error)
@ -240,6 +262,14 @@ func (s *DRPCClientApiUnimplementedServer) LoadSpace(context.Context, *LoadSpace
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
} }
func (s *DRPCClientApiUnimplementedServer) Watch(context.Context, *WatchRequest) (*WatchResponse, error) {
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
}
func (s *DRPCClientApiUnimplementedServer) Unwatch(context.Context, *UnwatchRequest) (*UnwatchResponse, error) {
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
}
func (s *DRPCClientApiUnimplementedServer) PutFile(context.Context, *PutFileRequest) (*PutFileResponse, error) { func (s *DRPCClientApiUnimplementedServer) PutFile(context.Context, *PutFileRequest) (*PutFileResponse, error) {
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
} }
@ -254,7 +284,7 @@ func (s *DRPCClientApiUnimplementedServer) DeleteFile(context.Context, *DeleteFi
type DRPCClientApiDescription struct{} type DRPCClientApiDescription struct{}
func (DRPCClientApiDescription) NumMethods() int { return 13 } func (DRPCClientApiDescription) NumMethods() int { return 15 }
func (DRPCClientApiDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { func (DRPCClientApiDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) {
switch n { switch n {
@ -349,6 +379,24 @@ func (DRPCClientApiDescription) Method(n int) (string, drpc.Encoding, drpc.Recei
) )
}, DRPCClientApiServer.LoadSpace, true }, DRPCClientApiServer.LoadSpace, true
case 10: case 10:
return "/clientapi.ClientApi/Watch", drpcEncoding_File_api_apiproto_protos_api_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCClientApiServer).
Watch(
ctx,
in1.(*WatchRequest),
)
}, DRPCClientApiServer.Watch, true
case 11:
return "/clientapi.ClientApi/Unwatch", drpcEncoding_File_api_apiproto_protos_api_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCClientApiServer).
Unwatch(
ctx,
in1.(*UnwatchRequest),
)
}, DRPCClientApiServer.Unwatch, true
case 12:
return "/clientapi.ClientApi/PutFile", drpcEncoding_File_api_apiproto_protos_api_proto{}, return "/clientapi.ClientApi/PutFile", drpcEncoding_File_api_apiproto_protos_api_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCClientApiServer). return srv.(DRPCClientApiServer).
@ -357,7 +405,7 @@ func (DRPCClientApiDescription) Method(n int) (string, drpc.Encoding, drpc.Recei
in1.(*PutFileRequest), in1.(*PutFileRequest),
) )
}, DRPCClientApiServer.PutFile, true }, DRPCClientApiServer.PutFile, true
case 11: case 13:
return "/clientapi.ClientApi/GetFile", drpcEncoding_File_api_apiproto_protos_api_proto{}, return "/clientapi.ClientApi/GetFile", drpcEncoding_File_api_apiproto_protos_api_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCClientApiServer). return srv.(DRPCClientApiServer).
@ -366,7 +414,7 @@ func (DRPCClientApiDescription) Method(n int) (string, drpc.Encoding, drpc.Recei
in1.(*GetFileRequest), in1.(*GetFileRequest),
) )
}, DRPCClientApiServer.GetFile, true }, DRPCClientApiServer.GetFile, true
case 12: case 14:
return "/clientapi.ClientApi/DeleteFile", drpcEncoding_File_api_apiproto_protos_api_proto{}, return "/clientapi.ClientApi/DeleteFile", drpcEncoding_File_api_apiproto_protos_api_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCClientApiServer). return srv.(DRPCClientApiServer).
@ -544,6 +592,38 @@ func (x *drpcClientApi_LoadSpaceStream) SendAndClose(m *LoadSpaceResponse) error
return x.CloseSend() return x.CloseSend()
} }
type DRPCClientApi_WatchStream interface {
drpc.Stream
SendAndClose(*WatchResponse) error
}
type drpcClientApi_WatchStream struct {
drpc.Stream
}
func (x *drpcClientApi_WatchStream) SendAndClose(m *WatchResponse) error {
if err := x.MsgSend(m, drpcEncoding_File_api_apiproto_protos_api_proto{}); err != nil {
return err
}
return x.CloseSend()
}
type DRPCClientApi_UnwatchStream interface {
drpc.Stream
SendAndClose(*UnwatchResponse) error
}
type drpcClientApi_UnwatchStream struct {
drpc.Stream
}
func (x *drpcClientApi_UnwatchStream) SendAndClose(m *UnwatchResponse) error {
if err := x.MsgSend(m, drpcEncoding_File_api_apiproto_protos_api_proto{}); err != nil {
return err
}
return x.CloseSend()
}
type DRPCClientApi_PutFileStream interface { type DRPCClientApi_PutFileStream interface {
drpc.Stream drpc.Stream
SendAndClose(*PutFileResponse) error SendAndClose(*PutFileResponse) error

View File

@ -14,6 +14,8 @@ service ClientApi {
rpc AllTrees(AllTreesRequest) returns(AllTreesResponse); rpc AllTrees(AllTreesRequest) returns(AllTreesResponse);
rpc AllSpaces(AllSpacesRequest) returns(AllSpacesResponse); rpc AllSpaces(AllSpacesRequest) returns(AllSpacesResponse);
rpc LoadSpace(LoadSpaceRequest) returns(LoadSpaceResponse); rpc LoadSpace(LoadSpaceRequest) returns(LoadSpaceResponse);
rpc Watch(WatchRequest) returns(WatchResponse);
rpc Unwatch(UnwatchRequest) returns(UnwatchResponse);
rpc PutFile(PutFileRequest) returns(PutFileResponse); rpc PutFile(PutFileRequest) returns(PutFileResponse);
rpc GetFile(GetFileRequest) returns(GetFileResponse); rpc GetFile(GetFileRequest) returns(GetFileResponse);
rpc DeleteFile(DeleteFileRequest) returns(DeleteFileResponse); rpc DeleteFile(DeleteFileRequest) returns(DeleteFileResponse);
@ -108,6 +110,22 @@ message TreeParamsResponse {
repeated string headIds = 2; repeated string headIds = 2;
} }
message WatchRequest {
string spaceId = 1;
string treeId = 2;
}
message WatchResponse {
}
message UnwatchRequest {
string spaceId = 1;
string treeId = 2;
}
message UnwatchResponse {
}
message PutFileRequest { message PutFileRequest {
string path = 1; string path = 1;
string spaceId = 2; string spaceId = 2;

View File

@ -25,6 +25,27 @@ type rpcHandler struct {
file fileservice.FileService file fileservice.FileService
} }
func (r *rpcHandler) Watch(ctx context.Context, request *apiproto.WatchRequest) (resp *apiproto.WatchResponse, err error) {
space, err := r.spaceService.GetSpace(context.Background(), request.SpaceId)
if err != nil {
return
}
space.StatusService().Watch(request.TreeId)
resp = &apiproto.WatchResponse{}
return
}
func (r *rpcHandler) Unwatch(ctx context.Context, request *apiproto.UnwatchRequest) (resp *apiproto.UnwatchResponse, err error) {
space, err := r.spaceService.GetSpace(context.Background(), request.SpaceId)
if err != nil {
return
}
space.StatusService().Unwatch(request.TreeId)
resp = &apiproto.UnwatchResponse{}
return
}
func (r *rpcHandler) LoadSpace(ctx context.Context, request *apiproto.LoadSpaceRequest) (resp *apiproto.LoadSpaceResponse, err error) { func (r *rpcHandler) LoadSpace(ctx context.Context, request *apiproto.LoadSpaceRequest) (resp *apiproto.LoadSpaceResponse, err error) {
_, err = r.spaceService.GetSpace(context.Background(), request.SpaceId) _, err = r.spaceService.GetSpace(context.Background(), request.SpaceId)
if err != nil { if err != nil {

View File

@ -57,17 +57,26 @@ func (s *service) Name() (name string) {
} }
func (s *service) Run(ctx context.Context) (err error) { func (s *service) Run(ctx context.Context) (err error) {
err = s.BaseDrpcServer.Run( params := server.Params{
ctx, BufferSizeMb: s.cfg.Stream.MaxMsgSizeMb,
s.cfg.APIServer.ListenAddrs, TimeoutMillis: s.cfg.Stream.TimeoutMilliseconds,
func(handler drpc.Handler) drpc.Handler { ListenAddrs: s.cfg.APIServer.ListenAddrs,
Wrapper: func(handler drpc.Handler) drpc.Handler {
return handler return handler
}, },
s.transport.BasicListener) Converter: s.transport.BasicListener,
}
err = s.BaseDrpcServer.Run(ctx, params)
if err != nil { if err != nil {
return return
} }
return apiproto.DRPCRegisterClientApi(s, &rpcHandler{s.spaceService, s.storageService, s.docService, s.account, s.file}) return apiproto.DRPCRegisterClientApi(s, &rpcHandler{
spaceService: s.spaceService,
storageService: s.storageService,
docService: s.docService,
account: s.account,
file: s.file,
})
} }
func (s *service) Close(ctx context.Context) (err error) { func (s *service) Close(ctx context.Context) (err error) {

View File

@ -99,6 +99,7 @@ func (s *service) loadSpace(ctx context.Context, id string) (value ocache.Object
if err != nil { if err != nil {
return return
} }
ns.StatusService().SetUpdateReceiver(&statusReceiver{})
if err = ns.Init(ctx); err != nil { if err = ns.Init(ctx); err != nil {
return return
} }

View File

@ -0,0 +1,20 @@
package clientspace
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"go.uber.org/zap"
)
type statusReceiver struct {
}
func (s *statusReceiver) UpdateTree(ctx context.Context, treeId string, status statusservice.SyncStatus) (err error) {
log.With(zap.String("treeId", treeId), zap.Bool("synced", status == statusservice.SyncStatusSynced)).
Debug("updating sync status")
return nil
}
func (s *statusReceiver) UpdateNodeConnection(online bool) {
log.With(zap.Bool("nodes online", online)).Debug("updating node connection")
}

View File

@ -8,14 +8,19 @@ require (
github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000
github.com/dgraph-io/badger/v3 v3.2103.3 github.com/dgraph-io/badger/v3 v3.2103.3
github.com/gogo/protobuf v1.3.2 github.com/gogo/protobuf v1.3.2
github.com/stretchr/testify v1.8.0
go.uber.org/zap v1.23.0 go.uber.org/zap v1.23.0
storj.io/drpc v0.0.32
) )
require ( require (
github.com/anytypeio/go-anytype-infrastructure-experiments/consensus v0.0.0-20221217135026-4eba413631b3 // indirect
github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 // indirect github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 // indirect
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect
github.com/dustin/go-humanize v1.0.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect
@ -34,7 +39,6 @@ require (
github.com/klauspost/cpuid/v2 v2.1.1 // indirect github.com/klauspost/cpuid/v2 v2.1.1 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-libp2p v0.23.2 // indirect github.com/libp2p/go-libp2p v0.23.2 // indirect
github.com/libp2p/go-libp2p-core v0.20.1 // indirect
github.com/libp2p/go-openssl v0.1.0 // indirect github.com/libp2p/go-openssl v0.1.0 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect github.com/mattn/go-isatty v0.0.16 // indirect
github.com/mattn/go-pointer v0.0.1 // indirect github.com/mattn/go-pointer v0.0.1 // indirect
@ -49,6 +53,7 @@ require (
github.com/multiformats/go-multihash v0.2.1 // indirect github.com/multiformats/go-multihash v0.2.1 // indirect
github.com/multiformats/go-varint v0.0.6 // indirect github.com/multiformats/go-varint v0.0.6 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.13.0 // indirect github.com/prometheus/client_golang v1.13.0 // indirect
github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/common v0.37.0 // indirect
@ -60,12 +65,12 @@ require (
go.opencensus.io v0.23.0 // indirect go.opencensus.io v0.23.0 // indirect
go.uber.org/atomic v1.10.0 // indirect go.uber.org/atomic v1.10.0 // indirect
go.uber.org/multierr v1.8.0 // indirect go.uber.org/multierr v1.8.0 // indirect
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b // indirect
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect
golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 // indirect golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 // indirect
golang.org/x/sys v0.0.0-20221010170243-090e33056c14 // indirect golang.org/x/sys v0.0.0-20221010170243-090e33056c14 // indirect
google.golang.org/protobuf v1.28.1 // indirect google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
lukechampine.com/blake3 v1.1.7 // indirect lukechampine.com/blake3 v1.1.7 // indirect
storj.io/drpc v0.0.32 // indirect
) )

View File

@ -40,6 +40,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/anytypeio/go-anytype-infrastructure-experiments/consensus v0.0.0-20221217135026-4eba413631b3 h1:yIyGIb7bRkEngKtQ0Ja5bome2SEnErwTaEvR8dA/WtU=
github.com/anytypeio/go-anytype-infrastructure-experiments/consensus v0.0.0-20221217135026-4eba413631b3/go.mod h1:w0i62cRB2jVpjFb2CpPNj5J+ihKqqmBBG9X2+Odekjw=
github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 h1:kMPPZYmJgbs4AJfodbg2OCXg5cp+9LPAJcLZJqmcghk= github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 h1:kMPPZYmJgbs4AJfodbg2OCXg5cp+9LPAJcLZJqmcghk=
github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232/go.mod h1:+PeHBAWp7gUh/yw6uAauKc5ku0w4cFNg6DUddGxoGq0= github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232/go.mod h1:+PeHBAWp7gUh/yw6uAauKc5ku0w4cFNg6DUddGxoGq0=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
@ -56,6 +58,8 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c h1:+bD75daSbsxyTzkKpNplC4xls+7/tGwty+zruzOnOmk=
github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c/go.mod h1:zCt2QeYukhd/g0bIdNqF+b/kKz1hnLFNDkP49qN5kqI=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
@ -214,8 +218,6 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
github.com/libp2p/go-libp2p v0.23.2 h1:yqyTeKQJyofWXxEv/eEVUvOrGdt/9x+0PIQ4N1kaxmE= github.com/libp2p/go-libp2p v0.23.2 h1:yqyTeKQJyofWXxEv/eEVUvOrGdt/9x+0PIQ4N1kaxmE=
github.com/libp2p/go-libp2p v0.23.2/go.mod h1:s9DEa5NLR4g+LZS+md5uGU4emjMWFiqkZr6hBTY8UxI= github.com/libp2p/go-libp2p v0.23.2/go.mod h1:s9DEa5NLR4g+LZS+md5uGU4emjMWFiqkZr6hBTY8UxI=
github.com/libp2p/go-libp2p-core v0.20.1 h1:fQz4BJyIFmSZAiTbKV8qoYhEH5Dtv/cVhZbG3Ib/+Cw=
github.com/libp2p/go-libp2p-core v0.20.1/go.mod h1:6zR8H7CvQWgYLsbG4on6oLNSGcyKaYFSEYyDt51+bIY=
github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo=
github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
@ -305,12 +307,15 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@ -353,8 +358,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@ -365,6 +370,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b h1:SCE/18RnFsLrjydh/R/s5EVvHoZprqEQUuoxK8q2Pc4=
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg=

View File

@ -6,6 +6,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
@ -13,6 +14,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/periodicsync" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/periodicsync"
"go.uber.org/zap" "go.uber.org/zap"
"strings" "strings"
"time"
) )
type TreeHeads struct { type TreeHeads struct {
@ -48,13 +50,14 @@ func NewDiffService(
storage storage.SpaceStorage, storage storage.SpaceStorage,
confConnector nodeconf.ConfConnector, confConnector nodeconf.ConfConnector,
cache treegetter.TreeGetter, cache treegetter.TreeGetter,
statusService statusservice.StatusService,
log *zap.Logger) DiffService { log *zap.Logger) DiffService {
diff := ldiff.New(16, 16) diff := ldiff.New(16, 16)
l := log.With(zap.String("spaceId", spaceId)) l := log.With(zap.String("spaceId", spaceId))
factory := spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient) factory := spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient)
syncer := newDiffSyncer(spaceId, diff, confConnector, cache, storage, factory, l) syncer := newDiffSyncer(spaceId, diff, confConnector, cache, storage, factory, statusService, l)
periodicSync := periodicsync.NewPeriodicSync(syncPeriod, syncer.Sync, l) periodicSync := periodicsync.NewPeriodicSync(syncPeriod, time.Minute, syncer.Sync, l)
return &diffService{ return &diffService{
spaceId: spaceId, spaceId: spaceId,

View File

@ -5,6 +5,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
@ -30,6 +31,7 @@ func newDiffSyncer(
cache treegetter.TreeGetter, cache treegetter.TreeGetter,
storage storage.SpaceStorage, storage storage.SpaceStorage,
clientFactory spacesyncproto.ClientFactory, clientFactory spacesyncproto.ClientFactory,
statusService statusservice.StatusService,
log *zap.Logger) DiffSyncer { log *zap.Logger) DiffSyncer {
return &diffSyncer{ return &diffSyncer{
diff: diff, diff: diff,
@ -39,6 +41,7 @@ func newDiffSyncer(
confConnector: confConnector, confConnector: confConnector,
clientFactory: clientFactory, clientFactory: clientFactory,
log: log, log: log,
statusService: statusService,
} }
} }
@ -51,6 +54,7 @@ type diffSyncer struct {
clientFactory spacesyncproto.ClientFactory clientFactory spacesyncproto.ClientFactory
log *zap.Logger log *zap.Logger
deletionState deletionstate.DeletionState deletionState deletionstate.DeletionState
statusService statusservice.StatusService
} }
func (d *diffSyncer) Init(deletionState deletionstate.DeletionState) { func (d *diffSyncer) Init(deletionState deletionstate.DeletionState) {
@ -91,13 +95,19 @@ func (d *diffSyncer) Sync(ctx context.Context) error {
} }
func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error) {
cl := d.clientFactory.Client(p) var (
rdiff := remotediff.NewRemoteDiff(d.spaceId, cl) cl = d.clientFactory.Client(p)
rdiff = remotediff.NewRemoteDiff(d.spaceId, cl)
stateCounter uint64 = 0
)
stateCounter = d.statusService.StateCounter()
newIds, changedIds, removedIds, err := d.diff.Diff(ctx, rdiff) newIds, changedIds, removedIds, err := d.diff.Diff(ctx, rdiff)
err = rpcerr.Unwrap(err) err = rpcerr.Unwrap(err)
if err != nil && err != spacesyncproto.ErrSpaceMissing { if err != nil && err != spacesyncproto.ErrSpaceMissing {
d.statusService.SetNodesOnline(p.Id(), false)
return err return err
} }
d.statusService.SetNodesOnline(p.Id(), true)
if err == spacesyncproto.ErrSpaceMissing { if err == spacesyncproto.ErrSpaceMissing {
return d.sendPushSpaceRequest(ctx, cl) return d.sendPushSpaceRequest(ctx, cl)
} }
@ -105,6 +115,8 @@ func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error)
// not syncing ids which were removed through settings document // not syncing ids which were removed through settings document
filteredIds := d.deletionState.FilterJoin(newIds, changedIds, removedIds) filteredIds := d.deletionState.FilterJoin(newIds, changedIds, removedIds)
d.statusService.RemoveAllExcept(p.Id(), filteredIds, stateCounter)
ctx = peer.CtxWithPeerId(ctx, p.Id()) ctx = peer.CtxWithPeerId(ctx, p.Id())
d.pingTreesInCache(ctx, filteredIds) d.pingTreesInCache(ctx, filteredIds)

View File

@ -8,6 +8,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate/mock_deletionstate" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate/mock_deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto/mock_spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto/mock_spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter/mock_treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter/mock_treegetter"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
@ -110,7 +111,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
spaceId := "spaceId" spaceId := "spaceId"
aclRootId := "aclRootId" aclRootId := "aclRootId"
l := logger.NewNamed(spaceId) l := logger.NewNamed(spaceId)
diffSyncer := newDiffSyncer(spaceId, diffMock, connectorMock, cacheMock, stMock, factory, l) diffSyncer := newDiffSyncer(spaceId, diffMock, connectorMock, cacheMock, stMock, factory, statusservice.NewNoOpStatusService(), l)
delState.EXPECT().AddObserver(gomock.Any()) delState.EXPECT().AddObserver(gomock.Any())
diffSyncer.Init(delState) diffSyncer.Init(delState)

View File

@ -19,5 +19,6 @@ func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncR
} }
func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) (err error) { func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) (err error) {
// TODO: if needed we can launch full sync here
return r.s.SyncService().StreamPool().AddAndReadStreamSync(stream) return r.s.SyncService().StreamPool().AddAndReadStreamSync(stream)
} }

View File

@ -7,6 +7,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
@ -108,12 +109,20 @@ func (s *service) NewSpace(ctx context.Context, id string) (Space, error) {
lastConfiguration := s.configurationService.GetLast() lastConfiguration := s.configurationService.GetLast()
confConnector := nodeconf.NewConfConnector(lastConfiguration, s.pool) confConnector := nodeconf.NewConfConnector(lastConfiguration, s.pool)
diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, confConnector, s.treeGetter, log)
syncService := syncservice.NewSyncService(id, confConnector) statusService := statusservice.NewNoOpStatusService()
// this will work only for clients, not the best solution, but...
if !lastConfiguration.IsResponsible(st.Id()) {
statusService = statusservice.NewStatusService(st.Id(), lastConfiguration, st)
}
diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, confConnector, s.treeGetter, statusService, log)
syncService := syncservice.NewSyncService(id, confConnector, s.config.SyncPeriod)
sp := &space{ sp := &space{
id: id, id: id,
syncService: syncService, syncService: syncService,
diffService: diffService, diffService: diffService,
statusService: statusService,
cache: s.treeGetter, cache: s.treeGetter,
account: s.account, account: s.account,
configuration: lastConfiguration, configuration: lastConfiguration,

View File

@ -9,6 +9,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settingsdocument/deletionstate"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncacl" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncacl"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
@ -80,6 +81,8 @@ type Space interface {
BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree.ObjectTree, error) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree.ObjectTree, error)
DeleteTree(ctx context.Context, id string) (err error) DeleteTree(ctx context.Context, id string) (err error)
StatusService() statusservice.StatusService
Close() error Close() error
} }
@ -92,6 +95,7 @@ type space struct {
syncService syncservice.SyncService syncService syncservice.SyncService
diffService diffservice.DiffService diffService diffservice.DiffService
statusService statusservice.StatusService
storage storage.SpaceStorage storage storage.SpaceStorage
cache treegetter.TreeGetter cache treegetter.TreeGetter
account account.Service account account.Service
@ -186,6 +190,7 @@ func (s *space) Init(ctx context.Context) (err error) {
if err != nil { if err != nil {
return return
} }
s.statusService.Run()
return nil return nil
} }
@ -202,6 +207,10 @@ func (s *space) DiffService() diffservice.DiffService {
return s.diffService return s.diffService
} }
func (s *space) StatusService() statusservice.StatusService {
return s.statusService
}
func (s *space) StoredIds() []string { func (s *space) StoredIds() []string {
return s.diffService.AllIds() return s.diffService.AllIds()
} }
@ -216,12 +225,14 @@ func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePay
return return
} }
deps := synctree.CreateDeps{ deps := synctree.CreateDeps{
SpaceId: s.id, SpaceId: s.id,
Payload: payload, Payload: payload,
StreamPool: s.syncService.StreamPool(), SyncService: s.syncService,
Configuration: s.configuration, Configuration: s.configuration,
AclList: s.aclList, AclList: s.aclList,
SpaceStorage: s.storage, SpaceStorage: s.storage,
StatusService: s.statusService,
HeadNotifiable: s.diffService,
} }
return synctree.DeriveSyncTree(ctx, deps) return synctree.DeriveSyncTree(ctx, deps)
} }
@ -232,12 +243,14 @@ func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePay
return return
} }
deps := synctree.CreateDeps{ deps := synctree.CreateDeps{
SpaceId: s.id, SpaceId: s.id,
Payload: payload, Payload: payload,
StreamPool: s.syncService.StreamPool(), SyncService: s.syncService,
Configuration: s.configuration, Configuration: s.configuration,
AclList: s.aclList, AclList: s.aclList,
SpaceStorage: s.storage, SpaceStorage: s.storage,
StatusService: s.statusService,
HeadNotifiable: s.diffService,
} }
return synctree.CreateSyncTree(ctx, deps) return synctree.CreateSyncTree(ctx, deps)
} }
@ -249,13 +262,14 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene
} }
deps := synctree.BuildDeps{ deps := synctree.BuildDeps{
SpaceId: s.id, SpaceId: s.id,
StreamPool: s.syncService.StreamPool(), SyncService: s.syncService,
Configuration: s.configuration, Configuration: s.configuration,
HeadNotifiable: s.diffService, HeadNotifiable: s.diffService,
Listener: listener, Listener: listener,
AclList: s.aclList, AclList: s.aclList,
SpaceStorage: s.storage, SpaceStorage: s.storage,
TreeUsage: &s.treesUsed, TreeUsage: &s.treesUsed,
StatusService: s.statusService,
} }
return synctree.BuildSyncTreeOrGetRemote(ctx, id, deps) return synctree.BuildSyncTreeOrGetRemote(ctx, id, deps)
} }
@ -286,5 +300,9 @@ func (s *space) Close() error {
if err := s.storage.Close(); err != nil { if err := s.storage.Close(); err != nil {
mError.Add(err) mError.Add(err)
} }
if err := s.statusService.Close(); err != nil {
mError.Add(err)
}
return mError.Err() return mError.Err()
} }

View File

@ -0,0 +1,40 @@
package statusservice
type noOpStatusService struct{}
func NewNoOpStatusService() StatusService {
return &noOpStatusService{}
}
func (n *noOpStatusService) HeadsChange(treeId string, heads []string) {
}
func (n *noOpStatusService) HeadsReceive(senderId, treeId string, heads []string) {
}
func (n *noOpStatusService) Watch(treeId string) (err error) {
return
}
func (n *noOpStatusService) Unwatch(treeId string) {
}
func (n *noOpStatusService) SetNodesOnline(senderId string, online bool) {
}
func (n *noOpStatusService) StateCounter() uint64 {
return 0
}
func (n *noOpStatusService) RemoveAllExcept(senderId string, differentRemoteIds []string, stateCounter uint64) {
}
func (n *noOpStatusService) SetUpdateReceiver(updater UpdateReceiver) {
}
func (n *noOpStatusService) Run() {
}
func (n *noOpStatusService) Close() error {
return nil
}

View File

@ -0,0 +1,266 @@
package statusservice
import (
"context"
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/periodicsync"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
"golang.org/x/exp/slices"
"sync"
"time"
)
const (
statusServiceUpdateInterval = 5
statusServiceTimeout = time.Second
)
var log = logger.NewNamed("commonspace.statusservice")
type UpdateReceiver interface {
UpdateTree(ctx context.Context, treeId string, status SyncStatus) (err error)
UpdateNodeConnection(online bool)
}
type StatusService interface {
HeadsChange(treeId string, heads []string)
HeadsReceive(senderId, treeId string, heads []string)
Watch(treeId string) (err error)
Unwatch(treeId string)
SetNodesOnline(senderId string, online bool)
StateCounter() uint64
RemoveAllExcept(senderId string, differentRemoteIds []string, stateCounter uint64)
SetUpdateReceiver(updater UpdateReceiver)
Run()
Close() error
}
type SyncStatus int
const (
SyncStatusUnknown SyncStatus = iota
SyncStatusSynced
SyncStatusNotSynced
)
type treeHeadsEntry struct {
heads []string
stateCounter uint64
syncStatus SyncStatus
}
type treeStatus struct {
treeId string
status SyncStatus
heads []string
}
type statusService struct {
sync.Mutex
configuration nodeconf.Configuration
periodicSync periodicsync.PeriodicSync
updateReceiver UpdateReceiver
storage storage.SpaceStorage
spaceId string
treeHeads map[string]treeHeadsEntry
watchers map[string]struct{}
stateCounter uint64
nodesOnline bool
treeStatusBuf []treeStatus
}
func NewStatusService(spaceId string, configuration nodeconf.Configuration, store storage.SpaceStorage) StatusService {
return &statusService{
spaceId: spaceId,
treeHeads: map[string]treeHeadsEntry{},
watchers: map[string]struct{}{},
configuration: configuration,
storage: store,
stateCounter: 0,
}
}
func (s *statusService) SetUpdateReceiver(updater UpdateReceiver) {
s.Lock()
defer s.Unlock()
s.updateReceiver = updater
}
func (s *statusService) Run() {
s.periodicSync = periodicsync.NewPeriodicSync(
statusServiceUpdateInterval,
statusServiceTimeout,
s.update,
log)
s.periodicSync.Run()
}
func (s *statusService) HeadsChange(treeId string, heads []string) {
s.Lock()
defer s.Unlock()
var headsCopy []string
headsCopy = append(headsCopy, heads...)
s.treeHeads[treeId] = treeHeadsEntry{
heads: headsCopy,
stateCounter: s.stateCounter,
syncStatus: SyncStatusNotSynced,
}
s.stateCounter++
}
func (s *statusService) SetNodesOnline(senderId string, online bool) {
if !s.isSenderResponsible(senderId) {
return
}
s.Lock()
defer s.Unlock()
s.nodesOnline = online
}
func (s *statusService) update(ctx context.Context) (err error) {
s.treeStatusBuf = s.treeStatusBuf[:0]
s.Lock()
if s.updateReceiver == nil {
s.Unlock()
return
}
for treeId := range s.watchers {
// that means that we haven't yet got the status update
treeHeads, exists := s.treeHeads[treeId]
if !exists {
err = fmt.Errorf("treeHeads should always exist for watchers")
s.Unlock()
return
}
s.treeStatusBuf = append(s.treeStatusBuf, treeStatus{treeId, treeHeads.syncStatus, treeHeads.heads})
}
s.Unlock()
s.updateReceiver.UpdateNodeConnection(s.nodesOnline)
for _, entry := range s.treeStatusBuf {
err = s.updateReceiver.UpdateTree(ctx, entry.treeId, entry.status)
if err != nil {
return
}
}
return
}
func (s *statusService) HeadsReceive(senderId, treeId string, heads []string) {
s.Lock()
defer s.Unlock()
curTreeHeads, ok := s.treeHeads[treeId]
if !ok || curTreeHeads.syncStatus == SyncStatusSynced {
return
}
// checking if other node is responsible
if len(heads) == 0 || !s.isSenderResponsible(senderId) {
return
}
// checking if we received the head that we are interested in
for _, head := range heads {
if idx, found := slices.BinarySearch(curTreeHeads.heads, head); found {
curTreeHeads.heads[idx] = ""
}
}
curTreeHeads.heads = slice.DiscardFromSlice(curTreeHeads.heads, func(h string) bool {
return h == ""
})
if len(curTreeHeads.heads) == 0 {
curTreeHeads.syncStatus = SyncStatusSynced
}
s.treeHeads[treeId] = curTreeHeads
}
func (s *statusService) Watch(treeId string) (err error) {
s.Lock()
defer s.Unlock()
_, ok := s.treeHeads[treeId]
if !ok {
var (
st treestorage.TreeStorage
heads []string
)
st, err = s.storage.TreeStorage(treeId)
if err != nil {
return
}
heads, err = st.Heads()
if err != nil {
return
}
slices.Sort(heads)
s.stateCounter++
s.treeHeads[treeId] = treeHeadsEntry{
heads: heads,
stateCounter: s.stateCounter,
syncStatus: SyncStatusUnknown,
}
}
s.watchers[treeId] = struct{}{}
return
}
func (s *statusService) Unwatch(treeId string) {
s.Lock()
defer s.Unlock()
if _, ok := s.watchers[treeId]; ok {
delete(s.watchers, treeId)
}
}
func (s *statusService) Close() (err error) {
s.periodicSync.Close()
return
}
func (s *statusService) StateCounter() uint64 {
s.Lock()
defer s.Unlock()
return s.stateCounter
}
func (s *statusService) 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
}
s.Lock()
defer s.Unlock()
slices.Sort(differentRemoteIds)
for treeId, entry := range s.treeHeads {
// if the current update is outdated
if entry.stateCounter > stateCounter {
continue
}
// if we didn't find our treeId in heads ids which are different from us and node
if _, found := slices.BinarySearch(differentRemoteIds, treeId); !found {
entry.syncStatus = SyncStatusSynced
s.treeHeads[treeId] = entry
}
}
}
func (s *statusService) isSenderResponsible(senderId string) bool {
return slices.Contains(s.configuration.NodeIds(s.spaceId), senderId)
}

View File

@ -0,0 +1,87 @@
package syncservice
import (
"context"
"github.com/cheggaaa/mb/v3"
"go.uber.org/zap"
)
type ActionFunc func() error
type ActionQueue interface {
Send(action ActionFunc) (err error)
Run()
Close()
}
type actionQueue struct {
batcher *mb.MB[ActionFunc]
ctx context.Context
cancel context.CancelFunc
queueDone chan struct{}
}
func NewActionQueue() ActionQueue {
return &actionQueue{
batcher: mb.New[ActionFunc](0),
ctx: nil,
cancel: nil,
queueDone: make(chan struct{}),
}
}
func (q *actionQueue) Send(action ActionFunc) (err error) {
log.Debug("adding action to batcher")
return q.batcher.Add(q.ctx, action)
}
func (q *actionQueue) Run() {
log.Debug("running the queue")
q.ctx, q.cancel = context.WithCancel(context.Background())
go q.read()
}
func (q *actionQueue) read() {
limiter := make(chan struct{}, maxSimultaneousOperationsPerStream)
for i := 0; i < maxSimultaneousOperationsPerStream; i++ {
limiter <- struct{}{}
}
defer func() {
// wait until all operations are done
for i := 0; i < maxSimultaneousOperationsPerStream; i++ {
<-limiter
}
close(q.queueDone)
}()
doSendActions := func() {
actions, err := q.batcher.Wait(q.ctx)
log.Debug("reading from batcher")
if err != nil {
log.With(zap.Error(err)).Error("queue finished")
return
}
for _, msg := range actions {
<-limiter
go func(action ActionFunc) {
err = action()
if err != nil {
log.With(zap.Error(err)).Debug("action errored out")
}
limiter <- struct{}{}
}(msg)
}
}
for {
select {
case <-q.ctx.Done():
return
default:
doSendActions()
}
}
}
func (q *actionQueue) Close() {
q.cancel()
<-q.queueDone
}

View File

@ -0,0 +1,73 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice (interfaces: ActionQueue)
// Package mock_syncservice is a generated GoMock package.
package mock_syncservice
import (
reflect "reflect"
syncservice "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
gomock "github.com/golang/mock/gomock"
)
// MockActionQueue is a mock of ActionQueue interface.
type MockActionQueue struct {
ctrl *gomock.Controller
recorder *MockActionQueueMockRecorder
}
// MockActionQueueMockRecorder is the mock recorder for MockActionQueue.
type MockActionQueueMockRecorder struct {
mock *MockActionQueue
}
// NewMockActionQueue creates a new mock instance.
func NewMockActionQueue(ctrl *gomock.Controller) *MockActionQueue {
mock := &MockActionQueue{ctrl: ctrl}
mock.recorder = &MockActionQueueMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockActionQueue) EXPECT() *MockActionQueueMockRecorder {
return m.recorder
}
// Close mocks base method.
func (m *MockActionQueue) Close() {
m.ctrl.T.Helper()
m.ctrl.Call(m, "Close")
}
// Close indicates an expected call of Close.
func (mr *MockActionQueueMockRecorder) Close() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockActionQueue)(nil).Close))
}
// Run mocks base method.
func (m *MockActionQueue) Run() {
m.ctrl.T.Helper()
m.ctrl.Call(m, "Run")
}
// Run indicates an expected call of Run.
func (mr *MockActionQueueMockRecorder) Run() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockActionQueue)(nil).Run))
}
// Send mocks base method.
func (m *MockActionQueue) Send(arg0 syncservice.ActionFunc) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Send", arg0)
ret0, _ := ret[0].(error)
return ret0
}
// Send indicates an expected call of Send.
func (mr *MockActionQueueMockRecorder) Send(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockActionQueue)(nil).Send), arg0)
}

View File

@ -0,0 +1,133 @@
package syncservice
import (
"context"
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpcerr"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
"go.uber.org/atomic"
"go.uber.org/zap"
"golang.org/x/exp/slices"
"time"
)
type StreamChecker interface {
CheckResponsiblePeers()
CheckPeerConnection(peerId string) (err error)
}
type streamChecker struct {
spaceId string
connector nodeconf.ConfConnector
streamPool StreamPool
clientFactory spacesyncproto.ClientFactory
log *zap.Logger
syncCtx context.Context
lastCheck *atomic.Time
}
const streamCheckerInterval = time.Second * 10
func NewStreamChecker(
spaceId string,
connector nodeconf.ConfConnector,
streamPool StreamPool,
clientFactory spacesyncproto.ClientFactory,
syncCtx context.Context,
log *zap.Logger) StreamChecker {
return &streamChecker{
spaceId: spaceId,
connector: connector,
streamPool: streamPool,
clientFactory: clientFactory,
log: log,
syncCtx: syncCtx,
lastCheck: atomic.NewTime(time.Time{}),
}
}
func (s *streamChecker) CheckResponsiblePeers() {
lastCheck := s.lastCheck.Load()
now := time.Now()
if lastCheck.Add(streamCheckerInterval).After(now) {
return
}
s.lastCheck.Store(now)
var (
activeNodeIds []string
configuration = s.connector.Configuration()
)
nodeIds := configuration.NodeIds(s.spaceId)
for _, nodeId := range nodeIds {
if s.streamPool.HasActiveStream(nodeId) {
s.log.Debug("has active stream for", zap.String("id", nodeId))
activeNodeIds = append(activeNodeIds, nodeId)
continue
}
}
s.log.Debug("total streams", zap.Int("total", len(activeNodeIds)))
newPeers, err := s.connector.DialInactiveResponsiblePeers(s.syncCtx, s.spaceId, activeNodeIds)
if err != nil {
s.log.Error("failed to dial peers", zap.Error(err))
return
}
for _, p := range newPeers {
err := s.createStream(p)
if err != nil {
log.With(zap.Error(err)).Error("failed to create stream")
continue
}
s.log.Debug("reading stream for", zap.String("id", p.Id()))
}
return
}
func (s *streamChecker) CheckPeerConnection(peerId string) (err error) {
if s.streamPool.HasActiveStream(peerId) {
return
}
var (
configuration = s.connector.Configuration()
pool = s.connector.Pool()
)
nodeIds := configuration.NodeIds(s.spaceId)
// we don't know the address of the peer
if !slices.Contains(nodeIds, peerId) {
err = fmt.Errorf("don't know the address of peer %s", peerId)
return
}
newPeer, err := pool.Dial(s.syncCtx, peerId)
if err != nil {
return
}
return s.createStream(newPeer)
}
func (s *streamChecker) createStream(p peer.Peer) (err error) {
stream, err := s.clientFactory.Client(p).Stream(s.syncCtx)
if err != nil {
// so here probably the request is failed because there is no such space,
// but diffService should handle such cases by sending pushSpace
err = fmt.Errorf("failed to open stream: %w", rpcerr.Unwrap(err))
return
}
// sending empty message for the server to understand from which space is it coming
err = stream.Send(&spacesyncproto.ObjectSyncMessage{SpaceId: s.spaceId})
if err != nil {
err = fmt.Errorf("failed to send first message to stream: %w", rpcerr.Unwrap(err))
return
}
err = s.streamPool.AddAndReadStreamAsync(stream)
if err != nil {
err = fmt.Errorf("failed to read from stream async: %w", err)
return
}
return
}

View File

@ -7,6 +7,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache"
"go.uber.org/zap"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time" "time"
@ -24,7 +25,7 @@ var ErrSyncTimeout = errors.New("too long wait on sync receive")
type StreamPool interface { type StreamPool interface {
ocache.ObjectLastUsage ocache.ObjectLastUsage
AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error) AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error)
AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) (err error)
SendSync(peerId string, message *spacesyncproto.ObjectSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error) SendSync(peerId string, message *spacesyncproto.ObjectSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error)
SendAsync(peers []string, message *spacesyncproto.ObjectSyncMessage) (err error) SendAsync(peers []string, message *spacesyncproto.ObjectSyncMessage) (err error)
@ -97,7 +98,7 @@ func (s *streamPool) SendSync(
delete(s.waiters, msg.ReplyId) delete(s.waiters, msg.ReplyId)
s.waitersMx.Unlock() s.waitersMx.Unlock()
log.With("replyId", msg.ReplyId).Error("time elapsed when waiting") log.With(zap.String("replyId", msg.ReplyId)).Error("time elapsed when waiting")
err = ErrSyncTimeout err = ErrSyncTimeout
case reply = <-waiter.ch: case reply = <-waiter.ch:
if !delay.Stop() { if !delay.Stop() {
@ -124,10 +125,13 @@ func (s *streamPool) SendAsync(peers []string, message *spacesyncproto.ObjectSyn
streams := getStreams() streams := getStreams()
s.Unlock() s.Unlock()
log.With("objectId", message.ObjectId). log.With(zap.String("objectId", message.ObjectId), zap.Int("existing peers len", len(streams)), zap.Strings("wanted peers", peers)).
Debugf("sending message to %d peers", len(streams)) Debug("sending message to peers")
for _, s := range streams { for _, stream := range streams {
err = s.Send(message) err = stream.Send(message)
if err != nil {
log.Debug("error sending message to stream", zap.Error(err))
}
} }
if len(peers) != 1 { if len(peers) != 1 {
err = nil err = nil
@ -164,6 +168,7 @@ Loop:
default: default:
break break
} }
log.With(zap.String("id", id)).Debug("getting peer stream")
streams = append(streams, stream) streams = append(streams, stream)
} }
@ -172,40 +177,68 @@ Loop:
func (s *streamPool) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) { func (s *streamPool) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) {
streams := s.getAllStreams() streams := s.getAllStreams()
log.With("objectId", message.ObjectId). log.With(zap.String("objectId", message.ObjectId), zap.Int("peers", len(streams))).
Debugf("broadcasting message to %d peers", len(streams)) Debug("broadcasting message to peers")
for _, stream := range streams { for _, stream := range streams {
if err = stream.Send(message); err != nil { if err = stream.Send(message); err != nil {
// TODO: add logging log.Debug("error sending message to stream", zap.Error(err))
} }
} }
return nil return nil
} }
func (s *streamPool) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) { func (s *streamPool) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) (err error) {
go s.AddAndReadStreamSync(stream) peerId, err := s.addStream(stream)
if err != nil {
return
}
go s.readPeerLoop(peerId, stream)
return
} }
func (s *streamPool) AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error) { func (s *streamPool) AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error) {
peerId, err := s.addStream(stream)
if err != nil {
return
}
return s.readPeerLoop(peerId, stream)
}
func (s *streamPool) addStream(stream spacesyncproto.SpaceStream) (peerId string, err error) {
s.Lock() s.Lock()
peerId, err := peer.CtxPeerId(stream.Context()) peerId, err = peer.CtxPeerId(stream.Context())
if err != nil { if err != nil {
s.Unlock() s.Unlock()
return return
} }
log.With(zap.String("peer id", peerId)).Debug("adding stream")
if oldStream, ok := s.peerStreams[peerId]; ok {
s.Unlock()
oldStream.Close()
s.Lock()
log.With(zap.String("peer id", peerId)).Debug("closed old stream before adding")
}
s.peerStreams[peerId] = stream s.peerStreams[peerId] = stream
s.wg.Add(1) s.wg.Add(1)
s.Unlock() s.Unlock()
log.With("peerId", peerId).Debug("reading stream from peer") return
return s.readPeerLoop(peerId, stream)
} }
func (s *streamPool) Close() (err error) { func (s *streamPool) Close() (err error) {
s.Lock() s.Lock()
wg := s.wg wg := s.wg
s.Unlock() s.Unlock()
streams := s.getAllStreams()
log.Debug("closing streams on lock")
for _, stream := range streams {
stream.Close()
}
log.Debug("closed streams")
if wg != nil { if wg != nil {
wg.Wait() wg.Wait()
} }
@ -213,6 +246,7 @@ func (s *streamPool) Close() (err error) {
} }
func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStream) (err error) { func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStream) (err error) {
log.With(zap.String("replyId", peerId)).Debug("reading stream from peer")
defer s.wg.Done() defer s.wg.Done()
limiter := make(chan struct{}, maxSimultaneousOperationsPerStream) limiter := make(chan struct{}, maxSimultaneousOperationsPerStream)
for i := 0; i < maxSimultaneousOperationsPerStream; i++ { for i := 0; i < maxSimultaneousOperationsPerStream; i++ {
@ -221,21 +255,22 @@ func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStre
process := func(msg *spacesyncproto.ObjectSyncMessage) { process := func(msg *spacesyncproto.ObjectSyncMessage) {
s.lastUsage.Store(time.Now().Unix()) s.lastUsage.Store(time.Now().Unix())
log.With(zap.String("replyId", msg.ReplyId), zap.String("object id", msg.ObjectId)).
Debug("getting message with reply id")
if msg.ReplyId == "" { if msg.ReplyId == "" {
s.messageHandler(stream.Context(), peerId, msg) s.messageHandler(stream.Context(), peerId, msg)
return return
} }
log.With("replyId", msg.ReplyId).Debug("getting message with reply id")
s.waitersMx.Lock() s.waitersMx.Lock()
waiter, exists := s.waiters[msg.ReplyId] waiter, exists := s.waiters[msg.ReplyId]
if !exists { if !exists {
log.With("replyId", msg.ReplyId).Debug("reply id not exists") log.With(zap.String("replyId", msg.ReplyId)).Debug("reply id not exists")
s.waitersMx.Unlock() s.waitersMx.Unlock()
s.messageHandler(stream.Context(), peerId, msg) s.messageHandler(stream.Context(), peerId, msg)
return return
} }
log.With("replyId", msg.ReplyId).Debug("reply id exists") log.With(zap.String("replyId", msg.ReplyId)).Debug("reply id exists")
delete(s.waiters, msg.ReplyId) delete(s.waiters, msg.ReplyId)
s.waitersMx.Unlock() s.waitersMx.Unlock()
@ -253,6 +288,7 @@ Loop:
select { select {
case <-limiter: case <-limiter:
case <-stream.Context().Done(): case <-stream.Context().Done():
log.Debug("stream context done")
break Loop break Loop
} }
go func() { go func() {
@ -260,19 +296,23 @@ Loop:
limiter <- struct{}{} limiter <- struct{}{}
}() }()
} }
log.With("peerId", peerId).Debug("stopped reading stream from peer") log.With(zap.String("peerId", peerId)).Debug("stopped reading stream from peer")
s.removePeer(peerId) s.removePeer(peerId, stream)
return return
} }
func (s *streamPool) removePeer(peerId string) (err error) { func (s *streamPool) removePeer(peerId string, stream spacesyncproto.SpaceStream) (err error) {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
_, ok := s.peerStreams[peerId] mapStream, ok := s.peerStreams[peerId]
if !ok { if !ok {
return ErrEmptyPeer return ErrEmptyPeer
} }
delete(s.peerStreams, peerId)
// it can be the case that the stream was already replaced
if mapStream == stream {
delete(s.peerStreams, peerId)
}
return return
} }

View File

@ -122,39 +122,16 @@ func TestStreamPool_AddAndReadStreamAsync(t *testing.T) {
func TestStreamPool_Close(t *testing.T) { func TestStreamPool_Close(t *testing.T) {
remId := "remoteId" remId := "remoteId"
t.Run("client close", func(t *testing.T) { t.Run("close", func(t *testing.T) {
fx := newFixture(t, "", remId, nil) fx := newFixture(t, "", remId, nil)
fx.run(t) fx.run(t)
var events []string fx.pool.Close()
recvChan := make(chan struct{}) select {
go func() { case <-fx.clientStream.Context().Done():
fx.pool.Close() break
events = append(events, "pool_close") case <-time.After(time.Millisecond * 100):
recvChan <- struct{}{} t.Fatal("context should be closed")
}() }
time.Sleep(50 * time.Millisecond) //err = <-waitCh
events = append(events, "stream_close")
err := fx.clientStream.Close()
require.NoError(t, err)
<-recvChan
require.Equal(t, []string{"stream_close", "pool_close"}, events)
})
t.Run("server close", func(t *testing.T) {
fx := newFixture(t, "", remId, nil)
fx.run(t)
var events []string
recvChan := make(chan struct{})
go func() {
fx.pool.Close()
events = append(events, "pool_close")
recvChan <- struct{}{}
}()
time.Sleep(50 * time.Millisecond) //err = <-waitCh
events = append(events, "stream_close")
err := fx.clientStream.Close()
require.NoError(t, err)
<-recvChan
require.Equal(t, []string{"stream_close", "pool_close"}, events)
}) })
} }

View File

@ -1,3 +1,4 @@
//go:generate mockgen -destination mock_syncservice/mock_syncservice.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice ActionQueue
package syncservice package syncservice
import ( import (
@ -6,78 +7,99 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectgetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectgetter"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpcerr"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/periodicsync"
"go.uber.org/zap" "go.uber.org/zap"
"time" "time"
) )
var log = logger.NewNamed("syncservice").Sugar() var log = logger.NewNamed("commonspace.syncservice")
type SyncService interface { type SyncService interface {
ocache.ObjectLastUsage ocache.ObjectLastUsage
synchandler.SyncHandler synchandler.SyncHandler
StreamPool() StreamPool StreamPool() StreamPool
StreamChecker() StreamChecker
ActionQueue() ActionQueue
Init(getter objectgetter.ObjectGetter) Init(getter objectgetter.ObjectGetter)
Close() (err error) Close() (err error)
} }
const respPeersStreamCheckInterval = time.Second * 10
type syncService struct { type syncService struct {
spaceId string spaceId string
streamPool StreamPool streamPool StreamPool
clientFactory spacesyncproto.ClientFactory checker StreamChecker
objectGetter objectgetter.ObjectGetter periodicSync periodicsync.PeriodicSync
objectGetter objectgetter.ObjectGetter
actionQueue ActionQueue
streamLoopCtx context.Context syncCtx context.Context
stopStreamLoop context.CancelFunc cancelSync context.CancelFunc
connector nodeconf.ConfConnector
streamLoopDone chan struct{}
log *zap.SugaredLogger // TODO: change to logger
} }
func NewSyncService( func NewSyncService(
spaceId string, spaceId string,
confConnector nodeconf.ConfConnector) (syncService SyncService) { confConnector nodeconf.ConfConnector,
periodicSeconds int) (syncService SyncService) {
streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) {
return syncService.HandleMessage(ctx, senderId, message) return syncService.HandleMessage(ctx, senderId, message)
}) })
clientFactory := spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient)
syncLog := log.With(zap.String("id", spaceId))
syncCtx, cancel := context.WithCancel(context.Background())
checker := NewStreamChecker(
spaceId,
confConnector,
streamPool,
clientFactory,
syncCtx,
syncLog)
periodicSync := periodicsync.NewPeriodicSync(periodicSeconds, 0, func(ctx context.Context) error {
checker.CheckResponsiblePeers()
return nil
}, syncLog)
syncService = newSyncService( syncService = newSyncService(
spaceId, spaceId,
streamPool, streamPool,
spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient), periodicSync,
confConnector) checker,
syncCtx,
cancel)
return return
} }
func newSyncService( func newSyncService(
spaceId string, spaceId string,
streamPool StreamPool, streamPool StreamPool,
clientFactory spacesyncproto.ClientFactory, periodicSync periodicsync.PeriodicSync,
connector nodeconf.ConfConnector) *syncService { checker StreamChecker,
syncCtx context.Context,
cancel context.CancelFunc,
) *syncService {
return &syncService{ return &syncService{
streamPool: streamPool, periodicSync: periodicSync,
connector: connector, streamPool: streamPool,
clientFactory: clientFactory, spaceId: spaceId,
spaceId: spaceId, checker: checker,
log: log.With(zap.String("id", spaceId)), syncCtx: syncCtx,
streamLoopDone: make(chan struct{}), cancelSync: cancel,
actionQueue: NewActionQueue(),
} }
} }
func (s *syncService) Init(objectGetter objectgetter.ObjectGetter) { func (s *syncService) Init(objectGetter objectgetter.ObjectGetter) {
s.objectGetter = objectGetter s.objectGetter = objectGetter
s.streamLoopCtx, s.stopStreamLoop = context.WithCancel(context.Background()) s.actionQueue.Run()
go s.responsibleStreamCheckLoop(s.streamLoopCtx) s.periodicSync.Run()
} }
func (s *syncService) Close() (err error) { func (s *syncService) Close() (err error) {
s.stopStreamLoop() s.actionQueue.Close()
<-s.streamLoopDone s.periodicSync.Close()
s.cancelSync()
return s.streamPool.Close() return s.streamPool.Close()
} }
@ -86,7 +108,7 @@ func (s *syncService) LastUsage() time.Time {
} }
func (s *syncService) HandleMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { func (s *syncService) HandleMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) {
s.log.With(zap.String("peerId", senderId), zap.String("objectId", message.ObjectId)).Debug("handling message") log.With(zap.String("peerId", senderId), zap.String("objectId", message.ObjectId)).Debug("handling message")
obj, err := s.objectGetter.GetObject(ctx, message.ObjectId) obj, err := s.objectGetter.GetObject(ctx, message.ObjectId)
if err != nil { if err != nil {
return return
@ -94,60 +116,14 @@ func (s *syncService) HandleMessage(ctx context.Context, senderId string, messag
return obj.HandleMessage(ctx, senderId, message) return obj.HandleMessage(ctx, senderId, message)
} }
func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) {
defer close(s.streamLoopDone)
checkResponsiblePeers := func() {
var (
activeNodeIds []string
configuration = s.connector.Configuration()
)
for _, nodeId := range configuration.NodeIds(s.spaceId) {
if s.streamPool.HasActiveStream(nodeId) {
s.log.Debug("has active stream for", zap.String("id", nodeId))
activeNodeIds = append(activeNodeIds, nodeId)
continue
}
}
newPeers, err := s.connector.DialInactiveResponsiblePeers(ctx, s.spaceId, activeNodeIds)
if err != nil {
s.log.Error("failed to dial peers", zap.Error(err))
return
}
for _, p := range newPeers {
stream, err := s.clientFactory.Client(p).Stream(ctx)
if err != nil {
err = rpcerr.Unwrap(err)
s.log.Errorf("failed to open stream: %v", err)
// so here probably the request is failed because there is no such space,
// but diffService should handle such cases by sending pushSpace
continue
}
// sending empty message for the server to understand from which space is it coming
err = stream.Send(&spacesyncproto.ObjectSyncMessage{SpaceId: s.spaceId})
if err != nil {
err = rpcerr.Unwrap(err)
s.log.Errorf("failed to send first message to stream: %v", err)
continue
}
s.log.Debug("reading stream for", zap.String("id", p.Id()))
s.streamPool.AddAndReadStreamAsync(stream)
}
}
checkResponsiblePeers()
ticker := time.NewTicker(respPeersStreamCheckInterval)
defer ticker.Stop()
for {
select {
case <-s.streamLoopCtx.Done():
return
case <-ticker.C:
checkResponsiblePeers()
}
}
}
func (s *syncService) StreamPool() StreamPool { func (s *syncService) StreamPool() StreamPool {
return s.streamPool return s.streamPool
} }
func (s *syncService) StreamChecker() StreamChecker {
return s.checker
}
func (s *syncService) ActionQueue() ActionQueue {
return s.actionQueue
}

View File

@ -1,5 +1,5 @@
// Code generated by MockGen. DO NOT EDIT. // Code generated by MockGen. DO NOT EDIT.
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree (interfaces: SyncClient,SyncTree) // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree (interfaces: SyncClient,SyncTree,ReceiveQueue,HeadNotifiable)
// Package mock_synctree is a generated GoMock package. // Package mock_synctree is a generated GoMock package.
package mock_synctree package mock_synctree
@ -177,23 +177,18 @@ func (mr *MockSyncTreeMockRecorder) AddContent(arg0, arg1 interface{}) *gomock.C
} }
// AddRawChanges mocks base method. // AddRawChanges mocks base method.
func (m *MockSyncTree) AddRawChanges(arg0 context.Context, arg1 ...*treechangeproto.RawTreeChangeWithId) (tree.AddResult, error) { func (m *MockSyncTree) AddRawChanges(arg0 context.Context, arg1 tree.RawChangesPayload) (tree.AddResult, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
varargs := []interface{}{arg0} ret := m.ctrl.Call(m, "AddRawChanges", arg0, arg1)
for _, a := range arg1 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "AddRawChanges", varargs...)
ret0, _ := ret[0].(tree.AddResult) ret0, _ := ret[0].(tree.AddResult)
ret1, _ := ret[1].(error) ret1, _ := ret[1].(error)
return ret0, ret1 return ret0, ret1
} }
// AddRawChanges indicates an expected call of AddRawChanges. // AddRawChanges indicates an expected call of AddRawChanges.
func (mr *MockSyncTreeMockRecorder) AddRawChanges(arg0 interface{}, arg1 ...interface{}) *gomock.Call { func (mr *MockSyncTreeMockRecorder) AddRawChanges(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0}, arg1...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawChanges", reflect.TypeOf((*MockSyncTree)(nil).AddRawChanges), arg0, arg1)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawChanges", reflect.TypeOf((*MockSyncTree)(nil).AddRawChanges), varargs...)
} }
// ChangesAfterCommonSnapshot mocks base method. // ChangesAfterCommonSnapshot mocks base method.
@ -459,3 +454,103 @@ func (mr *MockSyncTreeMockRecorder) Unlock() *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unlock", reflect.TypeOf((*MockSyncTree)(nil).Unlock)) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unlock", reflect.TypeOf((*MockSyncTree)(nil).Unlock))
} }
// MockReceiveQueue is a mock of ReceiveQueue interface.
type MockReceiveQueue struct {
ctrl *gomock.Controller
recorder *MockReceiveQueueMockRecorder
}
// MockReceiveQueueMockRecorder is the mock recorder for MockReceiveQueue.
type MockReceiveQueueMockRecorder struct {
mock *MockReceiveQueue
}
// NewMockReceiveQueue creates a new mock instance.
func NewMockReceiveQueue(ctrl *gomock.Controller) *MockReceiveQueue {
mock := &MockReceiveQueue{ctrl: ctrl}
mock.recorder = &MockReceiveQueueMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockReceiveQueue) EXPECT() *MockReceiveQueueMockRecorder {
return m.recorder
}
// AddMessage mocks base method.
func (m *MockReceiveQueue) AddMessage(arg0 string, arg1 *treechangeproto.TreeSyncMessage, arg2 string) bool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "AddMessage", arg0, arg1, arg2)
ret0, _ := ret[0].(bool)
return ret0
}
// AddMessage indicates an expected call of AddMessage.
func (mr *MockReceiveQueueMockRecorder) AddMessage(arg0, arg1, arg2 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddMessage", reflect.TypeOf((*MockReceiveQueue)(nil).AddMessage), arg0, arg1, arg2)
}
// ClearQueue mocks base method.
func (m *MockReceiveQueue) ClearQueue(arg0 string) {
m.ctrl.T.Helper()
m.ctrl.Call(m, "ClearQueue", arg0)
}
// ClearQueue indicates an expected call of ClearQueue.
func (mr *MockReceiveQueueMockRecorder) ClearQueue(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClearQueue", reflect.TypeOf((*MockReceiveQueue)(nil).ClearQueue), arg0)
}
// GetMessage mocks base method.
func (m *MockReceiveQueue) GetMessage(arg0 string) (*treechangeproto.TreeSyncMessage, string, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetMessage", arg0)
ret0, _ := ret[0].(*treechangeproto.TreeSyncMessage)
ret1, _ := ret[1].(string)
ret2, _ := ret[2].(error)
return ret0, ret1, ret2
}
// GetMessage indicates an expected call of GetMessage.
func (mr *MockReceiveQueueMockRecorder) GetMessage(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMessage", reflect.TypeOf((*MockReceiveQueue)(nil).GetMessage), arg0)
}
// MockHeadNotifiable is a mock of HeadNotifiable interface.
type MockHeadNotifiable struct {
ctrl *gomock.Controller
recorder *MockHeadNotifiableMockRecorder
}
// MockHeadNotifiableMockRecorder is the mock recorder for MockHeadNotifiable.
type MockHeadNotifiableMockRecorder struct {
mock *MockHeadNotifiable
}
// NewMockHeadNotifiable creates a new mock instance.
func NewMockHeadNotifiable(ctrl *gomock.Controller) *MockHeadNotifiable {
mock := &MockHeadNotifiable{ctrl: ctrl}
mock.recorder = &MockHeadNotifiableMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockHeadNotifiable) EXPECT() *MockHeadNotifiableMockRecorder {
return m.recorder
}
// UpdateHeads mocks base method.
func (m *MockHeadNotifiable) UpdateHeads(arg0 string, arg1 []string) {
m.ctrl.T.Helper()
m.ctrl.Call(m, "UpdateHeads", arg0, arg1)
}
// UpdateHeads indicates an expected call of UpdateHeads.
func (mr *MockHeadNotifiableMockRecorder) UpdateHeads(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateHeads", reflect.TypeOf((*MockHeadNotifiable)(nil).UpdateHeads), arg0, arg1)
}

View File

@ -0,0 +1,36 @@
package synctree
import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
)
type queuedClient struct {
SyncClient
queue syncservice.ActionQueue
}
func newQueuedClient(client SyncClient, queue syncservice.ActionQueue) SyncClient {
return &queuedClient{
SyncClient: client,
queue: queue,
}
}
func (q *queuedClient) BroadcastAsync(message *treechangeproto.TreeSyncMessage) (err error) {
return q.queue.Send(func() error {
return q.SyncClient.BroadcastAsync(message)
})
}
func (q *queuedClient) SendAsync(peerId string, message *treechangeproto.TreeSyncMessage, replyId string) (err error) {
return q.queue.Send(func() error {
return q.SyncClient.SendAsync(peerId, message, replyId)
})
}
func (q *queuedClient) BroadcastAsyncOrSendResponsible(message *treechangeproto.TreeSyncMessage) (err error) {
return q.queue.Send(func() error {
return q.SyncClient.BroadcastAsyncOrSendResponsible(message)
})
}

View File

@ -0,0 +1,74 @@
package synctree
import (
"errors"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
"sync"
)
type ReceiveQueue interface {
AddMessage(senderId string, msg *treechangeproto.TreeSyncMessage, replyId string) (queueFull bool)
GetMessage(senderId string) (msg *treechangeproto.TreeSyncMessage, replyId string, err error)
ClearQueue(senderId string)
}
type queueMsg struct {
replyId string
syncMessage *treechangeproto.TreeSyncMessage
}
type receiveQueue struct {
sync.Mutex
handlerMap map[string][]queueMsg
maxSize int
}
func newReceiveQueue(maxSize int) ReceiveQueue {
return &receiveQueue{
Mutex: sync.Mutex{},
handlerMap: map[string][]queueMsg{},
maxSize: maxSize,
}
}
var errEmptyQueue = errors.New("the queue is empty")
func (q *receiveQueue) AddMessage(senderId string, msg *treechangeproto.TreeSyncMessage, replyId string) (queueFull bool) {
q.Lock()
defer q.Unlock()
queue := q.handlerMap[senderId]
queueFull = len(queue) >= maxQueueSize
queue = append(queue, queueMsg{replyId, msg})
q.handlerMap[senderId] = queue
return
}
func (q *receiveQueue) GetMessage(senderId string) (msg *treechangeproto.TreeSyncMessage, replyId string, err error) {
q.Lock()
defer q.Unlock()
if len(q.handlerMap) == 0 {
err = errEmptyQueue
return
}
qMsg := q.handlerMap[senderId][0]
msg = qMsg.syncMessage
replyId = qMsg.replyId
return
}
func (q *receiveQueue) ClearQueue(senderId string) {
q.Lock()
defer q.Unlock()
queue := q.handlerMap[senderId]
excessLen := len(queue) - q.maxSize + 1
if excessLen <= 0 {
excessLen = 1
}
queue = queue[excessLen:]
q.handlerMap[senderId] = queue
}

View File

@ -1,4 +1,4 @@
//go:generate mockgen -destination mock_synctree/mock_synctree.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree SyncClient,SyncTree //go:generate mockgen -destination mock_synctree/mock_synctree.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree SyncClient,SyncTree,ReceiveQueue,HeadNotifiable
package synctree package synctree
import ( import (
@ -19,18 +19,23 @@ type syncClient struct {
syncservice.StreamPool syncservice.StreamPool
RequestFactory RequestFactory
spaceId string spaceId string
connector nodeconf.ConfConnector
configuration nodeconf.Configuration configuration nodeconf.Configuration
checker syncservice.StreamChecker
} }
func newSyncClient( func newSyncClient(
spaceId string, spaceId string,
pool syncservice.StreamPool, pool syncservice.StreamPool,
factory RequestFactory, factory RequestFactory,
configuration nodeconf.Configuration) SyncClient { configuration nodeconf.Configuration,
checker syncservice.StreamChecker) SyncClient {
return &syncClient{ return &syncClient{
StreamPool: pool, StreamPool: pool,
RequestFactory: factory, RequestFactory: factory,
configuration: configuration, configuration: configuration,
checker: checker,
spaceId: spaceId, spaceId: spaceId,
} }
} }
@ -40,10 +45,16 @@ func (s *syncClient) BroadcastAsync(message *treechangeproto.TreeSyncMessage) (e
if err != nil { if err != nil {
return return
} }
s.checker.CheckResponsiblePeers()
return s.StreamPool.BroadcastAsync(objMsg) return s.StreamPool.BroadcastAsync(objMsg)
} }
func (s *syncClient) SendAsync(peerId string, message *treechangeproto.TreeSyncMessage, replyId string) (err error) { func (s *syncClient) SendAsync(peerId string, message *treechangeproto.TreeSyncMessage, replyId string) (err error) {
err = s.checker.CheckPeerConnection(peerId)
if err != nil {
return
}
objMsg, err := marshallTreeMessage(message, message.RootChange.Id, replyId) objMsg, err := marshallTreeMessage(message, message.RootChange.Id, replyId)
if err != nil { if err != nil {
return return
@ -56,7 +67,9 @@ func (s *syncClient) BroadcastAsyncOrSendResponsible(message *treechangeproto.Tr
if err != nil { if err != nil {
return return
} }
if s.configuration.IsResponsible(s.spaceId) { if s.configuration.IsResponsible(s.spaceId) {
s.checker.CheckResponsiblePeers()
return s.StreamPool.SendAsync(s.configuration.NodeIds(s.spaceId), objMsg) return s.StreamPool.SendAsync(s.configuration.NodeIds(s.spaceId), objMsg)
} }
return s.BroadcastAsync(message) return s.BroadcastAsync(message)

View File

@ -5,6 +5,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler"
@ -39,12 +40,13 @@ type SyncTree interface {
type syncTree struct { type syncTree struct {
tree.ObjectTree tree.ObjectTree
synchandler.SyncHandler synchandler.SyncHandler
syncClient SyncClient syncClient SyncClient
notifiable HeadNotifiable statusService statusservice.StatusService
listener updatelistener.UpdateListener notifiable HeadNotifiable
treeUsage *atomic.Int32 listener updatelistener.UpdateListener
isClosed bool treeUsage *atomic.Int32
isDeleted bool isClosed bool
isDeleted bool
} }
var log = logger.NewNamed("commonspace.synctree").Sugar() var log = logger.NewNamed("commonspace.synctree").Sugar()
@ -52,20 +54,22 @@ var log = logger.NewNamed("commonspace.synctree").Sugar()
var createDerivedObjectTree = tree.CreateDerivedObjectTree var createDerivedObjectTree = tree.CreateDerivedObjectTree
var createObjectTree = tree.CreateObjectTree var createObjectTree = tree.CreateObjectTree
var buildObjectTree = tree.BuildObjectTree var buildObjectTree = tree.BuildObjectTree
var createSyncClient = newSyncClient var createSyncClient = newWrappedSyncClient
type CreateDeps struct { type CreateDeps struct {
SpaceId string SpaceId string
Payload tree.ObjectTreeCreatePayload Payload tree.ObjectTreeCreatePayload
Configuration nodeconf.Configuration Configuration nodeconf.Configuration
StreamPool syncservice.StreamPool SyncService syncservice.SyncService
AclList list.ACLList AclList list.ACLList
SpaceStorage spacestorage.SpaceStorage SpaceStorage spacestorage.SpaceStorage
StatusService statusservice.StatusService
HeadNotifiable HeadNotifiable
} }
type BuildDeps struct { type BuildDeps struct {
SpaceId string SpaceId string
StreamPool syncservice.StreamPool SyncService syncservice.SyncService
Configuration nodeconf.Configuration Configuration nodeconf.Configuration
HeadNotifiable HeadNotifiable HeadNotifiable HeadNotifiable
Listener updatelistener.UpdateListener Listener updatelistener.UpdateListener
@ -73,6 +77,16 @@ type BuildDeps struct {
SpaceStorage spacestorage.SpaceStorage SpaceStorage spacestorage.SpaceStorage
TreeStorage storage.TreeStorage TreeStorage storage.TreeStorage
TreeUsage *atomic.Int32 TreeUsage *atomic.Int32
StatusService statusservice.StatusService
}
func newWrappedSyncClient(
spaceId string,
factory RequestFactory,
syncService syncservice.SyncService,
configuration nodeconf.Configuration) SyncClient {
syncClient := newSyncClient(spaceId, syncService.StreamPool(), factory, configuration, syncService.StreamChecker())
return newQueuedClient(syncClient, syncService.ActionQueue())
} }
func DeriveSyncTree(ctx context.Context, deps CreateDeps) (id string, err error) { func DeriveSyncTree(ctx context.Context, deps CreateDeps) (id string, err error) {
@ -83,13 +97,17 @@ func DeriveSyncTree(ctx context.Context, deps CreateDeps) (id string, err error)
syncClient := createSyncClient( syncClient := createSyncClient(
deps.SpaceId, deps.SpaceId,
deps.StreamPool,
sharedFactory, sharedFactory,
deps.SyncService,
deps.Configuration) deps.Configuration)
headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
syncClient.BroadcastAsync(headUpdate)
id = objTree.ID() id = objTree.ID()
heads := objTree.Heads()
deps.HeadNotifiable.UpdateHeads(id, heads)
headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
deps.StatusService.HeadsChange(id, heads)
syncClient.BroadcastAsync(headUpdate)
return return
} }
@ -100,13 +118,17 @@ func CreateSyncTree(ctx context.Context, deps CreateDeps) (id string, err error)
} }
syncClient := createSyncClient( syncClient := createSyncClient(
deps.SpaceId, deps.SpaceId,
deps.StreamPool, sharedFactory,
GetRequestFactory(), deps.SyncService,
deps.Configuration) deps.Configuration)
headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
syncClient.BroadcastAsync(headUpdate)
id = objTree.ID() id = objTree.ID()
heads := objTree.Heads()
deps.HeadNotifiable.UpdateHeads(id, heads)
headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
deps.StatusService.HeadsChange(id, heads)
syncClient.BroadcastAsync(headUpdate)
return return
} }
@ -116,16 +138,23 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t
if err != nil { if err != nil {
return return
} }
newTreeRequest := GetRequestFactory().CreateNewTreeRequest() newTreeRequest := GetRequestFactory().CreateNewTreeRequest()
objMsg, err := marshallTreeMessage(newTreeRequest, id, "") objMsg, err := marshallTreeMessage(newTreeRequest, id, "")
if err != nil { if err != nil {
return return
} }
resp, err := deps.StreamPool.SendSync(peerId, objMsg) err = deps.SyncService.StreamChecker().CheckPeerConnection(peerId)
if err != nil { if err != nil {
return return
} }
resp, err := deps.SyncService.StreamPool().SendSync(peerId, objMsg)
if err != nil {
return
}
msg = &treechangeproto.TreeSyncMessage{} msg = &treechangeproto.TreeSyncMessage{}
err = proto.Unmarshal(resp.Payload, msg) err = proto.Unmarshal(resp.Payload, msg)
return return
@ -186,26 +215,26 @@ func buildSyncTree(ctx context.Context, isFirstBuild bool, deps BuildDeps) (t Sy
} }
syncClient := createSyncClient( syncClient := createSyncClient(
deps.SpaceId, deps.SpaceId,
deps.StreamPool, sharedFactory,
GetRequestFactory(), deps.SyncService,
deps.Configuration) deps.Configuration)
syncTree := &syncTree{ syncTree := &syncTree{
ObjectTree: objTree, ObjectTree: objTree,
syncClient: syncClient, syncClient: syncClient,
notifiable: deps.HeadNotifiable, notifiable: deps.HeadNotifiable,
treeUsage: deps.TreeUsage, treeUsage: deps.TreeUsage,
listener: deps.Listener, listener: deps.Listener,
statusService: deps.StatusService,
} }
syncHandler := newSyncTreeHandler(syncTree, syncClient) syncHandler := newSyncTreeHandler(syncTree, syncClient, deps.StatusService)
syncTree.SyncHandler = syncHandler syncTree.SyncHandler = syncHandler
t = syncTree t = syncTree
syncTree.Lock() syncTree.Lock()
defer syncTree.Unlock()
syncTree.afterBuild() syncTree.afterBuild()
syncTree.Unlock()
headUpdate := syncTree.syncClient.CreateHeadUpdate(t, nil)
// here we will have different behaviour based on who is sending this update
if isFirstBuild { if isFirstBuild {
headUpdate := syncTree.syncClient.CreateHeadUpdate(t, nil)
// send to everybody, because everybody should know that the node or client got new tree // send to everybody, because everybody should know that the node or client got new tree
err = syncTree.syncClient.BroadcastAsync(headUpdate) err = syncTree.syncClient.BroadcastAsync(headUpdate)
} }
@ -237,16 +266,17 @@ func (s *syncTree) AddContent(ctx context.Context, content tree.SignableChangeCo
if s.notifiable != nil { if s.notifiable != nil {
s.notifiable.UpdateHeads(s.ID(), res.Heads) s.notifiable.UpdateHeads(s.ID(), res.Heads)
} }
s.statusService.HeadsChange(s.ID(), res.Heads)
headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added) headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added)
err = s.syncClient.BroadcastAsync(headUpdate) err = s.syncClient.BroadcastAsync(headUpdate)
return return
} }
func (s *syncTree) AddRawChanges(ctx context.Context, changes ...*treechangeproto.RawTreeChangeWithId) (res tree.AddResult, err error) { func (s *syncTree) AddRawChanges(ctx context.Context, changesPayload tree.RawChangesPayload) (res tree.AddResult, err error) {
if err = s.checkAlive(); err != nil { if err = s.checkAlive(); err != nil {
return return
} }
res, err = s.ObjectTree.AddRawChanges(ctx, changes...) res, err = s.ObjectTree.AddRawChanges(ctx, changesPayload)
if err != nil { if err != nil {
return return
} }
@ -308,6 +338,8 @@ func (s *syncTree) checkAlive() (err error) {
} }
func (s *syncTree) Ping() (err error) { func (s *syncTree) Ping() (err error) {
s.Lock()
defer s.Unlock()
headUpdate := s.syncClient.CreateHeadUpdate(s, nil) headUpdate := s.syncClient.CreateHeadUpdate(s, nil)
return s.syncClient.BroadcastAsyncOrSendResponsible(headUpdate) return s.syncClient.BroadcastAsyncOrSendResponsible(headUpdate)
} }

View File

@ -2,6 +2,7 @@ package synctree
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree"
@ -37,6 +38,12 @@ func (s syncTreeMatcher) String() string {
return "" return ""
} }
func syncClientFuncCreator(client SyncClient) func(spaceId string, factory RequestFactory, syncService syncservice.SyncService, configuration nodeconf.Configuration) SyncClient {
return func(spaceId string, factory RequestFactory, syncService syncservice.SyncService, configuration nodeconf.Configuration) SyncClient {
return client
}
}
func Test_DeriveSyncTree(t *testing.T) { func Test_DeriveSyncTree(t *testing.T) {
ctx := context.Background() ctx := context.Background()
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
@ -46,6 +53,7 @@ func Test_DeriveSyncTree(t *testing.T) {
aclListMock := mock_list.NewMockACLList(ctrl) aclListMock := mock_list.NewMockACLList(ctrl)
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl) spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl)
headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl)
spaceId := "spaceId" spaceId := "spaceId"
expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId} expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId}
createDerivedObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { createDerivedObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) {
@ -53,18 +61,21 @@ func Test_DeriveSyncTree(t *testing.T) {
require.Equal(t, expectedPayload, payload) require.Equal(t, expectedPayload, payload)
return objTreeMock, nil return objTreeMock, nil
} }
createSyncClient = func(spaceId string, pool syncservice.StreamPool, factory RequestFactory, configuration nodeconf.Configuration) SyncClient { createSyncClient = syncClientFuncCreator(syncClientMock)
return syncClientMock
}
headUpdate := &treechangeproto.TreeSyncMessage{} headUpdate := &treechangeproto.TreeSyncMessage{}
objTreeMock.EXPECT().Heads().AnyTimes().Return([]string{"h1"})
headNotifiableMock.EXPECT().UpdateHeads("id", []string{"h1"})
syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate)
syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil)
deps := CreateDeps{ deps := CreateDeps{
AclList: aclListMock, AclList: aclListMock,
SpaceId: spaceId, SpaceId: spaceId,
Payload: expectedPayload, Payload: expectedPayload,
SpaceStorage: spaceStorageMock, SpaceStorage: spaceStorageMock,
StatusService: statusservice.NewNoOpStatusService(),
HeadNotifiable: headNotifiableMock,
} }
objTreeMock.EXPECT().ID().Return("id")
_, err := DeriveSyncTree(ctx, deps) _, err := DeriveSyncTree(ctx, deps)
require.NoError(t, err) require.NoError(t, err)
@ -79,6 +90,7 @@ func Test_CreateSyncTree(t *testing.T) {
aclListMock := mock_list.NewMockACLList(ctrl) aclListMock := mock_list.NewMockACLList(ctrl)
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl) spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl)
headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl)
spaceId := "spaceId" spaceId := "spaceId"
expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId} expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId}
createObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { createObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) {
@ -86,17 +98,21 @@ func Test_CreateSyncTree(t *testing.T) {
require.Equal(t, expectedPayload, payload) require.Equal(t, expectedPayload, payload)
return objTreeMock, nil return objTreeMock, nil
} }
createSyncClient = func(spaceId string, pool syncservice.StreamPool, factory RequestFactory, configuration nodeconf.Configuration) SyncClient {
return syncClientMock createSyncClient = syncClientFuncCreator(syncClientMock)
} objTreeMock.EXPECT().Heads().AnyTimes().Return([]string{"h1"})
headUpdate := &treechangeproto.TreeSyncMessage{} headUpdate := &treechangeproto.TreeSyncMessage{}
headNotifiableMock.EXPECT().UpdateHeads("id", []string{"h1"})
syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate)
syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil)
objTreeMock.EXPECT().ID().Return("id")
deps := CreateDeps{ deps := CreateDeps{
AclList: aclListMock, AclList: aclListMock,
SpaceId: spaceId, SpaceId: spaceId,
Payload: expectedPayload, Payload: expectedPayload,
SpaceStorage: spaceStorageMock, SpaceStorage: spaceStorageMock,
StatusService: statusservice.NewNoOpStatusService(),
HeadNotifiable: headNotifiableMock,
} }
_, err := CreateSyncTree(ctx, deps) _, err := CreateSyncTree(ctx, deps)
@ -112,58 +128,72 @@ func Test_BuildSyncTree(t *testing.T) {
syncClientMock := mock_synctree.NewMockSyncClient(ctrl) syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
tr := &syncTree{ tr := &syncTree{
ObjectTree: objTreeMock, ObjectTree: objTreeMock,
SyncHandler: nil, SyncHandler: nil,
syncClient: syncClientMock, syncClient: syncClientMock,
listener: updateListenerMock, listener: updateListenerMock,
isClosed: false, isClosed: false,
statusService: statusservice.NewNoOpStatusService(),
} }
headUpdate := &treechangeproto.TreeSyncMessage{} headUpdate := &treechangeproto.TreeSyncMessage{}
t.Run("AddRawChanges update", func(t *testing.T) { t.Run("AddRawChanges update", func(t *testing.T) {
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
payload := tree.RawChangesPayload{
NewHeads: nil,
RawChanges: changes,
}
expectedRes := tree.AddResult{ expectedRes := tree.AddResult{
Added: changes, Added: changes,
Mode: tree.Append, Mode: tree.Append,
} }
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
Return(expectedRes, nil) Return(expectedRes, nil)
updateListenerMock.EXPECT().Update(tr) updateListenerMock.EXPECT().Update(tr)
syncClientMock.EXPECT().CreateHeadUpdate(gomock.Eq(tr), gomock.Eq(changes)).Return(headUpdate) syncClientMock.EXPECT().CreateHeadUpdate(gomock.Eq(tr), gomock.Eq(changes)).Return(headUpdate)
syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil)
res, err := tr.AddRawChanges(ctx, changes...) res, err := tr.AddRawChanges(ctx, payload)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, expectedRes, res) require.Equal(t, expectedRes, res)
}) })
t.Run("AddRawChanges rebuild", func(t *testing.T) { t.Run("AddRawChanges rebuild", func(t *testing.T) {
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
payload := tree.RawChangesPayload{
NewHeads: nil,
RawChanges: changes,
}
expectedRes := tree.AddResult{ expectedRes := tree.AddResult{
Added: changes, Added: changes,
Mode: tree.Rebuild, Mode: tree.Rebuild,
} }
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
Return(expectedRes, nil) Return(expectedRes, nil)
updateListenerMock.EXPECT().Rebuild(tr) updateListenerMock.EXPECT().Rebuild(tr)
syncClientMock.EXPECT().CreateHeadUpdate(gomock.Eq(tr), gomock.Eq(changes)).Return(headUpdate) syncClientMock.EXPECT().CreateHeadUpdate(gomock.Eq(tr), gomock.Eq(changes)).Return(headUpdate)
syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil)
res, err := tr.AddRawChanges(ctx, changes...) res, err := tr.AddRawChanges(ctx, payload)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, expectedRes, res) require.Equal(t, expectedRes, res)
}) })
t.Run("AddRawChanges nothing", func(t *testing.T) { t.Run("AddRawChanges nothing", func(t *testing.T) {
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
payload := tree.RawChangesPayload{
NewHeads: nil,
RawChanges: changes,
}
expectedRes := tree.AddResult{ expectedRes := tree.AddResult{
Added: changes, Added: changes,
Mode: tree.Nothing, Mode: tree.Nothing,
} }
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
Return(expectedRes, nil) Return(expectedRes, nil)
res, err := tr.AddRawChanges(ctx, changes...) res, err := tr.AddRawChanges(ctx, payload)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, expectedRes, res) require.Equal(t, expectedRes, res)
}) })
@ -177,6 +207,7 @@ func Test_BuildSyncTree(t *testing.T) {
Mode: tree.Append, Mode: tree.Append,
Added: changes, Added: changes,
} }
objTreeMock.EXPECT().ID().Return("id").AnyTimes()
objTreeMock.EXPECT().AddContent(gomock.Any(), gomock.Eq(content)). objTreeMock.EXPECT().AddContent(gomock.Any(), gomock.Eq(content)).
Return(expectedRes, nil) Return(expectedRes, nil)

View File

@ -3,42 +3,73 @@ package synctree
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
"github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/proto"
"go.uber.org/zap"
"sync"
) )
type syncTreeHandler struct { type syncTreeHandler struct {
objTree tree.ObjectTree objTree tree.ObjectTree
syncClient SyncClient syncClient SyncClient
statusService statusservice.StatusService
handlerLock sync.Mutex
queue ReceiveQueue
} }
func newSyncTreeHandler(objTree tree.ObjectTree, syncClient SyncClient) synchandler.SyncHandler { const maxQueueSize = 5
func newSyncTreeHandler(objTree tree.ObjectTree, syncClient SyncClient, statusService statusservice.StatusService) synchandler.SyncHandler {
return &syncTreeHandler{ return &syncTreeHandler{
objTree: objTree, objTree: objTree,
syncClient: syncClient, syncClient: syncClient,
statusService: statusService,
queue: newReceiveQueue(maxQueueSize),
} }
} }
func (s *syncTreeHandler) HandleMessage(ctx context.Context, senderId string, msg *spacesyncproto.ObjectSyncMessage) (err error) { func (s *syncTreeHandler) HandleMessage(ctx context.Context, senderId string, msg *spacesyncproto.ObjectSyncMessage) (err error) {
// TODO: when implementing sync status check msg heads before sending into queue
unmarshalled := &treechangeproto.TreeSyncMessage{} unmarshalled := &treechangeproto.TreeSyncMessage{}
err = proto.Unmarshal(msg.Payload, unmarshalled) err = proto.Unmarshal(msg.Payload, unmarshalled)
if err != nil { if err != nil {
return return
} }
content := unmarshalled.GetContent() s.statusService.HeadsReceive(senderId, msg.ObjectId, treechangeproto.GetHeads(unmarshalled))
queueFull := s.queue.AddMessage(senderId, unmarshalled, msg.ReplyId)
if queueFull {
return
}
return s.handleMessage(ctx, senderId)
}
func (s *syncTreeHandler) handleMessage(ctx context.Context, senderId string) (err error) {
s.objTree.Lock()
defer s.objTree.Unlock()
msg, replyId, err := s.queue.GetMessage(senderId)
if err != nil {
return
}
defer s.queue.ClearQueue(senderId)
content := msg.GetContent()
switch { switch {
case content.GetHeadUpdate() != nil: case content.GetHeadUpdate() != nil:
return s.handleHeadUpdate(ctx, senderId, content.GetHeadUpdate(), msg.ReplyId) return s.handleHeadUpdate(ctx, senderId, content.GetHeadUpdate(), replyId)
case content.GetFullSyncRequest() != nil: case content.GetFullSyncRequest() != nil:
return s.handleFullSyncRequest(ctx, senderId, content.GetFullSyncRequest(), msg.ReplyId) return s.handleFullSyncRequest(ctx, senderId, content.GetFullSyncRequest(), replyId)
case content.GetFullSyncResponse() != nil: case content.GetFullSyncResponse() != nil:
return s.handleFullSyncResponse(ctx, senderId, content.GetFullSyncResponse()) return s.handleFullSyncResponse(ctx, senderId, content.GetFullSyncResponse())
} }
return nil return
} }
func (s *syncTreeHandler) handleHeadUpdate( func (s *syncTreeHandler) handleHeadUpdate(
@ -46,60 +77,66 @@ func (s *syncTreeHandler) handleHeadUpdate(
senderId string, senderId string,
update *treechangeproto.TreeHeadUpdate, update *treechangeproto.TreeHeadUpdate,
replyId string) (err error) { replyId string) (err error) {
log.With("senderId", senderId).
With("heads", update.Heads).
With("treeId", s.objTree.ID()).
Debug("received head update message")
var ( var (
fullRequest *treechangeproto.TreeSyncMessage fullRequest *treechangeproto.TreeSyncMessage
isEmptyUpdate = len(update.Changes) == 0 isEmptyUpdate = len(update.Changes) == 0
objTree = s.objTree objTree = s.objTree
) )
err = func() error { log := log.With("senderId", senderId).
objTree.Lock() With("heads", objTree.Heads()).
defer objTree.Unlock() With("treeId", objTree.ID())
log.Debug("received head update message")
// isEmptyUpdate is sent when the tree is brought up from cache defer func() {
if isEmptyUpdate {
log.With("treeId", objTree.ID()).Debug("is empty update")
if slice.UnsortedEquals(objTree.Heads(), update.Heads) {
return nil
}
// we need to sync in any case
fullRequest, err = s.syncClient.CreateFullSyncRequest(objTree, update.Heads, update.SnapshotPath)
return err
}
if s.alreadyHasHeads(objTree, update.Heads) {
return nil
}
_, err = objTree.AddRawChanges(ctx, update.Changes...)
if err != nil { if err != nil {
return err log.With(zap.Error(err)).Debug("head update finished with error")
} else if fullRequest != nil {
log.Debug("sending full sync request")
} else {
if !isEmptyUpdate {
log.Debug("head update finished correctly")
}
} }
if s.alreadyHasHeads(objTree, update.Heads) {
return nil
}
fullRequest, err = s.syncClient.CreateFullSyncRequest(objTree, update.Heads, update.SnapshotPath)
return err
}() }()
if fullRequest != nil { // isEmptyUpdate is sent when the tree is brought up from cache
log.With("senderId", senderId). if isEmptyUpdate {
With("heads", objTree.Heads()). log.With("treeId", objTree.ID()).Debug("is empty update")
With("treeId", objTree.ID()). if slice.UnsortedEquals(objTree.Heads(), update.Heads) {
Debug("sending full sync request") return
}
// we need to sync in any case
fullRequest, err = s.syncClient.CreateFullSyncRequest(objTree, update.Heads, update.SnapshotPath)
if err != nil {
return
}
return s.syncClient.SendAsync(senderId, fullRequest, replyId) return s.syncClient.SendAsync(senderId, fullRequest, replyId)
} }
log.With("senderId", senderId).
With("heads", update.Heads). if s.alreadyHasHeads(objTree, update.Heads) {
With("treeId", objTree.ID()). return
Debug("head update finished correctly") }
return
_, err = objTree.AddRawChanges(ctx, tree.RawChangesPayload{
NewHeads: update.Heads,
RawChanges: update.Changes,
})
if err != nil {
return
}
if s.alreadyHasHeads(objTree, update.Heads) {
return
}
fullRequest, err = s.syncClient.CreateFullSyncRequest(objTree, update.Heads, update.SnapshotPath)
if err != nil {
return
}
return s.syncClient.SendAsync(senderId, fullRequest, replyId)
} }
func (s *syncTreeHandler) handleFullSyncRequest( func (s *syncTreeHandler) handleFullSyncRequest(
@ -107,40 +144,43 @@ func (s *syncTreeHandler) handleFullSyncRequest(
senderId string, senderId string,
request *treechangeproto.TreeFullSyncRequest, request *treechangeproto.TreeFullSyncRequest,
replyId string) (err error) { replyId string) (err error) {
log.With("senderId", senderId).
With("heads", request.Heads).
With("treeId", s.objTree.ID()).
With("trackingId", replyId).
Debug("received full sync request message")
var ( var (
fullResponse *treechangeproto.TreeSyncMessage fullResponse *treechangeproto.TreeSyncMessage
header = s.objTree.Header() header = s.objTree.Header()
objTree = s.objTree objTree = s.objTree
) )
log := log.With("senderId", senderId).
With("heads", request.Heads).
With("treeId", s.objTree.ID()).
With("replyId", replyId)
log.Debug("received full sync request message")
defer func() { defer func() {
if err != nil { if err != nil {
log.With(zap.Error(err)).Debug("full sync request finished with error")
s.syncClient.SendAsync(senderId, treechangeproto.WrapError(err, header), replyId) s.syncClient.SendAsync(senderId, treechangeproto.WrapError(err, header), replyId)
return
} else if fullResponse != nil {
log.Debug("full sync response sent")
} }
}() }()
err = func() error { if len(request.Changes) != 0 && !s.alreadyHasHeads(objTree, request.Heads) {
objTree.Lock() _, err = objTree.AddRawChanges(ctx, tree.RawChangesPayload{
defer objTree.Unlock() NewHeads: request.Heads,
RawChanges: request.Changes,
if len(request.Changes) != 0 && !s.alreadyHasHeads(objTree, request.Heads) { })
_, err = objTree.AddRawChanges(ctx, request.Changes...) if err != nil {
if err != nil { return
return err
}
} }
}
fullResponse, err = s.syncClient.CreateFullSyncResponse(objTree, request.Heads, request.SnapshotPath) fullResponse, err = s.syncClient.CreateFullSyncResponse(objTree, request.Heads, request.SnapshotPath)
return err
}()
if err != nil { if err != nil {
return return
} }
return s.syncClient.SendAsync(senderId, fullResponse, replyId) return s.syncClient.SendAsync(senderId, fullResponse, replyId)
} }
@ -148,34 +188,30 @@ func (s *syncTreeHandler) handleFullSyncResponse(
ctx context.Context, ctx context.Context,
senderId string, senderId string,
response *treechangeproto.TreeFullSyncResponse) (err error) { response *treechangeproto.TreeFullSyncResponse) (err error) {
log.With("senderId", senderId). var (
objTree = s.objTree
)
log := log.With("senderId", senderId).
With("heads", response.Heads). With("heads", response.Heads).
With("treeId", s.objTree.ID()). With("treeId", s.objTree.ID())
Debug("received full sync response message") log.Debug("received full sync response message")
objTree := s.objTree
if err != nil { defer func() {
log.With("senderId", senderId). if err != nil {
With("heads", response.Heads). log.With(zap.Error(err)).Debug("full sync response failed")
With("treeId", s.objTree.ID()). } else {
Debug("failed to find the tree in full sync response") log.Debug("full sync response succeeded")
}
}()
if s.alreadyHasHeads(objTree, response.Heads) {
return return
} }
err = func() error {
objTree.Lock()
defer objTree.Unlock()
if s.alreadyHasHeads(objTree, response.Heads) {
return nil
}
_, err = objTree.AddRawChanges(ctx, response.Changes...)
return err
}()
log.With("error", err != nil).
With("heads", response.Heads).
With("treeId", s.objTree.ID()).
Debug("finished full sync response")
_, err = objTree.AddRawChanges(ctx, tree.RawChangesPayload{
NewHeads: response.Heads,
RawChanges: response.Changes,
})
return return
} }

View File

@ -3,6 +3,7 @@ package synctree
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/statusservice"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree/mock_objecttree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree/mock_objecttree"
@ -33,18 +34,47 @@ func (t *testObjTreeMock) Unlock() {
t.m.Unlock() t.m.Unlock()
} }
func TestSyncHandler_HandleHeadUpdate(t *testing.T) { type syncHandlerFixture struct {
ctrl := gomock.NewController(t) ctrl *gomock.Controller
defer ctrl.Finish() syncClientMock *mock_synctree.MockSyncClient
objectTreeMock *testObjTreeMock
receiveQueueMock *mock_synctree.MockReceiveQueue
ctx := context.Background() syncHandler *syncTreeHandler
}
func newSyncHandlerFixture(t *testing.T) *syncHandlerFixture {
ctrl := gomock.NewController(t)
syncClientMock := mock_synctree.NewMockSyncClient(ctrl) syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
receiveQueueMock := mock_synctree.NewMockReceiveQueue(ctrl)
syncHandler := newSyncTreeHandler(objectTreeMock, syncClientMock) syncHandler := &syncTreeHandler{
objTree: objectTreeMock,
syncClient: syncClientMock,
queue: receiveQueueMock,
statusService: statusservice.NewNoOpStatusService(),
}
return &syncHandlerFixture{
ctrl: ctrl,
syncClientMock: syncClientMock,
objectTreeMock: objectTreeMock,
receiveQueueMock: receiveQueueMock,
syncHandler: syncHandler,
}
}
func (fx *syncHandlerFixture) stop() {
fx.ctrl.Finish()
}
func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
ctx := context.Background()
log = zap.NewNop().Sugar() log = zap.NewNop().Sugar()
t.Run("head update non empty all heads added", func(t *testing.T) { t.Run("head update non empty all heads added", func(t *testing.T) {
fx := newSyncHandlerFixture(t)
defer fx.stop()
treeId := "treeId" treeId := "treeId"
senderId := "senderId" senderId := "senderId"
chWithId := &treechangeproto.RawTreeChangeWithId{} chWithId := &treechangeproto.RawTreeChangeWithId{}
@ -56,29 +86,29 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId) treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
objectTreeMock.EXPECT(). fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
ID().AnyTimes().Return(treeId) fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
objectTreeMock.EXPECT().
Heads().
Return([]string{"h2"})
objectTreeMock.EXPECT().
HasChanges(gomock.Eq([]string{"h1"})).
Return(false)
objectTreeMock.EXPECT().
AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})).
Return(tree.AddResult{}, nil)
objectTreeMock.EXPECT().
Heads().
Return([]string{"h2", "h1"})
objectTreeMock.EXPECT().
HasChanges(gomock.Eq([]string{"h1"})).
Return(true)
err := syncHandler.HandleMessage(ctx, senderId, objectMsg) fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).Times(2)
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
fx.objectTreeMock.EXPECT().
AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
NewHeads: []string{"h1"},
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
})).
Return(tree.AddResult{}, nil)
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2", "h1"})
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(true)
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
t.Run("head update non empty heads not added", func(t *testing.T) { t.Run("head update non empty heads not added", func(t *testing.T) {
fx := newSyncHandlerFixture(t)
defer fx.stop()
treeId := "treeId" treeId := "treeId"
senderId := "senderId" senderId := "senderId"
chWithId := &treechangeproto.RawTreeChangeWithId{} chWithId := &treechangeproto.RawTreeChangeWithId{}
@ -90,38 +120,32 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId) treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
fullRequest := &treechangeproto.TreeSyncMessage{} fullRequest := &treechangeproto.TreeSyncMessage{}
fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
ID().AnyTimes().Return(treeId) fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).AnyTimes()
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
Heads(). fx.objectTreeMock.EXPECT().
Return([]string{"h2"}) AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
objectTreeMock.EXPECT(). NewHeads: []string{"h1"},
HasChanges(gomock.Eq([]string{"h1"})). RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
Return(false) })).
objectTreeMock.EXPECT().
AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})).
Return(tree.AddResult{}, nil) Return(tree.AddResult{}, nil)
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
Heads(). fx.syncClientMock.EXPECT().
Return([]string{"h2"}) CreateFullSyncRequest(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
objectTreeMock.EXPECT().
HasChanges(gomock.Eq([]string{"h1"})).
Return(false)
syncClientMock.EXPECT().
CreateFullSyncRequest(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
Return(fullRequest, nil) Return(fullRequest, nil)
objectTreeMock.EXPECT(). fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullRequest), gomock.Eq(""))
Heads().
Return([]string{"h2"})
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullRequest), gomock.Eq("")) fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
t.Run("head update non empty equal heads", func(t *testing.T) { t.Run("head update non empty equal heads", func(t *testing.T) {
fx := newSyncHandlerFixture(t)
defer fx.stop()
treeId := "treeId" treeId := "treeId"
senderId := "senderId" senderId := "senderId"
chWithId := &treechangeproto.RawTreeChangeWithId{} chWithId := &treechangeproto.RawTreeChangeWithId{}
@ -132,18 +156,20 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
} }
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId) treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
ID().AnyTimes().Return(treeId) fx.objectTreeMock.EXPECT().Heads().Return([]string{"h1"}).AnyTimes()
objectTreeMock.EXPECT().
Heads().
Return([]string{"h1"})
err := syncHandler.HandleMessage(ctx, senderId, objectMsg) fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
t.Run("head update empty", func(t *testing.T) { t.Run("head update empty", func(t *testing.T) {
fx := newSyncHandlerFixture(t)
defer fx.stop()
treeId := "treeId" treeId := "treeId"
senderId := "senderId" senderId := "senderId"
chWithId := &treechangeproto.RawTreeChangeWithId{} chWithId := &treechangeproto.RawTreeChangeWithId{}
@ -155,26 +181,24 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId) treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
fullRequest := &treechangeproto.TreeSyncMessage{} fullRequest := &treechangeproto.TreeSyncMessage{}
fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
ID().AnyTimes().Return(treeId) fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).AnyTimes()
objectTreeMock.EXPECT(). fx.syncClientMock.EXPECT().
Heads(). CreateFullSyncRequest(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
Return([]string{"h2"})
syncClientMock.EXPECT().
CreateFullSyncRequest(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
Return(fullRequest, nil) Return(fullRequest, nil)
objectTreeMock.EXPECT(). fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullRequest), gomock.Eq(""))
Heads().
Return([]string{"h2"})
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullRequest), gomock.Eq("")) fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
t.Run("head update empty equal heads", func(t *testing.T) { t.Run("head update empty equal heads", func(t *testing.T) {
fx := newSyncHandlerFixture(t)
defer fx.stop()
treeId := "treeId" treeId := "treeId"
senderId := "senderId" senderId := "senderId"
chWithId := &treechangeproto.RawTreeChangeWithId{} chWithId := &treechangeproto.RawTreeChangeWithId{}
@ -185,29 +209,25 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
} }
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId) treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
ID().AnyTimes().Return(treeId) fx.objectTreeMock.EXPECT().Heads().Return([]string{"h1"}).AnyTimes()
objectTreeMock.EXPECT().
Heads().
Return([]string{"h1"})
err := syncHandler.HandleMessage(ctx, senderId, objectMsg) fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
} }
func TestSyncHandler_HandleFullSyncRequest(t *testing.T) { func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
ctx := context.Background() ctx := context.Background()
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
syncHandler := newSyncTreeHandler(objectTreeMock, syncClientMock)
log = zap.NewNop().Sugar() log = zap.NewNop().Sugar()
t.Run("full sync request with change", func(t *testing.T) { t.Run("full sync request with change", func(t *testing.T) {
fx := newSyncHandlerFixture(t)
defer fx.stop()
treeId := "treeId" treeId := "treeId"
senderId := "senderId" senderId := "senderId"
chWithId := &treechangeproto.RawTreeChangeWithId{} chWithId := &treechangeproto.RawTreeChangeWithId{}
@ -219,27 +239,32 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId) treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId)
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
fullResponse := &treechangeproto.TreeSyncMessage{} fullResponse := &treechangeproto.TreeSyncMessage{}
objectTreeMock.EXPECT(). fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
ID().AnyTimes().Return(treeId) fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
objectTreeMock.EXPECT().Header().Return(nil)
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
Heads(). fx.objectTreeMock.EXPECT().Header().Return(nil)
Return([]string{"h2"}) fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).AnyTimes()
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
HasChanges(gomock.Eq([]string{"h1"})). fx.objectTreeMock.EXPECT().
Return(false) AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
objectTreeMock.EXPECT(). NewHeads: []string{"h1"},
AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
})).
Return(tree.AddResult{}, nil) Return(tree.AddResult{}, nil)
syncClientMock.EXPECT(). fx.syncClientMock.EXPECT().
CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})). CreateFullSyncResponse(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
Return(fullResponse, nil) Return(fullResponse, nil)
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq("")) fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq(""))
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
t.Run("full sync request with change same heads", func(t *testing.T) { t.Run("full sync request with change same heads", func(t *testing.T) {
fx := newSyncHandlerFixture(t)
defer fx.stop()
treeId := "treeId" treeId := "treeId"
senderId := "senderId" senderId := "senderId"
chWithId := &treechangeproto.RawTreeChangeWithId{} chWithId := &treechangeproto.RawTreeChangeWithId{}
@ -251,21 +276,28 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId) treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId)
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
fullResponse := &treechangeproto.TreeSyncMessage{} fullResponse := &treechangeproto.TreeSyncMessage{}
objectTreeMock.EXPECT(). fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
fx.objectTreeMock.EXPECT().
ID().AnyTimes().Return(treeId) ID().AnyTimes().Return(treeId)
objectTreeMock.EXPECT().Header().Return(nil) fx.objectTreeMock.EXPECT().Header().Return(nil)
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().
Heads(). Heads().
Return([]string{"h1"}) Return([]string{"h1"}).AnyTimes()
syncClientMock.EXPECT(). fx.syncClientMock.EXPECT().
CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})). CreateFullSyncResponse(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
Return(fullResponse, nil) Return(fullResponse, nil)
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq("")) fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq(""))
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
t.Run("full sync request without change but with reply id", func(t *testing.T) { t.Run("full sync request without change but with reply id", func(t *testing.T) {
fx := newSyncHandlerFixture(t)
defer fx.stop()
treeId := "treeId" treeId := "treeId"
senderId := "senderId" senderId := "senderId"
replyId := "replyId" replyId := "replyId"
@ -277,18 +309,25 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId) treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId)
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId) objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId)
fullResponse := &treechangeproto.TreeSyncMessage{} fullResponse := &treechangeproto.TreeSyncMessage{}
objectTreeMock.EXPECT(). fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), replyId).Return(false)
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, replyId, nil)
fx.objectTreeMock.EXPECT().
ID().AnyTimes().Return(treeId) ID().AnyTimes().Return(treeId)
objectTreeMock.EXPECT().Header().Return(nil) fx.objectTreeMock.EXPECT().Header().Return(nil)
syncClientMock.EXPECT(). fx.syncClientMock.EXPECT().
CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})). CreateFullSyncResponse(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
Return(fullResponse, nil) Return(fullResponse, nil)
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq(replyId)) fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq(replyId))
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
t.Run("full sync request with add raw changes error", func(t *testing.T) { t.Run("full sync request with add raw changes error", func(t *testing.T) {
fx := newSyncHandlerFixture(t)
defer fx.stop()
treeId := "treeId" treeId := "treeId"
senderId := "senderId" senderId := "senderId"
chWithId := &treechangeproto.RawTreeChangeWithId{} chWithId := &treechangeproto.RawTreeChangeWithId{}
@ -299,36 +338,39 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
} }
treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId) treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId)
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
objectTreeMock.EXPECT(). fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
fx.objectTreeMock.EXPECT().
ID().AnyTimes().Return(treeId) ID().AnyTimes().Return(treeId)
objectTreeMock.EXPECT().Header().Return(nil) fx.objectTreeMock.EXPECT().Header().Return(nil)
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().
Heads(). Heads().
Return([]string{"h2"}) Return([]string{"h2"})
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().
HasChanges(gomock.Eq([]string{"h1"})). HasChanges(gomock.Eq([]string{"h1"})).
Return(false) Return(false)
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().
AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
NewHeads: []string{"h1"},
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
})).
Return(tree.AddResult{}, fmt.Errorf("")) Return(tree.AddResult{}, fmt.Errorf(""))
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Any(), gomock.Eq("")) fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Any(), gomock.Eq(""))
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
require.Error(t, err) require.Error(t, err)
}) })
} }
func TestSyncHandler_HandleFullSyncResponse(t *testing.T) { func TestSyncHandler_HandleFullSyncResponse(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
ctx := context.Background() ctx := context.Background()
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
syncHandler := newSyncTreeHandler(objectTreeMock, syncClientMock)
log = zap.NewNop().Sugar() log = zap.NewNop().Sugar()
t.Run("full sync response with change", func(t *testing.T) { t.Run("full sync response with change", func(t *testing.T) {
fx := newSyncHandlerFixture(t)
defer fx.stop()
treeId := "treeId" treeId := "treeId"
senderId := "senderId" senderId := "senderId"
replyId := "replyId" replyId := "replyId"
@ -340,22 +382,31 @@ func TestSyncHandler_HandleFullSyncResponse(t *testing.T) {
} }
treeMsg := treechangeproto.WrapFullResponse(fullSyncResponse, chWithId) treeMsg := treechangeproto.WrapFullResponse(fullSyncResponse, chWithId)
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId) objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId)
objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId) fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), replyId).Return(false)
objectTreeMock.EXPECT(). fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, replyId, nil)
fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
fx.objectTreeMock.EXPECT().
Heads(). Heads().
Return([]string{"h2"}) Return([]string{"h2"}).AnyTimes()
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().
HasChanges(gomock.Eq([]string{"h1"})). HasChanges(gomock.Eq([]string{"h1"})).
Return(false) Return(false)
objectTreeMock.EXPECT(). fx.objectTreeMock.EXPECT().
AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
NewHeads: []string{"h1"},
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
})).
Return(tree.AddResult{}, nil) Return(tree.AddResult{}, nil)
err := syncHandler.HandleMessage(ctx, senderId, objectMsg) fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
t.Run("full sync response with same heads", func(t *testing.T) { t.Run("full sync response with same heads", func(t *testing.T) {
fx := newSyncHandlerFixture(t)
defer fx.stop()
treeId := "treeId" treeId := "treeId"
senderId := "senderId" senderId := "senderId"
replyId := "replyId" replyId := "replyId"
@ -367,12 +418,16 @@ func TestSyncHandler_HandleFullSyncResponse(t *testing.T) {
} }
treeMsg := treechangeproto.WrapFullResponse(fullSyncResponse, chWithId) treeMsg := treechangeproto.WrapFullResponse(fullSyncResponse, chWithId)
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId) objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId)
objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId) fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), replyId).Return(false)
objectTreeMock.EXPECT(). fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, replyId, nil)
Heads().
Return([]string{"h1"})
err := syncHandler.HandleMessage(ctx, senderId, objectMsg) fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
fx.objectTreeMock.EXPECT().
Heads().
Return([]string{"h1"}).AnyTimes()
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
require.NoError(t, err) require.NoError(t, err)
}) })
} }

View File

@ -32,6 +32,7 @@ type Config struct {
Storage Storage `yaml:"storage"` Storage Storage `yaml:"storage"`
Metric Metric `yaml:"metric"` Metric Metric `yaml:"metric"`
Log Log `yaml:"log"` Log Log `yaml:"log"`
Stream Stream `yaml:"stream"`
FileStorePogreb FileStorePogreb `yaml:"fileStorePogreb"` FileStorePogreb FileStorePogreb `yaml:"fileStorePogreb"`
} }
@ -52,6 +53,10 @@ func (c Config) GetGRPCServer() GrpcServer {
return c.GrpcServer return c.GrpcServer
} }
func (c Config) GetStream() Stream {
return c.Stream
}
func (c Config) GetAccount() Account { func (c Config) GetAccount() Account {
return c.Account return c.Account
} }

6
common/config/stream.go Normal file
View File

@ -0,0 +1,6 @@
package config
type Stream struct {
TimeoutMilliseconds int `yaml:"timeoutMilliseconds"`
MaxMsgSizeMb int `yaml:"maxMsgSizeMb"`
}

View File

@ -3,7 +3,6 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/common
go 1.19 go 1.19
require ( require (
github.com/VividCortex/ewma v1.2.0
github.com/anytypeio/go-anytype-infrastructure-experiments/consensus v0.0.0-20221107145605-92bdf7d57b48 github.com/anytypeio/go-anytype-infrastructure-experiments/consensus v0.0.0-20221107145605-92bdf7d57b48
github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232
github.com/awalterschulze/gographviz v2.0.3+incompatible github.com/awalterschulze/gographviz v2.0.3+incompatible
@ -19,7 +18,6 @@ require (
github.com/ipfs/go-ipfs-blockstore v1.2.0 github.com/ipfs/go-ipfs-blockstore v1.2.0
github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-chunker v0.0.5
github.com/ipfs/go-ipfs-exchange-interface v0.2.0 github.com/ipfs/go-ipfs-exchange-interface v0.2.0
github.com/ipfs/go-ipld-cbor v0.0.6
github.com/ipfs/go-ipld-format v0.4.0 github.com/ipfs/go-ipld-format v0.4.0
github.com/ipfs/go-merkledag v0.8.1 github.com/ipfs/go-merkledag v0.8.1
github.com/ipfs/go-unixfs v0.4.1 github.com/ipfs/go-unixfs v0.4.1
@ -31,8 +29,9 @@ require (
github.com/stretchr/testify v1.8.1 github.com/stretchr/testify v1.8.1
github.com/zeebo/blake3 v0.2.3 github.com/zeebo/blake3 v0.2.3
github.com/zeebo/errs v1.3.0 github.com/zeebo/errs v1.3.0
go.uber.org/multierr v1.9.0 go.uber.org/atomic v1.10.0
go.uber.org/zap v1.24.0 go.uber.org/zap v1.24.0
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
storj.io/drpc v0.0.32 storj.io/drpc v0.0.32
@ -58,6 +57,7 @@ require (
github.com/ipfs/go-ipfs-files v0.0.3 // indirect github.com/ipfs/go-ipfs-files v0.0.3 // indirect
github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect github.com/ipfs/go-ipfs-posinfo v0.0.1 // indirect
github.com/ipfs/go-ipfs-util v0.0.2 // indirect github.com/ipfs/go-ipfs-util v0.0.2 // indirect
github.com/ipfs/go-ipld-cbor v0.0.6 // indirect
github.com/ipfs/go-ipld-legacy v0.1.1 // indirect github.com/ipfs/go-ipld-legacy v0.1.1 // indirect
github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-log v1.0.5 // indirect
github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect
@ -91,7 +91,7 @@ require (
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
go.opentelemetry.io/otel v1.11.2 // indirect go.opentelemetry.io/otel v1.11.2 // indirect
go.opentelemetry.io/otel/trace v1.11.2 // indirect go.opentelemetry.io/otel/trace v1.11.2 // indirect
go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.9.0 // indirect
golang.org/x/crypto v0.4.0 // indirect golang.org/x/crypto v0.4.0 // indirect
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect

View File

@ -35,8 +35,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@ -507,6 +505,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b h1:SCE/18RnFsLrjydh/R/s5EVvHoZprqEQUuoxK8q2Pc4=
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg=

View File

@ -8,12 +8,16 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/timeoutconn"
"github.com/libp2p/go-libp2p/core/sec" "github.com/libp2p/go-libp2p/core/sec"
"go.uber.org/zap" "go.uber.org/zap"
"net" "net"
"storj.io/drpc" "storj.io/drpc"
"storj.io/drpc/drpcconn" "storj.io/drpc/drpcconn"
"storj.io/drpc/drpcmanager"
"storj.io/drpc/drpcwire"
"sync" "sync"
"time"
) )
const CName = "common.net.dialer" const CName = "common.net.dialer"
@ -34,6 +38,7 @@ type Dialer interface {
type dialer struct { type dialer struct {
transport secure.Service transport secure.Service
config *config.Config
peerAddrs map[string][]string peerAddrs map[string][]string
mu sync.RWMutex mu sync.RWMutex
@ -41,9 +46,9 @@ type dialer struct {
func (d *dialer) Init(a *app.App) (err error) { func (d *dialer) Init(a *app.App) (err error) {
d.transport = a.MustComponent(secure.CName).(secure.Service) d.transport = a.MustComponent(secure.CName).(secure.Service)
nodes := a.MustComponent(config.CName).(*config.Config).Nodes d.config = a.MustComponent(config.CName).(*config.Config)
d.peerAddrs = map[string][]string{} d.peerAddrs = map[string][]string{}
for _, n := range nodes { for _, n := range d.config.Nodes {
d.peerAddrs[n.PeerId] = []string{n.Address} d.peerAddrs[n.PeerId] = []string{n.Address}
} }
return return
@ -90,11 +95,15 @@ func (d *dialer) handshake(ctx context.Context, addr string) (conn drpc.Conn, sc
if err != nil { if err != nil {
return return
} }
sc, err = d.transport.TLSConn(ctx, tcpConn)
timeoutConn := timeoutconn.NewConn(tcpConn, time.Millisecond*time.Duration(d.config.Stream.TimeoutMilliseconds))
sc, err = d.transport.TLSConn(ctx, timeoutConn)
if err != nil { if err != nil {
return return
} }
log.Info("connected with remote host", zap.String("serverPeer", sc.RemotePeer().String()), zap.String("per", sc.LocalPeer().String())) log.Info("connected with remote host", zap.String("serverPeer", sc.RemotePeer().String()), zap.String("per", sc.LocalPeer().String()))
conn = drpcconn.New(sc) conn = drpcconn.NewWithOptions(sc, drpcconn.Options{Manager: drpcmanager.Options{
Reader: drpcwire.ReaderOptions{MaximumBufferSize: d.config.Stream.MaxMsgSizeMb * (1 << 20)},
}})
return conn, sc, err return conn, sc, err
} }

View File

@ -8,8 +8,10 @@ import (
"io" "io"
"net" "net"
"storj.io/drpc" "storj.io/drpc"
"storj.io/drpc/drpcmanager"
"storj.io/drpc/drpcmux" "storj.io/drpc/drpcmux"
"storj.io/drpc/drpcserver" "storj.io/drpc/drpcserver"
"storj.io/drpc/drpcwire"
"time" "time"
) )
@ -22,21 +24,31 @@ type BaseDrpcServer struct {
} }
type DRPCHandlerWrapper func(handler drpc.Handler) drpc.Handler type DRPCHandlerWrapper func(handler drpc.Handler) drpc.Handler
type ListenerConverter func(listener net.Listener) secure.ContextListener type ListenerConverter func(listener net.Listener, timeoutMillis int) secure.ContextListener
type Params struct {
BufferSizeMb int
ListenAddrs []string
Wrapper DRPCHandlerWrapper
Converter ListenerConverter
TimeoutMillis int
}
func NewBaseDrpcServer() *BaseDrpcServer { func NewBaseDrpcServer() *BaseDrpcServer {
return &BaseDrpcServer{Mux: drpcmux.New()} return &BaseDrpcServer{Mux: drpcmux.New()}
} }
func (s *BaseDrpcServer) Run(ctx context.Context, listenAddrs []string, wrapper DRPCHandlerWrapper, converter ListenerConverter) (err error) { func (s *BaseDrpcServer) Run(ctx context.Context, params Params) (err error) {
s.drpcServer = drpcserver.New(wrapper(s.Mux)) s.drpcServer = drpcserver.NewWithOptions(params.Wrapper(s.Mux), drpcserver.Options{Manager: drpcmanager.Options{
Reader: drpcwire.ReaderOptions{MaximumBufferSize: params.BufferSizeMb * (1 << 20)},
}})
ctx, s.cancel = context.WithCancel(ctx) ctx, s.cancel = context.WithCancel(ctx)
for _, addr := range listenAddrs { for _, addr := range params.ListenAddrs {
tcpList, err := net.Listen("tcp", addr) tcpList, err := net.Listen("tcp", addr)
if err != nil { if err != nil {
return err return err
} }
tlsList := converter(tcpList) tlsList := params.Converter(tcpList, params.TimeoutMillis)
go s.serve(ctx, tlsList) go s.serve(ctx, tlsList)
} }
return return

View File

@ -26,17 +26,18 @@ type DRPCServer interface {
type configGetter interface { type configGetter interface {
GetGRPCServer() config.GrpcServer GetGRPCServer() config.GrpcServer
GetStream() config.Stream
} }
type drpcServer struct { type drpcServer struct {
config config.GrpcServer config configGetter
metric metric.Metric metric metric.Metric
transport secure.Service transport secure.Service
*BaseDrpcServer *BaseDrpcServer
} }
func (s *drpcServer) Init(a *app.App) (err error) { func (s *drpcServer) Init(a *app.App) (err error) {
s.config = a.MustComponent(config.CName).(configGetter).GetGRPCServer() s.config = a.MustComponent(config.CName).(configGetter)
s.metric = a.MustComponent(metric.CName).(metric.Metric) s.metric = a.MustComponent(metric.CName).(metric.Metric)
s.transport = a.MustComponent(secure.CName).(secure.Service) s.transport = a.MustComponent(secure.CName).(secure.Service)
return nil return nil
@ -61,16 +62,19 @@ func (s *drpcServer) Run(ctx context.Context) (err error) {
if err = s.metric.Registry().Register(histVec); err != nil { if err = s.metric.Registry().Register(histVec); err != nil {
return return
} }
return s.BaseDrpcServer.Run( params := Params{
ctx, BufferSizeMb: s.config.GetStream().MaxMsgSizeMb,
s.config.ListenAddrs, TimeoutMillis: s.config.GetStream().TimeoutMilliseconds,
func(handler drpc.Handler) drpc.Handler { ListenAddrs: s.config.GetGRPCServer().ListenAddrs,
Wrapper: func(handler drpc.Handler) drpc.Handler {
return &metric.PrometheusDRPC{ return &metric.PrometheusDRPC{
Handler: handler, Handler: handler,
SummaryVec: histVec, SummaryVec: histVec,
} }
}, },
s.transport.TLSListener) Converter: s.transport.TLSListener,
}
return s.BaseDrpcServer.Run(ctx, params)
} }
func (s *drpcServer) Close(ctx context.Context) (err error) { func (s *drpcServer) Close(ctx context.Context) (err error) {

View File

@ -2,18 +2,25 @@ package secure
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/timeoutconn"
"net" "net"
"time"
) )
type basicListener struct { type basicListener struct {
net.Listener net.Listener
timeoutMillis int
} }
func newBasicListener(listener net.Listener) ContextListener { func newBasicListener(listener net.Listener, timeoutMillis int) ContextListener {
return &basicListener{listener} return &basicListener{listener, timeoutMillis}
} }
func (b *basicListener) Accept(ctx context.Context) (context.Context, net.Conn, error) { func (b *basicListener) Accept(ctx context.Context) (context.Context, net.Conn, error) {
conn, err := b.Listener.Accept() conn, err := b.Listener.Accept()
return ctx, conn, err if err != nil {
return nil, nil, err
}
timeoutConn := timeoutconn.NewConn(conn, time.Duration(b.timeoutMillis)*time.Millisecond)
return ctx, timeoutConn, err
} }

View File

@ -25,8 +25,8 @@ func New() Service {
} }
type Service interface { type Service interface {
TLSListener(lis net.Listener) ContextListener TLSListener(lis net.Listener, timeoutMillis int) ContextListener
BasicListener(lis net.Listener) ContextListener BasicListener(lis net.Listener, timeoutMillis int) ContextListener
TLSConn(ctx context.Context, conn net.Conn) (sec.SecureConn, error) TLSConn(ctx context.Context, conn net.Conn) (sec.SecureConn, error)
app.Component app.Component
} }
@ -54,12 +54,12 @@ func (s *service) Name() (name string) {
return CName return CName
} }
func (s *service) TLSListener(lis net.Listener) ContextListener { func (s *service) TLSListener(lis net.Listener, timeoutMillis int) ContextListener {
return newTLSListener(s.key, lis) return newTLSListener(s.key, lis, timeoutMillis)
} }
func (s *service) BasicListener(lis net.Listener) ContextListener { func (s *service) BasicListener(lis net.Listener, timeoutMillis int) ContextListener {
return newBasicListener(lis) return newBasicListener(lis, timeoutMillis)
} }
func (s *service) TLSConn(ctx context.Context, conn net.Conn) (sec.SecureConn, error) { func (s *service) TLSConn(ctx context.Context, conn net.Conn) (sec.SecureConn, error) {

View File

@ -3,9 +3,11 @@ package secure
import ( import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/timeoutconn"
"github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/crypto"
libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls" libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls"
"net" "net"
"time"
) )
type ContextListener interface { type ContextListener interface {
@ -20,17 +22,19 @@ type ContextListener interface {
Addr() net.Addr Addr() net.Addr
} }
func newTLSListener(key crypto.PrivKey, lis net.Listener) ContextListener { func newTLSListener(key crypto.PrivKey, lis net.Listener, timeoutMillis int) ContextListener {
tr, _ := libp2ptls.New(key) tr, _ := libp2ptls.New(key)
return &tlsListener{ return &tlsListener{
tr: tr, tr: tr,
Listener: lis, Listener: lis,
timeoutMillis: timeoutMillis,
} }
} }
type tlsListener struct { type tlsListener struct {
net.Listener net.Listener
tr *libp2ptls.Transport tr *libp2ptls.Transport
timeoutMillis int
} }
func (p *tlsListener) Accept(ctx context.Context) (context.Context, net.Conn, error) { func (p *tlsListener) Accept(ctx context.Context) (context.Context, net.Conn, error) {
@ -38,7 +42,8 @@ func (p *tlsListener) Accept(ctx context.Context) (context.Context, net.Conn, er
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
return p.upgradeConn(ctx, conn) timeoutConn := timeoutconn.NewConn(conn, time.Duration(p.timeoutMillis)*time.Millisecond)
return p.upgradeConn(ctx, timeoutConn)
} }
func (p *tlsListener) upgradeConn(ctx context.Context, conn net.Conn) (context.Context, net.Conn, error) { func (p *tlsListener) upgradeConn(ctx context.Context, conn net.Conn) (context.Context, net.Conn, error) {

View File

@ -0,0 +1,39 @@
package timeoutconn
import (
"errors"
"net"
"os"
"time"
)
type Conn struct {
net.Conn
timeout time.Duration
}
func NewConn(conn net.Conn, timeout time.Duration) *Conn {
return &Conn{conn, timeout}
}
func (c *Conn) Write(p []byte) (n int, err error) {
for {
if c.timeout != 0 {
c.Conn.SetWriteDeadline(time.Now().Add(c.timeout))
}
nn, err := c.Conn.Write(p[n:])
n += nn
if n < len(p) && nn > 0 && errors.Is(err, os.ErrDeadlineExceeded) {
// Keep extending the deadline so long as we're making progress.
continue
}
if c.timeout != 0 {
c.Conn.SetWriteDeadline(time.Time{})
}
if err != nil {
// if the connection is timed out and we should close it
c.Conn.Close()
}
return n, err
}
}

View File

@ -9,6 +9,7 @@ import (
type ConfConnector interface { type ConfConnector interface {
Configuration() Configuration Configuration() Configuration
Pool() pool.Pool
GetResponsiblePeers(ctx context.Context, spaceId string) ([]peer.Peer, error) GetResponsiblePeers(ctx context.Context, spaceId string) ([]peer.Peer, error)
DialInactiveResponsiblePeers(ctx context.Context, spaceId string, activeNodeIds []string) ([]peer.Peer, error) DialInactiveResponsiblePeers(ctx context.Context, spaceId string, activeNodeIds []string) ([]peer.Peer, error)
} }
@ -23,9 +24,14 @@ func NewConfConnector(conf Configuration, pool pool.Pool) ConfConnector {
} }
func (s *confConnector) Configuration() Configuration { func (s *confConnector) Configuration() Configuration {
// TODO: think about rewriting this, because these deps should not be exposed
return s.conf return s.conf
} }
func (s *confConnector) Pool() pool.Pool {
return s.pool
}
func (s *confConnector) GetResponsiblePeers(ctx context.Context, spaceId string) ([]peer.Peer, error) { func (s *confConnector) GetResponsiblePeers(ctx context.Context, spaceId string) ([]peer.Peer, error) {
return s.connectOneOrMany(ctx, spaceId, nil, s.pool.Get, s.pool.GetOneOf) return s.connectOneOrMany(ctx, spaceId, nil, s.pool.Get, s.pool.GetOneOf)
} }
@ -62,7 +68,14 @@ func (s *confConnector) connectOneOrMany(
} else if len(activeNodeIds) == 0 { } else if len(activeNodeIds) == 0 {
// that means that all connected ids // that means that all connected ids
var p peer.Peer var p peer.Peer
p, err = connectOneOf(ctx, allNodes) p, err = s.pool.GetOneOf(ctx, allNodes)
if err != nil {
return
}
// if we are dialling someone, we want to dial to the same peer which we cached
// thus communication through streams and through diff will go to the same node
p, err = connectOne(ctx, p.Id())
if err != nil { if err != nil {
return return
} }

View File

@ -10,6 +10,7 @@ import (
app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
peer "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" peer "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
pool "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool"
nodeconf "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" nodeconf "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
) )
@ -252,3 +253,17 @@ func (mr *MockConfConnectorMockRecorder) GetResponsiblePeers(arg0, arg1 interfac
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResponsiblePeers", reflect.TypeOf((*MockConfConnector)(nil).GetResponsiblePeers), arg0, arg1) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResponsiblePeers", reflect.TypeOf((*MockConfConnector)(nil).GetResponsiblePeers), arg0, arg1)
} }
// Pool mocks base method.
func (m *MockConfConnector) Pool() pool.Pool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Pool")
ret0, _ := ret[0].(pool.Pool)
return ret0
}
// Pool indicates an expected call of Pool.
func (mr *MockConfConnectorMockRecorder) Pool() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Pool", reflect.TypeOf((*MockConfConnector)(nil).Pool))
}

View File

@ -246,7 +246,7 @@ func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uin
return return
} }
if !st.hasPermission(identity, aclrecordproto.ACLUserPermissions_Admin) { if !st.HasPermission(identity, aclrecordproto.ACLUserPermissions_Admin) {
err = fmt.Errorf("user %s must have admin permissions", identity) err = fmt.Errorf("user %s must have admin permissions", identity)
return return
} }
@ -413,7 +413,7 @@ func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, e
return key, hasher.Sum64(), nil return key, hasher.Sum64(), nil
} }
func (st *ACLState) hasPermission(identity []byte, permission aclrecordproto.ACLUserPermissions) bool { func (st *ACLState) HasPermission(identity []byte, permission aclrecordproto.ACLUserPermissions) bool {
state, exists := st.userStates[string(identity)] state, exists := st.userStates[string(identity)]
if !exists { if !exists {
return false return false

View File

@ -53,23 +53,18 @@ func (mr *MockObjectTreeMockRecorder) AddContent(arg0, arg1 interface{}) *gomock
} }
// AddRawChanges mocks base method. // AddRawChanges mocks base method.
func (m *MockObjectTree) AddRawChanges(arg0 context.Context, arg1 ...*treechangeproto.RawTreeChangeWithId) (tree.AddResult, error) { func (m *MockObjectTree) AddRawChanges(arg0 context.Context, arg1 tree.RawChangesPayload) (tree.AddResult, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
varargs := []interface{}{arg0} ret := m.ctrl.Call(m, "AddRawChanges", arg0, arg1)
for _, a := range arg1 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "AddRawChanges", varargs...)
ret0, _ := ret[0].(tree.AddResult) ret0, _ := ret[0].(tree.AddResult)
ret1, _ := ret[1].(error) ret1, _ := ret[1].(error)
return ret0, ret1 return ret0, ret1
} }
// AddRawChanges indicates an expected call of AddRawChanges. // AddRawChanges indicates an expected call of AddRawChanges.
func (mr *MockObjectTreeMockRecorder) AddRawChanges(arg0 interface{}, arg1 ...interface{}) *gomock.Call { func (mr *MockObjectTreeMockRecorder) AddRawChanges(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0}, arg1...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawChanges", reflect.TypeOf((*MockObjectTree)(nil).AddRawChanges), arg0, arg1)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawChanges", reflect.TypeOf((*MockObjectTree)(nil).AddRawChanges), varargs...)
} }
// ChangesAfterCommonSnapshot mocks base method. // ChangesAfterCommonSnapshot mocks base method.

View File

@ -4,11 +4,13 @@ package tree
import ( import (
"context" "context"
"errors" "errors"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common"
list "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" list "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
"sync" "sync"
) )
@ -33,6 +35,11 @@ type AddResult struct {
Mode Mode Mode Mode
} }
type RawChangesPayload struct {
NewHeads []string
RawChanges []*treechangeproto.RawTreeChangeWithId
}
type ChangeIterateFunc = func(change *Change) bool type ChangeIterateFunc = func(change *Change) bool
type ChangeConvertFunc = func(decrypted []byte) (any, error) type ChangeConvertFunc = func(decrypted []byte) (any, error)
@ -55,7 +62,7 @@ type ObjectTree interface {
Storage() storage.TreeStorage Storage() storage.TreeStorage
AddContent(ctx context.Context, content SignableChangeContent) (AddResult, error) AddContent(ctx context.Context, content SignableChangeContent) (AddResult, error)
AddRawChanges(ctx context.Context, changes ...*treechangeproto.RawTreeChangeWithId) (AddResult, error) AddRawChanges(ctx context.Context, changes RawChangesPayload) (AddResult, error)
Delete() error Delete() error
Close() error Close() error
@ -113,10 +120,10 @@ func defaultObjectTreeDeps(
} }
} }
func (ot *objectTree) rebuildFromStorage(newChanges []*Change) (err error) { func (ot *objectTree) rebuildFromStorage(theirHeads []string, newChanges []*Change) (err error) {
ot.treeBuilder.Reset() ot.treeBuilder.Reset()
ot.tree, err = ot.treeBuilder.Build(newChanges) ot.tree, err = ot.treeBuilder.Build(theirHeads, newChanges)
if err != nil { if err != nil {
return return
} }
@ -192,6 +199,13 @@ func (ot *objectTree) prepareBuilderContent(content SignableChangeContent) (cnt
readKey *symmetric.Key readKey *symmetric.Key
readKeyHash uint64 readKeyHash uint64
) )
canWrite := state.HasPermission(content.Identity, aclrecordproto.ACLUserPermissions_Writer) ||
state.HasPermission(content.Identity, aclrecordproto.ACLUserPermissions_Admin)
if !canWrite {
err = list.ErrInsufficientPermissions
return
}
if content.IsEncrypted { if content.IsEncrypted {
readKeyHash = state.CurrentReadKeyHash() readKeyHash = state.CurrentReadKeyHash()
readKey, err = state.CurrentReadKey() readKey, err = state.CurrentReadKey()
@ -213,8 +227,8 @@ func (ot *objectTree) prepareBuilderContent(content SignableChangeContent) (cnt
return return
} }
func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*treechangeproto.RawTreeChangeWithId) (addResult AddResult, err error) { func (ot *objectTree) AddRawChanges(ctx context.Context, changesPayload RawChangesPayload) (addResult AddResult, err error) {
addResult, err = ot.addRawChanges(ctx, rawChanges...) addResult, err = ot.addRawChanges(ctx, changesPayload)
if err != nil { if err != nil {
return return
} }
@ -235,7 +249,7 @@ func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*treechan
return return
} }
func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechangeproto.RawTreeChangeWithId) (addResult AddResult, err error) { func (ot *objectTree) addRawChanges(ctx context.Context, changesPayload RawChangesPayload) (addResult AddResult, err error) {
// resetting buffers // resetting buffers
ot.newChangesBuf = ot.newChangesBuf[:0] ot.newChangesBuf = ot.newChangesBuf[:0]
ot.notSeenIdxBuf = ot.notSeenIdxBuf[:0] ot.notSeenIdxBuf = ot.notSeenIdxBuf[:0]
@ -252,7 +266,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechan
prevHeadsCopy := headsCopy() prevHeadsCopy := headsCopy()
// filtering changes, verifying and unmarshalling them // filtering changes, verifying and unmarshalling them
for idx, ch := range rawChanges { for idx, ch := range changesPayload.RawChanges {
// not unmarshalling the changes if they were already added either as unattached or attached // not unmarshalling the changes if they were already added either as unattached or attached
if _, exists := ot.tree.attached[ch.Id]; exists { if _, exists := ot.tree.attached[ch.Id]; exists {
continue continue
@ -328,20 +342,20 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechan
} }
} }
// discarding all previously seen changes // discarding all previously seen changes
ot.newChangesBuf = discardFromSlice(ot.newChangesBuf, func(ch *Change) bool { return ch == nil }) ot.newChangesBuf = slice.DiscardFromSlice(ot.newChangesBuf, func(ch *Change) bool { return ch == nil })
if shouldRebuildFromStorage { if shouldRebuildFromStorage {
err = ot.rebuildFromStorage(ot.newChangesBuf) err = ot.rebuildFromStorage(changesPayload.NewHeads, ot.newChangesBuf)
if err != nil { if err != nil {
// rebuilding without new changes // rebuilding without new changes
ot.rebuildFromStorage(nil) ot.rebuildFromStorage(nil, nil)
return return
} }
addResult, err = ot.createAddResult(prevHeadsCopy, Rebuild, nil, rawChanges) addResult, err = ot.createAddResult(prevHeadsCopy, Rebuild, nil, changesPayload.RawChanges)
if err != nil { if err != nil {
// that means that some unattached changes were somehow corrupted in memory // that means that some unattached changes were somehow corrupted in memory
// this shouldn't happen but if that happens, then rebuilding from storage // this shouldn't happen but if that happens, then rebuilding from storage
ot.rebuildFromStorage(nil) ot.rebuildFromStorage(nil, nil)
return return
} }
return return
@ -366,11 +380,11 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechan
err = ErrHasInvalidChanges err = ErrHasInvalidChanges
return return
} }
addResult, err = ot.createAddResult(prevHeadsCopy, mode, treeChangesAdded, rawChanges) addResult, err = ot.createAddResult(prevHeadsCopy, mode, treeChangesAdded, changesPayload.RawChanges)
if err != nil { if err != nil {
// that means that some unattached changes were somehow corrupted in memory // that means that some unattached changes were somehow corrupted in memory
// this shouldn't happen but if that happens, then rebuilding from storage // this shouldn't happen but if that happens, then rebuilding from storage
ot.rebuildFromStorage(nil) ot.rebuildFromStorage(nil, nil)
return return
} }
return return

View File

@ -161,7 +161,11 @@ func TestObjectTree(t *testing.T) {
changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"),
changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"),
} }
res, err := objTree.AddRawChanges(context.Background(), rawChanges...) payload := RawChangesPayload{
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
RawChanges: rawChanges,
}
res, err := objTree.AddRawChanges(context.Background(), payload)
require.NoError(t, err, "adding changes should be without error") require.NoError(t, err, "adding changes should be without error")
// check result // check result
@ -201,7 +205,11 @@ func TestObjectTree(t *testing.T) {
rawChanges := []*treechangeproto.RawTreeChangeWithId{ rawChanges := []*treechangeproto.RawTreeChangeWithId{
changeCreator.createRaw("0", aclList.Head().Id, "", true, ""), changeCreator.createRaw("0", aclList.Head().Id, "", true, ""),
} }
res, err := objTree.AddRawChanges(context.Background(), rawChanges...) payload := RawChangesPayload{
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
RawChanges: rawChanges,
}
res, err := objTree.AddRawChanges(context.Background(), payload)
require.NoError(t, err, "adding changes should be without error") require.NoError(t, err, "adding changes should be without error")
// check result // check result
@ -221,7 +229,11 @@ func TestObjectTree(t *testing.T) {
rawChanges := []*treechangeproto.RawTreeChangeWithId{ rawChanges := []*treechangeproto.RawTreeChangeWithId{
changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"),
} }
res, err := objTree.AddRawChanges(context.Background(), rawChanges...) payload := RawChangesPayload{
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
RawChanges: rawChanges,
}
res, err := objTree.AddRawChanges(context.Background(), payload)
require.NoError(t, err, "adding changes should be without error") require.NoError(t, err, "adding changes should be without error")
// check result // check result
@ -246,7 +258,12 @@ func TestObjectTree(t *testing.T) {
changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"),
changeCreator.createRaw("4", aclList.Head().Id, "3", false, "3"), changeCreator.createRaw("4", aclList.Head().Id, "3", false, "3"),
} }
res, err := objTree.AddRawChanges(context.Background(), rawChanges...) payload := RawChangesPayload{
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
RawChanges: rawChanges,
}
res, err := objTree.AddRawChanges(context.Background(), payload)
require.NoError(t, err, "adding changes should be without error") require.NoError(t, err, "adding changes should be without error")
// check result // check result
@ -289,7 +306,12 @@ func TestObjectTree(t *testing.T) {
changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"),
changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"),
} }
_, err := objTree.AddRawChanges(context.Background(), rawChanges...) payload := RawChangesPayload{
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
RawChanges: rawChanges,
}
_, err := objTree.AddRawChanges(context.Background(), payload)
require.NoError(t, err, "adding changes should be without error") require.NoError(t, err, "adding changes should be without error")
snapshotPath := objTree.SnapshotPath() snapshotPath := objTree.SnapshotPath()
@ -312,7 +334,12 @@ func TestObjectTree(t *testing.T) {
changeCreator.createRaw("6", aclList.Head().Id, "0", false, "3", "4", "5"), changeCreator.createRaw("6", aclList.Head().Id, "0", false, "3", "4", "5"),
} }
_, err := objTree.AddRawChanges(context.Background(), rawChanges...) payload := RawChangesPayload{
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
RawChanges: rawChanges,
}
_, err := objTree.AddRawChanges(context.Background(), payload)
require.NoError(t, err, "adding changes should be without error") require.NoError(t, err, "adding changes should be without error")
require.Equal(t, "0", objTree.Root().Id) require.Equal(t, "0", objTree.Root().Id)
@ -387,7 +414,12 @@ func TestObjectTree(t *testing.T) {
changeCreator.createRaw("6", aclList.Head().Id, "0", true, "3", "4", "5"), changeCreator.createRaw("6", aclList.Head().Id, "0", true, "3", "4", "5"),
} }
_, err := objTree.AddRawChanges(context.Background(), rawChanges...) payload := RawChangesPayload{
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
RawChanges: rawChanges,
}
_, err := objTree.AddRawChanges(context.Background(), payload)
require.NoError(t, err, "adding changes should be without error") require.NoError(t, err, "adding changes should be without error")
require.Equal(t, "6", objTree.Root().Id) require.Equal(t, "6", objTree.Root().Id)
@ -458,7 +490,12 @@ func TestObjectTree(t *testing.T) {
changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"),
changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"),
} }
res, err := objTree.AddRawChanges(context.Background(), rawChanges...) payload := RawChangesPayload{
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
RawChanges: rawChanges,
}
res, err := objTree.AddRawChanges(context.Background(), payload)
require.NoError(t, err, "adding changes should be without error") require.NoError(t, err, "adding changes should be without error")
require.Equal(t, "3", objTree.Root().Id) require.Equal(t, "3", objTree.Root().Id)
@ -467,7 +504,12 @@ func TestObjectTree(t *testing.T) {
changeCreator.createRaw("5", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("5", aclList.Head().Id, "0", false, "1"),
changeCreator.createRaw("6", aclList.Head().Id, "0", false, "3", "4", "5"), changeCreator.createRaw("6", aclList.Head().Id, "0", false, "3", "4", "5"),
} }
res, err = objTree.AddRawChanges(context.Background(), rawChanges...) payload = RawChangesPayload{
NewHeads: []string{rawChanges[len(rawChanges)-1].Id},
RawChanges: rawChanges,
}
res, err = objTree.AddRawChanges(context.Background(), payload)
require.NoError(t, err, "adding changes should be without error") require.NoError(t, err, "adding changes should be without error")
// check result // check result

View File

@ -106,7 +106,7 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) {
newSnapshotsBuf: make([]*Change, 0, 10), newSnapshotsBuf: make([]*Change, 0, 10),
} }
err := objTree.rebuildFromStorage(nil) err := objTree.rebuildFromStorage(nil, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
"time" "time"
) )
@ -87,7 +88,7 @@ func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*treech
return true return true
}, },
func(visited []*Change) { func(visited []*Change) {
results = discardFromSlice(results, func(change *Change) bool { results = slice.DiscardFromSlice(results, func(change *Change) bool {
return change.visited return change.visited
}) })
}, },
@ -143,6 +144,7 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi
} }
if !exists { if !exists {
entry, err = r.loadEntry(id) entry, err = r.loadEntry(id)
entry.position = -1
if err != nil { if err != nil {
continue continue
} }
@ -204,12 +206,11 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi
if entry.position != -1 { if entry.position != -1 {
buffer[entry.position] = nil buffer[entry.position] = nil
} }
entry.position = len(buffer) + 1
return entry return entry
}) })
// discarding visited // discarding visited
buffer = discardFromSlice(buffer, func(change *treechangeproto.RawTreeChangeWithId) bool { buffer = slice.DiscardFromSlice(buffer, func(change *treechangeproto.RawTreeChangeWithId) bool {
return change == nil return change == nil
}) })

View File

@ -40,27 +40,49 @@ func (tb *treeBuilder) Reset() {
tb.tree = &Tree{} tb.tree = &Tree{}
} }
func (tb *treeBuilder) Build(newChanges []*Change) (*Tree, error) { func (tb *treeBuilder) Build(theirHeads []string, newChanges []*Change) (*Tree, error) {
var headsAndNewChanges []string var proposedHeads []string
tb.cache = make(map[string]*Change)
heads, err := tb.treeStorage.Heads() heads, err := tb.treeStorage.Heads()
if err != nil { if err != nil {
return nil, err return nil, err
} }
headsAndNewChanges = append(headsAndNewChanges, heads...) // TODO: we can actually get this from tree (though not sure, that there would always be
tb.cache = make(map[string]*Change) // an invariant where the tree has the closest common snapshot of heads)
for _, ch := range newChanges { // so if optimization is critical we can change this to inject from tree directly
headsAndNewChanges = append(headsAndNewChanges, ch.Id) // but then we have to be sure that invariant stays true
tb.cache[ch.Id] = ch oldBreakpoint, err := tb.findBreakpoint(heads, true)
}
log.With(zap.Strings("heads", heads)).Debug("building tree")
breakpoint, err := tb.findBreakpoint(headsAndNewChanges)
if err != nil { if err != nil {
// this should never error out, because otherwise we have broken data
return nil, fmt.Errorf("findBreakpoint error: %v", err) return nil, fmt.Errorf("findBreakpoint error: %v", err)
} }
if err = tb.buildTree(headsAndNewChanges, breakpoint); err != nil { if len(theirHeads) > 0 {
proposedHeads = append(proposedHeads, theirHeads...)
}
for _, ch := range newChanges {
if len(theirHeads) == 0 {
// in this case we don't know what new heads are, so every change can be head
proposedHeads = append(proposedHeads, ch.Id)
}
tb.cache[ch.Id] = ch
}
// getting common snapshot for new heads
breakpoint, err := tb.findBreakpoint(proposedHeads, false)
if err != nil {
breakpoint = oldBreakpoint
} else {
breakpoint, err = tb.findCommonForTwoSnapshots(oldBreakpoint, breakpoint)
if err != nil {
breakpoint = oldBreakpoint
}
}
proposedHeads = append(proposedHeads, heads...)
log.With(zap.Strings("heads", proposedHeads)).Debug("building tree")
if err = tb.buildTree(proposedHeads, breakpoint); err != nil {
return nil, fmt.Errorf("buildTree error: %v", err) return nil, fmt.Errorf("buildTree error: %v", err)
} }
@ -73,13 +95,12 @@ func (tb *treeBuilder) buildTree(heads []string, breakpoint string) (err error)
return return
} }
tb.tree.AddFast(ch) tb.tree.AddFast(ch)
changes, err := tb.dfs(heads, breakpoint) changes := tb.dfs(heads, breakpoint)
tb.tree.AddFast(changes...) tb.tree.AddFast(changes...)
return return
} }
func (tb *treeBuilder) dfs(heads []string, breakpoint string) (buf []*Change, err error) { func (tb *treeBuilder) dfs(heads []string, breakpoint string) []*Change {
// initializing buffers // initializing buffers
tb.idStack = tb.idStack[:0] tb.idStack = tb.idStack[:0]
tb.loadBuffer = tb.loadBuffer[:0] tb.loadBuffer = tb.loadBuffer[:0]
@ -113,7 +134,7 @@ func (tb *treeBuilder) dfs(heads []string, breakpoint string) (buf []*Change, er
tb.idStack = append(tb.idStack, prev) tb.idStack = append(tb.idStack, prev)
} }
} }
return tb.loadBuffer, nil return tb.loadBuffer
} }
func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) {
@ -138,18 +159,34 @@ func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) {
return ch, nil return ch, nil
} }
func (tb *treeBuilder) findBreakpoint(heads []string) (breakpoint string, err error) { func (tb *treeBuilder) findBreakpoint(heads []string, noError bool) (breakpoint string, err error) {
var ( var (
ch *Change ch *Change
snapshotIds []string snapshotIds []string
) )
for _, head := range heads { for _, head := range heads {
if ch, err = tb.loadChange(head); err != nil { if ch, err = tb.loadChange(head); err != nil {
return if noError {
return
}
log.With(zap.String("head", head), zap.Error(err)).Debug("couldn't find head")
continue
} }
shId := ch.SnapshotId shId := ch.SnapshotId
if ch.IsSnapshot { if ch.IsSnapshot {
shId = ch.Id shId = ch.Id
} else {
_, err = tb.loadChange(shId)
if err != nil {
if noError {
return
}
log.With(zap.String("snapshot id", shId), zap.Error(err)).Debug("couldn't find head's snapshot")
continue
}
} }
if slice.FindPos(snapshotIds, shId) == -1 { if slice.FindPos(snapshotIds, shId) == -1 {
snapshotIds = append(snapshotIds, shId) snapshotIds = append(snapshotIds, shId)
@ -165,6 +202,7 @@ func (tb *treeBuilder) findCommonSnapshot(snapshotIds []string) (snapshotId stri
return "", fmt.Errorf("snapshots not found") return "", fmt.Errorf("snapshots not found")
} }
// TODO: use divide and conquer to find the snapshot, then we will have only logN findCommonForTwoSnapshots calls
for len(snapshotIds) > 1 { for len(snapshotIds) > 1 {
l := len(snapshotIds) l := len(snapshotIds)
shId, e := tb.findCommonForTwoSnapshots(snapshotIds[l-2], snapshotIds[l-1]) shId, e := tb.findCommonForTwoSnapshots(snapshotIds[l-2], snapshotIds[l-1])

View File

@ -27,21 +27,3 @@ OuterLoop:
} }
return ourPath[i+1], nil return ourPath[i+1], nil
} }
func discardFromSlice[T any](elements []T, isDiscarded func(T) bool) []T {
var (
finishedIdx = 0
currentIdx = 0
)
for currentIdx < len(elements) {
if !isDiscarded(elements[currentIdx]) {
if finishedIdx != currentIdx {
elements[finishedIdx] = elements[currentIdx]
}
finishedIdx++
}
currentIdx++
}
elements = elements[:finishedIdx]
return elements
}

View File

@ -35,3 +35,17 @@ func WrapError(err error, rootChange *RawTreeChangeWithId) *TreeSyncMessage {
RootChange: rootChange, RootChange: rootChange,
} }
} }
func GetHeads(msg *TreeSyncMessage) (heads []string) {
content := msg.GetContent()
switch {
case content.GetHeadUpdate() != nil:
return content.GetHeadUpdate().Heads
case content.GetFullSyncRequest() != nil:
return content.GetFullSyncRequest().Heads
case content.GetFullSyncResponse() != nil:
return content.GetFullSyncResponse().Heads
default:
return nil
}
}

View File

@ -14,7 +14,7 @@ type PeriodicSync interface {
type SyncerFunc func(ctx context.Context) error type SyncerFunc func(ctx context.Context) error
func NewPeriodicSync(periodSeconds int, syncer SyncerFunc, l *zap.Logger) PeriodicSync { func NewPeriodicSync(periodSeconds int, timeout time.Duration, syncer SyncerFunc, l *zap.Logger) PeriodicSync {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
return &periodicSync{ return &periodicSync{
syncer: syncer, syncer: syncer,
@ -23,6 +23,7 @@ func NewPeriodicSync(periodSeconds int, syncer SyncerFunc, l *zap.Logger) Period
syncCancel: cancel, syncCancel: cancel,
syncLoopDone: make(chan struct{}), syncLoopDone: make(chan struct{}),
periodSeconds: periodSeconds, periodSeconds: periodSeconds,
timeout: timeout,
} }
} }
@ -33,6 +34,7 @@ type periodicSync struct {
syncCancel context.CancelFunc syncCancel context.CancelFunc
syncLoopDone chan struct{} syncLoopDone chan struct{}
periodSeconds int periodSeconds int
timeout time.Duration
} }
func (p *periodicSync) Run() { func (p *periodicSync) Run() {
@ -43,8 +45,12 @@ func (p *periodicSync) syncLoop(periodSeconds int) {
period := time.Duration(periodSeconds) * time.Second period := time.Duration(periodSeconds) * time.Second
defer close(p.syncLoopDone) defer close(p.syncLoopDone)
doSync := func() { doSync := func() {
ctx, cancel := context.WithTimeout(p.syncCtx, time.Minute) ctx := p.syncCtx
defer cancel() if p.timeout != 0 {
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(p.syncCtx, p.timeout)
defer cancel()
}
if err := p.syncer(ctx); err != nil { if err := p.syncer(ctx); err != nil {
p.log.Warn("periodic sync error", zap.Error(err)) p.log.Warn("periodic sync error", zap.Error(err))
} }

View File

@ -23,7 +23,7 @@ func TestPeriodicSync_Run(t *testing.T) {
times += 1 times += 1
return nil return nil
} }
pSync := NewPeriodicSync(secs, diffSyncer, l) pSync := NewPeriodicSync(secs, 0, diffSyncer, l)
pSync.Run() pSync.Run()
pSync.Close() pSync.Close()
@ -38,7 +38,7 @@ func TestPeriodicSync_Run(t *testing.T) {
times += 1 times += 1
return nil return nil
} }
pSync := NewPeriodicSync(secs, diffSyncer, l) pSync := NewPeriodicSync(secs, 0, diffSyncer, l)
pSync.Run() pSync.Run()
time.Sleep(time.Second * time.Duration(secs)) time.Sleep(time.Second * time.Duration(secs))

View File

@ -118,3 +118,21 @@ func UnsortedEquals(s1, s2 []string) bool {
return SortedEquals(s1Sorted, s2Sorted) return SortedEquals(s1Sorted, s2Sorted)
} }
func DiscardFromSlice[T any](elements []T, isDiscarded func(T) bool) []T {
var (
finishedIdx = 0
currentIdx = 0
)
for currentIdx < len(elements) {
if !isDiscarded(elements[currentIdx]) {
if finishedIdx != currentIdx {
elements[finishedIdx] = elements[currentIdx]
}
finishedIdx++
}
currentIdx++
}
elements = elements[:finishedIdx]
return elements
}

View File

@ -27,6 +27,7 @@ type Config struct {
Mongo Mongo `yaml:"mongo"` Mongo Mongo `yaml:"mongo"`
Metric config.Metric `yaml:"metric"` Metric config.Metric `yaml:"metric"`
Log config.Log `yaml:"log"` Log config.Log `yaml:"log"`
Stream config.Stream `yaml:"stream"`
} }
func (c *Config) Init(a *app.App) (err error) { func (c *Config) Init(a *app.App) (err error) {
@ -45,6 +46,10 @@ func (c Config) GetGRPCServer() config.GrpcServer {
return c.GrpcServer return c.GrpcServer
} }
func (c Config) GetStream() config.Stream {
return c.Stream
}
func (c Config) GetAccount() config.Account { func (c Config) GetAccount() config.Account {
return c.Account return c.Account
} }

View File

@ -5,30 +5,30 @@ grpcServer:
- 127.0.0.1:4630 - 127.0.0.1:4630
tls: false tls: false
account: account:
peerId: 12D3KooWFgtCbkf47HhFyQW2cEdAkvaofpokCiaa24Phnz7hpepG peerId: 12D3KooWQajuCbCYJdh6fhfTQpwJpJ61mV1ZV4F4XuJnFHeVfeSF
peerKey: 4nWcqWOZxv1iXWYuW35eJlF9nxownm38bZjQ27pmFgVXO26vobKLx70TnNTQzZQdoW/dZtxyE9PO37R74vfPQQ== peerKey: Gz1ARVeHzdusDtBL0DawuQKoKdKhL827WiCPekOndSnbYb65zdtgoxGP8Y+enTfKksPftODaiqzZr16Dfq+JvA==
signingKey: ULbtmmyFjkJ6Z+54FI1OJWfu0QdIeoCckwcrBZDLGhw2o2cXTFH5KGxQuAruNTbREz9eAVGmhGoBZtKVi6/6ng== signingKey: wKPnynjYCBVqDEiREnMRHz6id1NFNIfjV4XKmB27ave9BSyS8saW71BEb/0XT0IZDJep6oSKr9ua5kAxcr7tQA==
encryptionKey: MIIEowIBAAKCAQEAuGAvw/JQuivjoFIhV9RGkoCjO60jNkQpVPWK52eUtEvKHT2EzufhCRwxhAreajoyzk0PsyJ75FWrrvYs2tkSVHFOSiBkZIsldn5gPg1cnvnJOZ9VKDFp8h85d/4cPQ5tX78043nYTgLje2EmbB83inIr4oiZgxDrtLkozJHleAyWuOLIvlWO1l4Uplf6+uooL/5+WeUCuSGUM0wgXfpn+I2IuRhVDVZiChfp51Q6D6brTdOzNcWq1dw6Vld67u8aCLF1EVZ+xM/rnLLBC7MFvIw44LqHvmvGs/lpE9nMNx5L2KfpbpHSBI0IH3FkLQe2Qz8OMZpIa+aga/DzrBpEdwIDAQABAoIBACudXU898AjKPxN6ujZ7maIoWfTQ9SZuI1TcrNomr4+i6hHWrqb/RUWRbMkuhQSd9czFf/RBMQuHlJBT3bJ7bRGaqAly9iyumdMY/A1RvdpBfm9qGIvkfIpxBngzHVz4H7lpkspI1XlGx6c1CRDEpa/TaDwzUhUmGIvszRDvZlfqQvjPjyYSV5Hdc4ywh5zjuSFlxOD/9gsPRE5v4M4FGrGv8cm859P1u95Wxxo3pWincpzjvWw2LpsUGctyU34MhErxh86vNhP9v+nR4VkdojVKkHQTYnPKUlaKj6F+IUSj8syxuTJb8bs0GBuvcXW9AKp/K0xq/GBC8Cu/XN7Ln7kCgYEAwZoqLnU9OuwkcN5AHYW7XsxmVCEnxOsncrUbIzEKPvy4wELdOCVVrX66zmIjb+1+mhaz+mGMGEpkVMBld3wdDfmGgo0CAPlF4efH1ppMzUm2aZ+HYQR8KMH1XOT9qjbGEnLeWcANQT0vZPpe77PQLNwLJ1zv6EtXMMrEH0s4ijUCgYEA88zCNsBtB07ayFr9r+RCfHx/X9wFkT59t2K+axIfZE02f62WWqJCZYMlZu9XAbYEQ94H43/NAL9wfA8dgnF7mKSL8stJKt0g2iPa3MluF4Gq5Y2XYEVf/EDEhP2jh8p1l+xs18rVzsQQ6b3CEU9ytmBJWvkWnwVXf+ZnsCFECXsCgYBM3YyJzXp1/nOpbFRAZGw0AytNk6xafpK29DjGDB5pS6V+kA2M0SXnMD2y2zv+oGh3fTQP4NLigga7r3eZrOlMNxm0k4+MG2wneQLarYB4sR9/aBsz5bf15qwoKbKc9gpGIN0u/RVGJai/irhOqzGn3eV/x2Jo9CC1+otLcW4NUQKBgQCOOHlnZTN1GuwICwSIkhiy9BF+AyUASLsfuquoXEcRxPUw4DugnZ0sCKhN9vsDlYHBcYmajhgyAnuE83BcgwT906eMOEhzh9G9T0NCnwLpFYxzIvkWgQHwbnv1tNyrv1CAEryf2cSGPNw87qSCYp1hhKPmPP6UP5J+mxMLrSw6dwKBgHHFweDS2tw4TNxJQjhfQOp5t9VQbQffFZAqpXGFTc4vf7XePlxIGoIpOg4ShHCKKHSy0PtsLe7QjLrdbMkyYh8oGqgNe5CYTzFFDeK6Im1DoiqNWT+YUWF/gzVRUSpo0QW+4J1hfChG2URp9KbnditXKsJ5Vh+QayHPoZwN7Kgl encryptionKey: MIIEpAIBAAKCAQEA1DJ/TtBpSEVZVfPWJdp7tPaGY9d+4zrD91LM/4N4DKKhhSFfcWlHgZeQiEtP6bKCdIp2nPMURiS8hd1JzYmNJNk/hUYlzCUJOZWyduVeaow9rlTT6I9a8BVUBQHtVD+PUu5pkfjLFgAojcSzg/mIPzJ0T76AlsFXBdXRfS2wnVKfF0/V+jHiLB1V2JBLjyuRf2V5HFglEmWfrCoG02Q9OENZJHy02NXGCs7FnZdYhHct9u00dXk6Xp0w+oBD74+h4gsyFAHnRodRnhC0WMSv2LIPIQUh7x5LfvKx85n6LMFk/aYgTNFKQfu15VTzjfbVbeAm8jsHgV/FifRvETHm6QIDAQABAoIBAF6RLqlaOkFqHpkutRZjm1QXtebTCAqOiv0zGocY+SxwYhlpuRZa+/ImMNR8891Ln9X+S0RBFJz6DEaASz7deVidtTBZBclIDCdsrn9MU1qaq3aA+XugP7/VUX91z2YHeYFVHRlfzmo8odYkfnhnga/gdXOAi+Ajw/umwdjOvvItKqzm4FHHrwmqKDGlMfPgVcbkE/1iDRSwGvuEPOtMuNrTGcPyz0w10BO5zfpxgxJ2Esgmg66VG+H/KPSoLCtStZilErC8gRx9AbbJGUJcLkjd3T6A02cS9IS/hyTEK7qjxNjVaW0DfCrjXfIFiVHeXTB1LSS2JR95kArG437WTw0CgYEA/JsW6qDjl1jF7tYr+E6PjnCk/dgm3nlsC8sTbZd5edPN3dp+D6qlwv4KYKDETpxohMMhOdSl5SYp4dirsnyPDF1BcGdrkq73aE6n4Tx7oQBMeuZLvK9hxWprJqRa9WP49CDiLOc/GLOe3N90s8ViSqU08/tqOtQLU4BmjHMCDzcCgYEA1wxpL7XUUeDa+bGXrtii3oXlZpyoUXft3JjhTazC1lQuwp5M5+0HA/BuTpl8b43+0gcgrUjqB7yeKWZ8Us0gE9ZMBPTGNNGjXjGOtOk1Lpm+PHrCxmADzfJ8V+rrQXvW2KcImJ0bZk87eNUKtDSsWy6+NIQ6W66GUFvv8iblit8CgYEAvBVKCedDrqQFtKC5Wog8MYXEA9IWlt33ygwp6ha39zLyfPa7mDSqebanyWzK3fFtjTSxH5sq7qTs2GF47kv6Qu2I1QXcPfqS8pJmQ7nCH43WZEfnKpW3icOEBuCnbUFD05pMbby86UqMxc6H2Xblicja1bNkVGsgB8t6D6duaB8CgYEAq337OA/x1KXTGoJ0avvZzkjK6uyNEgLozh2gtpfJ/K+/ZnZk8CNGj+6hmM6vvCpphsYmWeomr6rMGknfZQytwwQHNYCZu69eb5RnsH+1aIc0fPiM8TPKdOcmH9p4Z41BhR6XLVVEb29KBw8l7RWASWraRfkYrNpdxCG9FMfOD9MCgYBJ6Z7YNZsJq263s9oJ01npT2NlfXORd3KDHi/A6qC8Jx1dK3+Jew2VV53/PeXJKuPuePSV7nEOwA0wpg3+TuEsWHHOZVO4c+ZVJmonO0x0IzjMHzBB/8VZc+5n+yi/UOSupt/WRcoPOTjJ7tQdhc2m9C7YA248laYikbzkW5DHoA==
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8090 - 127.0.0.1:8090
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWPuwdqpDQxWhD2Vh4yskx2T5VMrwdpTZLfACzgsGfQfNy - peerId: 12D3KooWHtnADt84naf6NeejZ1MxYGZPLk5SPEu2DL4ZV948uWPS
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: yOEpD2+cPldXc2urGuU+szunm7fddRa8xew2uVjaxifRcVzNKhSERpOefjrXaky7PcKmSmTsH/5ZFtcrh1uzqg== signingKey: Fu/H792JFWVYQpOZeLBIr1Y5UuHdZzJxkGO7eakZDaZ3/vIDhjGgNab1+1NMdTJ0IUP6Tv3KQutcRwtX26/wmQ==
encryptionKey: MIIEpAIBAAKCAQEAxnE9Htwto+2fVmonkG9/DxNre33n7kjfrZU73JcHmpKhPlRFirig5T8rs2MaTq1R72/8nGBJuSxsz1PnexI3die39pY1OFYfZCZ59LbT7uH/xHcvkVrK2n50Q41KbbGT9BEzyW+XPkKPDpTq3/igYP+yUQgoWLfMwxCCLKXDe6qUC0fuIxR80fvj3XvorB5dnAiQ01JkH4PtCV1OWT6ZpLGhzcYxsxTHozd6LdMOC7wgGhW26dOSa/vZ1t5avbewFVIz0qfqBncunb7tjO4xa3xVYaA5jBbixDQUYFjVzW7cksrrN4CFNBDBGJ8PLS80MuMg0OG0O+/Qi1mbGb2mUQIDAQABAoIBACODAD0VidVcILeGJ65hRYudHg7raSXrRJv7qMrA/EtdEh3lVsyMXb6on1lq0rphqdf/YmVZldfda1tu2G3dxK8QTIuENeHvB48Uk56HWUXWi77M1WZdqQ+QsZ2lGzymGqQCsBHMNnSd1Jv3alDKXWj+WRrHKvE1cx81RRZYU7M9cpurnF5YNjO7L+7sMxUA9uAQGbe3kDVzrygraicLYQpxSNHytName0A+k3ug0qer4I6PmZhhJykkz6MD3dz/n625HSS+X+TuTm52T2b87tL27xXmSnUK7eYWjZ1vQlP1fWmqnac6u5LApUZaRi0tTjtefSjRW4jr1q20RqOp1kECgYEA7Onh3zM9ejATsjW6WISGKiBPci0D7DUbIuGuJrdQRadlkZzmeQ/VOYAuxIQD4GnQDRhM1FyxsqiAWkJOyCLFiMmsgIEyW9/eRhF8NlCVU+DA/fxy9EagfBbVsgiSBwOex24hPXIVYlaHkLAloNoD4bpw0pQZSDWXr+xvMFNwoGsCgYEA1m3sWA/e8ZuXForaUOoJzBU9nwC79bXv2UNktsVvBlQ1o9pbjoYDcVoAPwuBVUL1UwqDNMzPdhDBKBjZmCyjS6zlYD5ZKjF2m8iTyc4QcaBCdM0iyQpSXTmrfMx+hK1aWwL1p8ssNcednp5ExSAaTyNNGVdbtddiQ6/KMPmhUzMCgYEAwDjLsUNr4BXeBTweo+9yw/9PNn5brm0wRU8C9BrMIJe/izPYs+UqxerBB2Vtl8mCqv1KaQuEika5TYJ7VVsRFvk641DwQScUu5k4RQGBB3tWWz1XL+eWEticLkVR5isDyyAKDEbiHtXCTJz/CtGZUK7rF5BeKv6AwpZ9aKJqwV0CgYEAqXDlQNURu+PR6TtBtoypvz3NmraO0GO7KvipPhAXYm3qkRa8IIxfbhPLfAYQZhpqFvuIoJFzIn2s1I2GbExhoSv3eSzrcn7xlbpSpjYSImeb/AYZhbmFSiuHCi/hjeAaNS7KhZPz1G9vaubvusFaaMyhYPP6AWA4QvpHEJpB06cCgYBqR6/7d2hQiq4MJUrBEzLwG4ijnPeq+UVLQjE598hVIj+8UhRZRRcNWVEJxfcIL1v6Bpo8XISDNVRb30T9bPGVnXvC1jutTUbXKUB1/8iXuyH3IVieobch+bGd4v7ehH/lI7vzB6hjJpFzHopfFUn4wacSQdcFi3tRAwUB/L0S/w== encryptionKey: MIIEowIBAAKCAQEAs+N32tT2Q4Nv9MlyH0B34TJZYLh1+Y/4hc0vupiS/Ct0Mt+Rh62KkPy6Hz2JRDd7ryYpz/Un+qAFQBhfugKy6a5R0U/OnaK8/WwJjstTPd59c7iGnCeW9mWumexT2wiQVbWcSdcAE5SPYmBkIPnwzgxZgtNzvEnbdUDWIOsR3ifDAt3iUqqlo+cZWIZaXiTjyrMlaWY/BR/SGrklYzxcUzNj+K6DdY4yFN5/5ywKIe81llooULTyM5U+fWEW5uri4ERgT/YcRAoii2UJ5kHzpIZmGKcrJ4kUdyFLE7VxYIQMHHXRkDlpTEYlAAJGl5frcHvFufTWIJaohBXAxg5tyQIDAQABAoIBAD3TI9I19x1lAwliYrKS+aCQKV+whftrm8KArrK21W2NkbYaWG4FGuaRtXYfNBoZ54xe1Wf/nenpLWTF+8B2RP9DRiNmBmDvGX0PsIk/IDDXUs5+0OTCRoQQll2Yd4mD+/c5H6nRFtmj6VOqRT+AJ17pp6nq+o/v4lj+G5ncsJtlAtq1xb20yHQYEl6sbK2UqYuiFtXpKMCK/8V3hDj+ROM8UMkxMj+qj9NFd2sCk4FEZ+S2QmHIjY55s4Rpe1RzZZZEYOuJ99Fism+HYXtf3JlFORaNIdhdWY1UkVAFuKY/ULoHOhf/RdJ8ZArak3CplpEdPTYC4IRBI1eZDDF2GgECgYEAw0jvV7E1kqfGD5Q1WTFsss4xHQntPtWRfyAI1viy16sqMX6wQ4ZixWXsOeMB1o5azqqjYo0BBiGw6ie1GKl0iZ09FxHmMDqFLf8a0JZXAlTvC/wEHgAXCzg7tpHRJD1B6gAiU6u6ALW14DtWe6tikFehrY0mwGb9koedQNgoGnkCgYEA69EcUTejGm5Hm6ANC5u5Vn1aaB4BrTJ36FGTaxjnSUPePBj0Eo2Bt+c25DiD3uGj2Jws5QrRhpu+NYhOTC+/P1/rm82w9Tpc8z/wA7nUk0gGEncgtJ8RFokom4B+Ui83JJiH0V7puZUhCc/TOmfa5N0SH5gM4q4rBoVDZtnTGdECgYEAlnssW9GlK6Z2++hEF7/7N+mldPACTkn6PRCtXyHzhjdSYyNxpgb3M49vsceY0gGOPfTFxBpNsLDjh/wjE6b4s1ZkDdPwIjfmCmSrABLpZ1WVgxGnBoshNrcVZIEGvTsrAKsryHfq88MSLIDtCo0tfXbZkkfTla2HNpOj/KTUelkCgYBl0pMRlp58qSWOUxuO6ZyrddD1qA89Q892ptKqqcQkZIOvG284G5XpXJLdFHIMaQ2gWD8iXvt9zf3hi4uTZgKEUNyhF73TBXJhLjhqw3DAb5b/niSnGQ/91ReNnXvt7Kk4ygvLIdp14ai0XeJtE672p2ZN8g+OSXoWhLBH1sJKIQKBgA7NH/Y4RbVHIMWY7jH/1d4ODZ4Hr1RK2Q99HJCAurfD5tjhpcMApoQQJKJDpv7J5Ipx6ynQJD7CFfx27+vqBEG4ffAUm66lKM5xrKcOevcyWemppurCLuza64GgWDP6jBRnHeqrUyZUqoI/I0FNwjxIJbu08NpRSt8khq59+iyF
- peerId: 12D3KooWBgHmDqtXH9SrZfAmwCFsD8LZhTD5dg5wkhdbqFoS8GBN - peerId: 12D3KooWG1r2SVzTMGDhkiw9McbZq98H9C1Ggzp7FSfWDGbVSCbZ
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: l6LFiKqr4ZHgcPbL+DR7KwMbzImufQPFgpoHOJ/nvfUbpb76DCADHuT1I4gIs+XByglnY1KV8jbMfW64XRW5XQ== signingKey: CZTN+NFi4g9MA4BKl3OiCKuzXh63ukIvYWo9D5t9qfZcFwIeOW8eP9W8mtnXaY3JAFyb6GliBW0uCaw4wjRcCA==
encryptionKey: MIIEowIBAAKCAQEA4ltcn1AH048bMXcKOOW7/E0TZYPxL3OtcHXWHSAZjeeTA/rc45G2eaNgyY7Ji+feLtZERbXNWGFBdNp31NHDYZAYwbZmjEqTEgV4yVx7BQP3VBEzglTJaNLTf+XIJnVAEkoHS6ogjC0oXTM6paHu64EitoOCzF9zqL023swjE3HU0dm2xwsUdGnKeO5nPMso/6e3VMavkKnFmvB965ECCBujtediP4lVdIABNVtoMHCoeI5Sn+m7TKqJSyDOIEMhHT3orYUNZWVeAHE1YTM2cI5tSnDZP80CHZ674Z/bKL7Jaznmq87mVt1h9Use2EkxR07/dJuTGvFOos4jHoiR9QIDAQABAoIBAHAr8EluooI/j61CnYk2p6LPG0aaTQJD4/YwHuwOBTviP2OghKgthGzg/szDerNfMyaoveqBvoIGqCZdQTbwwE7v1qTgXA83wYwTtBitQLVqkr1RTOJQXAMbPv5Jg5czUY3+q4DejQSKOE9/XJfKGJkSRH6Hy2C2CJ3dLnzYUqWGO3t70RLT1/sC6p6w3lXdy3dKZGkoR2wva+HXQxVrP8X5HOResXgNZwgMHt9KF1QHVCcySKYiEAefEKTSdKD2fOd4FxLgp3zWpvH3jrX0zd/DqzTlFD5Ns6Ayp2sIfHVp3sn99DZZM6DauMepQKtoSCnXZ+qKhekAwNVJnsVQkSECgYEA4spY9araeFUSl4uXCUQOpCkSshYOPRYN6sBbHsx8tV2eQtCT+5SuNYmzur3c5bkiraGEab8rZfGdDL6fLxQyaqbOmN31Db5kNh/2X+sRnxkak8lsROUWQZRF9doH73FDv6ZlI3V/JicZlOUCfN5BYT+x74R4/c1YXfyuD1J9gr0CgYEA/4K4SDwZUY4bOVCmKQz0OM+RW4PAAH6LHKenTAZNTeDNFFxc2nqnzRGMEKZTDGy0kbT5mBhBHFgShXcAiKxc5/MGkpt8Jcq6Fr5KGU9aZtYKji6mwMTsUndPNQydh3vOt5pOmcuMM6ovanNTvI8k6Qo53OY1IpO5CfOROu0hm5kCgYBnWsYd92YnDsYxUEldzKlLgPhnNov4pNNk15LvP0vaL7cPRhUaw1B9T6scAKjp/GxkasZ4lsnFZM4o37qV7wNm/WwL2KN0Rv9Od1SFtBBMzFkDXvk7kJeK/XLAr0OMiLbSYZeYCFUQ4yLSa2et1nA/TJLf0CR/rhSGiMAedX6DlQKBgAx1137OT33GrFUzNacy1oYeuTv5RNfBVA9lrabrd8GggN/JUU3mRWCexnHZaptkgbnJVZKxPBuhv+V6VDBWF4HIPD3SD0/YfxK03PA3CnWRYppkdAValRvAbcBsiRIeW4pgoAyn/IJYfk92qFK9uFMVCJVZNKYnBhMSKbbx8X2hAoGBAKwvzyAImbNB+493q1R/lSayxzG76bRJ/EseiTqwIec9c4C+Bd/sVXR+Re+xZb0FI/va1bz5CrduTzLSKBmf/+0lzl0MJvWY2+SXfGYdbl4+TTyqgDDfwqW0Tj8pDimye2BneyTmXko1rF+2Sxen7kMXnJLwpqjwZ6TZJuoqeK8q encryptionKey: MIIEpAIBAAKCAQEAo9Nuypzg9kZ+LP+8jQgSTaoRUu8VFdJdCOEjuroPQK+2NwBD/Z9BqKiN0Z+jmhkI9yA0/Fwdh21ibAKX3Je9uffAKOhXI2sxIAlccDORu1kGDnhcc7N3L644DK+uFZvKnMQWiCwmtTnNHkoCzWcIE44G56wMa2c4W7mrOuRWqG6a5Z9JUuLqafOIlf6Dw2fiVM6xXiTIMQ0OyXByxFNjsS5O/PYcwoIKMV8MY+gUnAmyPLE0bslvz/8W+3E7d/LDO4lhqW+N1kDmboe6sc7DBf5JD4DLnP2VWV8Ae/rfJvxwu9ZqVT8RdYKMsZqvs9sV+6jQC9UcX+K8Q4Wdo0eMHwIDAQABAoIBAACR57zEtvOkYyP878b91DJ4+P503nno9XHmdp1bsFnlQpkGYzYqq6vOik/EYmlS1PknH4gROfkSpFkD2UtnK73N4tlBlawF33HhFnU9eLBSKvc56/hrE2sTDBbfNZfVpurMs9ddb/UJcnE8iK32QczvnY6IxrJI9aU8DCB0UujbGDnya/HbFU9pLLxu2EUoHNxjSHG/jCx+AR7JRknRA65KPZG7mu5jeAaaklYTY/aLGlctgecDKfNKDsZo6rgAMUW6ZXI8ogNGqfKHUFazCVe0l1tp4hxvgmyjcw79iKvFr4mlpHtgjYTFCeoMJKvOXUImZUJL0vCA6WKvUdIfzAECgYEA0lCTXYwOHqOwYMb1qi8lIIApcI//B/Nzn++MDQ4ZO4SzVJTTv4rSdXAuoihsO6E7LYZK+wdVNjiCbeMukfTqEfaxWXIsIDaHSR3440NsYSwdBz04UhRgpxFE2FwPK7J5dQ57FBaCAgksnO3XjcByBMYgMWVbA+ezIWfVdN96YoECgYEAx2mm/W4ZGdDyJgDonzEGGxfaNqo6DIv+67fDwI6WyqOWFWJTBaVFkm1uPJfcXYuTI9YCNFRKuRU7dyqSPLErMVusC/8Iww8++kqmkc1m04tbkqh4KpREYuMw8/tTYSWDwgpY8ksM5YRpYRJLTuuC0cEmefGco1RsXG8bYYeZXp8CgYBq5fexYcG/gxXgauBtSx9E4L+vbhGD2hNYJKr768GZhf6crDTgs8/7TzT0yTUSLgZlQlAUPgrqz1hEQGfoWiMrVEeanjSdfvnOiUR7R0bsMT7j8hMRbTgfUuC6VDiFzmZ7wAuBD1uvazhY329jpoCNuqKcWNclKfzbqupNSFXtgQKBgQCTlR7Qm0YadChydeOzxX2GWa3XHT7fAFFHNPa8MQtqp40xAFb/a6TEzRZz49RkqyLXt9Bj2CqBNjSPakNWhay41+bJ7hMXAdaTOOJ0L/c1AwNf1C0zHg5KvWgCefPohvIvjqbrkx3VU50GCZsQqn5kLLYENAvAWX/lHRm/obKhcwKBgQC/iAOC8ZdZC5w4F0Mf7roZWa9P/42JWlCMzm/I/5mEIn4mYY6+1C5V+fXoET6845oAh+P8CkH4waJtqqN6BKQhj7SKqoCHgGBCQy+HrSCBtzk7NuXdpz6sk14zfcVpjR3y3l9TuXc4cVQMSLAqg8yUQf+qnEQTit4jyfikV/5XEw==
- peerId: 12D3KooWASsipDzkridiMBmE7VSqp8yZvGWPY1VqySgMSZk6tsiL - peerId: 12D3KooWDXDcBYxtZ8KNRoJebNgNAv9nFbQatQMoWm1BLwmQh6u7
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: /6+uYFwFf9nU6fvXQVtpHhjd8+v4dXc7esZzqkhjyfMJWlMiZOtQeb913FXofD5f20WksU0l6i22B09sFFYwDQ== signingKey: c3D+0+BCl1xU35KBY+U3GPcU9aXdoLUiD4DJ2jF+IqI3CjGLhet3MBOkPXdIuPq/UpEqlp1k6FjNaU6DEU6Csg==
encryptionKey: MIIEogIBAAKCAQEAwCy84lzkxtzgn4ixGm0LSUTujOBpOh9m7XDoDPZnMTmExdOe9a5v/LXzdlCOCuBvK5u1T3ALBJMA3Zgvjv/jPRQUdiHprP3sbdfc6IgZPBFdLKFTc9yAA7GMbI4y7LhGMLGOMOqQXs+DOeImfmxEs3ykLXHKNas5ORnZPVnB6E9Qod8KH7UyMmBjQkOZYOOw10X4JZiU6xJp/E+VVWcmeXgNBbj5xOWMSzM+hhoA4wNOzBxACucaKDmqD6qugzebOqyUVSzFnEbquro+MYTWYdUDjZTXdvxgUUo80MGQ164gZhkFUKrmSpUvu3YErFySEGqAdFNwOZ6y/4X3s0BHvQIDAQABAoIBAAZiNhAK5+qXMbr67m8jSimv6YCyf6xXmLKwenTbxofDEl8D7ZbZqYyqeqDmgiFoXSkErhwqa6NGQtQZlxLX+zNvNFLMQ5fkg3MOpZ7vzm7JYN/3p+8EVxhIUJLWkmh8opBBhaioUg1kNUa59W9jp1CTBl0gF4h63JbB/g5kqeVOllUw7J1igAoaX36nOJGOwIynCWdizhDhgyjR4OcYfOLwcPDJueKTc5vM10g3LuMSK/sJmaD3TkJFPtDHw+RMW6wqyjsnkrg2D2oohXEyGWYYIXo2so4HCez0AB1I1JAxtVnRPvSIp7xLMm7+AkDoq12QYDHfxZtDTpfmvJg+Sn0CgYEAxCd+oribtdQW+JUctjsDbSQX5CeRISH5Ith3jveBx2jKIqQVnoVPz6URHOvnlIsqYYLANB8B3JHMWfR2UmkK11x0OcZecB06+oBoCZukvSXF+GqVHzLAQUxaoEBDCCPneskj5w+riMWBiiGDp32rUnkqv0nh7dnH+GfORcJ44L8CgYEA+s5s5EALj1jyU9w4+HVUyVsIrUitFnQg6qw/Td3Kj+8CXImKlS+rlmbQv0m1aOcvtFjQRIjjzZJAf/ausfAME+MayoNODgZsDk5RyDKuSWzMLvZLAa1LD52Uli5Pg8KtpzKVTn4xE1MbjsQcUNhFRAgrNEKNyuzXzdp4uXgGOoMCgYASXwiTQOsEepq0KXMI9jn57Nl3+uSyz7W/t7pq329+N6hG2ktUD3RMJE+X/9gup2IOw+owd377I4SaIDU8vq3PQc944cVShspRT9lunO8u7+y8uW7B/0TWWMpcG+irSIGTlGcSavtL0gOx5jWoaDK1hLemNss8NZtu/nnpOq+LjQKBgDisVozJMBOHPNLYS4NROAR77p0BdCNDwIBmxbM5r+EQWA9DAS6u4+4Lc5YV+MkonG37N6yU5iz4pFyGCHmqzX/c7JvgSc3/g4FED1TWpu1uiUD/ZHmPiAuSRxYchtk2L3k9g+GFwF8mg26iP+fAxv4VfnXDqDi3hhg9CtSWG4ozAoGAOWZXlFKqzGAfcucIe54FVQnweXG9sEuIPAvWvVRs4406ggNmL5eHccXpPHWTgetsr2TYMqPTDVMRmhBzSkyrYgk+b2tme79HPzTWs2Yg/pzjOfTgw7MBX/KlvOW5/J+dvrF3Gx8AHHZ9QQdYqi/MS1NKb2K3IbD0/m5gL5Pwi6A= encryptionKey: MIIEpAIBAAKCAQEAuB7HsXuYmoif6/U4JnjC6L0QMu9qW1aPAxDrxWIedTzQhFZp3F3gYW/Zgdd2hvd0c2xyfhwf9C0X/UzfxWr54dDXzWNLN8BdVTik48cdYlgOmbgejiIjTaqSAlv4RtlqvooxCN0MwR2/RVAG/N5GqcAM7E4kJWPtvQYNl6wWCc92rKdutvmcj73wKzz9Hd/qdF612OVS3zRsjh3tJmYt55oovAUh1TAz/mSTTXjFHy35zLRBP+oQQsAOt2p0BOMSyOKZufGC8l3aZD//dp4/U/MaqCjeNuWxCfAZlSd+vt7T0aqDGdyRtrrGUcu4PCwXpOdbzw+uSZxnKawolYoEHwIDAQABAoIBAQCsxeVpvKtUx8QZrUCFiWiM8W0T/un0z+LfY696xzoBlZGtvVEVQtpdVJHsb31/5RFXhnphsI6jmPUb8llBbcMSjeETkItyw4ZRhBfmzl/aevsocEfr5EjwhpEAucDe6wJpzk95G8TuKrXjmtcTzpjMjbUSwbjVhVH/wIBcxVTg2j6z4AOADDRI5UsvZ0NV//If+nNzMjcuIji95PNk7lAuwsqkX3FycxvqXKUMGxRE2bgGMxaBRAP0kqL2vdxyS1M7wp/x04ZAtSnPXHe4qqmDOt69ec3XqbmZHOsZHzkCFePKcPB472/G0bPJeiq/idevEqS89RwvbphDtq3KGrRBAoGBAOrHqlPh36WZBOi6SueUmcrg579KDMUekgeea5payiySbRWztCL2yCYbSgFqSbyCLRppyXK51xvo8iUejR231or6u/nd7T0CON0Nf/8Qtbb13vtTGpIBiWYGqeDrWucUUlyS+K3sDfNk1AJqjUdaIMVu4yTpgzEvrdYCcT312RBPAoGBAMjC83/0EKnsbypFprxKS3Fbg963HhyKjfffQ2w4yncM6kxXF3ehVjg1LInok/6/dmy2LxkAf3r0YYZrGJWmG4Sv4UqHn6JxAjQgarPbdmGhJ8VIUMvMbZRsX3i8Z8D2o8k1M1kr6MYsQ53iX6q/Cp3gnucMeJPk6Xs9Q4TO7YsxAoGAWrXEOF6X01p4zBZWJH2Eoh8dSwooPuzdzPXHaz7SyD/Wx8DDw5KHqDl48W0Iij3dgUwIGjx1QQJStEbGjQnfaZkQkazOIXk/USELKBhjrQn4GjB0np7bYEEI1673UzrFy6C5VjFS/owhYcGbTksjSETcnAFgv9tFFd+hsyfOsv8CgYALk4o875LiaXrDgj6qDtKo17ET75Ux6h9jkqEtpVyvXrRH8KGuyUPSe+Z0kU+vWdT3Uc4HcArpyRuyh4xkXK6riQTBqm5fDIsm/FOKyXXbDVLgwlm+Vqxe6Zzbtml5K/+nw4SReMG0Y6sGeJ4xl1CCaAhhpEtzo7h+3bp99vylkQKBgQDDdR6N4wb3DHTzrW0EFb8XhXZN7CIE3EWhToNDsCkguUB7lwqD4p2c4yLscS0YAqxk7I3NW0nDaUV/340RrVtPJDqB4NZJ+MvhfvV3TW2FkZmru/iW+DMUsfZGAOPdQz9jLGAzUXrXFw/qGBtLIUL6UWqWLOrBO9QHb21nnB1Ssg==
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 20
storage: storage:
path: db path: db
metric: metric:
@ -37,3 +37,6 @@ log:
production: false production: false
defaultLevel: "" defaultLevel: ""
namedLevels: {} namedLevels: {}
stream:
timeoutMilliseconds: 1000
maxMsgSizeMb: 256

View File

@ -5,30 +5,30 @@ grpcServer:
- 127.0.0.1:4430 - 127.0.0.1:4430
tls: false tls: false
account: account:
peerId: 12D3KooWPuwdqpDQxWhD2Vh4yskx2T5VMrwdpTZLfACzgsGfQfNy peerId: 12D3KooWHtnADt84naf6NeejZ1MxYGZPLk5SPEu2DL4ZV948uWPS
peerKey: yOEpD2+cPldXc2urGuU+szunm7fddRa8xew2uVjaxifRcVzNKhSERpOefjrXaky7PcKmSmTsH/5ZFtcrh1uzqg== peerKey: Fu/H792JFWVYQpOZeLBIr1Y5UuHdZzJxkGO7eakZDaZ3/vIDhjGgNab1+1NMdTJ0IUP6Tv3KQutcRwtX26/wmQ==
signingKey: yOEpD2+cPldXc2urGuU+szunm7fddRa8xew2uVjaxifRcVzNKhSERpOefjrXaky7PcKmSmTsH/5ZFtcrh1uzqg== signingKey: Fu/H792JFWVYQpOZeLBIr1Y5UuHdZzJxkGO7eakZDaZ3/vIDhjGgNab1+1NMdTJ0IUP6Tv3KQutcRwtX26/wmQ==
encryptionKey: MIIEpAIBAAKCAQEAxnE9Htwto+2fVmonkG9/DxNre33n7kjfrZU73JcHmpKhPlRFirig5T8rs2MaTq1R72/8nGBJuSxsz1PnexI3die39pY1OFYfZCZ59LbT7uH/xHcvkVrK2n50Q41KbbGT9BEzyW+XPkKPDpTq3/igYP+yUQgoWLfMwxCCLKXDe6qUC0fuIxR80fvj3XvorB5dnAiQ01JkH4PtCV1OWT6ZpLGhzcYxsxTHozd6LdMOC7wgGhW26dOSa/vZ1t5avbewFVIz0qfqBncunb7tjO4xa3xVYaA5jBbixDQUYFjVzW7cksrrN4CFNBDBGJ8PLS80MuMg0OG0O+/Qi1mbGb2mUQIDAQABAoIBACODAD0VidVcILeGJ65hRYudHg7raSXrRJv7qMrA/EtdEh3lVsyMXb6on1lq0rphqdf/YmVZldfda1tu2G3dxK8QTIuENeHvB48Uk56HWUXWi77M1WZdqQ+QsZ2lGzymGqQCsBHMNnSd1Jv3alDKXWj+WRrHKvE1cx81RRZYU7M9cpurnF5YNjO7L+7sMxUA9uAQGbe3kDVzrygraicLYQpxSNHytName0A+k3ug0qer4I6PmZhhJykkz6MD3dz/n625HSS+X+TuTm52T2b87tL27xXmSnUK7eYWjZ1vQlP1fWmqnac6u5LApUZaRi0tTjtefSjRW4jr1q20RqOp1kECgYEA7Onh3zM9ejATsjW6WISGKiBPci0D7DUbIuGuJrdQRadlkZzmeQ/VOYAuxIQD4GnQDRhM1FyxsqiAWkJOyCLFiMmsgIEyW9/eRhF8NlCVU+DA/fxy9EagfBbVsgiSBwOex24hPXIVYlaHkLAloNoD4bpw0pQZSDWXr+xvMFNwoGsCgYEA1m3sWA/e8ZuXForaUOoJzBU9nwC79bXv2UNktsVvBlQ1o9pbjoYDcVoAPwuBVUL1UwqDNMzPdhDBKBjZmCyjS6zlYD5ZKjF2m8iTyc4QcaBCdM0iyQpSXTmrfMx+hK1aWwL1p8ssNcednp5ExSAaTyNNGVdbtddiQ6/KMPmhUzMCgYEAwDjLsUNr4BXeBTweo+9yw/9PNn5brm0wRU8C9BrMIJe/izPYs+UqxerBB2Vtl8mCqv1KaQuEika5TYJ7VVsRFvk641DwQScUu5k4RQGBB3tWWz1XL+eWEticLkVR5isDyyAKDEbiHtXCTJz/CtGZUK7rF5BeKv6AwpZ9aKJqwV0CgYEAqXDlQNURu+PR6TtBtoypvz3NmraO0GO7KvipPhAXYm3qkRa8IIxfbhPLfAYQZhpqFvuIoJFzIn2s1I2GbExhoSv3eSzrcn7xlbpSpjYSImeb/AYZhbmFSiuHCi/hjeAaNS7KhZPz1G9vaubvusFaaMyhYPP6AWA4QvpHEJpB06cCgYBqR6/7d2hQiq4MJUrBEzLwG4ijnPeq+UVLQjE598hVIj+8UhRZRRcNWVEJxfcIL1v6Bpo8XISDNVRb30T9bPGVnXvC1jutTUbXKUB1/8iXuyH3IVieobch+bGd4v7ehH/lI7vzB6hjJpFzHopfFUn4wacSQdcFi3tRAwUB/L0S/w== encryptionKey: MIIEowIBAAKCAQEAs+N32tT2Q4Nv9MlyH0B34TJZYLh1+Y/4hc0vupiS/Ct0Mt+Rh62KkPy6Hz2JRDd7ryYpz/Un+qAFQBhfugKy6a5R0U/OnaK8/WwJjstTPd59c7iGnCeW9mWumexT2wiQVbWcSdcAE5SPYmBkIPnwzgxZgtNzvEnbdUDWIOsR3ifDAt3iUqqlo+cZWIZaXiTjyrMlaWY/BR/SGrklYzxcUzNj+K6DdY4yFN5/5ywKIe81llooULTyM5U+fWEW5uri4ERgT/YcRAoii2UJ5kHzpIZmGKcrJ4kUdyFLE7VxYIQMHHXRkDlpTEYlAAJGl5frcHvFufTWIJaohBXAxg5tyQIDAQABAoIBAD3TI9I19x1lAwliYrKS+aCQKV+whftrm8KArrK21W2NkbYaWG4FGuaRtXYfNBoZ54xe1Wf/nenpLWTF+8B2RP9DRiNmBmDvGX0PsIk/IDDXUs5+0OTCRoQQll2Yd4mD+/c5H6nRFtmj6VOqRT+AJ17pp6nq+o/v4lj+G5ncsJtlAtq1xb20yHQYEl6sbK2UqYuiFtXpKMCK/8V3hDj+ROM8UMkxMj+qj9NFd2sCk4FEZ+S2QmHIjY55s4Rpe1RzZZZEYOuJ99Fism+HYXtf3JlFORaNIdhdWY1UkVAFuKY/ULoHOhf/RdJ8ZArak3CplpEdPTYC4IRBI1eZDDF2GgECgYEAw0jvV7E1kqfGD5Q1WTFsss4xHQntPtWRfyAI1viy16sqMX6wQ4ZixWXsOeMB1o5azqqjYo0BBiGw6ie1GKl0iZ09FxHmMDqFLf8a0JZXAlTvC/wEHgAXCzg7tpHRJD1B6gAiU6u6ALW14DtWe6tikFehrY0mwGb9koedQNgoGnkCgYEA69EcUTejGm5Hm6ANC5u5Vn1aaB4BrTJ36FGTaxjnSUPePBj0Eo2Bt+c25DiD3uGj2Jws5QrRhpu+NYhOTC+/P1/rm82w9Tpc8z/wA7nUk0gGEncgtJ8RFokom4B+Ui83JJiH0V7puZUhCc/TOmfa5N0SH5gM4q4rBoVDZtnTGdECgYEAlnssW9GlK6Z2++hEF7/7N+mldPACTkn6PRCtXyHzhjdSYyNxpgb3M49vsceY0gGOPfTFxBpNsLDjh/wjE6b4s1ZkDdPwIjfmCmSrABLpZ1WVgxGnBoshNrcVZIEGvTsrAKsryHfq88MSLIDtCo0tfXbZkkfTla2HNpOj/KTUelkCgYBl0pMRlp58qSWOUxuO6ZyrddD1qA89Q892ptKqqcQkZIOvG284G5XpXJLdFHIMaQ2gWD8iXvt9zf3hi4uTZgKEUNyhF73TBXJhLjhqw3DAb5b/niSnGQ/91ReNnXvt7Kk4ygvLIdp14ai0XeJtE672p2ZN8g+OSXoWhLBH1sJKIQKBgA7NH/Y4RbVHIMWY7jH/1d4ODZ4Hr1RK2Q99HJCAurfD5tjhpcMApoQQJKJDpv7J5Ipx6ynQJD7CFfx27+vqBEG4ffAUm66lKM5xrKcOevcyWemppurCLuza64GgWDP6jBRnHeqrUyZUqoI/I0FNwjxIJbu08NpRSt8khq59+iyF
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8080 - 127.0.0.1:8080
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWPuwdqpDQxWhD2Vh4yskx2T5VMrwdpTZLfACzgsGfQfNy - peerId: 12D3KooWHtnADt84naf6NeejZ1MxYGZPLk5SPEu2DL4ZV948uWPS
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: yOEpD2+cPldXc2urGuU+szunm7fddRa8xew2uVjaxifRcVzNKhSERpOefjrXaky7PcKmSmTsH/5ZFtcrh1uzqg== signingKey: Fu/H792JFWVYQpOZeLBIr1Y5UuHdZzJxkGO7eakZDaZ3/vIDhjGgNab1+1NMdTJ0IUP6Tv3KQutcRwtX26/wmQ==
encryptionKey: MIIEpAIBAAKCAQEAxnE9Htwto+2fVmonkG9/DxNre33n7kjfrZU73JcHmpKhPlRFirig5T8rs2MaTq1R72/8nGBJuSxsz1PnexI3die39pY1OFYfZCZ59LbT7uH/xHcvkVrK2n50Q41KbbGT9BEzyW+XPkKPDpTq3/igYP+yUQgoWLfMwxCCLKXDe6qUC0fuIxR80fvj3XvorB5dnAiQ01JkH4PtCV1OWT6ZpLGhzcYxsxTHozd6LdMOC7wgGhW26dOSa/vZ1t5avbewFVIz0qfqBncunb7tjO4xa3xVYaA5jBbixDQUYFjVzW7cksrrN4CFNBDBGJ8PLS80MuMg0OG0O+/Qi1mbGb2mUQIDAQABAoIBACODAD0VidVcILeGJ65hRYudHg7raSXrRJv7qMrA/EtdEh3lVsyMXb6on1lq0rphqdf/YmVZldfda1tu2G3dxK8QTIuENeHvB48Uk56HWUXWi77M1WZdqQ+QsZ2lGzymGqQCsBHMNnSd1Jv3alDKXWj+WRrHKvE1cx81RRZYU7M9cpurnF5YNjO7L+7sMxUA9uAQGbe3kDVzrygraicLYQpxSNHytName0A+k3ug0qer4I6PmZhhJykkz6MD3dz/n625HSS+X+TuTm52T2b87tL27xXmSnUK7eYWjZ1vQlP1fWmqnac6u5LApUZaRi0tTjtefSjRW4jr1q20RqOp1kECgYEA7Onh3zM9ejATsjW6WISGKiBPci0D7DUbIuGuJrdQRadlkZzmeQ/VOYAuxIQD4GnQDRhM1FyxsqiAWkJOyCLFiMmsgIEyW9/eRhF8NlCVU+DA/fxy9EagfBbVsgiSBwOex24hPXIVYlaHkLAloNoD4bpw0pQZSDWXr+xvMFNwoGsCgYEA1m3sWA/e8ZuXForaUOoJzBU9nwC79bXv2UNktsVvBlQ1o9pbjoYDcVoAPwuBVUL1UwqDNMzPdhDBKBjZmCyjS6zlYD5ZKjF2m8iTyc4QcaBCdM0iyQpSXTmrfMx+hK1aWwL1p8ssNcednp5ExSAaTyNNGVdbtddiQ6/KMPmhUzMCgYEAwDjLsUNr4BXeBTweo+9yw/9PNn5brm0wRU8C9BrMIJe/izPYs+UqxerBB2Vtl8mCqv1KaQuEika5TYJ7VVsRFvk641DwQScUu5k4RQGBB3tWWz1XL+eWEticLkVR5isDyyAKDEbiHtXCTJz/CtGZUK7rF5BeKv6AwpZ9aKJqwV0CgYEAqXDlQNURu+PR6TtBtoypvz3NmraO0GO7KvipPhAXYm3qkRa8IIxfbhPLfAYQZhpqFvuIoJFzIn2s1I2GbExhoSv3eSzrcn7xlbpSpjYSImeb/AYZhbmFSiuHCi/hjeAaNS7KhZPz1G9vaubvusFaaMyhYPP6AWA4QvpHEJpB06cCgYBqR6/7d2hQiq4MJUrBEzLwG4ijnPeq+UVLQjE598hVIj+8UhRZRRcNWVEJxfcIL1v6Bpo8XISDNVRb30T9bPGVnXvC1jutTUbXKUB1/8iXuyH3IVieobch+bGd4v7ehH/lI7vzB6hjJpFzHopfFUn4wacSQdcFi3tRAwUB/L0S/w== encryptionKey: MIIEowIBAAKCAQEAs+N32tT2Q4Nv9MlyH0B34TJZYLh1+Y/4hc0vupiS/Ct0Mt+Rh62KkPy6Hz2JRDd7ryYpz/Un+qAFQBhfugKy6a5R0U/OnaK8/WwJjstTPd59c7iGnCeW9mWumexT2wiQVbWcSdcAE5SPYmBkIPnwzgxZgtNzvEnbdUDWIOsR3ifDAt3iUqqlo+cZWIZaXiTjyrMlaWY/BR/SGrklYzxcUzNj+K6DdY4yFN5/5ywKIe81llooULTyM5U+fWEW5uri4ERgT/YcRAoii2UJ5kHzpIZmGKcrJ4kUdyFLE7VxYIQMHHXRkDlpTEYlAAJGl5frcHvFufTWIJaohBXAxg5tyQIDAQABAoIBAD3TI9I19x1lAwliYrKS+aCQKV+whftrm8KArrK21W2NkbYaWG4FGuaRtXYfNBoZ54xe1Wf/nenpLWTF+8B2RP9DRiNmBmDvGX0PsIk/IDDXUs5+0OTCRoQQll2Yd4mD+/c5H6nRFtmj6VOqRT+AJ17pp6nq+o/v4lj+G5ncsJtlAtq1xb20yHQYEl6sbK2UqYuiFtXpKMCK/8V3hDj+ROM8UMkxMj+qj9NFd2sCk4FEZ+S2QmHIjY55s4Rpe1RzZZZEYOuJ99Fism+HYXtf3JlFORaNIdhdWY1UkVAFuKY/ULoHOhf/RdJ8ZArak3CplpEdPTYC4IRBI1eZDDF2GgECgYEAw0jvV7E1kqfGD5Q1WTFsss4xHQntPtWRfyAI1viy16sqMX6wQ4ZixWXsOeMB1o5azqqjYo0BBiGw6ie1GKl0iZ09FxHmMDqFLf8a0JZXAlTvC/wEHgAXCzg7tpHRJD1B6gAiU6u6ALW14DtWe6tikFehrY0mwGb9koedQNgoGnkCgYEA69EcUTejGm5Hm6ANC5u5Vn1aaB4BrTJ36FGTaxjnSUPePBj0Eo2Bt+c25DiD3uGj2Jws5QrRhpu+NYhOTC+/P1/rm82w9Tpc8z/wA7nUk0gGEncgtJ8RFokom4B+Ui83JJiH0V7puZUhCc/TOmfa5N0SH5gM4q4rBoVDZtnTGdECgYEAlnssW9GlK6Z2++hEF7/7N+mldPACTkn6PRCtXyHzhjdSYyNxpgb3M49vsceY0gGOPfTFxBpNsLDjh/wjE6b4s1ZkDdPwIjfmCmSrABLpZ1WVgxGnBoshNrcVZIEGvTsrAKsryHfq88MSLIDtCo0tfXbZkkfTla2HNpOj/KTUelkCgYBl0pMRlp58qSWOUxuO6ZyrddD1qA89Q892ptKqqcQkZIOvG284G5XpXJLdFHIMaQ2gWD8iXvt9zf3hi4uTZgKEUNyhF73TBXJhLjhqw3DAb5b/niSnGQ/91ReNnXvt7Kk4ygvLIdp14ai0XeJtE672p2ZN8g+OSXoWhLBH1sJKIQKBgA7NH/Y4RbVHIMWY7jH/1d4ODZ4Hr1RK2Q99HJCAurfD5tjhpcMApoQQJKJDpv7J5Ipx6ynQJD7CFfx27+vqBEG4ffAUm66lKM5xrKcOevcyWemppurCLuza64GgWDP6jBRnHeqrUyZUqoI/I0FNwjxIJbu08NpRSt8khq59+iyF
- peerId: 12D3KooWBgHmDqtXH9SrZfAmwCFsD8LZhTD5dg5wkhdbqFoS8GBN - peerId: 12D3KooWG1r2SVzTMGDhkiw9McbZq98H9C1Ggzp7FSfWDGbVSCbZ
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: l6LFiKqr4ZHgcPbL+DR7KwMbzImufQPFgpoHOJ/nvfUbpb76DCADHuT1I4gIs+XByglnY1KV8jbMfW64XRW5XQ== signingKey: CZTN+NFi4g9MA4BKl3OiCKuzXh63ukIvYWo9D5t9qfZcFwIeOW8eP9W8mtnXaY3JAFyb6GliBW0uCaw4wjRcCA==
encryptionKey: MIIEowIBAAKCAQEA4ltcn1AH048bMXcKOOW7/E0TZYPxL3OtcHXWHSAZjeeTA/rc45G2eaNgyY7Ji+feLtZERbXNWGFBdNp31NHDYZAYwbZmjEqTEgV4yVx7BQP3VBEzglTJaNLTf+XIJnVAEkoHS6ogjC0oXTM6paHu64EitoOCzF9zqL023swjE3HU0dm2xwsUdGnKeO5nPMso/6e3VMavkKnFmvB965ECCBujtediP4lVdIABNVtoMHCoeI5Sn+m7TKqJSyDOIEMhHT3orYUNZWVeAHE1YTM2cI5tSnDZP80CHZ674Z/bKL7Jaznmq87mVt1h9Use2EkxR07/dJuTGvFOos4jHoiR9QIDAQABAoIBAHAr8EluooI/j61CnYk2p6LPG0aaTQJD4/YwHuwOBTviP2OghKgthGzg/szDerNfMyaoveqBvoIGqCZdQTbwwE7v1qTgXA83wYwTtBitQLVqkr1RTOJQXAMbPv5Jg5czUY3+q4DejQSKOE9/XJfKGJkSRH6Hy2C2CJ3dLnzYUqWGO3t70RLT1/sC6p6w3lXdy3dKZGkoR2wva+HXQxVrP8X5HOResXgNZwgMHt9KF1QHVCcySKYiEAefEKTSdKD2fOd4FxLgp3zWpvH3jrX0zd/DqzTlFD5Ns6Ayp2sIfHVp3sn99DZZM6DauMepQKtoSCnXZ+qKhekAwNVJnsVQkSECgYEA4spY9araeFUSl4uXCUQOpCkSshYOPRYN6sBbHsx8tV2eQtCT+5SuNYmzur3c5bkiraGEab8rZfGdDL6fLxQyaqbOmN31Db5kNh/2X+sRnxkak8lsROUWQZRF9doH73FDv6ZlI3V/JicZlOUCfN5BYT+x74R4/c1YXfyuD1J9gr0CgYEA/4K4SDwZUY4bOVCmKQz0OM+RW4PAAH6LHKenTAZNTeDNFFxc2nqnzRGMEKZTDGy0kbT5mBhBHFgShXcAiKxc5/MGkpt8Jcq6Fr5KGU9aZtYKji6mwMTsUndPNQydh3vOt5pOmcuMM6ovanNTvI8k6Qo53OY1IpO5CfOROu0hm5kCgYBnWsYd92YnDsYxUEldzKlLgPhnNov4pNNk15LvP0vaL7cPRhUaw1B9T6scAKjp/GxkasZ4lsnFZM4o37qV7wNm/WwL2KN0Rv9Od1SFtBBMzFkDXvk7kJeK/XLAr0OMiLbSYZeYCFUQ4yLSa2et1nA/TJLf0CR/rhSGiMAedX6DlQKBgAx1137OT33GrFUzNacy1oYeuTv5RNfBVA9lrabrd8GggN/JUU3mRWCexnHZaptkgbnJVZKxPBuhv+V6VDBWF4HIPD3SD0/YfxK03PA3CnWRYppkdAValRvAbcBsiRIeW4pgoAyn/IJYfk92qFK9uFMVCJVZNKYnBhMSKbbx8X2hAoGBAKwvzyAImbNB+493q1R/lSayxzG76bRJ/EseiTqwIec9c4C+Bd/sVXR+Re+xZb0FI/va1bz5CrduTzLSKBmf/+0lzl0MJvWY2+SXfGYdbl4+TTyqgDDfwqW0Tj8pDimye2BneyTmXko1rF+2Sxen7kMXnJLwpqjwZ6TZJuoqeK8q encryptionKey: MIIEpAIBAAKCAQEAo9Nuypzg9kZ+LP+8jQgSTaoRUu8VFdJdCOEjuroPQK+2NwBD/Z9BqKiN0Z+jmhkI9yA0/Fwdh21ibAKX3Je9uffAKOhXI2sxIAlccDORu1kGDnhcc7N3L644DK+uFZvKnMQWiCwmtTnNHkoCzWcIE44G56wMa2c4W7mrOuRWqG6a5Z9JUuLqafOIlf6Dw2fiVM6xXiTIMQ0OyXByxFNjsS5O/PYcwoIKMV8MY+gUnAmyPLE0bslvz/8W+3E7d/LDO4lhqW+N1kDmboe6sc7DBf5JD4DLnP2VWV8Ae/rfJvxwu9ZqVT8RdYKMsZqvs9sV+6jQC9UcX+K8Q4Wdo0eMHwIDAQABAoIBAACR57zEtvOkYyP878b91DJ4+P503nno9XHmdp1bsFnlQpkGYzYqq6vOik/EYmlS1PknH4gROfkSpFkD2UtnK73N4tlBlawF33HhFnU9eLBSKvc56/hrE2sTDBbfNZfVpurMs9ddb/UJcnE8iK32QczvnY6IxrJI9aU8DCB0UujbGDnya/HbFU9pLLxu2EUoHNxjSHG/jCx+AR7JRknRA65KPZG7mu5jeAaaklYTY/aLGlctgecDKfNKDsZo6rgAMUW6ZXI8ogNGqfKHUFazCVe0l1tp4hxvgmyjcw79iKvFr4mlpHtgjYTFCeoMJKvOXUImZUJL0vCA6WKvUdIfzAECgYEA0lCTXYwOHqOwYMb1qi8lIIApcI//B/Nzn++MDQ4ZO4SzVJTTv4rSdXAuoihsO6E7LYZK+wdVNjiCbeMukfTqEfaxWXIsIDaHSR3440NsYSwdBz04UhRgpxFE2FwPK7J5dQ57FBaCAgksnO3XjcByBMYgMWVbA+ezIWfVdN96YoECgYEAx2mm/W4ZGdDyJgDonzEGGxfaNqo6DIv+67fDwI6WyqOWFWJTBaVFkm1uPJfcXYuTI9YCNFRKuRU7dyqSPLErMVusC/8Iww8++kqmkc1m04tbkqh4KpREYuMw8/tTYSWDwgpY8ksM5YRpYRJLTuuC0cEmefGco1RsXG8bYYeZXp8CgYBq5fexYcG/gxXgauBtSx9E4L+vbhGD2hNYJKr768GZhf6crDTgs8/7TzT0yTUSLgZlQlAUPgrqz1hEQGfoWiMrVEeanjSdfvnOiUR7R0bsMT7j8hMRbTgfUuC6VDiFzmZ7wAuBD1uvazhY329jpoCNuqKcWNclKfzbqupNSFXtgQKBgQCTlR7Qm0YadChydeOzxX2GWa3XHT7fAFFHNPa8MQtqp40xAFb/a6TEzRZz49RkqyLXt9Bj2CqBNjSPakNWhay41+bJ7hMXAdaTOOJ0L/c1AwNf1C0zHg5KvWgCefPohvIvjqbrkx3VU50GCZsQqn5kLLYENAvAWX/lHRm/obKhcwKBgQC/iAOC8ZdZC5w4F0Mf7roZWa9P/42JWlCMzm/I/5mEIn4mYY6+1C5V+fXoET6845oAh+P8CkH4waJtqqN6BKQhj7SKqoCHgGBCQy+HrSCBtzk7NuXdpz6sk14zfcVpjR3y3l9TuXc4cVQMSLAqg8yUQf+qnEQTit4jyfikV/5XEw==
- peerId: 12D3KooWASsipDzkridiMBmE7VSqp8yZvGWPY1VqySgMSZk6tsiL - peerId: 12D3KooWDXDcBYxtZ8KNRoJebNgNAv9nFbQatQMoWm1BLwmQh6u7
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: /6+uYFwFf9nU6fvXQVtpHhjd8+v4dXc7esZzqkhjyfMJWlMiZOtQeb913FXofD5f20WksU0l6i22B09sFFYwDQ== signingKey: c3D+0+BCl1xU35KBY+U3GPcU9aXdoLUiD4DJ2jF+IqI3CjGLhet3MBOkPXdIuPq/UpEqlp1k6FjNaU6DEU6Csg==
encryptionKey: MIIEogIBAAKCAQEAwCy84lzkxtzgn4ixGm0LSUTujOBpOh9m7XDoDPZnMTmExdOe9a5v/LXzdlCOCuBvK5u1T3ALBJMA3Zgvjv/jPRQUdiHprP3sbdfc6IgZPBFdLKFTc9yAA7GMbI4y7LhGMLGOMOqQXs+DOeImfmxEs3ykLXHKNas5ORnZPVnB6E9Qod8KH7UyMmBjQkOZYOOw10X4JZiU6xJp/E+VVWcmeXgNBbj5xOWMSzM+hhoA4wNOzBxACucaKDmqD6qugzebOqyUVSzFnEbquro+MYTWYdUDjZTXdvxgUUo80MGQ164gZhkFUKrmSpUvu3YErFySEGqAdFNwOZ6y/4X3s0BHvQIDAQABAoIBAAZiNhAK5+qXMbr67m8jSimv6YCyf6xXmLKwenTbxofDEl8D7ZbZqYyqeqDmgiFoXSkErhwqa6NGQtQZlxLX+zNvNFLMQ5fkg3MOpZ7vzm7JYN/3p+8EVxhIUJLWkmh8opBBhaioUg1kNUa59W9jp1CTBl0gF4h63JbB/g5kqeVOllUw7J1igAoaX36nOJGOwIynCWdizhDhgyjR4OcYfOLwcPDJueKTc5vM10g3LuMSK/sJmaD3TkJFPtDHw+RMW6wqyjsnkrg2D2oohXEyGWYYIXo2so4HCez0AB1I1JAxtVnRPvSIp7xLMm7+AkDoq12QYDHfxZtDTpfmvJg+Sn0CgYEAxCd+oribtdQW+JUctjsDbSQX5CeRISH5Ith3jveBx2jKIqQVnoVPz6URHOvnlIsqYYLANB8B3JHMWfR2UmkK11x0OcZecB06+oBoCZukvSXF+GqVHzLAQUxaoEBDCCPneskj5w+riMWBiiGDp32rUnkqv0nh7dnH+GfORcJ44L8CgYEA+s5s5EALj1jyU9w4+HVUyVsIrUitFnQg6qw/Td3Kj+8CXImKlS+rlmbQv0m1aOcvtFjQRIjjzZJAf/ausfAME+MayoNODgZsDk5RyDKuSWzMLvZLAa1LD52Uli5Pg8KtpzKVTn4xE1MbjsQcUNhFRAgrNEKNyuzXzdp4uXgGOoMCgYASXwiTQOsEepq0KXMI9jn57Nl3+uSyz7W/t7pq329+N6hG2ktUD3RMJE+X/9gup2IOw+owd377I4SaIDU8vq3PQc944cVShspRT9lunO8u7+y8uW7B/0TWWMpcG+irSIGTlGcSavtL0gOx5jWoaDK1hLemNss8NZtu/nnpOq+LjQKBgDisVozJMBOHPNLYS4NROAR77p0BdCNDwIBmxbM5r+EQWA9DAS6u4+4Lc5YV+MkonG37N6yU5iz4pFyGCHmqzX/c7JvgSc3/g4FED1TWpu1uiUD/ZHmPiAuSRxYchtk2L3k9g+GFwF8mg26iP+fAxv4VfnXDqDi3hhg9CtSWG4ozAoGAOWZXlFKqzGAfcucIe54FVQnweXG9sEuIPAvWvVRs4406ggNmL5eHccXpPHWTgetsr2TYMqPTDVMRmhBzSkyrYgk+b2tme79HPzTWs2Yg/pzjOfTgw7MBX/KlvOW5/J+dvrF3Gx8AHHZ9QQdYqi/MS1NKb2K3IbD0/m5gL5Pwi6A= encryptionKey: MIIEpAIBAAKCAQEAuB7HsXuYmoif6/U4JnjC6L0QMu9qW1aPAxDrxWIedTzQhFZp3F3gYW/Zgdd2hvd0c2xyfhwf9C0X/UzfxWr54dDXzWNLN8BdVTik48cdYlgOmbgejiIjTaqSAlv4RtlqvooxCN0MwR2/RVAG/N5GqcAM7E4kJWPtvQYNl6wWCc92rKdutvmcj73wKzz9Hd/qdF612OVS3zRsjh3tJmYt55oovAUh1TAz/mSTTXjFHy35zLRBP+oQQsAOt2p0BOMSyOKZufGC8l3aZD//dp4/U/MaqCjeNuWxCfAZlSd+vt7T0aqDGdyRtrrGUcu4PCwXpOdbzw+uSZxnKawolYoEHwIDAQABAoIBAQCsxeVpvKtUx8QZrUCFiWiM8W0T/un0z+LfY696xzoBlZGtvVEVQtpdVJHsb31/5RFXhnphsI6jmPUb8llBbcMSjeETkItyw4ZRhBfmzl/aevsocEfr5EjwhpEAucDe6wJpzk95G8TuKrXjmtcTzpjMjbUSwbjVhVH/wIBcxVTg2j6z4AOADDRI5UsvZ0NV//If+nNzMjcuIji95PNk7lAuwsqkX3FycxvqXKUMGxRE2bgGMxaBRAP0kqL2vdxyS1M7wp/x04ZAtSnPXHe4qqmDOt69ec3XqbmZHOsZHzkCFePKcPB472/G0bPJeiq/idevEqS89RwvbphDtq3KGrRBAoGBAOrHqlPh36WZBOi6SueUmcrg579KDMUekgeea5payiySbRWztCL2yCYbSgFqSbyCLRppyXK51xvo8iUejR231or6u/nd7T0CON0Nf/8Qtbb13vtTGpIBiWYGqeDrWucUUlyS+K3sDfNk1AJqjUdaIMVu4yTpgzEvrdYCcT312RBPAoGBAMjC83/0EKnsbypFprxKS3Fbg963HhyKjfffQ2w4yncM6kxXF3ehVjg1LInok/6/dmy2LxkAf3r0YYZrGJWmG4Sv4UqHn6JxAjQgarPbdmGhJ8VIUMvMbZRsX3i8Z8D2o8k1M1kr6MYsQ53iX6q/Cp3gnucMeJPk6Xs9Q4TO7YsxAoGAWrXEOF6X01p4zBZWJH2Eoh8dSwooPuzdzPXHaz7SyD/Wx8DDw5KHqDl48W0Iij3dgUwIGjx1QQJStEbGjQnfaZkQkazOIXk/USELKBhjrQn4GjB0np7bYEEI1673UzrFy6C5VjFS/owhYcGbTksjSETcnAFgv9tFFd+hsyfOsv8CgYALk4o875LiaXrDgj6qDtKo17ET75Ux6h9jkqEtpVyvXrRH8KGuyUPSe+Z0kU+vWdT3Uc4HcArpyRuyh4xkXK6riQTBqm5fDIsm/FOKyXXbDVLgwlm+Vqxe6Zzbtml5K/+nw4SReMG0Y6sGeJ4xl1CCaAhhpEtzo7h+3bp99vylkQKBgQDDdR6N4wb3DHTzrW0EFb8XhXZN7CIE3EWhToNDsCkguUB7lwqD4p2c4yLscS0YAqxk7I3NW0nDaUV/340RrVtPJDqB4NZJ+MvhfvV3TW2FkZmru/iW+DMUsfZGAOPdQz9jLGAzUXrXFw/qGBtLIUL6UWqWLOrBO9QHb21nnB1Ssg==
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 600
storage: storage:
path: db path: db
metric: metric:
@ -39,3 +39,6 @@ log:
namedLevels: {} namedLevels: {}
fileStorePogreb: fileStorePogreb:
path: /tmp/pogreb path: /tmp/pogreb
stream:
timeoutMilliseconds: 1000
maxMsgSizeMb: 256

View File

@ -5,39 +5,39 @@ grpcServer:
- 127.0.0.1:4630 - 127.0.0.1:4630
tls: false tls: false
account: account:
peerId: 12D3KooWPSPh4BL6TMzttZciuxCNxovDMd9MmVHYjmLfeDzW85JY peerId: 12D3KooWLJ13UAk8ePMsw5aX53TtdA7rP23pFXi4rtFDkdENmDsa
peerKey: jyf2O72bAAPZ0gtfv0GM04vzftA+61XYr2+4tDnKxhXKYo+Ppdp9INRSlTZ6tlm6wotuArL4sahipmHE/ZWukQ== peerKey: HB6LKWo4hFnSyt97eAZ459O5yw1lO5YhCzHEu79D0zSbqT7MyesMma2OLF9htZLNwWg46njC19SlhOHUunlz9Q==
signingKey: s64C2pRvQVGrHWJhnB+otY2UsBQRe9tQjWpW2YWJX5bCgn65KvGUalciIW3bawsVXXcjVEKRUcSnsPh70xux4g== signingKey: B474sG8lSwkoifyuyv2JhfxNboC9Lu303z9XJZVtmqcbcff+kwDJ3WC9k5McixcQorNnITdWj3rMBJLQqS+t4Q==
encryptionKey: MIIEoAIBAAKCAQEAn4Yfcri3RetiOo6rc3wzUUciBMWS/v2cKJc563ralqhtUTdgTiNv82pFP8A4zPmOyLcn2qNkidPlRMGXHtuABbqBNGjViwIYykKkZaPsP9ogrPvd5zKDaXXJaLZODZC3LVmco37FxWBctaQvUcWwvhBRFyu6writC3k27hdZXfgheGjd461wPFUibAvpyrlQVA0i57O2yobkTsStITID88MTCHdKJuNXmSJg/hI1ABAzLIOb+lm2kuseCBJtu9d6DoJwDXS9+H51sQQhHYSph9YGYMpyX2MmbbR0HMQjOEy/1wlX8l/R9m59A7wFQsjdb1Ug9OI3BYrA5k8nO8zlLQIDAQABAoH/eEOlcdfQU+YhKARnPallBuGZw/8v0w1frTpVcDIumWZhA9m7wSz2OYzkqCtCp0V9X9S1Nx/3q/ET58ILLDhPTAJPZjOiyinKhrG3PulWMs0/1SoNIT/z0o36Sfcm4RM5BfeJH7lzYFpFiqs9AWkI1kF24QEWy7ZuvzejMdxog25dDMqFW3bDJYYS8IzDI+gNmgrNLxh32ST5Ugrjeq4SgUjfKWMGARWPzQk+x9fxzhDJkIXtRqL3SDQmlN9Jy+/p3NuCC5gKTIYcoNEsrTnKqDQQL+Hr8KY8MaywmK1CRWcp1lguheAQqmcqyWdl11dAdIe+sSG0jtYeN4RD+dV9AoGBAMaRFki8e0FprmKk/sT6xGtLimptBh2YPO3Rfooow7aCcCP0ZRDxGUs56aCla4Cg7BBoWldHaPPdgG0rxe/Tocu5AUjohH+s8OOAP0trZzE6gavJV1Uv9XPKUs+EDpATbjFJTFeBN4Im/3uBnOx1CLE0tEOkAvW+NI8zKRUYj+8nAoGBAM2qGh2T+6QQnSvuBEEUCy/3JAJ1gkmvfJpZcE4M5kaQr0iu64L4oYE/68HqcK+IPzSAGgafn4cgodOh59syMMJ+7W2S5YS84JdLZER15SOQ+9q8qVpvqnsi1oW6tcRKdTFinnf/AmRQzWdkLsTp88ew+CSl7VGbgmVcFtcfIH2LAoGARrOMUrPB00W00OzcxfhgDbAlBcXyAoGdWDRasQjYvths43B2t/SQxAdH12pu/6rMwv7VA/SqOwKoYrbOUJlzJ52lBne8DdXfI7IbV1hTsuSZHTigfvWHmQX2PGtR4Bz7BFOL+jBJOm92UlyRKmR1hts0QE1avHNQNZjKzPck8MsCgYBwc8PXzGRZbuQhcwFMfCMp1N4RoiLdG2DsHF81rgPzLYVKHqqTcFMOkt7bps56i+rTT//rAzh88DDLwMk/pw/WKQS1Vw68J3I+B3EJpdTmP44WKfYHhusWbRQTBuYAMB4oJJ41SnAKXcwR7ktMTAeJdpAXqco7RuZjeZjbgx+GxQKBgDycT84wvDxoSz90iY+6pzzBQkbh6sDgy2IPV+nSXKIfvuhefZP4tawwHjwg7oscHv81J0/tkucf1k2VN3NyiqnYlT5Q5EgUxmyOiKw+jkrXBAjQtUgSzPAth0j/mMeQSCw+VrFLNJVGrc6g9s5gNrUFJLa2YnQT1c3PzeyVwlOQ encryptionKey: MIIEowIBAAKCAQEAwgbZCB/8lvH3hOjup53dF2qV0UAWZWWyp93g4oo4tA+04C+SCvr5oXRSHlSO5gf8DYWO9reUsn1GElUv7f2tmw4zZRRy0UV6VDG5/zI2PNNH25IlJoQOg9QCwYQvS7SEOlO1D7hZNvRM/P16d1ego+icQ0SR2Qh60iG1nIrpicoU0DVr/RBfbfVqr+dl7uviDsP9qOlnzwecZXJ/MsTxs4p+xNhddVJseXtuZE9iPSSDgvrHWGq3vgRRe2iBNWYst9efEX0dTZDnvMDp8DampLEAKMPgN1pX9yXx0oRzJbHzE/adytLGlMVDfwJVGdBMgHmZhzdhYjol/qAz0hV1LQIDAQABAoIBAA9o5dHMYI5Id2UZ7uJnGkki0PVGhsDU2+STLaowWiKK4M2xWYL/vdXB3EfGZXcFiVI1mk4j9G5cnrUUCPN441HeRdywTBIs13NaY7BN95rLGPjqWYL+l/yGWRWvfuYfVyUewtGVzZgcvQSWySQzVHHQJqD9ECxRjRelT7w4GCY2QBNSPg8IUb6AvaZNyrNvirKvhgty93PuvNcgBYr0stdfm6oDlMdc/k0WF4thY99ktGRz0h+k/0mtf1AAY1TC7/+9XgpV6tG7jIqH+kRGbpezSDG9vD0JQJoiWcy82ondFYYuIf6sxrOAuBxMRjT/AGkE2RSH5mOYh/nm3Ct3c2ECgYEA6OxbjVP+UG12zwp6G9vGXsBaUR9HQb2g5K85PBE1Ig7djpAInsc4jDomepjQ4JPtMZFZIXkTQZdnScO5/xFtRJ9/gOz8H5Q55TXUxyMabs1Gi+w0uNxxihu4be+HaO3o7orzVaARS3YwiEI/BBR70t8BcHHkrknpugcKSPt4a3UCgYEA1T/0wSMG56n0/DDwUFvtF8ewN2JJOtQPYQISRqxlFKTmPDaehbp1FCHNa7rsLFabz/5Pbxu7ps8s/ZxAhIsMMsWAT7vxHy+bqBMedeiq9IC2JxEJCAlWy9JUx3XeCm21eQmxlFyXBGB3VrSaqoV96rPZ7q8SUoX/SkFR2AjAA9kCgYBNsvrfbFN7tOhbLJ2LSYck+HmocgytK3rOjn1DQmI9GERkWDvn64E7lfJcFzomkHIhhOD8v4zi5oS4IKidI80VhTddZLC+QA4IHir6uwUITUXpS0RTHoZpkdG2Kp87K5H2cTe3KoxaZfTOn3qx+7tKnsW2IugsE8/6FHsj2W9UOQKBgQCKOm+7dan3Jqq/gjVz0XKJFI58CACx2l2xovcXyo2m6RC4fSsaQfe8OgD+0OZgAy/yjcUNn2tuwCJIriz//WXFz1HR3WB5t5FtTB9VjKCr5nasMhWpmOwjKE5+EEACgIS+VXM/WRkm5CTXFjCfUfKB3Vzpo5/70BHgHyEfKOTWWQKBgEXppcbkqPIfIcUpzPmNX83juTfLaYtGXQRDnN1kUvNGUhV6Iqi0eWvoPDHpJgcVsO1PJaiGe4E/WMZZTNj/maNPdaj7COnvMMGlUD8q0blHOMFFapbGAIDarTwYuwDsuDgCQCePq/WEzytQQlO1kSHZcX0gNFQ5T/ogrz9U6AAU
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8090 - 127.0.0.1:8090
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9 - peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA== signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ== encryptionKey: MIIEowIBAAKCAQEAuRemjWvT+g2tjcOJwfGh6LP2PvLsgEMyCzy3zTmqsR+tnSgPD9976ULEaG38qXNE9gul8EcxNlWf40FKNKfnV/z/zHjePF9PNx/ZbrVAiL+5yh5J4cQAQQNTTAgf3hIvmCUm6PtA4AV+lAs/4KnOWm7G1xgd1HgJoN7hGFjGi7No1kpvMXzSSEJx8vTu7AVC6WP7Fp+UyD0zKTWrA6VqU24WzvbtUBJB7pf1hACnt1VsKUbFY18KmDPyGAD1cYNTO38L4D0RExWz9J5LM/wyGKd5zDV3T1+rYr1kNp+B7x79MsS7QInJ07Krd1zkn/Veg9NymQCMUMjH9MUZRbZGUwIDAQABAoIBAAqLtGueVyeKG/dVysWIFOeDSWZwxNTR/0nwnbBNttH8shGgNKt82jyCF1qz2Y92B9nU9BFqnP0xh7iVAbtaTa4PtitaP59E9uh3IhZSsWiZM+a2LxNz7WfG3roYRGiMtLWAeGUR27Jn3bxln7AXPLCeWynqL9jpNfM6f6y5ciaHa2Uj4wZdC9bEvB4SLh+pDwRfaMRg5ZJMXpi8kkR9WQ6i5GwyODEy31ub8LgnlE1+zgrlyUBGzmDpTriCYwkyajGrIY+Sge7QFMCheQ7G2svbWvrsqnQJB7AXfIZqaxiC4pqsqDMhkPCs1uWKKo/pUfrUYyxDAimhixNi8y3v6CECgYEAxLxSghaXaBYjrOnkzCa425an8UK5w9Vd/EkixqCSuPhA986KxUqym6YKT8ffzTqz7QcFcEXYML6evtGIJ/dxMVHsIZ/bGBKhXw2Bp1zI+Ml24mN8LQeBRSWoYHO9x+e7GVaLBMh1EaWd8JechskVuftTnCSUAQDtBpX66e2PX7kCgYEA8NlvWFCBKtwbjiH/h/mYu2ptQRnZ4+0d9AXWoNoePedQj+md51dMI/zpfoM0J+KSK8lG8bNBj7Ax0JAHTMBQJtfLde1IxtzwlzgiJWZ+qxGc/qPYmIb6hxHySA2L7I/TBEAZJ+FnZZ5CSFqsejev7tdRN6CQTZCZNFlNpIUNZGsCgYAt2Rl9WZh1WFt+C5AXh5qjCgwfbIZwPgRGLCEfmwI2exxg49BxRAQ1w885YoIkiN6viWhaDtzgFzxVie0qKz9E2CuodmGPzZ+v0Cz7/OKVIBZFkhu5PruAitMfjzmWIcn3kLSbK8Akma0iCaMfwjL/AbQtelTHmxih5UfxRjyYeQKBgQCREFWJGswBtZr/K6kODB6a20o8yMY9Cwdcf9u6/ET0wgr68xnBSgo5Ls6v/XR/hW7G4q9RSsd1NQl79hP/fWGJU7ZfK/EGnfJnEk82uZoXjT9C/AqsK7hffEaycT5S2HmfeL/uDkxJn12K2NpDrqDPuW5Yk+P2Y95y8kraiaz8SwKBgBiLtOMR9uGNLeEhPPsqbz7ASg270FICxQTRefU3ea5Ow1r2gdf7wTNNCIJGMtf3BMB7eaVLQOu5caaVYgZIKU7s7FejhGejYH3YLzvbVOQa0UW+nc9vltJ8tl6d2hlAC4U1552ZQppxLgN9d0R/X5eZyrkBm+A9ASbwbyaNjaX9
types: types:
- tree - tree
- file - file
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP - peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg== signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3 encryptionKey: MIIEpAIBAAKCAQEAt1zuRz2OVFlH5zj1wR3clRso1pqA9uOzKo4mPDMMq3na7i9mJuPeKdunuQH97utY1c6C3IEJQ5qV5LoYqPSe+ErgU1IcYP3LQrVOu72yvqqUKnsQMr/ztMYbkwzReokcZFsy+8gUxxDk9JOrWoErltJeTOE1bbvBzbBuHpZRuAdqcIniVPMWMk1blUt3PKTTmmZ8Q5QsieeU9f/BF6HcHlqkd21uskPr6mV+1kMvKt0w9Xhr2Vxto0ANWz13XF4Q2X3wZsdqA36Pbi+PkMdSSTJGpzakXNSptrPmu4O6xk3Bmf352SzM/ro4QnhtGP5Op9RxS6ToqcuycZ1mmxAxGwIDAQABAoIBAChSm2O3ObF64MEMWZ7aPkPb8SMgXvPsJt5Y3Deo0kRzS53Ndp1exuBVmZCpy3na73I1M7nh9nOTbxsZgYrGIJ9hd+taxzrdFPHahTHsCX68bFDbNzix1ZoPZsjzrK1RsZiwJYoQ+eC86lyOjMQeW8OTB4HIlMNI4tmkztKTI+1f9MVQYXZnJwgkQGTOnynrlj2LGCDABvUlJegkaY1jBd2K1aBnTpSbZzL85U7VyegeGBm6dt6K80ZLVHrFbvxQLefHMWPpRUoGR0oNDc8LhGczq7lX03x+9xFp5ncjR5K/42LGVDNQ2hi39bf1oKAKXf70uuCiC1A5DSPSpP43j8ECgYEA0dHxXWHxxX2aofmXkiwqdIwH6XuREWG3xvEnBJ3LkHhzvVpd2+rUVhI8c95Ct7nINSLEeJSKe0L/8wAG7WtQJOLzRqlJK3EMO7F6zu+ug8Xs2LbTfvVn+RmLXu0lm3Yq+wHs0CoAThHHFMAsPdrXhQ4muWoBwPQT8nFWo8cWKqkCgYEA37hLzhVP8bjU9mjrCBVU7JJKAnpHUjONnDBKCK7Css4tC7gCKZ+uwQBfv1/TH02ytwxHzHTj0c/l0VlCuoKVYNgcp2lSB2CTafh0YcXzBFJi3TAzK90vYT4ArCqP4azMDfQw3sQvvTXP/usui6bUMGOPRoeG8s6UV4oMxKj6/CMCgYAFKtR05kqcAIHkZ08yTGAnSqOPPnnOIcfy4FGDrZcr0auYCDeziM7956kReXHPMIYbuOV5yr62VmoTQ/bntfLdVbGEFfs1VK1mcvKBUinMGP3CQI5o3AZZfiWOiuyYLYrVb7CzV7V2Nr3eZvUv+MnB/x05B8FPTTOIjv4BPo/vMQKBgQC5breedHnUAIC8UVBmXdALWmHv1cyh7Ms2p6vlsHz+2ffqW7WnLI0buiSiqlmC+9Li+FHWvRhMQwbZVCQEFdKc9+QgOyLbrIfjcSV+GSYJ8gOyFI6FkAsCjfLewVSLGL/13O5Y5sIvEZh6UhM9e6UrCoqqShFn1iSMvodAxlNqgwKBgQDGkdo+cx2LYkJIj/BTLQu5HKjv6XHUBafuLfMr/t38xHM86ABrH0eFwpqIydY2x9o7gNQZ8HaBgSvGWkkI0Kq7qiUWL3n3Fm1xkHJMJJi4GNhgVWkEvKuG8ZTo/mDS1pJCFEPpISI2t4yzwJlq+Lo1Sjr4Opz0t2zdJnpE7iVk1Q==
types: types:
- tree - tree
- file - file
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV - peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA== signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA== encryptionKey: MIIEogIBAAKCAQEArE3UxyKsK//jjgIkeKGG2los7pW+I9Dm709lBErXY5DkeyTVXPDF2jaarJ60d8GAMfBjKnS+Lg/9z95FAHuE56XX2YUF73RRXBM7nz9octaKpOn5xqwrh1SXojaKn1pxLtE8Dr6GkoCONPkRcavv341KA92eanVEXMLt13JrwgYOcnmK6HnnD8B/s19iN3srRbDIdknm9RPiSgSs5wVlji19rGs1G035mybbG7kEAlQeW1nG/zE6urejLHHYeRpUk41jVCzYTnRzf1BYZMFBFIZb2EqrnOK/pZrpRQTy+9ULAPiIxnzGjkB52w7Nx/bxt0gm//riZBr1I0pgNPQl0wIDAQABAoIBAGDZOqFX3ti4c0pt79wSRr9S8nCEoKR3FmcrBEe+XYTse1CwanFcMImwKY6fgibSD+GCEetaRU+U04BUmgpkY1blhAcS2zw18ElF0jx3opjx+GorzaabPbhKlxSpfY+GgZnkJ9LNysxsEAK8gM6Y6zKHszOrDREfqvZM5u0ztlgOrSYxst4Sx2HIc2aqLc50H2x3BIT+O0xIXg3/cPG9OoKz2iMRiPn9dqLiqEFjFdfRk/uxdEC3ivOHVYuEADEoNZ0jKbsNPlGXFQXWMQ0FqiFXBs1U8T9qcSB7OzCFp7tWu+f0XqB9+MBX57s4Kz4Ijkeycd/tlB4v3C0HjGlJJtECgYEA2lZ2dQBh3O9rOJcrQho0mmGeKPQhAlMZD4F1SvgBhY+AEe2N/yu4F6/RVZPrhJPrjwDCGbr41l5sQlpvASwaOPGio0FEFFzlPKSv0njZST9vRJfg+1fPb9ZyYjLNIDaz10A3RW+U+Ll4I3Vwsejb8nP5Zo8C8zzvLaiu7lj882kCgYEAygaS5FD6jnSXJrCWBvdvmM1meezfHywKo18FYQzAQRgd/ZUEK2IBqlku7gtR/voMqSRHYdzjmmK923zVdKTjbcYJB8OGXw7wdHD8VY7nCSocFih1ptDjaWs1JnenkCimlv6VQSpMmS+vU1oolQOuqJ1HOK32Hrss5wtjhpdCM9sCgYAxgaFibi/CdNcPAdfhKSf8SV4fUxuY91abWXNLCGjv69XSOtcToMohNNB2Yw/oA9JJnpZkVyzNDqPld7PrxCA+ASwrcEULiPTBh2YGhzhdj3CfUQDGfOagKTPOaE5ym3Szve/KYr6YlxVSlPJ0pKQamYlXY937YTmqVLE1gh/44QKBgENwQFaw5YLqTo6eweYfcQRMBJpMxQqN1BtHG++SpxbTqyc8OEEXHUE1NiJGax+3bsSDlMSJTPz7Wy9Kk6K1bCn3wonx7ggLX58vHDyfUGZRxUBsTyHZdyB4pixqIuhPeZTL9Rzktt8n+NnVLdjYetRUdDLqd0844jtaJOYH1hSjAoGAR+1hWZsyHtyAkmiDJQBaYjDDNZbiteFFWq+RCioeAAmYrwsaw5Nga4nkjrKMtD63j3aXALNOCMd2sy6aWqaZXHCyVrAdwL1g9fJ8Op7Qi6cP/c4fSVGRBIPEdcsEpxkVCSkr0SeE0cMI8KWu7INj8YC25fxwAqJvT78EBNFiJSM=
types: types:
- tree - tree
- file - file
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 20
storage: storage:
path: db/client/1 path: db/client/1
metric: metric:
@ -46,5 +46,8 @@ log:
production: false production: false
defaultLevel: "" defaultLevel: ""
namedLevels: {} namedLevels: {}
stream:
timeoutMilliseconds: 1000
maxMsgSizeMb: 256
fileStorePogreb: fileStorePogreb:
path: "" path: ""

View File

@ -5,39 +5,39 @@ grpcServer:
- 127.0.0.1:4631 - 127.0.0.1:4631
tls: false tls: false
account: account:
peerId: 12D3KooWQpz99Dc9Z2sCsXBjUzRbWtiXJ6oV3rZDccqUwTjop89Q peerId: 12D3KooWGbD67NNDJMaqL2BU2egSZ8Q5iC6wMBGfkBF6JFSFESUc
peerKey: jac8YPezUIiHZ5leof47XxiwwBWpPLnAg9fIVkvkPqTfB/pd44QRIgBwilG9/PLspWjEe2PifvwU7Gjsz/nI2w== peerKey: 3HG1rOuaqMCfiT181Y5FOMbJ65XFH3aw105KmYPunCdkov3FtEqc2+g0POkGGmmXZyUQDWCbTp3Ur9yEUSBRTQ==
signingKey: s64C2pRvQVGrHWJhnB+otY2UsBQRe9tQjWpW2YWJX5bCgn65KvGUalciIW3bawsVXXcjVEKRUcSnsPh70xux4g== signingKey: B474sG8lSwkoifyuyv2JhfxNboC9Lu303z9XJZVtmqcbcff+kwDJ3WC9k5McixcQorNnITdWj3rMBJLQqS+t4Q==
encryptionKey: MIIEoAIBAAKCAQEAn4Yfcri3RetiOo6rc3wzUUciBMWS/v2cKJc563ralqhtUTdgTiNv82pFP8A4zPmOyLcn2qNkidPlRMGXHtuABbqBNGjViwIYykKkZaPsP9ogrPvd5zKDaXXJaLZODZC3LVmco37FxWBctaQvUcWwvhBRFyu6writC3k27hdZXfgheGjd461wPFUibAvpyrlQVA0i57O2yobkTsStITID88MTCHdKJuNXmSJg/hI1ABAzLIOb+lm2kuseCBJtu9d6DoJwDXS9+H51sQQhHYSph9YGYMpyX2MmbbR0HMQjOEy/1wlX8l/R9m59A7wFQsjdb1Ug9OI3BYrA5k8nO8zlLQIDAQABAoH/eEOlcdfQU+YhKARnPallBuGZw/8v0w1frTpVcDIumWZhA9m7wSz2OYzkqCtCp0V9X9S1Nx/3q/ET58ILLDhPTAJPZjOiyinKhrG3PulWMs0/1SoNIT/z0o36Sfcm4RM5BfeJH7lzYFpFiqs9AWkI1kF24QEWy7ZuvzejMdxog25dDMqFW3bDJYYS8IzDI+gNmgrNLxh32ST5Ugrjeq4SgUjfKWMGARWPzQk+x9fxzhDJkIXtRqL3SDQmlN9Jy+/p3NuCC5gKTIYcoNEsrTnKqDQQL+Hr8KY8MaywmK1CRWcp1lguheAQqmcqyWdl11dAdIe+sSG0jtYeN4RD+dV9AoGBAMaRFki8e0FprmKk/sT6xGtLimptBh2YPO3Rfooow7aCcCP0ZRDxGUs56aCla4Cg7BBoWldHaPPdgG0rxe/Tocu5AUjohH+s8OOAP0trZzE6gavJV1Uv9XPKUs+EDpATbjFJTFeBN4Im/3uBnOx1CLE0tEOkAvW+NI8zKRUYj+8nAoGBAM2qGh2T+6QQnSvuBEEUCy/3JAJ1gkmvfJpZcE4M5kaQr0iu64L4oYE/68HqcK+IPzSAGgafn4cgodOh59syMMJ+7W2S5YS84JdLZER15SOQ+9q8qVpvqnsi1oW6tcRKdTFinnf/AmRQzWdkLsTp88ew+CSl7VGbgmVcFtcfIH2LAoGARrOMUrPB00W00OzcxfhgDbAlBcXyAoGdWDRasQjYvths43B2t/SQxAdH12pu/6rMwv7VA/SqOwKoYrbOUJlzJ52lBne8DdXfI7IbV1hTsuSZHTigfvWHmQX2PGtR4Bz7BFOL+jBJOm92UlyRKmR1hts0QE1avHNQNZjKzPck8MsCgYBwc8PXzGRZbuQhcwFMfCMp1N4RoiLdG2DsHF81rgPzLYVKHqqTcFMOkt7bps56i+rTT//rAzh88DDLwMk/pw/WKQS1Vw68J3I+B3EJpdTmP44WKfYHhusWbRQTBuYAMB4oJJ41SnAKXcwR7ktMTAeJdpAXqco7RuZjeZjbgx+GxQKBgDycT84wvDxoSz90iY+6pzzBQkbh6sDgy2IPV+nSXKIfvuhefZP4tawwHjwg7oscHv81J0/tkucf1k2VN3NyiqnYlT5Q5EgUxmyOiKw+jkrXBAjQtUgSzPAth0j/mMeQSCw+VrFLNJVGrc6g9s5gNrUFJLa2YnQT1c3PzeyVwlOQ encryptionKey: MIIEowIBAAKCAQEAwgbZCB/8lvH3hOjup53dF2qV0UAWZWWyp93g4oo4tA+04C+SCvr5oXRSHlSO5gf8DYWO9reUsn1GElUv7f2tmw4zZRRy0UV6VDG5/zI2PNNH25IlJoQOg9QCwYQvS7SEOlO1D7hZNvRM/P16d1ego+icQ0SR2Qh60iG1nIrpicoU0DVr/RBfbfVqr+dl7uviDsP9qOlnzwecZXJ/MsTxs4p+xNhddVJseXtuZE9iPSSDgvrHWGq3vgRRe2iBNWYst9efEX0dTZDnvMDp8DampLEAKMPgN1pX9yXx0oRzJbHzE/adytLGlMVDfwJVGdBMgHmZhzdhYjol/qAz0hV1LQIDAQABAoIBAA9o5dHMYI5Id2UZ7uJnGkki0PVGhsDU2+STLaowWiKK4M2xWYL/vdXB3EfGZXcFiVI1mk4j9G5cnrUUCPN441HeRdywTBIs13NaY7BN95rLGPjqWYL+l/yGWRWvfuYfVyUewtGVzZgcvQSWySQzVHHQJqD9ECxRjRelT7w4GCY2QBNSPg8IUb6AvaZNyrNvirKvhgty93PuvNcgBYr0stdfm6oDlMdc/k0WF4thY99ktGRz0h+k/0mtf1AAY1TC7/+9XgpV6tG7jIqH+kRGbpezSDG9vD0JQJoiWcy82ondFYYuIf6sxrOAuBxMRjT/AGkE2RSH5mOYh/nm3Ct3c2ECgYEA6OxbjVP+UG12zwp6G9vGXsBaUR9HQb2g5K85PBE1Ig7djpAInsc4jDomepjQ4JPtMZFZIXkTQZdnScO5/xFtRJ9/gOz8H5Q55TXUxyMabs1Gi+w0uNxxihu4be+HaO3o7orzVaARS3YwiEI/BBR70t8BcHHkrknpugcKSPt4a3UCgYEA1T/0wSMG56n0/DDwUFvtF8ewN2JJOtQPYQISRqxlFKTmPDaehbp1FCHNa7rsLFabz/5Pbxu7ps8s/ZxAhIsMMsWAT7vxHy+bqBMedeiq9IC2JxEJCAlWy9JUx3XeCm21eQmxlFyXBGB3VrSaqoV96rPZ7q8SUoX/SkFR2AjAA9kCgYBNsvrfbFN7tOhbLJ2LSYck+HmocgytK3rOjn1DQmI9GERkWDvn64E7lfJcFzomkHIhhOD8v4zi5oS4IKidI80VhTddZLC+QA4IHir6uwUITUXpS0RTHoZpkdG2Kp87K5H2cTe3KoxaZfTOn3qx+7tKnsW2IugsE8/6FHsj2W9UOQKBgQCKOm+7dan3Jqq/gjVz0XKJFI58CACx2l2xovcXyo2m6RC4fSsaQfe8OgD+0OZgAy/yjcUNn2tuwCJIriz//WXFz1HR3WB5t5FtTB9VjKCr5nasMhWpmOwjKE5+EEACgIS+VXM/WRkm5CTXFjCfUfKB3Vzpo5/70BHgHyEfKOTWWQKBgEXppcbkqPIfIcUpzPmNX83juTfLaYtGXQRDnN1kUvNGUhV6Iqi0eWvoPDHpJgcVsO1PJaiGe4E/WMZZTNj/maNPdaj7COnvMMGlUD8q0blHOMFFapbGAIDarTwYuwDsuDgCQCePq/WEzytQQlO1kSHZcX0gNFQ5T/ogrz9U6AAU
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8091 - 127.0.0.1:8091
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9 - peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA== signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ== encryptionKey: MIIEowIBAAKCAQEAuRemjWvT+g2tjcOJwfGh6LP2PvLsgEMyCzy3zTmqsR+tnSgPD9976ULEaG38qXNE9gul8EcxNlWf40FKNKfnV/z/zHjePF9PNx/ZbrVAiL+5yh5J4cQAQQNTTAgf3hIvmCUm6PtA4AV+lAs/4KnOWm7G1xgd1HgJoN7hGFjGi7No1kpvMXzSSEJx8vTu7AVC6WP7Fp+UyD0zKTWrA6VqU24WzvbtUBJB7pf1hACnt1VsKUbFY18KmDPyGAD1cYNTO38L4D0RExWz9J5LM/wyGKd5zDV3T1+rYr1kNp+B7x79MsS7QInJ07Krd1zkn/Veg9NymQCMUMjH9MUZRbZGUwIDAQABAoIBAAqLtGueVyeKG/dVysWIFOeDSWZwxNTR/0nwnbBNttH8shGgNKt82jyCF1qz2Y92B9nU9BFqnP0xh7iVAbtaTa4PtitaP59E9uh3IhZSsWiZM+a2LxNz7WfG3roYRGiMtLWAeGUR27Jn3bxln7AXPLCeWynqL9jpNfM6f6y5ciaHa2Uj4wZdC9bEvB4SLh+pDwRfaMRg5ZJMXpi8kkR9WQ6i5GwyODEy31ub8LgnlE1+zgrlyUBGzmDpTriCYwkyajGrIY+Sge7QFMCheQ7G2svbWvrsqnQJB7AXfIZqaxiC4pqsqDMhkPCs1uWKKo/pUfrUYyxDAimhixNi8y3v6CECgYEAxLxSghaXaBYjrOnkzCa425an8UK5w9Vd/EkixqCSuPhA986KxUqym6YKT8ffzTqz7QcFcEXYML6evtGIJ/dxMVHsIZ/bGBKhXw2Bp1zI+Ml24mN8LQeBRSWoYHO9x+e7GVaLBMh1EaWd8JechskVuftTnCSUAQDtBpX66e2PX7kCgYEA8NlvWFCBKtwbjiH/h/mYu2ptQRnZ4+0d9AXWoNoePedQj+md51dMI/zpfoM0J+KSK8lG8bNBj7Ax0JAHTMBQJtfLde1IxtzwlzgiJWZ+qxGc/qPYmIb6hxHySA2L7I/TBEAZJ+FnZZ5CSFqsejev7tdRN6CQTZCZNFlNpIUNZGsCgYAt2Rl9WZh1WFt+C5AXh5qjCgwfbIZwPgRGLCEfmwI2exxg49BxRAQ1w885YoIkiN6viWhaDtzgFzxVie0qKz9E2CuodmGPzZ+v0Cz7/OKVIBZFkhu5PruAitMfjzmWIcn3kLSbK8Akma0iCaMfwjL/AbQtelTHmxih5UfxRjyYeQKBgQCREFWJGswBtZr/K6kODB6a20o8yMY9Cwdcf9u6/ET0wgr68xnBSgo5Ls6v/XR/hW7G4q9RSsd1NQl79hP/fWGJU7ZfK/EGnfJnEk82uZoXjT9C/AqsK7hffEaycT5S2HmfeL/uDkxJn12K2NpDrqDPuW5Yk+P2Y95y8kraiaz8SwKBgBiLtOMR9uGNLeEhPPsqbz7ASg270FICxQTRefU3ea5Ow1r2gdf7wTNNCIJGMtf3BMB7eaVLQOu5caaVYgZIKU7s7FejhGejYH3YLzvbVOQa0UW+nc9vltJ8tl6d2hlAC4U1552ZQppxLgN9d0R/X5eZyrkBm+A9ASbwbyaNjaX9
types: types:
- tree - tree
- file - file
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP - peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg== signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3 encryptionKey: MIIEpAIBAAKCAQEAt1zuRz2OVFlH5zj1wR3clRso1pqA9uOzKo4mPDMMq3na7i9mJuPeKdunuQH97utY1c6C3IEJQ5qV5LoYqPSe+ErgU1IcYP3LQrVOu72yvqqUKnsQMr/ztMYbkwzReokcZFsy+8gUxxDk9JOrWoErltJeTOE1bbvBzbBuHpZRuAdqcIniVPMWMk1blUt3PKTTmmZ8Q5QsieeU9f/BF6HcHlqkd21uskPr6mV+1kMvKt0w9Xhr2Vxto0ANWz13XF4Q2X3wZsdqA36Pbi+PkMdSSTJGpzakXNSptrPmu4O6xk3Bmf352SzM/ro4QnhtGP5Op9RxS6ToqcuycZ1mmxAxGwIDAQABAoIBAChSm2O3ObF64MEMWZ7aPkPb8SMgXvPsJt5Y3Deo0kRzS53Ndp1exuBVmZCpy3na73I1M7nh9nOTbxsZgYrGIJ9hd+taxzrdFPHahTHsCX68bFDbNzix1ZoPZsjzrK1RsZiwJYoQ+eC86lyOjMQeW8OTB4HIlMNI4tmkztKTI+1f9MVQYXZnJwgkQGTOnynrlj2LGCDABvUlJegkaY1jBd2K1aBnTpSbZzL85U7VyegeGBm6dt6K80ZLVHrFbvxQLefHMWPpRUoGR0oNDc8LhGczq7lX03x+9xFp5ncjR5K/42LGVDNQ2hi39bf1oKAKXf70uuCiC1A5DSPSpP43j8ECgYEA0dHxXWHxxX2aofmXkiwqdIwH6XuREWG3xvEnBJ3LkHhzvVpd2+rUVhI8c95Ct7nINSLEeJSKe0L/8wAG7WtQJOLzRqlJK3EMO7F6zu+ug8Xs2LbTfvVn+RmLXu0lm3Yq+wHs0CoAThHHFMAsPdrXhQ4muWoBwPQT8nFWo8cWKqkCgYEA37hLzhVP8bjU9mjrCBVU7JJKAnpHUjONnDBKCK7Css4tC7gCKZ+uwQBfv1/TH02ytwxHzHTj0c/l0VlCuoKVYNgcp2lSB2CTafh0YcXzBFJi3TAzK90vYT4ArCqP4azMDfQw3sQvvTXP/usui6bUMGOPRoeG8s6UV4oMxKj6/CMCgYAFKtR05kqcAIHkZ08yTGAnSqOPPnnOIcfy4FGDrZcr0auYCDeziM7956kReXHPMIYbuOV5yr62VmoTQ/bntfLdVbGEFfs1VK1mcvKBUinMGP3CQI5o3AZZfiWOiuyYLYrVb7CzV7V2Nr3eZvUv+MnB/x05B8FPTTOIjv4BPo/vMQKBgQC5breedHnUAIC8UVBmXdALWmHv1cyh7Ms2p6vlsHz+2ffqW7WnLI0buiSiqlmC+9Li+FHWvRhMQwbZVCQEFdKc9+QgOyLbrIfjcSV+GSYJ8gOyFI6FkAsCjfLewVSLGL/13O5Y5sIvEZh6UhM9e6UrCoqqShFn1iSMvodAxlNqgwKBgQDGkdo+cx2LYkJIj/BTLQu5HKjv6XHUBafuLfMr/t38xHM86ABrH0eFwpqIydY2x9o7gNQZ8HaBgSvGWkkI0Kq7qiUWL3n3Fm1xkHJMJJi4GNhgVWkEvKuG8ZTo/mDS1pJCFEPpISI2t4yzwJlq+Lo1Sjr4Opz0t2zdJnpE7iVk1Q==
types: types:
- tree - tree
- file - file
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV - peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA== signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA== encryptionKey: MIIEogIBAAKCAQEArE3UxyKsK//jjgIkeKGG2los7pW+I9Dm709lBErXY5DkeyTVXPDF2jaarJ60d8GAMfBjKnS+Lg/9z95FAHuE56XX2YUF73RRXBM7nz9octaKpOn5xqwrh1SXojaKn1pxLtE8Dr6GkoCONPkRcavv341KA92eanVEXMLt13JrwgYOcnmK6HnnD8B/s19iN3srRbDIdknm9RPiSgSs5wVlji19rGs1G035mybbG7kEAlQeW1nG/zE6urejLHHYeRpUk41jVCzYTnRzf1BYZMFBFIZb2EqrnOK/pZrpRQTy+9ULAPiIxnzGjkB52w7Nx/bxt0gm//riZBr1I0pgNPQl0wIDAQABAoIBAGDZOqFX3ti4c0pt79wSRr9S8nCEoKR3FmcrBEe+XYTse1CwanFcMImwKY6fgibSD+GCEetaRU+U04BUmgpkY1blhAcS2zw18ElF0jx3opjx+GorzaabPbhKlxSpfY+GgZnkJ9LNysxsEAK8gM6Y6zKHszOrDREfqvZM5u0ztlgOrSYxst4Sx2HIc2aqLc50H2x3BIT+O0xIXg3/cPG9OoKz2iMRiPn9dqLiqEFjFdfRk/uxdEC3ivOHVYuEADEoNZ0jKbsNPlGXFQXWMQ0FqiFXBs1U8T9qcSB7OzCFp7tWu+f0XqB9+MBX57s4Kz4Ijkeycd/tlB4v3C0HjGlJJtECgYEA2lZ2dQBh3O9rOJcrQho0mmGeKPQhAlMZD4F1SvgBhY+AEe2N/yu4F6/RVZPrhJPrjwDCGbr41l5sQlpvASwaOPGio0FEFFzlPKSv0njZST9vRJfg+1fPb9ZyYjLNIDaz10A3RW+U+Ll4I3Vwsejb8nP5Zo8C8zzvLaiu7lj882kCgYEAygaS5FD6jnSXJrCWBvdvmM1meezfHywKo18FYQzAQRgd/ZUEK2IBqlku7gtR/voMqSRHYdzjmmK923zVdKTjbcYJB8OGXw7wdHD8VY7nCSocFih1ptDjaWs1JnenkCimlv6VQSpMmS+vU1oolQOuqJ1HOK32Hrss5wtjhpdCM9sCgYAxgaFibi/CdNcPAdfhKSf8SV4fUxuY91abWXNLCGjv69XSOtcToMohNNB2Yw/oA9JJnpZkVyzNDqPld7PrxCA+ASwrcEULiPTBh2YGhzhdj3CfUQDGfOagKTPOaE5ym3Szve/KYr6YlxVSlPJ0pKQamYlXY937YTmqVLE1gh/44QKBgENwQFaw5YLqTo6eweYfcQRMBJpMxQqN1BtHG++SpxbTqyc8OEEXHUE1NiJGax+3bsSDlMSJTPz7Wy9Kk6K1bCn3wonx7ggLX58vHDyfUGZRxUBsTyHZdyB4pixqIuhPeZTL9Rzktt8n+NnVLdjYetRUdDLqd0844jtaJOYH1hSjAoGAR+1hWZsyHtyAkmiDJQBaYjDDNZbiteFFWq+RCioeAAmYrwsaw5Nga4nkjrKMtD63j3aXALNOCMd2sy6aWqaZXHCyVrAdwL1g9fJ8Op7Qi6cP/c4fSVGRBIPEdcsEpxkVCSkr0SeE0cMI8KWu7INj8YC25fxwAqJvT78EBNFiJSM=
types: types:
- tree - tree
- file - file
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 20
storage: storage:
path: db/client/2 path: db/client/2
metric: metric:
@ -46,5 +46,8 @@ log:
production: false production: false
defaultLevel: "" defaultLevel: ""
namedLevels: {} namedLevels: {}
stream:
timeoutMilliseconds: 1000
maxMsgSizeMb: 256
fileStorePogreb: fileStorePogreb:
path: "" path: ""

View File

@ -3,10 +3,10 @@ grpcServer:
- 127.0.0.1:4530 - 127.0.0.1:4530
tls: false tls: false
account: account:
peerId: 12D3KooWJdzYSrwqKT6zWeS7UDGBwASSkagX6tfWjHP4PoKA6p7R peerId: 12D3KooWC8Qor52pAFJDUS9hKoNk5g6ZvwhBEmNnUszrj994MDRe
peerKey: jjgPiYRm+jHkWMucfm3z0xdBhD4KFlcEVOeePBE2iA6DEOv+XZGd8+E10wzIgkzddR/H3Aj097VTp2XQvfmuKA== peerKey: s/GpryKJlVqj93EhD5Rnm/lT91mstoN2qyS3rMeTby4iVtApTxtRNTejZG7LB/dxTnaGVNzgXxqKtC56Z3G4lQ==
signingKey: jjgPiYRm+jHkWMucfm3z0xdBhD4KFlcEVOeePBE2iA6DEOv+XZGd8+E10wzIgkzddR/H3Aj097VTp2XQvfmuKA== signingKey: s/GpryKJlVqj93EhD5Rnm/lT91mstoN2qyS3rMeTby4iVtApTxtRNTejZG7LB/dxTnaGVNzgXxqKtC56Z3G4lQ==
encryptionKey: MIIEpAIBAAKCAQEAy0oPQJI47puSNmKiTZFitSLTGf3NPZw7l7ee+1P2BU0ZGsRIdJ4U/vebpNpnnpgQa2qV8Z/gALON3YUSUSYg15qfjFGfGvm31TOTd29RptonfCOczkNN7qteZwmNt0BYx9rKakJhYl8nNF4no9vIqk7FVZAOIHSHNnHIlSUpdXSCakrJxx60/JQrPtLnUSKwwlBNLAPo4sKl8Y7sDjDiQ8dyWsj4KDbDj0PLjv4Zr9xk4rm+OAv7lI139T2e3pJ42QUWNw1iC42kgGzfKpGg5xbYdjfb6iO0y82hu6qo08sfP86n9h55s2FwPf1QBJimbVtklKccpu5bmFEkHGkZowIDAQABAoIBAQCR8cdlahSpaNLdbI5s9bVRqYC4pjdUxfcagt8GPE7hm2osh0IlRuB387ev8IR3nWAcXdbsMwUUO9Pbdw+hZqgpYX6ttGNvcFwEGhUCp86M5Q131/FZO4SVlj4d5wPwzadvQ6oSAzn676krtXTr9HvpmMefF96sejwgYCvKt3U+Nm9c2OSsJ/q4nr1dq957kt9+9r6xiGCw/CtVCiO3MhXdAJGjDiGs9qDao7Q92eJ9nEEOxDXBZ42kcieVsT8q5tjU/JW7FeEsoIVvVEkoe8cmQ3HgyfpFQ56Vo/ANTmG+yOiopQchpxLRR2gHp1pNL0ReQnITTg4KfYFflMR5dpWxAoGBAP71t1b87L30AY2pzUIBeGEhk0vq+agQVx9ewjowoZ+rVqbP2CNYo2wBoQ/ZhUSnquW7DvQDMpOV3seupCcs1i649g0TH4fbHMr2VZLFOKpg3aS9dR9S0iR6FyKJjN/OOrQAwLk22B3Wr4wqoScqZNVtDPHUPcp2KCVYBSh/2C81AoGBAMweYMBn3IwMg9OyPpczQXqBBtdmdSKpEEct0S9Zkopuyu10BkEJo/W6SuN8Mvp9oNaNz1nGefnWAaRngJNd0vKJXg6jN+zIq9zb+BB23M0H5sfbj+79bOZ3J7ccnzitDpPT7u5O5Re0uVO9yXhMmMWDKJZ6jEnicqN6qtSWW4h3AoGAZmGrbs4AD0NFwGpYV1IZ0f9Wk9zWxgtRwPIfUpimvmRiVngOFhuI/F0nHSM/JdOih7/3ADuseqFrJYpWtriFhZuWiqeMONTfGg2TTW3PFHPzbSz7NEngwu8YDTFpFZJN9mx696UzYcANHF8d+YlHloDE+vM8oOmTs3NGFv5HhKUCgYA7SE9dUkzxt+jJoSkgjNhllffAs5ctm+CIa7wnfmJbJlZ1pI70cLJX+eUqMLY1nisKZWFld4mRkCAl+ZGUO1m66z6QDcN+V8HigViIn5z9R2A1h4VEKgJo5Q551ixAL7LeKF1qhStwOSLiOWq8L7LnGnK9UZZRFx2ocUYQPCMVfQKBgQCBM0YutMekCc0VUUlJvN6jq5S093xeXrjJFQ8qRwnRJL8mF8+XLPS0jxGlV4f/2NkrxrFIhXL0J6MsADwqXf84iuwyMHPBP3vFDoOhtTgw8CBq/JG5PwXOhiRIRrtd30HrEIktEMVMWbOJ1uQHfTO93sjySZR8J1oTJvImmuT69Q== encryptionKey: MIIEpgIBAAKCAQEAzifgvj5Lg3NbiUPvEO5W7CtEKxUXsGfbF+HBOUqG/w8XrOs+f7gqapttz+qMyehBgQfFDdG/R4oOPM9aOe+mnMmc5KHjjz/zSSSOOWv2KFaXc05KYG/LVjvZIZz0ahkTbfU8H+MILQXNs5emHuwxFPCdAeg7N0u6y9JWvvNZVs593Hir5VTryhSdPnYyDl4nej0uF1ZHF1NnEUV+rOPQ2zGd4GfbjRGfJe/xe7wwVgS9uaUHEcQLQ/AZDJdwsqhT6/dgSjx2c9bEVVVYXG3JR16MOq1is9NuAPFwP69rPQkjKhvvJm/1FOBpkNrFek+gv8Ybn+BCcPs2/FiGP8Hg4QIDAQABAoIBAQC7rnJcwDnfIlZjUQWEVHet6nXVAw7d+q7rvws6LS9ZZVQYiNINVIzJIVeHwfEKn/eCkKBFRH7vkjAEDIIH3LXCZ4n+W6Pf9kh2fmE8xZ0EfFDFGLF9uklT6Ih0oX+iV9HoeSqTnQ0EcBQlPBpwbHcCqUtHQTUn0jns9UEj9kePTiq0sBDT7IGxQVptaEdBwZwl3L9wDCmQMQgJFJ2LTP+Y22C8lBUj/fvfrkkp4kBgvlcu/fYfbAbS0HueoymAjQ0jYpHNAnVKWj1SCOXCPTc1Ao33MJkZl11Uas3Kh9dC/QNO5ncZIerFi4Ev01dg+VpkaI7mkc5COeF0MAK5jHRBAoGBAPdzdZueLJD/yyVarilxLOQWlnh/OkwotmtsRSHz8hheKAx3jmQgdL8cpWUmNdqGmRlFmazKRGOgeXcWn2l/K40Oh8bfRHlQuYwmpoI4HNg5o8s7NFe7sjIOo4VDXQNW4ApTNsjhNbUgZWOkdcUhJvvDMQu56MVbZYeJDQMoEI23AoGBANVHMHypM+6+MPp4MYfID7OroMhZhLNYOMkkgDsVcNDVnm5dBVPCe1+8xTCUxaf5B08hpBRVxNQPjrxlMFsTrH/PKGLF+1fFM5EZ/gbEiP0yAQo09UzUopygGBYByjHBafIAHMzAR8HhKaSHC8rrUFg+ixfvKbhzQjCXZjANZgYnAoGBAOX+6QdVg3LabgUwPcTDLshpvj4NczAqfzNllPQz+4durKa50R17lUe05n4Xf+K3TEHTET0rW1mGZJ+t5Ul3LBGVudm817Yys+NyYT2Tziujl3xkcQhCqyQfuxk4PZHHA8JVCgy4VuUdUV/GErjBUaycBlAx4greIoZReki+ynQNAoGBAMwvfp0qhLyhu1RgM9Mx1s6FlsWY5nGpGZyAZH+sVDiq+yXfypTZEbKjkAmltOHOiY/ZvjN1tZ3sUxPMsJHRcQlfs+N0deAevPLC9q9WA2ycLeCuuNXYkOHwZ37SMdiWui5kqy3fPBPC1FJetAyOYnpJTnMYllGvjwPkPoHsoetrAoGBAPLmBvUxfspXCfneA07eBPsHfGsiX+awUr8Osm8LY5+AQSxRtwYGc/42QwgoHGjNXS5gORvZqdMvO1FMQuvtuceHn13+C6ulh7kAzcRolbDxeWQYZQM5UMxfNgN7yACv6Y4Zd5GPLDFNGpDEWV80/MRlU3kSBr5wVrLNFQ0HoMGS
mongo: mongo:
connect: mongodb://localhost:27017/?w=majority connect: mongodb://localhost:27017/?w=majority
database: consensus database: consensus
@ -17,3 +17,6 @@ log:
production: false production: false
defaultLevel: "" defaultLevel: ""
namedLevels: {} namedLevels: {}
stream:
timeoutMilliseconds: 1000
maxMsgSizeMb: 256

View File

@ -3,10 +3,10 @@ grpcServer:
- 127.0.0.1:4531 - 127.0.0.1:4531
tls: false tls: false
account: account:
peerId: 12D3KooWHrxbA48bJ23sK2T5cYWDFsoFtG4NPmcQQykXfjQhEKam peerId: 12D3KooWPdz2uVWaXGWj4JMEvThsc2oYYTwGSjv6wwb9CWjaXxFo
peerKey: D7vuDE5ZNrY9k4m7BP2nbslmD/LnzqBgByjGWJw54sB3h5Otv6oy7IB323eBi08Mm/2/zNPdBg9vAF3RBEA9lg== peerKey: oTN6YSZGXx6afomh6gNx5js4z5TPkxvbSkFG1LW/GPXNWsfUfdvOOIQQ/rIoI3WVjmnr2gusRLD8e3wCb/Se1g==
signingKey: D7vuDE5ZNrY9k4m7BP2nbslmD/LnzqBgByjGWJw54sB3h5Otv6oy7IB323eBi08Mm/2/zNPdBg9vAF3RBEA9lg== signingKey: oTN6YSZGXx6afomh6gNx5js4z5TPkxvbSkFG1LW/GPXNWsfUfdvOOIQQ/rIoI3WVjmnr2gusRLD8e3wCb/Se1g==
encryptionKey: MIIEowIBAAKCAQEAusKaR2QZwH/v2cdbuLiSmgiJ0f3b4/NqKpyq3Bc2r0rrxrvRHHagywRwwNAy+TsyHRzVys3pgZTL2iWBzxGn1gvAhPv/EFSm24KJObx/GIG+fzefvK7SRJz4AWt8x2ijSLZFA5kqXLE2Gkl7GqsG1vK9SzPIvsKPr/Nt7sj1DO0DFu0taRxS7lmK1kGt3dw4rkkb0iVWQ3QDoYnABdKnKVqiaJc0mFrjndqvozC/qWte/VggSpJQ79I/Dklm+TQcT6bLByQe/iB0zVWnrCq6JRFxrqVsBBO47bDW94BuH1lfnLrrn5m46rT+TOwHRwPfZ1WxnPl1OJGAIAYPRTUU8wIDAQABAoIBAHDjPFo22ZIQQyzCYmDPwF23F4eFCStKcTv8oxKSPY3LnaTs1kN8OUk+D+Gcd5NLAsmyKlCCEsku5eGglkxSAb9SLzazE8QNRyacStJJbBGmKz2+o6FrktHCh+5jyHLIfxpuglzgckjBHVDaZb0C8AlxhJY2YPtdo3jZjfOuKOF8Qb8Y1SpJRBQJ4v/7NduPQ1SZ9Pm+yZmJ/UQ9M4m+Sav/pwtxnEEFS8rNUODCMTFlgYd6g53SyAo1/X1zlD0b7tr3Veq7OKqa5hB37sWgY65qiTQo/PC3wGbH0Ao+IMM0yhg6Lfp9lZ6qApMV/azDHqP3RUsD0ytkpxK4TyhzaFECgYEA0mkXXel0E6w55d8uhRp36kQzye8A8v6rP86b/lmt0CVA7mQ4X5/Z29h8UcaVlJ6IygI4afk8IY4OwdMB9E21otS5RdcKfz21vOGZoAqj3HFaXFozqNfSTRNlmh9YyIWY2TQHPvacrJIvg3p04uT0TKI7EQG+1CNPYpiqQHcsr9cCgYEA4zmwnIrLqJLMykrnOqi1PDRO4FvB10q0171Nen1ow1sMpHl21cfo8+r/jY2xmxOhb3RBDQcK837HiVvKcSc79tF/EqK43ErKsW/MoUu86KTgTX8HtTqflWb6ZrG6hFYvOtThSNNBUN7+HHOewGEtQ+jAP+OJHrDIWTgbs7Wt0EUCgYEAncyO57FzimV5rnnoq44kLJ8lr+X88kAoMlxDBUhAYH/v6FllJeH+QzBiW/nwqFsU/1sW7/MpM4kUbCxRpOS6ufmLUWNqze5748HVsv8H0QV53RUQ9SmW4JMRebrUnN4EubCZVpEhAxNHavVlv9wxk19/qMuEUBiDKtCPrnUyIFUCgYBGmec5TJro/uvoswtTm5XsZehYJ8p75Xd5TRVkyNCjWof8Fs2IsTu9hjfvOKaFo7zWT43iyVxqueqv0Dh/ngwwrXlJRgwgTpDaPv2a5FiHBKu5CI5RjiyFlGCbRf/JHKpCImD5asJxqUfVeUtLRSZ2YjxR3ZX+Vjl6F0fsN7gQ7QKBgHVCnFcLx8HLx9pTsIWxDJuYVwsCHEp9EYExp/68PU8eN4Q0fDhJ6MDzekG3HnrcrVRry7fSiZcepDs12/iWZsFfNnLAtAUzfDpsHOVq+QgSZfsoLdxGYGdl2gW9NvKmS6YYaWsgHrswbeb4Jh4AIrs/Acs4t6/Wf33DWmQEQe5x encryptionKey: MIIEpAIBAAKCAQEAyJ30yhpI7q5YmaxsZ1TyWILsY3rD8LaFkJQMfC0GXq75QNmbPQvC94KAdiETsPHne7Rl8p6/Gp+4vdAzcYinG8EarnCpxAK4AgIUMBTn3tzIu1Yak9JNJUbznhzJTnfCI3CM6zM432iwbZVCMQ43HkIGcT3G25Hiv2QHWNnZvbKnlm6MUsC1E520e4jvhlwvgD2RF3+eXojThK2JIvm30b5KTbSjmgnpjd/2QTR4eFpF6MlQ6nOnA2GzJRPyAln9USCl9du2c4KaIoCp18e+AVN3EZk6DdRmzHlp0YqtrfECLYYYQgV4V3UXtBA/bx8pU7rY9vm6HZmxzET2hpS6kQIDAQABAoIBABOxNZMVC22qXXYQL7/g3b0EdPG63jrln6y2a5dQ0BxBLqRH9+4BFo03GSb/TjCDPkatSYiMPpP9c6PmKPaPBGA8D0NqOa/M2IUR8StbEfuVTnrdE9TIwtvS4Bz4FGaIaN0TsjFwILgFTbQj/5BTJePpdTpuZvOsmUZSKkp1b+Mn1r+/XnCPGRInvPcWR1I6EMv4oEIdhdWRhVGH/pfeLW+8uUCcOZ32tNuH5W5wZ8zBGjoPSqtcXwhuArY88yOemGnDBlQMKnWRwy0NZVAnQFLKTGnxrszMW5kgVtovKn5yiZNGR+kSDpcRder3bBzgsuIEJi3lnr34y5v3Vbb1r2UCgYEA4YaRvAuvD1k6eNL9NK+DNdbgOePvdYVku7jcvoufSN08go+SD3CRiHnbL0tDHwCW+cFJpzlB4ani0hMPEa7ufiaESQajFou7m7WsxPn+l9aFFLiC/q6L3RUVGKfTigBaF5QH2KEhGuSyW+l9QJgdaY8/VvyukXZK7So4rK3TzVcCgYEA47m97OSYXhZcbF/KjLJrf7BkN0vYv08J88ef6xvrPA+Z0RTKBrlGml+PGv53IU+dIo/wfe6EP/cfAgK2Japh00dJEaPKVULHe0TPqUWMUtrpy2+56wwQ7cfy8UbDzpKHHfE/FjpXlaIxrporkMuX3VitUrMb0T2XXtjtYW7sXlcCgYASeq5SVDrB7TPHVrJ8sKz1qmexFqY2YPnCEAG2c0ZX+BjPMehr73NdVW7KT0ZuseOtD1NzqlNlpD/7qqgfcNAF8i4AtdSDMmvq9FX1xe5AjslUy1GggLjhIqsZ3BaPRjwblnuWGo3V4EtlEJq8wjoWvjAYdpfvP1wgVsdSDuQ9/QKBgQDADp7Hc+OtNl6sZ/2Du9Y90p4ypJ0ge6CBIRMWTm2OMfogA9B+6zNIbt9afNIsHeEAjTTegJK4/8n/ABpumcv3TF+rqN+0GKX0qIwazrUSC96x3ICIY5zDbabPJkdtqNabwiLatEm5wRj1kMC9VXe3DlrfLH+BcNiA/aL2UX638QKBgQDYuGxqowg6Vguob2FAmaXQPR6iUJ0RG6IrZZXnEwrPdHvr63IGQzHV88ngG6zmG5etm1OIAbUVgHdcJ+5f+tipYu/2BweWXz26oA0ed4zSMAQvSN8KAjYojuI/2feddv2X67tF58Xla8gsK+AKhUEmEsuyXUXgtrXtx3ABI5vniQ==
mongo: mongo:
connect: mongodb://localhost:27017/?w=majority connect: mongodb://localhost:27017/?w=majority
database: consensus database: consensus
@ -17,3 +17,6 @@ log:
production: false production: false
defaultLevel: "" defaultLevel: ""
namedLevels: {} namedLevels: {}
stream:
timeoutMilliseconds: 1000
maxMsgSizeMb: 256

View File

@ -3,10 +3,10 @@ grpcServer:
- 127.0.0.1:4532 - 127.0.0.1:4532
tls: false tls: false
account: account:
peerId: 12D3KooWN2qtMAhoDpXL49iYQE5BTxbDwfAeZbwEAo6UBUXXdG3x peerId: 12D3KooWHcDN6uhcUukaXFwiRHs4eDac1HqwdkZ4ekFbgCUchHko
peerKey: N4dfL4wZUsxUqut/2I0h69+/5F3c4YRi7PIx4Whx+r21fo2KKMH7nnncZULK1959KeJu1jzuQcP9HdWvKhmCxw== peerKey: 9sKI3m0XUglIC8ATsRa7/2BMCxTPxRjZLqwOncWeOAFzwJIfwmia7HLIfkspSqLoWS6GRSdWtUJZ89FJmFMzvA==
signingKey: N4dfL4wZUsxUqut/2I0h69+/5F3c4YRi7PIx4Whx+r21fo2KKMH7nnncZULK1959KeJu1jzuQcP9HdWvKhmCxw== signingKey: 9sKI3m0XUglIC8ATsRa7/2BMCxTPxRjZLqwOncWeOAFzwJIfwmia7HLIfkspSqLoWS6GRSdWtUJZ89FJmFMzvA==
encryptionKey: MIIEpAIBAAKCAQEAvVOwhYbGUYrdOeje7ODF/RAkr9pXsO20tkimaW+q5LFdNiUgdSugG7e1lZWPghcBARrBsIPNVe4m412q3gbV8cB0ObNbONOJ3cnKV5o5x8MG2GB5TYRvdCLznqRP7ySzAconHRhZ9s6Ff7IT/Vex3bKr7Q8vRscIUMqNUWPnnvCZHwUcbhAgjwPpmcK5xfja2EPw8JupcBntg/cP/h6Zy/60G6YOgRiwnfWMV+Fhip3ALSMh8vA9bLXImJ3LUHE1hAYlQEPw2dPa+J+3lK4Ou/5qKMdygp2/YiwmJrseXbf/6qcySumuezK3NtDoR/AqA2bGEdfOdtl2G5xbUaN1sQIDAQABAoIBAQCais30sOcBeNDMjIIr6e6ze5H22cvq6J4yjWsJddWRiBYGNJgiDNJMzdCzobna/twbArRIWc4q7pNf1P287ueExwwYbYdxA3vuRuGcUJAJt/DGfzmFRS2VJ1KllIqLMvHL7C+xWEdXZ40hh0M58XOG/GnKwDJfG+h1ymFApsRSv7ri+LToTEm905JPESou8RzvsMxiaPtkzxNY0W4RbMchPU/RiR21I/iRYozaV+ylaRh9RAbvfSAg92NrN+rW7i9uJQSm65Y9dBlvxRHMiaOR/gpCeUr9QYOvoSzvM23K3X/Tj60HcsDUBeKi1fEd700JQjtU3YC2xXQV31IEgCYBAoGBAOdNvPB+LvedoWZKPhCOw5uavOYC+f34cWkV7eM8FJVnW6Y+MmoIKmK8nMyzWch9bESzwEHx2uv/TbmcFYJdf0v2voyTG/LxfoS3yRi9zbA0M9mMJcuejR6l4H9bWQev5TpIF7kdm1NpBm7WBRnOhWIueIgdrJgtlIuey58bubvpAoGBANGKmAfyK7nVuAl7EWJaVhNTXBuQ7BCLtPVnd2+WOr/CwRAq5O0aoZh3+e3xJlz/dd3BTH9cSvRogi9ckaxz4MTusHDXzXcvEc+EG/GjaEY0BRRhWhzZNZESfHDaAXAUGbKuAm9hcuo3xfVDAk2OWyWVsLLp1A1+fd4k+jJLzPaJAoGAErEFg6muwfPLBykYut3OkNSAT1YOPafGAmfzQVmpkCk6DsUX7dmbEz+KrEASEVGRXjvoXWvd9RQ8g7NJSa+kic72twVsTMWXI8J2TbmI1aRiTEI3C61UWhWtfp0zJJviOkN5J0xtMOBb1LkW0G8P+E8pDlbXi7SjPGUor0LeT4ECgYEAvE093jYkUTXb0rlDoAzqOSe6KBON8Dh7/+RhEmgAl37enDbPzrsV6Lw4XzlMblorg4JHylQYD5czFnireDwSCycsa9uiiq5D5SYlLnrYI+5veicaIb6YQqxII+nlTODjTwzMp2b9K7m/LW5wTV3WTuo8BivXIeFAHzc/l59Cq3ECgYBlW+VPH1CX0lXmO7A8Q7Ih2oIbASTMdoJUHg8tdo0PlDUKxjRP7ECUBaKLiCSaz01RKgonnUZTFh26iAqPs6aSLhcIxabq5jLDy2G9VbK0trEOYhn70cZ7j7Oev/8gAy1z4fGQLZEboA0S49LvQAT2iY01pHO84H7f4BVpIVzO5A== encryptionKey: MIIEogIBAAKCAQEAqf3YmlwMRpnvgQPH3d+oP5VDe5vtW2QlqqE4RpWOkYt3UOg6DHxyy9AKgM1cMcLJwS+SG5ovbj3IIAQlsL28Ao3xRX5cDqYLwt6MX8nuqPZyvzmYNB+eRiPUbEONwSUFXqELI2XbqCKtqoBkAl61AsasJpGgyPaTp/QPDPIwQspO+haYX0mO6U8zCbDgzqcvdbjlPQshMP7vbgz/Gqvj6w5WHwxazMbKwp6NVYXFVIXXvz+SCuaHPEq/TbttIR5p7JIZYl95kamN6j4IHKQqSdO6HAIje8uW9nfmsjD/RAlriNAa3TIdIRhqaMA7Y72qmhJgQqe8LB7K7DTBHaWeIwIDAQABAoIBAER0zX2cA/WKmEDEXQCkyQSR/5MPwA5FzkVgl2EVaUyDdZFHc9kDZNde+FvWV4JShx0dIyGqfd9PUgBSqzr5rXT55Gev8zKS+7mGFdGdaFbyqFMJxpl3Ai4Mz8apjbRyTC9He0zOAB89l+JJwfySVyK/DySZEL7dTakdR9JW1ciPOCUW8OJgg6oyYwz5PaVMQPSGctchtp8aDxE6kfOg+G22gnsVt8W3cQT0mUnZ6LYHSi1SiP99U4+cgAKYLYd+FbMRE4ffnVQUuheCahAFbDClVa5tc5rOGUXovPr18wzl8YEYwJsI2GpFlCbJMPa2PWFBZQFqJ2X8AKYW9ruPp4ECgYEA09dhbAHX8zPEBOHpP2PY3Y0XtT0eGielFJX0A6Sa73nqupYNrltO+sKBArZFuR1xVROVjvuc3y9YzeyZi9DQNd0Khy4REMFLDD9pjEGiAmIs6e0iaLpkMm3fNa0VxDjlb9+8g7nM/Ff3uR2tZA85RTfsu/21DkSSU+zg3sq+PgkCgYEAzW02PZRK+5h2fOzDQnMrEWqJXuSk9aV5YL+jT5ilrF1wbdBOftvxHMf05YF/p33toZaC6w/Y4AeDNl+71fzGCzt2b24+ECjj1vxD+o0ubJlW0xhq2GVayDWzb2mliCZKaQHUBSMl7cXPdh7KSco+NOOEVGR2H+V/hN4KlWYCRcsCgYB6SN8U4O+OlTg29U2WaQW7xoGD/nbM9Eun2XPVUoSZbpAgCxR0rIKn3/Vm4l7XH/bW/Iod0oLYltU1cbmk6vH11dYI+H+jY2D1/fjonM5vf8qbcmale8rxDVmG+5YQAiP3c3i3tV5t4D3AnzADDYKqwUCnuCl2xgCN77RTB0fQOQKBgHPF9Aa6d5PZ9hUrvlPJ4mDbYPYY+Br1GjX7awel6OD+fCl3d3WpcPaefpeF5zK3FuC1mazubnS75ygSxiKwZdDYv0PHprSmxtlXrNwdCyfrN3Ka1USFwqcJFMpaiQ71PYR2ok4O5AZgMC7K5Yi2sV5PRznksGoDhl2UYfSW2/sHAoGAQN5rnJzEHO1PEwnoT/uh2eMTCKJrEnQkJWl0gUBnxZpNQ5FCA2zJqBkC1b90jNGU9YBL4SwnIsoyKB4z6ejsVDUhxoQohkk2w59yvC+oJBd0rQqO2QGWFFp0xoQiWaEec2KrBEn32EnuemuVhwHVPvQwCtQHzh0Txl1wPW5Y5Z4=
mongo: mongo:
connect: mongodb://localhost:27017/?w=majority connect: mongodb://localhost:27017/?w=majority
database: consensus database: consensus
@ -17,3 +17,6 @@ log:
production: false production: false
defaultLevel: "" defaultLevel: ""
namedLevels: {} namedLevels: {}
stream:
timeoutMilliseconds: 1000
maxMsgSizeMb: 256

View File

@ -5,39 +5,39 @@ grpcServer:
- 127.0.0.1:4430 - 127.0.0.1:4430
tls: false tls: false
account: account:
peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9 peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
peerKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA== peerKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA== signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ== encryptionKey: MIIEowIBAAKCAQEAuRemjWvT+g2tjcOJwfGh6LP2PvLsgEMyCzy3zTmqsR+tnSgPD9976ULEaG38qXNE9gul8EcxNlWf40FKNKfnV/z/zHjePF9PNx/ZbrVAiL+5yh5J4cQAQQNTTAgf3hIvmCUm6PtA4AV+lAs/4KnOWm7G1xgd1HgJoN7hGFjGi7No1kpvMXzSSEJx8vTu7AVC6WP7Fp+UyD0zKTWrA6VqU24WzvbtUBJB7pf1hACnt1VsKUbFY18KmDPyGAD1cYNTO38L4D0RExWz9J5LM/wyGKd5zDV3T1+rYr1kNp+B7x79MsS7QInJ07Krd1zkn/Veg9NymQCMUMjH9MUZRbZGUwIDAQABAoIBAAqLtGueVyeKG/dVysWIFOeDSWZwxNTR/0nwnbBNttH8shGgNKt82jyCF1qz2Y92B9nU9BFqnP0xh7iVAbtaTa4PtitaP59E9uh3IhZSsWiZM+a2LxNz7WfG3roYRGiMtLWAeGUR27Jn3bxln7AXPLCeWynqL9jpNfM6f6y5ciaHa2Uj4wZdC9bEvB4SLh+pDwRfaMRg5ZJMXpi8kkR9WQ6i5GwyODEy31ub8LgnlE1+zgrlyUBGzmDpTriCYwkyajGrIY+Sge7QFMCheQ7G2svbWvrsqnQJB7AXfIZqaxiC4pqsqDMhkPCs1uWKKo/pUfrUYyxDAimhixNi8y3v6CECgYEAxLxSghaXaBYjrOnkzCa425an8UK5w9Vd/EkixqCSuPhA986KxUqym6YKT8ffzTqz7QcFcEXYML6evtGIJ/dxMVHsIZ/bGBKhXw2Bp1zI+Ml24mN8LQeBRSWoYHO9x+e7GVaLBMh1EaWd8JechskVuftTnCSUAQDtBpX66e2PX7kCgYEA8NlvWFCBKtwbjiH/h/mYu2ptQRnZ4+0d9AXWoNoePedQj+md51dMI/zpfoM0J+KSK8lG8bNBj7Ax0JAHTMBQJtfLde1IxtzwlzgiJWZ+qxGc/qPYmIb6hxHySA2L7I/TBEAZJ+FnZZ5CSFqsejev7tdRN6CQTZCZNFlNpIUNZGsCgYAt2Rl9WZh1WFt+C5AXh5qjCgwfbIZwPgRGLCEfmwI2exxg49BxRAQ1w885YoIkiN6viWhaDtzgFzxVie0qKz9E2CuodmGPzZ+v0Cz7/OKVIBZFkhu5PruAitMfjzmWIcn3kLSbK8Akma0iCaMfwjL/AbQtelTHmxih5UfxRjyYeQKBgQCREFWJGswBtZr/K6kODB6a20o8yMY9Cwdcf9u6/ET0wgr68xnBSgo5Ls6v/XR/hW7G4q9RSsd1NQl79hP/fWGJU7ZfK/EGnfJnEk82uZoXjT9C/AqsK7hffEaycT5S2HmfeL/uDkxJn12K2NpDrqDPuW5Yk+P2Y95y8kraiaz8SwKBgBiLtOMR9uGNLeEhPPsqbz7ASg270FICxQTRefU3ea5Ow1r2gdf7wTNNCIJGMtf3BMB7eaVLQOu5caaVYgZIKU7s7FejhGejYH3YLzvbVOQa0UW+nc9vltJ8tl6d2hlAC4U1552ZQppxLgN9d0R/X5eZyrkBm+A9ASbwbyaNjaX9
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8080 - 127.0.0.1:8080
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9 - peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA== signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ== encryptionKey: MIIEowIBAAKCAQEAuRemjWvT+g2tjcOJwfGh6LP2PvLsgEMyCzy3zTmqsR+tnSgPD9976ULEaG38qXNE9gul8EcxNlWf40FKNKfnV/z/zHjePF9PNx/ZbrVAiL+5yh5J4cQAQQNTTAgf3hIvmCUm6PtA4AV+lAs/4KnOWm7G1xgd1HgJoN7hGFjGi7No1kpvMXzSSEJx8vTu7AVC6WP7Fp+UyD0zKTWrA6VqU24WzvbtUBJB7pf1hACnt1VsKUbFY18KmDPyGAD1cYNTO38L4D0RExWz9J5LM/wyGKd5zDV3T1+rYr1kNp+B7x79MsS7QInJ07Krd1zkn/Veg9NymQCMUMjH9MUZRbZGUwIDAQABAoIBAAqLtGueVyeKG/dVysWIFOeDSWZwxNTR/0nwnbBNttH8shGgNKt82jyCF1qz2Y92B9nU9BFqnP0xh7iVAbtaTa4PtitaP59E9uh3IhZSsWiZM+a2LxNz7WfG3roYRGiMtLWAeGUR27Jn3bxln7AXPLCeWynqL9jpNfM6f6y5ciaHa2Uj4wZdC9bEvB4SLh+pDwRfaMRg5ZJMXpi8kkR9WQ6i5GwyODEy31ub8LgnlE1+zgrlyUBGzmDpTriCYwkyajGrIY+Sge7QFMCheQ7G2svbWvrsqnQJB7AXfIZqaxiC4pqsqDMhkPCs1uWKKo/pUfrUYyxDAimhixNi8y3v6CECgYEAxLxSghaXaBYjrOnkzCa425an8UK5w9Vd/EkixqCSuPhA986KxUqym6YKT8ffzTqz7QcFcEXYML6evtGIJ/dxMVHsIZ/bGBKhXw2Bp1zI+Ml24mN8LQeBRSWoYHO9x+e7GVaLBMh1EaWd8JechskVuftTnCSUAQDtBpX66e2PX7kCgYEA8NlvWFCBKtwbjiH/h/mYu2ptQRnZ4+0d9AXWoNoePedQj+md51dMI/zpfoM0J+KSK8lG8bNBj7Ax0JAHTMBQJtfLde1IxtzwlzgiJWZ+qxGc/qPYmIb6hxHySA2L7I/TBEAZJ+FnZZ5CSFqsejev7tdRN6CQTZCZNFlNpIUNZGsCgYAt2Rl9WZh1WFt+C5AXh5qjCgwfbIZwPgRGLCEfmwI2exxg49BxRAQ1w885YoIkiN6viWhaDtzgFzxVie0qKz9E2CuodmGPzZ+v0Cz7/OKVIBZFkhu5PruAitMfjzmWIcn3kLSbK8Akma0iCaMfwjL/AbQtelTHmxih5UfxRjyYeQKBgQCREFWJGswBtZr/K6kODB6a20o8yMY9Cwdcf9u6/ET0wgr68xnBSgo5Ls6v/XR/hW7G4q9RSsd1NQl79hP/fWGJU7ZfK/EGnfJnEk82uZoXjT9C/AqsK7hffEaycT5S2HmfeL/uDkxJn12K2NpDrqDPuW5Yk+P2Y95y8kraiaz8SwKBgBiLtOMR9uGNLeEhPPsqbz7ASg270FICxQTRefU3ea5Ow1r2gdf7wTNNCIJGMtf3BMB7eaVLQOu5caaVYgZIKU7s7FejhGejYH3YLzvbVOQa0UW+nc9vltJ8tl6d2hlAC4U1552ZQppxLgN9d0R/X5eZyrkBm+A9ASbwbyaNjaX9
types: types:
- tree - tree
- file - file
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP - peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg== signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3 encryptionKey: MIIEpAIBAAKCAQEAt1zuRz2OVFlH5zj1wR3clRso1pqA9uOzKo4mPDMMq3na7i9mJuPeKdunuQH97utY1c6C3IEJQ5qV5LoYqPSe+ErgU1IcYP3LQrVOu72yvqqUKnsQMr/ztMYbkwzReokcZFsy+8gUxxDk9JOrWoErltJeTOE1bbvBzbBuHpZRuAdqcIniVPMWMk1blUt3PKTTmmZ8Q5QsieeU9f/BF6HcHlqkd21uskPr6mV+1kMvKt0w9Xhr2Vxto0ANWz13XF4Q2X3wZsdqA36Pbi+PkMdSSTJGpzakXNSptrPmu4O6xk3Bmf352SzM/ro4QnhtGP5Op9RxS6ToqcuycZ1mmxAxGwIDAQABAoIBAChSm2O3ObF64MEMWZ7aPkPb8SMgXvPsJt5Y3Deo0kRzS53Ndp1exuBVmZCpy3na73I1M7nh9nOTbxsZgYrGIJ9hd+taxzrdFPHahTHsCX68bFDbNzix1ZoPZsjzrK1RsZiwJYoQ+eC86lyOjMQeW8OTB4HIlMNI4tmkztKTI+1f9MVQYXZnJwgkQGTOnynrlj2LGCDABvUlJegkaY1jBd2K1aBnTpSbZzL85U7VyegeGBm6dt6K80ZLVHrFbvxQLefHMWPpRUoGR0oNDc8LhGczq7lX03x+9xFp5ncjR5K/42LGVDNQ2hi39bf1oKAKXf70uuCiC1A5DSPSpP43j8ECgYEA0dHxXWHxxX2aofmXkiwqdIwH6XuREWG3xvEnBJ3LkHhzvVpd2+rUVhI8c95Ct7nINSLEeJSKe0L/8wAG7WtQJOLzRqlJK3EMO7F6zu+ug8Xs2LbTfvVn+RmLXu0lm3Yq+wHs0CoAThHHFMAsPdrXhQ4muWoBwPQT8nFWo8cWKqkCgYEA37hLzhVP8bjU9mjrCBVU7JJKAnpHUjONnDBKCK7Css4tC7gCKZ+uwQBfv1/TH02ytwxHzHTj0c/l0VlCuoKVYNgcp2lSB2CTafh0YcXzBFJi3TAzK90vYT4ArCqP4azMDfQw3sQvvTXP/usui6bUMGOPRoeG8s6UV4oMxKj6/CMCgYAFKtR05kqcAIHkZ08yTGAnSqOPPnnOIcfy4FGDrZcr0auYCDeziM7956kReXHPMIYbuOV5yr62VmoTQ/bntfLdVbGEFfs1VK1mcvKBUinMGP3CQI5o3AZZfiWOiuyYLYrVb7CzV7V2Nr3eZvUv+MnB/x05B8FPTTOIjv4BPo/vMQKBgQC5breedHnUAIC8UVBmXdALWmHv1cyh7Ms2p6vlsHz+2ffqW7WnLI0buiSiqlmC+9Li+FHWvRhMQwbZVCQEFdKc9+QgOyLbrIfjcSV+GSYJ8gOyFI6FkAsCjfLewVSLGL/13O5Y5sIvEZh6UhM9e6UrCoqqShFn1iSMvodAxlNqgwKBgQDGkdo+cx2LYkJIj/BTLQu5HKjv6XHUBafuLfMr/t38xHM86ABrH0eFwpqIydY2x9o7gNQZ8HaBgSvGWkkI0Kq7qiUWL3n3Fm1xkHJMJJi4GNhgVWkEvKuG8ZTo/mDS1pJCFEPpISI2t4yzwJlq+Lo1Sjr4Opz0t2zdJnpE7iVk1Q==
types: types:
- tree - tree
- file - file
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV - peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA== signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA== encryptionKey: MIIEogIBAAKCAQEArE3UxyKsK//jjgIkeKGG2los7pW+I9Dm709lBErXY5DkeyTVXPDF2jaarJ60d8GAMfBjKnS+Lg/9z95FAHuE56XX2YUF73RRXBM7nz9octaKpOn5xqwrh1SXojaKn1pxLtE8Dr6GkoCONPkRcavv341KA92eanVEXMLt13JrwgYOcnmK6HnnD8B/s19iN3srRbDIdknm9RPiSgSs5wVlji19rGs1G035mybbG7kEAlQeW1nG/zE6urejLHHYeRpUk41jVCzYTnRzf1BYZMFBFIZb2EqrnOK/pZrpRQTy+9ULAPiIxnzGjkB52w7Nx/bxt0gm//riZBr1I0pgNPQl0wIDAQABAoIBAGDZOqFX3ti4c0pt79wSRr9S8nCEoKR3FmcrBEe+XYTse1CwanFcMImwKY6fgibSD+GCEetaRU+U04BUmgpkY1blhAcS2zw18ElF0jx3opjx+GorzaabPbhKlxSpfY+GgZnkJ9LNysxsEAK8gM6Y6zKHszOrDREfqvZM5u0ztlgOrSYxst4Sx2HIc2aqLc50H2x3BIT+O0xIXg3/cPG9OoKz2iMRiPn9dqLiqEFjFdfRk/uxdEC3ivOHVYuEADEoNZ0jKbsNPlGXFQXWMQ0FqiFXBs1U8T9qcSB7OzCFp7tWu+f0XqB9+MBX57s4Kz4Ijkeycd/tlB4v3C0HjGlJJtECgYEA2lZ2dQBh3O9rOJcrQho0mmGeKPQhAlMZD4F1SvgBhY+AEe2N/yu4F6/RVZPrhJPrjwDCGbr41l5sQlpvASwaOPGio0FEFFzlPKSv0njZST9vRJfg+1fPb9ZyYjLNIDaz10A3RW+U+Ll4I3Vwsejb8nP5Zo8C8zzvLaiu7lj882kCgYEAygaS5FD6jnSXJrCWBvdvmM1meezfHywKo18FYQzAQRgd/ZUEK2IBqlku7gtR/voMqSRHYdzjmmK923zVdKTjbcYJB8OGXw7wdHD8VY7nCSocFih1ptDjaWs1JnenkCimlv6VQSpMmS+vU1oolQOuqJ1HOK32Hrss5wtjhpdCM9sCgYAxgaFibi/CdNcPAdfhKSf8SV4fUxuY91abWXNLCGjv69XSOtcToMohNNB2Yw/oA9JJnpZkVyzNDqPld7PrxCA+ASwrcEULiPTBh2YGhzhdj3CfUQDGfOagKTPOaE5ym3Szve/KYr6YlxVSlPJ0pKQamYlXY937YTmqVLE1gh/44QKBgENwQFaw5YLqTo6eweYfcQRMBJpMxQqN1BtHG++SpxbTqyc8OEEXHUE1NiJGax+3bsSDlMSJTPz7Wy9Kk6K1bCn3wonx7ggLX58vHDyfUGZRxUBsTyHZdyB4pixqIuhPeZTL9Rzktt8n+NnVLdjYetRUdDLqd0844jtaJOYH1hSjAoGAR+1hWZsyHtyAkmiDJQBaYjDDNZbiteFFWq+RCioeAAmYrwsaw5Nga4nkjrKMtD63j3aXALNOCMd2sy6aWqaZXHCyVrAdwL1g9fJ8Op7Qi6cP/c4fSVGRBIPEdcsEpxkVCSkr0SeE0cMI8KWu7INj8YC25fxwAqJvT78EBNFiJSM=
types: types:
- tree - tree
- file - file
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 600
storage: storage:
path: db/node/1/data path: db/node/1/data
metric: metric:
@ -46,5 +46,8 @@ log:
production: false production: false
defaultLevel: "" defaultLevel: ""
namedLevels: {} namedLevels: {}
stream:
timeoutMilliseconds: 1000
maxMsgSizeMb: 256
fileStorePogreb: fileStorePogreb:
path: db/node/1/files path: db/node/1/files

View File

@ -5,39 +5,39 @@ grpcServer:
- 127.0.0.1:4431 - 127.0.0.1:4431
tls: false tls: false
account: account:
peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
peerKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg== peerKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg== signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3 encryptionKey: MIIEpAIBAAKCAQEAt1zuRz2OVFlH5zj1wR3clRso1pqA9uOzKo4mPDMMq3na7i9mJuPeKdunuQH97utY1c6C3IEJQ5qV5LoYqPSe+ErgU1IcYP3LQrVOu72yvqqUKnsQMr/ztMYbkwzReokcZFsy+8gUxxDk9JOrWoErltJeTOE1bbvBzbBuHpZRuAdqcIniVPMWMk1blUt3PKTTmmZ8Q5QsieeU9f/BF6HcHlqkd21uskPr6mV+1kMvKt0w9Xhr2Vxto0ANWz13XF4Q2X3wZsdqA36Pbi+PkMdSSTJGpzakXNSptrPmu4O6xk3Bmf352SzM/ro4QnhtGP5Op9RxS6ToqcuycZ1mmxAxGwIDAQABAoIBAChSm2O3ObF64MEMWZ7aPkPb8SMgXvPsJt5Y3Deo0kRzS53Ndp1exuBVmZCpy3na73I1M7nh9nOTbxsZgYrGIJ9hd+taxzrdFPHahTHsCX68bFDbNzix1ZoPZsjzrK1RsZiwJYoQ+eC86lyOjMQeW8OTB4HIlMNI4tmkztKTI+1f9MVQYXZnJwgkQGTOnynrlj2LGCDABvUlJegkaY1jBd2K1aBnTpSbZzL85U7VyegeGBm6dt6K80ZLVHrFbvxQLefHMWPpRUoGR0oNDc8LhGczq7lX03x+9xFp5ncjR5K/42LGVDNQ2hi39bf1oKAKXf70uuCiC1A5DSPSpP43j8ECgYEA0dHxXWHxxX2aofmXkiwqdIwH6XuREWG3xvEnBJ3LkHhzvVpd2+rUVhI8c95Ct7nINSLEeJSKe0L/8wAG7WtQJOLzRqlJK3EMO7F6zu+ug8Xs2LbTfvVn+RmLXu0lm3Yq+wHs0CoAThHHFMAsPdrXhQ4muWoBwPQT8nFWo8cWKqkCgYEA37hLzhVP8bjU9mjrCBVU7JJKAnpHUjONnDBKCK7Css4tC7gCKZ+uwQBfv1/TH02ytwxHzHTj0c/l0VlCuoKVYNgcp2lSB2CTafh0YcXzBFJi3TAzK90vYT4ArCqP4azMDfQw3sQvvTXP/usui6bUMGOPRoeG8s6UV4oMxKj6/CMCgYAFKtR05kqcAIHkZ08yTGAnSqOPPnnOIcfy4FGDrZcr0auYCDeziM7956kReXHPMIYbuOV5yr62VmoTQ/bntfLdVbGEFfs1VK1mcvKBUinMGP3CQI5o3AZZfiWOiuyYLYrVb7CzV7V2Nr3eZvUv+MnB/x05B8FPTTOIjv4BPo/vMQKBgQC5breedHnUAIC8UVBmXdALWmHv1cyh7Ms2p6vlsHz+2ffqW7WnLI0buiSiqlmC+9Li+FHWvRhMQwbZVCQEFdKc9+QgOyLbrIfjcSV+GSYJ8gOyFI6FkAsCjfLewVSLGL/13O5Y5sIvEZh6UhM9e6UrCoqqShFn1iSMvodAxlNqgwKBgQDGkdo+cx2LYkJIj/BTLQu5HKjv6XHUBafuLfMr/t38xHM86ABrH0eFwpqIydY2x9o7gNQZ8HaBgSvGWkkI0Kq7qiUWL3n3Fm1xkHJMJJi4GNhgVWkEvKuG8ZTo/mDS1pJCFEPpISI2t4yzwJlq+Lo1Sjr4Opz0t2zdJnpE7iVk1Q==
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8081 - 127.0.0.1:8081
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9 - peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA== signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ== encryptionKey: MIIEowIBAAKCAQEAuRemjWvT+g2tjcOJwfGh6LP2PvLsgEMyCzy3zTmqsR+tnSgPD9976ULEaG38qXNE9gul8EcxNlWf40FKNKfnV/z/zHjePF9PNx/ZbrVAiL+5yh5J4cQAQQNTTAgf3hIvmCUm6PtA4AV+lAs/4KnOWm7G1xgd1HgJoN7hGFjGi7No1kpvMXzSSEJx8vTu7AVC6WP7Fp+UyD0zKTWrA6VqU24WzvbtUBJB7pf1hACnt1VsKUbFY18KmDPyGAD1cYNTO38L4D0RExWz9J5LM/wyGKd5zDV3T1+rYr1kNp+B7x79MsS7QInJ07Krd1zkn/Veg9NymQCMUMjH9MUZRbZGUwIDAQABAoIBAAqLtGueVyeKG/dVysWIFOeDSWZwxNTR/0nwnbBNttH8shGgNKt82jyCF1qz2Y92B9nU9BFqnP0xh7iVAbtaTa4PtitaP59E9uh3IhZSsWiZM+a2LxNz7WfG3roYRGiMtLWAeGUR27Jn3bxln7AXPLCeWynqL9jpNfM6f6y5ciaHa2Uj4wZdC9bEvB4SLh+pDwRfaMRg5ZJMXpi8kkR9WQ6i5GwyODEy31ub8LgnlE1+zgrlyUBGzmDpTriCYwkyajGrIY+Sge7QFMCheQ7G2svbWvrsqnQJB7AXfIZqaxiC4pqsqDMhkPCs1uWKKo/pUfrUYyxDAimhixNi8y3v6CECgYEAxLxSghaXaBYjrOnkzCa425an8UK5w9Vd/EkixqCSuPhA986KxUqym6YKT8ffzTqz7QcFcEXYML6evtGIJ/dxMVHsIZ/bGBKhXw2Bp1zI+Ml24mN8LQeBRSWoYHO9x+e7GVaLBMh1EaWd8JechskVuftTnCSUAQDtBpX66e2PX7kCgYEA8NlvWFCBKtwbjiH/h/mYu2ptQRnZ4+0d9AXWoNoePedQj+md51dMI/zpfoM0J+KSK8lG8bNBj7Ax0JAHTMBQJtfLde1IxtzwlzgiJWZ+qxGc/qPYmIb6hxHySA2L7I/TBEAZJ+FnZZ5CSFqsejev7tdRN6CQTZCZNFlNpIUNZGsCgYAt2Rl9WZh1WFt+C5AXh5qjCgwfbIZwPgRGLCEfmwI2exxg49BxRAQ1w885YoIkiN6viWhaDtzgFzxVie0qKz9E2CuodmGPzZ+v0Cz7/OKVIBZFkhu5PruAitMfjzmWIcn3kLSbK8Akma0iCaMfwjL/AbQtelTHmxih5UfxRjyYeQKBgQCREFWJGswBtZr/K6kODB6a20o8yMY9Cwdcf9u6/ET0wgr68xnBSgo5Ls6v/XR/hW7G4q9RSsd1NQl79hP/fWGJU7ZfK/EGnfJnEk82uZoXjT9C/AqsK7hffEaycT5S2HmfeL/uDkxJn12K2NpDrqDPuW5Yk+P2Y95y8kraiaz8SwKBgBiLtOMR9uGNLeEhPPsqbz7ASg270FICxQTRefU3ea5Ow1r2gdf7wTNNCIJGMtf3BMB7eaVLQOu5caaVYgZIKU7s7FejhGejYH3YLzvbVOQa0UW+nc9vltJ8tl6d2hlAC4U1552ZQppxLgN9d0R/X5eZyrkBm+A9ASbwbyaNjaX9
types: types:
- tree - tree
- file - file
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP - peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg== signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3 encryptionKey: MIIEpAIBAAKCAQEAt1zuRz2OVFlH5zj1wR3clRso1pqA9uOzKo4mPDMMq3na7i9mJuPeKdunuQH97utY1c6C3IEJQ5qV5LoYqPSe+ErgU1IcYP3LQrVOu72yvqqUKnsQMr/ztMYbkwzReokcZFsy+8gUxxDk9JOrWoErltJeTOE1bbvBzbBuHpZRuAdqcIniVPMWMk1blUt3PKTTmmZ8Q5QsieeU9f/BF6HcHlqkd21uskPr6mV+1kMvKt0w9Xhr2Vxto0ANWz13XF4Q2X3wZsdqA36Pbi+PkMdSSTJGpzakXNSptrPmu4O6xk3Bmf352SzM/ro4QnhtGP5Op9RxS6ToqcuycZ1mmxAxGwIDAQABAoIBAChSm2O3ObF64MEMWZ7aPkPb8SMgXvPsJt5Y3Deo0kRzS53Ndp1exuBVmZCpy3na73I1M7nh9nOTbxsZgYrGIJ9hd+taxzrdFPHahTHsCX68bFDbNzix1ZoPZsjzrK1RsZiwJYoQ+eC86lyOjMQeW8OTB4HIlMNI4tmkztKTI+1f9MVQYXZnJwgkQGTOnynrlj2LGCDABvUlJegkaY1jBd2K1aBnTpSbZzL85U7VyegeGBm6dt6K80ZLVHrFbvxQLefHMWPpRUoGR0oNDc8LhGczq7lX03x+9xFp5ncjR5K/42LGVDNQ2hi39bf1oKAKXf70uuCiC1A5DSPSpP43j8ECgYEA0dHxXWHxxX2aofmXkiwqdIwH6XuREWG3xvEnBJ3LkHhzvVpd2+rUVhI8c95Ct7nINSLEeJSKe0L/8wAG7WtQJOLzRqlJK3EMO7F6zu+ug8Xs2LbTfvVn+RmLXu0lm3Yq+wHs0CoAThHHFMAsPdrXhQ4muWoBwPQT8nFWo8cWKqkCgYEA37hLzhVP8bjU9mjrCBVU7JJKAnpHUjONnDBKCK7Css4tC7gCKZ+uwQBfv1/TH02ytwxHzHTj0c/l0VlCuoKVYNgcp2lSB2CTafh0YcXzBFJi3TAzK90vYT4ArCqP4azMDfQw3sQvvTXP/usui6bUMGOPRoeG8s6UV4oMxKj6/CMCgYAFKtR05kqcAIHkZ08yTGAnSqOPPnnOIcfy4FGDrZcr0auYCDeziM7956kReXHPMIYbuOV5yr62VmoTQ/bntfLdVbGEFfs1VK1mcvKBUinMGP3CQI5o3AZZfiWOiuyYLYrVb7CzV7V2Nr3eZvUv+MnB/x05B8FPTTOIjv4BPo/vMQKBgQC5breedHnUAIC8UVBmXdALWmHv1cyh7Ms2p6vlsHz+2ffqW7WnLI0buiSiqlmC+9Li+FHWvRhMQwbZVCQEFdKc9+QgOyLbrIfjcSV+GSYJ8gOyFI6FkAsCjfLewVSLGL/13O5Y5sIvEZh6UhM9e6UrCoqqShFn1iSMvodAxlNqgwKBgQDGkdo+cx2LYkJIj/BTLQu5HKjv6XHUBafuLfMr/t38xHM86ABrH0eFwpqIydY2x9o7gNQZ8HaBgSvGWkkI0Kq7qiUWL3n3Fm1xkHJMJJi4GNhgVWkEvKuG8ZTo/mDS1pJCFEPpISI2t4yzwJlq+Lo1Sjr4Opz0t2zdJnpE7iVk1Q==
types: types:
- tree - tree
- file - file
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV - peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA== signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA== encryptionKey: MIIEogIBAAKCAQEArE3UxyKsK//jjgIkeKGG2los7pW+I9Dm709lBErXY5DkeyTVXPDF2jaarJ60d8GAMfBjKnS+Lg/9z95FAHuE56XX2YUF73RRXBM7nz9octaKpOn5xqwrh1SXojaKn1pxLtE8Dr6GkoCONPkRcavv341KA92eanVEXMLt13JrwgYOcnmK6HnnD8B/s19iN3srRbDIdknm9RPiSgSs5wVlji19rGs1G035mybbG7kEAlQeW1nG/zE6urejLHHYeRpUk41jVCzYTnRzf1BYZMFBFIZb2EqrnOK/pZrpRQTy+9ULAPiIxnzGjkB52w7Nx/bxt0gm//riZBr1I0pgNPQl0wIDAQABAoIBAGDZOqFX3ti4c0pt79wSRr9S8nCEoKR3FmcrBEe+XYTse1CwanFcMImwKY6fgibSD+GCEetaRU+U04BUmgpkY1blhAcS2zw18ElF0jx3opjx+GorzaabPbhKlxSpfY+GgZnkJ9LNysxsEAK8gM6Y6zKHszOrDREfqvZM5u0ztlgOrSYxst4Sx2HIc2aqLc50H2x3BIT+O0xIXg3/cPG9OoKz2iMRiPn9dqLiqEFjFdfRk/uxdEC3ivOHVYuEADEoNZ0jKbsNPlGXFQXWMQ0FqiFXBs1U8T9qcSB7OzCFp7tWu+f0XqB9+MBX57s4Kz4Ijkeycd/tlB4v3C0HjGlJJtECgYEA2lZ2dQBh3O9rOJcrQho0mmGeKPQhAlMZD4F1SvgBhY+AEe2N/yu4F6/RVZPrhJPrjwDCGbr41l5sQlpvASwaOPGio0FEFFzlPKSv0njZST9vRJfg+1fPb9ZyYjLNIDaz10A3RW+U+Ll4I3Vwsejb8nP5Zo8C8zzvLaiu7lj882kCgYEAygaS5FD6jnSXJrCWBvdvmM1meezfHywKo18FYQzAQRgd/ZUEK2IBqlku7gtR/voMqSRHYdzjmmK923zVdKTjbcYJB8OGXw7wdHD8VY7nCSocFih1ptDjaWs1JnenkCimlv6VQSpMmS+vU1oolQOuqJ1HOK32Hrss5wtjhpdCM9sCgYAxgaFibi/CdNcPAdfhKSf8SV4fUxuY91abWXNLCGjv69XSOtcToMohNNB2Yw/oA9JJnpZkVyzNDqPld7PrxCA+ASwrcEULiPTBh2YGhzhdj3CfUQDGfOagKTPOaE5ym3Szve/KYr6YlxVSlPJ0pKQamYlXY937YTmqVLE1gh/44QKBgENwQFaw5YLqTo6eweYfcQRMBJpMxQqN1BtHG++SpxbTqyc8OEEXHUE1NiJGax+3bsSDlMSJTPz7Wy9Kk6K1bCn3wonx7ggLX58vHDyfUGZRxUBsTyHZdyB4pixqIuhPeZTL9Rzktt8n+NnVLdjYetRUdDLqd0844jtaJOYH1hSjAoGAR+1hWZsyHtyAkmiDJQBaYjDDNZbiteFFWq+RCioeAAmYrwsaw5Nga4nkjrKMtD63j3aXALNOCMd2sy6aWqaZXHCyVrAdwL1g9fJ8Op7Qi6cP/c4fSVGRBIPEdcsEpxkVCSkr0SeE0cMI8KWu7INj8YC25fxwAqJvT78EBNFiJSM=
types: types:
- tree - tree
- file - file
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 600
storage: storage:
path: db/node/2/data path: db/node/2/data
metric: metric:
@ -46,5 +46,8 @@ log:
production: false production: false
defaultLevel: "" defaultLevel: ""
namedLevels: {} namedLevels: {}
stream:
timeoutMilliseconds: 1000
maxMsgSizeMb: 256
fileStorePogreb: fileStorePogreb:
path: db/node/2/files path: db/node/2/files

View File

@ -5,39 +5,39 @@ grpcServer:
- 127.0.0.1:4432 - 127.0.0.1:4432
tls: false tls: false
account: account:
peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
peerKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA== peerKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA== signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA== encryptionKey: MIIEogIBAAKCAQEArE3UxyKsK//jjgIkeKGG2los7pW+I9Dm709lBErXY5DkeyTVXPDF2jaarJ60d8GAMfBjKnS+Lg/9z95FAHuE56XX2YUF73RRXBM7nz9octaKpOn5xqwrh1SXojaKn1pxLtE8Dr6GkoCONPkRcavv341KA92eanVEXMLt13JrwgYOcnmK6HnnD8B/s19iN3srRbDIdknm9RPiSgSs5wVlji19rGs1G035mybbG7kEAlQeW1nG/zE6urejLHHYeRpUk41jVCzYTnRzf1BYZMFBFIZb2EqrnOK/pZrpRQTy+9ULAPiIxnzGjkB52w7Nx/bxt0gm//riZBr1I0pgNPQl0wIDAQABAoIBAGDZOqFX3ti4c0pt79wSRr9S8nCEoKR3FmcrBEe+XYTse1CwanFcMImwKY6fgibSD+GCEetaRU+U04BUmgpkY1blhAcS2zw18ElF0jx3opjx+GorzaabPbhKlxSpfY+GgZnkJ9LNysxsEAK8gM6Y6zKHszOrDREfqvZM5u0ztlgOrSYxst4Sx2HIc2aqLc50H2x3BIT+O0xIXg3/cPG9OoKz2iMRiPn9dqLiqEFjFdfRk/uxdEC3ivOHVYuEADEoNZ0jKbsNPlGXFQXWMQ0FqiFXBs1U8T9qcSB7OzCFp7tWu+f0XqB9+MBX57s4Kz4Ijkeycd/tlB4v3C0HjGlJJtECgYEA2lZ2dQBh3O9rOJcrQho0mmGeKPQhAlMZD4F1SvgBhY+AEe2N/yu4F6/RVZPrhJPrjwDCGbr41l5sQlpvASwaOPGio0FEFFzlPKSv0njZST9vRJfg+1fPb9ZyYjLNIDaz10A3RW+U+Ll4I3Vwsejb8nP5Zo8C8zzvLaiu7lj882kCgYEAygaS5FD6jnSXJrCWBvdvmM1meezfHywKo18FYQzAQRgd/ZUEK2IBqlku7gtR/voMqSRHYdzjmmK923zVdKTjbcYJB8OGXw7wdHD8VY7nCSocFih1ptDjaWs1JnenkCimlv6VQSpMmS+vU1oolQOuqJ1HOK32Hrss5wtjhpdCM9sCgYAxgaFibi/CdNcPAdfhKSf8SV4fUxuY91abWXNLCGjv69XSOtcToMohNNB2Yw/oA9JJnpZkVyzNDqPld7PrxCA+ASwrcEULiPTBh2YGhzhdj3CfUQDGfOagKTPOaE5ym3Szve/KYr6YlxVSlPJ0pKQamYlXY937YTmqVLE1gh/44QKBgENwQFaw5YLqTo6eweYfcQRMBJpMxQqN1BtHG++SpxbTqyc8OEEXHUE1NiJGax+3bsSDlMSJTPz7Wy9Kk6K1bCn3wonx7ggLX58vHDyfUGZRxUBsTyHZdyB4pixqIuhPeZTL9Rzktt8n+NnVLdjYetRUdDLqd0844jtaJOYH1hSjAoGAR+1hWZsyHtyAkmiDJQBaYjDDNZbiteFFWq+RCioeAAmYrwsaw5Nga4nkjrKMtD63j3aXALNOCMd2sy6aWqaZXHCyVrAdwL1g9fJ8Op7Qi6cP/c4fSVGRBIPEdcsEpxkVCSkr0SeE0cMI8KWu7INj8YC25fxwAqJvT78EBNFiJSM=
apiServer: apiServer:
listenAddrs: listenAddrs:
- 127.0.0.1:8082 - 127.0.0.1:8082
tls: false tls: false
nodes: nodes:
- peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9 - peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
address: 127.0.0.1:4430 address: 127.0.0.1:4430
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA== signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
encryptionKey: MIIEpAIBAAKCAQEAtw1tn95/mQ2cpYgOKxaRwgZITgsrmZQIyH+bYFaUYUWoUp/AxAdPrh5cLehMUNXH8ZoyHkhV3bIMWpHoUyG+QJzz7etktAVz6MtEl3Wo/jAgAEDvXXgFMku2hnh6coWyhzyXR190ZHgGazJ0K1OtugsIFXwFro93j0+8iPuifsWkH6RaAhvZJUWaQGGmNQKSZnbdFokGmo5FM0z0eOI/sZGhCtxuWbpZz0hhvW3sXEWEyzq8WwTFLGoppIETnhjzcSJDO+pq0b934WuMTGazUH0sPc/AnoZJp00237Ar8g+h10CVxQ5SsTba7VYDCr7/zeHS+vvUYNgB4NO0lylaTQIDAQABAoIBADhUKoLCjhNEDAsoFewOcuX41vElINKOqjFAi0iW++v+6nAadtAby9oxv33k+O77Ch7/qyKEcd/ZtVF9irdiL9BkO+/fuspmzyc4va+55jnqBz7svHvPvhGfGNjCZDOvjqNs8sRkzEVKZfdAvFzE0DXqxR8PXhQ8U7dG+yZQAM3vcE/ib/14OxXgANrPwOKO04Lhff2xoXuuqrx9XAG+PbLlxi0gYGK55E1whgBldPC3nKA38hh1QDt+uh8AVdZ/Y0ehW7t2CG8zPNNTO7TjrZHwMeFgvVODN+0X1W9e7nIuDGVJ74FzvC5PZwBURJ/tjHSUCR0Pf9t87yaQqEQT/sECgYEA44Ve23Fnn97kNqpYzJJAq3+1Cg72cEg8gG9RA+AtOcMUO9EspWxiu/MPXGbaP/R/5L9UTikv7oN7an4gsO4FN9cFH/j4SY/fI6twi55DwpOFbgjLf6lT0tzEnHymPXjGCCHdc3BRIsjd3ehmQcwBZ/pPl8CggDxj24/xlqt7kbECgYEAzfceXEEpGmOZ1Hno3Xck/ZBcl12KjLVOK8ACe890BjWIPDMXaYfGJJpX0terR7BcqrLrq0komPUinoeelpIAitTXQ+zr6ULYXpZgxSTOz7aV7OAsudowp+m5z594ZagIgs3lKVILeclAqaYB4eq9/pHzHazS0YIwWwce753CfV0CgYEAzJ89YYTLmoe+nb90n3+Fc/gmHQa58t+0shnrNd4fLozZHLcSPTCOV9TQ4tyJuu0tPNAqhSUbu5o6m9sVkapvvPm/3TJwMtCW8aCVVqwe6tb8MKruQkFKZyEwHkEoza5aBCRY4yKHhg47JAGIPfK47Qe9H5EZiFtHv8bkkwpk1vECgYBuFJy6a+0e+IrYIAwQicRQbV6/W7RYPfK4uVfaemclhmj428mwkmuZVpCH1NLrbtwoM5Z3ppM3JRVKq2tcSE5X5SfkWvU/Z4WjEDZKR8DtDUYWIz5kWrRUmjvANxgvJN7folHPgtU1UxXnVh19dGv1amYIvzyx0yYrEKQ9JxEy1QKBgQC8zAG011S0HopmpBFizKanlmKPM9BHKk9GCl8dEQltxr+KA6734YwMy63fxaRBje0WUJJPMwOoxNUWfvJ6cRTi4BpEbOhy3ZfPCpVoVX71QPMuOqAvUbF/AQrv7tLCSs1WSA98k8DVeIITHAI/ITzCxuRxPyzU7agi0D9EBLoaPQ== encryptionKey: MIIEowIBAAKCAQEAuRemjWvT+g2tjcOJwfGh6LP2PvLsgEMyCzy3zTmqsR+tnSgPD9976ULEaG38qXNE9gul8EcxNlWf40FKNKfnV/z/zHjePF9PNx/ZbrVAiL+5yh5J4cQAQQNTTAgf3hIvmCUm6PtA4AV+lAs/4KnOWm7G1xgd1HgJoN7hGFjGi7No1kpvMXzSSEJx8vTu7AVC6WP7Fp+UyD0zKTWrA6VqU24WzvbtUBJB7pf1hACnt1VsKUbFY18KmDPyGAD1cYNTO38L4D0RExWz9J5LM/wyGKd5zDV3T1+rYr1kNp+B7x79MsS7QInJ07Krd1zkn/Veg9NymQCMUMjH9MUZRbZGUwIDAQABAoIBAAqLtGueVyeKG/dVysWIFOeDSWZwxNTR/0nwnbBNttH8shGgNKt82jyCF1qz2Y92B9nU9BFqnP0xh7iVAbtaTa4PtitaP59E9uh3IhZSsWiZM+a2LxNz7WfG3roYRGiMtLWAeGUR27Jn3bxln7AXPLCeWynqL9jpNfM6f6y5ciaHa2Uj4wZdC9bEvB4SLh+pDwRfaMRg5ZJMXpi8kkR9WQ6i5GwyODEy31ub8LgnlE1+zgrlyUBGzmDpTriCYwkyajGrIY+Sge7QFMCheQ7G2svbWvrsqnQJB7AXfIZqaxiC4pqsqDMhkPCs1uWKKo/pUfrUYyxDAimhixNi8y3v6CECgYEAxLxSghaXaBYjrOnkzCa425an8UK5w9Vd/EkixqCSuPhA986KxUqym6YKT8ffzTqz7QcFcEXYML6evtGIJ/dxMVHsIZ/bGBKhXw2Bp1zI+Ml24mN8LQeBRSWoYHO9x+e7GVaLBMh1EaWd8JechskVuftTnCSUAQDtBpX66e2PX7kCgYEA8NlvWFCBKtwbjiH/h/mYu2ptQRnZ4+0d9AXWoNoePedQj+md51dMI/zpfoM0J+KSK8lG8bNBj7Ax0JAHTMBQJtfLde1IxtzwlzgiJWZ+qxGc/qPYmIb6hxHySA2L7I/TBEAZJ+FnZZ5CSFqsejev7tdRN6CQTZCZNFlNpIUNZGsCgYAt2Rl9WZh1WFt+C5AXh5qjCgwfbIZwPgRGLCEfmwI2exxg49BxRAQ1w885YoIkiN6viWhaDtzgFzxVie0qKz9E2CuodmGPzZ+v0Cz7/OKVIBZFkhu5PruAitMfjzmWIcn3kLSbK8Akma0iCaMfwjL/AbQtelTHmxih5UfxRjyYeQKBgQCREFWJGswBtZr/K6kODB6a20o8yMY9Cwdcf9u6/ET0wgr68xnBSgo5Ls6v/XR/hW7G4q9RSsd1NQl79hP/fWGJU7ZfK/EGnfJnEk82uZoXjT9C/AqsK7hffEaycT5S2HmfeL/uDkxJn12K2NpDrqDPuW5Yk+P2Y95y8kraiaz8SwKBgBiLtOMR9uGNLeEhPPsqbz7ASg270FICxQTRefU3ea5Ow1r2gdf7wTNNCIJGMtf3BMB7eaVLQOu5caaVYgZIKU7s7FejhGejYH3YLzvbVOQa0UW+nc9vltJ8tl6d2hlAC4U1552ZQppxLgN9d0R/X5eZyrkBm+A9ASbwbyaNjaX9
types: types:
- tree - tree
- file - file
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP - peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
address: 127.0.0.1:4431 address: 127.0.0.1:4431
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg== signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
encryptionKey: MIIEowIBAAKCAQEAyL/fnKl6ztxVtXkxdl48HEawDKmJmBxs6rGl+kNx+cb6Jio/GyKz4d1bCW5Ni5glyVg11RqA09wPaJxKMlp/svz+46a9MtZmC4/pFOiSaMkmMOs61apTruJNNDK/9O0j+irCnJFRGactt/AlCKU+9WjwsTtJtmqEkt0uuD0Tn709Itx86nzXhCqNtEKPvo83FaZ60RFpe72KNLcyP7DgR8m7Csa4JWfK1Ig0539rFxM5Co/GGNna3mqShDbIN0Aw8k7yCuDaCx/akd0Yd2BEjBApHtlonu3BYfCAF3bAus9sejogeA+mu52akN7H0YnC1BeftFAzlZ5yJV1gKwsYmwIDAQABAoIBAQCzzPaw0DMIV9wEP9oHVHuuL7m6fZaZQMxkoFwyfHn25zphOHFxEnHemG3TUpHtt4YQggslJSnBl1XNsj3aP6gkXejFaTAH+nNHY8u1SGDprU+hfO4jNPzipBnV6KZ47nTMucO4i4cB3PRbzKC+z5JGJ4l8k8d/tIOtLqGLrliHNlRZ7LRfovCP+ekPrPpxtJBp48GUQFRexXqsytiEYlAjXPUVHh+8b1lmDJXzxzTf2Nhx1lXykrrRYlOOYSz0fufFzsLcJSzPbfnomgjaNGKPCSWfREFp3Ch1P6+G9hClMORL5Vc58I5j3SlacsoWEw3ywyE0Visfn7ojIuqboLHBAoGBAMnbL0TeKaKIkRGdKXFhUzpUrH1mPg7QOLH65GbbtO5DHTwDRjX0I8pc+XT7u/qVhG+h72wBZ3J/egAlvLUOtwuuNhjir5BqS90QhtofsHy7IbzAkMhPpQ/3p2+ZrfTGylzUHLwR/hr9aiP5PizMJQ2JSQU3k8YozVGENnmpnydLAoGBAP6YskbZU6+TPXlconbg2G+D6KSYScu8h1d6mYHjcbCOc5ILVa1DJGr/ufYl2dqPTA63Mj9PJ8Dla4WI9iXwh0cbTI/N+XD27y54sWonuWymX/9i2tlhmnLeLqGq7zQ+eCQMMnhH2rbN/+hEYMwbsTAdu4txbPDMGVoL9K09PXHxAoGAGBuASrZJvKqYwMTHVU4tVXMVYqiaUsSVcNQpAQvOUQJc9HTjpr/wolN2S31hFu1Scs6hPIHya99Dn87h+bG3NMLqnRA9rX60bsNxh41vU4Y54kQRRosUiJKoQZDWELzJIEsI34E6mtiXG5LB1THQXwx9Vw0rLehjlQ+4PdF/O38CgYBjHbs6Dd2gmufx2Xh+Y2afc3EcsxT3tjvSeK5OfOeD3tFrZ/JA88S3yzrwcyfvCJ6JlBSBxSUq2aYUZI+/kXZ43k3eJkgYDGptYxtewnxTqinxWODuhCsG0SzCT7O0WSWYkw8K+J5TULtyBzzP+W/v1YNv9AZ/cFXmUoU89Hx5YQKBgBPx7Dm8s8M/8EQoV0NQwgk0I2W7WCnaNxNaNnIg1MtEsBkI+UkxnAGPUwEDtv5cRmciBO6SdsvUrZh+t41Ui/MLTMJOsQO53HAbng4tjxcAmDM/R/iYyI6gCCYhxUudPTaKDZchV41TrhGaqXliV6CgCRVm2WsKFgJdFNW7QVq3 encryptionKey: MIIEpAIBAAKCAQEAt1zuRz2OVFlH5zj1wR3clRso1pqA9uOzKo4mPDMMq3na7i9mJuPeKdunuQH97utY1c6C3IEJQ5qV5LoYqPSe+ErgU1IcYP3LQrVOu72yvqqUKnsQMr/ztMYbkwzReokcZFsy+8gUxxDk9JOrWoErltJeTOE1bbvBzbBuHpZRuAdqcIniVPMWMk1blUt3PKTTmmZ8Q5QsieeU9f/BF6HcHlqkd21uskPr6mV+1kMvKt0w9Xhr2Vxto0ANWz13XF4Q2X3wZsdqA36Pbi+PkMdSSTJGpzakXNSptrPmu4O6xk3Bmf352SzM/ro4QnhtGP5Op9RxS6ToqcuycZ1mmxAxGwIDAQABAoIBAChSm2O3ObF64MEMWZ7aPkPb8SMgXvPsJt5Y3Deo0kRzS53Ndp1exuBVmZCpy3na73I1M7nh9nOTbxsZgYrGIJ9hd+taxzrdFPHahTHsCX68bFDbNzix1ZoPZsjzrK1RsZiwJYoQ+eC86lyOjMQeW8OTB4HIlMNI4tmkztKTI+1f9MVQYXZnJwgkQGTOnynrlj2LGCDABvUlJegkaY1jBd2K1aBnTpSbZzL85U7VyegeGBm6dt6K80ZLVHrFbvxQLefHMWPpRUoGR0oNDc8LhGczq7lX03x+9xFp5ncjR5K/42LGVDNQ2hi39bf1oKAKXf70uuCiC1A5DSPSpP43j8ECgYEA0dHxXWHxxX2aofmXkiwqdIwH6XuREWG3xvEnBJ3LkHhzvVpd2+rUVhI8c95Ct7nINSLEeJSKe0L/8wAG7WtQJOLzRqlJK3EMO7F6zu+ug8Xs2LbTfvVn+RmLXu0lm3Yq+wHs0CoAThHHFMAsPdrXhQ4muWoBwPQT8nFWo8cWKqkCgYEA37hLzhVP8bjU9mjrCBVU7JJKAnpHUjONnDBKCK7Css4tC7gCKZ+uwQBfv1/TH02ytwxHzHTj0c/l0VlCuoKVYNgcp2lSB2CTafh0YcXzBFJi3TAzK90vYT4ArCqP4azMDfQw3sQvvTXP/usui6bUMGOPRoeG8s6UV4oMxKj6/CMCgYAFKtR05kqcAIHkZ08yTGAnSqOPPnnOIcfy4FGDrZcr0auYCDeziM7956kReXHPMIYbuOV5yr62VmoTQ/bntfLdVbGEFfs1VK1mcvKBUinMGP3CQI5o3AZZfiWOiuyYLYrVb7CzV7V2Nr3eZvUv+MnB/x05B8FPTTOIjv4BPo/vMQKBgQC5breedHnUAIC8UVBmXdALWmHv1cyh7Ms2p6vlsHz+2ffqW7WnLI0buiSiqlmC+9Li+FHWvRhMQwbZVCQEFdKc9+QgOyLbrIfjcSV+GSYJ8gOyFI6FkAsCjfLewVSLGL/13O5Y5sIvEZh6UhM9e6UrCoqqShFn1iSMvodAxlNqgwKBgQDGkdo+cx2LYkJIj/BTLQu5HKjv6XHUBafuLfMr/t38xHM86ABrH0eFwpqIydY2x9o7gNQZ8HaBgSvGWkkI0Kq7qiUWL3n3Fm1xkHJMJJi4GNhgVWkEvKuG8ZTo/mDS1pJCFEPpISI2t4yzwJlq+Lo1Sjr4Opz0t2zdJnpE7iVk1Q==
types: types:
- tree - tree
- file - file
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV - peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
address: 127.0.0.1:4432 address: 127.0.0.1:4432
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA== signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
encryptionKey: MIIEpAIBAAKCAQEAs/jLbBcMpkjqZ8R7ySsE9FkUdVZsJJk4BWI4OHbRg5+RMt74AeoKK+NW81zxw5tzLXvW9AZVccO742xB5mRfyrvZ22YrPedTvQymmyY5RCh9qduk0OOfItlNVyG7zRBgK90TAmkwbg4B1jCFIt3cuttK7A6gUKqy9deNhYZd67a7byJIgGmKcqK4ETbeLw8vJv08Htagn3/7CRjwAQcuLNzWw7G4SiTyIOcLpX14oQl3/v1/gYleFVyqebvo4xftQ/pCzDZoD6/t/HK70zzD+TsCmWK/o6iO42hsARIkuuuufASW9mIGcjKj8v+mftLEqqkSSEwtZTuLATJRG2bwiQIDAQABAoIBAQCC+GKpVZjKBjQ3scBXpGvlmlIOFgd7Ftmy6Uh6ptVP0Tasa6DWW8htKfNkBVaXgC/wgLfsPBPAR64bEfRfQtqHQe+H/7EmSosg/+za6ZUxKbpRe1tU/OEZTkQ/TXhLAkjKgwbLcVtiK+VgR00ME6MHhIDgisBWE/NKf0QpUKBW4Rp/0l3bUYO+b7aAIBT0Q/Noc+kaXbHygYuzTMYCvItGDe0WtvrNE/IQEnjC51i02rpa5GI29T4OVvumKbLjFMlT0EttkTjZNVEicP8RHqSKlE7+lMPT1eH3CEVepV7QKCzgPN9pBudLmzmb7HhSZvwMzzkTTt1WczWshBrKZKHRAoGBAMynv1toSLzznwQzffhwLQzvzxnjhdxNKKbJ7cVG4CNVKRVh9iPVBv+XWgBYInnpC/ByX5HDKleRvo54wXzYoMlxtqz8ZCOFxcWrocehbLAIxtGDlSAOGAgSVMrJDJr28Hc7n0zesIyQzymoWfN7yDxcKLB34hC0qUQVuaY7PjTNAoGBAOEfuQkzdrIcT7hEuX+Jv9SmkBnxSocpUZyF7vCm03Dg8FhGK16WWXwa5ii0R6LL4A31J1A/ydpFTd+kxqaQ0dyrc9QWkwzuyy3JYO2R/J7ejFO5KfuKMojXPMwum69y95vL4ZGfYXmF/vYv7TYaBhoI0oeJA5+w9dX20z1jgkqtAoGBAJRqJky8sNtOdYhPa1BK0XDrTC6DIKVl01A5alRBlPQqoxOdqinMKDoc4akUQVRVnFHwL7x+Y2uEB0Q88FyAoQHVlFuY4WodbhJu6HDkcPSsOLriCLhpYCYiXRl+ecS7xiFBvMG7UR9vOL0GGM2Je+nCD8QB/JCO4527f5m8pt0VAoGAd2Vht5WJ0DDfvvUEBLZD/T5RktC8HC83z3HhJdT0sxs5nTep7MKEtyN1CgWDML48GGr67L7ICXFUOdakXNbV1tk/1y4Z03QaYjA5rgYNGx0hA45iy7uhzZ2J6yiU/VpWJFTfT2JeShtc+6izgEwRDGG9dpCeUWWDHHWJ1zcddQkCgYB//JrVbMtkB+L5OV0UfAFlhGaVoThfCL5QHAwmXq+gsX7dxCu5NGJDWJ6fQ+e+0zQms6nB/BvLXcKWo0rEZJsyiUpWN8X06nsyHN1Nxk7PiPlL12dV9/RGD98kNmFQorYhO/lOWImqy7ZpuNNSc69l1B9Q/G/FLU8itzSp2irSEA== encryptionKey: MIIEogIBAAKCAQEArE3UxyKsK//jjgIkeKGG2los7pW+I9Dm709lBErXY5DkeyTVXPDF2jaarJ60d8GAMfBjKnS+Lg/9z95FAHuE56XX2YUF73RRXBM7nz9octaKpOn5xqwrh1SXojaKn1pxLtE8Dr6GkoCONPkRcavv341KA92eanVEXMLt13JrwgYOcnmK6HnnD8B/s19iN3srRbDIdknm9RPiSgSs5wVlji19rGs1G035mybbG7kEAlQeW1nG/zE6urejLHHYeRpUk41jVCzYTnRzf1BYZMFBFIZb2EqrnOK/pZrpRQTy+9ULAPiIxnzGjkB52w7Nx/bxt0gm//riZBr1I0pgNPQl0wIDAQABAoIBAGDZOqFX3ti4c0pt79wSRr9S8nCEoKR3FmcrBEe+XYTse1CwanFcMImwKY6fgibSD+GCEetaRU+U04BUmgpkY1blhAcS2zw18ElF0jx3opjx+GorzaabPbhKlxSpfY+GgZnkJ9LNysxsEAK8gM6Y6zKHszOrDREfqvZM5u0ztlgOrSYxst4Sx2HIc2aqLc50H2x3BIT+O0xIXg3/cPG9OoKz2iMRiPn9dqLiqEFjFdfRk/uxdEC3ivOHVYuEADEoNZ0jKbsNPlGXFQXWMQ0FqiFXBs1U8T9qcSB7OzCFp7tWu+f0XqB9+MBX57s4Kz4Ijkeycd/tlB4v3C0HjGlJJtECgYEA2lZ2dQBh3O9rOJcrQho0mmGeKPQhAlMZD4F1SvgBhY+AEe2N/yu4F6/RVZPrhJPrjwDCGbr41l5sQlpvASwaOPGio0FEFFzlPKSv0njZST9vRJfg+1fPb9ZyYjLNIDaz10A3RW+U+Ll4I3Vwsejb8nP5Zo8C8zzvLaiu7lj882kCgYEAygaS5FD6jnSXJrCWBvdvmM1meezfHywKo18FYQzAQRgd/ZUEK2IBqlku7gtR/voMqSRHYdzjmmK923zVdKTjbcYJB8OGXw7wdHD8VY7nCSocFih1ptDjaWs1JnenkCimlv6VQSpMmS+vU1oolQOuqJ1HOK32Hrss5wtjhpdCM9sCgYAxgaFibi/CdNcPAdfhKSf8SV4fUxuY91abWXNLCGjv69XSOtcToMohNNB2Yw/oA9JJnpZkVyzNDqPld7PrxCA+ASwrcEULiPTBh2YGhzhdj3CfUQDGfOagKTPOaE5ym3Szve/KYr6YlxVSlPJ0pKQamYlXY937YTmqVLE1gh/44QKBgENwQFaw5YLqTo6eweYfcQRMBJpMxQqN1BtHG++SpxbTqyc8OEEXHUE1NiJGax+3bsSDlMSJTPz7Wy9Kk6K1bCn3wonx7ggLX58vHDyfUGZRxUBsTyHZdyB4pixqIuhPeZTL9Rzktt8n+NnVLdjYetRUdDLqd0844jtaJOYH1hSjAoGAR+1hWZsyHtyAkmiDJQBaYjDDNZbiteFFWq+RCioeAAmYrwsaw5Nga4nkjrKMtD63j3aXALNOCMd2sy6aWqaZXHCyVrAdwL1g9fJ8Op7Qi6cP/c4fSVGRBIPEdcsEpxkVCSkr0SeE0cMI8KWu7INj8YC25fxwAqJvT78EBNFiJSM=
types: types:
- tree - tree
- file - file
space: space:
gcTTL: 60 gcTTL: 60
syncPeriod: 11 syncPeriod: 600
storage: storage:
path: db/node/3/data path: db/node/3/data
metric: metric:
@ -46,5 +46,8 @@ log:
production: false production: false
defaultLevel: "" defaultLevel: ""
namedLevels: {} namedLevels: {}
stream:
timeoutMilliseconds: 1000
maxMsgSizeMb: 256
fileStorePogreb: fileStorePogreb:
path: db/node/3/files path: db/node/3/files

View File

@ -123,7 +123,6 @@ github.com/gogo/googleapis v1.1.0 h1:kFkMAZBNAn4j7K0GiZr8cRYzejq68VbheufiV3YuyFI
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7 h1:2hRPrmiwPrp3fQX967rNJIhQPtiGXdlQWAxKbKw3VHA= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7 h1:2hRPrmiwPrp3fQX967rNJIhQPtiGXdlQWAxKbKw3VHA=
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY=
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
@ -410,33 +409,46 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEa
go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U= go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U=
go4.org v0.0.0-20180809161055-417644f6feb5 h1:+hE86LblG4AyDgwMCLTE6FOlM9+qjHSYS+rKqxUVdsM= go4.org v0.0.0-20180809161055-417644f6feb5 h1:+hE86LblG4AyDgwMCLTE6FOlM9+qjHSYS+rKqxUVdsM=
golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d h1:E2M5QgjZ/Jg+ObCQAudsXxuTsLj7Nl5RV/lZcQZmKSo= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d h1:E2M5QgjZ/Jg+ObCQAudsXxuTsLj7Nl5RV/lZcQZmKSo=
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b h1:SCE/18RnFsLrjydh/R/s5EVvHoZprqEQUuoxK8q2Pc4= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/net v0.3.0 h1:VWL6FNY2bEEmsGVKabSlHu5Irp34xmMRoqb/9lF9lxk=
golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg=
golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852 h1:xYq6+9AtI+xP3M4r0N1hCkHrInHDBohhquRgx9Kk6gI= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852 h1:xYq6+9AtI+xP3M4r0N1hCkHrInHDBohhquRgx9Kk6gI=
golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190302025703-b6889370fb10/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI= golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI=
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w=
google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8=

View File

@ -51,13 +51,16 @@ func (s *service) Name() (name string) {
} }
func (s *service) Run(ctx context.Context) (err error) { func (s *service) Run(ctx context.Context) (err error) {
err = s.BaseDrpcServer.Run( params := server.Params{
ctx, BufferSizeMb: s.cfg.Stream.MaxMsgSizeMb,
s.cfg.APIServer.ListenAddrs, TimeoutMillis: s.cfg.Stream.TimeoutMilliseconds,
func(handler drpc.Handler) drpc.Handler { ListenAddrs: s.cfg.APIServer.ListenAddrs,
Wrapper: func(handler drpc.Handler) drpc.Handler {
return handler return handler
}, },
s.transport.BasicListener) Converter: s.transport.BasicListener,
}
err = s.BaseDrpcServer.Run(ctx, params)
if err != nil { if err != nil {
return return
} }

View File

@ -9,11 +9,14 @@ replace github.com/anytypeio/go-anytype-infrastructure-experiments/consensus =>
require ( require (
github.com/akrylysov/pogreb v0.10.1 github.com/akrylysov/pogreb v0.10.1
github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000
github.com/anytypeio/go-anytype-infrastructure-experiments/consensus v0.0.0-00010101000000-000000000000 github.com/anytypeio/go-anytype-infrastructure-experiments/consensus v0.0.0-20221107145605-92bdf7d57b48
github.com/gogo/protobuf v1.3.2
github.com/golang/mock v1.6.0 github.com/golang/mock v1.6.0
github.com/ipfs/go-block-format v0.0.3
github.com/ipfs/go-cid v0.3.2 github.com/ipfs/go-cid v0.3.2
github.com/stretchr/testify v1.8.0 github.com/stretchr/testify v1.8.1
go.uber.org/zap v1.23.0 go.uber.org/zap v1.24.0
storj.io/drpc v0.0.32
) )
require ( require (
@ -21,17 +24,17 @@ require (
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/cheggaaa/mb/v2 v2.0.1 // indirect github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c // indirect
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
github.com/fogleman/gg v1.3.0 // indirect github.com/fogleman/gg v1.3.0 // indirect
github.com/goccy/go-graphviz v0.0.9 // indirect github.com/goccy/go-graphviz v0.0.9 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
github.com/golang/protobuf v1.5.2 // indirect github.com/golang/protobuf v1.5.2 // indirect
github.com/huandu/skiplist v1.2.0 // indirect github.com/huandu/skiplist v1.2.0 // indirect
github.com/ipfs/go-ipfs-util v0.0.2 // indirect
github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect
github.com/klauspost/cpuid/v2 v2.1.1 // indirect github.com/klauspost/cpuid/v2 v2.2.2 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-libp2p v0.23.2 // indirect github.com/libp2p/go-libp2p v0.23.2 // indirect
github.com/libp2p/go-openssl v0.1.0 // indirect github.com/libp2p/go-openssl v0.1.0 // indirect
@ -41,12 +44,12 @@ require (
github.com/minio/sha256-simd v1.0.0 // indirect github.com/minio/sha256-simd v1.0.0 // indirect
github.com/mr-tron/base58 v1.2.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect
github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect
github.com/multiformats/go-base36 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect
github.com/multiformats/go-multiaddr v0.7.0 // indirect github.com/multiformats/go-multiaddr v0.7.0 // indirect
github.com/multiformats/go-multibase v0.1.1 // indirect github.com/multiformats/go-multibase v0.1.1 // indirect
github.com/multiformats/go-multicodec v0.6.0 // indirect github.com/multiformats/go-multicodec v0.6.0 // indirect
github.com/multiformats/go-multihash v0.2.1 // indirect github.com/multiformats/go-multihash v0.2.1 // indirect
github.com/multiformats/go-varint v0.0.6 // indirect github.com/multiformats/go-varint v0.0.7 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.13.0 // indirect github.com/prometheus/client_golang v1.13.0 // indirect
@ -58,12 +61,12 @@ require (
github.com/zeebo/blake3 v0.2.3 // indirect github.com/zeebo/blake3 v0.2.3 // indirect
github.com/zeebo/errs v1.3.0 // indirect github.com/zeebo/errs v1.3.0 // indirect
go.uber.org/atomic v1.10.0 // indirect go.uber.org/atomic v1.10.0 // indirect
go.uber.org/multierr v1.8.0 // indirect go.uber.org/multierr v1.9.0 // indirect
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect golang.org/x/crypto v0.4.0 // indirect
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b // indirect
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect golang.org/x/sys v0.3.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
lukechampine.com/blake3 v1.1.7 // indirect lukechampine.com/blake3 v1.1.7 // indirect
storj.io/drpc v0.0.32 // indirect
) )

View File

@ -57,8 +57,8 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cheggaaa/mb/v2 v2.0.1 h1:gn0khbEbKlw3i5VOYi0VnHEHayjZKfUDOyGSpHAybBs= github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c h1:+bD75daSbsxyTzkKpNplC4xls+7/tGwty+zruzOnOmk=
github.com/cheggaaa/mb/v2 v2.0.1/go.mod h1:XGeZw20Iqgjky26KL0mvCwk3+4NyZCUbshSo6ALne+c= github.com/cheggaaa/mb/v3 v3.0.0-20221122160120-e9034545510c/go.mod h1:zCt2QeYukhd/g0bIdNqF+b/kKz1hnLFNDkP49qN5kqI=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
@ -159,8 +159,13 @@ github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0Jr
github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw=
github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc=
github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk=
github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I=
github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc= github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc=
github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw=
github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8=
github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ=
github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
@ -178,8 +183,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
github.com/klauspost/cpuid/v2 v2.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0= github.com/klauspost/cpuid/v2 v2.2.2 h1:xPMwiykqNK9VK0NYC3+jTMYv9I6Vl3YdjZgPZKG3zO0=
github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.2/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
@ -201,6 +206,8 @@ github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o
github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ=
github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@ -208,22 +215,30 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA=
github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI=
github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4=
github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM=
github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0=
github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
github.com/multiformats/go-multiaddr v0.7.0 h1:gskHcdaCyPtp9XskVwtvEeQOG465sCohbQIirSyqxrc= github.com/multiformats/go-multiaddr v0.7.0 h1:gskHcdaCyPtp9XskVwtvEeQOG465sCohbQIirSyqxrc=
github.com/multiformats/go-multiaddr v0.7.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= github.com/multiformats/go-multiaddr v0.7.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs=
github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc=
github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI= github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI=
github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8=
github.com/multiformats/go-multicodec v0.6.0 h1:KhH2kSuCARyuJraYMFxrNO3DqIaYhOdS039kbhgVwpE= github.com/multiformats/go-multicodec v0.6.0 h1:KhH2kSuCARyuJraYMFxrNO3DqIaYhOdS039kbhgVwpE=
github.com/multiformats/go-multicodec v0.6.0/go.mod h1:GUC8upxSBE4oG+q3kWZRw/+6yC1BqO550bjhWsJbZlw= github.com/multiformats/go-multicodec v0.6.0/go.mod h1:GUC8upxSBE4oG+q3kWZRw/+6yC1BqO550bjhWsJbZlw=
github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc=
github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108=
github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc=
github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY= github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY=
@ -271,13 +286,15 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@ -302,20 +319,21 @@ go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@ -326,6 +344,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b h1:SCE/18RnFsLrjydh/R/s5EVvHoZprqEQUuoxK8q2Pc4=
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg=
@ -443,8 +463,9 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

View File

@ -1,39 +0,0 @@
.PHONY: nodes-start nodes-stop clients-start clients-stop clean-all log-node-1 log-node-2 log-node3 log-client-1 log-client-2 gen-configs
export GOPRIVATE=github.com/anytypeio
# TODO: make different folders in etc for different programs
gen-configs:
./init.sh config_gen
nodes-start:
./init.sh nodes_start
nodes-stop:
./init.sh nodes_stop
clean-all:
rm -rf tmp
clients-start:
./init.sh clients_start
clients-stop:
./init.sh clients_stop
log-node-1:
./init.sh node_log 1
log-node-2:
./init.sh node_log 2
log-node-3:
./init.sh node_log 3
log-client-1:
./init.sh client_log 1
log-client-2:
./init.sh client_log 2
debug:
@(echo "To run debug api please run './init.sh debug [params]' with respective args to debug client")

View File

@ -1,102 +0,0 @@
#!/bin/bash
export GOPRIVATE=github.com/anytypeio
NODE_GO="../../../node/cmd/node.go"
CLIENT_GO="../../../client/cmd/client.go"
DEBUG_GO="../util/cmd/debug/debug.go"
NODEMAP_YML="../util/cmd/nodesgen/nodemap.yml"
CONFIGS_DIR="../../../etc/configs"
NODESGEN_GO="../util/cmd/nodesgen/gen.go"
ETC_DIR="../etc"
do_usage() {
echo "usage: $0 {nodes_start|nodes_stop|clients_start|clients_stop|debug|config_gen}"
echo "usage: $0 node_log <N>"
echo "usage: $0 client_log <N>"
exit 1
}
do_nodes_start() {
for NUMBER in {1..3}; do
install -d tmp/node$NUMBER/ tmp/log/
(cd tmp/node$NUMBER && go run $NODE_GO -c $CONFIGS_DIR/node$NUMBER.yml &>../log/node$NUMBER.log) &
NODE_PID=$!
echo $NODE_PID >tmp/node$NUMBER.pid
echo NODE_PID=$NODE_PID
done
}
do_nodes_stop() {
for NUMBER in {1..3}; do
NODE_PID=$(cat tmp/node$NUMBER.pid)
pkill -P $NODE_PID
pkill -f $CONFIGS_DIR/node$NUMBER.yml
done
}
do_node_log() {
local NODE_NUMBER=$1
tail -f -n 500 tmp/log/node$NODE_NUMBER.log
}
do_client_log() {
local CLIENT_NUMBER=$1
tail -f -n 500 tmp/log/client$CLIENT_NUMBER.log
}
do_config_gen() {
go run $NODESGEN_GO -n $NODEMAP_YML -e $ETC_DIR
cp -rf $ETC_DIR/configs/node1.yml $ETC_DIR/config.yml
cp -rf $ETC_DIR/configs/client1.yml $ETC_DIR/client.yml
}
do_clients_start() {
for NUMBER in {1..2}; do
install -d tmp/client$NUMBER/ tmp/log/
(cd tmp/client$NUMBER && go run $CLIENT_GO -c $CONFIGS_DIR/client$NUMBER.yml &>../log/client$NUMBER.log) &
CLIENT_PID=$!
echo $CLIENT_PID >tmp/client$NUMBER.pid
echo CLIENT_PID=$CLIENT_PID
done
}
do_clients_stop() {
for NUMBER in {1..2}; do
CLIENT_PID=$(cat tmp/client$NUMBER.pid)
pkill -P $CLIENT_PID
pkill -f $CONFIGS_DIR/client$NUMBER.yml
done
}
do_debug() {
go run $DEBUG_GO --config $NODEMAP_YML $*
}
case $1 in
nodes_start | nodes_stop | clients_start | clients_stop | config_gen)
do_$1
;;
debug)
first_arg=$1
shift
do_$first_arg $*
;;
node_log)
if [[ -z $2 ]]; then
do_usage
else
do_$1 $2
fi
;;
client_log)
if [[ -z $2 ]]; then
do_usage
else
do_$1 $2
fi
;;
*)
do_usage
;;
esac

View File

@ -24,6 +24,8 @@ type Service interface {
AllTrees(ctx context.Context, ip string, request *apiproto.AllTreesRequest) (resp *apiproto.AllTreesResponse, err error) AllTrees(ctx context.Context, ip string, request *apiproto.AllTreesRequest) (resp *apiproto.AllTreesResponse, err error)
AllSpaces(ctx context.Context, ip string, request *apiproto.AllSpacesRequest) (resp *apiproto.AllSpacesResponse, err error) AllSpaces(ctx context.Context, ip string, request *apiproto.AllSpacesRequest) (resp *apiproto.AllSpacesResponse, err error)
LoadSpace(ctx context.Context, ip string, request *apiproto.LoadSpaceRequest) (res *apiproto.LoadSpaceResponse, err error) LoadSpace(ctx context.Context, ip string, request *apiproto.LoadSpaceRequest) (res *apiproto.LoadSpaceResponse, err error)
Watch(ctx context.Context, ip string, request *apiproto.WatchRequest) (res *apiproto.WatchResponse, err error)
Unwatch(ctx context.Context, ip string, request *apiproto.UnwatchRequest) (res *apiproto.UnwatchResponse, err error)
PutFile(ctx context.Context, ip string, request *apiproto.PutFileRequest) (resp *apiproto.PutFileResponse, err error) PutFile(ctx context.Context, ip string, request *apiproto.PutFileRequest) (resp *apiproto.PutFileResponse, err error)
GetFile(ctx context.Context, ip string, request *apiproto.GetFileRequest) (resp *apiproto.GetFileResponse, err error) GetFile(ctx context.Context, ip string, request *apiproto.GetFileRequest) (resp *apiproto.GetFileResponse, err error)
DeleteFile(ctx context.Context, ip string, request *apiproto.DeleteFileRequest) (resp *apiproto.DeleteFileResponse, err error) DeleteFile(ctx context.Context, ip string, request *apiproto.DeleteFileRequest) (resp *apiproto.DeleteFileResponse, err error)
@ -126,6 +128,22 @@ func (s *service) LoadSpace(ctx context.Context, ip string, request *apiproto.Lo
return cl.LoadSpace(ctx, request) return cl.LoadSpace(ctx, request)
} }
func (s *service) Watch(ctx context.Context, ip string, request *apiproto.WatchRequest) (res *apiproto.WatchResponse, err error) {
cl, err := s.client.GetClient(ctx, ip)
if err != nil {
return
}
return cl.Watch(ctx, request)
}
func (s *service) Unwatch(ctx context.Context, ip string, request *apiproto.UnwatchRequest) (res *apiproto.UnwatchResponse, err error) {
cl, err := s.client.GetClient(ctx, ip)
if err != nil {
return
}
return cl.Unwatch(ctx, request)
}
func (s *service) PutFile(ctx context.Context, ip string, request *apiproto.PutFileRequest) (resp *apiproto.PutFileResponse, err error) { func (s *service) PutFile(ctx context.Context, ip string, request *apiproto.PutFileRequest) (resp *apiproto.PutFileResponse, err error) {
cl, err := s.client.GetClient(ctx, ip) cl, err := s.client.GetClient(ctx, ip)
if err != nil { if err != nil {

View File

@ -291,6 +291,62 @@ func (s *service) registerClientCommands() {
} }
s.clientCommands = append(s.clientCommands, cmdAllSpaces) s.clientCommands = append(s.clientCommands, cmdAllSpaces)
cmdTreeWatch := &cobra.Command{
Use: "tree-watch [document]",
Short: "start watching the tree (prints in logs the status on the client side)",
Args: cobra.RangeArgs(1, 1),
Run: func(cmd *cobra.Command, args []string) {
cli, _ := cmd.Flags().GetString("client")
space, _ := cmd.Flags().GetString("space")
addr, ok := s.peers[cli]
if !ok {
fmt.Println("no such client")
return
}
_, err := s.client.Watch(context.Background(), addr, &clientproto.WatchRequest{
SpaceId: space,
TreeId: args[0],
})
if err != nil {
fmt.Println("couldn't start watching tree", err)
return
}
fmt.Println(args[0])
},
}
cmdTreeWatch.Flags().String("space", "", "the space where something is happening :-)")
cmdTreeWatch.MarkFlagRequired("space")
s.clientCommands = append(s.clientCommands, cmdTreeWatch)
cmdTreeUnwatch := &cobra.Command{
Use: "tree-unwatch [document]",
Short: "stop watching the tree (prints in logs the status on the client side)",
Args: cobra.RangeArgs(1, 1),
Run: func(cmd *cobra.Command, args []string) {
cli, _ := cmd.Flags().GetString("client")
space, _ := cmd.Flags().GetString("space")
addr, ok := s.peers[cli]
if !ok {
fmt.Println("no such client")
return
}
_, err := s.client.Unwatch(context.Background(), addr, &clientproto.UnwatchRequest{
SpaceId: space,
TreeId: args[0],
})
if err != nil {
fmt.Println("couldn't stop watching tree", err)
return
}
fmt.Println(args[0])
},
}
cmdTreeUnwatch.Flags().String("space", "", "the space where something is happening :-)")
cmdTreeUnwatch.MarkFlagRequired("space")
s.clientCommands = append(s.clientCommands, cmdTreeUnwatch)
cmdPutFile := &cobra.Command{ cmdPutFile := &cobra.Command{
Use: "put-file", Use: "put-file",
Short: "put new file by path", Short: "put new file by path",

View File

@ -48,7 +48,7 @@ func (s *service) registerScripts() {
SpaceId: space, SpaceId: space,
DocumentId: document, DocumentId: document,
Text: args[0], Text: args[0],
IsSnapshot: rand.Int()%2 == 0, IsSnapshot: rand.Int()%10 == 0,
}) })
if err != nil { if err != nil {
mError.Add(err) mError.Add(err)
@ -58,7 +58,7 @@ func (s *service) registerScripts() {
} }
for _, p := range addresses { for _, p := range addresses {
wg.Add(1) wg.Add(1)
createMany(p) go createMany(p)
} }
wg.Wait() wg.Wait()
if mError.Err() != nil { if mError.Err() != nil {

View File

@ -50,7 +50,7 @@ func (s *service) Init(a *app.App) (err error) {
func (s *service) Run(ctx context.Context) (err error) { func (s *service) Run(ctx context.Context) (err error) {
rootCmd := &cobra.Command{Use: "debug", PersistentPreRun: func(cmd *cobra.Command, args []string) { rootCmd := &cobra.Command{Use: "debug", PersistentPreRun: func(cmd *cobra.Command, args []string) {
cfgPath, err := cmd.Flags().GetString("config") cfgPath, err := cmd.Flags().GetString("nodemap")
if err != nil { if err != nil {
panic(fmt.Sprintf("no config flag is registered: %s", err.Error())) panic(fmt.Sprintf("no config flag is registered: %s", err.Error()))
} }
@ -59,7 +59,7 @@ func (s *service) Run(ctx context.Context) (err error) {
panic(fmt.Sprintf("couldn't load config with addresses of nodes: %s", err.Error())) panic(fmt.Sprintf("couldn't load config with addresses of nodes: %s", err.Error()))
} }
}} }}
rootCmd.PersistentFlags().String("config", "util/cmd/nodesgen/nodemap.yml", "nodes configuration") rootCmd.PersistentFlags().String("nodemap", "util/cmd/nodesgen/nodemap.yml", "nodes configuration")
clientCmd := &cobra.Command{Use: "client commands to be executed on a specified client"} clientCmd := &cobra.Command{Use: "client commands to be executed on a specified client"}
clientCmd.PersistentFlags().StringP("client", "c", "", "the alias of the client") clientCmd.PersistentFlags().StringP("client", "c", "", "the alias of the client")

327
util/cmd/deploy/deploy.go Normal file
View File

@ -0,0 +1,327 @@
package main
import (
"context"
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/spf13/cobra"
"go.uber.org/zap"
"os"
"os/exec"
"path"
"path/filepath"
"sync"
)
var log = logger.NewNamed("cmd.deploy")
type rootArgs struct {
configPath string
nodePkgPath string
nodeBinaryPath string
clientPkgPath string
clientBinaryPath string
dbPath string
initialPath string
nodePkgName string
clientPkgName string
isDebug bool
}
type appPath struct {
wdPath string
binaryPath string
configPath string
logPath string
debugPortNum int
isDebug bool
}
const (
anytypeClientBinaryName = "anytype-client"
anytypeNodeBinaryName = "anytype-node"
)
var rootCmd = &cobra.Command{
Use: "deploy",
PersistentPreRun: func(cmd *cobra.Command, args []string) {
rootArguments := rootArgs{}
rootArguments.nodePkgName, _ = cmd.Flags().GetString("node-pkg")
rootArguments.clientPkgName, _ = cmd.Flags().GetString("client-pkg")
// checking configs
cfgPath, _ := cmd.Flags().GetString("config-path")
if _, err := os.Stat(cfgPath); os.IsNotExist(err) {
log.With(zap.Error(err)).Fatal("the config directory doesn't exist")
}
rootArguments.configPath, _ = filepath.Abs(cfgPath)
// checking node package
nodePath, _ := cmd.Flags().GetString("node-path")
if _, err := os.Stat(path.Join(nodePath, "go.mod")); os.IsNotExist(err) {
log.With(zap.Error(err)).Fatal("the path to node does not contain a go module")
}
rootArguments.nodePkgPath, _ = filepath.Abs(nodePath)
// checking client package
clientPath, _ := cmd.Flags().GetString("client-path")
if _, err := os.Stat(path.Join(clientPath, "go.mod")); os.IsNotExist(err) {
log.With(zap.Error(err)).Fatal("the path to client does not contain a go module")
}
rootArguments.clientPkgPath, _ = filepath.Abs(clientPath)
// checking binary path
binaryPath, _ := cmd.Flags().GetString("bin-path")
err := createDirectoryIfNotExists(binaryPath)
if err != nil {
log.With(zap.Error(err)).Fatal("failed to create directory")
}
absoluteBinPath, _ := filepath.Abs(binaryPath)
rootArguments.clientBinaryPath = path.Join(absoluteBinPath, anytypeClientBinaryName)
rootArguments.nodeBinaryPath = path.Join(absoluteBinPath, anytypeNodeBinaryName)
// getting debug mode
rootArguments.isDebug, _ = cmd.Flags().GetBool("debug")
// checking db path
dbPath, _ := cmd.Flags().GetString("db-path")
err = createDirectoryIfNotExists(dbPath)
if err != nil {
log.With(zap.Error(err)).Fatal("failed to create directory")
}
rootArguments.dbPath, _ = filepath.Abs(dbPath)
ctx := context.WithValue(context.Background(), "rootArguments", rootArguments)
cmd.SetContext(ctx)
},
}
var buildRunAllCmd = &cobra.Command{
Use: "build-run-all",
Long: "build and then run all clients and nodes",
Run: func(cmd *cobra.Command, args []string) {
rootArguments, ok := cmd.Context().Value("rootArguments").(rootArgs)
if !ok {
log.Fatal("did not get context")
}
numNodes, _ := cmd.Flags().GetUint("nodes")
numClients, _ := cmd.Flags().GetUint("clients")
// running the script
err := buildRunAll(rootArguments, numClients, numNodes)
if err != nil {
log.With(zap.Error(err)).Fatal("failed to run the command")
}
},
}
var buildAllCmd = &cobra.Command{
Use: "build-all",
Long: "builds both the clients and nodes",
Run: func(cmd *cobra.Command, args []string) {
rootArguments, ok := cmd.Context().Value("rootArguments").(rootArgs)
if !ok {
log.Fatal("did not get context")
}
err := buildAll(rootArguments)
if err != nil {
log.With(zap.Error(err)).Fatal("failed to run the command")
return
}
},
}
var runAllCmd = &cobra.Command{
Use: "run-all",
Long: "runs all clients and nodes",
Run: func(cmd *cobra.Command, args []string) {
rootArguments, ok := cmd.Context().Value("rootArguments").(rootArgs)
if !ok {
log.Fatal("did not get context")
}
numNodes, _ := cmd.Flags().GetUint("nodes")
numClients, _ := cmd.Flags().GetUint("clients")
err := runAll(rootArguments, numClients, numNodes)
if err != nil {
log.With(zap.Error(err)).Fatal("failed to run the command")
return
}
},
}
func init() {
rootCmd.PersistentFlags().String("config-path", "etc/configs", "generated configs")
rootCmd.PersistentFlags().String("node-pkg", "github.com/anytypeio/go-anytype-infrastructure-experiments/node/cmd", "node package")
rootCmd.PersistentFlags().String("client-pkg", "github.com/anytypeio/go-anytype-infrastructure-experiments/client/cmd", "client package")
rootCmd.PersistentFlags().String("node-path", "node", "path to node go.mod")
rootCmd.PersistentFlags().String("client-path", "client", "path to client go.mod")
rootCmd.PersistentFlags().String("bin-path", "bin", "path to folder where all the binaries are")
rootCmd.PersistentFlags().String("db-path", "db", "path to folder where the working directories should be placed")
rootCmd.PersistentFlags().Bool("debug", false, "this tells if we should run the profiler")
buildRunAllCmd.Flags().UintP("nodes", "n", 3, "number of nodes to be generated")
buildRunAllCmd.Flags().UintP("clients", "c", 2, "number of clients to be generated")
runAllCmd.Flags().UintP("nodes", "n", 3, "number of nodes to be generated")
runAllCmd.Flags().UintP("clients", "c", 2, "number of clients to be generated")
rootCmd.AddCommand(buildRunAllCmd)
rootCmd.AddCommand(buildAllCmd)
rootCmd.AddCommand(runAllCmd)
}
func main() {
err := rootCmd.Execute()
if err != nil {
log.With(zap.Error(err)).Fatal("failed to execute the command")
}
}
func createDirectoryIfNotExists(dirPath string) (err error) {
if _, err = os.Stat(dirPath); !os.IsNotExist(err) {
return
}
return os.Mkdir(dirPath, os.ModePerm)
}
func createAppPaths(args rootArgs, binaryPath, appName string, portNum, num int) (appPaths []appPath, err error) {
appTypePath := path.Join(args.dbPath, appName)
err = createDirectoryIfNotExists(appTypePath)
if err != nil {
return
}
for i := 0; i < num; i++ {
// checking if relevant config exists
cfgPath := path.Join(args.configPath, fmt.Sprintf("%s%d.yml", appName, i+1))
if _, err = os.Stat(cfgPath); os.IsNotExist(err) {
err = fmt.Errorf("not enough %s configs are generated: %w", appName, err)
return
}
// creating directory for each app
resPath := path.Join(appTypePath, fmt.Sprintf("%d", i+1))
err = createDirectoryIfNotExists(resPath)
if err != nil {
return
}
appPaths = append(appPaths, appPath{
wdPath: resPath,
binaryPath: binaryPath,
configPath: cfgPath,
logPath: path.Join(resPath, "app.log"),
debugPortNum: portNum + i + 1,
isDebug: args.isDebug,
})
}
return
}
func buildRunAll(args rootArgs, numClients, numNodes uint) (err error) {
err = buildAll(args)
if err != nil {
err = fmt.Errorf("failed to build all: %w", err)
return
}
return runAll(args, numClients, numNodes)
}
func runAll(args rootArgs, numClients uint, numNodes uint) (err error) {
nodePaths, err := createAppPaths(args, args.nodeBinaryPath, "node", 6060, int(numNodes))
if err != nil {
err = fmt.Errorf("failed to create working directories for nodes: %w", err)
return
}
clientPaths, err := createAppPaths(args, args.clientBinaryPath, "client", 6070, int(numClients))
if err != nil {
err = fmt.Errorf("failed to create working directories for clients: %w", err)
return
}
wg := sync.WaitGroup{}
for _, nodePath := range nodePaths {
wg.Add(1)
go func(path appPath) {
err = runApp(path, &wg)
if err != nil {
log.With(zap.Error(err)).Error("running node failed with error")
}
}(nodePath)
}
for _, clientPath := range clientPaths {
wg.Add(1)
go func(path appPath) {
err = runApp(path, &wg)
if err != nil {
log.With(zap.Error(err)).Error("running node failed with error")
}
}(clientPath)
}
wg.Wait()
return
}
func buildAll(args rootArgs) (err error) {
err = build(args.nodePkgPath, args.nodeBinaryPath, args.nodePkgName)
if err != nil {
err = fmt.Errorf("failed to build node: %w", err)
return
}
err = build(args.clientPkgPath, args.clientBinaryPath, args.clientPkgName)
if err != nil {
err = fmt.Errorf("failed to build client: %w", err)
return
}
return
}
func build(dirPath, binaryPath, packageName string) (err error) {
cmd := exec.Command("go", "build", "-v", "-o", binaryPath, packageName)
cmd.Dir = dirPath
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Start()
if err != nil {
return
}
log.With(zap.String("binary path", binaryPath), zap.String("package name", packageName)).Info("building the app")
return cmd.Wait()
}
func runApp(app appPath, wg *sync.WaitGroup) (err error) {
cmd := exec.Command(app.binaryPath, "-c", app.configPath)
cmd.Dir = app.wdPath
log := log
if app.isDebug {
log = log.With(zap.String("debug on", fmt.Sprintf("localhost:%d/debug/pprof", app.debugPortNum)))
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, fmt.Sprintf("ANYPROF=127.0.0.1:%d", app.debugPortNum))
}
file, err := os.OpenFile(app.logPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModePerm)
if err != nil {
return
}
defer file.Close()
cmd.Stdout = file
cmd.Stderr = file
err = cmd.Start()
log.With(zap.String("working directory", app.wdPath), zap.String("log path", app.logPath)).Info("running the app")
if err != nil {
return
}
err = cmd.Wait()
wg.Done()
return
}

View File

@ -199,7 +199,11 @@ func genNodeConfig(addresses []string, apiAddresses []string, num int) (config.C
}, },
Space: config.Space{ Space: config.Space{
GCTTL: 60, GCTTL: 60,
SyncPeriod: 11, SyncPeriod: 600,
},
Stream: config.Stream{
TimeoutMilliseconds: 1000,
MaxMsgSizeMb: 256,
}, },
FileStorePogreb: config.FileStorePogreb{ FileStorePogreb: config.FileStorePogreb{
Path: fmt.Sprintf("db/node/%d/files", num), Path: fmt.Sprintf("db/node/%d/files", num),
@ -252,7 +256,11 @@ func genClientConfig(addresses []string, apiAddresses []string, encKey encryptio
}, },
Space: config.Space{ Space: config.Space{
GCTTL: 60, GCTTL: 60,
SyncPeriod: 11, SyncPeriod: 20,
},
Stream: config.Stream{
TimeoutMilliseconds: 1000,
MaxMsgSizeMb: 256,
}, },
}, nil }, nil
} }
@ -299,5 +307,9 @@ func genConsensusConfig(addresses []string) (cconfig.Config, error) {
Database: "consensus", Database: "consensus",
LogCollection: "log", LogCollection: "log",
}, },
Stream: config.Stream{
TimeoutMilliseconds: 1000,
MaxMsgSizeMb: 256,
},
}, nil }, nil
} }

View File

@ -8,13 +8,20 @@ replace github.com/anytypeio/go-anytype-infrastructure-experiments/consensus =>
require ( require (
github.com/akrylysov/pogreb v0.10.1 github.com/akrylysov/pogreb v0.10.1
github.com/anytypeio/go-anytype-infrastructure-experiments/client v0.0.0-20221217135026-4eba413631b3
github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000
github.com/anytypeio/go-anytype-infrastructure-experiments/consensus v0.0.0-00010101000000-000000000000 github.com/anytypeio/go-anytype-infrastructure-experiments/consensus v0.0.0-00010101000000-000000000000
github.com/anytypeio/go-anytype-infrastructure-experiments/node v0.0.0-20221217135026-4eba413631b3
github.com/dgraph-io/badger/v3 v3.2103.3 github.com/dgraph-io/badger/v3 v3.2103.3
github.com/spf13/cobra v1.6.1
github.com/zeebo/errs v1.3.0
go.uber.org/zap v1.23.0
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
storj.io/drpc v0.0.32
) )
require ( require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
@ -26,14 +33,15 @@ require (
github.com/golang/protobuf v1.5.2 // indirect github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/snappy v0.0.3 // indirect github.com/golang/snappy v0.0.3 // indirect
github.com/google/flatbuffers v1.12.1 // indirect github.com/google/flatbuffers v1.12.1 // indirect
github.com/inconshreveable/mousetrap v1.0.1 // indirect
github.com/ipfs/go-cid v0.3.2 // indirect github.com/ipfs/go-cid v0.3.2 // indirect
github.com/klauspost/compress v1.15.10 // indirect github.com/klauspost/compress v1.15.10 // indirect
github.com/klauspost/cpuid/v2 v2.1.1 // indirect github.com/klauspost/cpuid/v2 v2.1.1 // indirect
github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect
github.com/libp2p/go-libp2p v0.23.2 // indirect github.com/libp2p/go-libp2p v0.23.2 // indirect
github.com/libp2p/go-libp2p-core v0.20.1 // indirect
github.com/libp2p/go-openssl v0.1.0 // indirect github.com/libp2p/go-openssl v0.1.0 // indirect
github.com/mattn/go-pointer v0.0.1 // indirect github.com/mattn/go-pointer v0.0.1 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/minio/sha256-simd v1.0.0 // indirect github.com/minio/sha256-simd v1.0.0 // indirect
github.com/mr-tron/base58 v1.2.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect
github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect
@ -44,12 +52,16 @@ require (
github.com/multiformats/go-multihash v0.2.1 // indirect github.com/multiformats/go-multihash v0.2.1 // indirect
github.com/multiformats/go-varint v0.0.6 // indirect github.com/multiformats/go-varint v0.0.6 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_golang v1.13.0 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.37.0 // indirect
github.com/prometheus/procfs v0.8.0 // indirect
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
go.opencensus.io v0.23.0 // indirect go.opencensus.io v0.23.0 // indirect
go.uber.org/atomic v1.10.0 // indirect go.uber.org/atomic v1.10.0 // indirect
go.uber.org/multierr v1.8.0 // indirect go.uber.org/multierr v1.8.0 // indirect
go.uber.org/zap v1.23.0 // indirect
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 // indirect golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 // indirect
golang.org/x/sys v0.0.0-20221010170243-090e33056c14 // indirect golang.org/x/sys v0.0.0-20221010170243-090e33056c14 // indirect

View File

@ -1,23 +1,73 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/akrylysov/pogreb v0.10.1 h1:FqlR8VR7uCbJdfUob916tPM+idpKgeESDXOA1K0DK4w= github.com/akrylysov/pogreb v0.10.1 h1:FqlR8VR7uCbJdfUob916tPM+idpKgeESDXOA1K0DK4w=
github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/anytypeio/go-anytype-infrastructure-experiments/client v0.0.0-20221217135026-4eba413631b3 h1:iX9taMq1d14DEvYWuFu5tMqu53UBdggo5A5GlIZ6MrI=
github.com/anytypeio/go-anytype-infrastructure-experiments/client v0.0.0-20221217135026-4eba413631b3/go.mod h1:7POs4rwsbW1PF4Yq16WsSa45aTkhiDuxURe8Lie2Rjg=
github.com/anytypeio/go-anytype-infrastructure-experiments/node v0.0.0-20221217135026-4eba413631b3 h1:isOhnFlIaZkRyh4a365vcvcgX85Ov8ajLdT5FELH5KM=
github.com/anytypeio/go-anytype-infrastructure-experiments/node v0.0.0-20221217135026-4eba413631b3/go.mod h1:Fh11elr9BbUclH39bVwKhnsQIEXIj2ArjdAgSmC65vM=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -37,45 +87,100 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw=
github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc= github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc=
github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
@ -85,6 +190,9 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0= github.com/klauspost/cpuid/v2 v2.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0=
github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@ -94,17 +202,22 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6
github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg=
github.com/libp2p/go-libp2p v0.23.2 h1:yqyTeKQJyofWXxEv/eEVUvOrGdt/9x+0PIQ4N1kaxmE= github.com/libp2p/go-libp2p v0.23.2 h1:yqyTeKQJyofWXxEv/eEVUvOrGdt/9x+0PIQ4N1kaxmE=
github.com/libp2p/go-libp2p v0.23.2/go.mod h1:s9DEa5NLR4g+LZS+md5uGU4emjMWFiqkZr6hBTY8UxI= github.com/libp2p/go-libp2p v0.23.2/go.mod h1:s9DEa5NLR4g+LZS+md5uGU4emjMWFiqkZr6hBTY8UxI=
github.com/libp2p/go-libp2p-core v0.20.1 h1:fQz4BJyIFmSZAiTbKV8qoYhEH5Dtv/cVhZbG3Ib/+Cw=
github.com/libp2p/go-libp2p-core v0.20.1/go.mod h1:6zR8H7CvQWgYLsbG4on6oLNSGcyKaYFSEYyDt51+bIY=
github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo=
github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0=
github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE=
@ -121,13 +234,46 @@ github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d
github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc=
github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY=
github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU=
github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU=
github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@ -136,10 +282,15 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@ -148,8 +299,18 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
@ -161,71 +322,261 @@ go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=
go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 h1:KafLifaRFIuSJ5C+7CyFJOF9haxKNC1CEIDk8GX6X0k= golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 h1:KafLifaRFIuSJ5C+7CyFJOF9haxKNC1CEIDk8GX6X0k=
golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20221010170243-090e33056c14 h1:k5II8e6QD8mITdi+okbbmR/cIyEbeXLBhy5Ha4nevyc= golang.org/x/sys v0.0.0-20221010170243-090e33056c14 h1:k5II8e6QD8mITdi+okbbmR/cIyEbeXLBhy5Ha4nevyc=
golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
@ -235,20 +586,39 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0=
lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
storj.io/drpc v0.0.32 h1:5p5ZwsK/VOgapaCu+oxaPVwO6UwIs+iwdMiD50+R4PI=
storj.io/drpc v0.0.32/go.mod h1:6rcOyR/QQkSTX/9L5ZGtlZaE2PtXTTZl8d+ulSeeYEg=