merge
This commit is contained in:
commit
0b27fe7642
@ -986,6 +986,182 @@ func (m *TreeParamsResponse) GetHeadIds() []string {
|
||||
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 {
|
||||
Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,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 (*PutFileRequest) ProtoMessage() {}
|
||||
func (*PutFileRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_fc31080c27db9707, []int{21}
|
||||
return fileDescriptor_fc31080c27db9707, []int{25}
|
||||
}
|
||||
func (m *PutFileRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@ -1046,7 +1222,7 @@ func (m *PutFileResponse) Reset() { *m = PutFileResponse{} }
|
||||
func (m *PutFileResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*PutFileResponse) ProtoMessage() {}
|
||||
func (*PutFileResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_fc31080c27db9707, []int{22}
|
||||
return fileDescriptor_fc31080c27db9707, []int{26}
|
||||
}
|
||||
func (m *PutFileResponse) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@ -1091,7 +1267,7 @@ func (m *GetFileRequest) Reset() { *m = GetFileRequest{} }
|
||||
func (m *GetFileRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*GetFileRequest) ProtoMessage() {}
|
||||
func (*GetFileRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_fc31080c27db9707, []int{23}
|
||||
return fileDescriptor_fc31080c27db9707, []int{27}
|
||||
}
|
||||
func (m *GetFileRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@ -1142,7 +1318,7 @@ func (m *GetFileResponse) Reset() { *m = GetFileResponse{} }
|
||||
func (m *GetFileResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*GetFileResponse) ProtoMessage() {}
|
||||
func (*GetFileResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_fc31080c27db9707, []int{24}
|
||||
return fileDescriptor_fc31080c27db9707, []int{28}
|
||||
}
|
||||
func (m *GetFileResponse) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@ -1186,7 +1362,7 @@ func (m *DeleteFileRequest) Reset() { *m = DeleteFileRequest{} }
|
||||
func (m *DeleteFileRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*DeleteFileRequest) ProtoMessage() {}
|
||||
func (*DeleteFileRequest) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_fc31080c27db9707, []int{25}
|
||||
return fileDescriptor_fc31080c27db9707, []int{29}
|
||||
}
|
||||
func (m *DeleteFileRequest) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@ -1229,7 +1405,7 @@ func (m *DeleteFileResponse) Reset() { *m = DeleteFileResponse{} }
|
||||
func (m *DeleteFileResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*DeleteFileResponse) ProtoMessage() {}
|
||||
func (*DeleteFileResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_fc31080c27db9707, []int{26}
|
||||
return fileDescriptor_fc31080c27db9707, []int{30}
|
||||
}
|
||||
func (m *DeleteFileResponse) XXX_Unmarshal(b []byte) error {
|
||||
return m.Unmarshal(b)
|
||||
@ -1280,6 +1456,10 @@ func init() {
|
||||
proto.RegisterType((*LoadSpaceResponse)(nil), "clientapi.LoadSpaceResponse")
|
||||
proto.RegisterType((*TreeParamsRequest)(nil), "clientapi.TreeParamsRequest")
|
||||
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((*PutFileResponse)(nil), "clientapi.PutFileResponse")
|
||||
proto.RegisterType((*GetFileRequest)(nil), "clientapi.GetFileRequest")
|
||||
@ -1291,54 +1471,58 @@ func init() {
|
||||
func init() { proto.RegisterFile("api/apiproto/protos/api.proto", fileDescriptor_fc31080c27db9707) }
|
||||
|
||||
var fileDescriptor_fc31080c27db9707 = []byte{
|
||||
// 746 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x4f, 0x4f, 0xdb, 0x4e,
|
||||
0x10, 0xc5, 0x21, 0x10, 0x32, 0xfc, 0x94, 0x90, 0xe5, 0x8f, 0xfc, 0x73, 0x89, 0x95, 0xae, 0x04,
|
||||
0x8d, 0x54, 0x04, 0x2a, 0xbd, 0xb4, 0x97, 0x0a, 0x4a, 0x44, 0x15, 0x95, 0x4a, 0x34, 0xd0, 0x4b,
|
||||
0x6f, 0x5b, 0xbc, 0x52, 0x2c, 0x25, 0xb1, 0x1b, 0x3b, 0x15, 0xa7, 0x7e, 0x86, 0x7e, 0xac, 0x4a,
|
||||
0xbd, 0x70, 0xec, 0xb1, 0x82, 0x2f, 0x52, 0xad, 0xbd, 0xf6, 0xee, 0xac, 0x1d, 0x50, 0xc5, 0x05,
|
||||
0x76, 0x77, 0x66, 0xde, 0x7b, 0xeb, 0x9d, 0x79, 0x0a, 0xb4, 0x59, 0xe8, 0x1f, 0xb0, 0xd0, 0x0f,
|
||||
0xa7, 0x41, 0x1c, 0x1c, 0x24, 0x7f, 0x23, 0xb1, 0xdf, 0x4f, 0x96, 0xa4, 0x7e, 0x35, 0xf2, 0xf9,
|
||||
0x24, 0x66, 0xa1, 0x4f, 0x37, 0x80, 0x9c, 0x4c, 0x39, 0x8b, 0xf9, 0x45, 0xc8, 0xae, 0xf8, 0x80,
|
||||
0x7f, 0x9d, 0xf1, 0x28, 0xa6, 0x3b, 0xb0, 0x8e, 0x4e, 0xa3, 0x30, 0x98, 0x44, 0x9c, 0x34, 0xa0,
|
||||
0xe2, 0x7b, 0xb6, 0xd5, 0xb1, 0xba, 0xf5, 0x41, 0xc5, 0xf7, 0x44, 0x71, 0x8f, 0x4f, 0xfd, 0x6f,
|
||||
0x85, 0x62, 0x74, 0x3a, 0xa7, 0xf8, 0x05, 0x6c, 0xa6, 0x1c, 0xbd, 0xe0, 0x6a, 0x36, 0xe6, 0x93,
|
||||
0x58, 0xd6, 0x13, 0x1b, 0x6a, 0x91, 0xa8, 0xec, 0x67, 0xd9, 0xd9, 0x96, 0x76, 0x61, 0xcb, 0x2c,
|
||||
0x99, 0x03, 0xfe, 0x11, 0x36, 0x7b, 0x7c, 0xc4, 0xff, 0x01, 0x9c, 0xb8, 0x00, 0x9e, 0x4c, 0xee,
|
||||
0x7b, 0x76, 0x25, 0x09, 0x6a, 0x27, 0xd4, 0x86, 0x2d, 0x13, 0x32, 0x25, 0xa7, 0xdf, 0xa1, 0x71,
|
||||
0xec, 0x79, 0x97, 0xfc, 0xfa, 0xf1, 0x2c, 0x84, 0x40, 0x35, 0xe6, 0xd7, 0xb1, 0xbd, 0x98, 0x44,
|
||||
0x92, 0xb5, 0xa8, 0xf1, 0xa3, 0x8b, 0x09, 0x0b, 0xa3, 0x61, 0x10, 0xdb, 0xd5, 0x8e, 0xd5, 0x5d,
|
||||
0x19, 0x68, 0x27, 0x94, 0x41, 0x33, 0xe7, 0x97, 0xdf, 0x03, 0xd3, 0x58, 0x05, 0x9a, 0x2d, 0x58,
|
||||
0x1e, 0x72, 0xe6, 0xe5, 0x12, 0xe4, 0x4e, 0x9c, 0x4f, 0x83, 0x40, 0xd4, 0xa4, 0x02, 0xe4, 0x8e,
|
||||
0xbe, 0x87, 0x66, 0x6f, 0x36, 0x0e, 0x2f, 0xa7, 0x9c, 0x3f, 0xfe, 0x4b, 0xee, 0xc2, 0x9a, 0x02,
|
||||
0x93, 0x82, 0x09, 0x54, 0xbd, 0xd9, 0x38, 0x94, 0x50, 0xc9, 0x9a, 0x3e, 0x87, 0xe6, 0xf1, 0x68,
|
||||
0x24, 0xd2, 0xa2, 0x87, 0x7b, 0x63, 0x0f, 0xaa, 0x22, 0xd3, 0xec, 0x04, 0xb2, 0x01, 0x4b, 0xe2,
|
||||
0x6e, 0x91, 0x5d, 0xe9, 0x2c, 0x76, 0xeb, 0x83, 0x74, 0x43, 0x5f, 0xc3, 0x9a, 0x82, 0x96, 0x12,
|
||||
0x76, 0x60, 0x29, 0x16, 0x07, 0xb6, 0xd5, 0x59, 0xec, 0xae, 0x1e, 0x36, 0xf7, 0xf3, 0x29, 0xd9,
|
||||
0x4f, 0xa4, 0xa6, 0x51, 0x4a, 0x92, 0xd2, 0xa4, 0xb7, 0x33, 0x59, 0xf4, 0x00, 0x5a, 0xda, 0x99,
|
||||
0xc4, 0x73, 0x60, 0x45, 0x8a, 0x4b, 0x21, 0xeb, 0x83, 0x7c, 0x4f, 0xf7, 0x60, 0xed, 0x2c, 0x60,
|
||||
0x9e, 0x3e, 0x37, 0xf7, 0xdc, 0x6d, 0x1d, 0x5a, 0x5a, 0xb6, 0xec, 0xba, 0x0f, 0xd0, 0x12, 0xb2,
|
||||
0xce, 0xd9, 0x94, 0x8d, 0xa3, 0xc7, 0x3f, 0xca, 0x29, 0x10, 0x1d, 0x4e, 0xde, 0x41, 0xf5, 0x83,
|
||||
0xa5, 0xf7, 0x83, 0xe0, 0x49, 0x3b, 0x26, 0xfb, 0xae, 0xd9, 0x96, 0xbe, 0x81, 0xc6, 0xf9, 0x2c,
|
||||
0x3e, 0xf5, 0x47, 0xf9, 0xbd, 0x08, 0x54, 0x43, 0x16, 0x0f, 0xb3, 0xa7, 0x15, 0x6b, 0x5d, 0x67,
|
||||
0x05, 0xdf, 0x75, 0x07, 0x9a, 0x79, 0xbd, 0xea, 0x8d, 0x21, 0x8b, 0x72, 0x00, 0xb1, 0xa6, 0xaf,
|
||||
0xa0, 0xf1, 0x8e, 0x9b, 0x34, 0x66, 0x56, 0x4e, 0x5d, 0x51, 0xd4, 0x82, 0x20, 0xaf, 0x54, 0x04,
|
||||
0xa6, 0x42, 0xfa, 0x0c, 0x5a, 0xe9, 0xb8, 0x3f, 0xc0, 0x91, 0x9a, 0xa0, 0x4a, 0x4c, 0x21, 0x0f,
|
||||
0x7f, 0xd5, 0xa0, 0x7e, 0x92, 0xf4, 0xcf, 0x71, 0xe8, 0x93, 0x33, 0x58, 0xd5, 0xfc, 0x94, 0xb4,
|
||||
0xb5, 0xd6, 0x2a, 0xba, 0xaf, 0xe3, 0xce, 0x0b, 0x4b, 0xb9, 0x67, 0xb0, 0xaa, 0x19, 0x2c, 0x42,
|
||||
0x2b, 0xda, 0x31, 0x42, 0x2b, 0xf3, 0xe5, 0x4f, 0xd0, 0xc0, 0xa6, 0x4a, 0x3a, 0x05, 0x7e, 0xc3,
|
||||
0x45, 0x9d, 0xa7, 0xf7, 0x64, 0x28, 0x58, 0x6c, 0x97, 0x08, 0xb6, 0xd4, 0x9c, 0x11, 0x6c, 0xb9,
|
||||
0xd7, 0x92, 0x23, 0xa8, 0x49, 0xaf, 0x23, 0xff, 0x6b, 0xd9, 0xd8, 0x7f, 0x1d, 0xa7, 0x2c, 0x24,
|
||||
0x11, 0x4e, 0x60, 0x25, 0x73, 0x1f, 0xa2, 0xe7, 0x19, 0xfe, 0xe6, 0x3c, 0x29, 0x8d, 0x49, 0x90,
|
||||
0x3e, 0x80, 0x9a, 0x16, 0xb2, 0x6d, 0x58, 0x05, 0x9a, 0x49, 0xa7, 0x3d, 0x27, 0xaa, 0xf4, 0x64,
|
||||
0x56, 0x84, 0xf4, 0x18, 0xd6, 0x87, 0xf4, 0x14, 0xbc, 0xeb, 0x14, 0xea, 0xb9, 0x01, 0x11, 0x23,
|
||||
0x13, 0x59, 0x95, 0xb3, 0x5d, 0x1e, 0x54, 0x38, 0xb9, 0xd3, 0x20, 0x1c, 0xd3, 0xad, 0x10, 0x4e,
|
||||
0xc1, 0x9c, 0xc4, 0x33, 0xc9, 0x29, 0x46, 0xcf, 0x84, 0x9d, 0x01, 0x3d, 0x93, 0x39, 0xf4, 0x47,
|
||||
0x50, 0x93, 0x63, 0x8a, 0x10, 0xf0, 0xd0, 0x23, 0x04, 0x73, 0xaa, 0xfb, 0x00, 0x6a, 0x30, 0xd1,
|
||||
0x1b, 0x15, 0x06, 0xdb, 0x69, 0xcf, 0x89, 0xa6, 0x50, 0x6f, 0x77, 0x7f, 0xde, 0xba, 0xd6, 0xcd,
|
||||
0xad, 0x6b, 0xfd, 0xb9, 0x75, 0xad, 0x1f, 0x77, 0xee, 0xc2, 0xcd, 0x9d, 0xbb, 0xf0, 0xfb, 0xce,
|
||||
0x5d, 0xf8, 0xfc, 0x9f, 0xfe, 0x4b, 0xeb, 0xcb, 0x72, 0xf2, 0xef, 0xe5, 0xdf, 0x00, 0x00, 0x00,
|
||||
0xff, 0xff, 0x0e, 0x8d, 0x9b, 0x46, 0x80, 0x09, 0x00, 0x00,
|
||||
// 813 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x96, 0x4d, 0x4f, 0xdb, 0x4c,
|
||||
0x10, 0xc7, 0x71, 0x08, 0x90, 0x0c, 0x3c, 0x31, 0x59, 0x20, 0x8f, 0xeb, 0x12, 0x2b, 0x5d, 0x09,
|
||||
0x1a, 0xa9, 0x08, 0x54, 0x7a, 0x69, 0x7b, 0xa8, 0x78, 0x89, 0xa8, 0xa2, 0x52, 0x89, 0x06, 0x50,
|
||||
0xa5, 0xde, 0xb6, 0xf1, 0x4a, 0xb1, 0x94, 0xc4, 0x6e, 0xec, 0xb4, 0x9c, 0xfa, 0x19, 0xfa, 0xb1,
|
||||
0xda, 0x1b, 0xc7, 0x1e, 0x2b, 0xf8, 0x22, 0xd5, 0xda, 0x6b, 0xef, 0x8b, 0x13, 0xa2, 0x2a, 0x17,
|
||||
0xd8, 0xd9, 0x99, 0xf9, 0xcf, 0xd8, 0x3b, 0xfe, 0x6d, 0xa0, 0x4e, 0x02, 0xef, 0x80, 0x04, 0x5e,
|
||||
0x30, 0xf2, 0x23, 0xff, 0x20, 0xfe, 0x1b, 0x32, 0x7b, 0x3f, 0x5e, 0xa2, 0x72, 0xb7, 0xef, 0xd1,
|
||||
0x61, 0x44, 0x02, 0x0f, 0x6f, 0x02, 0x3a, 0x1d, 0x51, 0x12, 0xd1, 0xcb, 0x80, 0x74, 0x69, 0x87,
|
||||
0x7e, 0x19, 0xd3, 0x30, 0xc2, 0x3b, 0xb0, 0xa1, 0xec, 0x86, 0x81, 0x3f, 0x0c, 0x29, 0xaa, 0x40,
|
||||
0xc1, 0x73, 0x2d, 0xa3, 0x61, 0x34, 0xcb, 0x9d, 0x82, 0xe7, 0xb2, 0xe4, 0x16, 0x1d, 0x79, 0x5f,
|
||||
0x73, 0xc9, 0xca, 0xee, 0x94, 0xe4, 0xe7, 0xb0, 0x95, 0xd4, 0x68, 0xf9, 0xdd, 0xf1, 0x80, 0x0e,
|
||||
0x23, 0x9e, 0x8f, 0x2c, 0x58, 0x09, 0x59, 0x66, 0x3b, 0x8d, 0x4e, 0x4d, 0xdc, 0x84, 0x9a, 0x9e,
|
||||
0x32, 0x45, 0xfc, 0x03, 0x6c, 0xb5, 0x68, 0x9f, 0xfe, 0x83, 0x38, 0x72, 0x00, 0x5c, 0x1e, 0xdc,
|
||||
0x76, 0xad, 0x42, 0xec, 0x94, 0x76, 0xb0, 0x05, 0x35, 0x5d, 0x32, 0x29, 0x8e, 0xbf, 0x43, 0xe5,
|
||||
0xd8, 0x75, 0xaf, 0xe8, 0xcd, 0xfc, 0x55, 0x10, 0x82, 0x62, 0x44, 0x6f, 0x22, 0x6b, 0x31, 0xf6,
|
||||
0xc4, 0x6b, 0x96, 0xe3, 0x85, 0x97, 0x43, 0x12, 0x84, 0x3d, 0x3f, 0xb2, 0x8a, 0x0d, 0xa3, 0x59,
|
||||
0xea, 0x48, 0x3b, 0x98, 0x80, 0x99, 0xd5, 0xe7, 0xef, 0x43, 0x2d, 0x63, 0xe4, 0xca, 0xd4, 0x60,
|
||||
0xb9, 0x47, 0x89, 0x9b, 0xb5, 0xc0, 0x2d, 0xb6, 0x3f, 0xf2, 0x7d, 0x96, 0x93, 0x34, 0xc0, 0x2d,
|
||||
0xfc, 0x0e, 0xcc, 0xd6, 0x78, 0x10, 0x5c, 0x8d, 0x28, 0x9d, 0xff, 0x4d, 0xee, 0xc2, 0xba, 0x10,
|
||||
0xe3, 0x0d, 0x23, 0x28, 0xba, 0xe3, 0x41, 0xc0, 0xa5, 0xe2, 0x35, 0x7e, 0x06, 0xe6, 0x71, 0xbf,
|
||||
0xcf, 0xc2, 0xc2, 0xd9, 0xb3, 0xb1, 0x07, 0x45, 0x16, 0xa9, 0x4f, 0x02, 0xda, 0x84, 0x25, 0xf6,
|
||||
0x6c, 0xa1, 0x55, 0x68, 0x2c, 0x36, 0xcb, 0x9d, 0xc4, 0xc0, 0xaf, 0x60, 0x5d, 0x48, 0xf3, 0x16,
|
||||
0x76, 0x60, 0x29, 0x62, 0x1b, 0x96, 0xd1, 0x58, 0x6c, 0xae, 0x1e, 0x9a, 0xfb, 0xd9, 0x57, 0xb2,
|
||||
0x1f, 0xb7, 0x9a, 0x78, 0x31, 0x8a, 0x53, 0xe3, 0xd9, 0x4e, 0xdb, 0xc2, 0x07, 0x50, 0x95, 0xf6,
|
||||
0xb8, 0x9e, 0x0d, 0x25, 0xde, 0x5c, 0x22, 0x59, 0xee, 0x64, 0x36, 0xde, 0x83, 0xf5, 0x73, 0x9f,
|
||||
0xb8, 0xf2, 0x77, 0xf3, 0xc0, 0xb3, 0x6d, 0x40, 0x55, 0x8a, 0xe6, 0x53, 0xf7, 0x1e, 0xaa, 0xac,
|
||||
0xad, 0x0b, 0x32, 0x22, 0x83, 0x70, 0xfe, 0x43, 0x39, 0x03, 0x24, 0xcb, 0xf1, 0x67, 0x10, 0xf3,
|
||||
0x60, 0xc8, 0xf3, 0xc0, 0xea, 0x24, 0x13, 0x93, 0xbe, 0xd7, 0xd4, 0xc4, 0x47, 0xb0, 0xf6, 0x91,
|
||||
0x44, 0xdd, 0xde, 0xec, 0x8e, 0x6a, 0xb0, 0xcc, 0xde, 0xa8, 0x98, 0xc1, 0xc4, 0xc2, 0x26, 0xfc,
|
||||
0xc7, 0x15, 0xf8, 0x93, 0x9e, 0x40, 0xe5, 0x7a, 0xf8, 0x6d, 0x3e, 0xd1, 0x2a, 0x98, 0x99, 0x06,
|
||||
0x97, 0x7d, 0x03, 0x95, 0x8b, 0x71, 0x74, 0xe6, 0xf5, 0xb3, 0x13, 0x40, 0x50, 0x0c, 0x48, 0xd4,
|
||||
0x4b, 0x87, 0x90, 0xad, 0xe5, 0x52, 0x05, 0xf5, 0x54, 0x76, 0xc0, 0xcc, 0xf2, 0xc5, 0x14, 0xf7,
|
||||
0x48, 0x98, 0x09, 0xb0, 0x35, 0x7e, 0x09, 0x95, 0xb7, 0x54, 0x2f, 0xa3, 0x47, 0x65, 0xa5, 0x0b,
|
||||
0xa2, 0x34, 0x2b, 0x90, 0x65, 0x8a, 0x02, 0x7a, 0x87, 0xf8, 0x29, 0x54, 0x13, 0x30, 0xcd, 0xa8,
|
||||
0x91, 0xe0, 0x5a, 0x04, 0x26, 0x92, 0x87, 0xbf, 0x4a, 0x50, 0x3e, 0x8d, 0x27, 0xfd, 0x38, 0xf0,
|
||||
0xd0, 0x39, 0xac, 0x4a, 0xe4, 0x47, 0x75, 0xe9, 0x23, 0xc8, 0xdf, 0x13, 0xb6, 0x33, 0xcd, 0xcd,
|
||||
0xdb, 0x3d, 0x87, 0x55, 0xe9, 0x2a, 0x50, 0xd4, 0xf2, 0x17, 0x87, 0xa2, 0x36, 0xe9, 0x06, 0xb9,
|
||||
0x86, 0x8a, 0x8a, 0x7f, 0xd4, 0xc8, 0xd5, 0xd7, 0x78, 0x6f, 0x3f, 0x79, 0x20, 0x42, 0xc8, 0xaa,
|
||||
0x60, 0x57, 0x64, 0x27, 0x5e, 0x23, 0x8a, 0xec, 0xe4, 0x5b, 0x01, 0x1d, 0xc1, 0x0a, 0xa7, 0x32,
|
||||
0x7a, 0x24, 0x45, 0xab, 0x37, 0x85, 0x6d, 0x4f, 0x72, 0x71, 0x85, 0x53, 0x28, 0xa5, 0x9c, 0x44,
|
||||
0x72, 0x9c, 0x46, 0x62, 0xfb, 0xf1, 0x44, 0x1f, 0x17, 0x69, 0x03, 0x88, 0xef, 0x1a, 0x6d, 0x6b,
|
||||
0x50, 0x53, 0xe8, 0x61, 0xd7, 0xa7, 0x78, 0x45, 0x3f, 0x29, 0x34, 0x95, 0x7e, 0x34, 0x48, 0x2b,
|
||||
0xfd, 0xe4, 0x28, 0x7b, 0x06, 0xe5, 0x0c, 0x95, 0x48, 0x8b, 0x54, 0xa0, 0x6a, 0x6f, 0x4f, 0x76,
|
||||
0x0a, 0x9d, 0x8c, 0x89, 0x8a, 0x8e, 0xce, 0x55, 0x45, 0x27, 0x87, 0x51, 0xf4, 0x1a, 0x96, 0x62,
|
||||
0xda, 0xa0, 0xff, 0xa5, 0x30, 0x99, 0x60, 0xb6, 0x95, 0x77, 0x88, 0x23, 0xe6, 0x50, 0x51, 0x8e,
|
||||
0x58, 0x85, 0x95, 0x72, 0xc4, 0x1a, 0x83, 0x98, 0x02, 0x67, 0x88, 0xa2, 0xa0, 0x72, 0x49, 0x51,
|
||||
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) {
|
||||
@ -2022,6 +2206,126 @@ func (m *TreeParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||
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) {
|
||||
size := m.Size()
|
||||
dAtA = make([]byte, size)
|
||||
@ -2520,6 +2824,58 @@ func (m *TreeParamsResponse) Size() (n int) {
|
||||
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) {
|
||||
if m == nil {
|
||||
return 0
|
||||
@ -4480,6 +4836,334 @@ func (m *TreeParamsResponse) Unmarshal(dAtA []byte) error {
|
||||
}
|
||||
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 {
|
||||
l := len(dAtA)
|
||||
iNdEx := 0
|
||||
|
||||
@ -50,6 +50,8 @@ type DRPCClientApiClient interface {
|
||||
AllTrees(ctx context.Context, in *AllTreesRequest) (*AllTreesResponse, error)
|
||||
AllSpaces(ctx context.Context, in *AllSpacesRequest) (*AllSpacesResponse, 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)
|
||||
GetFile(ctx context.Context, in *GetFileRequest) (*GetFileResponse, 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
|
||||
}
|
||||
|
||||
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) {
|
||||
out := new(PutFileResponse)
|
||||
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)
|
||||
AllSpaces(context.Context, *AllSpacesRequest) (*AllSpacesResponse, 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)
|
||||
GetFile(context.Context, *GetFileRequest) (*GetFileResponse, 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)
|
||||
}
|
||||
|
||||
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) {
|
||||
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
|
||||
}
|
||||
@ -254,7 +284,7 @@ func (s *DRPCClientApiUnimplementedServer) DeleteFile(context.Context, *DeleteFi
|
||||
|
||||
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) {
|
||||
switch n {
|
||||
@ -349,6 +379,24 @@ func (DRPCClientApiDescription) Method(n int) (string, drpc.Encoding, drpc.Recei
|
||||
)
|
||||
}, DRPCClientApiServer.LoadSpace, true
|
||||
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{},
|
||||
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
|
||||
return srv.(DRPCClientApiServer).
|
||||
@ -357,7 +405,7 @@ func (DRPCClientApiDescription) Method(n int) (string, drpc.Encoding, drpc.Recei
|
||||
in1.(*PutFileRequest),
|
||||
)
|
||||
}, DRPCClientApiServer.PutFile, true
|
||||
case 11:
|
||||
case 13:
|
||||
return "/clientapi.ClientApi/GetFile", drpcEncoding_File_api_apiproto_protos_api_proto{},
|
||||
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
|
||||
return srv.(DRPCClientApiServer).
|
||||
@ -366,7 +414,7 @@ func (DRPCClientApiDescription) Method(n int) (string, drpc.Encoding, drpc.Recei
|
||||
in1.(*GetFileRequest),
|
||||
)
|
||||
}, DRPCClientApiServer.GetFile, true
|
||||
case 12:
|
||||
case 14:
|
||||
return "/clientapi.ClientApi/DeleteFile", drpcEncoding_File_api_apiproto_protos_api_proto{},
|
||||
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
|
||||
return srv.(DRPCClientApiServer).
|
||||
@ -544,6 +592,38 @@ func (x *drpcClientApi_LoadSpaceStream) SendAndClose(m *LoadSpaceResponse) error
|
||||
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 {
|
||||
drpc.Stream
|
||||
SendAndClose(*PutFileResponse) error
|
||||
|
||||
@ -14,6 +14,8 @@ service ClientApi {
|
||||
rpc AllTrees(AllTreesRequest) returns(AllTreesResponse);
|
||||
rpc AllSpaces(AllSpacesRequest) returns(AllSpacesResponse);
|
||||
rpc LoadSpace(LoadSpaceRequest) returns(LoadSpaceResponse);
|
||||
rpc Watch(WatchRequest) returns(WatchResponse);
|
||||
rpc Unwatch(UnwatchRequest) returns(UnwatchResponse);
|
||||
rpc PutFile(PutFileRequest) returns(PutFileResponse);
|
||||
rpc GetFile(GetFileRequest) returns(GetFileResponse);
|
||||
rpc DeleteFile(DeleteFileRequest) returns(DeleteFileResponse);
|
||||
@ -108,6 +110,22 @@ message TreeParamsResponse {
|
||||
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 {
|
||||
string path = 1;
|
||||
string spaceId = 2;
|
||||
|
||||
@ -25,6 +25,27 @@ type rpcHandler struct {
|
||||
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) {
|
||||
_, err = r.spaceService.GetSpace(context.Background(), request.SpaceId)
|
||||
if err != nil {
|
||||
|
||||
@ -57,17 +57,26 @@ func (s *service) Name() (name string) {
|
||||
}
|
||||
|
||||
func (s *service) Run(ctx context.Context) (err error) {
|
||||
err = s.BaseDrpcServer.Run(
|
||||
ctx,
|
||||
s.cfg.APIServer.ListenAddrs,
|
||||
func(handler drpc.Handler) drpc.Handler {
|
||||
params := server.Params{
|
||||
BufferSizeMb: s.cfg.Stream.MaxMsgSizeMb,
|
||||
TimeoutMillis: s.cfg.Stream.TimeoutMilliseconds,
|
||||
ListenAddrs: s.cfg.APIServer.ListenAddrs,
|
||||
Wrapper: func(handler drpc.Handler) drpc.Handler {
|
||||
return handler
|
||||
},
|
||||
s.transport.BasicListener)
|
||||
Converter: s.transport.BasicListener,
|
||||
}
|
||||
err = s.BaseDrpcServer.Run(ctx, params)
|
||||
if err != nil {
|
||||
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) {
|
||||
|
||||
@ -99,6 +99,7 @@ func (s *service) loadSpace(ctx context.Context, id string) (value ocache.Object
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
ns.StatusService().SetUpdateReceiver(&statusReceiver{})
|
||||
if err = ns.Init(ctx); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
20
client/clientspace/statusreceiver.go
Normal file
20
client/clientspace/statusreceiver.go
Normal 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")
|
||||
}
|
||||
@ -8,14 +8,19 @@ require (
|
||||
github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000
|
||||
github.com/dgraph-io/badger/v3 v3.2103.3
|
||||
github.com/gogo/protobuf v1.3.2
|
||||
github.com/stretchr/testify v1.8.0
|
||||
go.uber.org/zap v1.23.0
|
||||
storj.io/drpc v0.0.32
|
||||
)
|
||||
|
||||
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/beorn7/perks v1.0.1 // indirect
|
||||
github.com/cespare/xxhash v1.1.0 // 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/dgraph-io/ristretto v0.1.1 // 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/libp2p/go-buffer-pool v0.1.0 // 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/mattn/go-isatty v0.0.16 // 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-varint v0.0.6 // 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_model v0.2.0 // indirect
|
||||
github.com/prometheus/common v0.37.0 // indirect
|
||||
@ -60,12 +65,12 @@ require (
|
||||
go.opencensus.io v0.23.0 // indirect
|
||||
go.uber.org/atomic v1.10.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/net v0.0.0-20220920183852-bf014ff85ad5 // indirect
|
||||
golang.org/x/sys v0.0.0-20221010170243-090e33056c14 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
lukechampine.com/blake3 v1.1.7 // indirect
|
||||
storj.io/drpc v0.0.32 // indirect
|
||||
)
|
||||
|
||||
@ -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-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/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/go.mod h1:+PeHBAWp7gUh/yw6uAauKc5ku0w4cFNg6DUddGxoGq0=
|
||||
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.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
||||
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/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
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-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-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/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc=
|
||||
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/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.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.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
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.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/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
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/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-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-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM=
|
||||
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
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/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=
|
||||
@ -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-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-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-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg=
|
||||
|
||||
@ -6,6 +6,7 @@ import (
|
||||
"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/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/treegetter"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
||||
@ -13,6 +14,7 @@ import (
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/periodicsync"
|
||||
"go.uber.org/zap"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type TreeHeads struct {
|
||||
@ -48,13 +50,14 @@ func NewDiffService(
|
||||
storage storage.SpaceStorage,
|
||||
confConnector nodeconf.ConfConnector,
|
||||
cache treegetter.TreeGetter,
|
||||
statusService statusservice.StatusService,
|
||||
log *zap.Logger) DiffService {
|
||||
|
||||
diff := ldiff.New(16, 16)
|
||||
l := log.With(zap.String("spaceId", spaceId))
|
||||
factory := spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient)
|
||||
syncer := newDiffSyncer(spaceId, diff, confConnector, cache, storage, factory, l)
|
||||
periodicSync := periodicsync.NewPeriodicSync(syncPeriod, syncer.Sync, l)
|
||||
syncer := newDiffSyncer(spaceId, diff, confConnector, cache, storage, factory, statusService, l)
|
||||
periodicSync := periodicsync.NewPeriodicSync(syncPeriod, time.Minute, syncer.Sync, l)
|
||||
|
||||
return &diffService{
|
||||
spaceId: spaceId,
|
||||
|
||||
@ -5,6 +5,7 @@ import (
|
||||
"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/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/synctree"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
|
||||
@ -30,6 +31,7 @@ func newDiffSyncer(
|
||||
cache treegetter.TreeGetter,
|
||||
storage storage.SpaceStorage,
|
||||
clientFactory spacesyncproto.ClientFactory,
|
||||
statusService statusservice.StatusService,
|
||||
log *zap.Logger) DiffSyncer {
|
||||
return &diffSyncer{
|
||||
diff: diff,
|
||||
@ -39,6 +41,7 @@ func newDiffSyncer(
|
||||
confConnector: confConnector,
|
||||
clientFactory: clientFactory,
|
||||
log: log,
|
||||
statusService: statusService,
|
||||
}
|
||||
}
|
||||
|
||||
@ -51,6 +54,7 @@ type diffSyncer struct {
|
||||
clientFactory spacesyncproto.ClientFactory
|
||||
log *zap.Logger
|
||||
deletionState deletionstate.DeletionState
|
||||
statusService statusservice.StatusService
|
||||
}
|
||||
|
||||
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) {
|
||||
cl := d.clientFactory.Client(p)
|
||||
rdiff := remotediff.NewRemoteDiff(d.spaceId, cl)
|
||||
var (
|
||||
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)
|
||||
err = rpcerr.Unwrap(err)
|
||||
if err != nil && err != spacesyncproto.ErrSpaceMissing {
|
||||
d.statusService.SetNodesOnline(p.Id(), false)
|
||||
return err
|
||||
}
|
||||
d.statusService.SetNodesOnline(p.Id(), true)
|
||||
if err == spacesyncproto.ErrSpaceMissing {
|
||||
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
|
||||
filteredIds := d.deletionState.FilterJoin(newIds, changedIds, removedIds)
|
||||
|
||||
d.statusService.RemoveAllExcept(p.Id(), filteredIds, stateCounter)
|
||||
|
||||
ctx = peer.CtxWithPeerId(ctx, p.Id())
|
||||
d.pingTreesInCache(ctx, filteredIds)
|
||||
|
||||
|
||||
@ -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/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/treegetter/mock_treegetter"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
|
||||
@ -110,7 +111,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
|
||||
spaceId := "spaceId"
|
||||
aclRootId := "aclRootId"
|
||||
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())
|
||||
diffSyncer.Init(delState)
|
||||
|
||||
|
||||
@ -19,5 +19,6 @@ func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncR
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
@ -7,6 +7,7 @@ import (
|
||||
"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/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/syncservice"
|
||||
"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()
|
||||
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{
|
||||
id: id,
|
||||
syncService: syncService,
|
||||
diffService: diffService,
|
||||
statusService: statusService,
|
||||
cache: s.treeGetter,
|
||||
account: s.account,
|
||||
configuration: lastConfiguration,
|
||||
|
||||
@ -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/deletionstate"
|
||||
"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/syncacl"
|
||||
"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)
|
||||
DeleteTree(ctx context.Context, id string) (err error)
|
||||
|
||||
StatusService() statusservice.StatusService
|
||||
|
||||
Close() error
|
||||
}
|
||||
|
||||
@ -92,6 +95,7 @@ type space struct {
|
||||
|
||||
syncService syncservice.SyncService
|
||||
diffService diffservice.DiffService
|
||||
statusService statusservice.StatusService
|
||||
storage storage.SpaceStorage
|
||||
cache treegetter.TreeGetter
|
||||
account account.Service
|
||||
@ -186,6 +190,7 @@ func (s *space) Init(ctx context.Context) (err error) {
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
s.statusService.Run()
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -202,6 +207,10 @@ func (s *space) DiffService() diffservice.DiffService {
|
||||
return s.diffService
|
||||
}
|
||||
|
||||
func (s *space) StatusService() statusservice.StatusService {
|
||||
return s.statusService
|
||||
}
|
||||
|
||||
func (s *space) StoredIds() []string {
|
||||
return s.diffService.AllIds()
|
||||
}
|
||||
@ -216,12 +225,14 @@ func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePay
|
||||
return
|
||||
}
|
||||
deps := synctree.CreateDeps{
|
||||
SpaceId: s.id,
|
||||
Payload: payload,
|
||||
StreamPool: s.syncService.StreamPool(),
|
||||
Configuration: s.configuration,
|
||||
AclList: s.aclList,
|
||||
SpaceStorage: s.storage,
|
||||
SpaceId: s.id,
|
||||
Payload: payload,
|
||||
SyncService: s.syncService,
|
||||
Configuration: s.configuration,
|
||||
AclList: s.aclList,
|
||||
SpaceStorage: s.storage,
|
||||
StatusService: s.statusService,
|
||||
HeadNotifiable: s.diffService,
|
||||
}
|
||||
return synctree.DeriveSyncTree(ctx, deps)
|
||||
}
|
||||
@ -232,12 +243,14 @@ func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePay
|
||||
return
|
||||
}
|
||||
deps := synctree.CreateDeps{
|
||||
SpaceId: s.id,
|
||||
Payload: payload,
|
||||
StreamPool: s.syncService.StreamPool(),
|
||||
Configuration: s.configuration,
|
||||
AclList: s.aclList,
|
||||
SpaceStorage: s.storage,
|
||||
SpaceId: s.id,
|
||||
Payload: payload,
|
||||
SyncService: s.syncService,
|
||||
Configuration: s.configuration,
|
||||
AclList: s.aclList,
|
||||
SpaceStorage: s.storage,
|
||||
StatusService: s.statusService,
|
||||
HeadNotifiable: s.diffService,
|
||||
}
|
||||
return synctree.CreateSyncTree(ctx, deps)
|
||||
}
|
||||
@ -249,13 +262,14 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene
|
||||
}
|
||||
deps := synctree.BuildDeps{
|
||||
SpaceId: s.id,
|
||||
StreamPool: s.syncService.StreamPool(),
|
||||
SyncService: s.syncService,
|
||||
Configuration: s.configuration,
|
||||
HeadNotifiable: s.diffService,
|
||||
Listener: listener,
|
||||
AclList: s.aclList,
|
||||
SpaceStorage: s.storage,
|
||||
TreeUsage: &s.treesUsed,
|
||||
StatusService: s.statusService,
|
||||
}
|
||||
return synctree.BuildSyncTreeOrGetRemote(ctx, id, deps)
|
||||
}
|
||||
@ -286,5 +300,9 @@ func (s *space) Close() error {
|
||||
if err := s.storage.Close(); err != nil {
|
||||
mError.Add(err)
|
||||
}
|
||||
if err := s.statusService.Close(); err != nil {
|
||||
mError.Add(err)
|
||||
}
|
||||
|
||||
return mError.Err()
|
||||
}
|
||||
|
||||
40
common/commonspace/statusservice/noop.go
Normal file
40
common/commonspace/statusservice/noop.go
Normal 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
|
||||
}
|
||||
266
common/commonspace/statusservice/statusservice.go
Normal file
266
common/commonspace/statusservice/statusservice.go
Normal 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)
|
||||
}
|
||||
87
common/commonspace/syncservice/actionqueue.go
Normal file
87
common/commonspace/syncservice/actionqueue.go
Normal 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
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
133
common/commonspace/syncservice/streamchecker.go
Normal file
133
common/commonspace/syncservice/streamchecker.go
Normal 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
|
||||
}
|
||||
@ -7,6 +7,7 @@ import (
|
||||
"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/pkg/ocache"
|
||||
"go.uber.org/zap"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
@ -24,7 +25,7 @@ var ErrSyncTimeout = errors.New("too long wait on sync receive")
|
||||
type StreamPool interface {
|
||||
ocache.ObjectLastUsage
|
||||
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)
|
||||
SendAsync(peers []string, message *spacesyncproto.ObjectSyncMessage) (err error)
|
||||
@ -97,7 +98,7 @@ func (s *streamPool) SendSync(
|
||||
delete(s.waiters, msg.ReplyId)
|
||||
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
|
||||
case reply = <-waiter.ch:
|
||||
if !delay.Stop() {
|
||||
@ -124,10 +125,13 @@ func (s *streamPool) SendAsync(peers []string, message *spacesyncproto.ObjectSyn
|
||||
streams := getStreams()
|
||||
s.Unlock()
|
||||
|
||||
log.With("objectId", message.ObjectId).
|
||||
Debugf("sending message to %d peers", len(streams))
|
||||
for _, s := range streams {
|
||||
err = s.Send(message)
|
||||
log.With(zap.String("objectId", message.ObjectId), zap.Int("existing peers len", len(streams)), zap.Strings("wanted peers", peers)).
|
||||
Debug("sending message to peers")
|
||||
for _, stream := range streams {
|
||||
err = stream.Send(message)
|
||||
if err != nil {
|
||||
log.Debug("error sending message to stream", zap.Error(err))
|
||||
}
|
||||
}
|
||||
if len(peers) != 1 {
|
||||
err = nil
|
||||
@ -164,6 +168,7 @@ Loop:
|
||||
default:
|
||||
break
|
||||
}
|
||||
log.With(zap.String("id", id)).Debug("getting peer stream")
|
||||
streams = append(streams, stream)
|
||||
}
|
||||
|
||||
@ -172,40 +177,68 @@ Loop:
|
||||
|
||||
func (s *streamPool) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) {
|
||||
streams := s.getAllStreams()
|
||||
log.With("objectId", message.ObjectId).
|
||||
Debugf("broadcasting message to %d peers", len(streams))
|
||||
log.With(zap.String("objectId", message.ObjectId), zap.Int("peers", len(streams))).
|
||||
Debug("broadcasting message to peers")
|
||||
for _, stream := range streams {
|
||||
if err = stream.Send(message); err != nil {
|
||||
// TODO: add logging
|
||||
log.Debug("error sending message to stream", zap.Error(err))
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *streamPool) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) {
|
||||
go s.AddAndReadStreamSync(stream)
|
||||
func (s *streamPool) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) (err error) {
|
||||
peerId, err := s.addStream(stream)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
go s.readPeerLoop(peerId, stream)
|
||||
return
|
||||
}
|
||||
|
||||
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()
|
||||
peerId, err := peer.CtxPeerId(stream.Context())
|
||||
peerId, err = peer.CtxPeerId(stream.Context())
|
||||
if err != nil {
|
||||
s.Unlock()
|
||||
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.wg.Add(1)
|
||||
s.Unlock()
|
||||
log.With("peerId", peerId).Debug("reading stream from peer")
|
||||
return s.readPeerLoop(peerId, stream)
|
||||
return
|
||||
}
|
||||
|
||||
func (s *streamPool) Close() (err error) {
|
||||
s.Lock()
|
||||
wg := s.wg
|
||||
s.Unlock()
|
||||
streams := s.getAllStreams()
|
||||
|
||||
log.Debug("closing streams on lock")
|
||||
for _, stream := range streams {
|
||||
stream.Close()
|
||||
}
|
||||
log.Debug("closed streams")
|
||||
|
||||
if wg != nil {
|
||||
wg.Wait()
|
||||
}
|
||||
@ -213,6 +246,7 @@ func (s *streamPool) Close() (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()
|
||||
limiter := make(chan struct{}, maxSimultaneousOperationsPerStream)
|
||||
for i := 0; i < maxSimultaneousOperationsPerStream; i++ {
|
||||
@ -221,21 +255,22 @@ func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStre
|
||||
|
||||
process := func(msg *spacesyncproto.ObjectSyncMessage) {
|
||||
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 == "" {
|
||||
s.messageHandler(stream.Context(), peerId, msg)
|
||||
return
|
||||
}
|
||||
log.With("replyId", msg.ReplyId).Debug("getting message with reply id")
|
||||
s.waitersMx.Lock()
|
||||
waiter, exists := s.waiters[msg.ReplyId]
|
||||
|
||||
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.messageHandler(stream.Context(), peerId, msg)
|
||||
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)
|
||||
s.waitersMx.Unlock()
|
||||
@ -253,6 +288,7 @@ Loop:
|
||||
select {
|
||||
case <-limiter:
|
||||
case <-stream.Context().Done():
|
||||
log.Debug("stream context done")
|
||||
break Loop
|
||||
}
|
||||
go func() {
|
||||
@ -260,19 +296,23 @@ Loop:
|
||||
limiter <- struct{}{}
|
||||
}()
|
||||
}
|
||||
log.With("peerId", peerId).Debug("stopped reading stream from peer")
|
||||
s.removePeer(peerId)
|
||||
log.With(zap.String("peerId", peerId)).Debug("stopped reading stream from peer")
|
||||
s.removePeer(peerId, stream)
|
||||
return
|
||||
}
|
||||
|
||||
func (s *streamPool) removePeer(peerId string) (err error) {
|
||||
func (s *streamPool) removePeer(peerId string, stream spacesyncproto.SpaceStream) (err error) {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
_, ok := s.peerStreams[peerId]
|
||||
mapStream, ok := s.peerStreams[peerId]
|
||||
if !ok {
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@ -122,39 +122,16 @@ func TestStreamPool_AddAndReadStreamAsync(t *testing.T) {
|
||||
func TestStreamPool_Close(t *testing.T) {
|
||||
remId := "remoteId"
|
||||
|
||||
t.Run("client close", func(t *testing.T) {
|
||||
t.Run("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)
|
||||
})
|
||||
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)
|
||||
fx.pool.Close()
|
||||
select {
|
||||
case <-fx.clientStream.Context().Done():
|
||||
break
|
||||
case <-time.After(time.Millisecond * 100):
|
||||
t.Fatal("context should be closed")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
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/spacesyncproto"
|
||||
"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/pkg/ocache"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/periodicsync"
|
||||
"go.uber.org/zap"
|
||||
"time"
|
||||
)
|
||||
|
||||
var log = logger.NewNamed("syncservice").Sugar()
|
||||
var log = logger.NewNamed("commonspace.syncservice")
|
||||
|
||||
type SyncService interface {
|
||||
ocache.ObjectLastUsage
|
||||
synchandler.SyncHandler
|
||||
StreamPool() StreamPool
|
||||
StreamChecker() StreamChecker
|
||||
ActionQueue() ActionQueue
|
||||
|
||||
Init(getter objectgetter.ObjectGetter)
|
||||
Close() (err error)
|
||||
}
|
||||
|
||||
const respPeersStreamCheckInterval = time.Second * 10
|
||||
|
||||
type syncService struct {
|
||||
spaceId string
|
||||
|
||||
streamPool StreamPool
|
||||
clientFactory spacesyncproto.ClientFactory
|
||||
objectGetter objectgetter.ObjectGetter
|
||||
streamPool StreamPool
|
||||
checker StreamChecker
|
||||
periodicSync periodicsync.PeriodicSync
|
||||
objectGetter objectgetter.ObjectGetter
|
||||
actionQueue ActionQueue
|
||||
|
||||
streamLoopCtx context.Context
|
||||
stopStreamLoop context.CancelFunc
|
||||
connector nodeconf.ConfConnector
|
||||
streamLoopDone chan struct{}
|
||||
log *zap.SugaredLogger // TODO: change to logger
|
||||
syncCtx context.Context
|
||||
cancelSync context.CancelFunc
|
||||
}
|
||||
|
||||
func NewSyncService(
|
||||
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) {
|
||||
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(
|
||||
spaceId,
|
||||
streamPool,
|
||||
spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient),
|
||||
confConnector)
|
||||
periodicSync,
|
||||
checker,
|
||||
syncCtx,
|
||||
cancel)
|
||||
return
|
||||
}
|
||||
|
||||
func newSyncService(
|
||||
spaceId string,
|
||||
streamPool StreamPool,
|
||||
clientFactory spacesyncproto.ClientFactory,
|
||||
connector nodeconf.ConfConnector) *syncService {
|
||||
periodicSync periodicsync.PeriodicSync,
|
||||
checker StreamChecker,
|
||||
syncCtx context.Context,
|
||||
cancel context.CancelFunc,
|
||||
) *syncService {
|
||||
return &syncService{
|
||||
streamPool: streamPool,
|
||||
connector: connector,
|
||||
clientFactory: clientFactory,
|
||||
spaceId: spaceId,
|
||||
log: log.With(zap.String("id", spaceId)),
|
||||
streamLoopDone: make(chan struct{}),
|
||||
periodicSync: periodicSync,
|
||||
streamPool: streamPool,
|
||||
spaceId: spaceId,
|
||||
checker: checker,
|
||||
syncCtx: syncCtx,
|
||||
cancelSync: cancel,
|
||||
actionQueue: NewActionQueue(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *syncService) Init(objectGetter objectgetter.ObjectGetter) {
|
||||
s.objectGetter = objectGetter
|
||||
s.streamLoopCtx, s.stopStreamLoop = context.WithCancel(context.Background())
|
||||
go s.responsibleStreamCheckLoop(s.streamLoopCtx)
|
||||
s.actionQueue.Run()
|
||||
s.periodicSync.Run()
|
||||
}
|
||||
|
||||
func (s *syncService) Close() (err error) {
|
||||
s.stopStreamLoop()
|
||||
<-s.streamLoopDone
|
||||
s.actionQueue.Close()
|
||||
s.periodicSync.Close()
|
||||
s.cancelSync()
|
||||
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) {
|
||||
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)
|
||||
if err != nil {
|
||||
return
|
||||
@ -94,60 +116,14 @@ func (s *syncService) HandleMessage(ctx context.Context, senderId string, messag
|
||||
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 {
|
||||
return s.streamPool
|
||||
}
|
||||
|
||||
func (s *syncService) StreamChecker() StreamChecker {
|
||||
return s.checker
|
||||
}
|
||||
|
||||
func (s *syncService) ActionQueue() ActionQueue {
|
||||
return s.actionQueue
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
// 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
|
||||
@ -177,23 +177,18 @@ func (mr *MockSyncTreeMockRecorder) AddContent(arg0, arg1 interface{}) *gomock.C
|
||||
}
|
||||
|
||||
// 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()
|
||||
varargs := []interface{}{arg0}
|
||||
for _, a := range arg1 {
|
||||
varargs = append(varargs, a)
|
||||
}
|
||||
ret := m.ctrl.Call(m, "AddRawChanges", varargs...)
|
||||
ret := m.ctrl.Call(m, "AddRawChanges", arg0, arg1)
|
||||
ret0, _ := ret[0].(tree.AddResult)
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// 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()
|
||||
varargs := append([]interface{}{arg0}, arg1...)
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawChanges", reflect.TypeOf((*MockSyncTree)(nil).AddRawChanges), varargs...)
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawChanges", reflect.TypeOf((*MockSyncTree)(nil).AddRawChanges), arg0, arg1)
|
||||
}
|
||||
|
||||
// ChangesAfterCommonSnapshot mocks base method.
|
||||
@ -459,3 +454,103 @@ func (mr *MockSyncTreeMockRecorder) Unlock() *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
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)
|
||||
}
|
||||
|
||||
36
common/commonspace/synctree/queuedclient.go
Normal file
36
common/commonspace/synctree/queuedclient.go
Normal 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)
|
||||
})
|
||||
}
|
||||
74
common/commonspace/synctree/receivequeue.go
Normal file
74
common/commonspace/synctree/receivequeue.go
Normal 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
|
||||
}
|
||||
@ -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
|
||||
|
||||
import (
|
||||
@ -19,18 +19,23 @@ type syncClient struct {
|
||||
syncservice.StreamPool
|
||||
RequestFactory
|
||||
spaceId string
|
||||
connector nodeconf.ConfConnector
|
||||
configuration nodeconf.Configuration
|
||||
|
||||
checker syncservice.StreamChecker
|
||||
}
|
||||
|
||||
func newSyncClient(
|
||||
spaceId string,
|
||||
pool syncservice.StreamPool,
|
||||
factory RequestFactory,
|
||||
configuration nodeconf.Configuration) SyncClient {
|
||||
configuration nodeconf.Configuration,
|
||||
checker syncservice.StreamChecker) SyncClient {
|
||||
return &syncClient{
|
||||
StreamPool: pool,
|
||||
RequestFactory: factory,
|
||||
configuration: configuration,
|
||||
checker: checker,
|
||||
spaceId: spaceId,
|
||||
}
|
||||
}
|
||||
@ -40,10 +45,16 @@ func (s *syncClient) BroadcastAsync(message *treechangeproto.TreeSyncMessage) (e
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
s.checker.CheckResponsiblePeers()
|
||||
return s.StreamPool.BroadcastAsync(objMsg)
|
||||
}
|
||||
|
||||
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)
|
||||
if err != nil {
|
||||
return
|
||||
@ -56,7 +67,9 @@ func (s *syncClient) BroadcastAsyncOrSendResponsible(message *treechangeproto.Tr
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if s.configuration.IsResponsible(s.spaceId) {
|
||||
s.checker.CheckResponsiblePeers()
|
||||
return s.StreamPool.SendAsync(s.configuration.NodeIds(s.spaceId), objMsg)
|
||||
}
|
||||
return s.BroadcastAsync(message)
|
||||
|
||||
@ -5,6 +5,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"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"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler"
|
||||
@ -39,12 +40,13 @@ type SyncTree interface {
|
||||
type syncTree struct {
|
||||
tree.ObjectTree
|
||||
synchandler.SyncHandler
|
||||
syncClient SyncClient
|
||||
notifiable HeadNotifiable
|
||||
listener updatelistener.UpdateListener
|
||||
treeUsage *atomic.Int32
|
||||
isClosed bool
|
||||
isDeleted bool
|
||||
syncClient SyncClient
|
||||
statusService statusservice.StatusService
|
||||
notifiable HeadNotifiable
|
||||
listener updatelistener.UpdateListener
|
||||
treeUsage *atomic.Int32
|
||||
isClosed bool
|
||||
isDeleted bool
|
||||
}
|
||||
|
||||
var log = logger.NewNamed("commonspace.synctree").Sugar()
|
||||
@ -52,20 +54,22 @@ var log = logger.NewNamed("commonspace.synctree").Sugar()
|
||||
var createDerivedObjectTree = tree.CreateDerivedObjectTree
|
||||
var createObjectTree = tree.CreateObjectTree
|
||||
var buildObjectTree = tree.BuildObjectTree
|
||||
var createSyncClient = newSyncClient
|
||||
var createSyncClient = newWrappedSyncClient
|
||||
|
||||
type CreateDeps struct {
|
||||
SpaceId string
|
||||
Payload tree.ObjectTreeCreatePayload
|
||||
Configuration nodeconf.Configuration
|
||||
StreamPool syncservice.StreamPool
|
||||
AclList list.ACLList
|
||||
SpaceStorage spacestorage.SpaceStorage
|
||||
SpaceId string
|
||||
Payload tree.ObjectTreeCreatePayload
|
||||
Configuration nodeconf.Configuration
|
||||
SyncService syncservice.SyncService
|
||||
AclList list.ACLList
|
||||
SpaceStorage spacestorage.SpaceStorage
|
||||
StatusService statusservice.StatusService
|
||||
HeadNotifiable HeadNotifiable
|
||||
}
|
||||
|
||||
type BuildDeps struct {
|
||||
SpaceId string
|
||||
StreamPool syncservice.StreamPool
|
||||
SyncService syncservice.SyncService
|
||||
Configuration nodeconf.Configuration
|
||||
HeadNotifiable HeadNotifiable
|
||||
Listener updatelistener.UpdateListener
|
||||
@ -73,6 +77,16 @@ type BuildDeps struct {
|
||||
SpaceStorage spacestorage.SpaceStorage
|
||||
TreeStorage storage.TreeStorage
|
||||
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) {
|
||||
@ -83,13 +97,17 @@ func DeriveSyncTree(ctx context.Context, deps CreateDeps) (id string, err error)
|
||||
|
||||
syncClient := createSyncClient(
|
||||
deps.SpaceId,
|
||||
deps.StreamPool,
|
||||
sharedFactory,
|
||||
deps.SyncService,
|
||||
deps.Configuration)
|
||||
|
||||
headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
|
||||
syncClient.BroadcastAsync(headUpdate)
|
||||
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
|
||||
}
|
||||
|
||||
@ -100,13 +118,17 @@ func CreateSyncTree(ctx context.Context, deps CreateDeps) (id string, err error)
|
||||
}
|
||||
syncClient := createSyncClient(
|
||||
deps.SpaceId,
|
||||
deps.StreamPool,
|
||||
GetRequestFactory(),
|
||||
sharedFactory,
|
||||
deps.SyncService,
|
||||
deps.Configuration)
|
||||
|
||||
headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
|
||||
syncClient.BroadcastAsync(headUpdate)
|
||||
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
|
||||
}
|
||||
|
||||
@ -116,16 +138,23 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
newTreeRequest := GetRequestFactory().CreateNewTreeRequest()
|
||||
objMsg, err := marshallTreeMessage(newTreeRequest, id, "")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
resp, err := deps.StreamPool.SendSync(peerId, objMsg)
|
||||
err = deps.SyncService.StreamChecker().CheckPeerConnection(peerId)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
resp, err := deps.SyncService.StreamPool().SendSync(peerId, objMsg)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
msg = &treechangeproto.TreeSyncMessage{}
|
||||
err = proto.Unmarshal(resp.Payload, msg)
|
||||
return
|
||||
@ -186,26 +215,26 @@ func buildSyncTree(ctx context.Context, isFirstBuild bool, deps BuildDeps) (t Sy
|
||||
}
|
||||
syncClient := createSyncClient(
|
||||
deps.SpaceId,
|
||||
deps.StreamPool,
|
||||
GetRequestFactory(),
|
||||
sharedFactory,
|
||||
deps.SyncService,
|
||||
deps.Configuration)
|
||||
syncTree := &syncTree{
|
||||
ObjectTree: objTree,
|
||||
syncClient: syncClient,
|
||||
notifiable: deps.HeadNotifiable,
|
||||
treeUsage: deps.TreeUsage,
|
||||
listener: deps.Listener,
|
||||
ObjectTree: objTree,
|
||||
syncClient: syncClient,
|
||||
notifiable: deps.HeadNotifiable,
|
||||
treeUsage: deps.TreeUsage,
|
||||
listener: deps.Listener,
|
||||
statusService: deps.StatusService,
|
||||
}
|
||||
syncHandler := newSyncTreeHandler(syncTree, syncClient)
|
||||
syncHandler := newSyncTreeHandler(syncTree, syncClient, deps.StatusService)
|
||||
syncTree.SyncHandler = syncHandler
|
||||
t = syncTree
|
||||
syncTree.Lock()
|
||||
defer syncTree.Unlock()
|
||||
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 {
|
||||
headUpdate := syncTree.syncClient.CreateHeadUpdate(t, nil)
|
||||
// send to everybody, because everybody should know that the node or client got new tree
|
||||
err = syncTree.syncClient.BroadcastAsync(headUpdate)
|
||||
}
|
||||
@ -237,16 +266,17 @@ func (s *syncTree) AddContent(ctx context.Context, content tree.SignableChangeCo
|
||||
if s.notifiable != nil {
|
||||
s.notifiable.UpdateHeads(s.ID(), res.Heads)
|
||||
}
|
||||
s.statusService.HeadsChange(s.ID(), res.Heads)
|
||||
headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added)
|
||||
err = s.syncClient.BroadcastAsync(headUpdate)
|
||||
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 {
|
||||
return
|
||||
}
|
||||
res, err = s.ObjectTree.AddRawChanges(ctx, changes...)
|
||||
res, err = s.ObjectTree.AddRawChanges(ctx, changesPayload)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -308,6 +338,8 @@ func (s *syncTree) checkAlive() (err error) {
|
||||
}
|
||||
|
||||
func (s *syncTree) Ping() (err error) {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
headUpdate := s.syncClient.CreateHeadUpdate(s, nil)
|
||||
return s.syncClient.BroadcastAsyncOrSendResponsible(headUpdate)
|
||||
}
|
||||
|
||||
@ -2,6 +2,7 @@ package synctree
|
||||
|
||||
import (
|
||||
"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/syncservice"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree"
|
||||
@ -37,6 +38,12 @@ func (s syncTreeMatcher) String() string {
|
||||
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) {
|
||||
ctx := context.Background()
|
||||
ctrl := gomock.NewController(t)
|
||||
@ -46,6 +53,7 @@ func Test_DeriveSyncTree(t *testing.T) {
|
||||
aclListMock := mock_list.NewMockACLList(ctrl)
|
||||
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
|
||||
spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl)
|
||||
headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl)
|
||||
spaceId := "spaceId"
|
||||
expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId}
|
||||
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)
|
||||
return objTreeMock, nil
|
||||
}
|
||||
createSyncClient = func(spaceId string, pool syncservice.StreamPool, factory RequestFactory, configuration nodeconf.Configuration) SyncClient {
|
||||
return syncClientMock
|
||||
}
|
||||
createSyncClient = syncClientFuncCreator(syncClientMock)
|
||||
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().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil)
|
||||
deps := CreateDeps{
|
||||
AclList: aclListMock,
|
||||
SpaceId: spaceId,
|
||||
Payload: expectedPayload,
|
||||
SpaceStorage: spaceStorageMock,
|
||||
AclList: aclListMock,
|
||||
SpaceId: spaceId,
|
||||
Payload: expectedPayload,
|
||||
SpaceStorage: spaceStorageMock,
|
||||
StatusService: statusservice.NewNoOpStatusService(),
|
||||
HeadNotifiable: headNotifiableMock,
|
||||
}
|
||||
objTreeMock.EXPECT().ID().Return("id")
|
||||
|
||||
_, err := DeriveSyncTree(ctx, deps)
|
||||
require.NoError(t, err)
|
||||
@ -79,6 +90,7 @@ func Test_CreateSyncTree(t *testing.T) {
|
||||
aclListMock := mock_list.NewMockACLList(ctrl)
|
||||
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
|
||||
spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl)
|
||||
headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl)
|
||||
spaceId := "spaceId"
|
||||
expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId}
|
||||
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)
|
||||
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{}
|
||||
headNotifiableMock.EXPECT().UpdateHeads("id", []string{"h1"})
|
||||
syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate)
|
||||
syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil)
|
||||
objTreeMock.EXPECT().ID().Return("id")
|
||||
deps := CreateDeps{
|
||||
AclList: aclListMock,
|
||||
SpaceId: spaceId,
|
||||
Payload: expectedPayload,
|
||||
SpaceStorage: spaceStorageMock,
|
||||
AclList: aclListMock,
|
||||
SpaceId: spaceId,
|
||||
Payload: expectedPayload,
|
||||
SpaceStorage: spaceStorageMock,
|
||||
StatusService: statusservice.NewNoOpStatusService(),
|
||||
HeadNotifiable: headNotifiableMock,
|
||||
}
|
||||
|
||||
_, err := CreateSyncTree(ctx, deps)
|
||||
@ -112,58 +128,72 @@ func Test_BuildSyncTree(t *testing.T) {
|
||||
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
|
||||
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
|
||||
tr := &syncTree{
|
||||
ObjectTree: objTreeMock,
|
||||
SyncHandler: nil,
|
||||
syncClient: syncClientMock,
|
||||
listener: updateListenerMock,
|
||||
isClosed: false,
|
||||
ObjectTree: objTreeMock,
|
||||
SyncHandler: nil,
|
||||
syncClient: syncClientMock,
|
||||
listener: updateListenerMock,
|
||||
isClosed: false,
|
||||
statusService: statusservice.NewNoOpStatusService(),
|
||||
}
|
||||
|
||||
headUpdate := &treechangeproto.TreeSyncMessage{}
|
||||
t.Run("AddRawChanges update", func(t *testing.T) {
|
||||
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
|
||||
payload := tree.RawChangesPayload{
|
||||
NewHeads: nil,
|
||||
RawChanges: changes,
|
||||
}
|
||||
expectedRes := tree.AddResult{
|
||||
Added: changes,
|
||||
Mode: tree.Append,
|
||||
}
|
||||
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)).
|
||||
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
|
||||
Return(expectedRes, nil)
|
||||
updateListenerMock.EXPECT().Update(tr)
|
||||
|
||||
syncClientMock.EXPECT().CreateHeadUpdate(gomock.Eq(tr), gomock.Eq(changes)).Return(headUpdate)
|
||||
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.Equal(t, expectedRes, res)
|
||||
})
|
||||
|
||||
t.Run("AddRawChanges rebuild", func(t *testing.T) {
|
||||
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
|
||||
payload := tree.RawChangesPayload{
|
||||
NewHeads: nil,
|
||||
RawChanges: changes,
|
||||
}
|
||||
|
||||
expectedRes := tree.AddResult{
|
||||
Added: changes,
|
||||
Mode: tree.Rebuild,
|
||||
}
|
||||
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)).
|
||||
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
|
||||
Return(expectedRes, nil)
|
||||
updateListenerMock.EXPECT().Rebuild(tr)
|
||||
|
||||
syncClientMock.EXPECT().CreateHeadUpdate(gomock.Eq(tr), gomock.Eq(changes)).Return(headUpdate)
|
||||
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.Equal(t, expectedRes, res)
|
||||
})
|
||||
|
||||
t.Run("AddRawChanges nothing", func(t *testing.T) {
|
||||
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
|
||||
payload := tree.RawChangesPayload{
|
||||
NewHeads: nil,
|
||||
RawChanges: changes,
|
||||
}
|
||||
expectedRes := tree.AddResult{
|
||||
Added: changes,
|
||||
Mode: tree.Nothing,
|
||||
}
|
||||
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)).
|
||||
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
|
||||
Return(expectedRes, nil)
|
||||
|
||||
res, err := tr.AddRawChanges(ctx, changes...)
|
||||
res, err := tr.AddRawChanges(ctx, payload)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expectedRes, res)
|
||||
})
|
||||
@ -177,6 +207,7 @@ func Test_BuildSyncTree(t *testing.T) {
|
||||
Mode: tree.Append,
|
||||
Added: changes,
|
||||
}
|
||||
objTreeMock.EXPECT().ID().Return("id").AnyTimes()
|
||||
objTreeMock.EXPECT().AddContent(gomock.Any(), gomock.Eq(content)).
|
||||
Return(expectedRes, nil)
|
||||
|
||||
|
||||
@ -3,42 +3,73 @@ package synctree
|
||||
import (
|
||||
"context"
|
||||
"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/pkg/acl/tree"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
||||
"github.com/gogo/protobuf/proto"
|
||||
"go.uber.org/zap"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type syncTreeHandler struct {
|
||||
objTree tree.ObjectTree
|
||||
syncClient SyncClient
|
||||
objTree tree.ObjectTree
|
||||
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{
|
||||
objTree: objTree,
|
||||
syncClient: syncClient,
|
||||
objTree: objTree,
|
||||
syncClient: syncClient,
|
||||
statusService: statusService,
|
||||
queue: newReceiveQueue(maxQueueSize),
|
||||
}
|
||||
}
|
||||
|
||||
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{}
|
||||
err = proto.Unmarshal(msg.Payload, unmarshalled)
|
||||
if err != nil {
|
||||
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 {
|
||||
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:
|
||||
return s.handleFullSyncRequest(ctx, senderId, content.GetFullSyncRequest(), msg.ReplyId)
|
||||
return s.handleFullSyncRequest(ctx, senderId, content.GetFullSyncRequest(), replyId)
|
||||
case content.GetFullSyncResponse() != nil:
|
||||
return s.handleFullSyncResponse(ctx, senderId, content.GetFullSyncResponse())
|
||||
}
|
||||
return nil
|
||||
return
|
||||
}
|
||||
|
||||
func (s *syncTreeHandler) handleHeadUpdate(
|
||||
@ -46,60 +77,66 @@ func (s *syncTreeHandler) handleHeadUpdate(
|
||||
senderId string,
|
||||
update *treechangeproto.TreeHeadUpdate,
|
||||
replyId string) (err error) {
|
||||
log.With("senderId", senderId).
|
||||
With("heads", update.Heads).
|
||||
With("treeId", s.objTree.ID()).
|
||||
Debug("received head update message")
|
||||
var (
|
||||
fullRequest *treechangeproto.TreeSyncMessage
|
||||
isEmptyUpdate = len(update.Changes) == 0
|
||||
objTree = s.objTree
|
||||
)
|
||||
|
||||
err = func() error {
|
||||
objTree.Lock()
|
||||
defer objTree.Unlock()
|
||||
log := log.With("senderId", senderId).
|
||||
With("heads", objTree.Heads()).
|
||||
With("treeId", objTree.ID())
|
||||
log.Debug("received head update message")
|
||||
|
||||
// isEmptyUpdate is sent when the tree is brought up from cache
|
||||
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...)
|
||||
defer func() {
|
||||
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 {
|
||||
log.With("senderId", senderId).
|
||||
With("heads", objTree.Heads()).
|
||||
With("treeId", objTree.ID()).
|
||||
Debug("sending full sync request")
|
||||
// isEmptyUpdate is sent when the tree is brought up from cache
|
||||
if isEmptyUpdate {
|
||||
log.With("treeId", objTree.ID()).Debug("is empty update")
|
||||
if slice.UnsortedEquals(objTree.Heads(), update.Heads) {
|
||||
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)
|
||||
}
|
||||
log.With("senderId", senderId).
|
||||
With("heads", update.Heads).
|
||||
With("treeId", objTree.ID()).
|
||||
Debug("head update finished correctly")
|
||||
return
|
||||
|
||||
if s.alreadyHasHeads(objTree, update.Heads) {
|
||||
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(
|
||||
@ -107,40 +144,43 @@ func (s *syncTreeHandler) handleFullSyncRequest(
|
||||
senderId string,
|
||||
request *treechangeproto.TreeFullSyncRequest,
|
||||
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 (
|
||||
fullResponse *treechangeproto.TreeSyncMessage
|
||||
header = s.objTree.Header()
|
||||
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() {
|
||||
if err != nil {
|
||||
log.With(zap.Error(err)).Debug("full sync request finished with error")
|
||||
|
||||
s.syncClient.SendAsync(senderId, treechangeproto.WrapError(err, header), replyId)
|
||||
return
|
||||
} else if fullResponse != nil {
|
||||
log.Debug("full sync response sent")
|
||||
}
|
||||
}()
|
||||
|
||||
err = func() error {
|
||||
objTree.Lock()
|
||||
defer objTree.Unlock()
|
||||
|
||||
if len(request.Changes) != 0 && !s.alreadyHasHeads(objTree, request.Heads) {
|
||||
_, err = objTree.AddRawChanges(ctx, request.Changes...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(request.Changes) != 0 && !s.alreadyHasHeads(objTree, request.Heads) {
|
||||
_, err = objTree.AddRawChanges(ctx, tree.RawChangesPayload{
|
||||
NewHeads: request.Heads,
|
||||
RawChanges: request.Changes,
|
||||
})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
fullResponse, err = s.syncClient.CreateFullSyncResponse(objTree, request.Heads, request.SnapshotPath)
|
||||
return err
|
||||
}()
|
||||
|
||||
}
|
||||
fullResponse, err = s.syncClient.CreateFullSyncResponse(objTree, request.Heads, request.SnapshotPath)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
return s.syncClient.SendAsync(senderId, fullResponse, replyId)
|
||||
}
|
||||
|
||||
@ -148,34 +188,30 @@ func (s *syncTreeHandler) handleFullSyncResponse(
|
||||
ctx context.Context,
|
||||
senderId string,
|
||||
response *treechangeproto.TreeFullSyncResponse) (err error) {
|
||||
log.With("senderId", senderId).
|
||||
var (
|
||||
objTree = s.objTree
|
||||
)
|
||||
log := log.With("senderId", senderId).
|
||||
With("heads", response.Heads).
|
||||
With("treeId", s.objTree.ID()).
|
||||
Debug("received full sync response message")
|
||||
objTree := s.objTree
|
||||
if err != nil {
|
||||
log.With("senderId", senderId).
|
||||
With("heads", response.Heads).
|
||||
With("treeId", s.objTree.ID()).
|
||||
Debug("failed to find the tree in full sync response")
|
||||
With("treeId", s.objTree.ID())
|
||||
log.Debug("received full sync response message")
|
||||
|
||||
defer func() {
|
||||
if err != nil {
|
||||
log.With(zap.Error(err)).Debug("full sync response failed")
|
||||
} else {
|
||||
log.Debug("full sync response succeeded")
|
||||
}
|
||||
}()
|
||||
|
||||
if s.alreadyHasHeads(objTree, response.Heads) {
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ package synctree
|
||||
import (
|
||||
"context"
|
||||
"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/pkg/acl/tree"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree/mock_objecttree"
|
||||
@ -33,18 +34,47 @@ func (t *testObjTreeMock) Unlock() {
|
||||
t.m.Unlock()
|
||||
}
|
||||
|
||||
func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
type syncHandlerFixture struct {
|
||||
ctrl *gomock.Controller
|
||||
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)
|
||||
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()
|
||||
|
||||
t.Run("head update non empty all heads added", func(t *testing.T) {
|
||||
fx := newSyncHandlerFixture(t)
|
||||
defer fx.stop()
|
||||
treeId := "treeId"
|
||||
senderId := "senderId"
|
||||
chWithId := &treechangeproto.RawTreeChangeWithId{}
|
||||
@ -56,29 +86,29 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
|
||||
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
||||
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
|
||||
|
||||
objectTreeMock.EXPECT().
|
||||
ID().AnyTimes().Return(treeId)
|
||||
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)
|
||||
fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
|
||||
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
|
||||
|
||||
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)
|
||||
})
|
||||
|
||||
t.Run("head update non empty heads not added", func(t *testing.T) {
|
||||
fx := newSyncHandlerFixture(t)
|
||||
defer fx.stop()
|
||||
treeId := "treeId"
|
||||
senderId := "senderId"
|
||||
chWithId := &treechangeproto.RawTreeChangeWithId{}
|
||||
@ -90,38 +120,32 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
|
||||
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
||||
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
|
||||
fullRequest := &treechangeproto.TreeSyncMessage{}
|
||||
fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
|
||||
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
|
||||
|
||||
objectTreeMock.EXPECT().
|
||||
ID().AnyTimes().Return(treeId)
|
||||
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})).
|
||||
fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
|
||||
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).AnyTimes()
|
||||
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)
|
||||
objectTreeMock.EXPECT().
|
||||
Heads().
|
||||
Return([]string{"h2"})
|
||||
objectTreeMock.EXPECT().
|
||||
HasChanges(gomock.Eq([]string{"h1"})).
|
||||
Return(false)
|
||||
syncClientMock.EXPECT().
|
||||
CreateFullSyncRequest(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
|
||||
fx.syncClientMock.EXPECT().
|
||||
CreateFullSyncRequest(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||
Return(fullRequest, nil)
|
||||
objectTreeMock.EXPECT().
|
||||
Heads().
|
||||
Return([]string{"h2"})
|
||||
fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullRequest), gomock.Eq(""))
|
||||
|
||||
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullRequest), gomock.Eq(""))
|
||||
|
||||
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
||||
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("head update non empty equal heads", func(t *testing.T) {
|
||||
fx := newSyncHandlerFixture(t)
|
||||
defer fx.stop()
|
||||
treeId := "treeId"
|
||||
senderId := "senderId"
|
||||
chWithId := &treechangeproto.RawTreeChangeWithId{}
|
||||
@ -132,18 +156,20 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
|
||||
}
|
||||
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
||||
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
|
||||
fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
|
||||
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
|
||||
|
||||
objectTreeMock.EXPECT().
|
||||
ID().AnyTimes().Return(treeId)
|
||||
objectTreeMock.EXPECT().
|
||||
Heads().
|
||||
Return([]string{"h1"})
|
||||
fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
|
||||
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h1"}).AnyTimes()
|
||||
|
||||
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
||||
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("head update empty", func(t *testing.T) {
|
||||
fx := newSyncHandlerFixture(t)
|
||||
defer fx.stop()
|
||||
treeId := "treeId"
|
||||
senderId := "senderId"
|
||||
chWithId := &treechangeproto.RawTreeChangeWithId{}
|
||||
@ -155,26 +181,24 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
|
||||
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
||||
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
|
||||
fullRequest := &treechangeproto.TreeSyncMessage{}
|
||||
fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
|
||||
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
|
||||
|
||||
objectTreeMock.EXPECT().
|
||||
ID().AnyTimes().Return(treeId)
|
||||
objectTreeMock.EXPECT().
|
||||
Heads().
|
||||
Return([]string{"h2"})
|
||||
syncClientMock.EXPECT().
|
||||
CreateFullSyncRequest(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||
fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
|
||||
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).AnyTimes()
|
||||
fx.syncClientMock.EXPECT().
|
||||
CreateFullSyncRequest(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||
Return(fullRequest, nil)
|
||||
objectTreeMock.EXPECT().
|
||||
Heads().
|
||||
Return([]string{"h2"})
|
||||
fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullRequest), gomock.Eq(""))
|
||||
|
||||
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullRequest), gomock.Eq(""))
|
||||
|
||||
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
||||
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("head update empty equal heads", func(t *testing.T) {
|
||||
fx := newSyncHandlerFixture(t)
|
||||
defer fx.stop()
|
||||
treeId := "treeId"
|
||||
senderId := "senderId"
|
||||
chWithId := &treechangeproto.RawTreeChangeWithId{}
|
||||
@ -185,29 +209,25 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
|
||||
}
|
||||
treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId)
|
||||
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
|
||||
fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), "").Return(false)
|
||||
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, "", nil)
|
||||
|
||||
objectTreeMock.EXPECT().
|
||||
ID().AnyTimes().Return(treeId)
|
||||
objectTreeMock.EXPECT().
|
||||
Heads().
|
||||
Return([]string{"h1"})
|
||||
fx.objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
|
||||
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h1"}).AnyTimes()
|
||||
|
||||
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
||||
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
|
||||
ctx := context.Background()
|
||||
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
|
||||
objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
|
||||
|
||||
syncHandler := newSyncTreeHandler(objectTreeMock, syncClientMock)
|
||||
log = zap.NewNop().Sugar()
|
||||
|
||||
t.Run("full sync request with change", func(t *testing.T) {
|
||||
fx := newSyncHandlerFixture(t)
|
||||
defer fx.stop()
|
||||
treeId := "treeId"
|
||||
senderId := "senderId"
|
||||
chWithId := &treechangeproto.RawTreeChangeWithId{}
|
||||
@ -219,27 +239,32 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
|
||||
treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId)
|
||||
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
|
||||
fullResponse := &treechangeproto.TreeSyncMessage{}
|
||||
objectTreeMock.EXPECT().
|
||||
ID().AnyTimes().Return(treeId)
|
||||
objectTreeMock.EXPECT().Header().Return(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})).
|
||||
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)
|
||||
fx.objectTreeMock.EXPECT().Header().Return(nil)
|
||||
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).AnyTimes()
|
||||
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)
|
||||
syncClientMock.EXPECT().
|
||||
CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||
fx.syncClientMock.EXPECT().
|
||||
CreateFullSyncResponse(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||
Return(fullResponse, nil)
|
||||
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq(""))
|
||||
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq(""))
|
||||
|
||||
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
||||
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("full sync request with change same heads", func(t *testing.T) {
|
||||
fx := newSyncHandlerFixture(t)
|
||||
defer fx.stop()
|
||||
treeId := "treeId"
|
||||
senderId := "senderId"
|
||||
chWithId := &treechangeproto.RawTreeChangeWithId{}
|
||||
@ -251,21 +276,28 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
|
||||
treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId)
|
||||
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "")
|
||||
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)
|
||||
objectTreeMock.EXPECT().Header().Return(nil)
|
||||
objectTreeMock.EXPECT().
|
||||
fx.objectTreeMock.EXPECT().Header().Return(nil)
|
||||
fx.objectTreeMock.EXPECT().
|
||||
Heads().
|
||||
Return([]string{"h1"})
|
||||
syncClientMock.EXPECT().
|
||||
CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||
Return([]string{"h1"}).AnyTimes()
|
||||
fx.syncClientMock.EXPECT().
|
||||
CreateFullSyncResponse(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||
Return(fullResponse, nil)
|
||||
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq(""))
|
||||
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq(""))
|
||||
|
||||
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
||||
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("full sync request without change but with reply id", func(t *testing.T) {
|
||||
fx := newSyncHandlerFixture(t)
|
||||
defer fx.stop()
|
||||
treeId := "treeId"
|
||||
senderId := "senderId"
|
||||
replyId := "replyId"
|
||||
@ -277,18 +309,25 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
|
||||
treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId)
|
||||
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId)
|
||||
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)
|
||||
objectTreeMock.EXPECT().Header().Return(nil)
|
||||
syncClientMock.EXPECT().
|
||||
CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||
fx.objectTreeMock.EXPECT().Header().Return(nil)
|
||||
fx.syncClientMock.EXPECT().
|
||||
CreateFullSyncResponse(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||
Return(fullResponse, nil)
|
||||
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq(replyId))
|
||||
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq(replyId))
|
||||
|
||||
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
||||
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("full sync request with add raw changes error", func(t *testing.T) {
|
||||
fx := newSyncHandlerFixture(t)
|
||||
defer fx.stop()
|
||||
treeId := "treeId"
|
||||
senderId := "senderId"
|
||||
chWithId := &treechangeproto.RawTreeChangeWithId{}
|
||||
@ -299,36 +338,39 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
|
||||
}
|
||||
treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId)
|
||||
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)
|
||||
objectTreeMock.EXPECT().Header().Return(nil)
|
||||
objectTreeMock.EXPECT().
|
||||
fx.objectTreeMock.EXPECT().Header().Return(nil)
|
||||
fx.objectTreeMock.EXPECT().
|
||||
Heads().
|
||||
Return([]string{"h2"})
|
||||
objectTreeMock.EXPECT().
|
||||
fx.objectTreeMock.EXPECT().
|
||||
HasChanges(gomock.Eq([]string{"h1"})).
|
||||
Return(false)
|
||||
objectTreeMock.EXPECT().
|
||||
AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})).
|
||||
fx.objectTreeMock.EXPECT().
|
||||
AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
|
||||
NewHeads: []string{"h1"},
|
||||
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
||||
})).
|
||||
Return(tree.AddResult{}, fmt.Errorf(""))
|
||||
syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Any(), gomock.Eq(""))
|
||||
err := syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Any(), gomock.Eq(""))
|
||||
|
||||
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
||||
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
||||
require.Error(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestSyncHandler_HandleFullSyncResponse(t *testing.T) {
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
|
||||
ctx := context.Background()
|
||||
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
|
||||
objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
|
||||
|
||||
syncHandler := newSyncTreeHandler(objectTreeMock, syncClientMock)
|
||||
log = zap.NewNop().Sugar()
|
||||
|
||||
t.Run("full sync response with change", func(t *testing.T) {
|
||||
fx := newSyncHandlerFixture(t)
|
||||
defer fx.stop()
|
||||
treeId := "treeId"
|
||||
senderId := "senderId"
|
||||
replyId := "replyId"
|
||||
@ -340,22 +382,31 @@ func TestSyncHandler_HandleFullSyncResponse(t *testing.T) {
|
||||
}
|
||||
treeMsg := treechangeproto.WrapFullResponse(fullSyncResponse, chWithId)
|
||||
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId)
|
||||
objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
|
||||
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)
|
||||
fx.objectTreeMock.EXPECT().
|
||||
Heads().
|
||||
Return([]string{"h2"})
|
||||
objectTreeMock.EXPECT().
|
||||
Return([]string{"h2"}).AnyTimes()
|
||||
fx.objectTreeMock.EXPECT().
|
||||
HasChanges(gomock.Eq([]string{"h1"})).
|
||||
Return(false)
|
||||
objectTreeMock.EXPECT().
|
||||
AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})).
|
||||
fx.objectTreeMock.EXPECT().
|
||||
AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
|
||||
NewHeads: []string{"h1"},
|
||||
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
||||
})).
|
||||
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)
|
||||
})
|
||||
|
||||
t.Run("full sync response with same heads", func(t *testing.T) {
|
||||
fx := newSyncHandlerFixture(t)
|
||||
defer fx.stop()
|
||||
treeId := "treeId"
|
||||
senderId := "senderId"
|
||||
replyId := "replyId"
|
||||
@ -367,12 +418,16 @@ func TestSyncHandler_HandleFullSyncResponse(t *testing.T) {
|
||||
}
|
||||
treeMsg := treechangeproto.WrapFullResponse(fullSyncResponse, chWithId)
|
||||
objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId)
|
||||
objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId)
|
||||
objectTreeMock.EXPECT().
|
||||
Heads().
|
||||
Return([]string{"h1"})
|
||||
fx.receiveQueueMock.EXPECT().AddMessage(senderId, gomock.Eq(treeMsg), replyId).Return(false)
|
||||
fx.receiveQueueMock.EXPECT().GetMessage(senderId).Return(treeMsg, replyId, nil)
|
||||
|
||||
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)
|
||||
})
|
||||
}
|
||||
|
||||
@ -32,6 +32,7 @@ type Config struct {
|
||||
Storage Storage `yaml:"storage"`
|
||||
Metric Metric `yaml:"metric"`
|
||||
Log Log `yaml:"log"`
|
||||
Stream Stream `yaml:"stream"`
|
||||
FileStorePogreb FileStorePogreb `yaml:"fileStorePogreb"`
|
||||
}
|
||||
|
||||
@ -52,6 +53,10 @@ func (c Config) GetGRPCServer() GrpcServer {
|
||||
return c.GrpcServer
|
||||
}
|
||||
|
||||
func (c Config) GetStream() Stream {
|
||||
return c.Stream
|
||||
}
|
||||
|
||||
func (c Config) GetAccount() Account {
|
||||
return c.Account
|
||||
}
|
||||
|
||||
6
common/config/stream.go
Normal file
6
common/config/stream.go
Normal file
@ -0,0 +1,6 @@
|
||||
package config
|
||||
|
||||
type Stream struct {
|
||||
TimeoutMilliseconds int `yaml:"timeoutMilliseconds"`
|
||||
MaxMsgSizeMb int `yaml:"maxMsgSizeMb"`
|
||||
}
|
||||
@ -3,7 +3,6 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/common
|
||||
go 1.19
|
||||
|
||||
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-chash v0.0.0-20220629194632-4ad1154fe232
|
||||
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-chunker v0.0.5
|
||||
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-merkledag v0.8.1
|
||||
github.com/ipfs/go-unixfs v0.4.1
|
||||
@ -31,8 +29,9 @@ require (
|
||||
github.com/stretchr/testify v1.8.1
|
||||
github.com/zeebo/blake3 v0.2.3
|
||||
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
|
||||
golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b
|
||||
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
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-posinfo v0.0.1 // 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-log v1.0.5 // 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
|
||||
go.opentelemetry.io/otel 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/image v0.0.0-20200119044424-58c23975cae1 // indirect
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect
|
||||
|
||||
@ -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/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE=
|
||||
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-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
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-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-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-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg=
|
||||
|
||||
@ -8,12 +8,16 @@ import (
|
||||
"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/secure"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/timeoutconn"
|
||||
"github.com/libp2p/go-libp2p/core/sec"
|
||||
"go.uber.org/zap"
|
||||
"net"
|
||||
"storj.io/drpc"
|
||||
"storj.io/drpc/drpcconn"
|
||||
"storj.io/drpc/drpcmanager"
|
||||
"storj.io/drpc/drpcwire"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
const CName = "common.net.dialer"
|
||||
@ -34,6 +38,7 @@ type Dialer interface {
|
||||
|
||||
type dialer struct {
|
||||
transport secure.Service
|
||||
config *config.Config
|
||||
peerAddrs map[string][]string
|
||||
|
||||
mu sync.RWMutex
|
||||
@ -41,9 +46,9 @@ type dialer struct {
|
||||
|
||||
func (d *dialer) Init(a *app.App) (err error) {
|
||||
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{}
|
||||
for _, n := range nodes {
|
||||
for _, n := range d.config.Nodes {
|
||||
d.peerAddrs[n.PeerId] = []string{n.Address}
|
||||
}
|
||||
return
|
||||
@ -90,11 +95,15 @@ func (d *dialer) handshake(ctx context.Context, addr string) (conn drpc.Conn, sc
|
||||
if err != nil {
|
||||
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 {
|
||||
return
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
@ -8,8 +8,10 @@ import (
|
||||
"io"
|
||||
"net"
|
||||
"storj.io/drpc"
|
||||
"storj.io/drpc/drpcmanager"
|
||||
"storj.io/drpc/drpcmux"
|
||||
"storj.io/drpc/drpcserver"
|
||||
"storj.io/drpc/drpcwire"
|
||||
"time"
|
||||
)
|
||||
|
||||
@ -22,21 +24,31 @@ type BaseDrpcServer struct {
|
||||
}
|
||||
|
||||
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 {
|
||||
return &BaseDrpcServer{Mux: drpcmux.New()}
|
||||
}
|
||||
|
||||
func (s *BaseDrpcServer) Run(ctx context.Context, listenAddrs []string, wrapper DRPCHandlerWrapper, converter ListenerConverter) (err error) {
|
||||
s.drpcServer = drpcserver.New(wrapper(s.Mux))
|
||||
func (s *BaseDrpcServer) Run(ctx context.Context, params Params) (err error) {
|
||||
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)
|
||||
for _, addr := range listenAddrs {
|
||||
for _, addr := range params.ListenAddrs {
|
||||
tcpList, err := net.Listen("tcp", addr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
tlsList := converter(tcpList)
|
||||
tlsList := params.Converter(tcpList, params.TimeoutMillis)
|
||||
go s.serve(ctx, tlsList)
|
||||
}
|
||||
return
|
||||
|
||||
@ -26,17 +26,18 @@ type DRPCServer interface {
|
||||
|
||||
type configGetter interface {
|
||||
GetGRPCServer() config.GrpcServer
|
||||
GetStream() config.Stream
|
||||
}
|
||||
|
||||
type drpcServer struct {
|
||||
config config.GrpcServer
|
||||
config configGetter
|
||||
metric metric.Metric
|
||||
transport secure.Service
|
||||
*BaseDrpcServer
|
||||
}
|
||||
|
||||
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.transport = a.MustComponent(secure.CName).(secure.Service)
|
||||
return nil
|
||||
@ -61,16 +62,19 @@ func (s *drpcServer) Run(ctx context.Context) (err error) {
|
||||
if err = s.metric.Registry().Register(histVec); err != nil {
|
||||
return
|
||||
}
|
||||
return s.BaseDrpcServer.Run(
|
||||
ctx,
|
||||
s.config.ListenAddrs,
|
||||
func(handler drpc.Handler) drpc.Handler {
|
||||
params := Params{
|
||||
BufferSizeMb: s.config.GetStream().MaxMsgSizeMb,
|
||||
TimeoutMillis: s.config.GetStream().TimeoutMilliseconds,
|
||||
ListenAddrs: s.config.GetGRPCServer().ListenAddrs,
|
||||
Wrapper: func(handler drpc.Handler) drpc.Handler {
|
||||
return &metric.PrometheusDRPC{
|
||||
Handler: handler,
|
||||
SummaryVec: histVec,
|
||||
}
|
||||
},
|
||||
s.transport.TLSListener)
|
||||
Converter: s.transport.TLSListener,
|
||||
}
|
||||
return s.BaseDrpcServer.Run(ctx, params)
|
||||
}
|
||||
|
||||
func (s *drpcServer) Close(ctx context.Context) (err error) {
|
||||
|
||||
@ -2,18 +2,25 @@ package secure
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/timeoutconn"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
||||
type basicListener struct {
|
||||
net.Listener
|
||||
timeoutMillis int
|
||||
}
|
||||
|
||||
func newBasicListener(listener net.Listener) ContextListener {
|
||||
return &basicListener{listener}
|
||||
func newBasicListener(listener net.Listener, timeoutMillis int) ContextListener {
|
||||
return &basicListener{listener, timeoutMillis}
|
||||
}
|
||||
|
||||
func (b *basicListener) Accept(ctx context.Context) (context.Context, net.Conn, error) {
|
||||
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
|
||||
}
|
||||
|
||||
@ -25,8 +25,8 @@ func New() Service {
|
||||
}
|
||||
|
||||
type Service interface {
|
||||
TLSListener(lis net.Listener) ContextListener
|
||||
BasicListener(lis net.Listener) ContextListener
|
||||
TLSListener(lis net.Listener, timeoutMillis int) ContextListener
|
||||
BasicListener(lis net.Listener, timeoutMillis int) ContextListener
|
||||
TLSConn(ctx context.Context, conn net.Conn) (sec.SecureConn, error)
|
||||
app.Component
|
||||
}
|
||||
@ -54,12 +54,12 @@ func (s *service) Name() (name string) {
|
||||
return CName
|
||||
}
|
||||
|
||||
func (s *service) TLSListener(lis net.Listener) ContextListener {
|
||||
return newTLSListener(s.key, lis)
|
||||
func (s *service) TLSListener(lis net.Listener, timeoutMillis int) ContextListener {
|
||||
return newTLSListener(s.key, lis, timeoutMillis)
|
||||
}
|
||||
|
||||
func (s *service) BasicListener(lis net.Listener) ContextListener {
|
||||
return newBasicListener(lis)
|
||||
func (s *service) BasicListener(lis net.Listener, timeoutMillis int) ContextListener {
|
||||
return newBasicListener(lis, timeoutMillis)
|
||||
}
|
||||
|
||||
func (s *service) TLSConn(ctx context.Context, conn net.Conn) (sec.SecureConn, error) {
|
||||
|
||||
@ -3,9 +3,11 @@ package secure
|
||||
import (
|
||||
"context"
|
||||
"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"
|
||||
libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls"
|
||||
"net"
|
||||
"time"
|
||||
)
|
||||
|
||||
type ContextListener interface {
|
||||
@ -20,17 +22,19 @@ type ContextListener interface {
|
||||
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)
|
||||
return &tlsListener{
|
||||
tr: tr,
|
||||
Listener: lis,
|
||||
tr: tr,
|
||||
Listener: lis,
|
||||
timeoutMillis: timeoutMillis,
|
||||
}
|
||||
}
|
||||
|
||||
type tlsListener struct {
|
||||
net.Listener
|
||||
tr *libp2ptls.Transport
|
||||
tr *libp2ptls.Transport
|
||||
timeoutMillis int
|
||||
}
|
||||
|
||||
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 {
|
||||
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) {
|
||||
|
||||
39
common/net/timeoutconn/conn.go
Normal file
39
common/net/timeoutconn/conn.go
Normal 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
|
||||
}
|
||||
}
|
||||
@ -9,6 +9,7 @@ import (
|
||||
|
||||
type ConfConnector interface {
|
||||
Configuration() Configuration
|
||||
Pool() pool.Pool
|
||||
GetResponsiblePeers(ctx context.Context, spaceId 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 {
|
||||
// TODO: think about rewriting this, because these deps should not be exposed
|
||||
return s.conf
|
||||
}
|
||||
|
||||
func (s *confConnector) Pool() pool.Pool {
|
||||
return s.pool
|
||||
}
|
||||
|
||||
func (s *confConnector) GetResponsiblePeers(ctx context.Context, spaceId string) ([]peer.Peer, error) {
|
||||
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 {
|
||||
// that means that all connected ids
|
||||
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 {
|
||||
return
|
||||
}
|
||||
|
||||
@ -10,6 +10,7 @@ import (
|
||||
|
||||
app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
||||
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"
|
||||
gomock "github.com/golang/mock/gomock"
|
||||
)
|
||||
@ -252,3 +253,17 @@ func (mr *MockConfConnectorMockRecorder) GetResponsiblePeers(arg0, arg1 interfac
|
||||
mr.mock.ctrl.T.Helper()
|
||||
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))
|
||||
}
|
||||
|
||||
@ -246,7 +246,7 @@ func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uin
|
||||
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)
|
||||
return
|
||||
}
|
||||
@ -413,7 +413,7 @@ func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, e
|
||||
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)]
|
||||
if !exists {
|
||||
return false
|
||||
|
||||
@ -53,23 +53,18 @@ func (mr *MockObjectTreeMockRecorder) AddContent(arg0, arg1 interface{}) *gomock
|
||||
}
|
||||
|
||||
// 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()
|
||||
varargs := []interface{}{arg0}
|
||||
for _, a := range arg1 {
|
||||
varargs = append(varargs, a)
|
||||
}
|
||||
ret := m.ctrl.Call(m, "AddRawChanges", varargs...)
|
||||
ret := m.ctrl.Call(m, "AddRawChanges", arg0, arg1)
|
||||
ret0, _ := ret[0].(tree.AddResult)
|
||||
ret1, _ := ret[1].(error)
|
||||
return ret0, ret1
|
||||
}
|
||||
|
||||
// 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()
|
||||
varargs := append([]interface{}{arg0}, arg1...)
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawChanges", reflect.TypeOf((*MockObjectTree)(nil).AddRawChanges), varargs...)
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawChanges", reflect.TypeOf((*MockObjectTree)(nil).AddRawChanges), arg0, arg1)
|
||||
}
|
||||
|
||||
// ChangesAfterCommonSnapshot mocks base method.
|
||||
|
||||
@ -4,11 +4,13 @@ package tree
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common"
|
||||
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/treechangeproto"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
||||
"sync"
|
||||
)
|
||||
|
||||
@ -33,6 +35,11 @@ type AddResult struct {
|
||||
Mode Mode
|
||||
}
|
||||
|
||||
type RawChangesPayload struct {
|
||||
NewHeads []string
|
||||
RawChanges []*treechangeproto.RawTreeChangeWithId
|
||||
}
|
||||
|
||||
type ChangeIterateFunc = func(change *Change) bool
|
||||
type ChangeConvertFunc = func(decrypted []byte) (any, error)
|
||||
|
||||
@ -55,7 +62,7 @@ type ObjectTree interface {
|
||||
Storage() storage.TreeStorage
|
||||
|
||||
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
|
||||
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.tree, err = ot.treeBuilder.Build(newChanges)
|
||||
ot.tree, err = ot.treeBuilder.Build(theirHeads, newChanges)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -192,6 +199,13 @@ func (ot *objectTree) prepareBuilderContent(content SignableChangeContent) (cnt
|
||||
readKey *symmetric.Key
|
||||
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 {
|
||||
readKeyHash = state.CurrentReadKeyHash()
|
||||
readKey, err = state.CurrentReadKey()
|
||||
@ -213,8 +227,8 @@ func (ot *objectTree) prepareBuilderContent(content SignableChangeContent) (cnt
|
||||
return
|
||||
}
|
||||
|
||||
func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*treechangeproto.RawTreeChangeWithId) (addResult AddResult, err error) {
|
||||
addResult, err = ot.addRawChanges(ctx, rawChanges...)
|
||||
func (ot *objectTree) AddRawChanges(ctx context.Context, changesPayload RawChangesPayload) (addResult AddResult, err error) {
|
||||
addResult, err = ot.addRawChanges(ctx, changesPayload)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@ -235,7 +249,7 @@ func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*treechan
|
||||
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
|
||||
ot.newChangesBuf = ot.newChangesBuf[:0]
|
||||
ot.notSeenIdxBuf = ot.notSeenIdxBuf[:0]
|
||||
@ -252,7 +266,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechan
|
||||
prevHeadsCopy := headsCopy()
|
||||
|
||||
// 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
|
||||
if _, exists := ot.tree.attached[ch.Id]; exists {
|
||||
continue
|
||||
@ -328,20 +342,20 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechan
|
||||
}
|
||||
}
|
||||
// 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 {
|
||||
err = ot.rebuildFromStorage(ot.newChangesBuf)
|
||||
err = ot.rebuildFromStorage(changesPayload.NewHeads, ot.newChangesBuf)
|
||||
if err != nil {
|
||||
// rebuilding without new changes
|
||||
ot.rebuildFromStorage(nil)
|
||||
ot.rebuildFromStorage(nil, nil)
|
||||
return
|
||||
}
|
||||
addResult, err = ot.createAddResult(prevHeadsCopy, Rebuild, nil, rawChanges)
|
||||
addResult, err = ot.createAddResult(prevHeadsCopy, Rebuild, nil, changesPayload.RawChanges)
|
||||
if err != nil {
|
||||
// that means that some unattached changes were somehow corrupted in memory
|
||||
// this shouldn't happen but if that happens, then rebuilding from storage
|
||||
ot.rebuildFromStorage(nil)
|
||||
ot.rebuildFromStorage(nil, nil)
|
||||
return
|
||||
}
|
||||
return
|
||||
@ -366,11 +380,11 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechan
|
||||
err = ErrHasInvalidChanges
|
||||
return
|
||||
}
|
||||
addResult, err = ot.createAddResult(prevHeadsCopy, mode, treeChangesAdded, rawChanges)
|
||||
addResult, err = ot.createAddResult(prevHeadsCopy, mode, treeChangesAdded, changesPayload.RawChanges)
|
||||
if err != nil {
|
||||
// that means that some unattached changes were somehow corrupted in memory
|
||||
// this shouldn't happen but if that happens, then rebuilding from storage
|
||||
ot.rebuildFromStorage(nil)
|
||||
ot.rebuildFromStorage(nil, nil)
|
||||
return
|
||||
}
|
||||
return
|
||||
|
||||
@ -161,7 +161,11 @@ func TestObjectTree(t *testing.T) {
|
||||
changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"),
|
||||
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")
|
||||
|
||||
// check result
|
||||
@ -201,7 +205,11 @@ func TestObjectTree(t *testing.T) {
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
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")
|
||||
|
||||
// check result
|
||||
@ -221,7 +229,11 @@ func TestObjectTree(t *testing.T) {
|
||||
rawChanges := []*treechangeproto.RawTreeChangeWithId{
|
||||
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")
|
||||
|
||||
// check result
|
||||
@ -246,7 +258,12 @@ func TestObjectTree(t *testing.T) {
|
||||
changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"),
|
||||
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")
|
||||
|
||||
// check result
|
||||
@ -289,7 +306,12 @@ func TestObjectTree(t *testing.T) {
|
||||
changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"),
|
||||
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")
|
||||
|
||||
snapshotPath := objTree.SnapshotPath()
|
||||
@ -312,7 +334,12 @@ func TestObjectTree(t *testing.T) {
|
||||
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.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"),
|
||||
}
|
||||
|
||||
_, 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.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("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.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("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")
|
||||
|
||||
// check result
|
||||
|
||||
@ -106,7 +106,7 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) {
|
||||
newSnapshotsBuf: make([]*Change, 0, 10),
|
||||
}
|
||||
|
||||
err := objTree.rebuildFromStorage(nil)
|
||||
err := objTree.rebuildFromStorage(nil, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"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/util/slice"
|
||||
"time"
|
||||
)
|
||||
|
||||
@ -87,7 +88,7 @@ func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*treech
|
||||
return true
|
||||
},
|
||||
func(visited []*Change) {
|
||||
results = discardFromSlice(results, func(change *Change) bool {
|
||||
results = slice.DiscardFromSlice(results, func(change *Change) bool {
|
||||
return change.visited
|
||||
})
|
||||
},
|
||||
@ -143,6 +144,7 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi
|
||||
}
|
||||
if !exists {
|
||||
entry, err = r.loadEntry(id)
|
||||
entry.position = -1
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
@ -204,12 +206,11 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi
|
||||
if entry.position != -1 {
|
||||
buffer[entry.position] = nil
|
||||
}
|
||||
entry.position = len(buffer) + 1
|
||||
return entry
|
||||
})
|
||||
|
||||
// discarding visited
|
||||
buffer = discardFromSlice(buffer, func(change *treechangeproto.RawTreeChangeWithId) bool {
|
||||
buffer = slice.DiscardFromSlice(buffer, func(change *treechangeproto.RawTreeChangeWithId) bool {
|
||||
return change == nil
|
||||
})
|
||||
|
||||
|
||||
@ -40,27 +40,49 @@ func (tb *treeBuilder) Reset() {
|
||||
tb.tree = &Tree{}
|
||||
}
|
||||
|
||||
func (tb *treeBuilder) Build(newChanges []*Change) (*Tree, error) {
|
||||
var headsAndNewChanges []string
|
||||
func (tb *treeBuilder) Build(theirHeads []string, newChanges []*Change) (*Tree, error) {
|
||||
var proposedHeads []string
|
||||
tb.cache = make(map[string]*Change)
|
||||
heads, err := tb.treeStorage.Heads()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
headsAndNewChanges = append(headsAndNewChanges, heads...)
|
||||
tb.cache = make(map[string]*Change)
|
||||
for _, ch := range newChanges {
|
||||
headsAndNewChanges = append(headsAndNewChanges, ch.Id)
|
||||
tb.cache[ch.Id] = ch
|
||||
}
|
||||
|
||||
log.With(zap.Strings("heads", heads)).Debug("building tree")
|
||||
breakpoint, err := tb.findBreakpoint(headsAndNewChanges)
|
||||
// TODO: we can actually get this from tree (though not sure, that there would always be
|
||||
// an invariant where the tree has the closest common snapshot of heads)
|
||||
// so if optimization is critical we can change this to inject from tree directly
|
||||
// but then we have to be sure that invariant stays true
|
||||
oldBreakpoint, err := tb.findBreakpoint(heads, true)
|
||||
if err != nil {
|
||||
// this should never error out, because otherwise we have broken data
|
||||
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)
|
||||
}
|
||||
|
||||
@ -73,13 +95,12 @@ func (tb *treeBuilder) buildTree(heads []string, breakpoint string) (err error)
|
||||
return
|
||||
}
|
||||
tb.tree.AddFast(ch)
|
||||
changes, err := tb.dfs(heads, breakpoint)
|
||||
|
||||
changes := tb.dfs(heads, breakpoint)
|
||||
tb.tree.AddFast(changes...)
|
||||
return
|
||||
}
|
||||
|
||||
func (tb *treeBuilder) dfs(heads []string, breakpoint string) (buf []*Change, err error) {
|
||||
func (tb *treeBuilder) dfs(heads []string, breakpoint string) []*Change {
|
||||
// initializing buffers
|
||||
tb.idStack = tb.idStack[: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)
|
||||
}
|
||||
}
|
||||
return tb.loadBuffer, nil
|
||||
return tb.loadBuffer
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
func (tb *treeBuilder) findBreakpoint(heads []string) (breakpoint string, err error) {
|
||||
func (tb *treeBuilder) findBreakpoint(heads []string, noError bool) (breakpoint string, err error) {
|
||||
var (
|
||||
ch *Change
|
||||
snapshotIds []string
|
||||
)
|
||||
for _, head := range heads {
|
||||
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
|
||||
if ch.IsSnapshot {
|
||||
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 {
|
||||
snapshotIds = append(snapshotIds, shId)
|
||||
@ -165,6 +202,7 @@ func (tb *treeBuilder) findCommonSnapshot(snapshotIds []string) (snapshotId stri
|
||||
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 {
|
||||
l := len(snapshotIds)
|
||||
shId, e := tb.findCommonForTwoSnapshots(snapshotIds[l-2], snapshotIds[l-1])
|
||||
|
||||
@ -27,21 +27,3 @@ OuterLoop:
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
@ -35,3 +35,17 @@ func WrapError(err error, rootChange *RawTreeChangeWithId) *TreeSyncMessage {
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@ type PeriodicSync interface {
|
||||
|
||||
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())
|
||||
return &periodicSync{
|
||||
syncer: syncer,
|
||||
@ -23,6 +23,7 @@ func NewPeriodicSync(periodSeconds int, syncer SyncerFunc, l *zap.Logger) Period
|
||||
syncCancel: cancel,
|
||||
syncLoopDone: make(chan struct{}),
|
||||
periodSeconds: periodSeconds,
|
||||
timeout: timeout,
|
||||
}
|
||||
}
|
||||
|
||||
@ -33,6 +34,7 @@ type periodicSync struct {
|
||||
syncCancel context.CancelFunc
|
||||
syncLoopDone chan struct{}
|
||||
periodSeconds int
|
||||
timeout time.Duration
|
||||
}
|
||||
|
||||
func (p *periodicSync) Run() {
|
||||
@ -43,8 +45,12 @@ func (p *periodicSync) syncLoop(periodSeconds int) {
|
||||
period := time.Duration(periodSeconds) * time.Second
|
||||
defer close(p.syncLoopDone)
|
||||
doSync := func() {
|
||||
ctx, cancel := context.WithTimeout(p.syncCtx, time.Minute)
|
||||
defer cancel()
|
||||
ctx := p.syncCtx
|
||||
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 {
|
||||
p.log.Warn("periodic sync error", zap.Error(err))
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ func TestPeriodicSync_Run(t *testing.T) {
|
||||
times += 1
|
||||
return nil
|
||||
}
|
||||
pSync := NewPeriodicSync(secs, diffSyncer, l)
|
||||
pSync := NewPeriodicSync(secs, 0, diffSyncer, l)
|
||||
|
||||
pSync.Run()
|
||||
pSync.Close()
|
||||
@ -38,7 +38,7 @@ func TestPeriodicSync_Run(t *testing.T) {
|
||||
times += 1
|
||||
return nil
|
||||
}
|
||||
pSync := NewPeriodicSync(secs, diffSyncer, l)
|
||||
pSync := NewPeriodicSync(secs, 0, diffSyncer, l)
|
||||
|
||||
pSync.Run()
|
||||
time.Sleep(time.Second * time.Duration(secs))
|
||||
|
||||
@ -118,3 +118,21 @@ func UnsortedEquals(s1, s2 []string) bool {
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@ -27,6 +27,7 @@ type Config struct {
|
||||
Mongo Mongo `yaml:"mongo"`
|
||||
Metric config.Metric `yaml:"metric"`
|
||||
Log config.Log `yaml:"log"`
|
||||
Stream config.Stream `yaml:"stream"`
|
||||
}
|
||||
|
||||
func (c *Config) Init(a *app.App) (err error) {
|
||||
@ -45,6 +46,10 @@ func (c Config) GetGRPCServer() config.GrpcServer {
|
||||
return c.GrpcServer
|
||||
}
|
||||
|
||||
func (c Config) GetStream() config.Stream {
|
||||
return c.Stream
|
||||
}
|
||||
|
||||
func (c Config) GetAccount() config.Account {
|
||||
return c.Account
|
||||
}
|
||||
|
||||
@ -5,30 +5,30 @@ grpcServer:
|
||||
- 127.0.0.1:4630
|
||||
tls: false
|
||||
account:
|
||||
peerId: 12D3KooWFgtCbkf47HhFyQW2cEdAkvaofpokCiaa24Phnz7hpepG
|
||||
peerKey: 4nWcqWOZxv1iXWYuW35eJlF9nxownm38bZjQ27pmFgVXO26vobKLx70TnNTQzZQdoW/dZtxyE9PO37R74vfPQQ==
|
||||
signingKey: ULbtmmyFjkJ6Z+54FI1OJWfu0QdIeoCckwcrBZDLGhw2o2cXTFH5KGxQuAruNTbREz9eAVGmhGoBZtKVi6/6ng==
|
||||
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
|
||||
peerId: 12D3KooWQajuCbCYJdh6fhfTQpwJpJ61mV1ZV4F4XuJnFHeVfeSF
|
||||
peerKey: Gz1ARVeHzdusDtBL0DawuQKoKdKhL827WiCPekOndSnbYb65zdtgoxGP8Y+enTfKksPftODaiqzZr16Dfq+JvA==
|
||||
signingKey: wKPnynjYCBVqDEiREnMRHz6id1NFNIfjV4XKmB27ave9BSyS8saW71BEb/0XT0IZDJep6oSKr9ua5kAxcr7tQA==
|
||||
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:
|
||||
listenAddrs:
|
||||
- 127.0.0.1:8090
|
||||
tls: false
|
||||
nodes:
|
||||
- peerId: 12D3KooWPuwdqpDQxWhD2Vh4yskx2T5VMrwdpTZLfACzgsGfQfNy
|
||||
- peerId: 12D3KooWHtnADt84naf6NeejZ1MxYGZPLk5SPEu2DL4ZV948uWPS
|
||||
address: 127.0.0.1:4430
|
||||
signingKey: yOEpD2+cPldXc2urGuU+szunm7fddRa8xew2uVjaxifRcVzNKhSERpOefjrXaky7PcKmSmTsH/5ZFtcrh1uzqg==
|
||||
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==
|
||||
- peerId: 12D3KooWBgHmDqtXH9SrZfAmwCFsD8LZhTD5dg5wkhdbqFoS8GBN
|
||||
signingKey: Fu/H792JFWVYQpOZeLBIr1Y5UuHdZzJxkGO7eakZDaZ3/vIDhjGgNab1+1NMdTJ0IUP6Tv3KQutcRwtX26/wmQ==
|
||||
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: 12D3KooWG1r2SVzTMGDhkiw9McbZq98H9C1Ggzp7FSfWDGbVSCbZ
|
||||
address: 127.0.0.1:4431
|
||||
signingKey: l6LFiKqr4ZHgcPbL+DR7KwMbzImufQPFgpoHOJ/nvfUbpb76DCADHuT1I4gIs+XByglnY1KV8jbMfW64XRW5XQ==
|
||||
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
|
||||
- peerId: 12D3KooWASsipDzkridiMBmE7VSqp8yZvGWPY1VqySgMSZk6tsiL
|
||||
signingKey: CZTN+NFi4g9MA4BKl3OiCKuzXh63ukIvYWo9D5t9qfZcFwIeOW8eP9W8mtnXaY3JAFyb6GliBW0uCaw4wjRcCA==
|
||||
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: 12D3KooWDXDcBYxtZ8KNRoJebNgNAv9nFbQatQMoWm1BLwmQh6u7
|
||||
address: 127.0.0.1:4432
|
||||
signingKey: /6+uYFwFf9nU6fvXQVtpHhjd8+v4dXc7esZzqkhjyfMJWlMiZOtQeb913FXofD5f20WksU0l6i22B09sFFYwDQ==
|
||||
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=
|
||||
signingKey: c3D+0+BCl1xU35KBY+U3GPcU9aXdoLUiD4DJ2jF+IqI3CjGLhet3MBOkPXdIuPq/UpEqlp1k6FjNaU6DEU6Csg==
|
||||
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:
|
||||
gcTTL: 60
|
||||
syncPeriod: 11
|
||||
syncPeriod: 20
|
||||
storage:
|
||||
path: db
|
||||
metric:
|
||||
@ -37,3 +37,6 @@ log:
|
||||
production: false
|
||||
defaultLevel: ""
|
||||
namedLevels: {}
|
||||
stream:
|
||||
timeoutMilliseconds: 1000
|
||||
maxMsgSizeMb: 256
|
||||
|
||||
@ -5,30 +5,30 @@ grpcServer:
|
||||
- 127.0.0.1:4430
|
||||
tls: false
|
||||
account:
|
||||
peerId: 12D3KooWPuwdqpDQxWhD2Vh4yskx2T5VMrwdpTZLfACzgsGfQfNy
|
||||
peerKey: yOEpD2+cPldXc2urGuU+szunm7fddRa8xew2uVjaxifRcVzNKhSERpOefjrXaky7PcKmSmTsH/5ZFtcrh1uzqg==
|
||||
signingKey: yOEpD2+cPldXc2urGuU+szunm7fddRa8xew2uVjaxifRcVzNKhSERpOefjrXaky7PcKmSmTsH/5ZFtcrh1uzqg==
|
||||
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==
|
||||
peerId: 12D3KooWHtnADt84naf6NeejZ1MxYGZPLk5SPEu2DL4ZV948uWPS
|
||||
peerKey: Fu/H792JFWVYQpOZeLBIr1Y5UuHdZzJxkGO7eakZDaZ3/vIDhjGgNab1+1NMdTJ0IUP6Tv3KQutcRwtX26/wmQ==
|
||||
signingKey: Fu/H792JFWVYQpOZeLBIr1Y5UuHdZzJxkGO7eakZDaZ3/vIDhjGgNab1+1NMdTJ0IUP6Tv3KQutcRwtX26/wmQ==
|
||||
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:
|
||||
listenAddrs:
|
||||
- 127.0.0.1:8080
|
||||
tls: false
|
||||
nodes:
|
||||
- peerId: 12D3KooWPuwdqpDQxWhD2Vh4yskx2T5VMrwdpTZLfACzgsGfQfNy
|
||||
- peerId: 12D3KooWHtnADt84naf6NeejZ1MxYGZPLk5SPEu2DL4ZV948uWPS
|
||||
address: 127.0.0.1:4430
|
||||
signingKey: yOEpD2+cPldXc2urGuU+szunm7fddRa8xew2uVjaxifRcVzNKhSERpOefjrXaky7PcKmSmTsH/5ZFtcrh1uzqg==
|
||||
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==
|
||||
- peerId: 12D3KooWBgHmDqtXH9SrZfAmwCFsD8LZhTD5dg5wkhdbqFoS8GBN
|
||||
signingKey: Fu/H792JFWVYQpOZeLBIr1Y5UuHdZzJxkGO7eakZDaZ3/vIDhjGgNab1+1NMdTJ0IUP6Tv3KQutcRwtX26/wmQ==
|
||||
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: 12D3KooWG1r2SVzTMGDhkiw9McbZq98H9C1Ggzp7FSfWDGbVSCbZ
|
||||
address: 127.0.0.1:4431
|
||||
signingKey: l6LFiKqr4ZHgcPbL+DR7KwMbzImufQPFgpoHOJ/nvfUbpb76DCADHuT1I4gIs+XByglnY1KV8jbMfW64XRW5XQ==
|
||||
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
|
||||
- peerId: 12D3KooWASsipDzkridiMBmE7VSqp8yZvGWPY1VqySgMSZk6tsiL
|
||||
signingKey: CZTN+NFi4g9MA4BKl3OiCKuzXh63ukIvYWo9D5t9qfZcFwIeOW8eP9W8mtnXaY3JAFyb6GliBW0uCaw4wjRcCA==
|
||||
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: 12D3KooWDXDcBYxtZ8KNRoJebNgNAv9nFbQatQMoWm1BLwmQh6u7
|
||||
address: 127.0.0.1:4432
|
||||
signingKey: /6+uYFwFf9nU6fvXQVtpHhjd8+v4dXc7esZzqkhjyfMJWlMiZOtQeb913FXofD5f20WksU0l6i22B09sFFYwDQ==
|
||||
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=
|
||||
signingKey: c3D+0+BCl1xU35KBY+U3GPcU9aXdoLUiD4DJ2jF+IqI3CjGLhet3MBOkPXdIuPq/UpEqlp1k6FjNaU6DEU6Csg==
|
||||
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:
|
||||
gcTTL: 60
|
||||
syncPeriod: 11
|
||||
syncPeriod: 600
|
||||
storage:
|
||||
path: db
|
||||
metric:
|
||||
@ -39,3 +39,6 @@ log:
|
||||
namedLevels: {}
|
||||
fileStorePogreb:
|
||||
path: /tmp/pogreb
|
||||
stream:
|
||||
timeoutMilliseconds: 1000
|
||||
maxMsgSizeMb: 256
|
||||
|
||||
@ -5,39 +5,39 @@ grpcServer:
|
||||
- 127.0.0.1:4630
|
||||
tls: false
|
||||
account:
|
||||
peerId: 12D3KooWPSPh4BL6TMzttZciuxCNxovDMd9MmVHYjmLfeDzW85JY
|
||||
peerKey: jyf2O72bAAPZ0gtfv0GM04vzftA+61XYr2+4tDnKxhXKYo+Ppdp9INRSlTZ6tlm6wotuArL4sahipmHE/ZWukQ==
|
||||
signingKey: s64C2pRvQVGrHWJhnB+otY2UsBQRe9tQjWpW2YWJX5bCgn65KvGUalciIW3bawsVXXcjVEKRUcSnsPh70xux4g==
|
||||
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
|
||||
peerId: 12D3KooWLJ13UAk8ePMsw5aX53TtdA7rP23pFXi4rtFDkdENmDsa
|
||||
peerKey: HB6LKWo4hFnSyt97eAZ459O5yw1lO5YhCzHEu79D0zSbqT7MyesMma2OLF9htZLNwWg46njC19SlhOHUunlz9Q==
|
||||
signingKey: B474sG8lSwkoifyuyv2JhfxNboC9Lu303z9XJZVtmqcbcff+kwDJ3WC9k5McixcQorNnITdWj3rMBJLQqS+t4Q==
|
||||
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:
|
||||
listenAddrs:
|
||||
- 127.0.0.1:8090
|
||||
tls: false
|
||||
nodes:
|
||||
- peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
|
||||
- peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
|
||||
address: 127.0.0.1:4430
|
||||
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
|
||||
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==
|
||||
signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
|
||||
- peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
|
||||
address: 127.0.0.1:4431
|
||||
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
|
||||
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
|
||||
signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
|
||||
- peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
|
||||
address: 127.0.0.1:4432
|
||||
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
|
||||
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==
|
||||
signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
space:
|
||||
gcTTL: 60
|
||||
syncPeriod: 11
|
||||
syncPeriod: 20
|
||||
storage:
|
||||
path: db/client/1
|
||||
metric:
|
||||
@ -46,5 +46,8 @@ log:
|
||||
production: false
|
||||
defaultLevel: ""
|
||||
namedLevels: {}
|
||||
stream:
|
||||
timeoutMilliseconds: 1000
|
||||
maxMsgSizeMb: 256
|
||||
fileStorePogreb:
|
||||
path: ""
|
||||
|
||||
@ -5,39 +5,39 @@ grpcServer:
|
||||
- 127.0.0.1:4631
|
||||
tls: false
|
||||
account:
|
||||
peerId: 12D3KooWQpz99Dc9Z2sCsXBjUzRbWtiXJ6oV3rZDccqUwTjop89Q
|
||||
peerKey: jac8YPezUIiHZ5leof47XxiwwBWpPLnAg9fIVkvkPqTfB/pd44QRIgBwilG9/PLspWjEe2PifvwU7Gjsz/nI2w==
|
||||
signingKey: s64C2pRvQVGrHWJhnB+otY2UsBQRe9tQjWpW2YWJX5bCgn65KvGUalciIW3bawsVXXcjVEKRUcSnsPh70xux4g==
|
||||
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
|
||||
peerId: 12D3KooWGbD67NNDJMaqL2BU2egSZ8Q5iC6wMBGfkBF6JFSFESUc
|
||||
peerKey: 3HG1rOuaqMCfiT181Y5FOMbJ65XFH3aw105KmYPunCdkov3FtEqc2+g0POkGGmmXZyUQDWCbTp3Ur9yEUSBRTQ==
|
||||
signingKey: B474sG8lSwkoifyuyv2JhfxNboC9Lu303z9XJZVtmqcbcff+kwDJ3WC9k5McixcQorNnITdWj3rMBJLQqS+t4Q==
|
||||
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:
|
||||
listenAddrs:
|
||||
- 127.0.0.1:8091
|
||||
tls: false
|
||||
nodes:
|
||||
- peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
|
||||
- peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
|
||||
address: 127.0.0.1:4430
|
||||
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
|
||||
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==
|
||||
signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
|
||||
- peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
|
||||
address: 127.0.0.1:4431
|
||||
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
|
||||
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
|
||||
signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
|
||||
- peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
|
||||
address: 127.0.0.1:4432
|
||||
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
|
||||
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==
|
||||
signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
space:
|
||||
gcTTL: 60
|
||||
syncPeriod: 11
|
||||
syncPeriod: 20
|
||||
storage:
|
||||
path: db/client/2
|
||||
metric:
|
||||
@ -46,5 +46,8 @@ log:
|
||||
production: false
|
||||
defaultLevel: ""
|
||||
namedLevels: {}
|
||||
stream:
|
||||
timeoutMilliseconds: 1000
|
||||
maxMsgSizeMb: 256
|
||||
fileStorePogreb:
|
||||
path: ""
|
||||
|
||||
@ -3,10 +3,10 @@ grpcServer:
|
||||
- 127.0.0.1:4530
|
||||
tls: false
|
||||
account:
|
||||
peerId: 12D3KooWJdzYSrwqKT6zWeS7UDGBwASSkagX6tfWjHP4PoKA6p7R
|
||||
peerKey: jjgPiYRm+jHkWMucfm3z0xdBhD4KFlcEVOeePBE2iA6DEOv+XZGd8+E10wzIgkzddR/H3Aj097VTp2XQvfmuKA==
|
||||
signingKey: jjgPiYRm+jHkWMucfm3z0xdBhD4KFlcEVOeePBE2iA6DEOv+XZGd8+E10wzIgkzddR/H3Aj097VTp2XQvfmuKA==
|
||||
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==
|
||||
peerId: 12D3KooWC8Qor52pAFJDUS9hKoNk5g6ZvwhBEmNnUszrj994MDRe
|
||||
peerKey: s/GpryKJlVqj93EhD5Rnm/lT91mstoN2qyS3rMeTby4iVtApTxtRNTejZG7LB/dxTnaGVNzgXxqKtC56Z3G4lQ==
|
||||
signingKey: s/GpryKJlVqj93EhD5Rnm/lT91mstoN2qyS3rMeTby4iVtApTxtRNTejZG7LB/dxTnaGVNzgXxqKtC56Z3G4lQ==
|
||||
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:
|
||||
connect: mongodb://localhost:27017/?w=majority
|
||||
database: consensus
|
||||
@ -17,3 +17,6 @@ log:
|
||||
production: false
|
||||
defaultLevel: ""
|
||||
namedLevels: {}
|
||||
stream:
|
||||
timeoutMilliseconds: 1000
|
||||
maxMsgSizeMb: 256
|
||||
|
||||
@ -3,10 +3,10 @@ grpcServer:
|
||||
- 127.0.0.1:4531
|
||||
tls: false
|
||||
account:
|
||||
peerId: 12D3KooWHrxbA48bJ23sK2T5cYWDFsoFtG4NPmcQQykXfjQhEKam
|
||||
peerKey: D7vuDE5ZNrY9k4m7BP2nbslmD/LnzqBgByjGWJw54sB3h5Otv6oy7IB323eBi08Mm/2/zNPdBg9vAF3RBEA9lg==
|
||||
signingKey: D7vuDE5ZNrY9k4m7BP2nbslmD/LnzqBgByjGWJw54sB3h5Otv6oy7IB323eBi08Mm/2/zNPdBg9vAF3RBEA9lg==
|
||||
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
|
||||
peerId: 12D3KooWPdz2uVWaXGWj4JMEvThsc2oYYTwGSjv6wwb9CWjaXxFo
|
||||
peerKey: oTN6YSZGXx6afomh6gNx5js4z5TPkxvbSkFG1LW/GPXNWsfUfdvOOIQQ/rIoI3WVjmnr2gusRLD8e3wCb/Se1g==
|
||||
signingKey: oTN6YSZGXx6afomh6gNx5js4z5TPkxvbSkFG1LW/GPXNWsfUfdvOOIQQ/rIoI3WVjmnr2gusRLD8e3wCb/Se1g==
|
||||
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:
|
||||
connect: mongodb://localhost:27017/?w=majority
|
||||
database: consensus
|
||||
@ -17,3 +17,6 @@ log:
|
||||
production: false
|
||||
defaultLevel: ""
|
||||
namedLevels: {}
|
||||
stream:
|
||||
timeoutMilliseconds: 1000
|
||||
maxMsgSizeMb: 256
|
||||
|
||||
@ -3,10 +3,10 @@ grpcServer:
|
||||
- 127.0.0.1:4532
|
||||
tls: false
|
||||
account:
|
||||
peerId: 12D3KooWN2qtMAhoDpXL49iYQE5BTxbDwfAeZbwEAo6UBUXXdG3x
|
||||
peerKey: N4dfL4wZUsxUqut/2I0h69+/5F3c4YRi7PIx4Whx+r21fo2KKMH7nnncZULK1959KeJu1jzuQcP9HdWvKhmCxw==
|
||||
signingKey: N4dfL4wZUsxUqut/2I0h69+/5F3c4YRi7PIx4Whx+r21fo2KKMH7nnncZULK1959KeJu1jzuQcP9HdWvKhmCxw==
|
||||
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==
|
||||
peerId: 12D3KooWHcDN6uhcUukaXFwiRHs4eDac1HqwdkZ4ekFbgCUchHko
|
||||
peerKey: 9sKI3m0XUglIC8ATsRa7/2BMCxTPxRjZLqwOncWeOAFzwJIfwmia7HLIfkspSqLoWS6GRSdWtUJZ89FJmFMzvA==
|
||||
signingKey: 9sKI3m0XUglIC8ATsRa7/2BMCxTPxRjZLqwOncWeOAFzwJIfwmia7HLIfkspSqLoWS6GRSdWtUJZ89FJmFMzvA==
|
||||
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:
|
||||
connect: mongodb://localhost:27017/?w=majority
|
||||
database: consensus
|
||||
@ -17,3 +17,6 @@ log:
|
||||
production: false
|
||||
defaultLevel: ""
|
||||
namedLevels: {}
|
||||
stream:
|
||||
timeoutMilliseconds: 1000
|
||||
maxMsgSizeMb: 256
|
||||
|
||||
@ -5,39 +5,39 @@ grpcServer:
|
||||
- 127.0.0.1:4430
|
||||
tls: false
|
||||
account:
|
||||
peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
|
||||
peerKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
|
||||
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
|
||||
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==
|
||||
peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
|
||||
peerKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
|
||||
signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
|
||||
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:
|
||||
listenAddrs:
|
||||
- 127.0.0.1:8080
|
||||
tls: false
|
||||
nodes:
|
||||
- peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
|
||||
- peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
|
||||
address: 127.0.0.1:4430
|
||||
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
|
||||
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==
|
||||
signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
|
||||
- peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
|
||||
address: 127.0.0.1:4431
|
||||
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
|
||||
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
|
||||
signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
|
||||
- peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
|
||||
address: 127.0.0.1:4432
|
||||
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
|
||||
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==
|
||||
signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
space:
|
||||
gcTTL: 60
|
||||
syncPeriod: 11
|
||||
syncPeriod: 600
|
||||
storage:
|
||||
path: db/node/1/data
|
||||
metric:
|
||||
@ -46,5 +46,8 @@ log:
|
||||
production: false
|
||||
defaultLevel: ""
|
||||
namedLevels: {}
|
||||
stream:
|
||||
timeoutMilliseconds: 1000
|
||||
maxMsgSizeMb: 256
|
||||
fileStorePogreb:
|
||||
path: db/node/1/files
|
||||
|
||||
@ -5,39 +5,39 @@ grpcServer:
|
||||
- 127.0.0.1:4431
|
||||
tls: false
|
||||
account:
|
||||
peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
|
||||
peerKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
|
||||
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
|
||||
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
|
||||
peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
|
||||
peerKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
|
||||
signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
|
||||
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:
|
||||
listenAddrs:
|
||||
- 127.0.0.1:8081
|
||||
tls: false
|
||||
nodes:
|
||||
- peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
|
||||
- peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
|
||||
address: 127.0.0.1:4430
|
||||
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
|
||||
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==
|
||||
signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
|
||||
- peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
|
||||
address: 127.0.0.1:4431
|
||||
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
|
||||
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
|
||||
signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
|
||||
- peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
|
||||
address: 127.0.0.1:4432
|
||||
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
|
||||
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==
|
||||
signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
space:
|
||||
gcTTL: 60
|
||||
syncPeriod: 11
|
||||
syncPeriod: 600
|
||||
storage:
|
||||
path: db/node/2/data
|
||||
metric:
|
||||
@ -46,5 +46,8 @@ log:
|
||||
production: false
|
||||
defaultLevel: ""
|
||||
namedLevels: {}
|
||||
stream:
|
||||
timeoutMilliseconds: 1000
|
||||
maxMsgSizeMb: 256
|
||||
fileStorePogreb:
|
||||
path: db/node/2/files
|
||||
|
||||
@ -5,39 +5,39 @@ grpcServer:
|
||||
- 127.0.0.1:4432
|
||||
tls: false
|
||||
account:
|
||||
peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
|
||||
peerKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
|
||||
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
|
||||
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==
|
||||
peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
|
||||
peerKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
|
||||
signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
|
||||
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:
|
||||
listenAddrs:
|
||||
- 127.0.0.1:8082
|
||||
tls: false
|
||||
nodes:
|
||||
- peerId: 12D3KooWS7Z835JwmJ5pGHJxpEsJ3vab5M4RjJsWHXmDD5895DT9
|
||||
- peerId: 12D3KooWBTfdEATQUvyMk4hgoiAxE2SckbiPbRnND8CddDDJ8gAC
|
||||
address: 127.0.0.1:4430
|
||||
signingKey: w+63sD3k2rBwrtKTcV02B8SdKYrI7rzLpXHtNYwZU7ryIj/g7tmvJFXN6TZjTWX4al5UAkRefJQfDXfXFCCPHA==
|
||||
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==
|
||||
signingKey: inV31bWtDU/5BowzErI4MBpryfw3C0TRaz9dVUszBJ0YaepE0+vHOh8hkv4v7I7A+wNKlSV/XhZyTPhnvkJOOQ==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
- peerId: 12D3KooWKkWv85fkYiCnvKVsVoCu9VwFupNejVBA2bFGBjic6gHP
|
||||
- peerId: 12D3KooWGrcMcmyJ9F8ddLPSSebC341ELHK36K7jpX8M1owXmtzp
|
||||
address: 127.0.0.1:4431
|
||||
signingKey: 460RGvA77dWz7qFYmPqpMzc6Nw5eAXOXZP0fQvcyXj2TmG/z0E5jnTMfpFD7GHIwuFA9+XvqnjuKFteeHaDxSg==
|
||||
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
|
||||
signingKey: XdyM1/KA486pTp4ZFQhSohEba8zX9KClEh+sbtodUaholQMNfYrSmJ/YSfeva5rlVMEhdwWZR50+RMFvicj7RQ==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
- peerId: 12D3KooWCYAzw5jFx3VNkJ8jn6VFq4WcayT6sZzdBx5fJFeCjXbV
|
||||
- peerId: 12D3KooWL43Q7a9XJZ9ZsoYQ6RmB55VcLRTKTMHy3FAMRDJ93Zky
|
||||
address: 127.0.0.1:4432
|
||||
signingKey: 94Y4rDt00bq4xkrPJ7E9OPULzOBd5mzn0uMTKP5b4JUobSOKGyrnwWxO9UpY7OSzA2Y/5dgIMSFSCvv4p1iwaA==
|
||||
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==
|
||||
signingKey: iE35Xao/q5NVtwHoUz9sSxCdQJ6pe7KyDCh18sBq5eqYFcch+96tKRCqWpDtltPevKGB5iiHKG4xPAV6MB0H5g==
|
||||
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:
|
||||
- tree
|
||||
- file
|
||||
space:
|
||||
gcTTL: 60
|
||||
syncPeriod: 11
|
||||
syncPeriod: 600
|
||||
storage:
|
||||
path: db/node/3/data
|
||||
metric:
|
||||
@ -46,5 +46,8 @@ log:
|
||||
production: false
|
||||
defaultLevel: ""
|
||||
namedLevels: {}
|
||||
stream:
|
||||
timeoutMilliseconds: 1000
|
||||
maxMsgSizeMb: 256
|
||||
fileStorePogreb:
|
||||
path: db/node/3/files
|
||||
|
||||
18
go.work.sum
18
go.work.sum
@ -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/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.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
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/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=
|
||||
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/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/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
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/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-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-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/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg=
|
||||
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-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-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-20220722155257-8c9f86f7a55f/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.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI=
|
||||
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/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
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.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/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/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
|
||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8=
|
||||
|
||||
@ -51,13 +51,16 @@ func (s *service) Name() (name string) {
|
||||
}
|
||||
|
||||
func (s *service) Run(ctx context.Context) (err error) {
|
||||
err = s.BaseDrpcServer.Run(
|
||||
ctx,
|
||||
s.cfg.APIServer.ListenAddrs,
|
||||
func(handler drpc.Handler) drpc.Handler {
|
||||
params := server.Params{
|
||||
BufferSizeMb: s.cfg.Stream.MaxMsgSizeMb,
|
||||
TimeoutMillis: s.cfg.Stream.TimeoutMilliseconds,
|
||||
ListenAddrs: s.cfg.APIServer.ListenAddrs,
|
||||
Wrapper: func(handler drpc.Handler) drpc.Handler {
|
||||
return handler
|
||||
},
|
||||
s.transport.BasicListener)
|
||||
Converter: s.transport.BasicListener,
|
||||
}
|
||||
err = s.BaseDrpcServer.Run(ctx, params)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
27
node/go.mod
27
node/go.mod
@ -9,11 +9,14 @@ replace github.com/anytypeio/go-anytype-infrastructure-experiments/consensus =>
|
||||
require (
|
||||
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/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/ipfs/go-block-format v0.0.3
|
||||
github.com/ipfs/go-cid v0.3.2
|
||||
github.com/stretchr/testify v1.8.0
|
||||
go.uber.org/zap v1.23.0
|
||||
github.com/stretchr/testify v1.8.1
|
||||
go.uber.org/zap v1.24.0
|
||||
storj.io/drpc v0.0.32
|
||||
)
|
||||
|
||||
require (
|
||||
@ -21,17 +24,17 @@ require (
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/cespare/xxhash v1.1.0 // 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/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
|
||||
github.com/fogleman/gg v1.3.0 // 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/protobuf v1.5.2 // 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/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-libp2p v0.23.2 // 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/mr-tron/base58 v1.2.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-multibase v0.1.1 // indirect
|
||||
github.com/multiformats/go-multicodec v0.6.0 // 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/pmezard/go-difflib v1.0.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/errs v1.3.0 // indirect
|
||||
go.uber.org/atomic v1.10.0 // indirect
|
||||
go.uber.org/multierr v1.8.0 // indirect
|
||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
|
||||
go.uber.org/multierr v1.9.0 // 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/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect
|
||||
golang.org/x/sys v0.3.0 // indirect
|
||||
google.golang.org/protobuf v1.28.1 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
lukechampine.com/blake3 v1.1.7 // indirect
|
||||
storj.io/drpc v0.0.32 // indirect
|
||||
)
|
||||
|
||||
51
node/go.sum
51
node/go.sum
@ -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.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
||||
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/v2 v2.0.1/go.mod h1:XGeZw20Iqgjky26KL0mvCwk3+4NyZCUbshSo6ALne+c=
|
||||
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/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
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/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w=
|
||||
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/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/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
|
||||
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.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.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0=
|
||||
github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
|
||||
github.com/klauspost/cpuid/v2 v2.2.2 h1:xPMwiykqNK9VK0NYC3+jTMYv9I6Vl3YdjZgPZKG3zO0=
|
||||
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.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=
|
||||
@ -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/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/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/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
|
||||
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 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.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/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/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.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/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/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8=
|
||||
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-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/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/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE=
|
||||
github.com/multiformats/go-varint v0.0.5/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-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
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.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.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
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.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.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.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.27/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.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
|
||||
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.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
|
||||
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
|
||||
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.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=
|
||||
go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY=
|
||||
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
|
||||
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-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-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-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-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
|
||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
|
||||
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-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
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-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-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-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
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-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-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU=
|
||||
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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
|
||||
@ -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")
|
||||
@ -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
|
||||
@ -24,6 +24,8 @@ type Service interface {
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
@ -126,6 +128,22 @@ func (s *service) LoadSpace(ctx context.Context, ip string, request *apiproto.Lo
|
||||
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) {
|
||||
cl, err := s.client.GetClient(ctx, ip)
|
||||
if err != nil {
|
||||
|
||||
@ -291,6 +291,62 @@ func (s *service) registerClientCommands() {
|
||||
}
|
||||
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{
|
||||
Use: "put-file",
|
||||
Short: "put new file by path",
|
||||
|
||||
@ -48,7 +48,7 @@ func (s *service) registerScripts() {
|
||||
SpaceId: space,
|
||||
DocumentId: document,
|
||||
Text: args[0],
|
||||
IsSnapshot: rand.Int()%2 == 0,
|
||||
IsSnapshot: rand.Int()%10 == 0,
|
||||
})
|
||||
if err != nil {
|
||||
mError.Add(err)
|
||||
@ -58,7 +58,7 @@ func (s *service) registerScripts() {
|
||||
}
|
||||
for _, p := range addresses {
|
||||
wg.Add(1)
|
||||
createMany(p)
|
||||
go createMany(p)
|
||||
}
|
||||
wg.Wait()
|
||||
if mError.Err() != nil {
|
||||
|
||||
@ -50,7 +50,7 @@ func (s *service) Init(a *app.App) (err error) {
|
||||
|
||||
func (s *service) Run(ctx context.Context) (err error) {
|
||||
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 {
|
||||
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()))
|
||||
}
|
||||
}}
|
||||
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.PersistentFlags().StringP("client", "c", "", "the alias of the client")
|
||||
|
||||
327
util/cmd/deploy/deploy.go
Normal file
327
util/cmd/deploy/deploy.go
Normal 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
|
||||
}
|
||||
@ -199,7 +199,11 @@ func genNodeConfig(addresses []string, apiAddresses []string, num int) (config.C
|
||||
},
|
||||
Space: config.Space{
|
||||
GCTTL: 60,
|
||||
SyncPeriod: 11,
|
||||
SyncPeriod: 600,
|
||||
},
|
||||
Stream: config.Stream{
|
||||
TimeoutMilliseconds: 1000,
|
||||
MaxMsgSizeMb: 256,
|
||||
},
|
||||
FileStorePogreb: config.FileStorePogreb{
|
||||
Path: fmt.Sprintf("db/node/%d/files", num),
|
||||
@ -252,7 +256,11 @@ func genClientConfig(addresses []string, apiAddresses []string, encKey encryptio
|
||||
},
|
||||
Space: config.Space{
|
||||
GCTTL: 60,
|
||||
SyncPeriod: 11,
|
||||
SyncPeriod: 20,
|
||||
},
|
||||
Stream: config.Stream{
|
||||
TimeoutMilliseconds: 1000,
|
||||
MaxMsgSizeMb: 256,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
@ -299,5 +307,9 @@ func genConsensusConfig(addresses []string) (cconfig.Config, error) {
|
||||
Database: "consensus",
|
||||
LogCollection: "log",
|
||||
},
|
||||
Stream: config.Stream{
|
||||
TimeoutMilliseconds: 1000,
|
||||
MaxMsgSizeMb: 256,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
16
util/go.mod
16
util/go.mod
@ -8,13 +8,20 @@ replace github.com/anytypeio/go-anytype-infrastructure-experiments/consensus =>
|
||||
|
||||
require (
|
||||
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/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/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
|
||||
storj.io/drpc v0.0.32
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/cespare/xxhash v1.1.0 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.1.2 // 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/snappy v0.0.3 // 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/klauspost/compress v1.15.10 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.1.1 // 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-core v0.20.1 // indirect
|
||||
github.com/libp2p/go-openssl v0.1.0 // 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/mr-tron/base58 v1.2.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-varint v0.0.6 // 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/spaolacci/murmur3 v1.1.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
go.opencensus.io v0.23.0 // indirect
|
||||
go.uber.org/atomic v1.10.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/net v0.0.0-20220920183852-bf014ff85ad5 // indirect
|
||||
golang.org/x/sys v0.0.0-20221010170243-090e33056c14 // indirect
|
||||
|
||||
378
util/go.sum
378
util/go.sum
@ -1,23 +1,73 @@
|
||||
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/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/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/akrylysov/pogreb v0.10.1 h1:FqlR8VR7uCbJdfUob916tPM+idpKgeESDXOA1K0DK4w=
|
||||
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/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/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||
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.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
||||
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/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/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/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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
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/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/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/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/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-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/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
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.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.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.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.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.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.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/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
|
||||
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/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
|
||||
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.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.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.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.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.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/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/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.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/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/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
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.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0=
|
||||
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/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
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-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-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/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc=
|
||||
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/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/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
|
||||
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/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/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
||||
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-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/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/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/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
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/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.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/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/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc=
|
||||
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/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 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/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/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.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
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/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/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.32/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.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
|
||||
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/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY=
|
||||
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-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-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/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-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-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-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.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-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-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-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-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-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-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/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-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-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-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-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-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-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-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-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-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-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-20221010170243-090e33056c14 h1:k5II8e6QD8mITdi+okbbmR/cIyEbeXLBhy5Ha4nevyc=
|
||||
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.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.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-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-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-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-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-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/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-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=
|
||||
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.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-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-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-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-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.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.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.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/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=
|
||||
@ -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.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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||
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/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
||||
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 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/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.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-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/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-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.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/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=
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user