diff --git a/client/api/apiproto/api.pb.go b/client/api/apiproto/api.pb.go index 7c11b5fa..ba745fd5 100644 --- a/client/api/apiproto/api.pb.go +++ b/client/api/apiproto/api.pb.go @@ -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 diff --git a/client/api/apiproto/api_drpc.pb.go b/client/api/apiproto/api_drpc.pb.go index e3cc1c63..122fae05 100644 --- a/client/api/apiproto/api_drpc.pb.go +++ b/client/api/apiproto/api_drpc.pb.go @@ -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 diff --git a/client/api/apiproto/protos/api.proto b/client/api/apiproto/protos/api.proto index 6b7e98dd..9d8755c1 100644 --- a/client/api/apiproto/protos/api.proto +++ b/client/api/apiproto/protos/api.proto @@ -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; diff --git a/client/api/rpchandler.go b/client/api/rpchandler.go index 8fabfdfb..543472f7 100644 --- a/client/api/rpchandler.go +++ b/client/api/rpchandler.go @@ -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 { diff --git a/client/api/service.go b/client/api/service.go index bf12dde2..a381fc50 100644 --- a/client/api/service.go +++ b/client/api/service.go @@ -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) { diff --git a/client/clientspace/service.go b/client/clientspace/service.go index fc43d7b8..ebd2efd0 100644 --- a/client/clientspace/service.go +++ b/client/clientspace/service.go @@ -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 } diff --git a/client/clientspace/statusreceiver.go b/client/clientspace/statusreceiver.go new file mode 100644 index 00000000..5a22130e --- /dev/null +++ b/client/clientspace/statusreceiver.go @@ -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") +} diff --git a/client/go.mod b/client/go.mod index 8aeae7af..44453872 100644 --- a/client/go.mod +++ b/client/go.mod @@ -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 ) diff --git a/client/go.sum b/client/go.sum index b91db95f..cf6293a0 100644 --- a/client/go.sum +++ b/client/go.sum @@ -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= diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index 31a678a9..5e277fdb 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -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, diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index 49947c0a..9dc3beda 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -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) diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index 88238b9a..c7711528 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -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) diff --git a/common/commonspace/rpchandler.go b/common/commonspace/rpchandler.go index dbc5b7aa..c8b1dbd4 100644 --- a/common/commonspace/rpchandler.go +++ b/common/commonspace/rpchandler.go @@ -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) } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index ba3dabd2..b9e11357 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -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, diff --git a/common/commonspace/space.go b/common/commonspace/space.go index e23796a7..512eb054 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -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() } diff --git a/common/commonspace/statusservice/noop.go b/common/commonspace/statusservice/noop.go new file mode 100644 index 00000000..80455d9f --- /dev/null +++ b/common/commonspace/statusservice/noop.go @@ -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 +} diff --git a/common/commonspace/statusservice/statusservice.go b/common/commonspace/statusservice/statusservice.go new file mode 100644 index 00000000..a43bec29 --- /dev/null +++ b/common/commonspace/statusservice/statusservice.go @@ -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) +} diff --git a/common/commonspace/syncservice/actionqueue.go b/common/commonspace/syncservice/actionqueue.go new file mode 100644 index 00000000..17a5400a --- /dev/null +++ b/common/commonspace/syncservice/actionqueue.go @@ -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 +} diff --git a/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go b/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go new file mode 100644 index 00000000..4617bf7f --- /dev/null +++ b/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go @@ -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) +} diff --git a/common/commonspace/syncservice/streamchecker.go b/common/commonspace/syncservice/streamchecker.go new file mode 100644 index 00000000..1ff06f7a --- /dev/null +++ b/common/commonspace/syncservice/streamchecker.go @@ -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 +} diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index a2bbe4ce..b1bc0f09 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -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 } diff --git a/common/commonspace/syncservice/streampool_test.go b/common/commonspace/syncservice/streampool_test.go index 2d2ff512..3fd7f746 100644 --- a/common/commonspace/syncservice/streampool_test.go +++ b/common/commonspace/syncservice/streampool_test.go @@ -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") + } }) } diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 06cf98a4..574d5f6f 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -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 +} diff --git a/common/commonspace/synctree/mock_synctree/mock_synctree.go b/common/commonspace/synctree/mock_synctree/mock_synctree.go index c8f84390..5916216c 100644 --- a/common/commonspace/synctree/mock_synctree/mock_synctree.go +++ b/common/commonspace/synctree/mock_synctree/mock_synctree.go @@ -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) +} diff --git a/common/commonspace/synctree/queuedclient.go b/common/commonspace/synctree/queuedclient.go new file mode 100644 index 00000000..a0fceff9 --- /dev/null +++ b/common/commonspace/synctree/queuedclient.go @@ -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) + }) +} diff --git a/common/commonspace/synctree/receivequeue.go b/common/commonspace/synctree/receivequeue.go new file mode 100644 index 00000000..d9913684 --- /dev/null +++ b/common/commonspace/synctree/receivequeue.go @@ -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 +} diff --git a/common/commonspace/synctree/syncclient.go b/common/commonspace/synctree/syncclient.go index a049f2b1..1091bf51 100644 --- a/common/commonspace/synctree/syncclient.go +++ b/common/commonspace/synctree/syncclient.go @@ -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) diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 830d8104..2dfe90d4 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -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) } diff --git a/common/commonspace/synctree/synctree_test.go b/common/commonspace/synctree/synctree_test.go index bdf2c451..e005c9e7 100644 --- a/common/commonspace/synctree/synctree_test.go +++ b/common/commonspace/synctree/synctree_test.go @@ -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) diff --git a/common/commonspace/synctree/synctreehandler.go b/common/commonspace/synctree/synctreehandler.go index 8c119e2a..c1d37298 100644 --- a/common/commonspace/synctree/synctreehandler.go +++ b/common/commonspace/synctree/synctreehandler.go @@ -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 } diff --git a/common/commonspace/synctree/synctreehandler_test.go b/common/commonspace/synctree/synctreehandler_test.go index 72cda749..c1a71982 100644 --- a/common/commonspace/synctree/synctreehandler_test.go +++ b/common/commonspace/synctree/synctreehandler_test.go @@ -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) }) } diff --git a/common/config/config.go b/common/config/config.go index 7cfb56a0..e6f97d17 100644 --- a/common/config/config.go +++ b/common/config/config.go @@ -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 } diff --git a/common/config/stream.go b/common/config/stream.go new file mode 100644 index 00000000..e120c2f9 --- /dev/null +++ b/common/config/stream.go @@ -0,0 +1,6 @@ +package config + +type Stream struct { + TimeoutMilliseconds int `yaml:"timeoutMilliseconds"` + MaxMsgSizeMb int `yaml:"maxMsgSizeMb"` +} diff --git a/common/go.mod b/common/go.mod index 45114b8e..65e4469b 100644 --- a/common/go.mod +++ b/common/go.mod @@ -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 diff --git a/common/go.sum b/common/go.sum index 9f8b5b6f..202e9e53 100644 --- a/common/go.sum +++ b/common/go.sum @@ -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= diff --git a/common/net/dialer/dialer.go b/common/net/dialer/dialer.go index ebef079b..44b23b54 100644 --- a/common/net/dialer/dialer.go +++ b/common/net/dialer/dialer.go @@ -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 } diff --git a/common/net/rpc/server/baseserver.go b/common/net/rpc/server/baseserver.go index 49347a9a..02e12fd8 100644 --- a/common/net/rpc/server/baseserver.go +++ b/common/net/rpc/server/baseserver.go @@ -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 diff --git a/common/net/rpc/server/drpcserver.go b/common/net/rpc/server/drpcserver.go index 73559cfe..aaa3f759 100644 --- a/common/net/rpc/server/drpcserver.go +++ b/common/net/rpc/server/drpcserver.go @@ -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) { diff --git a/common/net/secure/basiclistener.go b/common/net/secure/basiclistener.go index 7244edf0..927965af 100644 --- a/common/net/secure/basiclistener.go +++ b/common/net/secure/basiclistener.go @@ -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 } diff --git a/common/net/secure/service.go b/common/net/secure/service.go index ea92faf2..9e919582 100644 --- a/common/net/secure/service.go +++ b/common/net/secure/service.go @@ -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) { diff --git a/common/net/secure/tlslistener.go b/common/net/secure/tlslistener.go index db16470f..120c6f01 100644 --- a/common/net/secure/tlslistener.go +++ b/common/net/secure/tlslistener.go @@ -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) { diff --git a/common/net/timeoutconn/conn.go b/common/net/timeoutconn/conn.go new file mode 100644 index 00000000..77f53069 --- /dev/null +++ b/common/net/timeoutconn/conn.go @@ -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 + } +} diff --git a/common/nodeconf/confconnector.go b/common/nodeconf/confconnector.go index c797fb3f..a4ac839c 100644 --- a/common/nodeconf/confconnector.go +++ b/common/nodeconf/confconnector.go @@ -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 } diff --git a/common/nodeconf/mock_nodeconf/mock_nodeconf.go b/common/nodeconf/mock_nodeconf/mock_nodeconf.go index 408bbab3..fb88a7f8 100644 --- a/common/nodeconf/mock_nodeconf/mock_nodeconf.go +++ b/common/nodeconf/mock_nodeconf/mock_nodeconf.go @@ -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)) +} diff --git a/common/pkg/acl/list/aclstate.go b/common/pkg/acl/list/aclstate.go index 94754aba..90a33c5c 100644 --- a/common/pkg/acl/list/aclstate.go +++ b/common/pkg/acl/list/aclstate.go @@ -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 diff --git a/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go index 4cfca949..ca2151cb 100644 --- a/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go +++ b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go @@ -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. diff --git a/common/pkg/acl/tree/objecttree.go b/common/pkg/acl/tree/objecttree.go index bb8dfc6a..56e3b7a3 100644 --- a/common/pkg/acl/tree/objecttree.go +++ b/common/pkg/acl/tree/objecttree.go @@ -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 diff --git a/common/pkg/acl/tree/objecttree_test.go b/common/pkg/acl/tree/objecttree_test.go index 337f7903..84c39547 100644 --- a/common/pkg/acl/tree/objecttree_test.go +++ b/common/pkg/acl/tree/objecttree_test.go @@ -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 diff --git a/common/pkg/acl/tree/objecttreefactory.go b/common/pkg/acl/tree/objecttreefactory.go index ac655814..73706bca 100644 --- a/common/pkg/acl/tree/objecttreefactory.go +++ b/common/pkg/acl/tree/objecttreefactory.go @@ -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 } diff --git a/common/pkg/acl/tree/rawloader.go b/common/pkg/acl/tree/rawloader.go index 58d77427..78b5114f 100644 --- a/common/pkg/acl/tree/rawloader.go +++ b/common/pkg/acl/tree/rawloader.go @@ -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 }) diff --git a/common/pkg/acl/tree/treebuilder.go b/common/pkg/acl/tree/treebuilder.go index 1250bfdc..d9e7f531 100644 --- a/common/pkg/acl/tree/treebuilder.go +++ b/common/pkg/acl/tree/treebuilder.go @@ -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]) diff --git a/common/pkg/acl/tree/util.go b/common/pkg/acl/tree/util.go index baf7be14..0e6cc7cd 100644 --- a/common/pkg/acl/tree/util.go +++ b/common/pkg/acl/tree/util.go @@ -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 -} diff --git a/common/pkg/acl/treechangeproto/treechange.go b/common/pkg/acl/treechangeproto/treechange.go index 9e4f1854..3aba1fb0 100644 --- a/common/pkg/acl/treechangeproto/treechange.go +++ b/common/pkg/acl/treechangeproto/treechange.go @@ -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 + } +} diff --git a/common/util/periodicsync/periodicsync.go b/common/util/periodicsync/periodicsync.go index 52db0935..d3d5e3e5 100644 --- a/common/util/periodicsync/periodicsync.go +++ b/common/util/periodicsync/periodicsync.go @@ -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)) } diff --git a/common/util/periodicsync/periodicsync_test.go b/common/util/periodicsync/periodicsync_test.go index c4463e41..c7802323 100644 --- a/common/util/periodicsync/periodicsync_test.go +++ b/common/util/periodicsync/periodicsync_test.go @@ -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)) diff --git a/common/util/slice/slice.go b/common/util/slice/slice.go index cc7e9067..816a01c0 100644 --- a/common/util/slice/slice.go +++ b/common/util/slice/slice.go @@ -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 +} diff --git a/consensus/config/config.go b/consensus/config/config.go index 80267ee1..5735ae17 100644 --- a/consensus/config/config.go +++ b/consensus/config/config.go @@ -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 } diff --git a/etc/client.yml b/etc/client.yml index 9be9ee38..236f0ef5 100644 --- a/etc/client.yml +++ b/etc/client.yml @@ -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 diff --git a/etc/config.yml b/etc/config.yml index ec404dda..0cef8258 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -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 diff --git a/etc/configs/client1.yml b/etc/configs/client1.yml index a677c23d..c1c4bb9e 100755 --- a/etc/configs/client1.yml +++ b/etc/configs/client1.yml @@ -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: "" diff --git a/etc/configs/client2.yml b/etc/configs/client2.yml index 5b5caf2d..5bf0790e 100755 --- a/etc/configs/client2.yml +++ b/etc/configs/client2.yml @@ -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: "" diff --git a/etc/configs/cons1.yml b/etc/configs/cons1.yml index 8787bde5..7bf39f90 100755 --- a/etc/configs/cons1.yml +++ b/etc/configs/cons1.yml @@ -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 diff --git a/etc/configs/cons2.yml b/etc/configs/cons2.yml index fd86db6e..62adaf82 100755 --- a/etc/configs/cons2.yml +++ b/etc/configs/cons2.yml @@ -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 diff --git a/etc/configs/cons3.yml b/etc/configs/cons3.yml index 3f9f5235..0d4fbde0 100755 --- a/etc/configs/cons3.yml +++ b/etc/configs/cons3.yml @@ -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 diff --git a/etc/configs/node1.yml b/etc/configs/node1.yml index eaf2385c..3e4258ef 100755 --- a/etc/configs/node1.yml +++ b/etc/configs/node1.yml @@ -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 diff --git a/etc/configs/node2.yml b/etc/configs/node2.yml index ddecb9f6..c24c2006 100755 --- a/etc/configs/node2.yml +++ b/etc/configs/node2.yml @@ -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 diff --git a/etc/configs/node3.yml b/etc/configs/node3.yml index 7ef48e56..e5d951bd 100755 --- a/etc/configs/node3.yml +++ b/etc/configs/node3.yml @@ -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 diff --git a/go.work.sum b/go.work.sum index 8bb678cc..5a4635b0 100644 --- a/go.work.sum +++ b/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= diff --git a/node/api/service.go b/node/api/service.go index 9b39d618..710e0914 100644 --- a/node/api/service.go +++ b/node/api/service.go @@ -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 } diff --git a/node/go.mod b/node/go.mod index ca016399..21f1b750 100644 --- a/node/go.mod +++ b/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 ) diff --git a/node/go.sum b/node/go.sum index 78a23ca2..ec0e0e33 100644 --- a/node/go.sum +++ b/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= diff --git a/playground/Makefile b/playground/Makefile deleted file mode 100644 index c702c0c5..00000000 --- a/playground/Makefile +++ /dev/null @@ -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") diff --git a/playground/init.sh b/playground/init.sh deleted file mode 100755 index 677dbe38..00000000 --- a/playground/init.sh +++ /dev/null @@ -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 " - echo "usage: $0 client_log " - 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 diff --git a/util/cmd/debug/commands/client/service.go b/util/cmd/debug/commands/client/service.go index 4eb321e7..7a629810 100644 --- a/util/cmd/debug/commands/client/service.go +++ b/util/cmd/debug/commands/client/service.go @@ -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 { diff --git a/util/cmd/debug/commands/clientcmds.go b/util/cmd/debug/commands/clientcmds.go index e1315a9a..2b67a3da 100644 --- a/util/cmd/debug/commands/clientcmds.go +++ b/util/cmd/debug/commands/clientcmds.go @@ -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", diff --git a/util/cmd/debug/commands/scripts.go b/util/cmd/debug/commands/scripts.go index 6431912c..5f1c14f4 100644 --- a/util/cmd/debug/commands/scripts.go +++ b/util/cmd/debug/commands/scripts.go @@ -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 { diff --git a/util/cmd/debug/commands/service.go b/util/cmd/debug/commands/service.go index d4e8f110..c34c4d7d 100644 --- a/util/cmd/debug/commands/service.go +++ b/util/cmd/debug/commands/service.go @@ -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") diff --git a/util/cmd/deploy/deploy.go b/util/cmd/deploy/deploy.go new file mode 100644 index 00000000..7eaae835 --- /dev/null +++ b/util/cmd/deploy/deploy.go @@ -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 +} diff --git a/util/cmd/nodesgen/gen.go b/util/cmd/nodesgen/gen.go index ec6184a7..e127dea1 100644 --- a/util/cmd/nodesgen/gen.go +++ b/util/cmd/nodesgen/gen.go @@ -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 } diff --git a/util/go.mod b/util/go.mod index 917d8ea2..767324bf 100644 --- a/util/go.mod +++ b/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 diff --git a/util/go.sum b/util/go.sum index cf3d6d42..4a5673cc 100644 --- a/util/go.sum +++ b/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=