From ff5a0d6a45724e3719fe331714bede66f3c55a25 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 9 Aug 2022 21:48:14 +0200 Subject: [PATCH 001/219] Start refactoring tree package --- pkg/acl/aclchanges/aclpb/aclchanges.pb.go | 619 ++++++++++++++++-- .../aclchanges/aclpb/protos/aclchanges.proto | 11 + pkg/acl/acltree/doctree.go | 8 + pkg/acl/tree/aclstate.go | 367 +++++++++++ pkg/acl/tree/change.go | 82 +++ pkg/acl/tree/tree.go | 416 ++++++++++++ pkg/acl/tree/treebuilder.go | 365 +++++++++++ 7 files changed, 1807 insertions(+), 61 deletions(-) create mode 100644 pkg/acl/acltree/doctree.go create mode 100644 pkg/acl/tree/aclstate.go create mode 100644 pkg/acl/tree/change.go create mode 100644 pkg/acl/tree/tree.go create mode 100644 pkg/acl/tree/treebuilder.go diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go index 4a892fdf..0a4b6746 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go @@ -1023,6 +1023,106 @@ func (m *ACLChangeUserPermissionChange) GetPermissions() ACLChangeUserPermission return ACLChange_Admin } +type Change struct { + TreeHeadIds []string `protobuf:"bytes,1,rep,name=treeHeadIds,proto3" json:"treeHeadIds,omitempty"` + AclHeadIds []string `protobuf:"bytes,2,rep,name=aclHeadIds,proto3" json:"aclHeadIds,omitempty"` + SnapshotBaseId string `protobuf:"bytes,3,opt,name=snapshotBaseId,proto3" json:"snapshotBaseId,omitempty"` + ChangesData []byte `protobuf:"bytes,4,opt,name=changesData,proto3" json:"changesData,omitempty"` + CurrentReadKeyHash uint64 `protobuf:"varint,5,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` + Timestamp int64 `protobuf:"varint,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Identity string `protobuf:"bytes,7,opt,name=identity,proto3" json:"identity,omitempty"` + IsSnapshot bool `protobuf:"varint,8,opt,name=isSnapshot,proto3" json:"isSnapshot,omitempty"` +} + +func (m *Change) Reset() { *m = Change{} } +func (m *Change) String() string { return proto.CompactTextString(m) } +func (*Change) ProtoMessage() {} +func (*Change) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{2} +} +func (m *Change) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Change) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Change.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 *Change) XXX_Merge(src proto.Message) { + xxx_messageInfo_Change.Merge(m, src) +} +func (m *Change) XXX_Size() int { + return m.Size() +} +func (m *Change) XXX_DiscardUnknown() { + xxx_messageInfo_Change.DiscardUnknown(m) +} + +var xxx_messageInfo_Change proto.InternalMessageInfo + +func (m *Change) GetTreeHeadIds() []string { + if m != nil { + return m.TreeHeadIds + } + return nil +} + +func (m *Change) GetAclHeadIds() []string { + if m != nil { + return m.AclHeadIds + } + return nil +} + +func (m *Change) GetSnapshotBaseId() string { + if m != nil { + return m.SnapshotBaseId + } + return "" +} + +func (m *Change) GetChangesData() []byte { + if m != nil { + return m.ChangesData + } + return nil +} + +func (m *Change) GetCurrentReadKeyHash() uint64 { + if m != nil { + return m.CurrentReadKeyHash + } + return 0 +} + +func (m *Change) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *Change) GetIdentity() string { + if m != nil { + return m.Identity + } + return "" +} + +func (m *Change) GetIsSnapshot() bool { + if m != nil { + return m.IsSnapshot + } + return false +} + func init() { proto.RegisterEnum("acl.ACLChangeUserPermissions", ACLChangeUserPermissions_name, ACLChangeUserPermissions_value) proto.RegisterType((*RawChange)(nil), "acl.RawChange") @@ -1040,6 +1140,7 @@ func init() { proto.RegisterType((*ACLChangeUserRemove)(nil), "acl.ACLChange.UserRemove") proto.RegisterType((*ACLChangeReadKeyReplace)(nil), "acl.ACLChange.ReadKeyReplace") proto.RegisterType((*ACLChangeUserPermissionChange)(nil), "acl.ACLChange.UserPermissionChange") + proto.RegisterType((*Change)(nil), "acl.Change") } func init() { @@ -1047,67 +1148,69 @@ func init() { } var fileDescriptor_37a022c841a51877 = []byte{ - // 948 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x4f, 0x6f, 0xe3, 0x44, - 0x14, 0xf7, 0xc4, 0x4d, 0x1d, 0x3f, 0x87, 0x36, 0x0c, 0x2b, 0xd6, 0x58, 0x4b, 0x88, 0xca, 0x0a, - 0x45, 0x08, 0xa5, 0xab, 0xac, 0x90, 0x56, 0x80, 0x2a, 0xda, 0x82, 0x36, 0xa1, 0x1c, 0x56, 0x53, - 0x2d, 0x08, 0x6e, 0x53, 0x7b, 0x68, 0xad, 0x75, 0x6c, 0xe3, 0x99, 0x14, 0xe5, 0x82, 0xc4, 0x89, - 0x2b, 0x67, 0xbe, 0x0a, 0x5f, 0x60, 0x8f, 0x7b, 0xe4, 0x06, 0x6a, 0xef, 0x5c, 0xf8, 0x02, 0x68, - 0xfe, 0xd8, 0x71, 0x12, 0x6f, 0x24, 0xa4, 0x15, 0x12, 0x87, 0x4a, 0x33, 0xbf, 0xf7, 0x7b, 0xd3, - 0xf7, 0xde, 0xef, 0xbd, 0x17, 0xc3, 0x83, 0xfc, 0xd9, 0xe5, 0x21, 0x0d, 0x13, 0xf9, 0x17, 0x5e, - 0xd1, 0xf4, 0x92, 0x71, 0x79, 0xcc, 0x2f, 0x0e, 0xf3, 0x22, 0x13, 0x19, 0xaf, 0xe1, 0x23, 0x85, - 0x60, 0x9b, 0x86, 0xc9, 0xc1, 0x39, 0xb8, 0x84, 0xfe, 0x70, 0xaa, 0x0c, 0xd8, 0x07, 0x27, 0xa7, - 0x8b, 0x24, 0xa3, 0x91, 0x8f, 0x06, 0x68, 0xd8, 0x25, 0xe5, 0x15, 0xdf, 0x03, 0x97, 0xc7, 0x97, - 0x29, 0x15, 0xf3, 0x82, 0xf9, 0x2d, 0x65, 0x5b, 0x02, 0x78, 0x0f, 0x5a, 0x71, 0xe4, 0xdb, 0x03, - 0x34, 0x74, 0x49, 0x2b, 0x8e, 0x0e, 0xfe, 0x7e, 0x03, 0xdc, 0xe3, 0xd3, 0x2f, 0xcd, 0xab, 0x03, - 0xf0, 0x44, 0xc1, 0xd8, 0x84, 0xd1, 0x68, 0x1a, 0x71, 0x1f, 0x0d, 0xec, 0xa1, 0x4b, 0xea, 0x10, - 0xee, 0x03, 0xd0, 0x30, 0x29, 0x09, 0x2d, 0x45, 0xa8, 0x21, 0xf8, 0x3d, 0xd8, 0xe3, 0x29, 0xcd, - 0xf9, 0x55, 0x26, 0x4e, 0x28, 0x67, 0xd3, 0xf2, 0x7f, 0xad, 0xa1, 0xf8, 0x01, 0x38, 0x34, 0x4c, - 0x3e, 0xa3, 0x82, 0xfa, 0x3b, 0x03, 0x34, 0xf4, 0xc6, 0x6f, 0x8e, 0x68, 0x98, 0x8c, 0xaa, 0x50, - 0xe4, 0x49, 0x5a, 0x49, 0x49, 0x93, 0xb1, 0x99, 0xa2, 0x28, 0xaf, 0xb6, 0xca, 0xac, 0x0e, 0xe1, - 0x11, 0xe0, 0x70, 0x5e, 0x14, 0x2c, 0x15, 0x84, 0xd1, 0xe8, 0x8c, 0x2d, 0x26, 0x94, 0x5f, 0xf9, - 0xbb, 0x03, 0x34, 0xdc, 0x21, 0x0d, 0x16, 0x59, 0x29, 0x11, 0xcf, 0x18, 0x17, 0x74, 0x96, 0xfb, - 0xce, 0x00, 0x0d, 0x6d, 0xb2, 0x04, 0x70, 0x00, 0x9d, 0x38, 0x62, 0xa9, 0x88, 0xc5, 0xc2, 0xef, - 0xa8, 0x1c, 0xaa, 0x7b, 0xf0, 0xab, 0x0d, 0xfb, 0x32, 0xd4, 0x2c, 0x15, 0x2c, 0x15, 0x5f, 0xd1, - 0x64, 0xce, 0xf0, 0x18, 0x9c, 0x39, 0x67, 0xc5, 0x71, 0xa4, 0x15, 0xd9, 0xcc, 0xe8, 0xa9, 0xb6, - 0x4e, 0x2c, 0x52, 0x12, 0xf1, 0xc7, 0x00, 0xf2, 0x48, 0xd8, 0x2c, 0xbb, 0xd6, 0x62, 0x79, 0xe3, - 0xb7, 0x1a, 0xdc, 0x34, 0x61, 0x62, 0x91, 0x1a, 0x1d, 0x7f, 0x03, 0x77, 0xe4, 0xed, 0x09, 0x2b, - 0x66, 0x31, 0xe7, 0x71, 0x96, 0x6a, 0x07, 0x55, 0x70, 0x6f, 0xfc, 0x6e, 0xc3, 0x33, 0xeb, 0xd4, - 0x89, 0x45, 0x1a, 0x9f, 0x28, 0xe3, 0x9a, 0xa6, 0xd7, 0xb1, 0x60, 0x46, 0xa0, 0xa6, 0xb8, 0x34, - 0xa1, 0x8c, 0x4b, 0xdf, 0xf0, 0x87, 0xd0, 0x91, 0xb7, 0x2f, 0xb2, 0x38, 0x55, 0x2a, 0x79, 0xe3, - 0xbb, 0x0d, 0xae, 0xd2, 0x3c, 0xb1, 0x48, 0x45, 0xc5, 0x47, 0xe0, 0xc9, 0xf3, 0x69, 0x96, 0x7e, - 0x17, 0x17, 0x33, 0x25, 0x9b, 0x37, 0x0e, 0x1a, 0x3c, 0x0d, 0x63, 0x62, 0x91, 0xba, 0xc3, 0x89, - 0x03, 0xed, 0x6b, 0x29, 0x44, 0xf0, 0x33, 0x02, 0xc7, 0x74, 0x0f, 0xfe, 0x04, 0x3c, 0x1a, 0x26, - 0xe7, 0xa6, 0xf7, 0x8c, 0x30, 0xc1, 0x66, 0xab, 0x95, 0x0c, 0x52, 0xa7, 0xe3, 0x23, 0xd5, 0xec, - 0x46, 0x65, 0xd5, 0xec, 0xde, 0xb8, 0xbf, 0xe9, 0x5c, 0x6f, 0x03, 0x52, 0xf3, 0x08, 0x4e, 0xc0, - 0xab, 0xbd, 0x8d, 0x1f, 0x42, 0x47, 0xbe, 0x2e, 0xa8, 0x60, 0x26, 0x92, 0xbb, 0x0d, 0x91, 0x48, - 0x33, 0xa9, 0x88, 0xc1, 0x4f, 0x2d, 0xe8, 0x94, 0x30, 0xbe, 0x0f, 0xaf, 0x15, 0xcb, 0x06, 0x66, - 0x7a, 0x42, 0x77, 0xc8, 0x2a, 0x88, 0x1f, 0x69, 0xf5, 0x94, 0x0b, 0x37, 0x61, 0xfb, 0x0d, 0x85, - 0xd4, 0xff, 0xaa, 0xc6, 0xc5, 0x47, 0xe0, 0xc4, 0x4a, 0x44, 0xee, 0xdb, 0xca, 0xed, 0xfe, 0x4b, - 0x02, 0x1c, 0x69, 0xad, 0xf9, 0xe7, 0xa9, 0x28, 0x16, 0xa4, 0x74, 0x0a, 0x9e, 0x42, 0xb7, 0x6e, - 0xc0, 0x3d, 0xb0, 0x9f, 0xb1, 0x85, 0x4a, 0xd6, 0x25, 0xf2, 0x88, 0x0f, 0x8d, 0x4a, 0x5b, 0x9a, - 0x5d, 0xbf, 0x40, 0x34, 0xef, 0xa3, 0xd6, 0x23, 0x14, 0xfc, 0x81, 0xc0, 0xad, 0x02, 0x5e, 0x19, - 0x4c, 0xb4, 0x3a, 0x98, 0xb2, 0x40, 0x2c, 0x0d, 0x8b, 0x45, 0x2e, 0xe2, 0x2c, 0x3d, 0x63, 0x0b, - 0xb3, 0x00, 0x57, 0x41, 0xfc, 0x01, 0xbc, 0x6e, 0x00, 0x16, 0x99, 0x85, 0xa0, 0x13, 0xee, 0x92, - 0x4d, 0x03, 0xfe, 0x14, 0xbc, 0xbc, 0x1a, 0x10, 0xae, 0xa6, 0x61, 0x6f, 0xa3, 0x0d, 0x56, 0xc7, - 0x8b, 0x93, 0xba, 0x8b, 0x5c, 0x5d, 0x53, 0x6e, 0xfa, 0x94, 0x45, 0x6a, 0x28, 0x3a, 0xa4, 0x0e, - 0x05, 0xbf, 0x21, 0x70, 0xcc, 0x7e, 0xf8, 0xff, 0xe5, 0x17, 0x3c, 0x06, 0xaf, 0x36, 0x98, 0x5b, - 0x13, 0xb8, 0x07, 0xae, 0x59, 0x7e, 0xd3, 0x48, 0x05, 0xef, 0x92, 0x25, 0x10, 0xfc, 0x85, 0x00, - 0x96, 0x2d, 0x80, 0x87, 0xb0, 0x4f, 0xc3, 0x90, 0xe5, 0xe2, 0xc9, 0xfc, 0x22, 0x89, 0xc3, 0x33, - 0xd3, 0x4a, 0x5d, 0xb2, 0x0e, 0xe3, 0xf7, 0xa1, 0x67, 0x12, 0x5b, 0x52, 0x75, 0x69, 0x36, 0xf0, - 0xff, 0x5c, 0xfd, 0x00, 0x3a, 0x3a, 0x9f, 0xa9, 0x96, 0xde, 0x25, 0xd5, 0x3d, 0x78, 0x8e, 0xa0, - 0x53, 0x6e, 0xc3, 0x57, 0x20, 0x7c, 0x55, 0xb0, 0xf3, 0xea, 0x0b, 0xc0, 0xae, 0x17, 0xac, 0x82, - 0xf1, 0x01, 0x74, 0x97, 0x2b, 0x7b, 0x1a, 0xa9, 0xbc, 0x5c, 0xb2, 0x82, 0x35, 0x17, 0xaa, 0xfd, - 0x92, 0x42, 0x05, 0xdf, 0x6b, 0xe9, 0xcc, 0x8f, 0xd3, 0xb6, 0x5c, 0x1e, 0xc3, 0xbe, 0x59, 0x58, - 0x84, 0xe5, 0x09, 0x0d, 0xab, 0x6d, 0xf3, 0xf6, 0x5a, 0x59, 0xc9, 0x0a, 0x8b, 0xac, 0x7b, 0x05, - 0x3f, 0xc2, 0xde, 0x2a, 0xe5, 0x15, 0x94, 0x70, 0xd9, 0x49, 0x55, 0x6e, 0xa6, 0x86, 0x1b, 0x78, - 0x20, 0xe0, 0x4e, 0xd3, 0xcf, 0xea, 0xd6, 0x28, 0xd6, 0xfa, 0xa9, 0xf5, 0xaf, 0xfb, 0xe9, 0xe0, - 0x18, 0xf6, 0xd7, 0xec, 0xd8, 0x85, 0xf6, 0x71, 0x34, 0x8b, 0xd3, 0x9e, 0x85, 0x01, 0x76, 0xbf, - 0x2e, 0x62, 0xc1, 0x8a, 0x1e, 0x92, 0x67, 0x19, 0x2a, 0x2b, 0x7a, 0x2d, 0xec, 0x81, 0xa3, 0xa5, - 0x89, 0x7a, 0xf6, 0xc9, 0x3b, 0xcf, 0x6f, 0xfa, 0xe8, 0xc5, 0x4d, 0x1f, 0xfd, 0x79, 0xd3, 0x47, - 0xbf, 0xdc, 0xf6, 0xad, 0x17, 0xb7, 0x7d, 0xeb, 0xf7, 0xdb, 0xbe, 0xf5, 0x6d, 0x5b, 0x7d, 0x88, - 0x5e, 0xec, 0xaa, 0xef, 0xce, 0x87, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x2a, 0xe8, 0x23, 0x71, - 0xab, 0x0a, 0x00, 0x00, + // 987 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x4f, 0x8f, 0xdb, 0x44, + 0x14, 0xcf, 0x24, 0x9b, 0x75, 0xfc, 0x1c, 0x76, 0xc3, 0x50, 0x51, 0x63, 0x95, 0x10, 0x85, 0x0a, + 0x45, 0x08, 0x65, 0xab, 0x54, 0x48, 0x15, 0xa0, 0x15, 0xbb, 0x0b, 0x6a, 0xc2, 0x72, 0xa8, 0x66, + 0x55, 0x10, 0xdc, 0x66, 0xed, 0x61, 0xd7, 0xaa, 0x63, 0x1b, 0xcf, 0x64, 0x51, 0x2e, 0x48, 0x9c, + 0xb8, 0x72, 0xe6, 0xc0, 0x17, 0xe1, 0x0b, 0xf4, 0xd8, 0x23, 0x37, 0xd0, 0xee, 0x9d, 0x0b, 0x5f, + 0x00, 0xcd, 0x1f, 0x3b, 0x8e, 0xe3, 0x46, 0x45, 0xaa, 0x2a, 0x71, 0x88, 0x34, 0xf3, 0x7b, 0xbf, + 0x37, 0x79, 0xef, 0xfd, 0xde, 0x3c, 0x0f, 0xdc, 0x4b, 0x9f, 0x5c, 0x1c, 0x50, 0x3f, 0x92, 0x3f, + 0xff, 0x92, 0xc6, 0x17, 0x8c, 0xcb, 0x65, 0x7a, 0x7e, 0x90, 0x66, 0x89, 0x48, 0x78, 0x09, 0x1f, + 0x2b, 0x04, 0xb7, 0xa8, 0x1f, 0x0d, 0xcf, 0xc0, 0x26, 0xf4, 0x87, 0x13, 0x65, 0xc0, 0x2e, 0x58, + 0x29, 0x5d, 0x46, 0x09, 0x0d, 0x5c, 0x34, 0x40, 0xa3, 0x2e, 0xc9, 0xb7, 0xf8, 0x0e, 0xd8, 0x3c, + 0xbc, 0x88, 0xa9, 0x58, 0x64, 0xcc, 0x6d, 0x2a, 0xdb, 0x0a, 0xc0, 0x7b, 0xd0, 0x0c, 0x03, 0xb7, + 0x35, 0x40, 0x23, 0x9b, 0x34, 0xc3, 0x60, 0xf8, 0xcf, 0x1b, 0x60, 0x1f, 0x9d, 0x7c, 0x69, 0x4e, + 0x1d, 0x80, 0x23, 0x32, 0xc6, 0xa6, 0x8c, 0x06, 0xb3, 0x80, 0xbb, 0x68, 0xd0, 0x1a, 0xd9, 0xa4, + 0x0c, 0xe1, 0x3e, 0x00, 0xf5, 0xa3, 0x9c, 0xd0, 0x54, 0x84, 0x12, 0x82, 0xdf, 0x83, 0x3d, 0x1e, + 0xd3, 0x94, 0x5f, 0x26, 0xe2, 0x98, 0x72, 0x36, 0xcb, 0xff, 0xab, 0x82, 0xe2, 0x7b, 0x60, 0x51, + 0x3f, 0xfa, 0x8c, 0x0a, 0xea, 0xee, 0x0c, 0xd0, 0xc8, 0x99, 0xbc, 0x39, 0xa6, 0x7e, 0x34, 0x2e, + 0x42, 0x91, 0x2b, 0x69, 0x25, 0x39, 0x4d, 0xc6, 0x66, 0x8a, 0xa2, 0xbc, 0xda, 0x2a, 0xb3, 0x32, + 0x84, 0xc7, 0x80, 0xfd, 0x45, 0x96, 0xb1, 0x58, 0x10, 0x46, 0x83, 0x53, 0xb6, 0x9c, 0x52, 0x7e, + 0xe9, 0xee, 0x0e, 0xd0, 0x68, 0x87, 0xd4, 0x58, 0x64, 0xa5, 0x44, 0x38, 0x67, 0x5c, 0xd0, 0x79, + 0xea, 0x5a, 0x03, 0x34, 0x6a, 0x91, 0x15, 0x80, 0x3d, 0xe8, 0x84, 0x01, 0x8b, 0x45, 0x28, 0x96, + 0x6e, 0x47, 0xe5, 0x50, 0xec, 0xbd, 0x5f, 0x5b, 0xb0, 0x2f, 0x43, 0x4d, 0x62, 0xc1, 0x62, 0xf1, + 0x15, 0x8d, 0x16, 0x0c, 0x4f, 0xc0, 0x5a, 0x70, 0x96, 0x1d, 0x05, 0x5a, 0x91, 0xcd, 0x8c, 0x1e, + 0x6b, 0xeb, 0xb4, 0x41, 0x72, 0x22, 0xfe, 0x18, 0x40, 0x2e, 0x09, 0x9b, 0x27, 0x57, 0x5a, 0x2c, + 0x67, 0xf2, 0x56, 0x8d, 0x9b, 0x26, 0x4c, 0x1b, 0xa4, 0x44, 0xc7, 0xdf, 0xc0, 0x2d, 0xb9, 0x7b, + 0xc4, 0xb2, 0x79, 0xc8, 0x79, 0x98, 0xc4, 0xda, 0x41, 0x15, 0xdc, 0x99, 0xbc, 0x5b, 0x73, 0x4c, + 0x95, 0x3a, 0x6d, 0x90, 0xda, 0x23, 0xf2, 0xb8, 0x66, 0xf1, 0x55, 0x28, 0x98, 0x11, 0xa8, 0x2e, + 0x2e, 0x4d, 0xc8, 0xe3, 0xd2, 0x3b, 0xfc, 0x21, 0x74, 0xe4, 0xee, 0x8b, 0x24, 0x8c, 0x95, 0x4a, + 0xce, 0xe4, 0x76, 0x8d, 0xab, 0x34, 0x4f, 0x1b, 0xa4, 0xa0, 0xe2, 0x43, 0x70, 0xe4, 0xfa, 0x24, + 0x89, 0xbf, 0x0b, 0xb3, 0xb9, 0x92, 0xcd, 0x99, 0x78, 0x35, 0x9e, 0x86, 0x31, 0x6d, 0x90, 0xb2, + 0xc3, 0xb1, 0x05, 0xed, 0x2b, 0x29, 0x84, 0xf7, 0x33, 0x02, 0xcb, 0x74, 0x0f, 0xfe, 0x04, 0x1c, + 0xea, 0x47, 0x67, 0xa6, 0xf7, 0x8c, 0x30, 0xde, 0x66, 0xab, 0xe5, 0x0c, 0x52, 0xa6, 0xe3, 0x43, + 0xd5, 0xec, 0x46, 0x65, 0xd5, 0xec, 0xce, 0xa4, 0xbf, 0xe9, 0x5c, 0x6e, 0x03, 0x52, 0xf2, 0xf0, + 0x8e, 0xc1, 0x29, 0x9d, 0x8d, 0xef, 0x43, 0x47, 0x9e, 0x2e, 0xa8, 0x60, 0x26, 0x92, 0xdb, 0x35, + 0x91, 0x48, 0x33, 0x29, 0x88, 0xde, 0x4f, 0x4d, 0xe8, 0xe4, 0x30, 0xbe, 0x0b, 0xaf, 0x65, 0xab, + 0x06, 0x66, 0xfa, 0x86, 0xee, 0x90, 0x75, 0x10, 0x3f, 0xd0, 0xea, 0x29, 0x17, 0x6e, 0xc2, 0x76, + 0x6b, 0x0a, 0xa9, 0xff, 0xaa, 0xc4, 0xc5, 0x87, 0x60, 0x85, 0x4a, 0x44, 0xee, 0xb6, 0x94, 0xdb, + 0xdd, 0xe7, 0x04, 0x38, 0xd6, 0x5a, 0xf3, 0xcf, 0x63, 0x91, 0x2d, 0x49, 0xee, 0xe4, 0x3d, 0x86, + 0x6e, 0xd9, 0x80, 0x7b, 0xd0, 0x7a, 0xc2, 0x96, 0x2a, 0x59, 0x9b, 0xc8, 0x25, 0x3e, 0x30, 0x2a, + 0x6d, 0x69, 0x76, 0x7d, 0x02, 0xd1, 0xbc, 0x8f, 0x9a, 0x0f, 0x90, 0xf7, 0x27, 0x02, 0xbb, 0x08, + 0x78, 0xed, 0x62, 0xa2, 0xf5, 0x8b, 0x29, 0x0b, 0xc4, 0x62, 0x3f, 0x5b, 0xa6, 0x22, 0x4c, 0xe2, + 0x53, 0xb6, 0x34, 0x03, 0x70, 0x1d, 0xc4, 0x1f, 0xc0, 0xeb, 0x06, 0x60, 0x81, 0x19, 0x08, 0x3a, + 0xe1, 0x2e, 0xd9, 0x34, 0xe0, 0x4f, 0xc1, 0x49, 0x8b, 0x0b, 0xc2, 0xd5, 0x6d, 0xd8, 0xdb, 0x68, + 0x83, 0xf5, 0xeb, 0xc5, 0x49, 0xd9, 0x45, 0x8e, 0xae, 0x19, 0x37, 0x7d, 0xca, 0x02, 0x75, 0x29, + 0x3a, 0xa4, 0x0c, 0x79, 0xbf, 0x23, 0xb0, 0xcc, 0x7c, 0xf8, 0xff, 0xe5, 0xe7, 0x3d, 0x04, 0xa7, + 0x74, 0x31, 0xb7, 0x26, 0x70, 0x07, 0x6c, 0x33, 0xfc, 0x66, 0x81, 0x0a, 0xde, 0x26, 0x2b, 0xc0, + 0xfb, 0x1b, 0x01, 0xac, 0x5a, 0x00, 0x8f, 0x60, 0x9f, 0xfa, 0x3e, 0x4b, 0xc5, 0xa3, 0xc5, 0x79, + 0x14, 0xfa, 0xa7, 0xa6, 0x95, 0xba, 0xa4, 0x0a, 0xe3, 0xf7, 0xa1, 0x67, 0x12, 0x5b, 0x51, 0x75, + 0x69, 0x36, 0xf0, 0x57, 0xae, 0xbe, 0x07, 0x1d, 0x9d, 0xcf, 0x4c, 0x4b, 0x6f, 0x93, 0x62, 0xef, + 0x3d, 0x45, 0xd0, 0xc9, 0xa7, 0xe1, 0x4b, 0x10, 0xbe, 0x28, 0xd8, 0x59, 0xf1, 0x02, 0x68, 0x95, + 0x0b, 0x56, 0xc0, 0x78, 0x08, 0xdd, 0xd5, 0xc8, 0x9e, 0x05, 0x2a, 0x2f, 0x9b, 0xac, 0x61, 0xf5, + 0x85, 0x6a, 0x3f, 0xa7, 0x50, 0xde, 0xf7, 0x5a, 0x3a, 0xf3, 0x71, 0xda, 0x96, 0xcb, 0x43, 0xd8, + 0x37, 0x03, 0x8b, 0xb0, 0x34, 0xa2, 0x7e, 0x31, 0x6d, 0xde, 0xae, 0x94, 0x95, 0xac, 0xb1, 0x48, + 0xd5, 0xcb, 0xfb, 0x11, 0xf6, 0xd6, 0x29, 0x2f, 0xa1, 0x84, 0xab, 0x4e, 0x2a, 0x72, 0x33, 0x35, + 0xdc, 0xc0, 0x3d, 0x01, 0xb7, 0xea, 0x3e, 0xab, 0x5b, 0xa3, 0xa8, 0xf4, 0x53, 0xf3, 0x3f, 0xf7, + 0xd3, 0xf0, 0x08, 0xf6, 0x2b, 0x76, 0x6c, 0x43, 0xfb, 0x28, 0x98, 0x87, 0x71, 0xaf, 0x81, 0x01, + 0x76, 0xbf, 0xce, 0x42, 0xc1, 0xb2, 0x1e, 0x92, 0x6b, 0x19, 0x2a, 0xcb, 0x7a, 0x4d, 0xec, 0x80, + 0xa5, 0xa5, 0x09, 0x7a, 0xad, 0xe1, 0x6f, 0x4d, 0xd8, 0x7d, 0xe5, 0x4f, 0xbe, 0xca, 0x03, 0x6e, + 0xe7, 0x45, 0x1f, 0x70, 0xed, 0x17, 0x7b, 0xc0, 0xed, 0x6e, 0x7b, 0xc0, 0x59, 0x15, 0x15, 0xfa, + 0x00, 0x21, 0x2f, 0x9e, 0x05, 0x1d, 0x35, 0x90, 0x4b, 0xc8, 0xf1, 0x3b, 0x4f, 0xaf, 0xfb, 0xe8, + 0xd9, 0x75, 0x1f, 0xfd, 0x75, 0xdd, 0x47, 0xbf, 0xdc, 0xf4, 0x1b, 0xcf, 0x6e, 0xfa, 0x8d, 0x3f, + 0x6e, 0xfa, 0x8d, 0x6f, 0xdb, 0xea, 0xa5, 0x7e, 0xbe, 0xab, 0x1e, 0xe6, 0xf7, 0xff, 0x0d, 0x00, + 0x00, 0xff, 0xff, 0xf9, 0xfe, 0x4f, 0x12, 0xcc, 0x0b, 0x00, 0x00, } func (m *RawChange) Marshal() (dAtA []byte, err error) { @@ -1951,6 +2054,88 @@ func (m *ACLChangeUserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } +func (m *Change) 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 *Change) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Change) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.IsSnapshot { + i-- + if m.IsSnapshot { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) + i-- + dAtA[i] = 0x3a + } + if m.Timestamp != 0 { + i = encodeVarintAclchanges(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x30 + } + if m.CurrentReadKeyHash != 0 { + i = encodeVarintAclchanges(dAtA, i, uint64(m.CurrentReadKeyHash)) + i-- + dAtA[i] = 0x28 + } + if len(m.ChangesData) > 0 { + i -= len(m.ChangesData) + copy(dAtA[i:], m.ChangesData) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.ChangesData))) + i-- + dAtA[i] = 0x22 + } + if len(m.SnapshotBaseId) > 0 { + i -= len(m.SnapshotBaseId) + copy(dAtA[i:], m.SnapshotBaseId) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.SnapshotBaseId))) + i-- + dAtA[i] = 0x1a + } + if len(m.AclHeadIds) > 0 { + for iNdEx := len(m.AclHeadIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AclHeadIds[iNdEx]) + copy(dAtA[i:], m.AclHeadIds[iNdEx]) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.AclHeadIds[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.TreeHeadIds) > 0 { + for iNdEx := len(m.TreeHeadIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TreeHeadIds[iNdEx]) + copy(dAtA[i:], m.TreeHeadIds[iNdEx]) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.TreeHeadIds[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintAclchanges(dAtA []byte, offset int, v uint64) int { offset -= sovAclchanges(v) base := offset @@ -2366,6 +2551,48 @@ func (m *ACLChangeUserPermissionChange) Size() (n int) { return n } +func (m *Change) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.TreeHeadIds) > 0 { + for _, s := range m.TreeHeadIds { + l = len(s) + n += 1 + l + sovAclchanges(uint64(l)) + } + } + if len(m.AclHeadIds) > 0 { + for _, s := range m.AclHeadIds { + l = len(s) + n += 1 + l + sovAclchanges(uint64(l)) + } + } + l = len(m.SnapshotBaseId) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.ChangesData) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + if m.CurrentReadKeyHash != 0 { + n += 1 + sovAclchanges(uint64(m.CurrentReadKeyHash)) + } + if m.Timestamp != 0 { + n += 1 + sovAclchanges(uint64(m.Timestamp)) + } + l = len(m.Identity) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + if m.IsSnapshot { + n += 2 + } + return n +} + func sovAclchanges(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -4813,6 +5040,276 @@ func (m *ACLChangeUserPermissionChange) Unmarshal(dAtA []byte) error { } return nil } +func (m *Change) 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 ErrIntOverflowAclchanges + } + 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: Change: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Change: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeHeadIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TreeHeadIds = append(m.TreeHeadIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AclHeadIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AclHeadIds = append(m.AclHeadIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotBaseId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotBaseId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChangesData", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChangesData = append(m.ChangesData[:0], dAtA[iNdEx:postIndex]...) + if m.ChangesData == nil { + m.ChangesData = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentReadKeyHash", wireType) + } + m.CurrentReadKeyHash = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentReadKeyHash |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsSnapshot", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IsSnapshot = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipAclchanges(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclchanges + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipAclchanges(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto index 1c8ceaf2..bc464cec 100644 --- a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto +++ b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto @@ -109,3 +109,14 @@ message ACLChange { Removed = 3; } } + +message Change { + repeated string treeHeadIds = 1; + repeated string aclHeadIds = 2; + string snapshotBaseId = 3; // we will only have one base snapshot for both + bytes changesData = 4; + uint64 currentReadKeyHash = 5; + int64 timestamp = 6; + string identity = 7; + bool isSnapshot = 8; +} diff --git a/pkg/acl/acltree/doctree.go b/pkg/acl/acltree/doctree.go new file mode 100644 index 00000000..50b92e27 --- /dev/null +++ b/pkg/acl/acltree/doctree.go @@ -0,0 +1,8 @@ +package acltree + +type DocTree interface { +} + +type docTree struct { + tree *Tree +} diff --git a/pkg/acl/tree/aclstate.go b/pkg/acl/tree/aclstate.go new file mode 100644 index 00000000..f2016bb2 --- /dev/null +++ b/pkg/acl/tree/aclstate.go @@ -0,0 +1,367 @@ +package tree + +import ( + "bytes" + "errors" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" + "github.com/gogo/protobuf/proto" + "hash/fnv" +) + +var ErrNoSuchUser = errors.New("no such user") +var ErrFailedToDecrypt = errors.New("failed to decrypt key") +var ErrUserRemoved = errors.New("user was removed from the document") +var ErrDocumentForbidden = errors.New("your user was forbidden access to the document") +var ErrUserAlreadyExists = errors.New("user already exists") + +type ACLState struct { + currentReadKeyHash uint64 + userReadKeys map[uint64]*symmetric.Key + userStates map[string]*aclpb.ACLChangeUserState + userInvites map[string]*aclpb.ACLChangeUserInvite + signingPubKeyDecoder signingkey.PubKeyDecoder + encryptionKey encryptionkey.PrivKey + identity string +} + +func newACLStateWithIdentity( + identity string, + encryptionKey encryptionkey.PrivKey, + signingPubKeyDecoder signingkey.PubKeyDecoder) *ACLState { + return &ACLState{ + identity: identity, + encryptionKey: encryptionKey, + userReadKeys: make(map[uint64]*symmetric.Key), + userStates: make(map[string]*aclpb.ACLChangeUserState), + userInvites: make(map[string]*aclpb.ACLChangeUserInvite), + signingPubKeyDecoder: signingPubKeyDecoder, + } +} + +func newACLState() *ACLState { + return &ACLState{ + userReadKeys: make(map[uint64]*symmetric.Key), + userStates: make(map[string]*aclpb.ACLChangeUserState), + userInvites: make(map[string]*aclpb.ACLChangeUserInvite), + } +} + +func (st *ACLState) applyChange(change *aclpb.Change) (err error) { + aclData := &aclpb.ACLChangeACLData{} + err = proto.Unmarshal(change.ChangesData, aclData) + if err != nil { + return + } + + defer func() { + if err != nil { + return + } + st.currentReadKeyHash = change.CurrentReadKeyHash + }() + + // we can't check this for the user which is joining, because it will not be in our list + // the same is for the first change to be added + skipIdentityCheck := st.isUserJoin(aclData) || (st.currentReadKeyHash == 0 && st.isUserAdd(aclData, change.Identity)) + if !skipIdentityCheck { + // we check signature when we add this to the Tree, so no need to do it here + if _, exists := st.userStates[change.Identity]; !exists { + err = ErrNoSuchUser + return + } + + if !st.hasPermission(change.Identity, aclpb.ACLChange_Admin) { + err = fmt.Errorf("user %s must have admin permissions", change.Identity) + return + } + } + + for _, ch := range aclData.GetAclContent() { + if err = st.applyChangeContent(ch); err != nil { + log.Infof("error while applying changes: %v; ignore", err) + return err + } + } + + return nil +} + +func (st *ACLState) applyChangeContent(ch *aclpb.ACLChangeACLContentValue) error { + switch { + case ch.GetUserPermissionChange() != nil: + return st.applyUserPermissionChange(ch.GetUserPermissionChange()) + case ch.GetUserAdd() != nil: + return st.applyUserAdd(ch.GetUserAdd()) + case ch.GetUserRemove() != nil: + return st.applyUserRemove(ch.GetUserRemove()) + case ch.GetUserInvite() != nil: + return st.applyUserInvite(ch.GetUserInvite()) + case ch.GetUserJoin() != nil: + return st.applyUserJoin(ch.GetUserJoin()) + case ch.GetUserConfirm() != nil: + return st.applyUserConfirm(ch.GetUserConfirm()) + default: + return fmt.Errorf("unexpected change type: %v", ch) + } +} + +func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLChangeUserPermissionChange) error { + if _, exists := st.userStates[ch.Identity]; !exists { + return ErrNoSuchUser + } + + st.userStates[ch.Identity].Permissions = ch.Permissions + return nil +} + +func (st *ACLState) applyUserInvite(ch *aclpb.ACLChangeUserInvite) error { + st.userInvites[ch.InviteId] = ch + return nil +} + +func (st *ACLState) applyUserJoin(ch *aclpb.ACLChangeUserJoin) error { + invite, exists := st.userInvites[ch.UserInviteId] + if !exists { + return fmt.Errorf("no such invite with id %s", ch.UserInviteId) + } + + if _, exists = st.userStates[ch.Identity]; exists { + return ErrUserAlreadyExists + } + + // validating signature + signature := ch.GetAcceptSignature() + verificationKey, err := st.signingPubKeyDecoder.DecodeFromBytes(invite.AcceptPublicKey) + if err != nil { + return fmt.Errorf("public key verifying invite accepts is given in incorrect format: %v", err) + } + + rawSignedId, err := st.signingPubKeyDecoder.DecodeFromStringIntoBytes(ch.Identity) + if err != nil { + return fmt.Errorf("failed to decode signing identity as bytes") + } + + res, err := verificationKey.Verify(rawSignedId, signature) + if err != nil { + return fmt.Errorf("verification returned error: %w", err) + } + if !res { + return fmt.Errorf("signature is invalid") + } + + // if ourselves -> we need to decrypt the read keys + if st.identity == ch.Identity { + for _, key := range ch.EncryptedReadKeys { + key, hash, err := st.decryptReadKeyAndHash(key) + if err != nil { + return ErrFailedToDecrypt + } + + st.userReadKeys[hash] = key + } + } + + // adding user to the list + userState := &aclpb.ACLChangeUserState{ + Identity: ch.Identity, + EncryptionKey: ch.EncryptionKey, + EncryptedReadKeys: ch.EncryptedReadKeys, + Permissions: invite.Permissions, + IsConfirmed: true, + } + st.userStates[ch.Identity] = userState + return nil +} + +func (st *ACLState) applyUserAdd(ch *aclpb.ACLChangeUserAdd) error { + if _, exists := st.userStates[ch.Identity]; exists { + return ErrUserAlreadyExists + } + + st.userStates[ch.Identity] = &aclpb.ACLChangeUserState{ + Identity: ch.Identity, + EncryptionKey: ch.EncryptionKey, + Permissions: ch.Permissions, + EncryptedReadKeys: ch.EncryptedReadKeys, + } + + if ch.Identity == st.identity { + for _, key := range ch.EncryptedReadKeys { + key, hash, err := st.decryptReadKeyAndHash(key) + if err != nil { + return ErrFailedToDecrypt + } + + st.userReadKeys[hash] = key + } + } + + return nil +} + +func (st *ACLState) applyUserRemove(ch *aclpb.ACLChangeUserRemove) error { + if ch.Identity == st.identity { + return ErrDocumentForbidden + } + + if _, exists := st.userStates[ch.Identity]; !exists { + return ErrNoSuchUser + } + + delete(st.userStates, ch.Identity) + + for _, replace := range ch.ReadKeyReplaces { + userState, exists := st.userStates[replace.Identity] + if !exists { + continue + } + + userState.EncryptedReadKeys = append(userState.EncryptedReadKeys, replace.EncryptedReadKey) + // if this is our identity then we have to decrypt the key + if replace.Identity == st.identity { + key, hash, err := st.decryptReadKeyAndHash(replace.EncryptedReadKey) + if err != nil { + return ErrFailedToDecrypt + } + + st.currentReadKeyHash = hash + st.userReadKeys[st.currentReadKeyHash] = key + } + } + return nil +} + +func (st *ACLState) applyUserConfirm(ch *aclpb.ACLChangeUserConfirm) error { + if _, exists := st.userStates[ch.Identity]; !exists { + return ErrNoSuchUser + } + + userState := st.userStates[ch.Identity] + userState.IsConfirmed = true + return nil +} + +func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, error) { + decrypted, err := st.encryptionKey.Decrypt(msg) + if err != nil { + return nil, 0, ErrFailedToDecrypt + } + + key, err := symmetric.FromBytes(decrypted) + if err != nil { + return nil, 0, ErrFailedToDecrypt + } + + hasher := fnv.New64() + hasher.Write(decrypted) + return key, hasher.Sum64(), nil +} + +func (st *ACLState) hasPermission(identity string, permission aclpb.ACLChangeUserPermissions) bool { + state, exists := st.userStates[identity] + if !exists { + return false + } + + return state.Permissions == permission +} + +func (st *ACLState) isUserJoin(data *aclpb.ACLChangeACLData) bool { + // if we have a UserJoin, then it should always be the first one applied + return data.GetAclContent() != nil && data.GetAclContent()[0].GetUserJoin() != nil +} + +func (st *ACLState) isUserAdd(data *aclpb.ACLChangeACLData, identity string) bool { + // if we have a UserAdd, then it should always be the first one applied + userAdd := data.GetAclContent()[0].GetUserAdd() + return data.GetAclContent() != nil && userAdd != nil && userAdd.GetIdentity() == identity +} + +func (st *ACLState) getPermissionDecreasedUsers(ch *aclpb.ACLChange) (identities []*aclpb.ACLChangeUserPermissionChange) { + // this should be called after general checks are completed + if ch.GetAclData().GetAclContent() == nil { + return nil + } + + contents := ch.GetAclData().GetAclContent() + for _, c := range contents { + if c.GetUserPermissionChange() != nil { + content := c.GetUserPermissionChange() + + currentState := st.userStates[content.Identity] + // the comparison works in different direction :-) + if content.Permissions > currentState.Permissions { + identities = append(identities, &aclpb.ACLChangeUserPermissionChange{ + Identity: content.Identity, + Permissions: content.Permissions, + }) + } + } + if c.GetUserRemove() != nil { + content := c.GetUserRemove() + identities = append(identities, &aclpb.ACLChangeUserPermissionChange{ + Identity: content.Identity, + Permissions: aclpb.ACLChange_Removed, + }) + } + } + + return identities +} + +func (st *ACLState) equal(other *ACLState) bool { + if st == nil && other == nil { + return true + } + + if st == nil || other == nil { + return false + } + + if st.currentReadKeyHash != other.currentReadKeyHash { + return false + } + + if st.identity != other.identity { + return false + } + + if len(st.userStates) != len(other.userStates) { + return false + } + + for _, st := range st.userStates { + otherSt, exists := other.userStates[st.Identity] + if !exists { + return false + } + + if st.Permissions != otherSt.Permissions { + return false + } + + if bytes.Compare(st.EncryptionKey, otherSt.EncryptionKey) != 0 { + return false + } + } + + if len(st.userInvites) != len(other.userInvites) { + return false + } + + // TODO: add detailed user invites comparison + compare other stuff + return true +} + +func (st *ACLState) GetUserStates() map[string]*aclpb.ACLChangeUserState { + // TODO: we should provide better API that would not allow to change this map from the outside + return st.userStates +} + +func (st *ACLState) isNodeIdentity() bool { + return st.identity == "" +} diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go new file mode 100644 index 00000000..1d232133 --- /dev/null +++ b/pkg/acl/tree/change.go @@ -0,0 +1,82 @@ +package tree + +import ( + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/gogo/protobuf/proto" + + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" +) + +type ChangeContent struct { + ChangesData proto.Marshaler + ACLData *aclpb.ACLChangeACLData + Id string // TODO: this is just for testing, because id should be created automatically from content +} + +// Change is an abstract type for all types of changes +type Change struct { + Next []*Change + Unattached []*Change + PreviousIds []string + Id string + SnapshotId string + IsSnapshot bool + DecryptedChange []byte + + Content *aclpb.Change + Sign []byte +} + +func (ch *Change) DecryptContents(key *symmetric.Key) error { + // if the document is already decrypted + if ch.Content.CurrentReadKeyHash == 0 { + return nil + } + decrypted, err := key.Decrypt(ch.Content.ChangesData) + if err != nil { + return fmt.Errorf("failed to decrypt changes data: %w", err) + } + + ch.DecryptedChange = decrypted + return nil +} + +func NewFromRawChange(rawChange *aclpb.RawChange) (*Change, error) { + unmarshalled := &aclpb.Change{} + err := proto.Unmarshal(rawChange.Payload, unmarshalled) + if err != nil { + return nil, err + } + + ch := NewChange(rawChange.Id, unmarshalled) + ch.Sign = rawChange.Signature + return ch, nil +} + +func NewChange(id string, ch *aclpb.Change) *Change { + return &Change{ + Next: nil, + PreviousIds: ch.TreeHeadIds, + Id: id, + Content: ch, + SnapshotId: ch.SnapshotBaseId, + IsSnapshot: ch.IsSnapshot, + } +} + +func (ch *Change) ProtoChange() *aclpb.Change { + return ch.Content +} + +func (ch *Change) DecryptedChangeContent() []byte { + return ch.DecryptedChange +} + +func (ch *Change) Signature() []byte { + return ch.Sign +} + +func (ch *Change) CID() string { + return ch.Id +} diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go new file mode 100644 index 00000000..1c6cd1fe --- /dev/null +++ b/pkg/acl/tree/tree.go @@ -0,0 +1,416 @@ +package tree + +import ( + "bytes" + "crypto/md5" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" + "sort" +) + +type Mode int + +const ( + Append Mode = iota + Rebuild + Nothing +) + +// TODO: consider abstracting into separate package with iterator, remove +type Tree struct { + root *Change + headIds []string + metaHeadIds []string + attached map[string]*Change + unAttached map[string]*Change + // missed id -> list of dependency ids + waitList map[string][]string + invalidChanges map[string]struct{} + + // bufs + iterCompBuf []*Change + iterQueue []*Change + + duplicateEvents int +} + +func (t *Tree) GetUnattachedChanges(changes ...*Change) []*Change { + return nil +} + +func (t *Tree) RootId() string { + if t.root != nil { + return t.root.Id + } + return "" +} + +func (t *Tree) Root() *Change { + return t.root +} + +func (t *Tree) AddFast(changes ...*Change) { + for _, c := range changes { + // ignore existing + if _, ok := t.attached[c.Id]; ok { + continue + } else if _, ok := t.unAttached[c.Id]; ok { + continue + } + t.add(c) + } + t.updateHeads() +} + +func (t *Tree) Add(changes ...*Change) (mode Mode) { + var beforeHeadIds = t.headIds + var attached bool + var empty = t.Len() == 0 + for _, c := range changes { + // ignore existing + if _, ok := t.attached[c.Id]; ok { + continue + } else if _, ok := t.unAttached[c.Id]; ok { + continue + } + if t.add(c) { + attached = true + } + } + if !attached { + return Nothing + } + t.updateHeads() + if empty { + return Rebuild + } + for _, hid := range beforeHeadIds { + for _, newCh := range changes { + if _, ok := t.attached[newCh.Id]; ok { + if !t.after(newCh.Id, hid) { + return Rebuild + } + } + } + } + return Append +} + +func (t *Tree) RemoveInvalidChange(id string) { + stack := []string{id} + // removing all children of this id (either next or unattached) + for len(stack) > 0 { + var exists bool + top := stack[len(stack)-1] + stack = stack[:len(stack)-1] + + if _, exists = t.invalidChanges[top]; exists { + continue + } + + var rem *Change + t.invalidChanges[top] = struct{}{} + if rem, exists = t.unAttached[top]; exists { + delete(t.unAttached, top) + } else if rem, exists = t.attached[top]; exists { + // remove from all prev changes + for _, id := range rem.PreviousIds { + prev, exists := t.attached[id] + if !exists { + continue + } + for i, next := range prev.Next { + if next.Id == top { + prev.Next[i] = nil + prev.Next = append(prev.Next[:i], prev.Next[i+1:]...) + break + } + } + } + delete(t.attached, top) + } + for _, el := range rem.Unattached { + stack = append(stack, el.Id) + } + for _, el := range rem.Next { + stack = append(stack, el.Id) + } + } + t.updateHeads() +} + +func (t *Tree) add(c *Change) (attached bool) { + if c == nil { + return false + } + if _, exists := t.invalidChanges[c.Id]; exists { + return false + } + + if t.root == nil { // first element + t.root = c + t.attached = map[string]*Change{ + c.Id: c, + } + t.unAttached = make(map[string]*Change) + t.waitList = make(map[string][]string) + t.invalidChanges = make(map[string]struct{}) + return true + } + if len(c.PreviousIds) > 1 { + sort.Strings(c.PreviousIds) + } + // attaching only if all prev ids are attached + attached = true + for _, pid := range c.PreviousIds { + if prev, ok := t.attached[pid]; ok { + prev.Unattached = append(prev.Unattached, c) + continue + } + attached = false + if prev, ok := t.unAttached[pid]; ok { + prev.Unattached = append(prev.Unattached, c) + continue + } + wl := t.waitList[pid] + wl = append(wl, c.Id) + t.waitList[pid] = wl + } + if attached { + t.attach(c, true) + } else { + // clearing wait list + for _, wid := range t.waitList[c.Id] { + c.Unattached = append(c.Unattached, t.unAttached[wid]) + } + delete(t.waitList, c.Id) + t.unAttached[c.Id] = c + } + return +} + +func (t *Tree) canAttach(c *Change) (attach bool) { + if c == nil { + return false + } + attach = true + for _, id := range c.PreviousIds { + if _, exists := t.attached[id]; !exists { + attach = false + } + } + return +} + +func (t *Tree) attach(c *Change, newEl bool) { + t.attached[c.Id] = c + if !newEl { + delete(t.unAttached, c.Id) + } + + // add next to all prev changes + for _, id := range c.PreviousIds { + // prev id must be attached if we attach this id + prev := t.attached[id] + prev.Next = append(prev.Next, c) + if len(prev.Next) > 1 { + sort.Sort(sortChanges(prev.Next)) + } + for i, next := range prev.Unattached { + if next.Id == c.Id { + prev.Unattached[i] = nil + prev.Unattached = append(prev.Unattached[:i], prev.Unattached[i+1:]...) + break + } + } + } + + // clearing wait list + if waitIds, ok := t.waitList[c.Id]; ok { + for _, wid := range waitIds { + next := t.unAttached[wid] + if t.canAttach(next) { + t.attach(next, false) + } + } + delete(t.waitList, c.Id) + } + + for _, next := range c.Unattached { + if t.canAttach(next) { + t.attach(next, false) + } + } +} + +func (t *Tree) after(id1, id2 string) (found bool) { + t.iterate(t.attached[id2], func(c *Change) (isContinue bool) { + if c.Id == id1 { + found = true + return false + } + return true + }) + return +} + +func (t *Tree) dfs(startChange string) (uniqMap map[string]*Change) { + stack := make([]*Change, 0, 10) + stack = append(stack, t.attached[startChange]) + uniqMap = map[string]*Change{} + + for len(stack) > 0 { + ch := stack[len(stack)-1] + stack = stack[:len(stack)-1] + if _, exists := uniqMap[ch.Id]; exists { + continue + } + + uniqMap[ch.Id] = ch + + for _, prev := range ch.PreviousIds { + stack = append(stack, t.attached[prev]) + } + } + return uniqMap +} + +func (t *Tree) updateHeads() { + var newHeadIds, newMetaHeadIds []string + t.iterate(t.root, func(c *Change) (isContinue bool) { + if len(c.Next) == 0 { + newHeadIds = append(newHeadIds, c.Id) + } + return true + }) + t.headIds = newHeadIds + t.metaHeadIds = newMetaHeadIds + sort.Strings(t.headIds) + sort.Strings(t.metaHeadIds) +} + +func (t *Tree) ACLHeads() []string { + var aclTreeHeads []string + for _, head := range t.Heads() { + if slice.FindPos(aclTreeHeads, head) != -1 { // do not scan known heads + continue + } + precedingHeads := t.getPrecedingACLHeads(head) + + for _, aclHead := range precedingHeads { + if slice.FindPos(aclTreeHeads, aclHead) != -1 { + continue + } + aclTreeHeads = append(aclTreeHeads, aclHead) + } + } + return aclTreeHeads +} + +func (t *Tree) getPrecedingACLHeads(head string) []string { + headChange := t.attached[head] + + if headChange.Content.GetAclData() != nil { + return []string{head} + } else { + return headChange.Content.AclHeadIds + } +} + +func (t *Tree) iterate(start *Change, f func(c *Change) (isContinue bool)) { + it := newIterator() + defer freeIterator(it) + it.iterate(start, f) +} + +func (t *Tree) iterateSkip(start *Change, skipBefore *Change, f func(c *Change) (isContinue bool)) { + it := newIterator() + defer freeIterator(it) + it.iterateSkip(start, skipBefore, f) +} + +func (t *Tree) IterateSkip(startId string, skipBeforeId string, f func(c *Change) (isContinue bool)) { + it := newIterator() + defer freeIterator(it) + it.iterateSkip(t.attached[startId], t.attached[skipBeforeId], f) +} + +func (t *Tree) Iterate(startId string, f func(c *Change) (isContinue bool)) { + t.iterate(t.attached[startId], f) +} + +func (t *Tree) IterateBranching(startId string, f func(c *Change, branchLevel int) (isContinue bool)) { + // branchLevel indicates the number of parallel branches + var bc int + t.iterate(t.attached[startId], func(c *Change) (isContinue bool) { + if pl := len(c.PreviousIds); pl > 1 { + bc -= pl - 1 + } + bl := bc + if nl := len(c.Next); nl > 1 { + bc += nl - 1 + } + return f(c, bl) + }) +} + +func (t *Tree) Hash() string { + h := md5.New() + n := 0 + t.iterate(t.root, func(c *Change) (isContinue bool) { + n++ + fmt.Fprintf(h, "-%s", c.Id) + return true + }) + return fmt.Sprintf("%d-%x", n, h.Sum(nil)) +} + +func (t *Tree) GetDuplicateEvents() int { + return t.duplicateEvents +} + +func (t *Tree) ResetDuplicateEvents() { + t.duplicateEvents = 0 +} + +func (t *Tree) Len() int { + return len(t.attached) +} + +func (t *Tree) Heads() []string { + return t.headIds +} + +func (t *Tree) String() string { + var buf = bytes.NewBuffer(nil) + t.Iterate(t.RootId(), func(c *Change) (isContinue bool) { + buf.WriteString(c.Id) + if len(c.Next) > 1 { + buf.WriteString("-<") + } else if len(c.Next) > 0 { + buf.WriteString("->") + } else { + buf.WriteString("-|") + } + return true + }) + return buf.String() +} + +func (t *Tree) Get(id string) *Change { + return t.attached[id] +} + +type sortChanges []*Change + +func (s sortChanges) Len() int { + return len(s) +} + +func (s sortChanges) Less(i, j int) bool { + return s[i].Id < s[j].Id +} + +func (s sortChanges) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go new file mode 100644 index 00000000..44da7c6d --- /dev/null +++ b/pkg/acl/tree/treebuilder.go @@ -0,0 +1,365 @@ +package tree + +import ( + "context" + "errors" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" + "github.com/gogo/protobuf/proto" + "time" +) + +var ( + log = logger.NewNamed("acltree").Sugar() + ErrEmpty = errors.New("logs empty") +) + +type treeBuilder struct { + cache map[string]*Change + identityKeys map[string]signingkey.PubKey + signingPubKeyDecoder signingkey.PubKeyDecoder + tree *Tree + treeStorage treestorage.TreeStorage +} + +func newTreeBuilder(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder) *treeBuilder { + return &treeBuilder{ + signingPubKeyDecoder: decoder, + treeStorage: t, + } +} + +func (tb *treeBuilder) Init() { + tb.cache = make(map[string]*Change) + tb.identityKeys = make(map[string]signingkey.PubKey) + tb.tree = &Tree{} +} + +func (tb *treeBuilder) Build(fromStart bool) (*Tree, error) { + var headsAndOrphans []string + orphans, err := tb.treeStorage.Orphans() + if err != nil { + return nil, err + } + heads, err := tb.treeStorage.Heads() + if err != nil { + return nil, err + } + headsAndOrphans = append(headsAndOrphans, orphans...) + headsAndOrphans = append(headsAndOrphans, heads...) + + if fromStart { + if err := tb.buildTreeFromStart(headsAndOrphans); err != nil { + return nil, fmt.Errorf("buildTree error: %v", err) + } + } else { + breakpoint, err := tb.findBreakpoint(headsAndOrphans) + if err != nil { + return nil, fmt.Errorf("findBreakpoint error: %v", err) + } + + if err = tb.buildTree(headsAndOrphans, breakpoint); err != nil { + return nil, fmt.Errorf("buildTree error: %v", err) + } + } + + tb.cache = nil + + return tb.tree, nil +} + +func (tb *treeBuilder) buildTreeFromStart(heads []string) (err error) { + changes, root, err := tb.dfsFromStart(heads) + if err != nil { + return err + } + + tb.tree.AddFast(root) + tb.tree.AddFast(changes...) + return +} + +func (tb *treeBuilder) dfsFromStart(heads []string) (buf []*Change, root *Change, err error) { + var possibleRoots []*Change + stack := make([]string, len(heads), len(heads)*2) + copy(stack, heads) + + buf = make([]*Change, 0, len(stack)*2) + uniqMap := make(map[string]struct{}) + for len(stack) > 0 { + id := stack[len(stack)-1] + stack = stack[:len(stack)-1] + if _, exists := uniqMap[id]; exists { + continue + } + + ch, err := tb.loadChange(id) + if err != nil { + continue + } + + uniqMap[id] = struct{}{} + buf = append(buf, ch) + + for _, prev := range ch.PreviousIds { + stack = append(stack, prev) + } + if len(ch.PreviousIds) == 0 { + possibleRoots = append(possibleRoots, ch) + } + } + header, err := tb.treeStorage.Header() + if err != nil { + return nil, nil, err + } + for _, r := range possibleRoots { + if r.Id == header.FirstChangeId { + return buf, r, nil + } + } + + return nil, nil, fmt.Errorf("could not find root change") +} + +func (tb *treeBuilder) buildTree(heads []string, breakpoint string) (err error) { + ch, err := tb.loadChange(breakpoint) + if err != nil { + return + } + tb.tree.AddFast(ch) + changes, err := tb.dfs(heads, breakpoint, tb.loadChange) + + tb.tree.AddFast(changes...) + return +} + +func (tb *treeBuilder) dfs( + heads []string, + breakpoint string, + load func(string) (*Change, error)) (buf []*Change, err error) { + stack := make([]string, len(heads), len(heads)*2) + copy(stack, heads) + + buf = make([]*Change, 0, len(stack)*2) + uniqMap := map[string]struct{}{breakpoint: {}} + for len(stack) > 0 { + id := stack[len(stack)-1] + stack = stack[:len(stack)-1] + if _, exists := uniqMap[id]; exists { + continue + } + + ch, err := load(id) + if err != nil { + continue + } + + uniqMap[id] = struct{}{} + buf = append(buf, ch) + + for _, prev := range ch.PreviousIds { + stack = append(stack, prev) + } + } + return buf, nil +} + +func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { + if ch, ok := tb.cache[id]; ok { + return ch, nil + } + + // TODO: Add virtual changes logic + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + change, err := tb.treeStorage.GetChange(ctx, id) + if err != nil { + return nil, err + } + + verifiedChange, err := tb.makeVerifiedChange(change) + if err != nil { + return nil, err + } + + tb.cache[id] = NewChange(id, verifiedChange) + + return ch, nil +} + +func (tb *treeBuilder) verify(identity string, payload, signature []byte) (isVerified bool, err error) { + identityKey, exists := tb.identityKeys[identity] + if !exists { + identityKey, err = tb.signingPubKeyDecoder.DecodeFromString(identity) + if err != nil { + return + } + tb.identityKeys[identity] = identityKey + } + return identityKey.Verify(payload, signature) +} + +func (tb *treeBuilder) makeVerifiedChange(change *aclpb.RawChange) (aclChange *aclpb.Change, err error) { + aclChange = new(aclpb.Change) + + // TODO: think what should we do with such cases, because this can be used by attacker to break our Tree + if err = proto.Unmarshal(change.Payload, aclChange); err != nil { + return + } + var verified bool + verified, err = tb.verify(aclChange.Identity, change.Payload, change.Signature) + if err != nil { + return + } + if !verified { + err = fmt.Errorf("the signature of the payload cannot be verified") + return + } + return +} + +func (tb *treeBuilder) makeUnverifiedACLChange(change *aclpb.RawChange) (aclChange *aclpb.ACLChange, err error) { + aclChange = new(aclpb.ACLChange) + err = proto.Unmarshal(change.Payload, aclChange) + return +} + +func (tb *treeBuilder) findBreakpoint(heads []string) (breakpoint string, err error) { + var ( + ch *Change + snapshotIds []string + ) + for _, head := range heads { + if ch, err = tb.loadChange(head); err != nil { + return + } + shId := ch.SnapshotId + if ch.IsSnapshot { + shId = ch.Id + } + if slice.FindPos(snapshotIds, shId) == -1 { + snapshotIds = append(snapshotIds, shId) + } + } + return tb.findCommonSnapshot(snapshotIds) +} + +func (tb *treeBuilder) findCommonSnapshot(snapshotIds []string) (snapshotId string, err error) { + if len(snapshotIds) == 1 { + return snapshotIds[0], nil + } else if len(snapshotIds) == 0 { + return "", fmt.Errorf("snapshots not found") + } + + for len(snapshotIds) > 1 { + l := len(snapshotIds) + shId, e := tb.findCommonForTwoSnapshots(snapshotIds[l-2], snapshotIds[l-1]) + if e != nil { + return "", e + } + snapshotIds[l-2] = shId + snapshotIds = snapshotIds[:l-1] + } + return snapshotIds[0], nil +} + +func (tb *treeBuilder) findCommonForTwoSnapshots(s1, s2 string) (s string, err error) { + // fast cases + if s1 == s2 { + return s1, nil + } + ch1, err := tb.loadChange(s1) + if err != nil { + return "", err + } + if ch1.SnapshotId == s2 { + return s2, nil + } + ch2, err := tb.loadChange(s2) + if err != nil { + return "", err + } + if ch2.SnapshotId == s1 { + return s1, nil + } + if ch1.SnapshotId == ch2.SnapshotId && ch1.SnapshotId != "" { + return ch1.SnapshotId, nil + } + // traverse + var t1 = make([]string, 0, 5) + var t2 = make([]string, 0, 5) + t1 = append(t1, ch1.Id, ch1.SnapshotId) + t2 = append(t2, ch2.Id, ch2.SnapshotId) + for { + lid1 := t1[len(t1)-1] + if lid1 != "" { + l1, e := tb.loadChange(lid1) + if e != nil { + return "", e + } + if l1.SnapshotId != "" { + if slice.FindPos(t2, l1.SnapshotId) != -1 { + return l1.SnapshotId, nil + } + } + t1 = append(t1, l1.SnapshotId) + } + lid2 := t2[len(t2)-1] + if lid2 != "" { + l2, e := tb.loadChange(t2[len(t2)-1]) + if e != nil { + return "", e + } + if l2.SnapshotId != "" { + if slice.FindPos(t1, l2.SnapshotId) != -1 { + return l2.SnapshotId, nil + } + } + t2 = append(t2, l2.SnapshotId) + } + if lid1 == "" && lid2 == "" { + break + } + } + + log.Warnf("changes build Tree: possible versions split") + + // prefer not first snapshot + if len(ch1.PreviousIds) == 0 && len(ch2.PreviousIds) > 0 { + log.Warnf("changes build Tree: prefer %s(%d prevIds) over %s(%d prevIds)", s2, len(ch2.PreviousIds), s1, len(ch1.PreviousIds)) + return s2, nil + } else if len(ch1.PreviousIds) > 0 && len(ch2.PreviousIds) == 0 { + log.Warnf("changes build Tree: prefer %s(%d prevIds) over %s(%d prevIds)", s1, len(ch1.PreviousIds), s2, len(ch2.PreviousIds)) + return s1, nil + } + + isEmptySnapshot := func(ch *Change) bool { + // TODO: add more sophisticated checks in Change for snapshots + return !ch.IsSnapshot + } + + // TODO: can we even have empty snapshots? + // prefer not empty snapshot + if isEmptySnapshot(ch1) && !isEmptySnapshot(ch2) { + log.Warnf("changes build Tree: prefer %s(not empty) over %s(empty)", s2, s1) + return s2, nil + } else if isEmptySnapshot(ch2) && !isEmptySnapshot(ch1) { + log.Warnf("changes build Tree: prefer %s(not empty) over %s(empty)", s1, s2) + return s1, nil + } + + // TODO: add virtual change mechanics + // unexpected behavior - just return lesser id + if s1 < s2 { + log.Warnf("changes build Tree: prefer %s (%s<%s)", s1, s1, s2) + return s1, nil + } + log.Warnf("changes build Tree: prefer %s (%s<%s)", s2, s2, s1) + + return s2, nil +} From d23cc0a239f4a0313c727b730973085f00ae38e1 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 10 Aug 2022 11:52:45 +0200 Subject: [PATCH 002/219] Add acltree in new package --- pkg/acl/tree/aclstate.go | 15 +- pkg/acl/tree/aclstatebuilder.go | 79 +++++ pkg/acl/tree/acltree.go | 466 ++++++++++++++++++++++++++++++ pkg/acl/tree/change.go | 12 +- pkg/acl/tree/changebuilder.go | 163 +++++++++++ pkg/acl/tree/descriptionparser.go | 45 +++ pkg/acl/tree/tree.go | 29 -- pkg/acl/tree/treebuilder.go | 4 +- pkg/acl/tree/treegraph.go | 11 + pkg/acl/tree/treegraph_nix.go | 121 ++++++++ pkg/acl/tree/treeiterator.go | 158 ++++++++++ 11 files changed, 1063 insertions(+), 40 deletions(-) create mode 100644 pkg/acl/tree/aclstatebuilder.go create mode 100644 pkg/acl/tree/acltree.go create mode 100644 pkg/acl/tree/changebuilder.go create mode 100644 pkg/acl/tree/descriptionparser.go create mode 100644 pkg/acl/tree/treegraph.go create mode 100644 pkg/acl/tree/treegraph_nix.go create mode 100644 pkg/acl/tree/treeiterator.go diff --git a/pkg/acl/tree/aclstate.go b/pkg/acl/tree/aclstate.go index f2016bb2..85cf3a90 100644 --- a/pkg/acl/tree/aclstate.go +++ b/pkg/acl/tree/aclstate.go @@ -50,11 +50,18 @@ func newACLState() *ACLState { } } -func (st *ACLState) applyChange(change *aclpb.Change) (err error) { +func (st *ACLState) applyChange(changeWrapper *Change) (err error) { + change := changeWrapper.Content aclData := &aclpb.ACLChangeACLData{} - err = proto.Unmarshal(change.ChangesData, aclData) - if err != nil { - return + + if changeWrapper.DecryptedModel != nil { + aclData = changeWrapper.DecryptedModel.(*aclpb.ACLChangeACLData) + } else { + err = proto.Unmarshal(change.ChangesData, aclData) + if err != nil { + return + } + changeWrapper.DecryptedModel = aclData } defer func() { diff --git a/pkg/acl/tree/aclstatebuilder.go b/pkg/acl/tree/aclstatebuilder.go new file mode 100644 index 00000000..681198b7 --- /dev/null +++ b/pkg/acl/tree/aclstatebuilder.go @@ -0,0 +1,79 @@ +package tree + +import ( + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" +) + +type aclStateBuilder struct { + tree *Tree + identity string + key encryptionkey.PrivKey + decoder signingkey.PubKeyDecoder +} + +func newACLStateBuilderWithIdentity(decoder signingkey.PubKeyDecoder, accountData *account.AccountData) *aclStateBuilder { + return &aclStateBuilder{ + decoder: decoder, + identity: accountData.Identity, + key: accountData.EncKey, + } +} + +func newACLStateBuilder() *aclStateBuilder { + return &aclStateBuilder{} +} + +func (sb *aclStateBuilder) Init(tree *Tree) error { + sb.tree = tree + return nil +} + +func (sb *aclStateBuilder) Build() (*ACLState, error) { + state, _, err := sb.BuildBefore("") + return state, err +} + +func (sb *aclStateBuilder) BuildBefore(beforeId string) (*ACLState, bool, error) { + var ( + err error + startChange = sb.tree.root + state *ACLState + foundId = false + ) + + if sb.decoder != nil { + state = newACLStateWithIdentity(sb.identity, sb.key, sb.decoder) + } else { + state = newACLState() + } + + if beforeId == startChange.Id { + return state, true, nil + } + + sb.tree.IterateSkip(sb.tree.root.Id, startChange.Id, func(c *Change) (isContinue bool) { + err = state.applyChange(c) + if err != nil { + return false + } + + // the user can't make changes + if !state.hasPermission(c.Content.Identity, aclpb.ACLChange_Writer) && !state.hasPermission(c.Content.Identity, aclpb.ACLChange_Admin) { + err = fmt.Errorf("user %s cannot make changes", c.Content.Identity) + return false + } + + if c.Id == beforeId { + foundId = true + return false + } + + return true + }) + + return state, foundId, err +} diff --git a/pkg/acl/tree/acltree.go b/pkg/acl/tree/acltree.go new file mode 100644 index 00000000..4b658477 --- /dev/null +++ b/pkg/acl/tree/acltree.go @@ -0,0 +1,466 @@ +package tree + +import ( + "context" + "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" + "go.uber.org/zap" + "sync" +) + +type AddResultSummary int + +var ErrTreeWithoutIdentity = errors.New("acl tree is created without identity") + +const ( + AddResultSummaryNothing AddResultSummary = iota + AddResultSummaryAppend + AddResultSummaryRebuild +) + +type AddResult struct { + OldHeads []string + Heads []string + Added []*aclpb.RawChange + // TODO: add summary for changes + Summary AddResultSummary +} + +type TreeUpdateListener interface { + Update(tree ACLTree) + Rebuild(tree ACLTree) +} + +type NoOpListener struct{} + +func (n NoOpListener) Update(tree ACLTree) {} + +func (n NoOpListener) Rebuild(tree ACLTree) {} + +type RWLocker interface { + sync.Locker + RLock() + RUnlock() +} + +var ErrNoCommonSnapshot = errors.New("trees doesn't have a common snapshot") + +type ACLTree interface { + RWLocker + ID() string + Header() *treepb.TreeHeader + ACLState() *ACLState + AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*aclpb.RawChange, error) + AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) + Heads() []string + Root() *Change + Iterate(func(change *Change) bool) + IterateFrom(string, func(change *Change) bool) + HasChange(string) bool + SnapshotPath() []string + ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) + Storage() treestorage.TreeStorage + DebugDump() (string, error) + + Close() error +} + +type aclTree struct { + treeStorage treestorage.TreeStorage + accountData *account.AccountData + updateListener TreeUpdateListener + + id string + header *treepb.TreeHeader + tree *Tree + aclState *ACLState + + treeBuilder *treeBuilder + aclStateBuilder *aclStateBuilder + changeBuilder *changeBuilder + + sync.RWMutex +} + +func BuildACLTreeWithIdentity( + t treestorage.TreeStorage, + acc *account.AccountData, + listener TreeUpdateListener) (ACLTree, error) { + treeBuilder := newTreeBuilder(t, acc.Decoder) + aclStateBuilder := newACLStateBuilderWithIdentity(acc.Decoder, acc) + changeBuilder := newChangeBuilder() + + aclTree := &aclTree{ + treeStorage: t, + accountData: acc, + tree: nil, + aclState: nil, + treeBuilder: treeBuilder, + aclStateBuilder: aclStateBuilder, + changeBuilder: changeBuilder, + updateListener: listener, + } + err := aclTree.rebuildFromStorage() + if err != nil { + return nil, err + } + err = aclTree.removeOrphans() + if err != nil { + return nil, err + } + err = t.SetHeads(aclTree.Heads()) + if err != nil { + return nil, err + } + aclTree.id, err = t.TreeID() + if err != nil { + return nil, err + } + aclTree.header, err = t.Header() + if err != nil { + return nil, err + } + + listener.Rebuild(aclTree) + + return aclTree, nil +} + +func BuildACLTree(t treestorage.TreeStorage) { + // TODO: Add logic for building without identity +} + +func (a *aclTree) removeOrphans() error { + // removing attached or invalid orphans + var toRemove []string + + orphans, err := a.treeStorage.Orphans() + if err != nil { + return err + } + for _, orphan := range orphans { + if _, exists := a.tree.attached[orphan]; exists { + toRemove = append(toRemove, orphan) + } + if _, exists := a.tree.invalidChanges[orphan]; exists { + toRemove = append(toRemove, orphan) + } + } + return a.treeStorage.RemoveOrphans(toRemove...) +} + +func (a *aclTree) rebuildFromStorage() (err error) { + a.treeBuilder.Init() + + a.tree, err = a.treeBuilder.Build(true) + if err != nil { + return err + } + + err = a.aclStateBuilder.Init(a.tree) + if err != nil { + return err + } + + a.aclState, err = a.aclStateBuilder.Build() + if err != nil { + return err + } + + return nil +} + +func (a *aclTree) ID() string { + return a.id +} + +func (a *aclTree) Header() *treepb.TreeHeader { + return a.header +} + +func (a *aclTree) ACLState() *ACLState { + return a.aclState +} + +func (a *aclTree) Storage() treestorage.TreeStorage { + return a.treeStorage +} + +func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuilder) error) (*aclpb.RawChange, error) { + if a.accountData == nil { + return nil, ErrTreeWithoutIdentity + } + + defer func() { + // TODO: should this be called in a separate goroutine to prevent accidental cycles (tree->updater->tree) + a.updateListener.Update(a) + }() + + a.changeBuilder.Init(a.aclState, a.tree, a.accountData) + err := build(a.changeBuilder) + if err != nil { + return nil, err + } + + ch, marshalled, err := a.changeBuilder.BuildAndApply() + if err != nil { + return nil, err + } + a.tree.AddFast(ch) + rawCh := &aclpb.RawChange{ + Payload: marshalled, + Signature: ch.Signature(), + Id: ch.Id, + } + + err = a.treeStorage.AddRawChange(rawCh) + if err != nil { + return nil, err + } + + err = a.treeStorage.SetHeads([]string{ch.Id}) + if err != nil { + return nil, err + } + return rawCh, nil +} + +func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (AddResult, error) { + // TODO: make proper error handling, because there are a lot of corner cases where this will break + var err error + var mode Mode + + var changes []*Change // TODO: = addChangesBuf[:0] ... + for _, ch := range rawChanges { + change, err := NewFromRawChange(ch) + // TODO: think what if we will have incorrect signatures on rawChanges, how everything will work + if err != nil { + continue + } + changes = append(changes, change) + } + + defer func() { + if err != nil { + return + } + + err = a.removeOrphans() + if err != nil { + return + } + + err = a.treeStorage.SetHeads(a.tree.Heads()) + if err != nil { + return + } + + switch mode { + case Append: + a.updateListener.Update(a) + case Rebuild: + a.updateListener.Rebuild(a) + default: + break + } + }() + + getAddedChanges := func() []*aclpb.RawChange { + var added []*aclpb.RawChange + for _, ch := range rawChanges { + if _, exists := a.tree.attached[ch.Id]; exists { + added = append(added, ch) + } + } + return added + } + + for _, ch := range changes { + err = a.treeStorage.AddChange(ch) + if err != nil { + return AddResult{}, err + } + err = a.treeStorage.AddOrphans(ch.Id) + if err != nil { + return AddResult{}, err + } + } + + prevHeads := a.tree.Heads() + mode = a.tree.Add(changes...) + switch mode { + case Nothing: + return AddResult{ + OldHeads: prevHeads, + Heads: prevHeads, + Summary: AddResultSummaryNothing, + }, nil + + case Rebuild: + err = a.rebuildFromStorage() + if err != nil { + return AddResult{}, err + } + + return AddResult{ + OldHeads: prevHeads, + Heads: a.tree.Heads(), + Added: getAddedChanges(), + Summary: AddResultSummaryRebuild, + }, nil + default: + // just rebuilding the state from start without reloading everything from tree storage + // as an optimization we could've started from current heads, but I didn't implement that + a.aclState, err = a.aclStateBuilder.Build() + if err != nil { + return AddResult{}, err + } + + return AddResult{ + OldHeads: prevHeads, + Heads: a.tree.Heads(), + Added: getAddedChanges(), + Summary: AddResultSummaryAppend, + }, nil + } +} + +func (a *aclTree) Iterate(f func(change *Change) bool) { + a.tree.Iterate(a.tree.RootId(), f) +} + +func (a *aclTree) IterateFrom(s string, f func(change *Change) bool) { + a.tree.Iterate(s, f) +} + +func (a *aclTree) HasChange(s string) bool { + _, attachedExists := a.tree.attached[s] + _, unattachedExists := a.tree.unAttached[s] + _, invalidExists := a.tree.invalidChanges[s] + return attachedExists || unattachedExists || invalidExists +} + +func (a *aclTree) Heads() []string { + return a.tree.Heads() +} + +func (a *aclTree) Root() *Change { + return a.tree.Root() +} + +func (a *aclTree) Close() error { + return nil +} + +func (a *aclTree) SnapshotPath() []string { + // TODO: think about caching this + + var path []string + // TODO: think that the user may have not all of the snapshots locally + currentSnapshotId := a.tree.RootId() + for currentSnapshotId != "" { + sn, err := a.treeBuilder.loadChange(currentSnapshotId) + if err != nil { + break + } + path = append(path, currentSnapshotId) + currentSnapshotId = sn.SnapshotId + } + return path +} + +func (a *aclTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { + // TODO: think about when the clients will have their full acl tree and thus full snapshots + // but no changes after some of the snapshots + + var ( + isNewDocument = len(theirPath) == 0 + ourPath = a.SnapshotPath() + // by default returning everything we have + commonSnapshot = ourPath[len(ourPath)-1] // TODO: root snapshot, probably it is better to have a specific method in treestorage + err error + ) + + // if this is non-empty request + if !isNewDocument { + commonSnapshot, err = a.commonSnapshotForTwoPaths(ourPath, theirPath) + if err != nil { + return nil, err + } + } + var rawChanges []*aclpb.RawChange + // using custom load function to skip verification step and save raw changes + load := func(id string) (*Change, error) { + raw, err := a.treeStorage.GetChange(context.Background(), id) + if err != nil { + return nil, err + } + + aclChange, err := a.treeBuilder.makeUnverifiedACLChange(raw) + if err != nil { + return nil, err + } + + ch := NewChange(id, aclChange) + rawChanges = append(rawChanges, raw) + return ch, nil + } + // we presume that we have everything after the common snapshot, though this may not be the case in case of clients and only ACL tree changes + log.With( + zap.Strings("heads", a.tree.Heads()), + zap.String("breakpoint", commonSnapshot), + zap.String("id", a.id)). + Debug("getting all changes from common snapshot") + _, err = a.treeBuilder.dfs(a.tree.Heads(), commonSnapshot, load) + if err != nil { + return nil, err + } + if isNewDocument { + // adding snapshot to raw changes + _, err = load(commonSnapshot) + if err != nil { + return nil, err + } + } + log.With( + zap.Int("len(changes)", len(rawChanges)), + zap.String("id", a.id)). + Debug("returning all changes after common snapshot") + + return rawChanges, nil +} + +func (a *aclTree) DebugDump() (string, error) { + return a.tree.Graph(ACLDescriptionParser) +} + +func (a *aclTree) commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) { + var i int + var j int + log.With(zap.Strings("our path", ourPath), zap.Strings("their path", theirPath)). + Debug("finding common snapshot for two paths") +OuterLoop: + // find starting point from the right + for i = len(ourPath) - 1; i >= 0; i-- { + for j = len(theirPath) - 1; j >= 0; j-- { + // most likely there would be only one comparison, because mostly the snapshot path will start from the root for nodes + if ourPath[i] == theirPath[j] { + break OuterLoop + } + } + } + if i < 0 || j < 0 { + return "", ErrNoCommonSnapshot + } + // find last common element of the sequence moving from right to left + for i >= 0 && j >= 0 { + if ourPath[i] == theirPath[j] { + i-- + j-- + } + } + return ourPath[i+1], nil +} diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index 1d232133..9fcd2006 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -22,12 +22,18 @@ type Change struct { Id string SnapshotId string IsSnapshot bool - DecryptedChange []byte + DecryptedChange []byte // TODO: check if we need it + DecryptedModel interface{} Content *aclpb.Change Sign []byte } +func (ch *Change) ProtoChange() *aclpb.ACLChange { + //TODO implement me + panic("implement me") +} + func (ch *Change) DecryptContents(key *symmetric.Key) error { // if the document is already decrypted if ch.Content.CurrentReadKeyHash == 0 { @@ -65,10 +71,6 @@ func NewChange(id string, ch *aclpb.Change) *Change { } } -func (ch *Change) ProtoChange() *aclpb.Change { - return ch.Content -} - func (ch *Change) DecryptedChangeContent() []byte { return ch.DecryptedChange } diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go new file mode 100644 index 00000000..8ecfaafb --- /dev/null +++ b/pkg/acl/tree/changebuilder.go @@ -0,0 +1,163 @@ +package tree + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" + "github.com/gogo/protobuf/proto" + "hash/fnv" + "time" +) + +type MarshalledChange = []byte + +type ACLChangeBuilder interface { + UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChangeUserPermissions) error + AddId(id string) // TODO: this is only for testing + SetMakeSnapshot(bool) // TODO: who should decide this? probably ACLTree so we can delete it +} + +type ChangeBuilder interface { + ACLChangeBuilder + AddChangeContent(marshaler proto.Marshaler) // user code should be responsible for making regular snapshots +} + +type changeBuilder struct { + aclState *ACLState + tree *Tree + acc *account.AccountData + + aclData *aclpb.ACLChangeACLData + changeContent proto.Marshaler + id string + makeSnapshot bool + readKey *symmetric.Key + readKeyHash uint64 +} + +func newChangeBuilder() *changeBuilder { + return &changeBuilder{} +} + +func (c *changeBuilder) Init(state *ACLState, tree *Tree, acc *account.AccountData) { + c.aclState = state + c.tree = tree + c.acc = acc + + c.aclData = &aclpb.ACLChangeACLData{} + // setting read key for further encryption etc + if state.currentReadKeyHash == 0 { + c.readKey, _ = symmetric.NewRandom() + + hasher := fnv.New64() + hasher.Write(c.readKey.Bytes()) + c.readKeyHash = hasher.Sum64() + } else { + c.readKey = c.aclState.userReadKeys[c.aclState.currentReadKeyHash] + c.readKeyHash = c.aclState.currentReadKeyHash + } +} + +func (c *changeBuilder) AddId(id string) { + c.id = id +} + +func (c *changeBuilder) SetMakeSnapshot(b bool) { + c.makeSnapshot = b +} + +func (c *changeBuilder) UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChangeUserPermissions) error { + var allKeys []*symmetric.Key + if c.aclState.currentReadKeyHash != 0 { + for _, key := range c.aclState.userReadKeys { + allKeys = append(allKeys, key) + } + } else { + allKeys = append(allKeys, c.readKey) + } + + var encryptedKeys [][]byte + for _, k := range allKeys { + res, err := encryptionKey.Encrypt(k.Bytes()) + if err != nil { + return err + } + + encryptedKeys = append(encryptedKeys, res) + } + rawKey, err := encryptionKey.Raw() + if err != nil { + return err + } + ch := &aclpb.ACLChangeACLContentValue{ + Value: &aclpb.ACLChangeACLContentValueValueOfUserAdd{ + UserAdd: &aclpb.ACLChangeUserAdd{ + Identity: identity, + EncryptionKey: rawKey, + EncryptedReadKeys: encryptedKeys, + Permissions: permissions, + }, + }, + } + c.aclData.AclContent = append(c.aclData.AclContent, ch) + return nil +} + +func (c *changeBuilder) BuildAndApply() (*Change, []byte, error) { + aclChange := &aclpb.ACLChange{ + TreeHeadIds: c.tree.Heads(), + AclHeadIds: c.tree.ACLHeads(), + SnapshotBaseId: c.tree.RootId(), + AclData: c.aclData, + CurrentReadKeyHash: c.readKeyHash, + Timestamp: int64(time.Now().Nanosecond()), + Identity: c.acc.Identity, + } + err := c.aclState.applyChange(aclChange) + if err != nil { + return nil, nil, err + } + + if c.makeSnapshot { + c.aclData.AclSnapshot = c.aclState.makeSnapshot() + } + + var marshalled []byte + if c.changeContent != nil { + marshalled, err = c.changeContent.Marshal() + if err != nil { + return nil, nil, err + } + + encrypted, err := c.aclState.userReadKeys[c.aclState.currentReadKeyHash]. + Encrypt(marshalled) + if err != nil { + return nil, nil, err + } + aclChange.ChangesData = encrypted + } + + fullMarshalledChange, err := proto.Marshal(aclChange) + if err != nil { + return nil, nil, err + } + signature, err := c.acc.SignKey.Sign(fullMarshalledChange) + if err != nil { + return nil, nil, err + } + id, err := cid.NewCIDFromBytes(fullMarshalledChange) + if err != nil { + return nil, nil, err + } + ch := NewChange(id, aclChange) + ch.DecryptedDocumentChange = marshalled + ch.Sign = signature + + return ch, fullMarshalledChange, nil +} + +func (c *changeBuilder) AddChangeContent(marshaler proto.Marshaler) { + c.changeContent = marshaler +} diff --git a/pkg/acl/tree/descriptionparser.go b/pkg/acl/tree/descriptionparser.go new file mode 100644 index 00000000..92587c40 --- /dev/null +++ b/pkg/acl/tree/descriptionparser.go @@ -0,0 +1,45 @@ +package tree + +import ( + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/gogo/protobuf/proto" + "strings" + "unicode" +) + +type DescriptionParser interface { + ParseChange(*Change) ([]string, error) +} + +var ACLDescriptionParser = aclDescriptionParser{} + +type aclDescriptionParser struct{} + +func (a aclDescriptionParser) ParseChange(changeWrapper *Change) (res []string, err error) { + change := changeWrapper.Content + aclData := &aclpb.ACLChangeACLData{} + + if changeWrapper.DecryptedModel != nil { + aclData = changeWrapper.DecryptedModel.(*aclpb.ACLChangeACLData) + } else { + err = proto.Unmarshal(change.ChangesData, aclData) + if err != nil { + return + } + } + + var chSymbs []string + for _, chc := range aclData.AclContent { + tp := fmt.Sprintf("%T", chc.Value) + tp = strings.Replace(tp, "ACLChangeACLContentValueValueOf", "", 1) + res := "" + for _, ts := range tp { + if unicode.IsUpper(ts) { + res += string(ts) + } + } + chSymbs = append(chSymbs, res) + } + return chSymbs, nil +} diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go index 1c6cd1fe..ef8cc23d 100644 --- a/pkg/acl/tree/tree.go +++ b/pkg/acl/tree/tree.go @@ -4,7 +4,6 @@ import ( "bytes" "crypto/md5" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "sort" ) @@ -289,34 +288,6 @@ func (t *Tree) updateHeads() { sort.Strings(t.metaHeadIds) } -func (t *Tree) ACLHeads() []string { - var aclTreeHeads []string - for _, head := range t.Heads() { - if slice.FindPos(aclTreeHeads, head) != -1 { // do not scan known heads - continue - } - precedingHeads := t.getPrecedingACLHeads(head) - - for _, aclHead := range precedingHeads { - if slice.FindPos(aclTreeHeads, aclHead) != -1 { - continue - } - aclTreeHeads = append(aclTreeHeads, aclHead) - } - } - return aclTreeHeads -} - -func (t *Tree) getPrecedingACLHeads(head string) []string { - headChange := t.attached[head] - - if headChange.Content.GetAclData() != nil { - return []string{head} - } else { - return headChange.Content.AclHeadIds - } -} - func (t *Tree) iterate(start *Change, f func(c *Change) (isContinue bool)) { it := newIterator() defer freeIterator(it) diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index 44da7c6d..b243c0b4 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -223,8 +223,8 @@ func (tb *treeBuilder) makeVerifiedChange(change *aclpb.RawChange) (aclChange *a return } -func (tb *treeBuilder) makeUnverifiedACLChange(change *aclpb.RawChange) (aclChange *aclpb.ACLChange, err error) { - aclChange = new(aclpb.ACLChange) +func (tb *treeBuilder) makeUnverifiedACLChange(change *aclpb.RawChange) (aclChange *aclpb.Change, err error) { + aclChange = new(aclpb.Change) err = proto.Unmarshal(change.Payload, aclChange) return } diff --git a/pkg/acl/tree/treegraph.go b/pkg/acl/tree/treegraph.go new file mode 100644 index 00000000..67cd42bd --- /dev/null +++ b/pkg/acl/tree/treegraph.go @@ -0,0 +1,11 @@ +//go:build ((!linux && !darwin) || android || ios || nographviz) && !amd64 +// +build !linux,!darwin android ios nographviz +// +build !amd64 + +package tree + +import "fmt" + +func (t *Tree) Graph(parser DescriptionParser) (data []string, err error) { + return "", fmt.Errorf("not supported") +} diff --git a/pkg/acl/tree/treegraph_nix.go b/pkg/acl/tree/treegraph_nix.go new file mode 100644 index 00000000..c506c9b3 --- /dev/null +++ b/pkg/acl/tree/treegraph_nix.go @@ -0,0 +1,121 @@ +//go:build (linux || darwin) && !android && !ios && !nographviz && (amd64 || arm64) +// +build linux darwin +// +build !android +// +build !ios +// +build !nographviz +// +build amd64 arm64 + +package tree + +import ( + "bytes" + "fmt" + "github.com/goccy/go-graphviz" + "github.com/goccy/go-graphviz/cgraph" + "strings" + "time" +) + +func (t *Tree) Graph(parser DescriptionParser) (data string, err error) { + var order = make(map[string]string) + var seq = 0 + t.Iterate(t.RootId(), func(c *Change) (isContinue bool) { + v := order[c.Id] + if v == "" { + order[c.Id] = fmt.Sprint(seq) + } else { + order[c.Id] = fmt.Sprintf("%s,%d", v, seq) + } + seq++ + return true + }) + g := graphviz.New() + defer g.Close() + graph, err := g.Graph() + if err != nil { + return + } + defer func() { + err = graph.Close() + }() + var nodes = make(map[string]*cgraph.Node) + var addChange = func(c *Change) error { + n, e := graph.CreateNode(c.Id) + if e != nil { + return e + } + n.SetStyle(cgraph.FilledNodeStyle) + nodes[c.Id] = n + ord := order[c.Id] + if ord == "" { + ord = "miss" + } + chSymbs, err := parser.ParseChange(c) + if err != nil { + return err + } + + shortId := c.Id + label := fmt.Sprintf("Id: %s\nOrd: %s\nTime: %s\nChanges: %s\n", + shortId, + ord, + time.Unix(c.Content.Timestamp, 0).Format("02.01.06 15:04:05"), + strings.Join(chSymbs, ","), + ) + n.SetLabel(label) + return nil + } + for _, c := range t.attached { + if err = addChange(c); err != nil { + return + } + } + for _, c := range t.unAttached { + if err = addChange(c); err != nil { + return + } + } + var getNode = func(id string) (*cgraph.Node, error) { + if n, ok := nodes[id]; ok { + return n, nil + } + n, err := graph.CreateNode(fmt.Sprintf("%s: not in Tree", id)) + if err != nil { + return nil, err + } + nodes[id] = n + return n, nil + } + var addLinks = func(c *Change) error { + for _, prevId := range c.PreviousIds { + self, e := getNode(c.Id) + if e != nil { + return e + } + prev, e := getNode(prevId) + if e != nil { + return e + } + _, e = graph.CreateEdge("", self, prev) + if e != nil { + return e + } + } + return nil + } + for _, c := range t.attached { + if err = addLinks(c); err != nil { + return + } + } + for _, c := range t.unAttached { + if err = addLinks(c); err != nil { + return + } + } + var buf bytes.Buffer + if err = g.Render(graph, "dot", &buf); err != nil { + return + } + return buf.String(), nil +} diff --git a/pkg/acl/tree/treeiterator.go b/pkg/acl/tree/treeiterator.go new file mode 100644 index 00000000..2bc1db58 --- /dev/null +++ b/pkg/acl/tree/treeiterator.go @@ -0,0 +1,158 @@ +package tree + +import "sync" + +var itPool = &sync.Pool{ + New: func() interface{} { + return &iterator{} + }, +} + +func newIterator() *iterator { + return itPool.Get().(*iterator) +} + +func freeIterator(i *iterator) { + itPool.Put(i) +} + +type iterator struct { + compBuf []*Change + queue []*Change + doneMap map[*Change]struct{} + breakpoint *Change + f func(c *Change) bool +} + +func (i *iterator) iterateSkip(start *Change, skipBefore *Change, f func(c *Change) (isContinue bool)) { + skipping := true + i.iterate(start, func(c *Change) (isContinue bool) { + if skipping && c != skipBefore { + return true + } + skipping = false + return f(c) + }) +} + +func (i *iterator) iterate(start *Change, f func(c *Change) (isContinue bool)) { + if start == nil { + return + } + // reset + i.queue = i.queue[:0] + i.compBuf = i.compBuf[:0] + i.doneMap = make(map[*Change]struct{}) + i.queue = append(i.queue, start) + i.breakpoint = nil + i.f = f + + for len(i.queue) > 0 { + c := i.queue[0] + i.queue = i.queue[1:] + nl := len(c.Next) + if nl == 1 { + if !i.iterateLin(c) { + return + } + if i.breakpoint != nil { + i.toQueue(i.breakpoint) + i.breakpoint = nil + } + } else { + _, done := i.doneMap[c] + if !done { + if !f(c) { + return + } + i.doneMap[c] = struct{}{} + } + if nl != 0 { + for _, next := range c.Next { + i.toQueue(next) + } + } + } + } +} + +func (i *iterator) iterateLin(c *Change) bool { + for len(c.Next) == 1 { + _, done := i.doneMap[c] + if !done { + if !i.f(c) { + return false + } + i.doneMap[c] = struct{}{} + } + + c = c.Next[0] + if len(c.PreviousIds) > 1 { + break + } + } + if len(c.Next) == 0 && len(c.PreviousIds) <= 1 { + if !i.f(c) { + return false + } + i.doneMap[c] = struct{}{} + } else { + i.breakpoint = c + } + + return true +} + +func (i *iterator) comp(c1, c2 *Change) uint8 { + if c1.Id == c2.Id { + return 0 + } + i.compBuf = i.compBuf[:0] + i.compBuf = append(i.compBuf, c1.Next...) + var uniq = make(map[*Change]struct{}) + var appendUniqueToBuf = func(next []*Change) { + for _, n := range next { + if _, ok := uniq[n]; !ok { + i.compBuf = append(i.compBuf, n) + uniq[n] = struct{}{} + } + } + } + var used int + for len(i.compBuf)-used > 0 { + l := len(i.compBuf) - used + for _, n := range i.compBuf[used:] { + delete(uniq, n) + if n.Id == c2.Id { + return 1 + } else { + appendUniqueToBuf(n.Next) + } + } + used += l + } + return 2 +} + +func (i *iterator) toQueue(c *Change) { + var pos = -1 +For: + for idx, qc := range i.queue { + switch i.comp(c, qc) { + // exists + case 0: + return + // + case 1: + pos = idx + break For + } + } + if pos == -1 { + i.queue = append(i.queue, c) + } else if pos == 0 { + i.queue = append([]*Change{c}, i.queue...) + } else { + i.queue = append(i.queue[:pos], append([]*Change{c}, i.queue[pos:]...)...) + } +} From ddf976e240ecd0f8052a18454134af25d217d9fc Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 10 Aug 2022 12:00:22 +0200 Subject: [PATCH 003/219] Add tree removal for state build --- pkg/acl/tree/aclstatebuilder.go | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/pkg/acl/tree/aclstatebuilder.go b/pkg/acl/tree/aclstatebuilder.go index 681198b7..e527c86f 100644 --- a/pkg/acl/tree/aclstatebuilder.go +++ b/pkg/acl/tree/aclstatebuilder.go @@ -55,7 +55,15 @@ func (sb *aclStateBuilder) BuildBefore(beforeId string) (*ACLState, bool, error) return state, true, nil } - sb.tree.IterateSkip(sb.tree.root.Id, startChange.Id, func(c *Change) (isContinue bool) { + iterFunc := func(c *Change) (isContinue bool) { + defer func() { + if err == nil { + startChange = c + } else if err != ErrDocumentForbidden { + //log.Errorf("marking change %s as invalid: %v", c.Id, err) + sb.tree.RemoveInvalidChange(c.Id) + } + }() err = state.applyChange(c) if err != nil { return false @@ -73,7 +81,22 @@ func (sb *aclStateBuilder) BuildBefore(beforeId string) (*ACLState, bool, error) } return true - }) + } + + for { + sb.tree.IterateSkip(sb.tree.root.Id, startChange.Id, iterFunc) + if err == nil { + break + } + + // the user is forbidden to access the document + if err == ErrDocumentForbidden { + return nil, foundId, err + } + + // otherwise we have to continue from the change which we had + err = nil + } return state, foundId, err } From b7190b6a742a1fc7cd5f833d4c35099572d7cd38 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 10 Aug 2022 12:53:15 +0200 Subject: [PATCH 004/219] Add read and write methods for treecache --- service/api/service.go | 2 +- service/sync/document/service.go | 2 +- service/sync/requesthandler/requesthandler.go | 6 ++--- service/treecache/service.go | 23 ++++++++++++++++--- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/service/api/service.go b/service/api/service.go index 8ab7eb26..0f8e5453 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -79,7 +79,7 @@ func (s *service) treeDump(w http.ResponseWriter, req *http.Request) { dump string err error ) - err = s.treeCache.Do(context.Background(), treeId, func(tree acltree.ACLTree) error { + err = s.treeCache.DoWrite(context.Background(), treeId, func(tree acltree.ACLTree) error { dump, err = tree.DebugDump() if err != nil { return err diff --git a/service/sync/document/service.go b/service/sync/document/service.go index b684e64b..ba9df31c 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -71,7 +71,7 @@ func (s *service) UpdateDocument(ctx context.Context, id, text string) (err erro log.With(zap.String("id", id), zap.String("text", text)). Debug("updating document") - err = s.treeCache.Do(ctx, id, func(tree acltree.ACLTree) error { + err = s.treeCache.DoWrite(ctx, id, func(tree acltree.ACLTree) error { ch, err = tree.AddContent(ctx, func(builder acltree.ChangeBuilder) error { builder.AddChangeContent( &testchangepb.PlainTextChangeData{ diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 2eb70551..12908a24 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -79,7 +79,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, log.With(zap.String("peerId", senderId), zap.String("treeId", update.TreeId)). Debug("processing head update") - err = r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { + err = r.treeCache.DoWrite(ctx, update.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes result, err = tree.AddRawChanges(ctx, update.Changes...) if err != nil { @@ -133,7 +133,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str log.With(zap.String("peerId", senderId), zap.String("treeId", request.TreeId)). Debug("processing full sync request") - err = r.treeCache.Do(ctx, request.TreeId, func(tree acltree.ACLTree) error { + err = r.treeCache.DoWrite(ctx, request.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes // if we have non-empty request if len(request.Heads) != 0 { @@ -177,7 +177,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st log.With(zap.String("peerId", senderId), zap.String("treeId", response.TreeId)). Debug("processing full sync response") - err = r.treeCache.Do(ctx, response.TreeId, func(tree acltree.ACLTree) error { + err = r.treeCache.DoWrite(ctx, response.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes result, err = tree.AddRawChanges(ctx, response.Changes...) if err != nil { diff --git a/service/treecache/service.go b/service/treecache/service.go index 687300f0..dc334ea3 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -22,7 +22,8 @@ type ChangeBuildFunc = func(builder acltree.ChangeBuilder) error var log = logger.NewNamed("treecache") type Service interface { - Do(ctx context.Context, treeId string, f ACLTreeFunc) error + DoWrite(ctx context.Context, treeId string, f ACLTreeFunc) error + DoRead(ctx context.Context, treeId string, f ACLTreeFunc) error Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error Create(ctx context.Context, build ChangeBuildFunc, f ACLTreeFunc) error } @@ -49,10 +50,10 @@ func (s *service) Create(ctx context.Context, build ChangeBuildFunc, f ACLTreeFu return err } - return s.Do(ctx, id, f) + return s.DoWrite(ctx, id, f) } -func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error { +func (s *service) DoWrite(ctx context.Context, treeId string, f ACLTreeFunc) error { log. With(zap.String("treeId", treeId)). Debug("requesting tree from cache to perform operation") @@ -68,6 +69,22 @@ func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error { return f(tree.(acltree.ACLTree)) } +func (s *service) DoRead(ctx context.Context, treeId string, f ACLTreeFunc) error { + log. + With(zap.String("treeId", treeId)). + Debug("requesting tree from cache to perform operation") + + tree, err := s.cache.Get(ctx, treeId) + defer s.cache.Release(treeId) + if err != nil { + return err + } + aclTree := tree.(acltree.ACLTree) + aclTree.RLock() + defer aclTree.RUnlock() + return f(tree.(acltree.ACLTree)) +} + func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error { log. With(zap.String("treeId", treeId), zap.Int("len(changes)", len(changes))). From 103c8a4aeffea8521fbac407af2ea3298ce39ee0 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 10 Aug 2022 14:48:17 +0200 Subject: [PATCH 005/219] Further work acltree, aclstate etc --- pkg/acl/tree/aclstate.go | 52 ++-- pkg/acl/tree/aclstatebuilder.go | 4 +- pkg/acl/tree/acltree.go | 78 ++++-- pkg/acl/tree/change.go | 2 +- pkg/acl/tree/changebuilder.go | 71 ++---- pkg/acl/tree/changevalidator.go | 19 ++ pkg/acl/tree/descriptionparser.go | 4 +- pkg/acl/tree/doctree.go | 398 ++++++++++++++++++++++++++++++ 8 files changed, 537 insertions(+), 91 deletions(-) create mode 100644 pkg/acl/tree/changevalidator.go create mode 100644 pkg/acl/tree/doctree.go diff --git a/pkg/acl/tree/aclstate.go b/pkg/acl/tree/aclstate.go index 85cf3a90..fdd796e0 100644 --- a/pkg/acl/tree/aclstate.go +++ b/pkg/acl/tree/aclstate.go @@ -50,18 +50,12 @@ func newACLState() *ACLState { } } -func (st *ACLState) applyChange(changeWrapper *Change) (err error) { - change := changeWrapper.Content +func (st *ACLState) applyChange(change *aclpb.Change) (err error) { aclData := &aclpb.ACLChangeACLData{} - if changeWrapper.DecryptedModel != nil { - aclData = changeWrapper.DecryptedModel.(*aclpb.ACLChangeACLData) - } else { - err = proto.Unmarshal(change.ChangesData, aclData) - if err != nil { - return - } - changeWrapper.DecryptedModel = aclData + err = proto.Unmarshal(change.ChangesData, aclData) + if err != nil { + return } defer func() { @@ -71,23 +65,51 @@ func (st *ACLState) applyChange(changeWrapper *Change) (err error) { st.currentReadKeyHash = change.CurrentReadKeyHash }() + return st.applyChangeData(aclData, change.CurrentReadKeyHash, change.Identity) +} + +func (st *ACLState) applyChangeAndUpdate(changeWrapper *Change) (err error) { + change := changeWrapper.Content + aclData := &aclpb.ACLChangeACLData{} + + if changeWrapper.ParsedModel != nil { + aclData = changeWrapper.ParsedModel.(*aclpb.ACLChangeACLData) + } else { + err = proto.Unmarshal(change.ChangesData, aclData) + if err != nil { + return + } + changeWrapper.ParsedModel = aclData + } + + return st.applyChangeData(aclData, changeWrapper.Content.CurrentReadKeyHash, changeWrapper.Content.Identity) +} + +func (st *ACLState) applyChangeData(changeData *aclpb.ACLChangeACLData, hash uint64, identity string) (err error) { + defer func() { + if err != nil { + return + } + st.currentReadKeyHash = hash + }() + // we can't check this for the user which is joining, because it will not be in our list // the same is for the first change to be added - skipIdentityCheck := st.isUserJoin(aclData) || (st.currentReadKeyHash == 0 && st.isUserAdd(aclData, change.Identity)) + skipIdentityCheck := st.isUserJoin(changeData) || (st.currentReadKeyHash == 0 && st.isUserAdd(changeData, identity)) if !skipIdentityCheck { // we check signature when we add this to the Tree, so no need to do it here - if _, exists := st.userStates[change.Identity]; !exists { + if _, exists := st.userStates[identity]; !exists { err = ErrNoSuchUser return } - if !st.hasPermission(change.Identity, aclpb.ACLChange_Admin) { - err = fmt.Errorf("user %s must have admin permissions", change.Identity) + if !st.hasPermission(identity, aclpb.ACLChange_Admin) { + err = fmt.Errorf("user %s must have admin permissions", identity) return } } - for _, ch := range aclData.GetAclContent() { + for _, ch := range changeData.GetAclContent() { if err = st.applyChangeContent(ch); err != nil { log.Infof("error while applying changes: %v; ignore", err) return err diff --git a/pkg/acl/tree/aclstatebuilder.go b/pkg/acl/tree/aclstatebuilder.go index e527c86f..4fd125e9 100644 --- a/pkg/acl/tree/aclstatebuilder.go +++ b/pkg/acl/tree/aclstatebuilder.go @@ -60,11 +60,11 @@ func (sb *aclStateBuilder) BuildBefore(beforeId string) (*ACLState, bool, error) if err == nil { startChange = c } else if err != ErrDocumentForbidden { - //log.Errorf("marking change %s as invalid: %v", c.Id, err) + log.Errorf("marking change %s as invalid: %v", c.Id, err) sb.tree.RemoveInvalidChange(c.Id) } }() - err = state.applyChange(c) + err = state.applyChangeAndUpdate(c) if err != nil { return false } diff --git a/pkg/acl/tree/acltree.go b/pkg/acl/tree/acltree.go index 4b658477..5e393022 100644 --- a/pkg/acl/tree/acltree.go +++ b/pkg/acl/tree/acltree.go @@ -7,6 +7,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "go.uber.org/zap" "sync" ) @@ -53,7 +54,7 @@ type ACLTree interface { ID() string Header() *treepb.TreeHeader ACLState() *ACLState - AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*aclpb.RawChange, error) + AddContent(ctx context.Context, f func(builder ACLChangeBuilder) error) (*aclpb.RawChange, error) AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) Heads() []string Root() *Change @@ -80,18 +81,15 @@ type aclTree struct { treeBuilder *treeBuilder aclStateBuilder *aclStateBuilder - changeBuilder *changeBuilder + changeBuilder *aclChangeBuilder sync.RWMutex } -func BuildACLTreeWithIdentity( - t treestorage.TreeStorage, - acc *account.AccountData, - listener TreeUpdateListener) (ACLTree, error) { +func BuildACLTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountData, listener TreeUpdateListener) (ACLTree, error) { treeBuilder := newTreeBuilder(t, acc.Decoder) aclStateBuilder := newACLStateBuilderWithIdentity(acc.Decoder, acc) - changeBuilder := newChangeBuilder() + changeBuilder := newACLChangeBuilder() aclTree := &aclTree{ treeStorage: t, @@ -129,8 +127,44 @@ func BuildACLTreeWithIdentity( return aclTree, nil } -func BuildACLTree(t treestorage.TreeStorage) { - // TODO: Add logic for building without identity +func BuildACLTree(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder, listener TreeUpdateListener) (ACLTree, error) { + treeBuilder := newTreeBuilder(t, decoder) + aclStateBuilder := newACLStateBuilder() + changeBuilder := newACLChangeBuilder() + + aclTree := &aclTree{ + treeStorage: t, + tree: nil, + aclState: nil, + treeBuilder: treeBuilder, + aclStateBuilder: aclStateBuilder, + changeBuilder: changeBuilder, + updateListener: listener, + } + err := aclTree.rebuildFromStorage() + if err != nil { + return nil, err + } + err = aclTree.removeOrphans() + if err != nil { + return nil, err + } + err = t.SetHeads(aclTree.Heads()) + if err != nil { + return nil, err + } + aclTree.id, err = t.TreeID() + if err != nil { + return nil, err + } + aclTree.header, err = t.Header() + if err != nil { + return nil, err + } + + listener.Rebuild(aclTree) + + return aclTree, nil } func (a *aclTree) removeOrphans() error { @@ -189,14 +223,16 @@ func (a *aclTree) Storage() treestorage.TreeStorage { return a.treeStorage } -func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuilder) error) (*aclpb.RawChange, error) { +func (a *aclTree) AddContent(ctx context.Context, build func(builder ACLChangeBuilder) error) (*aclpb.RawChange, error) { if a.accountData == nil { return nil, ErrTreeWithoutIdentity } defer func() { // TODO: should this be called in a separate goroutine to prevent accidental cycles (tree->updater->tree) - a.updateListener.Update(a) + if a.updateListener != nil { + a.updateListener.Update(a) + } }() a.changeBuilder.Init(a.aclState, a.tree, a.accountData) @@ -258,13 +294,15 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha return } - switch mode { - case Append: - a.updateListener.Update(a) - case Rebuild: - a.updateListener.Rebuild(a) - default: - break + if a.updateListener != nil { + switch mode { + case Append: + a.updateListener.Update(a) + case Rebuild: + a.updateListener.Rebuild(a) + default: + break + } } }() @@ -386,7 +424,7 @@ func (a *aclTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh // if this is non-empty request if !isNewDocument { - commonSnapshot, err = a.commonSnapshotForTwoPaths(ourPath, theirPath) + commonSnapshot, err = commonSnapshotForTwoPaths(ourPath, theirPath) if err != nil { return nil, err } @@ -437,7 +475,7 @@ func (a *aclTree) DebugDump() (string, error) { return a.tree.Graph(ACLDescriptionParser) } -func (a *aclTree) commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) { +func commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) { var i int var j int log.With(zap.Strings("our path", ourPath), zap.Strings("their path", theirPath)). diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index 9fcd2006..3ee4d05d 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -23,7 +23,7 @@ type Change struct { SnapshotId string IsSnapshot bool DecryptedChange []byte // TODO: check if we need it - DecryptedModel interface{} + ParsedModel interface{} Content *aclpb.Change Sign []byte diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index 8ecfaafb..fc390f4a 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -15,33 +15,25 @@ type MarshalledChange = []byte type ACLChangeBuilder interface { UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChangeUserPermissions) error - AddId(id string) // TODO: this is only for testing - SetMakeSnapshot(bool) // TODO: who should decide this? probably ACLTree so we can delete it + AddId(id string) // TODO: this is only for testing } -type ChangeBuilder interface { - ACLChangeBuilder - AddChangeContent(marshaler proto.Marshaler) // user code should be responsible for making regular snapshots -} - -type changeBuilder struct { +type aclChangeBuilder struct { aclState *ACLState tree *Tree acc *account.AccountData - aclData *aclpb.ACLChangeACLData - changeContent proto.Marshaler - id string - makeSnapshot bool - readKey *symmetric.Key - readKeyHash uint64 + aclData *aclpb.ACLChangeACLData + id string + readKey *symmetric.Key + readKeyHash uint64 } -func newChangeBuilder() *changeBuilder { - return &changeBuilder{} +func newACLChangeBuilder() *aclChangeBuilder { + return &aclChangeBuilder{} } -func (c *changeBuilder) Init(state *ACLState, tree *Tree, acc *account.AccountData) { +func (c *aclChangeBuilder) Init(state *ACLState, tree *Tree, acc *account.AccountData) { c.aclState = state c.tree = tree c.acc = acc @@ -60,15 +52,11 @@ func (c *changeBuilder) Init(state *ACLState, tree *Tree, acc *account.AccountDa } } -func (c *changeBuilder) AddId(id string) { +func (c *aclChangeBuilder) AddId(id string) { c.id = id } -func (c *changeBuilder) SetMakeSnapshot(b bool) { - c.makeSnapshot = b -} - -func (c *changeBuilder) UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChangeUserPermissions) error { +func (c *aclChangeBuilder) UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChangeUserPermissions) error { var allKeys []*symmetric.Key if c.aclState.currentReadKeyHash != 0 { for _, key := range c.aclState.userReadKeys { @@ -105,38 +93,23 @@ func (c *changeBuilder) UserAdd(identity string, encryptionKey encryptionkey.Pub return nil } -func (c *changeBuilder) BuildAndApply() (*Change, []byte, error) { - aclChange := &aclpb.ACLChange{ +func (c *aclChangeBuilder) BuildAndApply() (*Change, []byte, error) { + aclChange := &aclpb.Change{ TreeHeadIds: c.tree.Heads(), - AclHeadIds: c.tree.ACLHeads(), SnapshotBaseId: c.tree.RootId(), - AclData: c.aclData, CurrentReadKeyHash: c.readKeyHash, Timestamp: int64(time.Now().Nanosecond()), Identity: c.acc.Identity, } - err := c.aclState.applyChange(aclChange) + + marshalledData, err := proto.Marshal(c.aclData) if err != nil { return nil, nil, err } - - if c.makeSnapshot { - c.aclData.AclSnapshot = c.aclState.makeSnapshot() - } - - var marshalled []byte - if c.changeContent != nil { - marshalled, err = c.changeContent.Marshal() - if err != nil { - return nil, nil, err - } - - encrypted, err := c.aclState.userReadKeys[c.aclState.currentReadKeyHash]. - Encrypt(marshalled) - if err != nil { - return nil, nil, err - } - aclChange.ChangesData = encrypted + aclChange.ChangesData = marshalledData + err = c.aclState.applyChange(aclChange) + if err != nil { + return nil, nil, err } fullMarshalledChange, err := proto.Marshal(aclChange) @@ -152,12 +125,8 @@ func (c *changeBuilder) BuildAndApply() (*Change, []byte, error) { return nil, nil, err } ch := NewChange(id, aclChange) - ch.DecryptedDocumentChange = marshalled + ch.ParsedModel = c.aclData ch.Sign = signature return ch, fullMarshalledChange, nil } - -func (c *changeBuilder) AddChangeContent(marshaler proto.Marshaler) { - c.changeContent = marshaler -} diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go new file mode 100644 index 00000000..a11d52c0 --- /dev/null +++ b/pkg/acl/tree/changevalidator.go @@ -0,0 +1,19 @@ +package tree + +type ChangeValidator interface { + ValidateChange(change *Change) error +} + +type defChangeValidator struct { + aclTree ACLTree +} + +func NewDefChangeValidator(aclTree ACLTree) ChangeValidator { + return &defChangeValidator{} +} + +func (c *defChangeValidator) ValidateChange(change *Change) error { + // TODO: add validation logic where we check that the change refers to correct acl heads + // that means that more recent changes should refer to more recent acl heads + return nil +} diff --git a/pkg/acl/tree/descriptionparser.go b/pkg/acl/tree/descriptionparser.go index 92587c40..c483eedc 100644 --- a/pkg/acl/tree/descriptionparser.go +++ b/pkg/acl/tree/descriptionparser.go @@ -20,8 +20,8 @@ func (a aclDescriptionParser) ParseChange(changeWrapper *Change) (res []string, change := changeWrapper.Content aclData := &aclpb.ACLChangeACLData{} - if changeWrapper.DecryptedModel != nil { - aclData = changeWrapper.DecryptedModel.(*aclpb.ACLChangeACLData) + if changeWrapper.ParsedModel != nil { + aclData = changeWrapper.ParsedModel.(*aclpb.ACLChangeACLData) } else { err = proto.Unmarshal(change.ChangesData, aclData) if err != nil { diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go new file mode 100644 index 00000000..20470b01 --- /dev/null +++ b/pkg/acl/tree/doctree.go @@ -0,0 +1,398 @@ +package tree + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" + "github.com/gogo/protobuf/proto" + "go.uber.org/zap" + "sync" +) + +type DocTree interface { + RWLocker + ID() string + Header() *treepb.TreeHeader + AddContent(ctx context.Context, content proto.Marshaler) (*aclpb.RawChange, error) + AddRawChanges(ctx context.Context, validator ChangeValidator, changes ...*aclpb.RawChange) (AddResult, error) + Heads() []string + Root() *Change + Iterate(func(change *Change) bool) + IterateFrom(string, func(change *Change) bool) + HasChange(string) bool + SnapshotPath() []string + ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) + Storage() treestorage.TreeStorage + DebugDump() (string, error) + + Close() error +} + +type docTree struct { + treeStorage treestorage.TreeStorage + accountData *account.AccountData + updateListener TreeUpdateListener + + id string + header *treepb.TreeHeader + tree *Tree + aclState *ACLState + + treeBuilder *treeBuilder + + sync.RWMutex +} + +func BuildDocTreeWithIdentity( + t treestorage.TreeStorage, + acc *account.AccountData, + listener TreeUpdateListener) (DocTree, error) { + treeBuilder := newTreeBuilder(t, acc.Decoder) + aclStateBuilder := newACLStateBuilderWithIdentity(acc.Decoder, acc) + changeBuilder := newChangeBuilder() + + docTree := &docTree{ + treeStorage: t, + accountData: acc, + tree: nil, + aclState: nil, + treeBuilder: treeBuilder, + aclStateBuilder: aclStateBuilder, + changeBuilder: changeBuilder, + updateListener: listener, + } + err := docTree.rebuildFromStorage() + if err != nil { + return nil, err + } + err = docTree.removeOrphans() + if err != nil { + return nil, err + } + err = t.SetHeads(docTree.Heads()) + if err != nil { + return nil, err + } + docTree.id, err = t.TreeID() + if err != nil { + return nil, err + } + docTree.header, err = t.Header() + if err != nil { + return nil, err + } + + listener.Rebuild(docTree) + + return docTree, nil +} + +func BuildACLTree(t treestorage.TreeStorage) { + // TODO: Add logic for building without identity +} + +func (a *docTree) removeOrphans() error { + // removing attached or invalid orphans + var toRemove []string + + orphans, err := a.treeStorage.Orphans() + if err != nil { + return err + } + for _, orphan := range orphans { + if _, exists := a.tree.attached[orphan]; exists { + toRemove = append(toRemove, orphan) + } + if _, exists := a.tree.invalidChanges[orphan]; exists { + toRemove = append(toRemove, orphan) + } + } + return a.treeStorage.RemoveOrphans(toRemove...) +} + +func (a *docTree) rebuildFromStorage() (err error) { + a.treeBuilder.Init() + + a.tree, err = a.treeBuilder.Build(false) + if err != nil { + return err + } + + err = a.aclStateBuilder.Init(a.tree) + if err != nil { + return err + } + + a.aclState, err = a.aclStateBuilder.Build() + if err != nil { + return err + } + + return nil +} + +func (a *docTree) ID() string { + return a.id +} + +func (a *docTree) Header() *treepb.TreeHeader { + return a.header +} + +func (a *docTree) ACLState() *ACLState { + return a.aclState +} + +func (a *docTree) Storage() treestorage.TreeStorage { + return a.treeStorage +} + +func (a *docTree) AddContent(ctx context.Context, build func(builder ChangeBuilder) error) (*aclpb.RawChange, error) { + if a.accountData == nil { + return nil, ErrTreeWithoutIdentity + } + + defer func() { + // TODO: should this be called in a separate goroutine to prevent accidental cycles (tree->updater->tree) + a.updateListener.Update(a) + }() + + a.changeBuilder.Init(a.aclState, a.tree, a.accountData) + err := build(a.changeBuilder) + if err != nil { + return nil, err + } + + ch, marshalled, err := a.changeBuilder.BuildAndApply() + if err != nil { + return nil, err + } + a.tree.AddFast(ch) + rawCh := &aclpb.RawChange{ + Payload: marshalled, + Signature: ch.Signature(), + Id: ch.Id, + } + + err = a.treeStorage.AddRawChange(rawCh) + if err != nil { + return nil, err + } + + err = a.treeStorage.SetHeads([]string{ch.Id}) + if err != nil { + return nil, err + } + return rawCh, nil +} + +func (a *docTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (AddResult, error) { + // TODO: make proper error handling, because there are a lot of corner cases where this will break + var err error + var mode Mode + + var changes []*Change // TODO: = addChangesBuf[:0] ... + for _, ch := range rawChanges { + change, err := NewFromRawChange(ch) + // TODO: think what if we will have incorrect signatures on rawChanges, how everything will work + if err != nil { + continue + } + changes = append(changes, change) + } + + defer func() { + if err != nil { + return + } + + err = a.removeOrphans() + if err != nil { + return + } + + err = a.treeStorage.SetHeads(a.tree.Heads()) + if err != nil { + return + } + + switch mode { + case Append: + a.updateListener.Update(a) + case Rebuild: + a.updateListener.Rebuild(a) + default: + break + } + }() + + getAddedChanges := func() []*aclpb.RawChange { + var added []*aclpb.RawChange + for _, ch := range rawChanges { + if _, exists := a.tree.attached[ch.Id]; exists { + added = append(added, ch) + } + } + return added + } + + for _, ch := range changes { + err = a.treeStorage.AddChange(ch) + if err != nil { + return AddResult{}, err + } + err = a.treeStorage.AddOrphans(ch.Id) + if err != nil { + return AddResult{}, err + } + } + + prevHeads := a.tree.Heads() + mode = a.tree.Add(changes...) + switch mode { + case Nothing: + return AddResult{ + OldHeads: prevHeads, + Heads: prevHeads, + Summary: AddResultSummaryNothing, + }, nil + + case Rebuild: + err = a.rebuildFromStorage() + if err != nil { + return AddResult{}, err + } + + return AddResult{ + OldHeads: prevHeads, + Heads: a.tree.Heads(), + Added: getAddedChanges(), + Summary: AddResultSummaryRebuild, + }, nil + default: + // just rebuilding the state from start without reloading everything from tree storage + // as an optimization we could've started from current heads, but I didn't implement that + a.aclState, err = a.aclStateBuilder.Build() + if err != nil { + return AddResult{}, err + } + + return AddResult{ + OldHeads: prevHeads, + Heads: a.tree.Heads(), + Added: getAddedChanges(), + Summary: AddResultSummaryAppend, + }, nil + } +} + +func (a *docTree) Iterate(f func(change *Change) bool) { + a.tree.Iterate(a.tree.RootId(), f) +} + +func (a *docTree) IterateFrom(s string, f func(change *Change) bool) { + a.tree.Iterate(s, f) +} + +func (a *docTree) HasChange(s string) bool { + _, attachedExists := a.tree.attached[s] + _, unattachedExists := a.tree.unAttached[s] + _, invalidExists := a.tree.invalidChanges[s] + return attachedExists || unattachedExists || invalidExists +} + +func (a *docTree) Heads() []string { + return a.tree.Heads() +} + +func (a *docTree) Root() *Change { + return a.tree.Root() +} + +func (a *docTree) Close() error { + return nil +} + +func (a *docTree) SnapshotPath() []string { + // TODO: think about caching this + + var path []string + // TODO: think that the user may have not all of the snapshots locally + currentSnapshotId := a.tree.RootId() + for currentSnapshotId != "" { + sn, err := a.treeBuilder.loadChange(currentSnapshotId) + if err != nil { + break + } + path = append(path, currentSnapshotId) + currentSnapshotId = sn.SnapshotId + } + return path +} + +func (a *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { + // TODO: think about when the clients will have their full acl tree and thus full snapshots + // but no changes after some of the snapshots + + var ( + isNewDocument = len(theirPath) == 0 + ourPath = a.SnapshotPath() + // by default returning everything we have + commonSnapshot = ourPath[len(ourPath)-1] // TODO: root snapshot, probably it is better to have a specific method in treestorage + err error + ) + + // if this is non-empty request + if !isNewDocument { + commonSnapshot, err = commonSnapshotForTwoPaths(ourPath, theirPath) + if err != nil { + return nil, err + } + } + var rawChanges []*aclpb.RawChange + // using custom load function to skip verification step and save raw changes + load := func(id string) (*Change, error) { + raw, err := a.treeStorage.GetChange(context.Background(), id) + if err != nil { + return nil, err + } + + aclChange, err := a.treeBuilder.makeUnverifiedACLChange(raw) + if err != nil { + return nil, err + } + + ch := NewChange(id, aclChange) + rawChanges = append(rawChanges, raw) + return ch, nil + } + // we presume that we have everything after the common snapshot, though this may not be the case in case of clients and only ACL tree changes + log.With( + zap.Strings("heads", a.tree.Heads()), + zap.String("breakpoint", commonSnapshot), + zap.String("id", a.id)). + Debug("getting all changes from common snapshot") + _, err = a.treeBuilder.dfs(a.tree.Heads(), commonSnapshot, load) + if err != nil { + return nil, err + } + if isNewDocument { + // adding snapshot to raw changes + _, err = load(commonSnapshot) + if err != nil { + return nil, err + } + } + log.With( + zap.Int("len(changes)", len(rawChanges)), + zap.String("id", a.id)). + Debug("returning all changes after common snapshot") + + return rawChanges, nil +} + +func (a *docTree) DebugDump() (string, error) { + return a.tree.Graph(ACLDescriptionParser) +} From 0e3d7cc8caa496bb7d0d4a2763391f2909096362 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 10 Aug 2022 18:10:28 +0200 Subject: [PATCH 006/219] Add doc tree --- pkg/acl/tree/acltree.go | 8 +- pkg/acl/tree/changevalidator.go | 15 +- pkg/acl/tree/descriptionparser.go | 8 + pkg/acl/tree/doctree.go | 282 ++++++++++++------- pkg/acl/treestorage/treepb/protos/tree.proto | 6 + pkg/acl/treestorage/treepb/tree.pb.go | 86 +++++- 6 files changed, 272 insertions(+), 133 deletions(-) diff --git a/pkg/acl/tree/acltree.go b/pkg/acl/tree/acltree.go index 5e393022..2b5563b2 100644 --- a/pkg/acl/tree/acltree.go +++ b/pkg/acl/tree/acltree.go @@ -30,7 +30,7 @@ type AddResult struct { Summary AddResultSummary } -type TreeUpdateListener interface { +type ACLTreeUpdateListener interface { Update(tree ACLTree) Rebuild(tree ACLTree) } @@ -72,7 +72,7 @@ type ACLTree interface { type aclTree struct { treeStorage treestorage.TreeStorage accountData *account.AccountData - updateListener TreeUpdateListener + updateListener ACLTreeUpdateListener id string header *treepb.TreeHeader @@ -86,7 +86,7 @@ type aclTree struct { sync.RWMutex } -func BuildACLTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountData, listener TreeUpdateListener) (ACLTree, error) { +func BuildACLTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountData, listener ACLTreeUpdateListener) (ACLTree, error) { treeBuilder := newTreeBuilder(t, acc.Decoder) aclStateBuilder := newACLStateBuilderWithIdentity(acc.Decoder, acc) changeBuilder := newACLChangeBuilder() @@ -127,7 +127,7 @@ func BuildACLTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountDat return aclTree, nil } -func BuildACLTree(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder, listener TreeUpdateListener) (ACLTree, error) { +func BuildACLTree(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder, listener ACLTreeUpdateListener) (ACLTree, error) { treeBuilder := newTreeBuilder(t, decoder) aclStateBuilder := newACLStateBuilder() changeBuilder := newACLChangeBuilder() diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index a11d52c0..fc2ec75c 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -1,18 +1,15 @@ package tree -type ChangeValidator interface { - ValidateChange(change *Change) error +type DocTreeValidator interface { + ValidateTree(tree *Tree, aclTree ACLTree) error } -type defChangeValidator struct { - aclTree ACLTree -} +type docTreeValidator struct{} -func NewDefChangeValidator(aclTree ACLTree) ChangeValidator { - return &defChangeValidator{} +func newTreeValidator() DocTreeValidator { + return &docTreeValidator{} } - -func (c *defChangeValidator) ValidateChange(change *Change) error { +func (v *docTreeValidator) ValidateTree(tree *Tree, aclTree ACLTree) error { // TODO: add validation logic where we check that the change refers to correct acl heads // that means that more recent changes should refer to more recent acl heads return nil diff --git a/pkg/acl/tree/descriptionparser.go b/pkg/acl/tree/descriptionparser.go index c483eedc..367afdec 100644 --- a/pkg/acl/tree/descriptionparser.go +++ b/pkg/acl/tree/descriptionparser.go @@ -12,6 +12,14 @@ type DescriptionParser interface { ParseChange(*Change) ([]string, error) } +var NoOpDescriptionParser = noopDescriptionParser{} + +type noopDescriptionParser struct{} + +func (n noopDescriptionParser) ParseChange(change *Change) ([]string, error) { + return []string{"DOC"}, nil +} + var ACLDescriptionParser = aclDescriptionParser{} type aclDescriptionParser struct{} diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index 20470b01..a9068b71 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -6,17 +6,25 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/gogo/protobuf/proto" "go.uber.org/zap" "sync" + "time" ) +type TreeUpdateListener interface { + Update(tree DocTree) + Rebuild(tree DocTree) +} + type DocTree interface { RWLocker ID() string Header() *treepb.TreeHeader - AddContent(ctx context.Context, content proto.Marshaler) (*aclpb.RawChange, error) - AddRawChanges(ctx context.Context, validator ChangeValidator, changes ...*aclpb.RawChange) (AddResult, error) + AddContent(ctx context.Context, aclTree ACLTree, content proto.Marshaler, isSnapshot bool) (*aclpb.RawChange, error) + AddRawChanges(ctx context.Context, aclTree ACLTree, changes ...*aclpb.RawChange) (AddResult, error) Heads() []string Root() *Change Iterate(func(change *Change) bool) @@ -41,29 +49,25 @@ type docTree struct { aclState *ACLState treeBuilder *treeBuilder + validator DocTreeValidator sync.RWMutex } -func BuildDocTreeWithIdentity( - t treestorage.TreeStorage, - acc *account.AccountData, - listener TreeUpdateListener) (DocTree, error) { +func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountData, listener TreeUpdateListener, aclTree ACLTree) (DocTree, error) { treeBuilder := newTreeBuilder(t, acc.Decoder) - aclStateBuilder := newACLStateBuilderWithIdentity(acc.Decoder, acc) - changeBuilder := newChangeBuilder() + validator := newTreeValidator() docTree := &docTree{ - treeStorage: t, - accountData: acc, - tree: nil, - aclState: nil, - treeBuilder: treeBuilder, - aclStateBuilder: aclStateBuilder, - changeBuilder: changeBuilder, - updateListener: listener, + treeStorage: t, + accountData: acc, + tree: nil, + aclState: nil, + treeBuilder: treeBuilder, + validator: validator, + updateListener: listener, } - err := docTree.rebuildFromStorage() + err := docTree.rebuildFromStorage(aclTree) if err != nil { return nil, err } @@ -89,106 +93,155 @@ func BuildDocTreeWithIdentity( return docTree, nil } -func BuildACLTree(t treestorage.TreeStorage) { - // TODO: Add logic for building without identity +func BuildDocTree(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder, listener TreeUpdateListener, aclTree ACLTree) (DocTree, error) { + treeBuilder := newTreeBuilder(t, decoder) + validator := newTreeValidator() + + docTree := &docTree{ + treeStorage: t, + tree: nil, + aclState: nil, + treeBuilder: treeBuilder, + validator: validator, + updateListener: listener, + } + err := docTree.rebuildFromStorage(aclTree) + if err != nil { + return nil, err + } + err = docTree.removeOrphans() + if err != nil { + return nil, err + } + err = t.SetHeads(docTree.Heads()) + if err != nil { + return nil, err + } + docTree.id, err = t.TreeID() + if err != nil { + return nil, err + } + docTree.header, err = t.Header() + if err != nil { + return nil, err + } + + listener.Rebuild(docTree) + + return docTree, nil } -func (a *docTree) removeOrphans() error { +func (d *docTree) removeOrphans() error { // removing attached or invalid orphans var toRemove []string - orphans, err := a.treeStorage.Orphans() + orphans, err := d.treeStorage.Orphans() if err != nil { return err } for _, orphan := range orphans { - if _, exists := a.tree.attached[orphan]; exists { + if _, exists := d.tree.attached[orphan]; exists { toRemove = append(toRemove, orphan) } - if _, exists := a.tree.invalidChanges[orphan]; exists { + if _, exists := d.tree.invalidChanges[orphan]; exists { toRemove = append(toRemove, orphan) } } - return a.treeStorage.RemoveOrphans(toRemove...) + return d.treeStorage.RemoveOrphans(toRemove...) } -func (a *docTree) rebuildFromStorage() (err error) { - a.treeBuilder.Init() +func (d *docTree) rebuildFromStorage(aclTree ACLTree) (err error) { + d.treeBuilder.Init() - a.tree, err = a.treeBuilder.Build(false) + d.tree, err = d.treeBuilder.Build(false) if err != nil { return err } - err = a.aclStateBuilder.Init(a.tree) - if err != nil { - return err - } - - a.aclState, err = a.aclStateBuilder.Build() - if err != nil { - return err - } - - return nil + return d.validator.ValidateTree(d.tree, aclTree) } -func (a *docTree) ID() string { - return a.id +func (d *docTree) ID() string { + return d.id } -func (a *docTree) Header() *treepb.TreeHeader { - return a.header +func (d *docTree) Header() *treepb.TreeHeader { + return d.header } -func (a *docTree) ACLState() *ACLState { - return a.aclState +func (d *docTree) Storage() treestorage.TreeStorage { + return d.treeStorage } -func (a *docTree) Storage() treestorage.TreeStorage { - return a.treeStorage -} - -func (a *docTree) AddContent(ctx context.Context, build func(builder ChangeBuilder) error) (*aclpb.RawChange, error) { - if a.accountData == nil { +func (d *docTree) AddContent(ctx context.Context, aclTree ACLTree, content proto.Marshaler, isSnapshot bool) (*aclpb.RawChange, error) { + if d.accountData == nil { return nil, ErrTreeWithoutIdentity } defer func() { // TODO: should this be called in a separate goroutine to prevent accidental cycles (tree->updater->tree) - a.updateListener.Update(a) + d.updateListener.Update(d) }() + state := aclTree.ACLState() + change := &aclpb.Change{ + TreeHeadIds: d.tree.Heads(), + AclHeadIds: aclTree.Heads(), + SnapshotBaseId: d.tree.RootId(), + CurrentReadKeyHash: state.currentReadKeyHash, + Timestamp: int64(time.Now().Nanosecond()), + Identity: d.accountData.Identity, + } - a.changeBuilder.Init(a.aclState, a.tree, a.accountData) - err := build(a.changeBuilder) + marshalledData, err := content.Marshal() if err != nil { return nil, err } - - ch, marshalled, err := a.changeBuilder.BuildAndApply() + encrypted, err := state.userReadKeys[state.currentReadKeyHash].Encrypt(marshalledData) if err != nil { return nil, err } - a.tree.AddFast(ch) + change.ChangesData = encrypted + + fullMarshalledChange, err := proto.Marshal(change) + if err != nil { + return nil, err + } + signature, err := d.accountData.SignKey.Sign(fullMarshalledChange) + if err != nil { + return nil, err + } + id, err := cid.NewCIDFromBytes(fullMarshalledChange) + if err != nil { + return nil, err + } + ch := NewChange(id, change) + ch.ParsedModel = content + ch.Sign = signature + + if isSnapshot { + // clearing tree, because we already fixed everything in the last snapshot + d.tree = &Tree{} + } + d.tree.AddFast(ch) rawCh := &aclpb.RawChange{ - Payload: marshalled, + Payload: fullMarshalledChange, Signature: ch.Signature(), Id: ch.Id, } - err = a.treeStorage.AddRawChange(rawCh) + err = d.treeStorage.AddRawChange(rawCh) if err != nil { return nil, err } - err = a.treeStorage.SetHeads([]string{ch.Id}) + err = d.treeStorage.SetHeads([]string{ch.Id}) if err != nil { return nil, err } return rawCh, nil } -func (a *docTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (AddResult, error) { +func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges ...*aclpb.RawChange) (AddResult, error) { // TODO: make proper error handling, because there are a lot of corner cases where this will break var err error var mode Mode @@ -208,21 +261,21 @@ func (a *docTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha return } - err = a.removeOrphans() + err = d.removeOrphans() if err != nil { return } - err = a.treeStorage.SetHeads(a.tree.Heads()) + err = d.treeStorage.SetHeads(d.tree.Heads()) if err != nil { return } switch mode { case Append: - a.updateListener.Update(a) + d.updateListener.Update(d) case Rebuild: - a.updateListener.Rebuild(a) + d.updateListener.Rebuild(d) default: break } @@ -231,28 +284,49 @@ func (a *docTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha getAddedChanges := func() []*aclpb.RawChange { var added []*aclpb.RawChange for _, ch := range rawChanges { - if _, exists := a.tree.attached[ch.Id]; exists { + if _, exists := d.tree.attached[ch.Id]; exists { added = append(added, ch) } } return added } - for _, ch := range changes { - err = a.treeStorage.AddChange(ch) + prevHeads := d.tree.Heads() + rebuild := func() (AddResult, error) { + err = d.rebuildFromStorage(aclTree) if err != nil { return AddResult{}, err } - err = a.treeStorage.AddOrphans(ch.Id) + + return AddResult{ + OldHeads: prevHeads, + Heads: d.tree.Heads(), + Added: getAddedChanges(), + Summary: AddResultSummaryRebuild, + }, nil + } + + for _, ch := range changes { + err = d.treeStorage.AddChange(ch) + if err != nil { + return AddResult{}, err + } + err = d.treeStorage.AddOrphans(ch.Id) if err != nil { return AddResult{}, err } } - prevHeads := a.tree.Heads() - mode = a.tree.Add(changes...) + mode = d.tree.Add(changes...) switch mode { case Nothing: + for _, ch := range changes { + // rebuilding if the snapshot is different from the root + if ch.SnapshotId != d.tree.RootId() { + return rebuild() + } + } + return AddResult{ OldHeads: prevHeads, Heads: prevHeads, @@ -260,69 +334,59 @@ func (a *docTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha }, nil case Rebuild: - err = a.rebuildFromStorage() - if err != nil { - return AddResult{}, err - } - - return AddResult{ - OldHeads: prevHeads, - Heads: a.tree.Heads(), - Added: getAddedChanges(), - Summary: AddResultSummaryRebuild, - }, nil + return rebuild() default: // just rebuilding the state from start without reloading everything from tree storage // as an optimization we could've started from current heads, but I didn't implement that - a.aclState, err = a.aclStateBuilder.Build() + err = d.validator.ValidateTree(d.tree, aclTree) if err != nil { return AddResult{}, err } return AddResult{ OldHeads: prevHeads, - Heads: a.tree.Heads(), + Heads: d.tree.Heads(), Added: getAddedChanges(), Summary: AddResultSummaryAppend, }, nil } } -func (a *docTree) Iterate(f func(change *Change) bool) { - a.tree.Iterate(a.tree.RootId(), f) +func (d *docTree) Iterate(f func(change *Change) bool) { + d.tree.Iterate(d.tree.RootId(), f) } -func (a *docTree) IterateFrom(s string, f func(change *Change) bool) { - a.tree.Iterate(s, f) +func (d *docTree) IterateFrom(s string, f func(change *Change) bool) { + d.tree.Iterate(s, f) } -func (a *docTree) HasChange(s string) bool { - _, attachedExists := a.tree.attached[s] - _, unattachedExists := a.tree.unAttached[s] - _, invalidExists := a.tree.invalidChanges[s] +func (d *docTree) HasChange(s string) bool { + _, attachedExists := d.tree.attached[s] + _, unattachedExists := d.tree.unAttached[s] + _, invalidExists := d.tree.invalidChanges[s] return attachedExists || unattachedExists || invalidExists } -func (a *docTree) Heads() []string { - return a.tree.Heads() +func (d *docTree) Heads() []string { + return d.tree.Heads() } -func (a *docTree) Root() *Change { - return a.tree.Root() +func (d *docTree) Root() *Change { + return d.tree.Root() } -func (a *docTree) Close() error { +func (d *docTree) Close() error { return nil } -func (a *docTree) SnapshotPath() []string { +func (d *docTree) SnapshotPath() []string { // TODO: think about caching this var path []string // TODO: think that the user may have not all of the snapshots locally - currentSnapshotId := a.tree.RootId() + currentSnapshotId := d.tree.RootId() for currentSnapshotId != "" { - sn, err := a.treeBuilder.loadChange(currentSnapshotId) + sn, err := d.treeBuilder.loadChange(currentSnapshotId) if err != nil { break } @@ -332,13 +396,13 @@ func (a *docTree) SnapshotPath() []string { return path } -func (a *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { +func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { // TODO: think about when the clients will have their full acl tree and thus full snapshots // but no changes after some of the snapshots var ( isNewDocument = len(theirPath) == 0 - ourPath = a.SnapshotPath() + ourPath = d.SnapshotPath() // by default returning everything we have commonSnapshot = ourPath[len(ourPath)-1] // TODO: root snapshot, probably it is better to have a specific method in treestorage err error @@ -354,12 +418,12 @@ func (a *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh var rawChanges []*aclpb.RawChange // using custom load function to skip verification step and save raw changes load := func(id string) (*Change, error) { - raw, err := a.treeStorage.GetChange(context.Background(), id) + raw, err := d.treeStorage.GetChange(context.Background(), id) if err != nil { return nil, err } - aclChange, err := a.treeBuilder.makeUnverifiedACLChange(raw) + aclChange, err := d.treeBuilder.makeUnverifiedACLChange(raw) if err != nil { return nil, err } @@ -370,11 +434,11 @@ func (a *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh } // we presume that we have everything after the common snapshot, though this may not be the case in case of clients and only ACL tree changes log.With( - zap.Strings("heads", a.tree.Heads()), + zap.Strings("heads", d.tree.Heads()), zap.String("breakpoint", commonSnapshot), - zap.String("id", a.id)). + zap.String("id", d.id)). Debug("getting all changes from common snapshot") - _, err = a.treeBuilder.dfs(a.tree.Heads(), commonSnapshot, load) + _, err = d.treeBuilder.dfs(d.tree.Heads(), commonSnapshot, load) if err != nil { return nil, err } @@ -387,12 +451,12 @@ func (a *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh } log.With( zap.Int("len(changes)", len(rawChanges)), - zap.String("id", a.id)). + zap.String("id", d.id)). Debug("returning all changes after common snapshot") return rawChanges, nil } -func (a *docTree) DebugDump() (string, error) { - return a.tree.Graph(ACLDescriptionParser) +func (d *docTree) DebugDump() (string, error) { + return d.tree.Graph(NoOpDescriptionParser) } diff --git a/pkg/acl/treestorage/treepb/protos/tree.proto b/pkg/acl/treestorage/treepb/protos/tree.proto index eb342673..daf33e89 100644 --- a/pkg/acl/treestorage/treepb/protos/tree.proto +++ b/pkg/acl/treestorage/treepb/protos/tree.proto @@ -5,5 +5,11 @@ option go_package = "treepb"; message TreeHeader { string firstChangeId = 1; bool isWorkspace = 2; + TreeType type = 3; // TODO: add user identity, signature and nano timestamp + + enum TreeType { + ACLTree = 0; + DocTree = 1; + } } \ No newline at end of file diff --git a/pkg/acl/treestorage/treepb/tree.pb.go b/pkg/acl/treestorage/treepb/tree.pb.go index 7baa874c..bf05bfd8 100644 --- a/pkg/acl/treestorage/treepb/tree.pb.go +++ b/pkg/acl/treestorage/treepb/tree.pb.go @@ -22,9 +22,35 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +type TreeHeaderTreeType int32 + +const ( + TreeHeader_ACLTree TreeHeaderTreeType = 0 + TreeHeader_DocTree TreeHeaderTreeType = 1 +) + +var TreeHeaderTreeType_name = map[int32]string{ + 0: "ACLTree", + 1: "DocTree", +} + +var TreeHeaderTreeType_value = map[string]int32{ + "ACLTree": 0, + "DocTree": 1, +} + +func (x TreeHeaderTreeType) String() string { + return proto.EnumName(TreeHeaderTreeType_name, int32(x)) +} + +func (TreeHeaderTreeType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_e7d760b855878644, []int{0, 0} +} + type TreeHeader struct { - FirstChangeId string `protobuf:"bytes,1,opt,name=firstChangeId,proto3" json:"firstChangeId,omitempty"` - IsWorkspace bool `protobuf:"varint,2,opt,name=isWorkspace,proto3" json:"isWorkspace,omitempty"` + FirstChangeId string `protobuf:"bytes,1,opt,name=firstChangeId,proto3" json:"firstChangeId,omitempty"` + IsWorkspace bool `protobuf:"varint,2,opt,name=isWorkspace,proto3" json:"isWorkspace,omitempty"` + Type TreeHeaderTreeType `protobuf:"varint,3,opt,name=type,proto3,enum=tree.TreeHeaderTreeType" json:"type,omitempty"` } func (m *TreeHeader) Reset() { *m = TreeHeader{} } @@ -74,7 +100,15 @@ func (m *TreeHeader) GetIsWorkspace() bool { return false } +func (m *TreeHeader) GetType() TreeHeaderTreeType { + if m != nil { + return m.Type + } + return TreeHeader_ACLTree +} + func init() { + proto.RegisterEnum("tree.TreeHeaderTreeType", TreeHeaderTreeType_name, TreeHeaderTreeType_value) proto.RegisterType((*TreeHeader)(nil), "tree.TreeHeader") } @@ -83,18 +117,21 @@ func init() { } var fileDescriptor_e7d760b855878644 = []byte{ - // 165 bytes of a gzipped FileDescriptorProto + // 220 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x29, 0xc8, 0x4e, 0xd7, 0x4f, 0x4c, 0xce, 0xd1, 0x2f, 0x29, 0x4a, 0x4d, 0x2d, 0x2e, 0xc9, 0x2f, 0x4a, 0x4c, 0x4f, 0x05, 0xb3, 0x0b, 0x92, 0xf4, 0x0b, 0x8a, 0xf2, 0x4b, 0xf2, 0x8b, 0xc1, 0x3c, 0x3d, 0x30, 0x5b, 0x88, - 0x05, 0xc4, 0x56, 0x0a, 0xe1, 0xe2, 0x0a, 0x29, 0x4a, 0x4d, 0xf5, 0x48, 0x4d, 0x4c, 0x49, 0x2d, - 0x12, 0x52, 0xe1, 0xe2, 0x4d, 0xcb, 0x2c, 0x2a, 0x2e, 0x71, 0xce, 0x48, 0xcc, 0x4b, 0x4f, 0xf5, - 0x4c, 0x91, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x42, 0x15, 0x14, 0x52, 0xe0, 0xe2, 0xce, 0x2c, - 0x0e, 0xcf, 0x2f, 0xca, 0x2e, 0x2e, 0x48, 0x4c, 0x4e, 0x95, 0x60, 0x52, 0x60, 0xd4, 0xe0, 0x08, - 0x42, 0x16, 0x72, 0x52, 0x38, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, - 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0x36, - 0x88, 0x7b, 0x92, 0xd8, 0xc0, 0x8e, 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x09, 0x4f, 0xc6, - 0xec, 0xb4, 0x00, 0x00, 0x00, + 0x05, 0xc4, 0x56, 0x5a, 0xc9, 0xc8, 0xc5, 0x15, 0x52, 0x94, 0x9a, 0xea, 0x91, 0x9a, 0x98, 0x92, + 0x5a, 0x24, 0xa4, 0xc2, 0xc5, 0x9b, 0x96, 0x59, 0x54, 0x5c, 0xe2, 0x9c, 0x91, 0x98, 0x97, 0x9e, + 0xea, 0x99, 0x22, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x84, 0x2a, 0x28, 0xa4, 0xc0, 0xc5, 0x9d, + 0x59, 0x1c, 0x9e, 0x5f, 0x94, 0x5d, 0x5c, 0x90, 0x98, 0x9c, 0x2a, 0xc1, 0xa4, 0xc0, 0xa8, 0xc1, + 0x11, 0x84, 0x2c, 0x24, 0xa4, 0xcb, 0xc5, 0x52, 0x52, 0x59, 0x90, 0x2a, 0xc1, 0xac, 0xc0, 0xa8, + 0xc1, 0x67, 0x24, 0xa9, 0x07, 0xb6, 0x17, 0x61, 0x0f, 0x98, 0x19, 0x52, 0x59, 0x90, 0x1a, 0x04, + 0x56, 0xa6, 0xa4, 0xc2, 0xc5, 0x01, 0x13, 0x11, 0xe2, 0xe6, 0x62, 0x77, 0x74, 0xf6, 0x01, 0x71, + 0x05, 0x18, 0x40, 0x1c, 0x97, 0xfc, 0x64, 0x30, 0x87, 0xd1, 0x49, 0xe1, 0xc4, 0x23, 0x39, 0xc6, + 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, + 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0xd8, 0x20, 0xbe, 0x4c, 0x62, 0x03, 0x7b, 0xcd, 0x18, 0x10, + 0x00, 0x00, 0xff, 0xff, 0x72, 0x29, 0xbc, 0x0e, 0x0a, 0x01, 0x00, 0x00, } func (m *TreeHeader) Marshal() (dAtA []byte, err error) { @@ -117,6 +154,11 @@ func (m *TreeHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Type != 0 { + i = encodeVarintTree(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x18 + } if m.IsWorkspace { i-- if m.IsWorkspace { @@ -161,6 +203,9 @@ func (m *TreeHeader) Size() (n int) { if m.IsWorkspace { n += 2 } + if m.Type != 0 { + n += 1 + sovTree(uint64(m.Type)) + } return n } @@ -251,6 +296,25 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { } } m.IsWorkspace = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTree + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= TreeHeaderTreeType(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTree(dAtA[iNdEx:]) From e7956901de7dc763f1ef0fb4cd1c2686597031e7 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 10 Aug 2022 22:16:16 +0200 Subject: [PATCH 007/219] Start tree cache and document rewrite --- pkg/acl/tree/doctree.go | 11 +- pkg/acl/tree/treestorage.go | 129 ++++++++++++++++++ pkg/acl/treestorage/treepb/protos/tree.proto | 1 + pkg/acl/treestorage/treepb/tree.pb.go | 66 ++++++++- service/api/service.go | 2 +- service/sync/document/service.go | 95 ++++++++++--- service/sync/requesthandler/requesthandler.go | 6 +- service/treecache/service.go | 47 +------ 8 files changed, 279 insertions(+), 78 deletions(-) create mode 100644 pkg/acl/tree/treestorage.go diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index a9068b71..8118fedb 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -43,10 +43,9 @@ type docTree struct { accountData *account.AccountData updateListener TreeUpdateListener - id string - header *treepb.TreeHeader - tree *Tree - aclState *ACLState + id string + header *treepb.TreeHeader + tree *Tree treeBuilder *treeBuilder validator DocTreeValidator @@ -62,7 +61,6 @@ func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountDat treeStorage: t, accountData: acc, tree: nil, - aclState: nil, treeBuilder: treeBuilder, validator: validator, updateListener: listener, @@ -100,7 +98,6 @@ func BuildDocTree(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder, l docTree := &docTree{ treeStorage: t, tree: nil, - aclState: nil, treeBuilder: treeBuilder, validator: validator, updateListener: listener, @@ -222,7 +219,7 @@ func (d *docTree) AddContent(ctx context.Context, aclTree ACLTree, content proto // clearing tree, because we already fixed everything in the last snapshot d.tree = &Tree{} } - d.tree.AddFast(ch) + d.tree.AddFast(ch) // TODO: Add head rawCh := &aclpb.RawChange{ Payload: fullMarshalledChange, Signature: ch.Signature(), diff --git a/pkg/acl/tree/treestorage.go b/pkg/acl/tree/treestorage.go new file mode 100644 index 00000000..297f1977 --- /dev/null +++ b/pkg/acl/tree/treestorage.go @@ -0,0 +1,129 @@ +package tree + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/gogo/protobuf/proto" + "time" +) + +func CreateNewTreeStorageWithACL( + acc *account.AccountData, + build func(builder ACLChangeBuilder) error, + create treestorage.CreatorFunc) (treestorage.TreeStorage, error) { + bld := newACLChangeBuilder() + bld.Init( + newACLStateWithIdentity(acc.Identity, acc.EncKey, signingkey.NewEd25519PubKeyDecoder()), + &Tree{}, + acc) + err := build(bld) + if err != nil { + return nil, err + } + + change, payload, err := bld.BuildAndApply() + if err != nil { + return nil, err + } + + rawChange := &aclpb.RawChange{ + Payload: payload, + Signature: change.Signature(), + Id: change.CID(), + } + header, id, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_ACLTree) + if err != nil { + return nil, err + } + + thr, err := create(id, header, []*aclpb.RawChange{rawChange}) + if err != nil { + return nil, err + } + + err = thr.SetHeads([]string{change.CID()}) + if err != nil { + return nil, err + } + return thr, nil +} + +func CreateNewTreeStorage( + acc *account.AccountData, + aclTree ACLTree, + content proto.Marshaler, + create treestorage.CreatorFunc) (treestorage.TreeStorage, error) { + + state := aclTree.ACLState() + change := &aclpb.Change{ + AclHeadIds: aclTree.Heads(), + CurrentReadKeyHash: state.currentReadKeyHash, + Timestamp: int64(time.Now().Nanosecond()), + Identity: acc.Identity, + } + + marshalledData, err := content.Marshal() + if err != nil { + return nil, err + } + encrypted, err := state.userReadKeys[state.currentReadKeyHash].Encrypt(marshalledData) + if err != nil { + return nil, err + } + change.ChangesData = encrypted + + fullMarshalledChange, err := proto.Marshal(change) + if err != nil { + return nil, err + } + signature, err := acc.SignKey.Sign(fullMarshalledChange) + if err != nil { + return nil, err + } + id, err := cid.NewCIDFromBytes(fullMarshalledChange) + if err != nil { + return nil, err + } + + rawChange := &aclpb.RawChange{ + Payload: fullMarshalledChange, + Signature: signature, + Id: id, + } + header, id, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_DocTree) + if err != nil { + return nil, err + } + + thr, err := create(id, header, []*aclpb.RawChange{rawChange}) + if err != nil { + return nil, err + } + + err = thr.SetHeads([]string{id}) + if err != nil { + return nil, err + } + return thr, nil +} + +func createTreeHeaderAndId(change *aclpb.RawChange, treeType treepb.TreeHeaderTreeType) (*treepb.TreeHeader, string, error) { + header := &treepb.TreeHeader{ + FirstChangeId: change.Id, + Type: treeType, + } + marshalledHeader, err := proto.Marshal(header) + if err != nil { + return nil, "", err + } + treeId, err := cid.NewCIDFromBytes(marshalledHeader) + if err != nil { + return nil, "", err + } + + return header, treeId, nil +} diff --git a/pkg/acl/treestorage/treepb/protos/tree.proto b/pkg/acl/treestorage/treepb/protos/tree.proto index daf33e89..419dd19f 100644 --- a/pkg/acl/treestorage/treepb/protos/tree.proto +++ b/pkg/acl/treestorage/treepb/protos/tree.proto @@ -6,6 +6,7 @@ message TreeHeader { string firstChangeId = 1; bool isWorkspace = 2; TreeType type = 3; + string aclTreeId = 4; // TODO: add user identity, signature and nano timestamp enum TreeType { diff --git a/pkg/acl/treestorage/treepb/tree.pb.go b/pkg/acl/treestorage/treepb/tree.pb.go index bf05bfd8..aa0838ef 100644 --- a/pkg/acl/treestorage/treepb/tree.pb.go +++ b/pkg/acl/treestorage/treepb/tree.pb.go @@ -51,6 +51,7 @@ type TreeHeader struct { FirstChangeId string `protobuf:"bytes,1,opt,name=firstChangeId,proto3" json:"firstChangeId,omitempty"` IsWorkspace bool `protobuf:"varint,2,opt,name=isWorkspace,proto3" json:"isWorkspace,omitempty"` Type TreeHeaderTreeType `protobuf:"varint,3,opt,name=type,proto3,enum=tree.TreeHeaderTreeType" json:"type,omitempty"` + AclTreeId string `protobuf:"bytes,4,opt,name=aclTreeId,proto3" json:"aclTreeId,omitempty"` } func (m *TreeHeader) Reset() { *m = TreeHeader{} } @@ -107,6 +108,13 @@ func (m *TreeHeader) GetType() TreeHeaderTreeType { return TreeHeader_ACLTree } +func (m *TreeHeader) GetAclTreeId() string { + if m != nil { + return m.AclTreeId + } + return "" +} + func init() { proto.RegisterEnum("tree.TreeHeaderTreeType", TreeHeaderTreeType_name, TreeHeaderTreeType_value) proto.RegisterType((*TreeHeader)(nil), "tree.TreeHeader") @@ -117,21 +125,22 @@ func init() { } var fileDescriptor_e7d760b855878644 = []byte{ - // 220 bytes of a gzipped FileDescriptorProto + // 237 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x29, 0xc8, 0x4e, 0xd7, 0x4f, 0x4c, 0xce, 0xd1, 0x2f, 0x29, 0x4a, 0x4d, 0x2d, 0x2e, 0xc9, 0x2f, 0x4a, 0x4c, 0x4f, 0x05, 0xb3, 0x0b, 0x92, 0xf4, 0x0b, 0x8a, 0xf2, 0x4b, 0xf2, 0x8b, 0xc1, 0x3c, 0x3d, 0x30, 0x5b, 0x88, - 0x05, 0xc4, 0x56, 0x5a, 0xc9, 0xc8, 0xc5, 0x15, 0x52, 0x94, 0x9a, 0xea, 0x91, 0x9a, 0x98, 0x92, + 0x05, 0xc4, 0x56, 0x3a, 0xce, 0xc8, 0xc5, 0x15, 0x52, 0x94, 0x9a, 0xea, 0x91, 0x9a, 0x98, 0x92, 0x5a, 0x24, 0xa4, 0xc2, 0xc5, 0x9b, 0x96, 0x59, 0x54, 0x5c, 0xe2, 0x9c, 0x91, 0x98, 0x97, 0x9e, 0xea, 0x99, 0x22, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x84, 0x2a, 0x28, 0xa4, 0xc0, 0xc5, 0x9d, 0x59, 0x1c, 0x9e, 0x5f, 0x94, 0x5d, 0x5c, 0x90, 0x98, 0x9c, 0x2a, 0xc1, 0xa4, 0xc0, 0xa8, 0xc1, 0x11, 0x84, 0x2c, 0x24, 0xa4, 0xcb, 0xc5, 0x52, 0x52, 0x59, 0x90, 0x2a, 0xc1, 0xac, 0xc0, 0xa8, 0xc1, 0x67, 0x24, 0xa9, 0x07, 0xb6, 0x17, 0x61, 0x0f, 0x98, 0x19, 0x52, 0x59, 0x90, 0x1a, 0x04, - 0x56, 0xa6, 0xa4, 0xc2, 0xc5, 0x01, 0x13, 0x11, 0xe2, 0xe6, 0x62, 0x77, 0x74, 0xf6, 0x01, 0x71, - 0x05, 0x18, 0x40, 0x1c, 0x97, 0xfc, 0x64, 0x30, 0x87, 0xd1, 0x49, 0xe1, 0xc4, 0x23, 0x39, 0xc6, - 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, - 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0xd8, 0x20, 0xbe, 0x4c, 0x62, 0x03, 0x7b, 0xcd, 0x18, 0x10, - 0x00, 0x00, 0xff, 0xff, 0x72, 0x29, 0xbc, 0x0e, 0x0a, 0x01, 0x00, 0x00, + 0x56, 0x26, 0x24, 0xc3, 0xc5, 0x99, 0x98, 0x9c, 0x03, 0x12, 0xf4, 0x4c, 0x91, 0x60, 0x01, 0x5b, + 0x89, 0x10, 0x50, 0x52, 0xe1, 0xe2, 0x80, 0xa9, 0x17, 0xe2, 0xe6, 0x62, 0x77, 0x74, 0xf6, 0x01, + 0x71, 0x05, 0x18, 0x40, 0x1c, 0x97, 0xfc, 0x64, 0x30, 0x87, 0xd1, 0x49, 0xe1, 0xc4, 0x23, 0x39, + 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, + 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0xd8, 0x20, 0x61, 0x90, 0xc4, 0x06, 0xf6, 0xb8, 0x31, + 0x20, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x86, 0x4d, 0x81, 0x28, 0x01, 0x00, 0x00, } func (m *TreeHeader) Marshal() (dAtA []byte, err error) { @@ -154,6 +163,13 @@ func (m *TreeHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.AclTreeId) > 0 { + i -= len(m.AclTreeId) + copy(dAtA[i:], m.AclTreeId) + i = encodeVarintTree(dAtA, i, uint64(len(m.AclTreeId))) + i-- + dAtA[i] = 0x22 + } if m.Type != 0 { i = encodeVarintTree(dAtA, i, uint64(m.Type)) i-- @@ -206,6 +222,10 @@ func (m *TreeHeader) Size() (n int) { if m.Type != 0 { n += 1 + sovTree(uint64(m.Type)) } + l = len(m.AclTreeId) + if l > 0 { + n += 1 + l + sovTree(uint64(l)) + } return n } @@ -315,6 +335,38 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { break } } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AclTreeId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTree + } + 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 ErrInvalidLengthTree + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTree + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AclTreeId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTree(dAtA[iNdEx:]) diff --git a/service/api/service.go b/service/api/service.go index 0f8e5453..8ab7eb26 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -79,7 +79,7 @@ func (s *service) treeDump(w http.ResponseWriter, req *http.Request) { dump string err error ) - err = s.treeCache.DoWrite(context.Background(), treeId, func(tree acltree.ACLTree) error { + err = s.treeCache.Do(context.Background(), treeId, func(tree acltree.ACLTree) error { dump, err = tree.DebugDump() if err != nil { return err diff --git a/service/sync/document/service.go b/service/sync/document/service.go index ba9df31c..a20f2bd1 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -7,6 +7,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" @@ -22,9 +24,10 @@ var CName = "DocumentService" var log = logger.NewNamed("documentservice") type service struct { - messageService message.Service - treeCache treecache.Service - account account.Service + messageService message.Service + treeCache treecache.Service + account account.Service + treeStorageProvider treestorage.Provider // to create new documents we need to know all nodes nodes []*node.Node } @@ -42,6 +45,7 @@ func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.account = a.MustComponent(account.CName).(account.Service) s.messageService = a.MustComponent(message.CName).(message.Service) s.treeCache = a.MustComponent(treecache.CName).(treecache.Service) + // TODO: add TreeStorageProvider service nodesService := a.MustComponent(node.CName).(node.Service) s.nodes = nodesService.Nodes() @@ -71,7 +75,7 @@ func (s *service) UpdateDocument(ctx context.Context, id, text string) (err erro log.With(zap.String("id", id), zap.String("text", text)). Debug("updating document") - err = s.treeCache.DoWrite(ctx, id, func(tree acltree.ACLTree) error { + err = s.treeCache.Do(ctx, id, func(tree acltree.ACLTree) error { ch, err = tree.AddContent(ctx, func(builder acltree.ChangeBuilder) error { builder.AddChangeContent( &testchangepb.PlainTextChangeData{ @@ -109,7 +113,7 @@ func (s *service) UpdateDocument(ctx context.Context, id, text string) (err erro })) } -func (s *service) CreateDocument(ctx context.Context, text string) (id string, err error) { +func (s *service) CreateACLTree(ctx context.Context) (id string, err error) { acc := s.account.Account() var ( ch *aclpb.RawChange @@ -118,7 +122,7 @@ func (s *service) CreateDocument(ctx context.Context, text string) (id string, e heads []string ) - err = s.treeCache.Create(ctx, func(builder acltree.ChangeBuilder) error { + t, err := tree.CreateNewTreeStorageWithACL(acc, func(builder tree.ACLChangeBuilder) error { err := builder.UserAdd(acc.Identity, acc.EncKey.GetPublic(), aclpb.ACLChange_Admin) if err != nil { return err @@ -130,28 +134,81 @@ func (s *service) CreateDocument(ctx context.Context, text string) (id string, e return err } } - - builder.AddChangeContent(createInitialChangeContent(text)) return nil - }, func(tree acltree.ACLTree) error { - id = tree.ID() - heads = tree.Heads() - header = tree.Header() - snapshotPath = tree.SnapshotPath() - ch, err = tree.Storage().GetChange(ctx, heads[0]) + }, s.treeStorageProvider.CreateTreeStorage) + + id, err = t.TreeID() + if err != nil { + return "", err + } + + header, err = t.Header() + if err != nil { + return "", err + } + + heads = []string{header.FirstChangeId} + snapshotPath = []string{header.FirstChangeId} + ch, err = t.GetChange(ctx, header.FirstChangeId) + if err != nil { + return "", err + } + + if err != nil { + return "", err + } + + err = s.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ + Heads: heads, + Changes: []*aclpb.RawChange{ch}, + TreeId: id, + SnapshotPath: snapshotPath, + TreeHeader: header, + })) + return id, nil +} + +func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text string) (id string, err error) { + acc := s.account.Account() + var ( + ch *aclpb.RawChange + header *treepb.TreeHeader + snapshotPath []string + heads []string + ) + err = s.treeCache.Do(ctx, aclTreeId, func(t tree.ACLTree) error { + t.RLock() + defer t.RUnlock() + + content := createInitialChangeContent(text) + doc, err := tree.CreateNewTreeStorage(acc, t, content, s.treeStorageProvider.CreateTreeStorage) if err != nil { return err } - log.With( - zap.String("id", id), - zap.Strings("heads", heads), - zap.String("header", header.String())). - Debug("document created in the database") + + id, err = doc.TreeID() + if err != nil { + return err + } + + header, err = doc.Header() + if err != nil { + return err + } + + heads = []string{header.FirstChangeId} + snapshotPath = []string{header.FirstChangeId} + ch, err = doc.GetChange(ctx, header.FirstChangeId) + if err != nil { + return err + } + return nil }) if err != nil { return "", err } + log.With(zap.String("id", id), zap.String("text", text)). Debug("creating document") diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 12908a24..2eb70551 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -79,7 +79,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, log.With(zap.String("peerId", senderId), zap.String("treeId", update.TreeId)). Debug("processing head update") - err = r.treeCache.DoWrite(ctx, update.TreeId, func(tree acltree.ACLTree) error { + err = r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes result, err = tree.AddRawChanges(ctx, update.Changes...) if err != nil { @@ -133,7 +133,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str log.With(zap.String("peerId", senderId), zap.String("treeId", request.TreeId)). Debug("processing full sync request") - err = r.treeCache.DoWrite(ctx, request.TreeId, func(tree acltree.ACLTree) error { + err = r.treeCache.Do(ctx, request.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes // if we have non-empty request if len(request.Heads) != 0 { @@ -177,7 +177,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st log.With(zap.String("peerId", senderId), zap.String("treeId", response.TreeId)). Debug("processing full sync response") - err = r.treeCache.DoWrite(ctx, response.TreeId, func(tree acltree.ACLTree) error { + err = r.treeCache.Do(ctx, response.TreeId, func(tree acltree.ACLTree) error { // TODO: check if we already have those changes result, err = tree.AddRawChanges(ctx, response.Changes...) if err != nil { diff --git a/service/treecache/service.go b/service/treecache/service.go index dc334ea3..1176f2cb 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -6,6 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" @@ -16,16 +17,14 @@ import ( const CName = "treecache" // TODO: add context -type ACLTreeFunc = func(tree acltree.ACLTree) error +type ACLTreeFunc = func(tree tree.ACLTree) error type ChangeBuildFunc = func(builder acltree.ChangeBuilder) error var log = logger.NewNamed("treecache") type Service interface { - DoWrite(ctx context.Context, treeId string, f ACLTreeFunc) error - DoRead(ctx context.Context, treeId string, f ACLTreeFunc) error + Do(ctx context.Context, treeId string, f ACLTreeFunc) error Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error - Create(ctx context.Context, build ChangeBuildFunc, f ACLTreeFunc) error } type service struct { @@ -38,51 +37,17 @@ func New() app.ComponentRunnable { return &service{} } -func (s *service) Create(ctx context.Context, build ChangeBuildFunc, f ACLTreeFunc) error { - acc := s.account.Account() - st, err := acltree.CreateNewTreeStorageWithACL(acc, build, s.treeProvider.CreateTreeStorage) - if err != nil { - return err - } - - id, err := st.TreeID() - if err != nil { - return err - } - - return s.DoWrite(ctx, id, f) -} - -func (s *service) DoWrite(ctx context.Context, treeId string, f ACLTreeFunc) error { +func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error { log. With(zap.String("treeId", treeId)). Debug("requesting tree from cache to perform operation") - tree, err := s.cache.Get(ctx, treeId) + t, err := s.cache.Get(ctx, treeId) defer s.cache.Release(treeId) if err != nil { return err } - aclTree := tree.(acltree.ACLTree) - aclTree.Lock() - defer aclTree.Unlock() - return f(tree.(acltree.ACLTree)) -} - -func (s *service) DoRead(ctx context.Context, treeId string, f ACLTreeFunc) error { - log. - With(zap.String("treeId", treeId)). - Debug("requesting tree from cache to perform operation") - - tree, err := s.cache.Get(ctx, treeId) - defer s.cache.Release(treeId) - if err != nil { - return err - } - aclTree := tree.(acltree.ACLTree) - aclTree.RLock() - defer aclTree.RUnlock() - return f(tree.(acltree.ACLTree)) + return f(t.(tree.ACLTree)) } func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error { From 37eacb5d61babe12a3e8934fcafc0032d4552ed5 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 11 Aug 2022 11:04:03 +0200 Subject: [PATCH 008/219] Rewrite document service methods --- service/api/service.go | 2 +- service/sync/document/service.go | 51 ++++++++++++++++++++------------ service/treecache/service.go | 46 +++++++++++++++++++++------- 3 files changed, 69 insertions(+), 30 deletions(-) diff --git a/service/api/service.go b/service/api/service.go index 8ab7eb26..ac2cea36 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -115,7 +115,7 @@ func (s *service) appendDocument(w http.ResponseWriter, req *http.Request) { treeId = query.Get("treeId") ) timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30) - err := s.documentService.UpdateDocument(timeoutCtx, treeId, text) + err := s.documentService.UpdateDocumentTree(timeoutCtx, treeId, text) cancel() if err != nil { sendText(w, http.StatusInternalServerError, err.Error()) diff --git a/service/sync/document/service.go b/service/sync/document/service.go index a20f2bd1..7d5d2b18 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -5,7 +5,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" @@ -33,8 +32,9 @@ type service struct { } type Service interface { - UpdateDocument(ctx context.Context, id, text string) error - CreateDocument(ctx context.Context, text string) (string, error) + UpdateDocumentTree(ctx context.Context, id, text string) error + CreateACLTree(ctx context.Context) (id string, err error) + CreateDocumentTree(ctx context.Context, aclTreeId string, text string) (id string, err error) } func New() app.Component { @@ -65,7 +65,7 @@ func (s *service) Close(ctx context.Context) (err error) { return nil } -func (s *service) UpdateDocument(ctx context.Context, id, text string) (err error) { +func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err error) { var ( ch *aclpb.RawChange header *treepb.TreeHeader @@ -75,24 +75,28 @@ func (s *service) UpdateDocument(ctx context.Context, id, text string) (err erro log.With(zap.String("id", id), zap.String("text", text)). Debug("updating document") - err = s.treeCache.Do(ctx, id, func(tree acltree.ACLTree) error { - ch, err = tree.AddContent(ctx, func(builder acltree.ChangeBuilder) error { - builder.AddChangeContent( - &testchangepb.PlainTextChangeData{ - Content: []*testchangepb.PlainTextChangeContent{ - createAppendTextChangeContent(text), - }, - }) + err = s.treeCache.Do(ctx, id, func(obj interface{}) error { + docTree := obj.(tree.DocTree) + err = s.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error { + aclTree := obj.(tree.ACLTree) + aclTree.RLock() + defer aclTree.RUnlock() + + content := createAppendTextChange(text) + _, err := docTree.AddContent(ctx, aclTree, content, false) + if err != nil { + return err + } return nil }) if err != nil { return err } - id = tree.ID() - heads = tree.Heads() - header = tree.Header() - snapshotPath = tree.SnapshotPath() + id = docTree.ID() + heads = docTree.Heads() + header = docTree.Header() + snapshotPath = docTree.SnapshotPath() return nil }) if err != nil { @@ -176,11 +180,12 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text snapshotPath []string heads []string ) - err = s.treeCache.Do(ctx, aclTreeId, func(t tree.ACLTree) error { + err = s.treeCache.Do(ctx, aclTreeId, func(obj interface{}) error { + t := obj.(tree.ACLTree) t.RLock() defer t.RUnlock() - content := createInitialChangeContent(text) + content := createInitialTextChange(text) doc, err := tree.CreateNewTreeStorage(acc, t, content, s.treeStorageProvider.CreateTreeStorage) if err != nil { return err @@ -225,7 +230,7 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text return id, err } -func createInitialChangeContent(text string) proto.Marshaler { +func createInitialTextChange(text string) proto.Marshaler { return &testchangepb.PlainTextChangeData{ Content: []*testchangepb.PlainTextChangeContent{ createAppendTextChangeContent(text), @@ -234,6 +239,14 @@ func createInitialChangeContent(text string) proto.Marshaler { } } +func createAppendTextChange(text string) proto.Marshaler { + return &testchangepb.PlainTextChangeData{ + Content: []*testchangepb.PlainTextChangeContent{ + createAppendTextChangeContent(text), + }, + } +} + func createAppendTextChangeContent(text string) *testchangepb.PlainTextChangeContent { return &testchangepb.PlainTextChangeContent{ Value: &testchangepb.PlainTextChangeContentValueOfTextAppend{ diff --git a/service/treecache/service.go b/service/treecache/service.go index 1176f2cb..632623ad 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -2,6 +2,7 @@ package treecache import ( "context" + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" @@ -17,14 +18,14 @@ import ( const CName = "treecache" // TODO: add context -type ACLTreeFunc = func(tree tree.ACLTree) error +type TreeFunc = func(tree interface{}) error type ChangeBuildFunc = func(builder acltree.ChangeBuilder) error var log = logger.NewNamed("treecache") type Service interface { - Do(ctx context.Context, treeId string, f ACLTreeFunc) error - Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error + Do(ctx context.Context, treeId string, f TreeFunc) error + Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f TreeFunc) error } type service struct { @@ -37,7 +38,7 @@ func New() app.ComponentRunnable { return &service{} } -func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error { +func (s *service) Do(ctx context.Context, treeId string, f TreeFunc) error { log. With(zap.String("treeId", treeId)). Debug("requesting tree from cache to perform operation") @@ -47,10 +48,10 @@ func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error { if err != nil { return err } - return f(t.(tree.ACLTree)) + return f(t) } -func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error { +func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f TreeFunc) error { log. With(zap.String("treeId", treeId), zap.Int("len(changes)", len(changes))). Debug("adding tree with changes") @@ -83,11 +84,36 @@ func (s *service) Close(ctx context.Context) (err error) { } func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error) { - tree, err := s.treeProvider.TreeStorage(id) + t, err := s.treeProvider.TreeStorage(id) if err != nil { return nil, err } - // TODO: should probably accept nil listeners - aclTree, err := acltree.BuildACLTree(tree, s.account.Account(), acltree.NoOpListener{}) - return aclTree, err + header, err := t.Header() + if err != nil { + return nil, err + } + + switch header.Type { + case treepb.TreeHeader_ACLTree: + return tree.BuildACLTreeWithIdentity(t, s.account.Account(), nil) + case treepb.TreeHeader_DocTree: + break + default: + return nil, fmt.Errorf("incorrect type") + } + var docTree tree.DocTree + // TODO: it is a question if we need to use ACLTree on the first tree build, because we can think that the tree is already validated + err = s.Do(ctx, header.AclTreeId, func(obj interface{}) error { + aclTree := obj.(tree.ACLTree) + aclTree.RLock() + defer aclTree.RUnlock() + + docTree, err = tree.BuildDocTreeWithIdentity(t, s.account.Account(), nil, aclTree) + if err != nil { + return err + } + return nil + }) + + return docTree, err } From 028cb99586ec107066ee797e62c3b38fc5d2e3de Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 11 Aug 2022 15:33:39 +0200 Subject: [PATCH 009/219] Update sync layer to work with different trees --- pkg/acl/tree/acltree.go | 19 +- pkg/acl/tree/commontree.go | 21 ++ pkg/acl/tree/doctree.go | 18 +- service/sync/document/service.go | 2 + service/sync/requesthandler/requesthandler.go | 232 ++++++++++++++---- 5 files changed, 206 insertions(+), 86 deletions(-) create mode 100644 pkg/acl/tree/commontree.go diff --git a/pkg/acl/tree/acltree.go b/pkg/acl/tree/acltree.go index 2b5563b2..fdfc48eb 100644 --- a/pkg/acl/tree/acltree.go +++ b/pkg/acl/tree/acltree.go @@ -51,22 +51,11 @@ var ErrNoCommonSnapshot = errors.New("trees doesn't have a common snapshot") type ACLTree interface { RWLocker - ID() string - Header() *treepb.TreeHeader + CommonTree + ACLState() *ACLState AddContent(ctx context.Context, f func(builder ACLChangeBuilder) error) (*aclpb.RawChange, error) AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) - Heads() []string - Root() *Change - Iterate(func(change *Change) bool) - IterateFrom(string, func(change *Change) bool) - HasChange(string) bool - SnapshotPath() []string - ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) - Storage() treestorage.TreeStorage - DebugDump() (string, error) - - Close() error } type aclTree struct { @@ -389,10 +378,6 @@ func (a *aclTree) Root() *Change { return a.tree.Root() } -func (a *aclTree) Close() error { - return nil -} - func (a *aclTree) SnapshotPath() []string { // TODO: think about caching this diff --git a/pkg/acl/tree/commontree.go b/pkg/acl/tree/commontree.go new file mode 100644 index 00000000..063f21c5 --- /dev/null +++ b/pkg/acl/tree/commontree.go @@ -0,0 +1,21 @@ +package tree + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" +) + +type CommonTree interface { + ID() string + Header() *treepb.TreeHeader + Heads() []string + Root() *Change + Iterate(func(change *Change) bool) + IterateFrom(string, func(change *Change) bool) + HasChange(string) bool + SnapshotPath() []string + ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) + Storage() treestorage.TreeStorage + DebugDump() (string, error) +} diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index 8118fedb..ff4c6d4e 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -21,21 +21,9 @@ type TreeUpdateListener interface { type DocTree interface { RWLocker - ID() string - Header() *treepb.TreeHeader + CommonTree AddContent(ctx context.Context, aclTree ACLTree, content proto.Marshaler, isSnapshot bool) (*aclpb.RawChange, error) AddRawChanges(ctx context.Context, aclTree ACLTree, changes ...*aclpb.RawChange) (AddResult, error) - Heads() []string - Root() *Change - Iterate(func(change *Change) bool) - IterateFrom(string, func(change *Change) bool) - HasChange(string) bool - SnapshotPath() []string - ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) - Storage() treestorage.TreeStorage - DebugDump() (string, error) - - Close() error } type docTree struct { @@ -372,10 +360,6 @@ func (d *docTree) Root() *Change { return d.tree.Root() } -func (d *docTree) Close() error { - return nil -} - func (d *docTree) SnapshotPath() []string { // TODO: think about caching this diff --git a/service/sync/document/service.go b/service/sync/document/service.go index 7d5d2b18..cea7a3d8 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -77,6 +77,8 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err err = s.treeCache.Do(ctx, id, func(obj interface{}) error { docTree := obj.(tree.DocTree) + docTree.Lock() + defer docTree.Unlock() err = s.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error { aclTree := obj.(tree.ACLTree) aclTree.RLock() diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 2eb70551..4892ef14 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -2,10 +2,11 @@ package requesthandler import ( "context" + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" @@ -23,6 +24,8 @@ type requestHandler struct { var log = logger.NewNamed("requesthandler") +var ErrIncorrectDocType = errors.New("incorrec doc type") + func New() app.Component { return &requestHandler{} } @@ -74,29 +77,74 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, var ( fullRequest *syncproto.SyncFullRequest snapshotPath []string - result acltree.AddResult + result tree.AddResult ) log.With(zap.String("peerId", senderId), zap.String("treeId", update.TreeId)). Debug("processing head update") - err = r.treeCache.Do(ctx, update.TreeId, func(tree acltree.ACLTree) error { - // TODO: check if we already have those changes - result, err = tree.AddRawChanges(ctx, update.Changes...) - if err != nil { - return err - } - log.With(zap.Strings("update heads", update.Heads), zap.Strings("tree heads", tree.Heads())). - Debug("comparing heads after head update") - shouldFullSync := !slice.UnsortedEquals(update.Heads, tree.Heads()) - snapshotPath = tree.SnapshotPath() - if shouldFullSync { - fullRequest, err = r.prepareFullSyncRequest(update.TreeId, update.TreeHeader, update.SnapshotPath, tree) + updateACLTree := func() { + err = r.treeCache.Do(ctx, update.TreeId, func(obj interface{}) error { + t := obj.(tree.ACLTree) + t.Lock() + defer t.Unlock() + // TODO: check if we already have those changes + result, err = t.AddRawChanges(ctx, update.Changes...) if err != nil { return err } - } - return nil - }) + log.With(zap.Strings("update heads", update.Heads), zap.Strings("tree heads", t.Heads())). + Debug("comparing heads after head update") + shouldFullSync := !slice.UnsortedEquals(update.Heads, t.Heads()) + snapshotPath = t.SnapshotPath() + if shouldFullSync { + fullRequest, err = r.prepareFullSyncRequest(update.TreeId, update.TreeHeader, update.SnapshotPath, t) + if err != nil { + return err + } + } + return nil + }) + } + + updateDocTree := func() { + err = r.treeCache.Do(ctx, update.TreeId, func(obj interface{}) error { + docTree := obj.(tree.DocTree) + docTree.Lock() + defer docTree.Unlock() + + return r.treeCache.Do(ctx, update.TreeId, func(obj interface{}) error { + aclTree := obj.(tree.ACLTree) + aclTree.RLock() + defer aclTree.RUnlock() + // TODO: check if we already have those changes + result, err = docTree.AddRawChanges(ctx, aclTree, update.Changes...) + if err != nil { + return err + } + log.With(zap.Strings("update heads", update.Heads), zap.Strings("tree heads", docTree.Heads())). + Debug("comparing heads after head update") + shouldFullSync := !slice.UnsortedEquals(update.Heads, docTree.Heads()) + snapshotPath = docTree.SnapshotPath() + if shouldFullSync { + fullRequest, err = r.prepareFullSyncRequest(update.TreeId, update.TreeHeader, update.SnapshotPath, docTree) + if err != nil { + return err + } + } + return nil + }) + }) + } + + switch update.TreeHeader.Type { + case treepb.TreeHeader_ACLTree: + updateACLTree() + case treepb.TreeHeader_DocTree: + updateDocTree() + default: + return ErrIncorrectDocType + } + // if there are no such tree if err == treestorage.ErrUnknownTreeId { // TODO: maybe we can optimize this by sending the header and stuff right away, so when the tree is created we are able to add it on first request @@ -128,27 +176,71 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str var ( fullResponse *syncproto.SyncFullResponse snapshotPath []string - result acltree.AddResult + result tree.AddResult ) log.With(zap.String("peerId", senderId), zap.String("treeId", request.TreeId)). Debug("processing full sync request") - err = r.treeCache.Do(ctx, request.TreeId, func(tree acltree.ACLTree) error { - // TODO: check if we already have those changes - // if we have non-empty request - if len(request.Heads) != 0 { - result, err = tree.AddRawChanges(ctx, request.Changes...) + requestACLTree := func() { + err = r.treeCache.Do(ctx, request.TreeId, func(obj interface{}) error { + t := obj.(tree.ACLTree) + t.Lock() + defer t.Unlock() + + // TODO: check if we already have those changes + // if we have non-empty request + if len(request.Heads) != 0 { + result, err = t.AddRawChanges(ctx, request.Changes...) + if err != nil { + return err + } + } + snapshotPath = t.SnapshotPath() + fullResponse, err = r.prepareFullSyncResponse(request.TreeId, request.SnapshotPath, request.Changes, t) if err != nil { return err } - } - snapshotPath = tree.SnapshotPath() - fullResponse, err = r.prepareFullSyncResponse(request.TreeId, request.SnapshotPath, request.Changes, tree) - if err != nil { - return err - } - return nil - }) + return nil + }) + } + + requestDocTree := func() { + err = r.treeCache.Do(ctx, request.TreeId, func(obj interface{}) error { + docTree := obj.(tree.DocTree) + docTree.Lock() + defer docTree.Unlock() + + return r.treeCache.Do(ctx, request.TreeId, func(obj interface{}) error { + aclTree := obj.(tree.ACLTree) + aclTree.RLock() + defer aclTree.RUnlock() + // TODO: check if we already have those changes + // if we have non-empty request + if len(request.Heads) != 0 { + result, err = docTree.AddRawChanges(ctx, aclTree, request.Changes...) + if err != nil { + return err + } + } + snapshotPath = docTree.SnapshotPath() + fullResponse, err = r.prepareFullSyncResponse(request.TreeId, request.SnapshotPath, request.Changes, docTree) + if err != nil { + return err + } + return nil + }) + }) + } + + switch request.TreeHeader.Type { + case treepb.TreeHeader_ACLTree: + requestACLTree() + case treepb.TreeHeader_DocTree: + requestDocTree() + default: + return ErrIncorrectDocType + } + if err != nil { return err } @@ -172,20 +264,56 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncproto.SyncFullResponse) (err error) { var ( snapshotPath []string - result acltree.AddResult + result tree.AddResult ) log.With(zap.String("peerId", senderId), zap.String("treeId", response.TreeId)). Debug("processing full sync response") - err = r.treeCache.Do(ctx, response.TreeId, func(tree acltree.ACLTree) error { - // TODO: check if we already have those changes - result, err = tree.AddRawChanges(ctx, response.Changes...) - if err != nil { - return err - } - snapshotPath = tree.SnapshotPath() - return nil - }) + responseACLTree := func() { + err = r.treeCache.Do(ctx, response.TreeId, func(obj interface{}) error { + t := obj.(tree.ACLTree) + t.Lock() + defer t.Unlock() + // TODO: check if we already have those changes + result, err = t.AddRawChanges(ctx, response.Changes...) + if err != nil { + return err + } + snapshotPath = t.SnapshotPath() + return nil + }) + } + + responseDocTree := func() { + err = r.treeCache.Do(ctx, response.TreeId, func(obj interface{}) error { + docTree := obj.(tree.DocTree) + docTree.Lock() + defer docTree.Unlock() + + return r.treeCache.Do(ctx, response.TreeId, func(obj interface{}) error { + aclTree := obj.(tree.ACLTree) + aclTree.RLock() + defer aclTree.RUnlock() + // TODO: check if we already have those changes + result, err = docTree.AddRawChanges(ctx, aclTree, response.Changes...) + if err != nil { + return err + } + snapshotPath = docTree.SnapshotPath() + return nil + }) + }) + } + + switch response.TreeHeader.Type { + case treepb.TreeHeader_ACLTree: + responseACLTree() + case treepb.TreeHeader_DocTree: + responseDocTree() + default: + return ErrIncorrectDocType + } + // if error or nothing has changed if (err != nil || len(result.Added) == 0) && err != treestorage.ErrUnknownTreeId { return err @@ -196,7 +324,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st if err != nil { return err } - result = acltree.AddResult{ + result = tree.AddResult{ OldHeads: []string{}, Heads: response.Heads, Added: response.Changes, @@ -212,16 +340,16 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate)) } -func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, tree acltree.ACLTree) (*syncproto.SyncFullRequest, error) { - ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) +func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, t tree.CommonTree) (*syncproto.SyncFullRequest, error) { + ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath) if err != nil { return nil, err } return &syncproto.SyncFullRequest{ - Heads: tree.Heads(), + Heads: t.Heads(), Changes: ourChanges, TreeId: treeId, - SnapshotPath: tree.SnapshotPath(), + SnapshotPath: t.SnapshotPath(), TreeHeader: header, }, nil } @@ -230,9 +358,9 @@ func (r *requestHandler) prepareFullSyncResponse( treeId string, theirPath []string, theirChanges []*aclpb.RawChange, - tree acltree.ACLTree) (*syncproto.SyncFullResponse, error) { + t tree.CommonTree) (*syncproto.SyncFullResponse, error) { // TODO: we can probably use the common snapshot calculated on the request step from previous peer - ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) + ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath) if err != nil { return nil, err } @@ -252,11 +380,11 @@ func (r *requestHandler) prepareFullSyncResponse( Debug("preparing changes for tree") return &syncproto.SyncFullResponse{ - Heads: tree.Heads(), + Heads: t.Heads(), Changes: final, TreeId: treeId, - SnapshotPath: tree.SnapshotPath(), - TreeHeader: tree.Header(), + SnapshotPath: t.SnapshotPath(), + TreeHeader: t.Header(), }, nil } @@ -266,7 +394,7 @@ func (r *requestHandler) createTree(ctx context.Context, response *syncproto.Syn response.TreeId, response.TreeHeader, response.Changes, - func(tree acltree.ACLTree) error { + func(obj interface{}) error { return nil }) } From 88b0e8cd7e89039ed8ec995416098cb1f6a13386 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 11 Aug 2022 15:54:27 +0200 Subject: [PATCH 010/219] Add storage and change API to include both tree types --- cmd/node/node.go | 4 ++- pkg/acl/tree/acltree.go | 4 +++ pkg/acl/tree/commontree.go | 1 + pkg/acl/tree/doctree.go | 4 +++ service/api/service.go | 32 ++++++++++++----- service/{sync => }/document/service.go | 23 +++++++----- service/storage/service.go | 48 ++++++++++++++++++++++++++ service/treecache/service.go | 14 ++++---- 8 files changed, 104 insertions(+), 26 deletions(-) rename service/{sync => }/document/service.go (92%) create mode 100644 service/storage/service.go diff --git a/cmd/node/node.go b/cmd/node/node.go index 269e4890..e4f39327 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -9,12 +9,13 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/api" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" @@ -97,6 +98,7 @@ func Bootstrap(a *app.App) { Register(server.New()). Register(dialer.New()). Register(pool.NewPool()). + Register(storage.New()). //Register(&example.Example{}) Register(document.New()). Register(message.New()). diff --git a/pkg/acl/tree/acltree.go b/pkg/acl/tree/acltree.go index fdfc48eb..8ea8b098 100644 --- a/pkg/acl/tree/acltree.go +++ b/pkg/acl/tree/acltree.go @@ -378,6 +378,10 @@ func (a *aclTree) Root() *Change { return a.tree.Root() } +func (a *aclTree) Close() error { + return nil +} + func (a *aclTree) SnapshotPath() []string { // TODO: think about caching this diff --git a/pkg/acl/tree/commontree.go b/pkg/acl/tree/commontree.go index 063f21c5..53c8e62f 100644 --- a/pkg/acl/tree/commontree.go +++ b/pkg/acl/tree/commontree.go @@ -18,4 +18,5 @@ type CommonTree interface { ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) Storage() treestorage.TreeStorage DebugDump() (string, error) + Close() error } diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index ff4c6d4e..d60de112 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -360,6 +360,10 @@ func (d *docTree) Root() *Change { return d.tree.Root() } +func (d *docTree) Close() error { + return nil +} + func (d *docTree) SnapshotPath() []string { // TODO: think about caching this diff --git a/service/api/service.go b/service/api/service.go index ac2cea36..a9b7f1f3 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -6,8 +6,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "go.uber.org/zap" "io" @@ -53,7 +53,8 @@ func (s *service) Run(ctx context.Context) (err error) { } mux := http.NewServeMux() mux.HandleFunc("/treeDump", s.treeDump) - mux.HandleFunc("/createDocument", s.createDocument) + mux.HandleFunc("/createDocumentTree", s.createDocumentTree) + mux.HandleFunc("/createACLTree", s.createACLTree) mux.HandleFunc("/appendDocument", s.appendDocument) s.srv.Handler = mux @@ -79,8 +80,9 @@ func (s *service) treeDump(w http.ResponseWriter, req *http.Request) { dump string err error ) - err = s.treeCache.Do(context.Background(), treeId, func(tree acltree.ACLTree) error { - dump, err = tree.DebugDump() + err = s.treeCache.Do(context.Background(), treeId, func(obj interface{}) error { + t := obj.(tree.CommonTree) + dump, err = t.DebugDump() if err != nil { return err } @@ -93,13 +95,25 @@ func (s *service) treeDump(w http.ResponseWriter, req *http.Request) { sendText(w, http.StatusOK, dump) } -func (s *service) createDocument(w http.ResponseWriter, req *http.Request) { +func (s *service) createDocumentTree(w http.ResponseWriter, req *http.Request) { var ( - query = req.URL.Query() - text = query.Get("text") + query = req.URL.Query() + text = query.Get("text") + aclTreeId = query.Get("aclTreeId") ) timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30) - treeId, err := s.documentService.CreateDocument(timeoutCtx, fmt.Sprintf("created document with id: %s", text)) + treeId, err := s.documentService.CreateDocumentTree(timeoutCtx, aclTreeId, text) + cancel() + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, treeId) +} + +func (s *service) createACLTree(w http.ResponseWriter, req *http.Request) { + timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30) + treeId, err := s.documentService.CreateACLTree(timeoutCtx) cancel() if err != nil { sendText(w, http.StatusInternalServerError, err.Error()) diff --git a/service/sync/document/service.go b/service/document/service.go similarity index 92% rename from service/sync/document/service.go rename to service/document/service.go index cea7a3d8..5d6b96b6 100644 --- a/service/sync/document/service.go +++ b/service/document/service.go @@ -2,15 +2,16 @@ package document import ( "context" + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" @@ -23,10 +24,10 @@ var CName = "DocumentService" var log = logger.NewNamed("documentservice") type service struct { - messageService message.Service - treeCache treecache.Service - account account.Service - treeStorageProvider treestorage.Provider + messageService message.Service + treeCache treecache.Service + account account.Service + storage storage.Service // to create new documents we need to know all nodes nodes []*node.Node } @@ -45,7 +46,7 @@ func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.account = a.MustComponent(account.CName).(account.Service) s.messageService = a.MustComponent(message.CName).(message.Service) s.treeCache = a.MustComponent(treecache.CName).(treecache.Service) - // TODO: add TreeStorageProvider service + s.storage = a.MustComponent(storage.CName).(storage.Service) nodesService := a.MustComponent(node.CName).(node.Service) s.nodes = nodesService.Nodes() @@ -76,7 +77,11 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err Debug("updating document") err = s.treeCache.Do(ctx, id, func(obj interface{}) error { - docTree := obj.(tree.DocTree) + docTree, ok := obj.(tree.DocTree) + if !ok { + return fmt.Errorf("can't update acl trees with text") + } + docTree.Lock() defer docTree.Unlock() err = s.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error { @@ -141,7 +146,7 @@ func (s *service) CreateACLTree(ctx context.Context) (id string, err error) { } } return nil - }, s.treeStorageProvider.CreateTreeStorage) + }, s.storage.CreateTreeStorage) id, err = t.TreeID() if err != nil { @@ -188,7 +193,7 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text defer t.RUnlock() content := createInitialTextChange(text) - doc, err := tree.CreateNewTreeStorage(acc, t, content, s.treeStorageProvider.CreateTreeStorage) + doc, err := tree.CreateNewTreeStorage(acc, t, content, s.storage.CreateTreeStorage) if err != nil { return err } diff --git a/service/storage/service.go b/service/storage/service.go new file mode 100644 index 00000000..1f495034 --- /dev/null +++ b/service/storage/service.go @@ -0,0 +1,48 @@ +package storage + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" +) + +var CName = "storage" + +type Service interface { + treestorage.Provider +} + +func New() app.Component { + return &service{} +} + +type service struct { + storageProvider treestorage.Provider +} + +func (s *service) Init(ctx context.Context, a *app.App) (err error) { + s.storageProvider = treestorage.NewInMemoryTreeStorageProvider() + return nil +} + +func (s *service) TreeStorage(treeId string) (treestorage.TreeStorage, error) { + return s.storageProvider.TreeStorage(treeId) +} + +func (s *service) CreateTreeStorage(treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) (treestorage.TreeStorage, error) { + return s.storageProvider.CreateTreeStorage(treeId, header, changes) +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + return nil +} + +func (s service) Close(ctx context.Context) (err error) { + return nil +} diff --git a/service/treecache/service.go b/service/treecache/service.go index 632623ad..1816e688 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -8,10 +8,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage" "go.uber.org/zap" ) @@ -29,9 +29,9 @@ type Service interface { } type service struct { - treeProvider treestorage.Provider - account account.Service - cache ocache.OCache + storage storage.Service + account account.Service + cache ocache.OCache } func New() app.ComponentRunnable { @@ -56,7 +56,7 @@ func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHea With(zap.String("treeId", treeId), zap.Int("len(changes)", len(changes))). Debug("adding tree with changes") - _, err := s.treeProvider.CreateTreeStorage(treeId, header, changes) + _, err := s.storage.CreateTreeStorage(treeId, header, changes) if err != nil { return err } @@ -66,7 +66,7 @@ func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHea func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.cache = ocache.New(s.loadTree) s.account = a.MustComponent(account.CName).(account.Service) - s.treeProvider = treestorage.NewInMemoryTreeStorageProvider() + s.storage = a.MustComponent(storage.CName).(storage.Service) // TODO: for test we should load some predefined keys return nil } @@ -84,7 +84,7 @@ func (s *service) Close(ctx context.Context) (err error) { } func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error) { - t, err := s.treeProvider.TreeStorage(id) + t, err := s.storage.TreeStorage(id) if err != nil { return nil, err } From eed3c518cd0daae7c951e77518bc55e249140d20 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 11 Aug 2022 16:31:09 +0200 Subject: [PATCH 011/219] Move treeheader to upper level in sync --- pkg/acl/tree/acltree.go | 50 +- pkg/acl/tree/doctree.go | 8 +- service/sync/message/service.go | 14 +- service/sync/requesthandler/requesthandler.go | 105 ++-- service/treecache/service.go | 2 - syncproto/helpers.go | 38 +- syncproto/proto/sync.proto | 14 +- syncproto/sync.pb.go | 569 ++++++------------ 8 files changed, 308 insertions(+), 492 deletions(-) diff --git a/pkg/acl/tree/acltree.go b/pkg/acl/tree/acltree.go index 8ea8b098..caefb1fb 100644 --- a/pkg/acl/tree/acltree.go +++ b/pkg/acl/tree/acltree.go @@ -283,15 +283,16 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha return } - if a.updateListener != nil { - switch mode { - case Append: - a.updateListener.Update(a) - case Rebuild: - a.updateListener.Rebuild(a) - default: - break - } + if a.updateListener == nil { + return + } + switch mode { + case Append: + a.updateListener.Update(a) + case Rebuild: + a.updateListener.Rebuild(a) + default: + break } }() @@ -317,16 +318,7 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha } prevHeads := a.tree.Heads() - mode = a.tree.Add(changes...) - switch mode { - case Nothing: - return AddResult{ - OldHeads: prevHeads, - Heads: prevHeads, - Summary: AddResultSummaryNothing, - }, nil - - case Rebuild: + rebuild := func() (AddResult, error) { err = a.rebuildFromStorage() if err != nil { return AddResult{}, err @@ -338,6 +330,26 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha Added: getAddedChanges(), Summary: AddResultSummaryRebuild, }, nil + } + + mode = a.tree.Add(changes...) + switch mode { + case Nothing: + for _, ch := range changes { + // rebuilding if the snapshot is different from the root + if ch.SnapshotId != a.tree.RootId() { + return rebuild() + } + } + + return AddResult{ + OldHeads: prevHeads, + Heads: prevHeads, + Summary: AddResultSummaryNothing, + }, nil + + case Rebuild: + return rebuild() default: // just rebuilding the state from start without reloading everything from tree storage // as an optimization we could've started from current heads, but I didn't implement that diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index d60de112..bd056a72 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -165,7 +165,9 @@ func (d *docTree) AddContent(ctx context.Context, aclTree ACLTree, content proto defer func() { // TODO: should this be called in a separate goroutine to prevent accidental cycles (tree->updater->tree) - d.updateListener.Update(d) + if d.updateListener != nil { + d.updateListener.Update(d) + } }() state := aclTree.ACLState() change := &aclpb.Change{ @@ -256,6 +258,10 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges return } + if d.updateListener == nil { + return + } + switch mode { case Append: d.updateListener.Update(d) diff --git a/service/sync/message/service.go b/service/sync/message/service.go index 8f71f597..78a4829c 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -2,6 +2,7 @@ package message import ( "context" + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" @@ -85,7 +86,7 @@ func (s *service) SendMessageAsync(peerId string, msg *syncproto.Sync) (err erro return } - go s.sendAsync(peerId, msgType(msg), marshalled) + go s.sendAsync(peerId, msgInfo(msg), marshalled) return } @@ -108,15 +109,16 @@ func (s *service) sendAsync(peerId string, msgTypeStr string, marshalled []byte) }) } -func msgType(content *syncproto.Sync) string { +func msgInfo(content *syncproto.Sync) (syncMethod string) { msg := content.GetMessage() switch { case msg.GetFullSyncRequest() != nil: - return "FullSyncRequest" + syncMethod = "FullSyncRequest" case msg.GetFullSyncResponse() != nil: - return "FullSyncResponse" + syncMethod = "FullSyncResponse" case msg.GetHeadUpdate() != nil: - return "HeadUpdate" + syncMethod = "HeadUpdate" } - return "UnknownMessage" + syncMethod = fmt.Sprintf("method: %s, treeType: %s", syncMethod, content.TreeHeader.Type.String()) + return } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 4892ef14..3ffbda84 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -64,26 +64,32 @@ func (r *requestHandler) HandleSyncMessage(ctx context.Context, senderId string, msg := content.GetMessage() switch { case msg.GetFullSyncRequest() != nil: - return r.HandleFullSyncRequest(ctx, senderId, msg.GetFullSyncRequest()) + return r.HandleFullSyncRequest(ctx, senderId, msg.GetFullSyncRequest(), content.GetTreeHeader(), content.GetTreeId()) case msg.GetFullSyncResponse() != nil: - return r.HandleFullSyncResponse(ctx, senderId, msg.GetFullSyncResponse()) + return r.HandleFullSyncResponse(ctx, senderId, msg.GetFullSyncResponse(), content.GetTreeHeader(), content.GetTreeId()) case msg.GetHeadUpdate() != nil: - return r.HandleHeadUpdate(ctx, senderId, msg.GetHeadUpdate()) + return r.HandleHeadUpdate(ctx, senderId, msg.GetHeadUpdate(), content.GetTreeHeader(), content.GetTreeId()) } return nil } -func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, update *syncproto.SyncHeadUpdate) (err error) { +func (r *requestHandler) HandleHeadUpdate( + ctx context.Context, + senderId string, + update *syncproto.SyncHeadUpdate, + header *treepb.TreeHeader, + treeId string) (err error) { + var ( fullRequest *syncproto.SyncFullRequest snapshotPath []string result tree.AddResult ) - log.With(zap.String("peerId", senderId), zap.String("treeId", update.TreeId)). + log.With(zap.String("peerId", senderId), zap.String("treeId", treeId)). Debug("processing head update") updateACLTree := func() { - err = r.treeCache.Do(ctx, update.TreeId, func(obj interface{}) error { + err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { t := obj.(tree.ACLTree) t.Lock() defer t.Unlock() @@ -97,7 +103,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, shouldFullSync := !slice.UnsortedEquals(update.Heads, t.Heads()) snapshotPath = t.SnapshotPath() if shouldFullSync { - fullRequest, err = r.prepareFullSyncRequest(update.TreeId, update.TreeHeader, update.SnapshotPath, t) + fullRequest, err = r.prepareFullSyncRequest(treeId, header, update.SnapshotPath, t) if err != nil { return err } @@ -107,12 +113,12 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, } updateDocTree := func() { - err = r.treeCache.Do(ctx, update.TreeId, func(obj interface{}) error { + err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { docTree := obj.(tree.DocTree) docTree.Lock() defer docTree.Unlock() - return r.treeCache.Do(ctx, update.TreeId, func(obj interface{}) error { + return r.treeCache.Do(ctx, treeId, func(obj interface{}) error { aclTree := obj.(tree.ACLTree) aclTree.RLock() defer aclTree.RUnlock() @@ -126,7 +132,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, shouldFullSync := !slice.UnsortedEquals(update.Heads, docTree.Heads()) snapshotPath = docTree.SnapshotPath() if shouldFullSync { - fullRequest, err = r.prepareFullSyncRequest(update.TreeId, update.TreeHeader, update.SnapshotPath, docTree) + fullRequest, err = r.prepareFullSyncRequest(treeId, header, update.SnapshotPath, docTree) if err != nil { return err } @@ -136,7 +142,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, }) } - switch update.TreeHeader.Type { + switch header.Type { case treepb.TreeHeader_ACLTree: updateACLTree() case treepb.TreeHeader_DocTree: @@ -148,14 +154,11 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, // if there are no such tree if err == treestorage.ErrUnknownTreeId { // TODO: maybe we can optimize this by sending the header and stuff right away, so when the tree is created we are able to add it on first request - fullRequest = &syncproto.SyncFullRequest{ - TreeId: update.TreeId, - TreeHeader: update.TreeHeader, - } + fullRequest = &syncproto.SyncFullRequest{} } // if we have incompatible heads, or we haven't seen the tree at all if fullRequest != nil { - return r.messageService.SendMessageAsync(senderId, syncproto.WrapFullRequest(fullRequest)) + return r.messageService.SendMessageAsync(senderId, syncproto.WrapFullRequest(fullRequest, header, treeId)) } // if error or nothing has changed if err != nil || len(result.Added) == 0 { @@ -166,23 +169,27 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, Heads: result.Heads, Changes: result.Added, SnapshotPath: snapshotPath, - TreeId: update.TreeId, - TreeHeader: update.TreeHeader, } - return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate)) + return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) } -func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncproto.SyncFullRequest) (err error) { +func (r *requestHandler) HandleFullSyncRequest( + ctx context.Context, + senderId string, + request *syncproto.SyncFullRequest, + header *treepb.TreeHeader, + treeId string) (err error) { + var ( fullResponse *syncproto.SyncFullResponse snapshotPath []string result tree.AddResult ) - log.With(zap.String("peerId", senderId), zap.String("treeId", request.TreeId)). + log.With(zap.String("peerId", senderId), zap.String("treeId", treeId)). Debug("processing full sync request") requestACLTree := func() { - err = r.treeCache.Do(ctx, request.TreeId, func(obj interface{}) error { + err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { t := obj.(tree.ACLTree) t.Lock() defer t.Unlock() @@ -196,7 +203,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str } } snapshotPath = t.SnapshotPath() - fullResponse, err = r.prepareFullSyncResponse(request.TreeId, request.SnapshotPath, request.Changes, t) + fullResponse, err = r.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Changes, t) if err != nil { return err } @@ -205,12 +212,12 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str } requestDocTree := func() { - err = r.treeCache.Do(ctx, request.TreeId, func(obj interface{}) error { + err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { docTree := obj.(tree.DocTree) docTree.Lock() defer docTree.Unlock() - return r.treeCache.Do(ctx, request.TreeId, func(obj interface{}) error { + return r.treeCache.Do(ctx, treeId, func(obj interface{}) error { aclTree := obj.(tree.ACLTree) aclTree.RLock() defer aclTree.RUnlock() @@ -223,7 +230,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str } } snapshotPath = docTree.SnapshotPath() - fullResponse, err = r.prepareFullSyncResponse(request.TreeId, request.SnapshotPath, request.Changes, docTree) + fullResponse, err = r.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Changes, docTree) if err != nil { return err } @@ -232,7 +239,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str }) } - switch request.TreeHeader.Type { + switch header.Type { case treepb.TreeHeader_ACLTree: requestACLTree() case treepb.TreeHeader_DocTree: @@ -244,7 +251,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str if err != nil { return err } - err = r.messageService.SendMessageAsync(senderId, syncproto.WrapFullResponse(fullResponse)) + err = r.messageService.SendMessageAsync(senderId, syncproto.WrapFullResponse(fullResponse, header, treeId)) // if error or nothing has changed if err != nil || len(result.Added) == 0 { return err @@ -255,22 +262,26 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str Heads: result.Heads, Changes: result.Added, SnapshotPath: snapshotPath, - TreeId: request.TreeId, - TreeHeader: request.TreeHeader, } - return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate)) + return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) } -func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncproto.SyncFullResponse) (err error) { +func (r *requestHandler) HandleFullSyncResponse( + ctx context.Context, + senderId string, + response *syncproto.SyncFullResponse, + header *treepb.TreeHeader, + treeId string) (err error) { + var ( snapshotPath []string result tree.AddResult ) - log.With(zap.String("peerId", senderId), zap.String("treeId", response.TreeId)). + log.With(zap.String("peerId", senderId), zap.String("treeId", treeId)). Debug("processing full sync response") responseACLTree := func() { - err = r.treeCache.Do(ctx, response.TreeId, func(obj interface{}) error { + err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { t := obj.(tree.ACLTree) t.Lock() defer t.Unlock() @@ -285,12 +296,12 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st } responseDocTree := func() { - err = r.treeCache.Do(ctx, response.TreeId, func(obj interface{}) error { + err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { docTree := obj.(tree.DocTree) docTree.Lock() defer docTree.Unlock() - return r.treeCache.Do(ctx, response.TreeId, func(obj interface{}) error { + return r.treeCache.Do(ctx, treeId, func(obj interface{}) error { aclTree := obj.(tree.ACLTree) aclTree.RLock() defer aclTree.RUnlock() @@ -305,7 +316,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st }) } - switch response.TreeHeader.Type { + switch header.Type { case treepb.TreeHeader_ACLTree: responseACLTree() case treepb.TreeHeader_DocTree: @@ -320,7 +331,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st } // if we have a new tree if err == treestorage.ErrUnknownTreeId { - err = r.createTree(ctx, response) + err = r.createTree(ctx, response, header, treeId) if err != nil { return err } @@ -335,9 +346,8 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st Heads: result.Heads, Changes: result.Added, SnapshotPath: snapshotPath, - TreeId: response.TreeId, } - return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate)) + return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) } func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, t tree.CommonTree) (*syncproto.SyncFullRequest, error) { @@ -348,9 +358,7 @@ func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.Tr return &syncproto.SyncFullRequest{ Heads: t.Heads(), Changes: ourChanges, - TreeId: treeId, SnapshotPath: t.SnapshotPath(), - TreeHeader: header, }, nil } @@ -382,17 +390,20 @@ func (r *requestHandler) prepareFullSyncResponse( return &syncproto.SyncFullResponse{ Heads: t.Heads(), Changes: final, - TreeId: treeId, SnapshotPath: t.SnapshotPath(), - TreeHeader: t.Header(), }, nil } -func (r *requestHandler) createTree(ctx context.Context, response *syncproto.SyncFullResponse) error { +func (r *requestHandler) createTree( + ctx context.Context, + response *syncproto.SyncFullResponse, + header *treepb.TreeHeader, + treeId string) error { + return r.treeCache.Add( ctx, - response.TreeId, - response.TreeHeader, + treeId, + header, response.Changes, func(obj interface{}) error { return nil diff --git a/service/treecache/service.go b/service/treecache/service.go index 1816e688..a6d215ba 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -6,7 +6,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" @@ -19,7 +18,6 @@ const CName = "treecache" // TODO: add context type TreeFunc = func(tree interface{}) error -type ChangeBuildFunc = func(builder acltree.ChangeBuilder) error var log = logger.NewNamed("treecache") diff --git a/syncproto/helpers.go b/syncproto/helpers.go index e3059bda..38bd5cf1 100644 --- a/syncproto/helpers.go +++ b/syncproto/helpers.go @@ -1,19 +1,33 @@ package syncproto -func WrapHeadUpdate(update *SyncHeadUpdate) *Sync { - return &Sync{Message: &SyncContentValue{ - Value: &SyncContentValueValueOfHeadUpdate{HeadUpdate: update}, - }} +import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" + +func WrapHeadUpdate(update *SyncHeadUpdate, header *treepb.TreeHeader, treeId string) *Sync { + return &Sync{ + Message: &SyncContentValue{ + Value: &SyncContentValueValueOfHeadUpdate{HeadUpdate: update}, + }, + TreeHeader: header, + TreeId: treeId, + } } -func WrapFullRequest(request *SyncFullRequest) *Sync { - return &Sync{Message: &SyncContentValue{ - Value: &SyncContentValueValueOfFullSyncRequest{FullSyncRequest: request}, - }} +func WrapFullRequest(request *SyncFullRequest, header *treepb.TreeHeader, treeId string) *Sync { + return &Sync{ + Message: &SyncContentValue{ + Value: &SyncContentValueValueOfFullSyncRequest{FullSyncRequest: request}, + }, + TreeHeader: header, + TreeId: treeId, + } } -func WrapFullResponse(response *SyncFullResponse) *Sync { - return &Sync{Message: &SyncContentValue{ - Value: &SyncContentValueValueOfFullSyncResponse{FullSyncResponse: response}, - }} +func WrapFullResponse(response *SyncFullResponse, header *treepb.TreeHeader, treeId string) *Sync { + return &Sync{ + Message: &SyncContentValue{ + Value: &SyncContentValueValueOfFullSyncResponse{FullSyncResponse: response}, + }, + TreeHeader: header, + TreeId: treeId, + } } diff --git a/syncproto/proto/sync.proto b/syncproto/proto/sync.proto index 284d6a34..f83aef9a 100644 --- a/syncproto/proto/sync.proto +++ b/syncproto/proto/sync.proto @@ -64,6 +64,8 @@ message Subscription { message Sync { string spaceId = 1; ContentValue message = 2; + tree.TreeHeader treeHeader = 3; + string treeId = 4; message ContentValue { oneof value { @@ -76,9 +78,7 @@ message Sync { message HeadUpdate { repeated string heads = 1; repeated acl.RawChange changes = 2; - string treeId = 3; - repeated string snapshotPath = 4; - tree.TreeHeader treeHeader = 5; + repeated string snapshotPath = 3; } message Full { @@ -86,17 +86,13 @@ message Sync { message Request { repeated string heads = 1; repeated acl.RawChange changes = 2; - string treeId = 3; - repeated string snapshotPath = 4; - tree.TreeHeader treeHeader = 5; + repeated string snapshotPath = 3; } message Response { repeated string heads = 1; repeated acl.RawChange changes = 2; - string treeId = 3; - repeated string snapshotPath = 4; - tree.TreeHeader treeHeader = 5; + repeated string snapshotPath = 3; } } } diff --git a/syncproto/sync.pb.go b/syncproto/sync.pb.go index 64ce8676..bf090662 100644 --- a/syncproto/sync.pb.go +++ b/syncproto/sync.pb.go @@ -590,8 +590,10 @@ func (m *SubscriptionUnsubscribeSpace) GetSpaceId() string { } type Sync struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - Message *SyncContentValue `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Message *SyncContentValue `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + TreeHeader *treepb.TreeHeader `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` + TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` } func (m *Sync) Reset() { *m = Sync{} } @@ -641,6 +643,20 @@ func (m *Sync) GetMessage() *SyncContentValue { return nil } +func (m *Sync) GetTreeHeader() *treepb.TreeHeader { + if m != nil { + return m.TreeHeader + } + return nil +} + +func (m *Sync) GetTreeId() string { + if m != nil { + return m.TreeId + } + return "" +} + type SyncContentValue struct { // Types that are valid to be assigned to Value: // *SyncContentValueValueOfHeadUpdate @@ -742,9 +758,7 @@ func (*SyncContentValue) XXX_OneofWrappers() []interface{} { type SyncHeadUpdate struct { Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` - SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` - TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` } func (m *SyncHeadUpdate) Reset() { *m = SyncHeadUpdate{} } @@ -794,13 +808,6 @@ func (m *SyncHeadUpdate) GetChanges() []*aclpb.RawChange { return nil } -func (m *SyncHeadUpdate) GetTreeId() string { - if m != nil { - return m.TreeId - } - return "" -} - func (m *SyncHeadUpdate) GetSnapshotPath() []string { if m != nil { return m.SnapshotPath @@ -808,13 +815,6 @@ func (m *SyncHeadUpdate) GetSnapshotPath() []string { return nil } -func (m *SyncHeadUpdate) GetTreeHeader() *treepb.TreeHeader { - if m != nil { - return m.TreeHeader - } - return nil -} - type SyncFull struct { } @@ -855,9 +855,7 @@ var xxx_messageInfo_SyncFull proto.InternalMessageInfo type SyncFullRequest struct { Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` - SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` - TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` } func (m *SyncFullRequest) Reset() { *m = SyncFullRequest{} } @@ -907,13 +905,6 @@ func (m *SyncFullRequest) GetChanges() []*aclpb.RawChange { return nil } -func (m *SyncFullRequest) GetTreeId() string { - if m != nil { - return m.TreeId - } - return "" -} - func (m *SyncFullRequest) GetSnapshotPath() []string { if m != nil { return m.SnapshotPath @@ -921,19 +912,10 @@ func (m *SyncFullRequest) GetSnapshotPath() []string { return nil } -func (m *SyncFullRequest) GetTreeHeader() *treepb.TreeHeader { - if m != nil { - return m.TreeHeader - } - return nil -} - type SyncFullResponse struct { Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` - SnapshotPath []string `protobuf:"bytes,4,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` - TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` } func (m *SyncFullResponse) Reset() { *m = SyncFullResponse{} } @@ -983,13 +965,6 @@ func (m *SyncFullResponse) GetChanges() []*aclpb.RawChange { return nil } -func (m *SyncFullResponse) GetTreeId() string { - if m != nil { - return m.TreeId - } - return "" -} - func (m *SyncFullResponse) GetSnapshotPath() []string { if m != nil { return m.SnapshotPath @@ -997,13 +972,6 @@ func (m *SyncFullResponse) GetSnapshotPath() []string { return nil } -func (m *SyncFullResponse) GetTreeHeader() *treepb.TreeHeader { - if m != nil { - return m.TreeHeader - } - return nil -} - func init() { proto.RegisterEnum("anytype.MessageType", MessageType_name, MessageType_value) proto.RegisterEnum("anytype.SystemErrorCode", SystemErrorCode_name, SystemErrorCode_value) @@ -1028,62 +996,61 @@ func init() { func init() { proto.RegisterFile("syncproto/proto/sync.proto", fileDescriptor_4b28dfdd48a89166) } var fileDescriptor_4b28dfdd48a89166 = []byte{ - // 868 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0xd1, 0x8e, 0xda, 0x46, - 0x14, 0x65, 0xc0, 0x40, 0xb8, 0x20, 0xd6, 0x9d, 0x24, 0xad, 0xeb, 0x44, 0x08, 0xa1, 0xb4, 0x45, + // 858 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xd1, 0x8e, 0xda, 0x46, + 0x14, 0xc5, 0x60, 0x20, 0x5c, 0x10, 0xeb, 0x4e, 0x92, 0xd6, 0x75, 0x22, 0x84, 0x50, 0xda, 0x5a, 0x69, 0xe4, 0x8d, 0x68, 0xa3, 0x4a, 0x7d, 0x4b, 0xb6, 0xbb, 0x02, 0x35, 0x05, 0x34, 0xc0, 0x56, - 0xea, 0x4b, 0x34, 0xd8, 0x13, 0x40, 0x78, 0xc7, 0xae, 0xc7, 0xb4, 0xe5, 0x17, 0xfa, 0x94, 0x6f, - 0xe8, 0x37, 0x54, 0x6a, 0xd5, 0x2f, 0xe8, 0x63, 0x1e, 0xfb, 0x58, 0xed, 0x4a, 0xfd, 0x88, 0xf6, - 0xa5, 0x9a, 0x19, 0x1b, 0x7b, 0x9d, 0xcd, 0x07, 0xe4, 0x01, 0x98, 0x7b, 0xee, 0x39, 0xd7, 0xe7, - 0xce, 0x30, 0x17, 0xc0, 0x16, 0x7b, 0xee, 0x86, 0x51, 0x10, 0x07, 0xc7, 0xfa, 0x5d, 0xc6, 0x8e, - 0x5a, 0xe2, 0x3a, 0xe5, 0xfb, 0x78, 0x1f, 0x32, 0xfb, 0x71, 0xb8, 0x5d, 0x1d, 0x53, 0xd7, 0x97, - 0x2f, 0x77, 0x4d, 0xf9, 0x8a, 0x09, 0xb9, 0x0c, 0x97, 0x5a, 0x23, 0x72, 0xb8, 0x96, 0xda, 0x8f, - 0x52, 0x45, 0x1c, 0x31, 0x26, 0xe2, 0x20, 0xa2, 0x2b, 0xa6, 0xd6, 0x99, 0x46, 0x46, 0x9a, 0xdd, - 0x3b, 0x83, 0xfa, 0x37, 0x4c, 0x08, 0xba, 0x62, 0xf8, 0x13, 0xa8, 0xad, 0x19, 0xf5, 0x58, 0x64, - 0xa1, 0x2e, 0xea, 0x37, 0x07, 0x47, 0x4e, 0x62, 0xc2, 0x19, 0x2a, 0x98, 0x24, 0x69, 0x8c, 0xc1, - 0xf0, 0x68, 0x4c, 0xad, 0x72, 0x17, 0xf5, 0x5b, 0x44, 0xad, 0x7b, 0xbf, 0x20, 0xa8, 0x69, 0x1a, - 0xb6, 0xa0, 0x1e, 0x47, 0xd4, 0x65, 0x23, 0x4f, 0x15, 0x6a, 0x91, 0x34, 0xc4, 0xf7, 0xa1, 0x11, - 0xb1, 0xef, 0x77, 0x4c, 0xc4, 0x23, 0x4f, 0xa9, 0x0d, 0x92, 0x01, 0x52, 0x17, 0xb1, 0xd0, 0xdf, - 0x8f, 0x3c, 0xab, 0xa2, 0x72, 0x69, 0x88, 0xfb, 0x60, 0x48, 0x1f, 0x96, 0xd1, 0x45, 0xfd, 0xf6, - 0xe0, 0xce, 0xc1, 0x57, 0xe2, 0x7c, 0xbe, 0x0f, 0x19, 0x51, 0x0c, 0xf9, 0x04, 0x8f, 0x2d, 0x77, - 0xab, 0x11, 0x7f, 0x19, 0x58, 0xd5, 0x2e, 0xea, 0x37, 0x48, 0x06, 0xf4, 0x7e, 0xad, 0x40, 0x6d, - 0xb6, 0x17, 0x31, 0xbb, 0xc0, 0x5f, 0x40, 0x63, 0x4d, 0xb9, 0x27, 0xd6, 0x74, 0xcb, 0x92, 0x7e, - 0x3f, 0x3c, 0xd4, 0xd5, 0x1c, 0x67, 0x98, 0x12, 0x48, 0xc6, 0x95, 0x5e, 0xc2, 0x0d, 0x5f, 0x29, - 0xfb, 0xcd, 0x9c, 0x97, 0x44, 0x33, 0xdd, 0xf0, 0x15, 0x51, 0x0c, 0xfc, 0x11, 0x54, 0xa8, 0xbb, - 0x55, 0xbd, 0x34, 0x07, 0xb7, 0x8b, 0xc4, 0xa7, 0xee, 0x96, 0xc8, 0xbc, 0xfd, 0x04, 0x1a, 0xc3, - 0x5c, 0xf5, 0x23, 0x75, 0x2e, 0x6e, 0xe0, 0x9f, 0xb3, 0x48, 0x6c, 0x02, 0xae, 0xcc, 0x35, 0x48, - 0x11, 0xb6, 0x7b, 0x60, 0xc8, 0x67, 0x61, 0x1b, 0x6e, 0xed, 0xf8, 0xe6, 0xa7, 0xf9, 0xe6, 0x42, - 0xf7, 0x61, 0x90, 0x43, 0x6c, 0x0f, 0xa0, 0xf2, 0xd4, 0xdd, 0xe2, 0x4f, 0xa1, 0xca, 0xa2, 0x28, - 0x88, 0x12, 0xcf, 0x77, 0x8b, 0x56, 0x4e, 0x65, 0x92, 0x68, 0x8e, 0xfd, 0x0a, 0x41, 0x55, 0x01, - 0xd8, 0x01, 0xc3, 0x0d, 0x3c, 0x5d, 0xb5, 0x3d, 0xb0, 0x6f, 0x54, 0x39, 0x27, 0x81, 0xc7, 0x88, - 0xe2, 0xe1, 0x2e, 0x34, 0x3d, 0x26, 0xdc, 0x68, 0x13, 0xc6, 0xd2, 0x77, 0x59, 0xf9, 0xce, 0x43, - 0xbd, 0x27, 0x60, 0x48, 0x3e, 0x6e, 0x42, 0x7d, 0x31, 0xfe, 0x7a, 0x3c, 0xf9, 0x76, 0x6c, 0x96, - 0x70, 0x17, 0xee, 0x2f, 0xc6, 0xb3, 0xc5, 0x74, 0x3a, 0x21, 0xf3, 0xd3, 0xaf, 0x5e, 0x4c, 0xc9, - 0x64, 0x3e, 0x39, 0x99, 0x3c, 0x7f, 0x71, 0x7e, 0x4a, 0x66, 0xa3, 0xc9, 0xd8, 0x84, 0xde, 0xcf, - 0x65, 0x68, 0xcd, 0x76, 0xcb, 0x43, 0x1d, 0xfc, 0x1c, 0xda, 0x42, 0xc7, 0x4b, 0x36, 0x0b, 0xa9, - 0x9b, 0x9e, 0xe0, 0x83, 0xcc, 0x63, 0x8e, 0x9e, 0x06, 0x09, 0x97, 0x14, 0xb4, 0x98, 0x80, 0xb9, - 0xe3, 0x85, 0x7a, 0x7a, 0xa7, 0x3e, 0xbe, 0xb9, 0xde, 0xa2, 0xc0, 0x26, 0x6f, 0xe8, 0xed, 0x87, - 0xd0, 0xbe, 0xfe, 0x54, 0xf9, 0xed, 0x16, 0x61, 0x76, 0x2b, 0x1a, 0x24, 0x0d, 0xed, 0x47, 0x60, - 0x16, 0x2b, 0xbe, 0x9d, 0xdd, 0xfb, 0xb7, 0x06, 0xc6, 0x6c, 0xcf, 0xdd, 0xb7, 0x53, 0xf0, 0xe7, - 0x50, 0xbf, 0xd0, 0x37, 0x23, 0xe9, 0x23, 0x7f, 0x76, 0xdc, 0x75, 0x4e, 0x02, 0x1e, 0x33, 0x1e, - 0x9f, 0x53, 0x7f, 0xc7, 0x48, 0x4a, 0xb5, 0xff, 0x41, 0xd0, 0xca, 0x67, 0xf0, 0x97, 0x00, 0xf2, - 0xc2, 0x2f, 0x42, 0x8f, 0xc6, 0xe9, 0x0e, 0x5b, 0xd7, 0x2b, 0x0d, 0x0f, 0xf9, 0x61, 0x89, 0xe4, - 0xd8, 0xf8, 0x0c, 0x8e, 0x5e, 0xee, 0x7c, 0x5f, 0x92, 0x88, 0xbe, 0xe0, 0x37, 0x5b, 0x39, 0xdb, - 0xf9, 0xbe, 0x93, 0x30, 0x86, 0x25, 0x52, 0x14, 0xe1, 0x11, 0x98, 0x19, 0x24, 0xc2, 0x80, 0x0b, - 0x96, 0x5c, 0xa8, 0x7b, 0x37, 0x16, 0xd2, 0x94, 0x61, 0x89, 0xbc, 0x21, 0x7b, 0x56, 0x87, 0xea, - 0x0f, 0xb2, 0x2f, 0xfb, 0x0f, 0x04, 0x90, 0x19, 0xc7, 0x77, 0xa0, 0x2a, 0x8d, 0x0b, 0x0b, 0x75, - 0x2b, 0xfd, 0x06, 0xd1, 0x01, 0xee, 0x43, 0x3d, 0x19, 0xab, 0x56, 0xb9, 0x5b, 0xe9, 0x37, 0x07, - 0x6d, 0x87, 0xba, 0xbe, 0x43, 0xe8, 0x8f, 0x27, 0x0a, 0x26, 0x69, 0x1a, 0xbf, 0x0f, 0x35, 0x39, - 0x4f, 0x93, 0xa9, 0xd5, 0x20, 0x49, 0x84, 0x7b, 0xd0, 0x12, 0x9c, 0x86, 0x62, 0x1d, 0xc4, 0x53, - 0x1a, 0xaf, 0x2d, 0x43, 0x95, 0xbf, 0x86, 0xe1, 0xc7, 0x00, 0x92, 0xad, 0x07, 0xa7, 0x9a, 0x57, - 0xcd, 0x81, 0xe9, 0xa8, 0xf1, 0x3c, 0x3f, 0xe0, 0x24, 0xc7, 0xb1, 0xff, 0x2b, 0x83, 0x21, 0x7b, - 0xb5, 0x7f, 0x43, 0x50, 0x4f, 0x77, 0xe9, 0xdd, 0x6a, 0xe1, 0x77, 0x04, 0xb7, 0xd2, 0x53, 0x79, - 0xb7, 0xac, 0x3f, 0x3c, 0x87, 0x66, 0xee, 0x37, 0x07, 0xdf, 0x85, 0xf7, 0x72, 0xa1, 0x9e, 0x8b, - 0x66, 0x09, 0xdf, 0x83, 0x0f, 0xf2, 0x70, 0x6e, 0x74, 0x98, 0x08, 0xdf, 0x86, 0xa3, 0x6b, 0x1a, - 0xee, 0x9a, 0xe5, 0x67, 0x0f, 0xfe, 0xbc, 0xec, 0xa0, 0xd7, 0x97, 0x1d, 0xf4, 0xf7, 0x65, 0x07, - 0xbd, 0xba, 0xea, 0x94, 0x5e, 0x5f, 0x75, 0x4a, 0x7f, 0x5d, 0x75, 0x4a, 0xdf, 0xc1, 0xf1, 0xe1, - 0x5f, 0xc2, 0xb2, 0xa6, 0x3e, 0x3e, 0xfb, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xad, 0xe7, 0x46, - 0x39, 0x08, 0x00, 0x00, + 0xea, 0x4b, 0x34, 0xd8, 0x13, 0x40, 0x78, 0xc7, 0xae, 0xc7, 0x6e, 0xcb, 0x2f, 0xf4, 0x29, 0xdf, + 0xd0, 0x6f, 0xe8, 0x47, 0xf4, 0x31, 0x8f, 0x7d, 0xac, 0x76, 0xd5, 0x7e, 0x47, 0x35, 0x33, 0x36, + 0xf6, 0x3a, 0xe4, 0x35, 0x0f, 0xc0, 0xdc, 0x33, 0xe7, 0xdc, 0x7b, 0x2e, 0xe3, 0xb9, 0x06, 0x8b, + 0xef, 0x99, 0x1b, 0x46, 0x41, 0x1c, 0x9c, 0xaa, 0x6f, 0x11, 0x3b, 0x72, 0x89, 0x9a, 0x84, 0xed, + 0xe3, 0x7d, 0x48, 0xad, 0xa7, 0xe1, 0x6e, 0x7d, 0x4a, 0x5c, 0x5f, 0x7c, 0xdc, 0x0d, 0x61, 0x6b, + 0xca, 0xc5, 0x32, 0x5c, 0x29, 0x0d, 0x2f, 0xe0, 0x4a, 0x6a, 0x3d, 0xc9, 0x14, 0x71, 0x44, 0x29, + 0x8f, 0x83, 0x88, 0xac, 0xa9, 0x5c, 0xe7, 0x1a, 0x11, 0x29, 0xf6, 0xe0, 0x02, 0x9a, 0x3f, 0x50, + 0xce, 0xc9, 0x9a, 0xa2, 0x2f, 0xa0, 0xb1, 0xa1, 0xc4, 0xa3, 0x91, 0xa9, 0xf5, 0x35, 0xbb, 0x3d, + 0x3c, 0x71, 0x52, 0x13, 0xce, 0x48, 0xc2, 0x38, 0xdd, 0x46, 0x08, 0x74, 0x8f, 0xc4, 0xc4, 0xac, + 0xf6, 0x35, 0xbb, 0x83, 0xe5, 0x7a, 0xf0, 0x87, 0x06, 0x0d, 0x45, 0x43, 0x26, 0x34, 0xe3, 0x88, + 0xb8, 0x74, 0xec, 0xc9, 0x44, 0x1d, 0x9c, 0x85, 0xe8, 0x21, 0xb4, 0x22, 0xfa, 0x73, 0x42, 0x79, + 0x3c, 0xf6, 0xa4, 0x5a, 0xc7, 0x39, 0x20, 0x74, 0x11, 0x0d, 0xfd, 0xfd, 0xd8, 0x33, 0x6b, 0x72, + 0x2f, 0x0b, 0x91, 0x0d, 0xba, 0xf0, 0x61, 0xea, 0x7d, 0xcd, 0xee, 0x0e, 0xef, 0x1d, 0x7c, 0xa5, + 0xce, 0x17, 0xfb, 0x90, 0x62, 0xc9, 0x10, 0x15, 0x3c, 0xba, 0x4a, 0xd6, 0x63, 0xf6, 0x3a, 0x30, + 0xeb, 0x7d, 0xcd, 0x6e, 0xe1, 0x1c, 0x18, 0xfc, 0x59, 0x83, 0xc6, 0x7c, 0xcf, 0x63, 0x7a, 0x85, + 0xbe, 0x81, 0xd6, 0x86, 0x30, 0x8f, 0x6f, 0xc8, 0x8e, 0xa6, 0xfd, 0x7e, 0x7a, 0xc8, 0xab, 0x38, + 0xce, 0x28, 0x23, 0xe0, 0x9c, 0x2b, 0xbc, 0x84, 0x5b, 0xb6, 0x96, 0xf6, 0xdb, 0x05, 0x2f, 0xa9, + 0x66, 0xb6, 0x65, 0x6b, 0x2c, 0x19, 0xe8, 0x33, 0xa8, 0x11, 0x77, 0x27, 0x7b, 0x69, 0x0f, 0xef, + 0x96, 0x89, 0xcf, 0xdd, 0x1d, 0x16, 0xfb, 0xd6, 0x33, 0x68, 0x8d, 0x0a, 0xd9, 0x4f, 0xe4, 0xb9, + 0xb8, 0x81, 0x7f, 0x49, 0x23, 0xbe, 0x0d, 0x98, 0x34, 0xd7, 0xc2, 0x65, 0xd8, 0x1a, 0x80, 0x2e, + 0x6a, 0x21, 0x0b, 0xee, 0x24, 0x6c, 0xfb, 0xdb, 0x62, 0x7b, 0xa5, 0xfa, 0xd0, 0xf1, 0x21, 0xb6, + 0x86, 0x50, 0x7b, 0xee, 0xee, 0xd0, 0x97, 0x50, 0xa7, 0x51, 0x14, 0x44, 0xa9, 0xe7, 0xfb, 0x65, + 0x2b, 0xe7, 0x62, 0x13, 0x2b, 0x8e, 0xf5, 0x46, 0x83, 0xba, 0x04, 0x90, 0x03, 0xba, 0x1b, 0x78, + 0x2a, 0x6b, 0x77, 0x68, 0x1d, 0x55, 0x39, 0x67, 0x81, 0x47, 0xb1, 0xe4, 0xa1, 0x3e, 0xb4, 0x3d, + 0xca, 0xdd, 0x68, 0x1b, 0xc6, 0xc2, 0x77, 0x55, 0xfa, 0x2e, 0x42, 0x83, 0x67, 0xa0, 0x0b, 0x3e, + 0x6a, 0x43, 0x73, 0x39, 0xf9, 0x7e, 0x32, 0xfd, 0x71, 0x62, 0x54, 0x50, 0x1f, 0x1e, 0x2e, 0x27, + 0xf3, 0xe5, 0x6c, 0x36, 0xc5, 0x8b, 0xf3, 0xef, 0x5e, 0xcd, 0xf0, 0x74, 0x31, 0x3d, 0x9b, 0xbe, + 0x7c, 0x75, 0x79, 0x8e, 0xe7, 0xe3, 0xe9, 0xc4, 0x80, 0xc1, 0xef, 0x55, 0xe8, 0xcc, 0x93, 0xd5, + 0x21, 0x0f, 0x7a, 0x09, 0x5d, 0xae, 0xe2, 0x15, 0x9d, 0x87, 0xc4, 0xcd, 0x4e, 0xf0, 0x51, 0xee, + 0xb1, 0x40, 0xcf, 0x82, 0x94, 0x8b, 0x4b, 0x5a, 0x84, 0xc1, 0x48, 0x58, 0x29, 0x9f, 0xfa, 0xa7, + 0x3e, 0x3f, 0x9e, 0x6f, 0x59, 0x62, 0xe3, 0x77, 0xf4, 0xd6, 0x63, 0xe8, 0xde, 0xae, 0x2a, 0x9e, + 0x6e, 0x1e, 0xe6, 0xb7, 0xa2, 0x85, 0xb3, 0xd0, 0x7a, 0x02, 0x46, 0x39, 0xe3, 0xfb, 0xd9, 0x83, + 0x9b, 0x3a, 0xe8, 0xf3, 0x3d, 0x73, 0xdf, 0x4f, 0x41, 0x5f, 0x43, 0xf3, 0x4a, 0xdd, 0x8c, 0xb4, + 0x8f, 0xe2, 0xd9, 0x31, 0xd7, 0x39, 0x0b, 0x58, 0x4c, 0x59, 0x7c, 0x49, 0xfc, 0x84, 0xe2, 0x8c, + 0x8a, 0x9e, 0x02, 0x88, 0xb9, 0xa0, 0x2e, 0x71, 0xfa, 0xd4, 0x1a, 0x8e, 0x1c, 0x15, 0x8b, 0x03, + 0x8e, 0x0b, 0x1c, 0xf4, 0x31, 0x34, 0x44, 0x34, 0xf6, 0xe4, 0xc5, 0x6c, 0xe1, 0x34, 0xb2, 0xfe, + 0xd3, 0xa0, 0x53, 0xac, 0x81, 0xbe, 0x05, 0x10, 0xa3, 0x63, 0x19, 0x7a, 0x24, 0xce, 0xce, 0xca, + 0xbc, 0xed, 0x69, 0x74, 0xd8, 0x1f, 0x55, 0x70, 0x81, 0x8d, 0x2e, 0xe0, 0xe4, 0x75, 0xe2, 0xfb, + 0x82, 0x84, 0xd5, 0xa8, 0x38, 0xde, 0xd4, 0x45, 0xe2, 0xfb, 0x4e, 0xca, 0x18, 0x55, 0x70, 0x59, + 0x84, 0xc6, 0x60, 0xe4, 0x10, 0x0f, 0x03, 0xc6, 0x69, 0xda, 0xe4, 0x83, 0xa3, 0x89, 0x14, 0x65, + 0x54, 0xc1, 0xef, 0xc8, 0x5e, 0x34, 0xa1, 0xfe, 0x8b, 0xe8, 0xcb, 0x0a, 0x01, 0x72, 0xdf, 0xe8, + 0x1e, 0xd4, 0x85, 0x6f, 0x6e, 0x6a, 0xfd, 0x9a, 0xdd, 0xc2, 0x2a, 0x40, 0x36, 0x34, 0xd3, 0xf9, + 0x6c, 0x56, 0xfb, 0x35, 0xbb, 0x3d, 0xec, 0x3a, 0xc4, 0xf5, 0x1d, 0x4c, 0x7e, 0x3d, 0x93, 0x30, + 0xce, 0xb6, 0xd1, 0x00, 0x3a, 0x9c, 0x91, 0x90, 0x6f, 0x82, 0x78, 0x46, 0xe2, 0x8d, 0x59, 0x93, + 0x69, 0x6e, 0x61, 0xd6, 0xbf, 0x1a, 0xe8, 0xc2, 0xa0, 0x75, 0x05, 0xcd, 0xac, 0xb3, 0x0f, 0x51, + 0x97, 0xc1, 0x9d, 0xac, 0xfd, 0x0f, 0x51, 0xef, 0xf1, 0x25, 0xb4, 0x0b, 0xc3, 0x1d, 0xdd, 0x87, + 0x8f, 0x0a, 0xa1, 0x1a, 0x40, 0x46, 0x05, 0x3d, 0x80, 0x4f, 0x8a, 0x70, 0xe1, 0x8e, 0x1a, 0x1a, + 0xba, 0x0b, 0x27, 0xb7, 0x34, 0xcc, 0x35, 0xaa, 0x2f, 0x1e, 0xfd, 0x75, 0xdd, 0xd3, 0xde, 0x5e, + 0xf7, 0xb4, 0x7f, 0xae, 0x7b, 0xda, 0x9b, 0x9b, 0x5e, 0xe5, 0xed, 0x4d, 0xaf, 0xf2, 0xf7, 0x4d, + 0xaf, 0xf2, 0x13, 0x9c, 0x1e, 0x5e, 0xc7, 0xab, 0x86, 0xfc, 0xf9, 0xea, 0xff, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x6a, 0x04, 0xc0, 0x87, 0xa2, 0x07, 0x00, 0x00, } func (m *Message) Marshal() (dAtA []byte, err error) { @@ -1494,6 +1461,25 @@ func (m *Sync) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.TreeId) > 0 { + i -= len(m.TreeId) + copy(dAtA[i:], m.TreeId) + i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) + i-- + dAtA[i] = 0x22 + } + if m.TreeHeader != nil { + { + size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } if m.Message != nil { { size, err := m.Message.MarshalToSizedBuffer(dAtA[:i]) @@ -1631,34 +1617,15 @@ func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.TreeHeader != nil { - { - size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } if len(m.SnapshotPath) > 0 { for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SnapshotPath[iNdEx]) copy(dAtA[i:], m.SnapshotPath[iNdEx]) i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } } - if len(m.TreeId) > 0 { - i -= len(m.TreeId) - copy(dAtA[i:], m.TreeId) - i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) - i-- - dAtA[i] = 0x1a - } if len(m.Changes) > 0 { for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { { @@ -1728,34 +1695,15 @@ func (m *SyncFullRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.TreeHeader != nil { - { - size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } if len(m.SnapshotPath) > 0 { for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SnapshotPath[iNdEx]) copy(dAtA[i:], m.SnapshotPath[iNdEx]) i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } } - if len(m.TreeId) > 0 { - i -= len(m.TreeId) - copy(dAtA[i:], m.TreeId) - i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) - i-- - dAtA[i] = 0x1a - } if len(m.Changes) > 0 { for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { { @@ -1802,34 +1750,15 @@ func (m *SyncFullResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.TreeHeader != nil { - { - size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } if len(m.SnapshotPath) > 0 { for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.SnapshotPath[iNdEx]) copy(dAtA[i:], m.SnapshotPath[iNdEx]) i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } } - if len(m.TreeId) > 0 { - i -= len(m.TreeId) - copy(dAtA[i:], m.TreeId) - i = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) - i-- - dAtA[i] = 0x1a - } if len(m.Changes) > 0 { for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { { @@ -2042,6 +1971,14 @@ func (m *Sync) Size() (n int) { l = m.Message.Size() n += 1 + l + sovSync(uint64(l)) } + if m.TreeHeader != nil { + l = m.TreeHeader.Size() + n += 1 + l + sovSync(uint64(l)) + } + l = len(m.TreeId) + if l > 0 { + n += 1 + l + sovSync(uint64(l)) + } return n } @@ -2111,20 +2048,12 @@ func (m *SyncHeadUpdate) Size() (n int) { n += 1 + l + sovSync(uint64(l)) } } - l = len(m.TreeId) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } if len(m.SnapshotPath) > 0 { for _, s := range m.SnapshotPath { l = len(s) n += 1 + l + sovSync(uint64(l)) } } - if m.TreeHeader != nil { - l = m.TreeHeader.Size() - n += 1 + l + sovSync(uint64(l)) - } return n } @@ -2155,20 +2084,12 @@ func (m *SyncFullRequest) Size() (n int) { n += 1 + l + sovSync(uint64(l)) } } - l = len(m.TreeId) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } if len(m.SnapshotPath) > 0 { for _, s := range m.SnapshotPath { l = len(s) n += 1 + l + sovSync(uint64(l)) } } - if m.TreeHeader != nil { - l = m.TreeHeader.Size() - n += 1 + l + sovSync(uint64(l)) - } return n } @@ -2190,20 +2111,12 @@ func (m *SyncFullResponse) Size() (n int) { n += 1 + l + sovSync(uint64(l)) } } - l = len(m.TreeId) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } if len(m.SnapshotPath) > 0 { for _, s := range m.SnapshotPath { l = len(s) n += 1 + l + sovSync(uint64(l)) } } - if m.TreeHeader != nil { - l = m.TreeHeader.Size() - n += 1 + l + sovSync(uint64(l)) - } return n } @@ -3385,6 +3298,74 @@ func (m *Sync) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TreeHeader == nil { + m.TreeHeader = &treepb.TreeHeader{} + } + if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + 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 ErrIntOverflowSync + } + 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 ErrInvalidLengthSync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TreeId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) @@ -3657,38 +3638,6 @@ func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 3: - 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 ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TreeId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) } @@ -3720,42 +3669,6 @@ func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { } m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.TreeHeader == nil { - m.TreeHeader = &treepb.TreeHeader{} - } - if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) @@ -3923,38 +3836,6 @@ func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 3: - 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 ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TreeId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) } @@ -3986,42 +3867,6 @@ func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { } m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.TreeHeader == nil { - m.TreeHeader = &treepb.TreeHeader{} - } - if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) @@ -4139,38 +3984,6 @@ func (m *SyncFullResponse) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 3: - 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 ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TreeId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) } @@ -4202,42 +4015,6 @@ func (m *SyncFullResponse) Unmarshal(dAtA []byte) error { } m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.TreeHeader == nil { - m.TreeHeader = &treepb.TreeHeader{} - } - if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) From 66067a35065c02cd313a92eebfa894405082327e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 11 Aug 2022 19:04:29 +0200 Subject: [PATCH 012/219] Fix bugs related to docTree and aclTree --- pkg/acl/aclchanges/change.go | 4 +-- pkg/acl/acltree/change.go | 2 +- pkg/acl/tree/acltree.go | 36 ++++++++++++++----- pkg/acl/tree/change.go | 5 ++- pkg/acl/tree/changebuilder.go | 4 +++ pkg/acl/tree/doctree.go | 36 ++++++++++++++----- pkg/acl/tree/treebuilder.go | 8 +++-- pkg/acl/tree/treestorage.go | 16 +++++---- pkg/acl/treestorage/inmemory.go | 4 +-- service/document/service.go | 12 ++----- service/sync/requesthandler/requesthandler.go | 35 ++++++++++++++++-- service/treecache/service.go | 1 + 12 files changed, 116 insertions(+), 47 deletions(-) diff --git a/pkg/acl/aclchanges/change.go b/pkg/acl/aclchanges/change.go index be08fca2..3d3b4376 100644 --- a/pkg/acl/aclchanges/change.go +++ b/pkg/acl/aclchanges/change.go @@ -1,11 +1,11 @@ package aclchanges import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/gogo/protobuf/proto" ) type Change interface { - ProtoChange() *aclpb.ACLChange + ProtoChange() proto.Marshaler DecryptedChangeContent() []byte Signature() []byte CID() string diff --git a/pkg/acl/acltree/change.go b/pkg/acl/acltree/change.go index c768ef23..7ad71209 100644 --- a/pkg/acl/acltree/change.go +++ b/pkg/acl/acltree/change.go @@ -80,7 +80,7 @@ func NewACLChange(id string, ch *aclpb.ACLChange) *Change { } } -func (ch *Change) ProtoChange() *aclpb.ACLChange { +func (ch *Change) ProtoChange() proto.Marshaler { return ch.Content } diff --git a/pkg/acl/tree/acltree.go b/pkg/acl/tree/acltree.go index caefb1fb..c0724c97 100644 --- a/pkg/acl/tree/acltree.go +++ b/pkg/acl/tree/acltree.go @@ -111,7 +111,9 @@ func BuildACLTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountDat return nil, err } - listener.Rebuild(aclTree) + if listener != nil { + listener.Rebuild(aclTree) + } return aclTree, nil } @@ -151,7 +153,9 @@ func BuildACLTree(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder, l return nil, err } - listener.Rebuild(aclTree) + if listener != nil { + listener.Rebuild(aclTree) + } return aclTree, nil } @@ -259,13 +263,28 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha var mode Mode var changes []*Change // TODO: = addChangesBuf[:0] ... - for _, ch := range rawChanges { + var notSeenIdx []int + prevHeads := a.tree.Heads() + for idx, ch := range rawChanges { + if a.HasChange(ch.Id) { + continue + } + change, err := NewFromRawChange(ch) // TODO: think what if we will have incorrect signatures on rawChanges, how everything will work if err != nil { continue } changes = append(changes, change) + notSeenIdx = append(notSeenIdx, idx) + } + + if len(notSeenIdx) == 0 { + return AddResult{ + OldHeads: prevHeads, + Heads: prevHeads, + Summary: AddResultSummaryNothing, + }, nil } defer func() { @@ -286,6 +305,7 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha if a.updateListener == nil { return } + switch mode { case Append: a.updateListener.Update(a) @@ -298,9 +318,10 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha getAddedChanges := func() []*aclpb.RawChange { var added []*aclpb.RawChange - for _, ch := range rawChanges { - if _, exists := a.tree.attached[ch.Id]; exists { - added = append(added, ch) + for _, idx := range notSeenIdx { + rawChange := rawChanges[idx] + if _, exists := a.tree.attached[rawChange.Id]; exists { + added = append(added, rawChange) } } return added @@ -317,7 +338,6 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha } } - prevHeads := a.tree.Heads() rebuild := func() (AddResult, error) { err = a.rebuildFromStorage() if err != nil { @@ -337,7 +357,7 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha case Nothing: for _, ch := range changes { // rebuilding if the snapshot is different from the root - if ch.SnapshotId != a.tree.RootId() { + if ch.SnapshotId != a.tree.RootId() && ch.SnapshotId != "" { return rebuild() } } diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index 3ee4d05d..ac0a55c2 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -29,9 +29,8 @@ type Change struct { Sign []byte } -func (ch *Change) ProtoChange() *aclpb.ACLChange { - //TODO implement me - panic("implement me") +func (ch *Change) ProtoChange() proto.Marshaler { + return ch.Content } func (ch *Change) DecryptContents(key *symmetric.Key) error { diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index fc390f4a..98961e4b 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -101,6 +101,10 @@ func (c *aclChangeBuilder) BuildAndApply() (*Change, []byte, error) { Timestamp: int64(time.Now().Nanosecond()), Identity: c.acc.Identity, } + if c.aclState.currentReadKeyHash == 0 { + // setting IsSnapshot for initial change + aclChange.IsSnapshot = true + } marshalledData, err := proto.Marshal(c.aclData) if err != nil { diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index bd056a72..00960554 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -74,7 +74,9 @@ func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountDat return nil, err } - listener.Rebuild(docTree) + if listener != nil { + listener.Rebuild(docTree) + } return docTree, nil } @@ -111,7 +113,9 @@ func BuildDocTree(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder, l return nil, err } - listener.Rebuild(docTree) + if listener != nil { + listener.Rebuild(docTree) + } return docTree, nil } @@ -177,6 +181,7 @@ func (d *docTree) AddContent(ctx context.Context, aclTree ACLTree, content proto CurrentReadKeyHash: state.currentReadKeyHash, Timestamp: int64(time.Now().Nanosecond()), Identity: d.accountData.Identity, + IsSnapshot: isSnapshot, } marshalledData, err := content.Marshal() @@ -234,13 +239,28 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges var mode Mode var changes []*Change // TODO: = addChangesBuf[:0] ... - for _, ch := range rawChanges { + var notSeenIdx []int + prevHeads := d.tree.Heads() + for idx, ch := range rawChanges { + if d.HasChange(ch.Id) { + continue + } + change, err := NewFromRawChange(ch) // TODO: think what if we will have incorrect signatures on rawChanges, how everything will work if err != nil { continue } changes = append(changes, change) + notSeenIdx = append(notSeenIdx, idx) + } + + if len(notSeenIdx) == 0 { + return AddResult{ + OldHeads: prevHeads, + Heads: prevHeads, + Summary: AddResultSummaryNothing, + }, nil } defer func() { @@ -274,15 +294,15 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges getAddedChanges := func() []*aclpb.RawChange { var added []*aclpb.RawChange - for _, ch := range rawChanges { - if _, exists := d.tree.attached[ch.Id]; exists { - added = append(added, ch) + for _, idx := range notSeenIdx { + rawChange := rawChanges[idx] + if _, exists := d.tree.attached[rawChange.Id]; exists { + added = append(added, rawChange) } } return added } - prevHeads := d.tree.Heads() rebuild := func() (AddResult, error) { err = d.rebuildFromStorage(aclTree) if err != nil { @@ -313,7 +333,7 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges case Nothing: for _, ch := range changes { // rebuilding if the snapshot is different from the root - if ch.SnapshotId != d.tree.RootId() { + if ch.SnapshotId != d.tree.RootId() && ch.SnapshotId != "" { return rebuild() } } diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index b243c0b4..5376bee6 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -10,6 +10,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "github.com/gogo/protobuf/proto" + "go.uber.org/zap" "time" ) @@ -52,6 +53,7 @@ func (tb *treeBuilder) Build(fromStart bool) (*Tree, error) { headsAndOrphans = append(headsAndOrphans, orphans...) headsAndOrphans = append(headsAndOrphans, heads...) + log.With(zap.Strings("heads", heads), zap.Strings("orphans", orphans)).Debug("building tree") if fromStart { if err := tb.buildTreeFromStart(headsAndOrphans); err != nil { return nil, fmt.Errorf("buildTree error: %v", err) @@ -67,7 +69,7 @@ func (tb *treeBuilder) Build(fromStart bool) (*Tree, error) { } } - tb.cache = nil + tb.cache = make(map[string]*Change) return tb.tree, nil } @@ -187,8 +189,8 @@ func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { return nil, err } - tb.cache[id] = NewChange(id, verifiedChange) - + ch = NewChange(id, verifiedChange) + tb.cache[id] = ch return ch, nil } diff --git a/pkg/acl/tree/treestorage.go b/pkg/acl/tree/treestorage.go index 297f1977..a407a374 100644 --- a/pkg/acl/tree/treestorage.go +++ b/pkg/acl/tree/treestorage.go @@ -35,7 +35,7 @@ func CreateNewTreeStorageWithACL( Signature: change.Signature(), Id: change.CID(), } - header, id, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_ACLTree) + header, id, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_ACLTree, "") if err != nil { return nil, err } @@ -64,6 +64,7 @@ func CreateNewTreeStorage( CurrentReadKeyHash: state.currentReadKeyHash, Timestamp: int64(time.Now().Nanosecond()), Identity: acc.Identity, + IsSnapshot: true, } marshalledData, err := content.Marshal() @@ -84,7 +85,7 @@ func CreateNewTreeStorage( if err != nil { return nil, err } - id, err := cid.NewCIDFromBytes(fullMarshalledChange) + changeId, err := cid.NewCIDFromBytes(fullMarshalledChange) if err != nil { return nil, err } @@ -92,29 +93,30 @@ func CreateNewTreeStorage( rawChange := &aclpb.RawChange{ Payload: fullMarshalledChange, Signature: signature, - Id: id, + Id: changeId, } - header, id, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_DocTree) + header, treeId, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_DocTree, aclTree.ID()) if err != nil { return nil, err } - thr, err := create(id, header, []*aclpb.RawChange{rawChange}) + thr, err := create(treeId, header, []*aclpb.RawChange{rawChange}) if err != nil { return nil, err } - err = thr.SetHeads([]string{id}) + err = thr.SetHeads([]string{changeId}) if err != nil { return nil, err } return thr, nil } -func createTreeHeaderAndId(change *aclpb.RawChange, treeType treepb.TreeHeaderTreeType) (*treepb.TreeHeader, string, error) { +func createTreeHeaderAndId(change *aclpb.RawChange, treeType treepb.TreeHeaderTreeType, aclTreeId string) (*treepb.TreeHeader, string, error) { header := &treepb.TreeHeader{ FirstChangeId: change.Id, Type: treeType, + AclTreeId: aclTreeId, } marshalledHeader, err := proto.Marshal(header) if err != nil { diff --git a/pkg/acl/treestorage/inmemory.go b/pkg/acl/treestorage/inmemory.go index adfa9af8..7025a701 100644 --- a/pkg/acl/treestorage/inmemory.go +++ b/pkg/acl/treestorage/inmemory.go @@ -7,7 +7,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" - "github.com/gogo/protobuf/proto" "sync" ) @@ -106,9 +105,8 @@ func (t *inMemoryTreeStorage) AddChange(change aclchanges.Change) error { defer t.Unlock() signature := change.Signature() id := change.CID() - aclChange := change.ProtoChange() - fullMarshalledChange, err := proto.Marshal(aclChange) + fullMarshalledChange, err := change.ProtoChange().Marshal() if err != nil { return err } diff --git a/service/document/service.go b/service/document/service.go index 5d6b96b6..12c3c6a1 100644 --- a/service/document/service.go +++ b/service/document/service.go @@ -118,10 +118,8 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err return s.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ Heads: heads, Changes: []*aclpb.RawChange{ch}, - TreeId: id, SnapshotPath: snapshotPath, - TreeHeader: header, - })) + }, header, id)) } func (s *service) CreateACLTree(ctx context.Context) (id string, err error) { @@ -172,10 +170,8 @@ func (s *service) CreateACLTree(ctx context.Context) (id string, err error) { err = s.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ Heads: heads, Changes: []*aclpb.RawChange{ch}, - TreeId: id, SnapshotPath: snapshotPath, - TreeHeader: header, - })) + }, header, id)) return id, nil } @@ -227,10 +223,8 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text err = s.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ Heads: heads, Changes: []*aclpb.RawChange{ch}, - TreeId: id, SnapshotPath: snapshotPath, - TreeHeader: header, - })) + }, header, id)) if err != nil { return "", err } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 3ffbda84..4600ab96 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -93,6 +93,11 @@ func (r *requestHandler) HandleHeadUpdate( t := obj.(tree.ACLTree) t.Lock() defer t.Unlock() + + if slice.UnsortedEquals(update.Heads, t.Heads()) { + return nil + } + // TODO: check if we already have those changes result, err = t.AddRawChanges(ctx, update.Changes...) if err != nil { @@ -118,10 +123,15 @@ func (r *requestHandler) HandleHeadUpdate( docTree.Lock() defer docTree.Unlock() - return r.treeCache.Do(ctx, treeId, func(obj interface{}) error { + if slice.UnsortedEquals(update.Heads, docTree.Heads()) { + return nil + } + + return r.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error { aclTree := obj.(tree.ACLTree) aclTree.RLock() defer aclTree.RUnlock() + // TODO: check if we already have those changes result, err = docTree.AddRawChanges(ctx, aclTree, update.Changes...) if err != nil { @@ -164,6 +174,7 @@ func (r *requestHandler) HandleHeadUpdate( if err != nil || len(result.Added) == 0 { return err } + log.Info("res", zap.Int("result added", len(result.Added))) // otherwise sending heads update message newUpdate := &syncproto.SyncHeadUpdate{ Heads: result.Heads, @@ -194,6 +205,10 @@ func (r *requestHandler) HandleFullSyncRequest( t.Lock() defer t.Unlock() + //if slice.UnsortedEquals(request.Heads, t.Heads()) { + // return nil + //} + // TODO: check if we already have those changes // if we have non-empty request if len(request.Heads) != 0 { @@ -212,12 +227,17 @@ func (r *requestHandler) HandleFullSyncRequest( } requestDocTree := func() { + log.Info("getting doc tree from treeCache", zap.String("treeId", treeId)) err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { docTree := obj.(tree.DocTree) docTree.Lock() defer docTree.Unlock() - return r.treeCache.Do(ctx, treeId, func(obj interface{}) error { + //if slice.UnsortedEquals(request.Heads, docTree.Heads()) { + // return nil + //} + log.Info("getting tree from treeCache", zap.String("aclId", docTree.Header().AclTreeId)) + return r.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error { aclTree := obj.(tree.ACLTree) aclTree.RLock() defer aclTree.RUnlock() @@ -285,6 +305,11 @@ func (r *requestHandler) HandleFullSyncResponse( t := obj.(tree.ACLTree) t.Lock() defer t.Unlock() + + if slice.UnsortedEquals(response.Heads, t.Heads()) { + return nil + } + // TODO: check if we already have those changes result, err = t.AddRawChanges(ctx, response.Changes...) if err != nil { @@ -301,7 +326,11 @@ func (r *requestHandler) HandleFullSyncResponse( docTree.Lock() defer docTree.Unlock() - return r.treeCache.Do(ctx, treeId, func(obj interface{}) error { + if slice.UnsortedEquals(response.Heads, docTree.Heads()) { + return nil + } + + return r.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error { aclTree := obj.(tree.ACLTree) aclTree.RLock() defer aclTree.RUnlock() diff --git a/service/treecache/service.go b/service/treecache/service.go index a6d215ba..37b58f21 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -99,6 +99,7 @@ func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error default: return nil, fmt.Errorf("incorrect type") } + log.Info("got header", zap.String("header", header.String())) var docTree tree.DocTree // TODO: it is a question if we need to use ACLTree on the first tree build, because we can think that the tree is already validated err = s.Do(ctx, header.AclTreeId, func(obj interface{}) error { From 340528f5af8a9fe80b295ef2618028da761cef17 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 12 Aug 2022 10:01:01 +0200 Subject: [PATCH 013/219] Fix update document --- service/document/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/document/service.go b/service/document/service.go index 12c3c6a1..99c0dbcc 100644 --- a/service/document/service.go +++ b/service/document/service.go @@ -90,7 +90,7 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err defer aclTree.RUnlock() content := createAppendTextChange(text) - _, err := docTree.AddContent(ctx, aclTree, content, false) + ch, err = docTree.AddContent(ctx, aclTree, content, false) if err != nil { return err } From 9142f28d55452621cf1d244c2e368c0ec5c700ec Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 15 Aug 2022 23:31:00 +0200 Subject: [PATCH 014/219] Refactoring doc tree --- pkg/acl/account/accountdata.go | 3 +- pkg/acl/tree/acltree.go | 3 +- pkg/acl/tree/change.go | 32 +++++++ pkg/acl/tree/doctree.go | 165 ++++++++++++++------------------- pkg/acl/tree/treebuilder.go | 71 ++++---------- 5 files changed, 123 insertions(+), 151 deletions(-) diff --git a/pkg/acl/account/accountdata.go b/pkg/acl/account/accountdata.go index 7b0c773b..07530083 100644 --- a/pkg/acl/account/accountdata.go +++ b/pkg/acl/account/accountdata.go @@ -1,6 +1,7 @@ package account import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" ) @@ -9,5 +10,5 @@ type AccountData struct { // TODO: create a convenient constructor for this Identity string // TODO: this is essentially the same as sign key SignKey signingkey.PrivKey EncKey encryptionkey.PrivKey - Decoder signingkey.PubKeyDecoder + Decoder keys.Decoder } diff --git a/pkg/acl/tree/acltree.go b/pkg/acl/tree/acltree.go index c0724c97..6b148f36 100644 --- a/pkg/acl/tree/acltree.go +++ b/pkg/acl/tree/acltree.go @@ -458,12 +458,11 @@ func (a *aclTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh return nil, err } - aclChange, err := a.treeBuilder.makeUnverifiedACLChange(raw) + ch, err := NewFromRawChange(raw) if err != nil { return nil, err } - ch := NewChange(id, aclChange) rawChanges = append(rawChanges, raw) return ch, nil } diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index ac0a55c2..7924ea5d 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -3,6 +3,8 @@ package tree import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/gogo/protobuf/proto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" @@ -59,6 +61,36 @@ func NewFromRawChange(rawChange *aclpb.RawChange) (*Change, error) { return ch, nil } +func NewFromVerifiedRawChange( + rawChange *aclpb.RawChange, + identityKeys map[string]signingkey.PubKey, + decoder keys.Decoder) (*Change, error) { + unmarshalled := &aclpb.Change{} + err := proto.Unmarshal(rawChange.Payload, unmarshalled) + if err != nil { + return nil, err + } + + identityKey, exists := identityKeys[unmarshalled.Identity] + if !exists { + key, err := decoder.DecodeFromString(unmarshalled.Identity) + if err != nil { + return nil, err + } + identityKey = key.(signingkey.PubKey) + identityKeys[unmarshalled.Identity] = identityKey + } + res, err := identityKey.Verify(rawChange.Payload, rawChange.Signature) + if err != nil { + return nil, err + } + if !res { + return nil, fmt.Errorf("change has incorrect signature") + } + + return NewChange(rawChange.Id, unmarshalled), nil +} + func NewChange(id string, ch *aclpb.Change) *Change { return &Change{ Next: nil, diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index 00960554..63933983 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -7,6 +7,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/gogo/protobuf/proto" "go.uber.org/zap" @@ -38,6 +39,12 @@ type docTree struct { treeBuilder *treeBuilder validator DocTreeValidator + difSnapshotBuf []*aclpb.RawChange + tmpChangesBuf []*Change + notSeenIdxBuf []int + + identityKeys map[string]signingkey.PubKey + sync.RWMutex } @@ -52,16 +59,12 @@ func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountDat treeBuilder: treeBuilder, validator: validator, updateListener: listener, + tmpChangesBuf: make([]*Change, 0, 10), + difSnapshotBuf: make([]*aclpb.RawChange, 0, 10), + notSeenIdxBuf: make([]int, 0, 10), + identityKeys: make(map[string]signingkey.PubKey), } - err := docTree.rebuildFromStorage(aclTree) - if err != nil { - return nil, err - } - err = docTree.removeOrphans() - if err != nil { - return nil, err - } - err = t.SetHeads(docTree.Heads()) + err := docTree.rebuildFromStorage(aclTree, nil) if err != nil { return nil, err } @@ -81,7 +84,7 @@ func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountDat return docTree, nil } -func BuildDocTree(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder, listener TreeUpdateListener, aclTree ACLTree) (DocTree, error) { +func BuildDocTree(t treestorage.TreeStorage, decoder keys.Decoder, listener TreeUpdateListener, aclTree ACLTree) (DocTree, error) { treeBuilder := newTreeBuilder(t, decoder) validator := newTreeValidator() @@ -91,16 +94,12 @@ func BuildDocTree(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder, l treeBuilder: treeBuilder, validator: validator, updateListener: listener, + tmpChangesBuf: make([]*Change, 0, 10), + difSnapshotBuf: make([]*aclpb.RawChange, 0, 10), + notSeenIdxBuf: make([]int, 0, 10), + identityKeys: make(map[string]signingkey.PubKey), } - err := docTree.rebuildFromStorage(aclTree) - if err != nil { - return nil, err - } - err = docTree.removeOrphans() - if err != nil { - return nil, err - } - err = t.SetHeads(docTree.Heads()) + err := docTree.rebuildFromStorage(aclTree, nil) if err != nil { return nil, err } @@ -120,29 +119,10 @@ func BuildDocTree(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder, l return docTree, nil } -func (d *docTree) removeOrphans() error { - // removing attached or invalid orphans - var toRemove []string +func (d *docTree) rebuildFromStorage(aclTree ACLTree, newChanges []*Change) (err error) { + d.treeBuilder.Init(d.identityKeys) - orphans, err := d.treeStorage.Orphans() - if err != nil { - return err - } - for _, orphan := range orphans { - if _, exists := d.tree.attached[orphan]; exists { - toRemove = append(toRemove, orphan) - } - if _, exists := d.tree.invalidChanges[orphan]; exists { - toRemove = append(toRemove, orphan) - } - } - return d.treeStorage.RemoveOrphans(toRemove...) -} - -func (d *docTree) rebuildFromStorage(aclTree ACLTree) (err error) { - d.treeBuilder.Init() - - d.tree, err = d.treeBuilder.Build(false) + d.tree, err = d.treeBuilder.Build(false, newChanges) if err != nil { return err } @@ -233,29 +213,34 @@ func (d *docTree) AddContent(ctx context.Context, aclTree ACLTree, content proto return rawCh, nil } -func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges ...*aclpb.RawChange) (AddResult, error) { - // TODO: make proper error handling, because there are a lot of corner cases where this will break - var err error +func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges ...*aclpb.RawChange) (addResult AddResult, err error) { var mode Mode - var changes []*Change // TODO: = addChangesBuf[:0] ... - var notSeenIdx []int + // resetting buffers + d.tmpChangesBuf = d.tmpChangesBuf[:0] + d.notSeenIdxBuf = d.notSeenIdxBuf[:0] + d.difSnapshotBuf = d.difSnapshotBuf[:0] + prevHeads := d.tree.Heads() + + // filtering changes, verifying and unmarshalling them for idx, ch := range rawChanges { if d.HasChange(ch.Id) { continue } - change, err := NewFromRawChange(ch) - // TODO: think what if we will have incorrect signatures on rawChanges, how everything will work + var change *Change + change, err = NewFromVerifiedRawChange(ch, d.identityKeys, d.treeBuilder.signingPubKeyDecoder) if err != nil { - continue + return AddResult{}, err } - changes = append(changes, change) - notSeenIdx = append(notSeenIdx, idx) + + d.tmpChangesBuf = append(d.tmpChangesBuf, change) + d.notSeenIdxBuf = append(d.notSeenIdxBuf, idx) } - if len(notSeenIdx) == 0 { + // if no new changes, then returning + if len(d.notSeenIdxBuf) == 0 { return AddResult{ OldHeads: prevHeads, Heads: prevHeads, @@ -268,11 +253,15 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges return } - err = d.removeOrphans() - if err != nil { - return + // adding to database all the added changes only after they are good + for _, ch := range addResult.Added { + err = d.treeStorage.AddRawChange(ch) + if err != nil { + return + } } + // setting heads err = d.treeStorage.SetHeads(d.tree.Heads()) if err != nil { return @@ -292,9 +281,10 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges } }() + // returns changes that we added to the tree getAddedChanges := func() []*aclpb.RawChange { var added []*aclpb.RawChange - for _, idx := range notSeenIdx { + for _, idx := range d.notSeenIdxBuf { rawChange := rawChanges[idx] if _, exists := d.tree.attached[rawChange.Id]; exists { added = append(added, rawChange) @@ -303,49 +293,37 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges return added } - rebuild := func() (AddResult, error) { - err = d.rebuildFromStorage(aclTree) - if err != nil { - return AddResult{}, err - } + // checking if we have some changes with different snapshot and then rebuilding + for _, ch := range d.tmpChangesBuf { + if ch.SnapshotId != d.tree.RootId() && ch.SnapshotId != "" { + err = d.rebuildFromStorage(aclTree, d.tmpChangesBuf) + if err != nil { + return AddResult{}, err + } - return AddResult{ - OldHeads: prevHeads, - Heads: d.tree.Heads(), - Added: getAddedChanges(), - Summary: AddResultSummaryRebuild, - }, nil - } - - for _, ch := range changes { - err = d.treeStorage.AddChange(ch) - if err != nil { - return AddResult{}, err - } - err = d.treeStorage.AddOrphans(ch.Id) - if err != nil { - return AddResult{}, err + addResult = AddResult{ + OldHeads: prevHeads, + Heads: d.tree.Heads(), + Added: getAddedChanges(), + Summary: AddResultSummaryRebuild, + } + err = nil + return } } - mode = d.tree.Add(changes...) + // normal mode of operation, where we don't need to rebuild from database + mode = d.tree.Add(d.tmpChangesBuf...) switch mode { case Nothing: - for _, ch := range changes { - // rebuilding if the snapshot is different from the root - if ch.SnapshotId != d.tree.RootId() && ch.SnapshotId != "" { - return rebuild() - } - } - - return AddResult{ + addResult = AddResult{ OldHeads: prevHeads, Heads: prevHeads, Summary: AddResultSummaryNothing, - }, nil + } + err = nil + return - case Rebuild: - return rebuild() default: // just rebuilding the state from start without reloading everything from tree storage // as an optimization we could've started from current heads, but I didn't implement that @@ -354,13 +332,15 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges return AddResult{}, err } - return AddResult{ + addResult = AddResult{ OldHeads: prevHeads, Heads: d.tree.Heads(), Added: getAddedChanges(), Summary: AddResultSummaryAppend, - }, nil + } + err = nil } + return } func (d *docTree) Iterate(f func(change *Change) bool) { @@ -434,12 +414,11 @@ func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh return nil, err } - aclChange, err := d.treeBuilder.makeUnverifiedACLChange(raw) + ch, err := NewFromRawChange(raw) if err != nil { return nil, err } - ch := NewChange(id, aclChange) rawChanges = append(rawChanges, raw) return ch, nil } diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index 5376bee6..e63d2292 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -5,11 +5,10 @@ import ( "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" - "github.com/gogo/protobuf/proto" "go.uber.org/zap" "time" ) @@ -22,38 +21,39 @@ var ( type treeBuilder struct { cache map[string]*Change identityKeys map[string]signingkey.PubKey - signingPubKeyDecoder signingkey.PubKeyDecoder + signingPubKeyDecoder keys.Decoder tree *Tree treeStorage treestorage.TreeStorage } -func newTreeBuilder(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder) *treeBuilder { +func newTreeBuilder(t treestorage.TreeStorage, decoder keys.Decoder) *treeBuilder { return &treeBuilder{ signingPubKeyDecoder: decoder, treeStorage: t, } } -func (tb *treeBuilder) Init() { +func (tb *treeBuilder) Init(identityKeys map[string]signingkey.PubKey) { tb.cache = make(map[string]*Change) - tb.identityKeys = make(map[string]signingkey.PubKey) + tb.identityKeys = identityKeys tb.tree = &Tree{} } -func (tb *treeBuilder) Build(fromStart bool) (*Tree, error) { +func (tb *treeBuilder) Build(fromStart bool, newChanges []*Change) (*Tree, error) { var headsAndOrphans []string - orphans, err := tb.treeStorage.Orphans() - if err != nil { - return nil, err - } heads, err := tb.treeStorage.Heads() if err != nil { return nil, err } - headsAndOrphans = append(headsAndOrphans, orphans...) - headsAndOrphans = append(headsAndOrphans, heads...) - log.With(zap.Strings("heads", heads), zap.Strings("orphans", orphans)).Debug("building tree") + headsAndOrphans = append(headsAndOrphans, heads...) + tb.cache = make(map[string]*Change) + for _, ch := range newChanges { + headsAndOrphans = append(headsAndOrphans, ch.Id) + tb.cache[ch.Id] = ch + } + + log.With(zap.Strings("heads", heads)).Debug("building tree") if fromStart { if err := tb.buildTreeFromStart(headsAndOrphans); err != nil { return nil, fmt.Errorf("buildTree error: %v", err) @@ -69,8 +69,6 @@ func (tb *treeBuilder) Build(fromStart bool) (*Tree, error) { } } - tb.cache = make(map[string]*Change) - return tb.tree, nil } @@ -184,53 +182,16 @@ func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { return nil, err } - verifiedChange, err := tb.makeVerifiedChange(change) + // TODO: maybe we can use unverified changes here, because we shouldn't put bad changes in the DB in the first place + ch, err = NewFromVerifiedRawChange(change, tb.identityKeys, tb.signingPubKeyDecoder) if err != nil { return nil, err } - ch = NewChange(id, verifiedChange) tb.cache[id] = ch return ch, nil } -func (tb *treeBuilder) verify(identity string, payload, signature []byte) (isVerified bool, err error) { - identityKey, exists := tb.identityKeys[identity] - if !exists { - identityKey, err = tb.signingPubKeyDecoder.DecodeFromString(identity) - if err != nil { - return - } - tb.identityKeys[identity] = identityKey - } - return identityKey.Verify(payload, signature) -} - -func (tb *treeBuilder) makeVerifiedChange(change *aclpb.RawChange) (aclChange *aclpb.Change, err error) { - aclChange = new(aclpb.Change) - - // TODO: think what should we do with such cases, because this can be used by attacker to break our Tree - if err = proto.Unmarshal(change.Payload, aclChange); err != nil { - return - } - var verified bool - verified, err = tb.verify(aclChange.Identity, change.Payload, change.Signature) - if err != nil { - return - } - if !verified { - err = fmt.Errorf("the signature of the payload cannot be verified") - return - } - return -} - -func (tb *treeBuilder) makeUnverifiedACLChange(change *aclpb.RawChange) (aclChange *aclpb.Change, err error) { - aclChange = new(aclpb.Change) - err = proto.Unmarshal(change.Payload, aclChange) - return -} - func (tb *treeBuilder) findBreakpoint(heads []string) (breakpoint string, err error) { var ( ch *Change From f4aeecae84d00527cd36a320d6074bf7df92d297 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 16 Aug 2022 00:57:38 +0200 Subject: [PATCH 015/219] Add rollback after adding invalid changes --- pkg/acl/tree/acltree.go | 1 + pkg/acl/tree/doctree.go | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/acl/tree/acltree.go b/pkg/acl/tree/acltree.go index 6b148f36..1fe94285 100644 --- a/pkg/acl/tree/acltree.go +++ b/pkg/acl/tree/acltree.go @@ -15,6 +15,7 @@ import ( type AddResultSummary int var ErrTreeWithoutIdentity = errors.New("acl tree is created without identity") +var ErrHasInvalidChanges = errors.New("the change is invalid") const ( AddResultSummaryNothing AddResultSummary = iota diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index 63933983..e2bc014f 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -228,6 +228,10 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges if d.HasChange(ch.Id) { continue } + // if we already added the change to invalid ones + if _, exists := d.tree.invalidChanges[ch.Id]; exists { + return AddResult{}, ErrHasInvalidChanges + } var change *Change change, err = NewFromVerifiedRawChange(ch, d.identityKeys, d.treeBuilder.signingPubKeyDecoder) @@ -329,7 +333,15 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges // as an optimization we could've started from current heads, but I didn't implement that err = d.validator.ValidateTree(d.tree, aclTree) if err != nil { - return AddResult{}, err + // rolling back + for _, ch := range d.tmpChangesBuf { + if _, exists := d.tree.attached[ch.Id]; exists { + delete(d.tree.attached, ch.Id) + } else if _, exists := d.tree.unAttached[ch.Id]; exists { + delete(d.tree.unAttached, ch.Id) + } + } + return AddResult{}, ErrHasInvalidChanges } addResult = AddResult{ From edaad859903b2fe54626f01c19628402961e8692 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 18 Aug 2022 23:03:27 +0200 Subject: [PATCH 016/219] Create ACL list and update tree package --- pkg/acl/aclchanges/aclpb/aclchanges.pb.go | 814 +++++++++++++++--- .../aclchanges/aclpb/protos/aclchanges.proto | 16 +- pkg/acl/{tree => list}/aclstate.go | 47 +- pkg/acl/list/aclstatebuilder.go | 51 ++ pkg/acl/{tree => list}/changebuilder.go | 27 +- pkg/acl/list/list.go | 16 + pkg/acl/list/record.go | 17 + pkg/acl/tree/aclstatebuilder.go | 102 --- pkg/acl/tree/acltree.go | 525 ----------- pkg/acl/tree/changevalidator.go | 6 +- pkg/acl/tree/descriptionparser.go | 40 - pkg/acl/tree/doctree.go | 91 +- pkg/acl/tree/treestorage.go | 95 +- service/document/service.go | 3 +- 14 files changed, 984 insertions(+), 866 deletions(-) rename pkg/acl/{tree => list}/aclstate.go (88%) create mode 100644 pkg/acl/list/aclstatebuilder.go rename pkg/acl/{tree => list}/changebuilder.go (83%) create mode 100644 pkg/acl/list/list.go create mode 100644 pkg/acl/list/record.go delete mode 100644 pkg/acl/tree/aclstatebuilder.go delete mode 100644 pkg/acl/tree/acltree.go diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go index 0a4b6746..0f6fec52 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go @@ -50,7 +50,7 @@ func (x ACLChangeUserPermissions) String() string { } func (ACLChangeUserPermissions) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 0} + return fileDescriptor_37a022c841a51877, []int{2, 0} } type RawChange struct { @@ -113,6 +113,66 @@ func (m *RawChange) GetId() string { return "" } +type RawRecord struct { + Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *RawRecord) Reset() { *m = RawRecord{} } +func (m *RawRecord) String() string { return proto.CompactTextString(m) } +func (*RawRecord) ProtoMessage() {} +func (*RawRecord) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{1} +} +func (m *RawRecord) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RawRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RawRecord.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 *RawRecord) XXX_Merge(src proto.Message) { + xxx_messageInfo_RawRecord.Merge(m, src) +} +func (m *RawRecord) XXX_Size() int { + return m.Size() +} +func (m *RawRecord) XXX_DiscardUnknown() { + xxx_messageInfo_RawRecord.DiscardUnknown(m) +} + +var xxx_messageInfo_RawRecord proto.InternalMessageInfo + +func (m *RawRecord) GetPayload() []byte { + if m != nil { + return m.Payload + } + return nil +} + +func (m *RawRecord) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *RawRecord) GetId() string { + if m != nil { + return m.Id + } + return "" +} + // the element of change tree used to store and internal apply smartBlock history type ACLChange struct { TreeHeadIds []string `protobuf:"bytes,1,rep,name=treeHeadIds,proto3" json:"treeHeadIds,omitempty"` @@ -130,7 +190,7 @@ func (m *ACLChange) Reset() { *m = ACLChange{} } func (m *ACLChange) String() string { return proto.CompactTextString(m) } func (*ACLChange) ProtoMessage() {} func (*ACLChange) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1} + return fileDescriptor_37a022c841a51877, []int{2} } func (m *ACLChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -230,7 +290,7 @@ func (m *ACLChangeACLContentValue) Reset() { *m = ACLChangeACLContentVal func (m *ACLChangeACLContentValue) String() string { return proto.CompactTextString(m) } func (*ACLChangeACLContentValue) ProtoMessage() {} func (*ACLChangeACLContentValue) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 0} + return fileDescriptor_37a022c841a51877, []int{2, 0} } func (m *ACLChangeACLContentValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -361,7 +421,7 @@ func (m *ACLChangeACLData) Reset() { *m = ACLChangeACLData{} } func (m *ACLChangeACLData) String() string { return proto.CompactTextString(m) } func (*ACLChangeACLData) ProtoMessage() {} func (*ACLChangeACLData) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 1} + return fileDescriptor_37a022c841a51877, []int{2, 1} } func (m *ACLChangeACLData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -413,7 +473,7 @@ func (m *ACLChangeACLSnapshot) Reset() { *m = ACLChangeACLSnapshot{} } func (m *ACLChangeACLSnapshot) String() string { return proto.CompactTextString(m) } func (*ACLChangeACLSnapshot) ProtoMessage() {} func (*ACLChangeACLSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 2} + return fileDescriptor_37a022c841a51877, []int{2, 2} } func (m *ACLChangeACLSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -459,7 +519,7 @@ func (m *ACLChangeACLState) Reset() { *m = ACLChangeACLState{} } func (m *ACLChangeACLState) String() string { return proto.CompactTextString(m) } func (*ACLChangeACLState) ProtoMessage() {} func (*ACLChangeACLState) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 3} + return fileDescriptor_37a022c841a51877, []int{2, 3} } func (m *ACLChangeACLState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -521,7 +581,7 @@ func (m *ACLChangeUserState) Reset() { *m = ACLChangeUserState{} } func (m *ACLChangeUserState) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserState) ProtoMessage() {} func (*ACLChangeUserState) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 4} + return fileDescriptor_37a022c841a51877, []int{2, 4} } func (m *ACLChangeUserState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -597,7 +657,7 @@ func (m *ACLChangeUserAdd) Reset() { *m = ACLChangeUserAdd{} } func (m *ACLChangeUserAdd) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserAdd) ProtoMessage() {} func (*ACLChangeUserAdd) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 5} + return fileDescriptor_37a022c841a51877, []int{2, 5} } func (m *ACLChangeUserAdd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -664,7 +724,7 @@ func (m *ACLChangeUserConfirm) Reset() { *m = ACLChangeUserConfirm{} } func (m *ACLChangeUserConfirm) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserConfirm) ProtoMessage() {} func (*ACLChangeUserConfirm) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 6} + return fileDescriptor_37a022c841a51877, []int{2, 6} } func (m *ACLChangeUserConfirm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -719,7 +779,7 @@ func (m *ACLChangeUserInvite) Reset() { *m = ACLChangeUserInvite{} } func (m *ACLChangeUserInvite) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserInvite) ProtoMessage() {} func (*ACLChangeUserInvite) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 7} + return fileDescriptor_37a022c841a51877, []int{2, 7} } func (m *ACLChangeUserInvite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -795,7 +855,7 @@ func (m *ACLChangeUserJoin) Reset() { *m = ACLChangeUserJoin{} } func (m *ACLChangeUserJoin) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserJoin) ProtoMessage() {} func (*ACLChangeUserJoin) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 8} + return fileDescriptor_37a022c841a51877, []int{2, 8} } func (m *ACLChangeUserJoin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -868,7 +928,7 @@ func (m *ACLChangeUserRemove) Reset() { *m = ACLChangeUserRemove{} } func (m *ACLChangeUserRemove) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserRemove) ProtoMessage() {} func (*ACLChangeUserRemove) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 9} + return fileDescriptor_37a022c841a51877, []int{2, 9} } func (m *ACLChangeUserRemove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -921,7 +981,7 @@ func (m *ACLChangeReadKeyReplace) Reset() { *m = ACLChangeReadKeyReplace func (m *ACLChangeReadKeyReplace) String() string { return proto.CompactTextString(m) } func (*ACLChangeReadKeyReplace) ProtoMessage() {} func (*ACLChangeReadKeyReplace) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 10} + return fileDescriptor_37a022c841a51877, []int{2, 10} } func (m *ACLChangeReadKeyReplace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -980,7 +1040,7 @@ func (m *ACLChangeUserPermissionChange) Reset() { *m = ACLChangeUserPerm func (m *ACLChangeUserPermissionChange) String() string { return proto.CompactTextString(m) } func (*ACLChangeUserPermissionChange) ProtoMessage() {} func (*ACLChangeUserPermissionChange) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1, 11} + return fileDescriptor_37a022c841a51877, []int{2, 11} } func (m *ACLChangeUserPermissionChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1025,7 +1085,7 @@ func (m *ACLChangeUserPermissionChange) GetPermissions() ACLChangeUserPermission type Change struct { TreeHeadIds []string `protobuf:"bytes,1,rep,name=treeHeadIds,proto3" json:"treeHeadIds,omitempty"` - AclHeadIds []string `protobuf:"bytes,2,rep,name=aclHeadIds,proto3" json:"aclHeadIds,omitempty"` + AclHeadId string `protobuf:"bytes,2,opt,name=aclHeadId,proto3" json:"aclHeadId,omitempty"` SnapshotBaseId string `protobuf:"bytes,3,opt,name=snapshotBaseId,proto3" json:"snapshotBaseId,omitempty"` ChangesData []byte `protobuf:"bytes,4,opt,name=changesData,proto3" json:"changesData,omitempty"` CurrentReadKeyHash uint64 `protobuf:"varint,5,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` @@ -1038,7 +1098,7 @@ func (m *Change) Reset() { *m = Change{} } func (m *Change) String() string { return proto.CompactTextString(m) } func (*Change) ProtoMessage() {} func (*Change) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2} + return fileDescriptor_37a022c841a51877, []int{3} } func (m *Change) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1074,11 +1134,11 @@ func (m *Change) GetTreeHeadIds() []string { return nil } -func (m *Change) GetAclHeadIds() []string { +func (m *Change) GetAclHeadId() string { if m != nil { - return m.AclHeadIds + return m.AclHeadId } - return nil + return "" } func (m *Change) GetSnapshotBaseId() string { @@ -1123,9 +1183,86 @@ func (m *Change) GetIsSnapshot() bool { return false } +type Record struct { + PrevId string `protobuf:"bytes,1,opt,name=prevId,proto3" json:"prevId,omitempty"` + Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + CurrentReadKeyHash uint64 `protobuf:"varint,4,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` + Timestamp int64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +} + +func (m *Record) Reset() { *m = Record{} } +func (m *Record) String() string { return proto.CompactTextString(m) } +func (*Record) ProtoMessage() {} +func (*Record) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{4} +} +func (m *Record) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Record) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Record.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 *Record) XXX_Merge(src proto.Message) { + xxx_messageInfo_Record.Merge(m, src) +} +func (m *Record) XXX_Size() int { + return m.Size() +} +func (m *Record) XXX_DiscardUnknown() { + xxx_messageInfo_Record.DiscardUnknown(m) +} + +var xxx_messageInfo_Record proto.InternalMessageInfo + +func (m *Record) GetPrevId() string { + if m != nil { + return m.PrevId + } + return "" +} + +func (m *Record) GetIdentity() string { + if m != nil { + return m.Identity + } + return "" +} + +func (m *Record) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +func (m *Record) GetCurrentReadKeyHash() uint64 { + if m != nil { + return m.CurrentReadKeyHash + } + return 0 +} + +func (m *Record) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + func init() { proto.RegisterEnum("acl.ACLChangeUserPermissions", ACLChangeUserPermissions_name, ACLChangeUserPermissions_value) proto.RegisterType((*RawChange)(nil), "acl.RawChange") + proto.RegisterType((*RawRecord)(nil), "acl.RawRecord") proto.RegisterType((*ACLChange)(nil), "acl.ACLChange") proto.RegisterType((*ACLChangeACLContentValue)(nil), "acl.ACLChange.ACLContentValue") proto.RegisterType((*ACLChangeACLData)(nil), "acl.ACLChange.ACLData") @@ -1141,6 +1278,7 @@ func init() { proto.RegisterType((*ACLChangeReadKeyReplace)(nil), "acl.ACLChange.ReadKeyReplace") proto.RegisterType((*ACLChangeUserPermissionChange)(nil), "acl.ACLChange.UserPermissionChange") proto.RegisterType((*Change)(nil), "acl.Change") + proto.RegisterType((*Record)(nil), "acl.Record") } func init() { @@ -1148,69 +1286,73 @@ func init() { } var fileDescriptor_37a022c841a51877 = []byte{ - // 987 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0x4f, 0x8f, 0xdb, 0x44, - 0x14, 0xcf, 0x24, 0x9b, 0x75, 0xfc, 0x1c, 0x76, 0xc3, 0x50, 0x51, 0x63, 0x95, 0x10, 0x85, 0x0a, - 0x45, 0x08, 0x65, 0xab, 0x54, 0x48, 0x15, 0xa0, 0x15, 0xbb, 0x0b, 0x6a, 0xc2, 0x72, 0xa8, 0x66, - 0x55, 0x10, 0xdc, 0x66, 0xed, 0x61, 0xd7, 0xaa, 0x63, 0x1b, 0xcf, 0x64, 0x51, 0x2e, 0x48, 0x9c, - 0xb8, 0x72, 0xe6, 0xc0, 0x17, 0xe1, 0x0b, 0xf4, 0xd8, 0x23, 0x37, 0xd0, 0xee, 0x9d, 0x0b, 0x5f, - 0x00, 0xcd, 0x1f, 0x3b, 0x8e, 0xe3, 0x46, 0x45, 0xaa, 0x2a, 0x71, 0x88, 0x34, 0xf3, 0x7b, 0xbf, - 0x37, 0x79, 0xef, 0xfd, 0xde, 0x3c, 0x0f, 0xdc, 0x4b, 0x9f, 0x5c, 0x1c, 0x50, 0x3f, 0x92, 0x3f, - 0xff, 0x92, 0xc6, 0x17, 0x8c, 0xcb, 0x65, 0x7a, 0x7e, 0x90, 0x66, 0x89, 0x48, 0x78, 0x09, 0x1f, - 0x2b, 0x04, 0xb7, 0xa8, 0x1f, 0x0d, 0xcf, 0xc0, 0x26, 0xf4, 0x87, 0x13, 0x65, 0xc0, 0x2e, 0x58, - 0x29, 0x5d, 0x46, 0x09, 0x0d, 0x5c, 0x34, 0x40, 0xa3, 0x2e, 0xc9, 0xb7, 0xf8, 0x0e, 0xd8, 0x3c, - 0xbc, 0x88, 0xa9, 0x58, 0x64, 0xcc, 0x6d, 0x2a, 0xdb, 0x0a, 0xc0, 0x7b, 0xd0, 0x0c, 0x03, 0xb7, - 0x35, 0x40, 0x23, 0x9b, 0x34, 0xc3, 0x60, 0xf8, 0xcf, 0x1b, 0x60, 0x1f, 0x9d, 0x7c, 0x69, 0x4e, - 0x1d, 0x80, 0x23, 0x32, 0xc6, 0xa6, 0x8c, 0x06, 0xb3, 0x80, 0xbb, 0x68, 0xd0, 0x1a, 0xd9, 0xa4, - 0x0c, 0xe1, 0x3e, 0x00, 0xf5, 0xa3, 0x9c, 0xd0, 0x54, 0x84, 0x12, 0x82, 0xdf, 0x83, 0x3d, 0x1e, - 0xd3, 0x94, 0x5f, 0x26, 0xe2, 0x98, 0x72, 0x36, 0xcb, 0xff, 0xab, 0x82, 0xe2, 0x7b, 0x60, 0x51, - 0x3f, 0xfa, 0x8c, 0x0a, 0xea, 0xee, 0x0c, 0xd0, 0xc8, 0x99, 0xbc, 0x39, 0xa6, 0x7e, 0x34, 0x2e, - 0x42, 0x91, 0x2b, 0x69, 0x25, 0x39, 0x4d, 0xc6, 0x66, 0x8a, 0xa2, 0xbc, 0xda, 0x2a, 0xb3, 0x32, - 0x84, 0xc7, 0x80, 0xfd, 0x45, 0x96, 0xb1, 0x58, 0x10, 0x46, 0x83, 0x53, 0xb6, 0x9c, 0x52, 0x7e, - 0xe9, 0xee, 0x0e, 0xd0, 0x68, 0x87, 0xd4, 0x58, 0x64, 0xa5, 0x44, 0x38, 0x67, 0x5c, 0xd0, 0x79, - 0xea, 0x5a, 0x03, 0x34, 0x6a, 0x91, 0x15, 0x80, 0x3d, 0xe8, 0x84, 0x01, 0x8b, 0x45, 0x28, 0x96, - 0x6e, 0x47, 0xe5, 0x50, 0xec, 0xbd, 0x5f, 0x5b, 0xb0, 0x2f, 0x43, 0x4d, 0x62, 0xc1, 0x62, 0xf1, - 0x15, 0x8d, 0x16, 0x0c, 0x4f, 0xc0, 0x5a, 0x70, 0x96, 0x1d, 0x05, 0x5a, 0x91, 0xcd, 0x8c, 0x1e, - 0x6b, 0xeb, 0xb4, 0x41, 0x72, 0x22, 0xfe, 0x18, 0x40, 0x2e, 0x09, 0x9b, 0x27, 0x57, 0x5a, 0x2c, - 0x67, 0xf2, 0x56, 0x8d, 0x9b, 0x26, 0x4c, 0x1b, 0xa4, 0x44, 0xc7, 0xdf, 0xc0, 0x2d, 0xb9, 0x7b, - 0xc4, 0xb2, 0x79, 0xc8, 0x79, 0x98, 0xc4, 0xda, 0x41, 0x15, 0xdc, 0x99, 0xbc, 0x5b, 0x73, 0x4c, - 0x95, 0x3a, 0x6d, 0x90, 0xda, 0x23, 0xf2, 0xb8, 0x66, 0xf1, 0x55, 0x28, 0x98, 0x11, 0xa8, 0x2e, - 0x2e, 0x4d, 0xc8, 0xe3, 0xd2, 0x3b, 0xfc, 0x21, 0x74, 0xe4, 0xee, 0x8b, 0x24, 0x8c, 0x95, 0x4a, - 0xce, 0xe4, 0x76, 0x8d, 0xab, 0x34, 0x4f, 0x1b, 0xa4, 0xa0, 0xe2, 0x43, 0x70, 0xe4, 0xfa, 0x24, - 0x89, 0xbf, 0x0b, 0xb3, 0xb9, 0x92, 0xcd, 0x99, 0x78, 0x35, 0x9e, 0x86, 0x31, 0x6d, 0x90, 0xb2, - 0xc3, 0xb1, 0x05, 0xed, 0x2b, 0x29, 0x84, 0xf7, 0x33, 0x02, 0xcb, 0x74, 0x0f, 0xfe, 0x04, 0x1c, - 0xea, 0x47, 0x67, 0xa6, 0xf7, 0x8c, 0x30, 0xde, 0x66, 0xab, 0xe5, 0x0c, 0x52, 0xa6, 0xe3, 0x43, - 0xd5, 0xec, 0x46, 0x65, 0xd5, 0xec, 0xce, 0xa4, 0xbf, 0xe9, 0x5c, 0x6e, 0x03, 0x52, 0xf2, 0xf0, - 0x8e, 0xc1, 0x29, 0x9d, 0x8d, 0xef, 0x43, 0x47, 0x9e, 0x2e, 0xa8, 0x60, 0x26, 0x92, 0xdb, 0x35, - 0x91, 0x48, 0x33, 0x29, 0x88, 0xde, 0x4f, 0x4d, 0xe8, 0xe4, 0x30, 0xbe, 0x0b, 0xaf, 0x65, 0xab, - 0x06, 0x66, 0xfa, 0x86, 0xee, 0x90, 0x75, 0x10, 0x3f, 0xd0, 0xea, 0x29, 0x17, 0x6e, 0xc2, 0x76, - 0x6b, 0x0a, 0xa9, 0xff, 0xaa, 0xc4, 0xc5, 0x87, 0x60, 0x85, 0x4a, 0x44, 0xee, 0xb6, 0x94, 0xdb, - 0xdd, 0xe7, 0x04, 0x38, 0xd6, 0x5a, 0xf3, 0xcf, 0x63, 0x91, 0x2d, 0x49, 0xee, 0xe4, 0x3d, 0x86, - 0x6e, 0xd9, 0x80, 0x7b, 0xd0, 0x7a, 0xc2, 0x96, 0x2a, 0x59, 0x9b, 0xc8, 0x25, 0x3e, 0x30, 0x2a, - 0x6d, 0x69, 0x76, 0x7d, 0x02, 0xd1, 0xbc, 0x8f, 0x9a, 0x0f, 0x90, 0xf7, 0x27, 0x02, 0xbb, 0x08, - 0x78, 0xed, 0x62, 0xa2, 0xf5, 0x8b, 0x29, 0x0b, 0xc4, 0x62, 0x3f, 0x5b, 0xa6, 0x22, 0x4c, 0xe2, - 0x53, 0xb6, 0x34, 0x03, 0x70, 0x1d, 0xc4, 0x1f, 0xc0, 0xeb, 0x06, 0x60, 0x81, 0x19, 0x08, 0x3a, - 0xe1, 0x2e, 0xd9, 0x34, 0xe0, 0x4f, 0xc1, 0x49, 0x8b, 0x0b, 0xc2, 0xd5, 0x6d, 0xd8, 0xdb, 0x68, - 0x83, 0xf5, 0xeb, 0xc5, 0x49, 0xd9, 0x45, 0x8e, 0xae, 0x19, 0x37, 0x7d, 0xca, 0x02, 0x75, 0x29, - 0x3a, 0xa4, 0x0c, 0x79, 0xbf, 0x23, 0xb0, 0xcc, 0x7c, 0xf8, 0xff, 0xe5, 0xe7, 0x3d, 0x04, 0xa7, - 0x74, 0x31, 0xb7, 0x26, 0x70, 0x07, 0x6c, 0x33, 0xfc, 0x66, 0x81, 0x0a, 0xde, 0x26, 0x2b, 0xc0, - 0xfb, 0x1b, 0x01, 0xac, 0x5a, 0x00, 0x8f, 0x60, 0x9f, 0xfa, 0x3e, 0x4b, 0xc5, 0xa3, 0xc5, 0x79, - 0x14, 0xfa, 0xa7, 0xa6, 0x95, 0xba, 0xa4, 0x0a, 0xe3, 0xf7, 0xa1, 0x67, 0x12, 0x5b, 0x51, 0x75, - 0x69, 0x36, 0xf0, 0x57, 0xae, 0xbe, 0x07, 0x1d, 0x9d, 0xcf, 0x4c, 0x4b, 0x6f, 0x93, 0x62, 0xef, - 0x3d, 0x45, 0xd0, 0xc9, 0xa7, 0xe1, 0x4b, 0x10, 0xbe, 0x28, 0xd8, 0x59, 0xf1, 0x02, 0x68, 0x95, - 0x0b, 0x56, 0xc0, 0x78, 0x08, 0xdd, 0xd5, 0xc8, 0x9e, 0x05, 0x2a, 0x2f, 0x9b, 0xac, 0x61, 0xf5, - 0x85, 0x6a, 0x3f, 0xa7, 0x50, 0xde, 0xf7, 0x5a, 0x3a, 0xf3, 0x71, 0xda, 0x96, 0xcb, 0x43, 0xd8, - 0x37, 0x03, 0x8b, 0xb0, 0x34, 0xa2, 0x7e, 0x31, 0x6d, 0xde, 0xae, 0x94, 0x95, 0xac, 0xb1, 0x48, - 0xd5, 0xcb, 0xfb, 0x11, 0xf6, 0xd6, 0x29, 0x2f, 0xa1, 0x84, 0xab, 0x4e, 0x2a, 0x72, 0x33, 0x35, - 0xdc, 0xc0, 0x3d, 0x01, 0xb7, 0xea, 0x3e, 0xab, 0x5b, 0xa3, 0xa8, 0xf4, 0x53, 0xf3, 0x3f, 0xf7, - 0xd3, 0xf0, 0x08, 0xf6, 0x2b, 0x76, 0x6c, 0x43, 0xfb, 0x28, 0x98, 0x87, 0x71, 0xaf, 0x81, 0x01, - 0x76, 0xbf, 0xce, 0x42, 0xc1, 0xb2, 0x1e, 0x92, 0x6b, 0x19, 0x2a, 0xcb, 0x7a, 0x4d, 0xec, 0x80, - 0xa5, 0xa5, 0x09, 0x7a, 0xad, 0xe1, 0x6f, 0x4d, 0xd8, 0x7d, 0xe5, 0x4f, 0xbe, 0xca, 0x03, 0x6e, - 0xe7, 0x45, 0x1f, 0x70, 0xed, 0x17, 0x7b, 0xc0, 0xed, 0x6e, 0x7b, 0xc0, 0x59, 0x15, 0x15, 0xfa, - 0x00, 0x21, 0x2f, 0x9e, 0x05, 0x1d, 0x35, 0x90, 0x4b, 0xc8, 0xf1, 0x3b, 0x4f, 0xaf, 0xfb, 0xe8, - 0xd9, 0x75, 0x1f, 0xfd, 0x75, 0xdd, 0x47, 0xbf, 0xdc, 0xf4, 0x1b, 0xcf, 0x6e, 0xfa, 0x8d, 0x3f, - 0x6e, 0xfa, 0x8d, 0x6f, 0xdb, 0xea, 0xa5, 0x7e, 0xbe, 0xab, 0x1e, 0xe6, 0xf7, 0xff, 0x0d, 0x00, - 0x00, 0xff, 0xff, 0xf9, 0xfe, 0x4f, 0x12, 0xcc, 0x0b, 0x00, 0x00, + // 1048 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x57, 0x4f, 0x6f, 0xe3, 0x54, + 0x10, 0x8f, 0x9d, 0x3f, 0x8e, 0xc7, 0xa1, 0x0d, 0x8f, 0xd5, 0xae, 0xb1, 0x4a, 0x88, 0xc2, 0x0a, + 0x45, 0x08, 0xa5, 0xab, 0xac, 0x90, 0x56, 0x80, 0x2a, 0xda, 0x82, 0x36, 0xa1, 0x1c, 0x56, 0xaf, + 0x5a, 0x10, 0xdc, 0x5e, 0xed, 0x47, 0x6b, 0xad, 0x63, 0x1b, 0xfb, 0xa5, 0x28, 0x17, 0x24, 0x4e, + 0x5c, 0x39, 0x23, 0xc4, 0x17, 0xe1, 0x0b, 0xec, 0xb1, 0x47, 0x6e, 0xa0, 0xf6, 0xce, 0x85, 0x2f, + 0x80, 0xde, 0x1f, 0x3b, 0x8e, 0xe3, 0x46, 0x41, 0xaa, 0x90, 0xf6, 0x10, 0xe9, 0xbd, 0xdf, 0xcc, + 0xbc, 0xcc, 0xcc, 0x6f, 0x66, 0x32, 0x81, 0x47, 0xf1, 0x8b, 0xf3, 0x7d, 0xe2, 0x06, 0xfc, 0xe3, + 0x5e, 0x90, 0xf0, 0x9c, 0xa6, 0xfc, 0x18, 0x9f, 0xed, 0xc7, 0x49, 0xc4, 0xa2, 0xb4, 0x80, 0x8f, + 0x04, 0x82, 0xea, 0xc4, 0x0d, 0x06, 0xa7, 0x60, 0x62, 0xf2, 0xfd, 0xb1, 0x10, 0x20, 0x1b, 0x8c, + 0x98, 0x2c, 0x82, 0x88, 0x78, 0xb6, 0xd6, 0xd7, 0x86, 0x1d, 0x9c, 0x5d, 0xd1, 0x1e, 0x98, 0xa9, + 0x7f, 0x1e, 0x12, 0x36, 0x4f, 0xa8, 0xad, 0x0b, 0xd9, 0x12, 0x40, 0x3b, 0xa0, 0xfb, 0x9e, 0x5d, + 0xef, 0x6b, 0x43, 0x13, 0xeb, 0xbe, 0xa7, 0x1e, 0xc5, 0xd4, 0x8d, 0x12, 0xef, 0xce, 0x1e, 0xfd, + 0xe7, 0x0d, 0x30, 0x0f, 0x8f, 0xbf, 0x50, 0xae, 0xf6, 0xc1, 0x62, 0x09, 0xa5, 0x13, 0x4a, 0xbc, + 0xa9, 0x97, 0xda, 0x5a, 0xbf, 0x3e, 0x34, 0x71, 0x11, 0x42, 0x3d, 0x00, 0xe2, 0x06, 0x99, 0x82, + 0x2e, 0x14, 0x0a, 0x08, 0x7a, 0x17, 0x76, 0xd2, 0x90, 0xc4, 0xe9, 0x45, 0xc4, 0x8e, 0x48, 0x4a, + 0xa7, 0xd9, 0x77, 0x95, 0x50, 0xf4, 0x08, 0x0c, 0xe2, 0x06, 0x9f, 0x12, 0x46, 0xec, 0x46, 0x5f, + 0x1b, 0x5a, 0xe3, 0xfb, 0x23, 0xe2, 0x06, 0xa3, 0xdc, 0x15, 0x7e, 0xe2, 0x52, 0x9c, 0xa9, 0x71, + 0xdf, 0x54, 0xa6, 0x85, 0x55, 0x53, 0x44, 0x56, 0x84, 0xd0, 0x08, 0x90, 0x3b, 0x4f, 0x12, 0x1a, + 0x32, 0x4c, 0x89, 0x77, 0x42, 0x17, 0x13, 0x92, 0x5e, 0xd8, 0xad, 0xbe, 0x36, 0x6c, 0xe0, 0x0a, + 0x09, 0xcf, 0x14, 0xf3, 0x67, 0x34, 0x65, 0x64, 0x16, 0xdb, 0x46, 0x5f, 0x1b, 0xd6, 0xf1, 0x12, + 0x40, 0x0e, 0xb4, 0x7d, 0x8f, 0x86, 0xcc, 0x67, 0x0b, 0xbb, 0x2d, 0x62, 0xc8, 0xef, 0xce, 0x2f, + 0x75, 0xd8, 0xe5, 0xae, 0x46, 0x21, 0xa3, 0x21, 0xfb, 0x92, 0x04, 0x73, 0x8a, 0xc6, 0x60, 0xcc, + 0x53, 0x9a, 0x1c, 0x7a, 0x92, 0x91, 0xf5, 0x88, 0x9e, 0x4b, 0xe9, 0xa4, 0x86, 0x33, 0x45, 0xf4, + 0x11, 0x00, 0x3f, 0x62, 0x3a, 0x8b, 0x2e, 0x25, 0x59, 0xd6, 0xf8, 0xcd, 0x0a, 0x33, 0xa9, 0x30, + 0xa9, 0xe1, 0x82, 0x3a, 0xfa, 0x1a, 0xee, 0xf1, 0xdb, 0x33, 0x9a, 0xcc, 0xfc, 0x34, 0xf5, 0xa3, + 0x50, 0x1a, 0x88, 0x84, 0x5b, 0xe3, 0x77, 0x2a, 0x9e, 0x29, 0xab, 0x4e, 0x6a, 0xb8, 0xf2, 0x89, + 0xcc, 0xaf, 0x69, 0x78, 0xe9, 0x33, 0xaa, 0x08, 0xaa, 0xf2, 0x4b, 0x2a, 0x64, 0x7e, 0xc9, 0x1b, + 0xfa, 0x00, 0xda, 0xfc, 0xf6, 0x79, 0xe4, 0x87, 0x82, 0x25, 0x6b, 0xfc, 0xa0, 0xc2, 0x94, 0x8b, + 0x27, 0x35, 0x9c, 0xab, 0xa2, 0x03, 0xb0, 0xf8, 0xf9, 0x38, 0x0a, 0xbf, 0xf5, 0x93, 0x99, 0xa0, + 0xcd, 0x1a, 0x3b, 0x15, 0x96, 0x4a, 0x63, 0x52, 0xc3, 0x45, 0x83, 0x23, 0x03, 0x9a, 0x97, 0x9c, + 0x08, 0xe7, 0x27, 0x0d, 0x0c, 0x55, 0x3d, 0xe8, 0x63, 0xb0, 0x88, 0x1b, 0x9c, 0xaa, 0xda, 0x53, + 0xc4, 0x38, 0xeb, 0xa5, 0x96, 0x69, 0xe0, 0xa2, 0x3a, 0x3a, 0x10, 0xc5, 0xae, 0x58, 0x16, 0xc5, + 0x6e, 0x8d, 0x7b, 0xeb, 0xc6, 0xc5, 0x32, 0xc0, 0x05, 0x0b, 0xe7, 0x08, 0xac, 0xc2, 0xdb, 0xe8, + 0x31, 0xb4, 0xf9, 0xeb, 0x8c, 0x30, 0xaa, 0x3c, 0x79, 0x50, 0xe1, 0x09, 0x17, 0xe3, 0x5c, 0xd1, + 0xf9, 0x51, 0x87, 0x76, 0x06, 0xa3, 0x87, 0xf0, 0x5a, 0xb2, 0x2c, 0x60, 0x2a, 0x3b, 0xb4, 0x81, + 0x57, 0x41, 0xf4, 0x44, 0xb2, 0x27, 0x4c, 0x52, 0xe5, 0xb6, 0x5d, 0x91, 0x48, 0xf9, 0x55, 0x05, + 0x5d, 0x74, 0x00, 0x86, 0x2f, 0x48, 0x4c, 0xed, 0xba, 0x30, 0x7b, 0x78, 0x8b, 0x83, 0x23, 0xc9, + 0x75, 0xfa, 0x59, 0xc8, 0x92, 0x05, 0xce, 0x8c, 0x9c, 0xe7, 0xd0, 0x29, 0x0a, 0x50, 0x17, 0xea, + 0x2f, 0xe8, 0x42, 0x04, 0x6b, 0x62, 0x7e, 0x44, 0xfb, 0x8a, 0xa5, 0x0d, 0xc5, 0x2e, 0x5f, 0xc0, + 0x52, 0xef, 0x43, 0xfd, 0x89, 0xe6, 0xfc, 0xa9, 0x81, 0x99, 0x3b, 0xbc, 0xd2, 0x98, 0xda, 0x6a, + 0x63, 0xf2, 0x04, 0xd1, 0xd0, 0x4d, 0x16, 0x31, 0xf3, 0xa3, 0xf0, 0x84, 0x2e, 0xd4, 0x00, 0x5c, + 0x05, 0xd1, 0xfb, 0xf0, 0xba, 0x02, 0xa8, 0xa7, 0x06, 0x82, 0x0c, 0xb8, 0x83, 0xd7, 0x05, 0xe8, + 0x13, 0xb0, 0xe2, 0xbc, 0x41, 0x52, 0xd1, 0x0d, 0x3b, 0x6b, 0x65, 0xb0, 0xda, 0x5e, 0x29, 0x2e, + 0x9a, 0xf0, 0xd1, 0x35, 0x4d, 0x55, 0x9d, 0x52, 0x4f, 0x34, 0x45, 0x1b, 0x17, 0x21, 0xe7, 0x77, + 0x0d, 0x0c, 0x35, 0x1f, 0x5e, 0xbd, 0xf8, 0x9c, 0xa7, 0x60, 0x15, 0x1a, 0x73, 0x63, 0x00, 0x7b, + 0x60, 0xaa, 0xe1, 0x37, 0xf5, 0x84, 0xf3, 0x26, 0x5e, 0x02, 0xce, 0xdf, 0x1a, 0xc0, 0xb2, 0x04, + 0xd0, 0x10, 0x76, 0x89, 0xeb, 0xd2, 0x98, 0x3d, 0x9b, 0x9f, 0x05, 0xbe, 0x7b, 0xa2, 0x4a, 0xa9, + 0x83, 0xcb, 0x30, 0x7a, 0x0f, 0xba, 0x2a, 0xb0, 0xa5, 0xaa, 0x4c, 0xcd, 0x1a, 0xfe, 0xbf, 0xb3, + 0xef, 0x40, 0x5b, 0xc6, 0x33, 0x95, 0xd4, 0x9b, 0x38, 0xbf, 0x3b, 0x2f, 0x35, 0x68, 0x67, 0xd3, + 0xf0, 0x0e, 0x88, 0xcf, 0x13, 0x76, 0x9a, 0x6f, 0x00, 0xf5, 0x62, 0xc2, 0x72, 0x18, 0x0d, 0xa0, + 0xb3, 0x1c, 0xd9, 0x53, 0x4f, 0xc4, 0x65, 0xe2, 0x15, 0xac, 0x3a, 0x51, 0xcd, 0x5b, 0x12, 0xe5, + 0x7c, 0x27, 0xa9, 0x53, 0x3f, 0x4e, 0x9b, 0x62, 0x79, 0x0a, 0xbb, 0x6a, 0x60, 0x61, 0x1a, 0x07, + 0xc4, 0xcd, 0xa7, 0xcd, 0x5b, 0xa5, 0xb4, 0xe2, 0x15, 0x2d, 0x5c, 0xb6, 0x72, 0x7e, 0x80, 0x9d, + 0x55, 0x95, 0x3b, 0x48, 0xe1, 0xb2, 0x92, 0xf2, 0xd8, 0x54, 0x0e, 0xd7, 0x70, 0x87, 0xc1, 0xbd, + 0xaa, 0x9f, 0xd5, 0x8d, 0x5e, 0x94, 0xea, 0x49, 0xff, 0xcf, 0xf5, 0x34, 0x38, 0x84, 0xdd, 0x92, + 0x1c, 0x99, 0xd0, 0x3c, 0xf4, 0x66, 0x7e, 0xd8, 0xad, 0x21, 0x80, 0xd6, 0x57, 0x89, 0xcf, 0x68, + 0xd2, 0xd5, 0xf8, 0x99, 0xbb, 0x4a, 0x93, 0xae, 0x8e, 0x2c, 0x30, 0x24, 0x35, 0x5e, 0xb7, 0x3e, + 0xf8, 0x55, 0x87, 0xd6, 0xd6, 0x2b, 0xdf, 0x1e, 0x98, 0xf9, 0x82, 0x97, 0xb5, 0x6c, 0x0e, 0x6c, + 0xbd, 0xf0, 0x95, 0xd6, 0xb7, 0xc6, 0xb6, 0xeb, 0x5b, 0x73, 0xbb, 0xf5, 0xad, 0xb5, 0x69, 0x7d, + 0x33, 0x4a, 0x1c, 0xf4, 0x00, 0xfc, 0x34, 0x5f, 0x0a, 0xda, 0x62, 0x1c, 0x17, 0x90, 0xc1, 0x6f, + 0x1a, 0x4f, 0x9c, 0xd8, 0xb3, 0xef, 0x43, 0x2b, 0x4e, 0xe8, 0xe5, 0xd4, 0x53, 0x44, 0xaa, 0xdb, + 0xca, 0xf3, 0x7a, 0xe9, 0x79, 0x04, 0x0d, 0x8f, 0xc7, 0x28, 0xcb, 0x46, 0x9c, 0x6f, 0x09, 0xae, + 0xb1, 0x5d, 0x70, 0xcd, 0x52, 0x70, 0x47, 0x6f, 0xbf, 0xbc, 0xee, 0x69, 0x57, 0xd7, 0x3d, 0xed, + 0xaf, 0xeb, 0x9e, 0xf6, 0xf3, 0x4d, 0xaf, 0x76, 0x75, 0xd3, 0xab, 0xfd, 0x71, 0xd3, 0xab, 0x7d, + 0xd3, 0x14, 0xff, 0x4e, 0xce, 0x5a, 0xe2, 0xcf, 0xc8, 0xe3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, + 0xb2, 0xbe, 0xb9, 0x2e, 0xc0, 0x0c, 0x00, 0x00, } func (m *RawChange) Marshal() (dAtA []byte, err error) { @@ -1257,6 +1399,50 @@ func (m *RawChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *RawRecord) 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 *RawRecord) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RawRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x1a + } + if len(m.Signature) > 0 { + i -= len(m.Signature) + copy(dAtA[i:], m.Signature) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Signature))) + i-- + dAtA[i] = 0x12 + } + if len(m.Payload) > 0 { + i -= len(m.Payload) + copy(dAtA[i:], m.Payload) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Payload))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ACLChange) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2115,14 +2301,12 @@ func (m *Change) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - if len(m.AclHeadIds) > 0 { - for iNdEx := len(m.AclHeadIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.AclHeadIds[iNdEx]) - copy(dAtA[i:], m.AclHeadIds[iNdEx]) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.AclHeadIds[iNdEx]))) - i-- - dAtA[i] = 0x12 - } + if len(m.AclHeadId) > 0 { + i -= len(m.AclHeadId) + copy(dAtA[i:], m.AclHeadId) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.AclHeadId))) + i-- + dAtA[i] = 0x12 } if len(m.TreeHeadIds) > 0 { for iNdEx := len(m.TreeHeadIds) - 1; iNdEx >= 0; iNdEx-- { @@ -2136,6 +2320,60 @@ func (m *Change) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Record) 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 *Record) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Record) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Timestamp != 0 { + i = encodeVarintAclchanges(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x28 + } + if m.CurrentReadKeyHash != 0 { + i = encodeVarintAclchanges(dAtA, i, uint64(m.CurrentReadKeyHash)) + i-- + dAtA[i] = 0x20 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x1a + } + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) + i-- + dAtA[i] = 0x12 + } + if len(m.PrevId) > 0 { + i -= len(m.PrevId) + copy(dAtA[i:], m.PrevId) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.PrevId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintAclchanges(dAtA []byte, offset int, v uint64) int { offset -= sovAclchanges(v) base := offset @@ -2168,6 +2406,27 @@ func (m *RawChange) Size() (n int) { return n } +func (m *RawRecord) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Payload) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.Signature) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + return n +} + func (m *ACLChange) Size() (n int) { if m == nil { return 0 @@ -2563,11 +2822,9 @@ func (m *Change) Size() (n int) { n += 1 + l + sovAclchanges(uint64(l)) } } - if len(m.AclHeadIds) > 0 { - for _, s := range m.AclHeadIds { - l = len(s) - n += 1 + l + sovAclchanges(uint64(l)) - } + l = len(m.AclHeadId) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) } l = len(m.SnapshotBaseId) if l > 0 { @@ -2593,6 +2850,33 @@ func (m *Change) Size() (n int) { return n } +func (m *Record) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PrevId) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.Identity) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + if m.CurrentReadKeyHash != 0 { + n += 1 + sovAclchanges(uint64(m.CurrentReadKeyHash)) + } + if m.Timestamp != 0 { + n += 1 + sovAclchanges(uint64(m.Timestamp)) + } + return n +} + func sovAclchanges(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2749,6 +3033,156 @@ func (m *RawChange) Unmarshal(dAtA []byte) error { } return nil } +func (m *RawRecord) 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 ErrIntOverflowAclchanges + } + 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: RawRecord: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RawRecord: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) + if m.Payload == nil { + m.Payload = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) + if m.Signature == nil { + m.Signature = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclchanges(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclchanges + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ACLChange) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -5103,7 +5537,7 @@ func (m *Change) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclHeadIds", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AclHeadId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -5131,7 +5565,7 @@ func (m *Change) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AclHeadIds = append(m.AclHeadIds, string(dAtA[iNdEx:postIndex])) + m.AclHeadId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { @@ -5310,6 +5744,192 @@ func (m *Change) Unmarshal(dAtA []byte) error { } return nil } +func (m *Record) 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 ErrIntOverflowAclchanges + } + 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: Record: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Record: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrevId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentReadKeyHash", wireType) + } + m.CurrentReadKeyHash = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentReadKeyHash |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipAclchanges(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclchanges + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipAclchanges(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto index bc464cec..5609ca2f 100644 --- a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto +++ b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto @@ -8,6 +8,12 @@ message RawChange { string id = 3; } +message RawRecord { + bytes payload = 1; + bytes signature = 2; + string id = 3; +} + // the element of change tree used to store and internal apply smartBlock history message ACLChange { repeated string treeHeadIds = 1; @@ -112,7 +118,7 @@ message ACLChange { message Change { repeated string treeHeadIds = 1; - repeated string aclHeadIds = 2; + string aclHeadId = 2; string snapshotBaseId = 3; // we will only have one base snapshot for both bytes changesData = 4; uint64 currentReadKeyHash = 5; @@ -120,3 +126,11 @@ message Change { string identity = 7; bool isSnapshot = 8; } + +message Record { + string prevId = 1; + string identity = 2; + bytes data = 3; + uint64 currentReadKeyHash = 4; + int64 timestamp = 5; +} diff --git a/pkg/acl/tree/aclstate.go b/pkg/acl/list/aclstate.go similarity index 88% rename from pkg/acl/tree/aclstate.go rename to pkg/acl/list/aclstate.go index fdd796e0..31c0f464 100644 --- a/pkg/acl/tree/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -1,17 +1,22 @@ -package tree +package list import ( "bytes" "errors" "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" "github.com/gogo/protobuf/proto" + "go.uber.org/zap" "hash/fnv" ) +var log = logger.NewNamed("acllist") + var ErrNoSuchUser = errors.New("no such user") var ErrFailedToDecrypt = errors.New("failed to decrypt key") var ErrUserRemoved = errors.New("user was removed from the document") @@ -23,7 +28,7 @@ type ACLState struct { userReadKeys map[uint64]*symmetric.Key userStates map[string]*aclpb.ACLChangeUserState userInvites map[string]*aclpb.ACLChangeUserInvite - signingPubKeyDecoder signingkey.PubKeyDecoder + signingPubKeyDecoder keys.Decoder encryptionKey encryptionkey.PrivKey identity string } @@ -31,14 +36,14 @@ type ACLState struct { func newACLStateWithIdentity( identity string, encryptionKey encryptionkey.PrivKey, - signingPubKeyDecoder signingkey.PubKeyDecoder) *ACLState { + decoder keys.Decoder) *ACLState { return &ACLState{ identity: identity, encryptionKey: encryptionKey, userReadKeys: make(map[uint64]*symmetric.Key), userStates: make(map[string]*aclpb.ACLChangeUserState), userInvites: make(map[string]*aclpb.ACLChangeUserInvite), - signingPubKeyDecoder: signingPubKeyDecoder, + signingPubKeyDecoder: decoder, } } @@ -50,10 +55,18 @@ func newACLState() *ACLState { } } -func (st *ACLState) applyChange(change *aclpb.Change) (err error) { +func (st *ACLState) CurrentReadKeyHash() uint64 { + return st.currentReadKeyHash +} + +func (st *ACLState) UserReadKeys() map[uint64]*symmetric.Key { + return st.userReadKeys +} + +func (st *ACLState) applyRecord(record *aclpb.Record) (err error) { aclData := &aclpb.ACLChangeACLData{} - err = proto.Unmarshal(change.ChangesData, aclData) + err = proto.Unmarshal(record.Data, aclData) if err != nil { return } @@ -62,27 +75,27 @@ func (st *ACLState) applyChange(change *aclpb.Change) (err error) { if err != nil { return } - st.currentReadKeyHash = change.CurrentReadKeyHash + st.currentReadKeyHash = record.CurrentReadKeyHash }() - return st.applyChangeData(aclData, change.CurrentReadKeyHash, change.Identity) + return st.applyChangeData(aclData, record.CurrentReadKeyHash, record.Identity) } -func (st *ACLState) applyChangeAndUpdate(changeWrapper *Change) (err error) { - change := changeWrapper.Content +func (st *ACLState) applyChangeAndUpdate(recordWrapper *Record) (err error) { + change := recordWrapper.Content aclData := &aclpb.ACLChangeACLData{} - if changeWrapper.ParsedModel != nil { - aclData = changeWrapper.ParsedModel.(*aclpb.ACLChangeACLData) + if recordWrapper.ParsedModel != nil { + aclData = recordWrapper.ParsedModel.(*aclpb.ACLChangeACLData) } else { - err = proto.Unmarshal(change.ChangesData, aclData) + err = proto.Unmarshal(change.Data, aclData) if err != nil { return } - changeWrapper.ParsedModel = aclData + recordWrapper.ParsedModel = aclData } - return st.applyChangeData(aclData, changeWrapper.Content.CurrentReadKeyHash, changeWrapper.Content.Identity) + return st.applyChangeData(aclData, recordWrapper.Content.CurrentReadKeyHash, recordWrapper.Content.Identity) } func (st *ACLState) applyChangeData(changeData *aclpb.ACLChangeACLData, hash uint64, identity string) (err error) { @@ -111,7 +124,7 @@ func (st *ACLState) applyChangeData(changeData *aclpb.ACLChangeACLData, hash uin for _, ch := range changeData.GetAclContent() { if err = st.applyChangeContent(ch); err != nil { - log.Infof("error while applying changes: %v; ignore", err) + log.Info("error while applying changes: %v; ignore", zap.Error(err)) return err } } @@ -174,7 +187,7 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLChangeUserJoin) error { return fmt.Errorf("failed to decode signing identity as bytes") } - res, err := verificationKey.Verify(rawSignedId, signature) + res, err := verificationKey.(signingkey.PubKey).Verify(rawSignedId, signature) if err != nil { return fmt.Errorf("verification returned error: %w", err) } diff --git a/pkg/acl/list/aclstatebuilder.go b/pkg/acl/list/aclstatebuilder.go new file mode 100644 index 00000000..51dd9139 --- /dev/null +++ b/pkg/acl/list/aclstatebuilder.go @@ -0,0 +1,51 @@ +package list + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" +) + +type aclStateBuilder struct { + log ACLList + identity string + key encryptionkey.PrivKey + decoder keys.Decoder +} + +func newACLStateBuilderWithIdentity(decoder keys.Decoder, accountData *account.AccountData) *aclStateBuilder { + return &aclStateBuilder{ + decoder: decoder, + identity: accountData.Identity, + key: accountData.EncKey, + } +} + +func newACLStateBuilder() *aclStateBuilder { + return &aclStateBuilder{} +} + +func (sb *aclStateBuilder) Init(aclLog ACLList) error { + sb.log = aclLog + return nil +} + +func (sb *aclStateBuilder) Build() (*ACLState, error) { + var ( + err error + state *ACLState + ) + + if sb.decoder != nil { + state = newACLStateWithIdentity(sb.identity, sb.key, sb.decoder) + } else { + state = newACLState() + } + + sb.log.Iterate(func(c *Record) (isContinue bool) { + err = state.applyChangeAndUpdate(c) + return err == nil + }) + + return state, err +} diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/list/changebuilder.go similarity index 83% rename from pkg/acl/tree/changebuilder.go rename to pkg/acl/list/changebuilder.go index 98961e4b..c5420b50 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/list/changebuilder.go @@ -1,4 +1,4 @@ -package tree +package list import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" @@ -20,7 +20,7 @@ type ACLChangeBuilder interface { type aclChangeBuilder struct { aclState *ACLState - tree *Tree + list ACLList acc *account.AccountData aclData *aclpb.ACLChangeACLData @@ -33,9 +33,9 @@ func newACLChangeBuilder() *aclChangeBuilder { return &aclChangeBuilder{} } -func (c *aclChangeBuilder) Init(state *ACLState, tree *Tree, acc *account.AccountData) { +func (c *aclChangeBuilder) Init(state *ACLState, list ACLList, acc *account.AccountData) { c.aclState = state - c.tree = tree + c.list = list c.acc = acc c.aclData = &aclpb.ACLChangeACLData{} @@ -93,30 +93,25 @@ func (c *aclChangeBuilder) UserAdd(identity string, encryptionKey encryptionkey. return nil } -func (c *aclChangeBuilder) BuildAndApply() (*Change, []byte, error) { - aclChange := &aclpb.Change{ - TreeHeadIds: c.tree.Heads(), - SnapshotBaseId: c.tree.RootId(), +func (c *aclChangeBuilder) BuildAndApply() (*Record, []byte, error) { + aclRecord := &aclpb.Record{ + PrevId: c.list.Last().Id, CurrentReadKeyHash: c.readKeyHash, Timestamp: int64(time.Now().Nanosecond()), Identity: c.acc.Identity, } - if c.aclState.currentReadKeyHash == 0 { - // setting IsSnapshot for initial change - aclChange.IsSnapshot = true - } marshalledData, err := proto.Marshal(c.aclData) if err != nil { return nil, nil, err } - aclChange.ChangesData = marshalledData - err = c.aclState.applyChange(aclChange) + aclRecord.Data = marshalledData + err = c.aclState.applyRecord(aclRecord) if err != nil { return nil, nil, err } - fullMarshalledChange, err := proto.Marshal(aclChange) + fullMarshalledChange, err := proto.Marshal(aclRecord) if err != nil { return nil, nil, err } @@ -128,7 +123,7 @@ func (c *aclChangeBuilder) BuildAndApply() (*Change, []byte, error) { if err != nil { return nil, nil, err } - ch := NewChange(id, aclChange) + ch := NewRecord(id, aclRecord) ch.ParsedModel = c.aclData ch.Sign = signature diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go new file mode 100644 index 00000000..420f7e84 --- /dev/null +++ b/pkg/acl/list/list.go @@ -0,0 +1,16 @@ +package list + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + +type IterFunc = func(record *Record) (IsContinue bool) + +type ACLList interface { + tree.RWLocker + ID() string + ACLState() ACLState + IsAfter(first string, second string) (bool, error) + Last() *Record + Get(id string) (*Record, error) + Iterate(iterFunc IterFunc) + IterateFrom(startId string, iterFunc IterFunc) +} diff --git a/pkg/acl/list/record.go b/pkg/acl/list/record.go new file mode 100644 index 00000000..e20351d2 --- /dev/null +++ b/pkg/acl/list/record.go @@ -0,0 +1,17 @@ +package list + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + +type Record struct { + Id string + Content *aclpb.Record + ParsedModel interface{} + Sign []byte +} + +func NewRecord(id string, aclRecord *aclpb.Record) *Record { + return &Record{ + Id: id, + Content: aclRecord, + } +} diff --git a/pkg/acl/tree/aclstatebuilder.go b/pkg/acl/tree/aclstatebuilder.go deleted file mode 100644 index 4fd125e9..00000000 --- a/pkg/acl/tree/aclstatebuilder.go +++ /dev/null @@ -1,102 +0,0 @@ -package tree - -import ( - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" -) - -type aclStateBuilder struct { - tree *Tree - identity string - key encryptionkey.PrivKey - decoder signingkey.PubKeyDecoder -} - -func newACLStateBuilderWithIdentity(decoder signingkey.PubKeyDecoder, accountData *account.AccountData) *aclStateBuilder { - return &aclStateBuilder{ - decoder: decoder, - identity: accountData.Identity, - key: accountData.EncKey, - } -} - -func newACLStateBuilder() *aclStateBuilder { - return &aclStateBuilder{} -} - -func (sb *aclStateBuilder) Init(tree *Tree) error { - sb.tree = tree - return nil -} - -func (sb *aclStateBuilder) Build() (*ACLState, error) { - state, _, err := sb.BuildBefore("") - return state, err -} - -func (sb *aclStateBuilder) BuildBefore(beforeId string) (*ACLState, bool, error) { - var ( - err error - startChange = sb.tree.root - state *ACLState - foundId = false - ) - - if sb.decoder != nil { - state = newACLStateWithIdentity(sb.identity, sb.key, sb.decoder) - } else { - state = newACLState() - } - - if beforeId == startChange.Id { - return state, true, nil - } - - iterFunc := func(c *Change) (isContinue bool) { - defer func() { - if err == nil { - startChange = c - } else if err != ErrDocumentForbidden { - log.Errorf("marking change %s as invalid: %v", c.Id, err) - sb.tree.RemoveInvalidChange(c.Id) - } - }() - err = state.applyChangeAndUpdate(c) - if err != nil { - return false - } - - // the user can't make changes - if !state.hasPermission(c.Content.Identity, aclpb.ACLChange_Writer) && !state.hasPermission(c.Content.Identity, aclpb.ACLChange_Admin) { - err = fmt.Errorf("user %s cannot make changes", c.Content.Identity) - return false - } - - if c.Id == beforeId { - foundId = true - return false - } - - return true - } - - for { - sb.tree.IterateSkip(sb.tree.root.Id, startChange.Id, iterFunc) - if err == nil { - break - } - - // the user is forbidden to access the document - if err == ErrDocumentForbidden { - return nil, foundId, err - } - - // otherwise we have to continue from the change which we had - err = nil - } - - return state, foundId, err -} diff --git a/pkg/acl/tree/acltree.go b/pkg/acl/tree/acltree.go deleted file mode 100644 index 1fe94285..00000000 --- a/pkg/acl/tree/acltree.go +++ /dev/null @@ -1,525 +0,0 @@ -package tree - -import ( - "context" - "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "go.uber.org/zap" - "sync" -) - -type AddResultSummary int - -var ErrTreeWithoutIdentity = errors.New("acl tree is created without identity") -var ErrHasInvalidChanges = errors.New("the change is invalid") - -const ( - AddResultSummaryNothing AddResultSummary = iota - AddResultSummaryAppend - AddResultSummaryRebuild -) - -type AddResult struct { - OldHeads []string - Heads []string - Added []*aclpb.RawChange - // TODO: add summary for changes - Summary AddResultSummary -} - -type ACLTreeUpdateListener interface { - Update(tree ACLTree) - Rebuild(tree ACLTree) -} - -type NoOpListener struct{} - -func (n NoOpListener) Update(tree ACLTree) {} - -func (n NoOpListener) Rebuild(tree ACLTree) {} - -type RWLocker interface { - sync.Locker - RLock() - RUnlock() -} - -var ErrNoCommonSnapshot = errors.New("trees doesn't have a common snapshot") - -type ACLTree interface { - RWLocker - CommonTree - - ACLState() *ACLState - AddContent(ctx context.Context, f func(builder ACLChangeBuilder) error) (*aclpb.RawChange, error) - AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) -} - -type aclTree struct { - treeStorage treestorage.TreeStorage - accountData *account.AccountData - updateListener ACLTreeUpdateListener - - id string - header *treepb.TreeHeader - tree *Tree - aclState *ACLState - - treeBuilder *treeBuilder - aclStateBuilder *aclStateBuilder - changeBuilder *aclChangeBuilder - - sync.RWMutex -} - -func BuildACLTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountData, listener ACLTreeUpdateListener) (ACLTree, error) { - treeBuilder := newTreeBuilder(t, acc.Decoder) - aclStateBuilder := newACLStateBuilderWithIdentity(acc.Decoder, acc) - changeBuilder := newACLChangeBuilder() - - aclTree := &aclTree{ - treeStorage: t, - accountData: acc, - tree: nil, - aclState: nil, - treeBuilder: treeBuilder, - aclStateBuilder: aclStateBuilder, - changeBuilder: changeBuilder, - updateListener: listener, - } - err := aclTree.rebuildFromStorage() - if err != nil { - return nil, err - } - err = aclTree.removeOrphans() - if err != nil { - return nil, err - } - err = t.SetHeads(aclTree.Heads()) - if err != nil { - return nil, err - } - aclTree.id, err = t.TreeID() - if err != nil { - return nil, err - } - aclTree.header, err = t.Header() - if err != nil { - return nil, err - } - - if listener != nil { - listener.Rebuild(aclTree) - } - - return aclTree, nil -} - -func BuildACLTree(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder, listener ACLTreeUpdateListener) (ACLTree, error) { - treeBuilder := newTreeBuilder(t, decoder) - aclStateBuilder := newACLStateBuilder() - changeBuilder := newACLChangeBuilder() - - aclTree := &aclTree{ - treeStorage: t, - tree: nil, - aclState: nil, - treeBuilder: treeBuilder, - aclStateBuilder: aclStateBuilder, - changeBuilder: changeBuilder, - updateListener: listener, - } - err := aclTree.rebuildFromStorage() - if err != nil { - return nil, err - } - err = aclTree.removeOrphans() - if err != nil { - return nil, err - } - err = t.SetHeads(aclTree.Heads()) - if err != nil { - return nil, err - } - aclTree.id, err = t.TreeID() - if err != nil { - return nil, err - } - aclTree.header, err = t.Header() - if err != nil { - return nil, err - } - - if listener != nil { - listener.Rebuild(aclTree) - } - - return aclTree, nil -} - -func (a *aclTree) removeOrphans() error { - // removing attached or invalid orphans - var toRemove []string - - orphans, err := a.treeStorage.Orphans() - if err != nil { - return err - } - for _, orphan := range orphans { - if _, exists := a.tree.attached[orphan]; exists { - toRemove = append(toRemove, orphan) - } - if _, exists := a.tree.invalidChanges[orphan]; exists { - toRemove = append(toRemove, orphan) - } - } - return a.treeStorage.RemoveOrphans(toRemove...) -} - -func (a *aclTree) rebuildFromStorage() (err error) { - a.treeBuilder.Init() - - a.tree, err = a.treeBuilder.Build(true) - if err != nil { - return err - } - - err = a.aclStateBuilder.Init(a.tree) - if err != nil { - return err - } - - a.aclState, err = a.aclStateBuilder.Build() - if err != nil { - return err - } - - return nil -} - -func (a *aclTree) ID() string { - return a.id -} - -func (a *aclTree) Header() *treepb.TreeHeader { - return a.header -} - -func (a *aclTree) ACLState() *ACLState { - return a.aclState -} - -func (a *aclTree) Storage() treestorage.TreeStorage { - return a.treeStorage -} - -func (a *aclTree) AddContent(ctx context.Context, build func(builder ACLChangeBuilder) error) (*aclpb.RawChange, error) { - if a.accountData == nil { - return nil, ErrTreeWithoutIdentity - } - - defer func() { - // TODO: should this be called in a separate goroutine to prevent accidental cycles (tree->updater->tree) - if a.updateListener != nil { - a.updateListener.Update(a) - } - }() - - a.changeBuilder.Init(a.aclState, a.tree, a.accountData) - err := build(a.changeBuilder) - if err != nil { - return nil, err - } - - ch, marshalled, err := a.changeBuilder.BuildAndApply() - if err != nil { - return nil, err - } - a.tree.AddFast(ch) - rawCh := &aclpb.RawChange{ - Payload: marshalled, - Signature: ch.Signature(), - Id: ch.Id, - } - - err = a.treeStorage.AddRawChange(rawCh) - if err != nil { - return nil, err - } - - err = a.treeStorage.SetHeads([]string{ch.Id}) - if err != nil { - return nil, err - } - return rawCh, nil -} - -func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (AddResult, error) { - // TODO: make proper error handling, because there are a lot of corner cases where this will break - var err error - var mode Mode - - var changes []*Change // TODO: = addChangesBuf[:0] ... - var notSeenIdx []int - prevHeads := a.tree.Heads() - for idx, ch := range rawChanges { - if a.HasChange(ch.Id) { - continue - } - - change, err := NewFromRawChange(ch) - // TODO: think what if we will have incorrect signatures on rawChanges, how everything will work - if err != nil { - continue - } - changes = append(changes, change) - notSeenIdx = append(notSeenIdx, idx) - } - - if len(notSeenIdx) == 0 { - return AddResult{ - OldHeads: prevHeads, - Heads: prevHeads, - Summary: AddResultSummaryNothing, - }, nil - } - - defer func() { - if err != nil { - return - } - - err = a.removeOrphans() - if err != nil { - return - } - - err = a.treeStorage.SetHeads(a.tree.Heads()) - if err != nil { - return - } - - if a.updateListener == nil { - return - } - - switch mode { - case Append: - a.updateListener.Update(a) - case Rebuild: - a.updateListener.Rebuild(a) - default: - break - } - }() - - getAddedChanges := func() []*aclpb.RawChange { - var added []*aclpb.RawChange - for _, idx := range notSeenIdx { - rawChange := rawChanges[idx] - if _, exists := a.tree.attached[rawChange.Id]; exists { - added = append(added, rawChange) - } - } - return added - } - - for _, ch := range changes { - err = a.treeStorage.AddChange(ch) - if err != nil { - return AddResult{}, err - } - err = a.treeStorage.AddOrphans(ch.Id) - if err != nil { - return AddResult{}, err - } - } - - rebuild := func() (AddResult, error) { - err = a.rebuildFromStorage() - if err != nil { - return AddResult{}, err - } - - return AddResult{ - OldHeads: prevHeads, - Heads: a.tree.Heads(), - Added: getAddedChanges(), - Summary: AddResultSummaryRebuild, - }, nil - } - - mode = a.tree.Add(changes...) - switch mode { - case Nothing: - for _, ch := range changes { - // rebuilding if the snapshot is different from the root - if ch.SnapshotId != a.tree.RootId() && ch.SnapshotId != "" { - return rebuild() - } - } - - return AddResult{ - OldHeads: prevHeads, - Heads: prevHeads, - Summary: AddResultSummaryNothing, - }, nil - - case Rebuild: - return rebuild() - default: - // just rebuilding the state from start without reloading everything from tree storage - // as an optimization we could've started from current heads, but I didn't implement that - a.aclState, err = a.aclStateBuilder.Build() - if err != nil { - return AddResult{}, err - } - - return AddResult{ - OldHeads: prevHeads, - Heads: a.tree.Heads(), - Added: getAddedChanges(), - Summary: AddResultSummaryAppend, - }, nil - } -} - -func (a *aclTree) Iterate(f func(change *Change) bool) { - a.tree.Iterate(a.tree.RootId(), f) -} - -func (a *aclTree) IterateFrom(s string, f func(change *Change) bool) { - a.tree.Iterate(s, f) -} - -func (a *aclTree) HasChange(s string) bool { - _, attachedExists := a.tree.attached[s] - _, unattachedExists := a.tree.unAttached[s] - _, invalidExists := a.tree.invalidChanges[s] - return attachedExists || unattachedExists || invalidExists -} - -func (a *aclTree) Heads() []string { - return a.tree.Heads() -} - -func (a *aclTree) Root() *Change { - return a.tree.Root() -} - -func (a *aclTree) Close() error { - return nil -} - -func (a *aclTree) SnapshotPath() []string { - // TODO: think about caching this - - var path []string - // TODO: think that the user may have not all of the snapshots locally - currentSnapshotId := a.tree.RootId() - for currentSnapshotId != "" { - sn, err := a.treeBuilder.loadChange(currentSnapshotId) - if err != nil { - break - } - path = append(path, currentSnapshotId) - currentSnapshotId = sn.SnapshotId - } - return path -} - -func (a *aclTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { - // TODO: think about when the clients will have their full acl tree and thus full snapshots - // but no changes after some of the snapshots - - var ( - isNewDocument = len(theirPath) == 0 - ourPath = a.SnapshotPath() - // by default returning everything we have - commonSnapshot = ourPath[len(ourPath)-1] // TODO: root snapshot, probably it is better to have a specific method in treestorage - err error - ) - - // if this is non-empty request - if !isNewDocument { - commonSnapshot, err = commonSnapshotForTwoPaths(ourPath, theirPath) - if err != nil { - return nil, err - } - } - var rawChanges []*aclpb.RawChange - // using custom load function to skip verification step and save raw changes - load := func(id string) (*Change, error) { - raw, err := a.treeStorage.GetChange(context.Background(), id) - if err != nil { - return nil, err - } - - ch, err := NewFromRawChange(raw) - if err != nil { - return nil, err - } - - rawChanges = append(rawChanges, raw) - return ch, nil - } - // we presume that we have everything after the common snapshot, though this may not be the case in case of clients and only ACL tree changes - log.With( - zap.Strings("heads", a.tree.Heads()), - zap.String("breakpoint", commonSnapshot), - zap.String("id", a.id)). - Debug("getting all changes from common snapshot") - _, err = a.treeBuilder.dfs(a.tree.Heads(), commonSnapshot, load) - if err != nil { - return nil, err - } - if isNewDocument { - // adding snapshot to raw changes - _, err = load(commonSnapshot) - if err != nil { - return nil, err - } - } - log.With( - zap.Int("len(changes)", len(rawChanges)), - zap.String("id", a.id)). - Debug("returning all changes after common snapshot") - - return rawChanges, nil -} - -func (a *aclTree) DebugDump() (string, error) { - return a.tree.Graph(ACLDescriptionParser) -} - -func commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) { - var i int - var j int - log.With(zap.Strings("our path", ourPath), zap.Strings("their path", theirPath)). - Debug("finding common snapshot for two paths") -OuterLoop: - // find starting point from the right - for i = len(ourPath) - 1; i >= 0; i-- { - for j = len(theirPath) - 1; j >= 0; j-- { - // most likely there would be only one comparison, because mostly the snapshot path will start from the root for nodes - if ourPath[i] == theirPath[j] { - break OuterLoop - } - } - } - if i < 0 || j < 0 { - return "", ErrNoCommonSnapshot - } - // find last common element of the sequence moving from right to left - for i >= 0 && j >= 0 { - if ourPath[i] == theirPath[j] { - i-- - j-- - } - } - return ourPath[i+1], nil -} diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index fc2ec75c..b1161878 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -1,7 +1,9 @@ package tree +import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" + type DocTreeValidator interface { - ValidateTree(tree *Tree, aclTree ACLTree) error + ValidateTree(tree *Tree, aclList list.ACLList) error } type docTreeValidator struct{} @@ -9,7 +11,7 @@ type docTreeValidator struct{} func newTreeValidator() DocTreeValidator { return &docTreeValidator{} } -func (v *docTreeValidator) ValidateTree(tree *Tree, aclTree ACLTree) error { +func (v *docTreeValidator) ValidateTree(tree *Tree, list list.ACLList) error { // TODO: add validation logic where we check that the change refers to correct acl heads // that means that more recent changes should refer to more recent acl heads return nil diff --git a/pkg/acl/tree/descriptionparser.go b/pkg/acl/tree/descriptionparser.go index 367afdec..c7ad3bfe 100644 --- a/pkg/acl/tree/descriptionparser.go +++ b/pkg/acl/tree/descriptionparser.go @@ -1,13 +1,5 @@ package tree -import ( - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/gogo/protobuf/proto" - "strings" - "unicode" -) - type DescriptionParser interface { ParseChange(*Change) ([]string, error) } @@ -19,35 +11,3 @@ type noopDescriptionParser struct{} func (n noopDescriptionParser) ParseChange(change *Change) ([]string, error) { return []string{"DOC"}, nil } - -var ACLDescriptionParser = aclDescriptionParser{} - -type aclDescriptionParser struct{} - -func (a aclDescriptionParser) ParseChange(changeWrapper *Change) (res []string, err error) { - change := changeWrapper.Content - aclData := &aclpb.ACLChangeACLData{} - - if changeWrapper.ParsedModel != nil { - aclData = changeWrapper.ParsedModel.(*aclpb.ACLChangeACLData) - } else { - err = proto.Unmarshal(change.ChangesData, aclData) - if err != nil { - return - } - } - - var chSymbs []string - for _, chc := range aclData.AclContent { - tp := fmt.Sprintf("%T", chc.Value) - tp = strings.Replace(tp, "ACLChangeACLContentValueValueOf", "", 1) - res := "" - for _, ts := range tp { - if unicode.IsUpper(ts) { - res += string(ts) - } - } - chSymbs = append(chSymbs, res) - } - return chSymbs, nil -} diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index e2bc014f..8717cc09 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -2,8 +2,10 @@ package tree import ( "context" + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" @@ -20,11 +22,37 @@ type TreeUpdateListener interface { Rebuild(tree DocTree) } +type RWLocker interface { + sync.Locker + RLock() + RUnlock() +} + +var ErrHasInvalidChanges = errors.New("the change is invalid") +var ErrNoCommonSnapshot = errors.New("trees doesn't have a common snapshot") +var ErrTreeWithoutIdentity = errors.New("acl tree is created without identity") + +type AddResultSummary int + +const ( + AddResultSummaryNothing AddResultSummary = iota + AddResultSummaryAppend + AddResultSummaryRebuild +) + +type AddResult struct { + OldHeads []string + Heads []string + Added []*aclpb.RawChange + // TODO: add summary for changes + Summary AddResultSummary +} + type DocTree interface { RWLocker CommonTree - AddContent(ctx context.Context, aclTree ACLTree, content proto.Marshaler, isSnapshot bool) (*aclpb.RawChange, error) - AddRawChanges(ctx context.Context, aclTree ACLTree, changes ...*aclpb.RawChange) (AddResult, error) + AddContent(ctx context.Context, aclList list.ACLList, content proto.Marshaler, isSnapshot bool) (*aclpb.RawChange, error) + AddRawChanges(ctx context.Context, aclList list.ACLList, changes ...*aclpb.RawChange) (AddResult, error) } type docTree struct { @@ -48,7 +76,7 @@ type docTree struct { sync.RWMutex } -func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountData, listener TreeUpdateListener, aclTree ACLTree) (DocTree, error) { +func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountData, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { treeBuilder := newTreeBuilder(t, acc.Decoder) validator := newTreeValidator() @@ -64,7 +92,7 @@ func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountDat notSeenIdxBuf: make([]int, 0, 10), identityKeys: make(map[string]signingkey.PubKey), } - err := docTree.rebuildFromStorage(aclTree, nil) + err := docTree.rebuildFromStorage(aclList, nil) if err != nil { return nil, err } @@ -84,7 +112,7 @@ func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountDat return docTree, nil } -func BuildDocTree(t treestorage.TreeStorage, decoder keys.Decoder, listener TreeUpdateListener, aclTree ACLTree) (DocTree, error) { +func BuildDocTree(t treestorage.TreeStorage, decoder keys.Decoder, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { treeBuilder := newTreeBuilder(t, decoder) validator := newTreeValidator() @@ -99,7 +127,7 @@ func BuildDocTree(t treestorage.TreeStorage, decoder keys.Decoder, listener Tree notSeenIdxBuf: make([]int, 0, 10), identityKeys: make(map[string]signingkey.PubKey), } - err := docTree.rebuildFromStorage(aclTree, nil) + err := docTree.rebuildFromStorage(aclList, nil) if err != nil { return nil, err } @@ -119,7 +147,7 @@ func BuildDocTree(t treestorage.TreeStorage, decoder keys.Decoder, listener Tree return docTree, nil } -func (d *docTree) rebuildFromStorage(aclTree ACLTree, newChanges []*Change) (err error) { +func (d *docTree) rebuildFromStorage(aclList list.ACLList, newChanges []*Change) (err error) { d.treeBuilder.Init(d.identityKeys) d.tree, err = d.treeBuilder.Build(false, newChanges) @@ -127,7 +155,7 @@ func (d *docTree) rebuildFromStorage(aclTree ACLTree, newChanges []*Change) (err return err } - return d.validator.ValidateTree(d.tree, aclTree) + return d.validator.ValidateTree(d.tree, aclList) } func (d *docTree) ID() string { @@ -142,7 +170,7 @@ func (d *docTree) Storage() treestorage.TreeStorage { return d.treeStorage } -func (d *docTree) AddContent(ctx context.Context, aclTree ACLTree, content proto.Marshaler, isSnapshot bool) (*aclpb.RawChange, error) { +func (d *docTree) AddContent(ctx context.Context, aclList list.ACLList, content proto.Marshaler, isSnapshot bool) (*aclpb.RawChange, error) { if d.accountData == nil { return nil, ErrTreeWithoutIdentity } @@ -153,12 +181,12 @@ func (d *docTree) AddContent(ctx context.Context, aclTree ACLTree, content proto d.updateListener.Update(d) } }() - state := aclTree.ACLState() + state := aclList.ACLState() change := &aclpb.Change{ TreeHeadIds: d.tree.Heads(), - AclHeadIds: aclTree.Heads(), + AclHeadId: aclList.Last().Id, SnapshotBaseId: d.tree.RootId(), - CurrentReadKeyHash: state.currentReadKeyHash, + CurrentReadKeyHash: state.CurrentReadKeyHash(), Timestamp: int64(time.Now().Nanosecond()), Identity: d.accountData.Identity, IsSnapshot: isSnapshot, @@ -168,7 +196,7 @@ func (d *docTree) AddContent(ctx context.Context, aclTree ACLTree, content proto if err != nil { return nil, err } - encrypted, err := state.userReadKeys[state.currentReadKeyHash].Encrypt(marshalledData) + encrypted, err := state.UserReadKeys()[state.CurrentReadKeyHash()].Encrypt(marshalledData) if err != nil { return nil, err } @@ -213,7 +241,7 @@ func (d *docTree) AddContent(ctx context.Context, aclTree ACLTree, content proto return rawCh, nil } -func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges ...*aclpb.RawChange) (addResult AddResult, err error) { +func (d *docTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawChanges ...*aclpb.RawChange) (addResult AddResult, err error) { var mode Mode // resetting buffers @@ -300,7 +328,7 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges // checking if we have some changes with different snapshot and then rebuilding for _, ch := range d.tmpChangesBuf { if ch.SnapshotId != d.tree.RootId() && ch.SnapshotId != "" { - err = d.rebuildFromStorage(aclTree, d.tmpChangesBuf) + err = d.rebuildFromStorage(aclList, d.tmpChangesBuf) if err != nil { return AddResult{}, err } @@ -331,7 +359,7 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclTree ACLTree, rawChanges default: // just rebuilding the state from start without reloading everything from tree storage // as an optimization we could've started from current heads, but I didn't implement that - err = d.validator.ValidateTree(d.tree, aclTree) + err = d.validator.ValidateTree(d.tree, aclList) if err != nil { // rolling back for _, ch := range d.tmpChangesBuf { @@ -366,8 +394,7 @@ func (d *docTree) IterateFrom(s string, f func(change *Change) bool) { func (d *docTree) HasChange(s string) bool { _, attachedExists := d.tree.attached[s] _, unattachedExists := d.tree.unAttached[s] - _, invalidExists := d.tree.invalidChanges[s] - return attachedExists || unattachedExists || invalidExists + return attachedExists || unattachedExists } func (d *docTree) Heads() []string { @@ -462,3 +489,31 @@ func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh func (d *docTree) DebugDump() (string, error) { return d.tree.Graph(NoOpDescriptionParser) } + +func commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) { + var i int + var j int + log.With(zap.Strings("our path", ourPath), zap.Strings("their path", theirPath)). + Debug("finding common snapshot for two paths") +OuterLoop: + // find starting point from the right + for i = len(ourPath) - 1; i >= 0; i-- { + for j = len(theirPath) - 1; j >= 0; j-- { + // most likely there would be only one comparison, because mostly the snapshot path will start from the root for nodes + if ourPath[i] == theirPath[j] { + break OuterLoop + } + } + } + if i < 0 || j < 0 { + return "", ErrNoCommonSnapshot + } + // find last common element of the sequence moving from right to left + for i >= 0 && j >= 0 { + if ourPath[i] == theirPath[j] { + i-- + j-- + } + } + return ourPath[i+1], nil +} diff --git a/pkg/acl/tree/treestorage.go b/pkg/acl/tree/treestorage.go index a407a374..87a3a47d 100644 --- a/pkg/acl/tree/treestorage.go +++ b/pkg/acl/tree/treestorage.go @@ -3,65 +3,66 @@ package tree import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/gogo/protobuf/proto" "time" ) -func CreateNewTreeStorageWithACL( - acc *account.AccountData, - build func(builder ACLChangeBuilder) error, - create treestorage.CreatorFunc) (treestorage.TreeStorage, error) { - bld := newACLChangeBuilder() - bld.Init( - newACLStateWithIdentity(acc.Identity, acc.EncKey, signingkey.NewEd25519PubKeyDecoder()), - &Tree{}, - acc) - err := build(bld) - if err != nil { - return nil, err - } - - change, payload, err := bld.BuildAndApply() - if err != nil { - return nil, err - } - - rawChange := &aclpb.RawChange{ - Payload: payload, - Signature: change.Signature(), - Id: change.CID(), - } - header, id, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_ACLTree, "") - if err != nil { - return nil, err - } - - thr, err := create(id, header, []*aclpb.RawChange{rawChange}) - if err != nil { - return nil, err - } - - err = thr.SetHeads([]string{change.CID()}) - if err != nil { - return nil, err - } - return thr, nil -} +// +//func CreateNewTreeStorageWithACL( +// acc *account.AccountData, +// build func(builder list.ACLChangeBuilder) error, +// create treestorage.CreatorFunc) (treestorage.TreeStorage, error) { +// bld := list.newACLChangeBuilder() +// bld.Init( +// list.newACLStateWithIdentity(acc.Identity, acc.EncKey, signingkey.NewEd25519PubKeyDecoder()), +// &Tree{}, +// acc) +// err := build(bld) +// if err != nil { +// return nil, err +// } +// +// change, payload, err := bld.BuildAndApply() +// if err != nil { +// return nil, err +// } +// +// rawChange := &aclpb.RawChange{ +// Payload: payload, +// Signature: change.Signature(), +// Id: change.CID(), +// } +// header, id, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_ACLTree, "") +// if err != nil { +// return nil, err +// } +// +// thr, err := create(id, header, []*aclpb.RawChange{rawChange}) +// if err != nil { +// return nil, err +// } +// +// err = thr.SetHeads([]string{change.CID()}) +// if err != nil { +// return nil, err +// } +// return thr, nil +//} func CreateNewTreeStorage( acc *account.AccountData, - aclTree ACLTree, + aclList list.ACLList, content proto.Marshaler, create treestorage.CreatorFunc) (treestorage.TreeStorage, error) { - state := aclTree.ACLState() + state := aclList.ACLState() change := &aclpb.Change{ - AclHeadIds: aclTree.Heads(), - CurrentReadKeyHash: state.currentReadKeyHash, + AclHeadId: aclList.Last().Id, + CurrentReadKeyHash: state.CurrentReadKeyHash(), Timestamp: int64(time.Now().Nanosecond()), Identity: acc.Identity, IsSnapshot: true, @@ -71,7 +72,7 @@ func CreateNewTreeStorage( if err != nil { return nil, err } - encrypted, err := state.userReadKeys[state.currentReadKeyHash].Encrypt(marshalledData) + encrypted, err := state.UserReadKeys()[state.CurrentReadKeyHash()].Encrypt(marshalledData) if err != nil { return nil, err } @@ -95,7 +96,7 @@ func CreateNewTreeStorage( Signature: signature, Id: changeId, } - header, treeId, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_DocTree, aclTree.ID()) + header, treeId, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_DocTree, aclList.ID()) if err != nil { return nil, err } diff --git a/service/document/service.go b/service/document/service.go index 99c0dbcc..ccd4a3aa 100644 --- a/service/document/service.go +++ b/service/document/service.go @@ -6,6 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" @@ -131,7 +132,7 @@ func (s *service) CreateACLTree(ctx context.Context) (id string, err error) { heads []string ) - t, err := tree.CreateNewTreeStorageWithACL(acc, func(builder tree.ACLChangeBuilder) error { + t, err := tree.CreateNewTreeStorageWithACL(acc, func(builder list.ACLChangeBuilder) error { err := builder.UserAdd(acc.Identity, acc.EncKey.GetPublic(), aclpb.ACLChange_Admin) if err != nil { return err From 1f403291cc861bed8f2bf939f3f9f965ccd9f1f8 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 19 Aug 2022 18:17:02 +0200 Subject: [PATCH 017/219] Change list builder --- Makefile | 1 - pkg/acl/aclchanges/aclpb/aclchanges.pb.go | 472 ++++++- .../aclchanges/aclpb/protos/aclchanges.proto | 12 + pkg/acl/acltree/aclstate.go | 411 ------- pkg/acl/acltree/aclstatebuilder.go | 186 --- pkg/acl/acltree/acltree.go | 520 -------- pkg/acl/acltree/acltree_test.go | 262 ---- pkg/acl/acltree/acltreebuilder.go | 154 --- pkg/acl/acltree/acltreestorage.go | 70 -- pkg/acl/acltree/acltreestorage_test.go | 63 - pkg/acl/acltree/change.go | 97 -- pkg/acl/acltree/changebuilder.go | 163 --- pkg/acl/acltree/changeloader.go | 99 -- pkg/acl/acltree/doctree.go | 8 - pkg/acl/acltree/snapshotvalidator.go | 50 - pkg/acl/acltree/tree.go | 416 ------- pkg/acl/acltree/treebuilder.go | 307 ----- pkg/acl/acltree/treebuilder_test.go | 64 - pkg/acl/acltree/treegraph.go | 11 - pkg/acl/acltree/treegraph_nix.go | 152 --- pkg/acl/acltree/treeiterator.go | 158 --- pkg/acl/example/plaintextdocument/document.go | 169 --- .../plaintextdocument/document_test.go | 58 - .../plaintextdocument/plaintextdocstate.go | 59 - pkg/acl/list/changebuilder.go | 2 +- pkg/acl/list/list.go | 49 +- pkg/acl/list/storage.go | 14 + .../keychain.go | 2 +- .../acllistbuilder/liststoragebuilder.go | 320 +++++ .../treestoragebuildergraph.go | 4 +- .../treestoragebuildergraph_nix.go | 121 ++ .../ymlentities.go | 63 +- .../ymlentities_test.go | 4 +- .../protos/testdocumentchanges.proto | 26 - .../testchangepb/testdocumentchanges.pb.go | 1089 ----------------- .../treestoragebuilder/treestoragebuilder.go | 539 -------- .../treestoragebuildergraph_nix.go | 162 --- .../yamltests/invalidsnapshotexample.yml | 126 -- .../testutils/yamltests/userjoinexample.yml | 101 +- pkg/acl/tree/doctree.go | 2 +- pkg/acl/tree/treestorage.go | 2 +- 41 files changed, 958 insertions(+), 5630 deletions(-) delete mode 100644 pkg/acl/acltree/aclstate.go delete mode 100644 pkg/acl/acltree/aclstatebuilder.go delete mode 100644 pkg/acl/acltree/acltree.go delete mode 100644 pkg/acl/acltree/acltree_test.go delete mode 100644 pkg/acl/acltree/acltreebuilder.go delete mode 100644 pkg/acl/acltree/acltreestorage.go delete mode 100644 pkg/acl/acltree/acltreestorage_test.go delete mode 100644 pkg/acl/acltree/change.go delete mode 100644 pkg/acl/acltree/changebuilder.go delete mode 100644 pkg/acl/acltree/changeloader.go delete mode 100644 pkg/acl/acltree/doctree.go delete mode 100644 pkg/acl/acltree/snapshotvalidator.go delete mode 100644 pkg/acl/acltree/tree.go delete mode 100644 pkg/acl/acltree/treebuilder.go delete mode 100644 pkg/acl/acltree/treebuilder_test.go delete mode 100644 pkg/acl/acltree/treegraph.go delete mode 100644 pkg/acl/acltree/treegraph_nix.go delete mode 100644 pkg/acl/acltree/treeiterator.go delete mode 100644 pkg/acl/example/plaintextdocument/document.go delete mode 100644 pkg/acl/example/plaintextdocument/document_test.go delete mode 100644 pkg/acl/example/plaintextdocument/plaintextdocstate.go create mode 100644 pkg/acl/list/storage.go rename pkg/acl/testutils/{treestoragebuilder => acllistbuilder}/keychain.go (99%) create mode 100644 pkg/acl/testutils/acllistbuilder/liststoragebuilder.go rename pkg/acl/testutils/{treestoragebuilder => acllistbuilder}/treestoragebuildergraph.go (72%) create mode 100644 pkg/acl/testutils/acllistbuilder/treestoragebuildergraph_nix.go rename pkg/acl/testutils/{treestoragebuilder => acllistbuilder}/ymlentities.go (50%) rename pkg/acl/testutils/{treestoragebuilder => acllistbuilder}/ymlentities_test.go (51%) delete mode 100644 pkg/acl/testutils/testchanges/testchangepb/protos/testdocumentchanges.proto delete mode 100644 pkg/acl/testutils/testchanges/testchangepb/testdocumentchanges.pb.go delete mode 100644 pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go delete mode 100644 pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go delete mode 100644 pkg/acl/testutils/yamltests/invalidsnapshotexample.yml diff --git a/Makefile b/Makefile index d24a7929..aeddb2d3 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,6 @@ protos-go: # use if needed $(eval PKGMAP := $$(P_TIMESTAMP),$$(P_STRUCT)) $(GOGO_START) protoc --gogofaster_out=:. $(P_ACL_CHANGES_PATH_PB)/protos/*.proto; mv $(P_ACL_CHANGES_PATH_PB)/protos/*.go $(P_ACL_CHANGES_PATH_PB) $(GOGO_START) protoc --gogofaster_out=:. $(P_TREE_STORAGE_PATH_PB)/protos/*.proto; mv $(P_TREE_STORAGE_PATH_PB)/protos/*.go $(P_TREE_STORAGE_PATH_PB) - $(GOGO_START) protoc --gogofaster_out=:. $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.proto; mv $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.go $(P_PLAINTEXT_CHANGES_PATH_PB) $(eval PKGMAP := $$(P_ACL_CHANGES),$$(P_TREE_CHANGES)) $(GOGO_START) protoc --gogofaster_out=$(PKGMAP),plugins=grpc:. $(P_SYNC_CHANGES_PATH_PB)/proto/*.proto diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go index 0f6fec52..c026319c 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go @@ -53,6 +53,31 @@ func (ACLChangeUserPermissions) EnumDescriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{2, 0} } +type HeaderDocType int32 + +const ( + Header_ACL HeaderDocType = 0 + Header_DocTree HeaderDocType = 1 +) + +var HeaderDocType_name = map[int32]string{ + 0: "ACL", + 1: "DocTree", +} + +var HeaderDocType_value = map[string]int32{ + "ACL": 0, + "DocTree": 1, +} + +func (x HeaderDocType) String() string { + return proto.EnumName(HeaderDocType_name, int32(x)) +} + +func (HeaderDocType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{5, 0} +} + type RawChange struct { Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` @@ -1259,8 +1284,77 @@ func (m *Record) GetTimestamp() int64 { return 0 } +type Header struct { + FirstId string `protobuf:"bytes,1,opt,name=firstId,proto3" json:"firstId,omitempty"` + AclListId string `protobuf:"bytes,2,opt,name=aclListId,proto3" json:"aclListId,omitempty"` + WorkspaceId string `protobuf:"bytes,3,opt,name=workspaceId,proto3" json:"workspaceId,omitempty"` + DocType HeaderDocType `protobuf:"varint,4,opt,name=docType,proto3,enum=acl.HeaderDocType" json:"docType,omitempty"` +} + +func (m *Header) Reset() { *m = Header{} } +func (m *Header) String() string { return proto.CompactTextString(m) } +func (*Header) ProtoMessage() {} +func (*Header) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{5} +} +func (m *Header) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Header.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 *Header) XXX_Merge(src proto.Message) { + xxx_messageInfo_Header.Merge(m, src) +} +func (m *Header) XXX_Size() int { + return m.Size() +} +func (m *Header) XXX_DiscardUnknown() { + xxx_messageInfo_Header.DiscardUnknown(m) +} + +var xxx_messageInfo_Header proto.InternalMessageInfo + +func (m *Header) GetFirstId() string { + if m != nil { + return m.FirstId + } + return "" +} + +func (m *Header) GetAclListId() string { + if m != nil { + return m.AclListId + } + return "" +} + +func (m *Header) GetWorkspaceId() string { + if m != nil { + return m.WorkspaceId + } + return "" +} + +func (m *Header) GetDocType() HeaderDocType { + if m != nil { + return m.DocType + } + return Header_ACL +} + func init() { proto.RegisterEnum("acl.ACLChangeUserPermissions", ACLChangeUserPermissions_name, ACLChangeUserPermissions_value) + proto.RegisterEnum("acl.HeaderDocType", HeaderDocType_name, HeaderDocType_value) proto.RegisterType((*RawChange)(nil), "acl.RawChange") proto.RegisterType((*RawRecord)(nil), "acl.RawRecord") proto.RegisterType((*ACLChange)(nil), "acl.ACLChange") @@ -1279,6 +1373,7 @@ func init() { proto.RegisterType((*ACLChangeUserPermissionChange)(nil), "acl.ACLChange.UserPermissionChange") proto.RegisterType((*Change)(nil), "acl.Change") proto.RegisterType((*Record)(nil), "acl.Record") + proto.RegisterType((*Header)(nil), "acl.Header") } func init() { @@ -1286,73 +1381,78 @@ func init() { } var fileDescriptor_37a022c841a51877 = []byte{ - // 1048 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x57, 0x4f, 0x6f, 0xe3, 0x54, - 0x10, 0x8f, 0x9d, 0x3f, 0x8e, 0xc7, 0xa1, 0x0d, 0x8f, 0xd5, 0xae, 0xb1, 0x4a, 0x88, 0xc2, 0x0a, - 0x45, 0x08, 0xa5, 0xab, 0xac, 0x90, 0x56, 0x80, 0x2a, 0xda, 0x82, 0x36, 0xa1, 0x1c, 0x56, 0xaf, - 0x5a, 0x10, 0xdc, 0x5e, 0xed, 0x47, 0x6b, 0xad, 0x63, 0x1b, 0xfb, 0xa5, 0x28, 0x17, 0x24, 0x4e, - 0x5c, 0x39, 0x23, 0xc4, 0x17, 0xe1, 0x0b, 0xec, 0xb1, 0x47, 0x6e, 0xa0, 0xf6, 0xce, 0x85, 0x2f, - 0x80, 0xde, 0x1f, 0x3b, 0x8e, 0xe3, 0x46, 0x41, 0xaa, 0x90, 0xf6, 0x10, 0xe9, 0xbd, 0xdf, 0xcc, - 0xbc, 0xcc, 0xcc, 0x6f, 0x66, 0x32, 0x81, 0x47, 0xf1, 0x8b, 0xf3, 0x7d, 0xe2, 0x06, 0xfc, 0xe3, - 0x5e, 0x90, 0xf0, 0x9c, 0xa6, 0xfc, 0x18, 0x9f, 0xed, 0xc7, 0x49, 0xc4, 0xa2, 0xb4, 0x80, 0x8f, - 0x04, 0x82, 0xea, 0xc4, 0x0d, 0x06, 0xa7, 0x60, 0x62, 0xf2, 0xfd, 0xb1, 0x10, 0x20, 0x1b, 0x8c, - 0x98, 0x2c, 0x82, 0x88, 0x78, 0xb6, 0xd6, 0xd7, 0x86, 0x1d, 0x9c, 0x5d, 0xd1, 0x1e, 0x98, 0xa9, - 0x7f, 0x1e, 0x12, 0x36, 0x4f, 0xa8, 0xad, 0x0b, 0xd9, 0x12, 0x40, 0x3b, 0xa0, 0xfb, 0x9e, 0x5d, - 0xef, 0x6b, 0x43, 0x13, 0xeb, 0xbe, 0xa7, 0x1e, 0xc5, 0xd4, 0x8d, 0x12, 0xef, 0xce, 0x1e, 0xfd, - 0xe7, 0x0d, 0x30, 0x0f, 0x8f, 0xbf, 0x50, 0xae, 0xf6, 0xc1, 0x62, 0x09, 0xa5, 0x13, 0x4a, 0xbc, - 0xa9, 0x97, 0xda, 0x5a, 0xbf, 0x3e, 0x34, 0x71, 0x11, 0x42, 0x3d, 0x00, 0xe2, 0x06, 0x99, 0x82, - 0x2e, 0x14, 0x0a, 0x08, 0x7a, 0x17, 0x76, 0xd2, 0x90, 0xc4, 0xe9, 0x45, 0xc4, 0x8e, 0x48, 0x4a, - 0xa7, 0xd9, 0x77, 0x95, 0x50, 0xf4, 0x08, 0x0c, 0xe2, 0x06, 0x9f, 0x12, 0x46, 0xec, 0x46, 0x5f, - 0x1b, 0x5a, 0xe3, 0xfb, 0x23, 0xe2, 0x06, 0xa3, 0xdc, 0x15, 0x7e, 0xe2, 0x52, 0x9c, 0xa9, 0x71, - 0xdf, 0x54, 0xa6, 0x85, 0x55, 0x53, 0x44, 0x56, 0x84, 0xd0, 0x08, 0x90, 0x3b, 0x4f, 0x12, 0x1a, - 0x32, 0x4c, 0x89, 0x77, 0x42, 0x17, 0x13, 0x92, 0x5e, 0xd8, 0xad, 0xbe, 0x36, 0x6c, 0xe0, 0x0a, - 0x09, 0xcf, 0x14, 0xf3, 0x67, 0x34, 0x65, 0x64, 0x16, 0xdb, 0x46, 0x5f, 0x1b, 0xd6, 0xf1, 0x12, - 0x40, 0x0e, 0xb4, 0x7d, 0x8f, 0x86, 0xcc, 0x67, 0x0b, 0xbb, 0x2d, 0x62, 0xc8, 0xef, 0xce, 0x2f, - 0x75, 0xd8, 0xe5, 0xae, 0x46, 0x21, 0xa3, 0x21, 0xfb, 0x92, 0x04, 0x73, 0x8a, 0xc6, 0x60, 0xcc, - 0x53, 0x9a, 0x1c, 0x7a, 0x92, 0x91, 0xf5, 0x88, 0x9e, 0x4b, 0xe9, 0xa4, 0x86, 0x33, 0x45, 0xf4, - 0x11, 0x00, 0x3f, 0x62, 0x3a, 0x8b, 0x2e, 0x25, 0x59, 0xd6, 0xf8, 0xcd, 0x0a, 0x33, 0xa9, 0x30, - 0xa9, 0xe1, 0x82, 0x3a, 0xfa, 0x1a, 0xee, 0xf1, 0xdb, 0x33, 0x9a, 0xcc, 0xfc, 0x34, 0xf5, 0xa3, - 0x50, 0x1a, 0x88, 0x84, 0x5b, 0xe3, 0x77, 0x2a, 0x9e, 0x29, 0xab, 0x4e, 0x6a, 0xb8, 0xf2, 0x89, - 0xcc, 0xaf, 0x69, 0x78, 0xe9, 0x33, 0xaa, 0x08, 0xaa, 0xf2, 0x4b, 0x2a, 0x64, 0x7e, 0xc9, 0x1b, - 0xfa, 0x00, 0xda, 0xfc, 0xf6, 0x79, 0xe4, 0x87, 0x82, 0x25, 0x6b, 0xfc, 0xa0, 0xc2, 0x94, 0x8b, - 0x27, 0x35, 0x9c, 0xab, 0xa2, 0x03, 0xb0, 0xf8, 0xf9, 0x38, 0x0a, 0xbf, 0xf5, 0x93, 0x99, 0xa0, - 0xcd, 0x1a, 0x3b, 0x15, 0x96, 0x4a, 0x63, 0x52, 0xc3, 0x45, 0x83, 0x23, 0x03, 0x9a, 0x97, 0x9c, - 0x08, 0xe7, 0x27, 0x0d, 0x0c, 0x55, 0x3d, 0xe8, 0x63, 0xb0, 0x88, 0x1b, 0x9c, 0xaa, 0xda, 0x53, - 0xc4, 0x38, 0xeb, 0xa5, 0x96, 0x69, 0xe0, 0xa2, 0x3a, 0x3a, 0x10, 0xc5, 0xae, 0x58, 0x16, 0xc5, - 0x6e, 0x8d, 0x7b, 0xeb, 0xc6, 0xc5, 0x32, 0xc0, 0x05, 0x0b, 0xe7, 0x08, 0xac, 0xc2, 0xdb, 0xe8, - 0x31, 0xb4, 0xf9, 0xeb, 0x8c, 0x30, 0xaa, 0x3c, 0x79, 0x50, 0xe1, 0x09, 0x17, 0xe3, 0x5c, 0xd1, - 0xf9, 0x51, 0x87, 0x76, 0x06, 0xa3, 0x87, 0xf0, 0x5a, 0xb2, 0x2c, 0x60, 0x2a, 0x3b, 0xb4, 0x81, - 0x57, 0x41, 0xf4, 0x44, 0xb2, 0x27, 0x4c, 0x52, 0xe5, 0xb6, 0x5d, 0x91, 0x48, 0xf9, 0x55, 0x05, - 0x5d, 0x74, 0x00, 0x86, 0x2f, 0x48, 0x4c, 0xed, 0xba, 0x30, 0x7b, 0x78, 0x8b, 0x83, 0x23, 0xc9, - 0x75, 0xfa, 0x59, 0xc8, 0x92, 0x05, 0xce, 0x8c, 0x9c, 0xe7, 0xd0, 0x29, 0x0a, 0x50, 0x17, 0xea, - 0x2f, 0xe8, 0x42, 0x04, 0x6b, 0x62, 0x7e, 0x44, 0xfb, 0x8a, 0xa5, 0x0d, 0xc5, 0x2e, 0x5f, 0xc0, - 0x52, 0xef, 0x43, 0xfd, 0x89, 0xe6, 0xfc, 0xa9, 0x81, 0x99, 0x3b, 0xbc, 0xd2, 0x98, 0xda, 0x6a, - 0x63, 0xf2, 0x04, 0xd1, 0xd0, 0x4d, 0x16, 0x31, 0xf3, 0xa3, 0xf0, 0x84, 0x2e, 0xd4, 0x00, 0x5c, - 0x05, 0xd1, 0xfb, 0xf0, 0xba, 0x02, 0xa8, 0xa7, 0x06, 0x82, 0x0c, 0xb8, 0x83, 0xd7, 0x05, 0xe8, - 0x13, 0xb0, 0xe2, 0xbc, 0x41, 0x52, 0xd1, 0x0d, 0x3b, 0x6b, 0x65, 0xb0, 0xda, 0x5e, 0x29, 0x2e, - 0x9a, 0xf0, 0xd1, 0x35, 0x4d, 0x55, 0x9d, 0x52, 0x4f, 0x34, 0x45, 0x1b, 0x17, 0x21, 0xe7, 0x77, - 0x0d, 0x0c, 0x35, 0x1f, 0x5e, 0xbd, 0xf8, 0x9c, 0xa7, 0x60, 0x15, 0x1a, 0x73, 0x63, 0x00, 0x7b, - 0x60, 0xaa, 0xe1, 0x37, 0xf5, 0x84, 0xf3, 0x26, 0x5e, 0x02, 0xce, 0xdf, 0x1a, 0xc0, 0xb2, 0x04, - 0xd0, 0x10, 0x76, 0x89, 0xeb, 0xd2, 0x98, 0x3d, 0x9b, 0x9f, 0x05, 0xbe, 0x7b, 0xa2, 0x4a, 0xa9, - 0x83, 0xcb, 0x30, 0x7a, 0x0f, 0xba, 0x2a, 0xb0, 0xa5, 0xaa, 0x4c, 0xcd, 0x1a, 0xfe, 0xbf, 0xb3, - 0xef, 0x40, 0x5b, 0xc6, 0x33, 0x95, 0xd4, 0x9b, 0x38, 0xbf, 0x3b, 0x2f, 0x35, 0x68, 0x67, 0xd3, - 0xf0, 0x0e, 0x88, 0xcf, 0x13, 0x76, 0x9a, 0x6f, 0x00, 0xf5, 0x62, 0xc2, 0x72, 0x18, 0x0d, 0xa0, - 0xb3, 0x1c, 0xd9, 0x53, 0x4f, 0xc4, 0x65, 0xe2, 0x15, 0xac, 0x3a, 0x51, 0xcd, 0x5b, 0x12, 0xe5, - 0x7c, 0x27, 0xa9, 0x53, 0x3f, 0x4e, 0x9b, 0x62, 0x79, 0x0a, 0xbb, 0x6a, 0x60, 0x61, 0x1a, 0x07, - 0xc4, 0xcd, 0xa7, 0xcd, 0x5b, 0xa5, 0xb4, 0xe2, 0x15, 0x2d, 0x5c, 0xb6, 0x72, 0x7e, 0x80, 0x9d, - 0x55, 0x95, 0x3b, 0x48, 0xe1, 0xb2, 0x92, 0xf2, 0xd8, 0x54, 0x0e, 0xd7, 0x70, 0x87, 0xc1, 0xbd, - 0xaa, 0x9f, 0xd5, 0x8d, 0x5e, 0x94, 0xea, 0x49, 0xff, 0xcf, 0xf5, 0x34, 0x38, 0x84, 0xdd, 0x92, - 0x1c, 0x99, 0xd0, 0x3c, 0xf4, 0x66, 0x7e, 0xd8, 0xad, 0x21, 0x80, 0xd6, 0x57, 0x89, 0xcf, 0x68, - 0xd2, 0xd5, 0xf8, 0x99, 0xbb, 0x4a, 0x93, 0xae, 0x8e, 0x2c, 0x30, 0x24, 0x35, 0x5e, 0xb7, 0x3e, - 0xf8, 0x55, 0x87, 0xd6, 0xd6, 0x2b, 0xdf, 0x1e, 0x98, 0xf9, 0x82, 0x97, 0xb5, 0x6c, 0x0e, 0x6c, - 0xbd, 0xf0, 0x95, 0xd6, 0xb7, 0xc6, 0xb6, 0xeb, 0x5b, 0x73, 0xbb, 0xf5, 0xad, 0xb5, 0x69, 0x7d, - 0x33, 0x4a, 0x1c, 0xf4, 0x00, 0xfc, 0x34, 0x5f, 0x0a, 0xda, 0x62, 0x1c, 0x17, 0x90, 0xc1, 0x6f, - 0x1a, 0x4f, 0x9c, 0xd8, 0xb3, 0xef, 0x43, 0x2b, 0x4e, 0xe8, 0xe5, 0xd4, 0x53, 0x44, 0xaa, 0xdb, - 0xca, 0xf3, 0x7a, 0xe9, 0x79, 0x04, 0x0d, 0x8f, 0xc7, 0x28, 0xcb, 0x46, 0x9c, 0x6f, 0x09, 0xae, - 0xb1, 0x5d, 0x70, 0xcd, 0x52, 0x70, 0x47, 0x6f, 0xbf, 0xbc, 0xee, 0x69, 0x57, 0xd7, 0x3d, 0xed, - 0xaf, 0xeb, 0x9e, 0xf6, 0xf3, 0x4d, 0xaf, 0x76, 0x75, 0xd3, 0xab, 0xfd, 0x71, 0xd3, 0xab, 0x7d, - 0xd3, 0x14, 0xff, 0x4e, 0xce, 0x5a, 0xe2, 0xcf, 0xc8, 0xe3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, - 0xb2, 0xbe, 0xb9, 0x2e, 0xc0, 0x0c, 0x00, 0x00, + // 1131 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x57, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xf7, 0xf8, 0xdf, 0x7a, 0xdf, 0x86, 0xc4, 0x4c, 0xab, 0xd6, 0xac, 0x8a, 0x6b, 0x99, 0x0a, + 0x59, 0x08, 0x9c, 0xca, 0x15, 0x52, 0x05, 0x28, 0x22, 0x49, 0x51, 0x6d, 0x92, 0x43, 0x35, 0xa1, + 0x20, 0xb8, 0x4d, 0x76, 0xa7, 0xc9, 0x2a, 0xf6, 0xee, 0xb2, 0x33, 0x49, 0xe5, 0x0b, 0x12, 0x27, + 0xae, 0x9c, 0x11, 0xe2, 0x43, 0x70, 0xe5, 0x0b, 0xf4, 0xd8, 0x23, 0x37, 0x50, 0x72, 0xe7, 0xc2, + 0x17, 0x40, 0xf3, 0x67, 0xd7, 0xeb, 0xf5, 0x26, 0x0a, 0x52, 0x84, 0xc4, 0x21, 0xd2, 0xcc, 0xef, + 0xfd, 0xde, 0xf8, 0xbd, 0xf7, 0x7b, 0xf3, 0x32, 0x0b, 0x0f, 0xe3, 0x93, 0xa3, 0x4d, 0xea, 0x4d, + 0xe5, 0x9f, 0x77, 0x4c, 0xc3, 0x23, 0xc6, 0xe5, 0x32, 0x3e, 0xdc, 0x8c, 0x93, 0x48, 0x44, 0x3c, + 0x87, 0x0f, 0x15, 0x82, 0x6b, 0xd4, 0x9b, 0xf6, 0x0f, 0xc0, 0x26, 0xf4, 0xe5, 0xae, 0x32, 0xe0, + 0x0e, 0x58, 0x31, 0x9d, 0x4f, 0x23, 0xea, 0x77, 0x50, 0x0f, 0x0d, 0xd6, 0x48, 0xba, 0xc5, 0xf7, + 0xc0, 0xe6, 0xc1, 0x51, 0x48, 0xc5, 0x69, 0xc2, 0x3a, 0x55, 0x65, 0x5b, 0x00, 0x78, 0x1d, 0xaa, + 0x81, 0xdf, 0xa9, 0xf5, 0xd0, 0xc0, 0x26, 0xd5, 0xc0, 0x37, 0x87, 0x12, 0xe6, 0x45, 0x89, 0x7f, + 0x63, 0x87, 0xfe, 0x7d, 0x0b, 0xec, 0xed, 0xdd, 0x7d, 0x13, 0x6a, 0x0f, 0x1c, 0x91, 0x30, 0x36, + 0x66, 0xd4, 0x9f, 0xf8, 0xbc, 0x83, 0x7a, 0xb5, 0x81, 0x4d, 0xf2, 0x10, 0xee, 0x02, 0x50, 0x6f, + 0x9a, 0x12, 0xaa, 0x8a, 0x90, 0x43, 0xf0, 0xbb, 0xb0, 0xce, 0x43, 0x1a, 0xf3, 0xe3, 0x48, 0xec, + 0x50, 0xce, 0x26, 0xe9, 0x6f, 0x15, 0x50, 0xfc, 0x10, 0x2c, 0xea, 0x4d, 0x9f, 0x50, 0x41, 0x3b, + 0xf5, 0x1e, 0x1a, 0x38, 0xa3, 0x3b, 0x43, 0xea, 0x4d, 0x87, 0x59, 0x28, 0x72, 0x25, 0xad, 0x24, + 0xa5, 0xc9, 0xd8, 0x4c, 0xa5, 0x95, 0x57, 0x43, 0x65, 0x96, 0x87, 0xf0, 0x10, 0xb0, 0x77, 0x9a, + 0x24, 0x2c, 0x14, 0x84, 0x51, 0x7f, 0x8f, 0xcd, 0xc7, 0x94, 0x1f, 0x77, 0x9a, 0x3d, 0x34, 0xa8, + 0x93, 0x12, 0x8b, 0xac, 0x94, 0x08, 0x66, 0x8c, 0x0b, 0x3a, 0x8b, 0x3b, 0x56, 0x0f, 0x0d, 0x6a, + 0x64, 0x01, 0x60, 0x17, 0x5a, 0x81, 0xcf, 0x42, 0x11, 0x88, 0x79, 0xa7, 0xa5, 0x72, 0xc8, 0xf6, + 0xee, 0x4f, 0x35, 0xd8, 0x90, 0xa1, 0x46, 0xa1, 0x60, 0xa1, 0xf8, 0x92, 0x4e, 0x4f, 0x19, 0x1e, + 0x81, 0x75, 0xca, 0x59, 0xb2, 0xed, 0x6b, 0x45, 0x56, 0x33, 0x7a, 0xae, 0xad, 0xe3, 0x0a, 0x49, + 0x89, 0xf8, 0x63, 0x00, 0xb9, 0x24, 0x6c, 0x16, 0x9d, 0x69, 0xb1, 0x9c, 0xd1, 0x5b, 0x25, 0x6e, + 0x9a, 0x30, 0xae, 0x90, 0x1c, 0x1d, 0x7f, 0x0d, 0xb7, 0xe5, 0xee, 0x19, 0x4b, 0x66, 0x01, 0xe7, + 0x41, 0x14, 0x6a, 0x07, 0x55, 0x70, 0x67, 0xf4, 0x4e, 0xc9, 0x31, 0x45, 0xea, 0xb8, 0x42, 0x4a, + 0x8f, 0x48, 0xe3, 0x9a, 0x84, 0x67, 0x81, 0x60, 0x46, 0xa0, 0xb2, 0xb8, 0x34, 0x21, 0x8d, 0x4b, + 0xef, 0xf0, 0x87, 0xd0, 0x92, 0xbb, 0xcf, 0xa3, 0x20, 0x54, 0x2a, 0x39, 0xa3, 0xbb, 0x25, 0xae, + 0xd2, 0x3c, 0xae, 0x90, 0x8c, 0x8a, 0xb7, 0xc0, 0x91, 0xeb, 0xdd, 0x28, 0x7c, 0x11, 0x24, 0x33, + 0x25, 0x9b, 0x33, 0x72, 0x4b, 0x3c, 0x0d, 0x63, 0x5c, 0x21, 0x79, 0x87, 0x1d, 0x0b, 0x1a, 0x67, + 0x52, 0x08, 0xf7, 0x07, 0x04, 0x96, 0xe9, 0x1e, 0xfc, 0x09, 0x38, 0xd4, 0x9b, 0x1e, 0x98, 0xde, + 0x33, 0xc2, 0xb8, 0xab, 0xad, 0x96, 0x32, 0x48, 0x9e, 0x8e, 0xb7, 0x54, 0xb3, 0x1b, 0x95, 0x55, + 0xb3, 0x3b, 0xa3, 0xee, 0xaa, 0x73, 0xbe, 0x0d, 0x48, 0xce, 0xc3, 0xdd, 0x01, 0x27, 0x77, 0x36, + 0x7e, 0x04, 0x2d, 0x79, 0xba, 0xa0, 0x82, 0x99, 0x48, 0xee, 0x96, 0x44, 0x22, 0xcd, 0x24, 0x23, + 0xba, 0xdf, 0x57, 0xa1, 0x95, 0xc2, 0xf8, 0x01, 0xbc, 0x91, 0x2c, 0x1a, 0x98, 0xe9, 0x1b, 0x5a, + 0x27, 0xcb, 0x20, 0x7e, 0xac, 0xd5, 0x53, 0x2e, 0xdc, 0x84, 0xdd, 0x29, 0x29, 0xa4, 0xfe, 0xa9, + 0x1c, 0x17, 0x6f, 0x81, 0x15, 0x28, 0x11, 0x79, 0xa7, 0xa6, 0xdc, 0x1e, 0x5c, 0x12, 0xe0, 0x50, + 0x6b, 0xcd, 0x3f, 0x0b, 0x45, 0x32, 0x27, 0xa9, 0x93, 0xfb, 0x1c, 0xd6, 0xf2, 0x06, 0xdc, 0x86, + 0xda, 0x09, 0x9b, 0xab, 0x64, 0x6d, 0x22, 0x97, 0x78, 0xd3, 0xa8, 0x74, 0x45, 0xb3, 0xeb, 0x13, + 0x88, 0xe6, 0x7d, 0x54, 0x7d, 0x8c, 0xdc, 0x3f, 0x10, 0xd8, 0x59, 0xc0, 0x4b, 0x17, 0x13, 0x2d, + 0x5f, 0x4c, 0x59, 0x20, 0x16, 0x7a, 0xc9, 0x3c, 0x16, 0x41, 0x14, 0xee, 0xb1, 0xb9, 0x19, 0x80, + 0xcb, 0x20, 0x7e, 0x1f, 0xde, 0x34, 0x00, 0xf3, 0xcd, 0x40, 0xd0, 0x09, 0xaf, 0x91, 0x55, 0x03, + 0xfe, 0x14, 0x9c, 0x38, 0xbb, 0x20, 0x5c, 0xdd, 0x86, 0xf5, 0x95, 0x36, 0x58, 0xbe, 0x5e, 0x9c, + 0xe4, 0x5d, 0xe4, 0xe8, 0x9a, 0x70, 0xd3, 0xa7, 0xcc, 0x57, 0x97, 0xa2, 0x45, 0xf2, 0x90, 0xfb, + 0x1b, 0x02, 0xcb, 0xcc, 0x87, 0xff, 0x5f, 0x7e, 0xee, 0x53, 0x70, 0x72, 0x17, 0xf3, 0xca, 0x04, + 0xee, 0x81, 0x6d, 0x86, 0xdf, 0xc4, 0x57, 0xc1, 0xdb, 0x64, 0x01, 0xb8, 0x7f, 0x21, 0x80, 0x45, + 0x0b, 0xe0, 0x01, 0x6c, 0x50, 0xcf, 0x63, 0xb1, 0x78, 0x76, 0x7a, 0x38, 0x0d, 0xbc, 0x3d, 0xd3, + 0x4a, 0x6b, 0xa4, 0x08, 0xe3, 0xf7, 0xa0, 0x6d, 0x12, 0x5b, 0x50, 0x75, 0x69, 0x56, 0xf0, 0xff, + 0x5c, 0x7d, 0x17, 0x5a, 0x3a, 0x9f, 0x89, 0x96, 0xde, 0x26, 0xd9, 0xde, 0x7d, 0x85, 0xa0, 0x95, + 0x4e, 0xc3, 0x1b, 0x10, 0x3e, 0x2b, 0xd8, 0x41, 0xf6, 0x02, 0xa8, 0xe5, 0x0b, 0x96, 0xc1, 0xb8, + 0x0f, 0x6b, 0x8b, 0x91, 0x3d, 0xf1, 0x55, 0x5e, 0x36, 0x59, 0xc2, 0xca, 0x0b, 0xd5, 0xb8, 0xa4, + 0x50, 0xee, 0xb7, 0x5a, 0x3a, 0xf3, 0xcf, 0xe9, 0xaa, 0x5c, 0x9e, 0xc2, 0x86, 0x19, 0x58, 0x84, + 0xc5, 0x53, 0xea, 0x65, 0xd3, 0xe6, 0xed, 0x42, 0x59, 0xc9, 0x12, 0x8b, 0x14, 0xbd, 0xdc, 0xef, + 0x60, 0x7d, 0x99, 0x72, 0x03, 0x25, 0x5c, 0x74, 0x52, 0x96, 0x9b, 0xa9, 0xe1, 0x0a, 0xee, 0x0a, + 0xb8, 0x5d, 0xf6, 0x6f, 0xf5, 0xca, 0x28, 0x0a, 0xfd, 0x54, 0xfd, 0xd7, 0xfd, 0xd4, 0xdf, 0x86, + 0x8d, 0x82, 0x1d, 0xdb, 0xd0, 0xd8, 0xf6, 0x67, 0x41, 0xd8, 0xae, 0x60, 0x80, 0xe6, 0x57, 0x49, + 0x20, 0x58, 0xd2, 0x46, 0x72, 0x2d, 0x43, 0x65, 0x49, 0xbb, 0x8a, 0x1d, 0xb0, 0xb4, 0x34, 0x7e, + 0xbb, 0xd6, 0xff, 0xb9, 0x0a, 0xcd, 0x6b, 0x3f, 0xf9, 0xee, 0x81, 0x9d, 0x3d, 0xf0, 0xd2, 0x2b, + 0x9b, 0x01, 0xd7, 0x7e, 0xf0, 0x15, 0x9e, 0x6f, 0xf5, 0xeb, 0x3e, 0xdf, 0x1a, 0xd7, 0x7b, 0xbe, + 0x35, 0xaf, 0x7a, 0xbe, 0x59, 0x05, 0x0d, 0xba, 0x00, 0x01, 0xcf, 0x1e, 0x05, 0x2d, 0x35, 0x8e, + 0x73, 0x48, 0xff, 0x17, 0x24, 0x0b, 0xa7, 0xde, 0xd9, 0x77, 0xa0, 0x19, 0x27, 0xec, 0x6c, 0xe2, + 0x1b, 0x21, 0xcd, 0x6e, 0xe9, 0xf8, 0x6a, 0xe1, 0x78, 0x0c, 0x75, 0x5f, 0xe6, 0xa8, 0xdb, 0x46, + 0xad, 0x2f, 0x49, 0xae, 0x7e, 0xbd, 0xe4, 0x1a, 0x85, 0xe4, 0xfa, 0xbf, 0x22, 0x68, 0x8e, 0x95, + 0xb2, 0xf2, 0x43, 0xe0, 0x45, 0x90, 0x70, 0x91, 0x45, 0x98, 0x6e, 0x8d, 0x6e, 0xfb, 0x81, 0xb2, + 0x2d, 0x74, 0xd3, 0x80, 0xd4, 0xe3, 0x65, 0x94, 0x9c, 0xf0, 0x98, 0x7a, 0x0b, 0xd1, 0xf2, 0x10, + 0xfe, 0x00, 0x2c, 0x3f, 0xf2, 0xbe, 0x98, 0xc7, 0xcc, 0x4c, 0xbd, 0x5b, 0xaa, 0x4b, 0xf5, 0xef, + 0x0e, 0x9f, 0x68, 0x13, 0x49, 0x39, 0xfd, 0xfb, 0x60, 0x19, 0x0c, 0x5b, 0x50, 0xdb, 0xde, 0xdd, + 0x6f, 0x57, 0x64, 0xd3, 0x49, 0x2c, 0x61, 0xac, 0x8d, 0x76, 0xee, 0xbf, 0x3a, 0xef, 0xa2, 0xd7, + 0xe7, 0x5d, 0xf4, 0xe7, 0x79, 0x17, 0xfd, 0x78, 0xd1, 0xad, 0xbc, 0xbe, 0xe8, 0x56, 0x7e, 0xbf, + 0xe8, 0x56, 0xbe, 0x69, 0xa8, 0x4f, 0xaa, 0xc3, 0xa6, 0xfa, 0x82, 0x7a, 0xf4, 0x4f, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x14, 0x6d, 0xee, 0xf8, 0x75, 0x0d, 0x00, 0x00, } func (m *RawChange) Marshal() (dAtA []byte, err error) { @@ -2374,6 +2474,55 @@ func (m *Record) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Header) 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 *Header) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Header) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.DocType != 0 { + i = encodeVarintAclchanges(dAtA, i, uint64(m.DocType)) + i-- + dAtA[i] = 0x20 + } + if len(m.WorkspaceId) > 0 { + i -= len(m.WorkspaceId) + copy(dAtA[i:], m.WorkspaceId) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.WorkspaceId))) + i-- + dAtA[i] = 0x1a + } + if len(m.AclListId) > 0 { + i -= len(m.AclListId) + copy(dAtA[i:], m.AclListId) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.AclListId))) + i-- + dAtA[i] = 0x12 + } + if len(m.FirstId) > 0 { + i -= len(m.FirstId) + copy(dAtA[i:], m.FirstId) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.FirstId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintAclchanges(dAtA []byte, offset int, v uint64) int { offset -= sovAclchanges(v) base := offset @@ -2877,6 +3026,30 @@ func (m *Record) Size() (n int) { return n } +func (m *Header) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FirstId) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.AclListId) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.WorkspaceId) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + if m.DocType != 0 { + n += 1 + sovAclchanges(uint64(m.DocType)) + } + return n +} + func sovAclchanges(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -5930,6 +6103,171 @@ func (m *Record) Unmarshal(dAtA []byte) error { } return nil } +func (m *Header) 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 ErrIntOverflowAclchanges + } + 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: Header: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Header: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FirstId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FirstId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AclListId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AclListId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WorkspaceId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WorkspaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DocType", wireType) + } + m.DocType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DocType |= HeaderDocType(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipAclchanges(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclchanges + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipAclchanges(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto index 5609ca2f..76177a7c 100644 --- a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto +++ b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto @@ -134,3 +134,15 @@ message Record { uint64 currentReadKeyHash = 4; int64 timestamp = 5; } + +message Header { + string firstId = 1; + string aclListId = 2; + string workspaceId = 3; + DocType docType = 4; + + enum DocType { + ACL = 0; + DocTree = 1; + } +} diff --git a/pkg/acl/acltree/aclstate.go b/pkg/acl/acltree/aclstate.go deleted file mode 100644 index a7443f69..00000000 --- a/pkg/acl/acltree/aclstate.go +++ /dev/null @@ -1,411 +0,0 @@ -package acltree - -import ( - "bytes" - "errors" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" - "hash/fnv" -) - -var ErrNoSuchUser = errors.New("no such user") -var ErrFailedToDecrypt = errors.New("failed to decrypt key") -var ErrUserRemoved = errors.New("user was removed from the document") -var ErrDocumentForbidden = errors.New("your user was forbidden access to the document") -var ErrUserAlreadyExists = errors.New("user already exists") - -type ACLState struct { - currentReadKeyHash uint64 - userReadKeys map[uint64]*symmetric.Key - userStates map[string]*aclpb.ACLChangeUserState - userInvites map[string]*aclpb.ACLChangeUserInvite - signingPubKeyDecoder signingkey.PubKeyDecoder - encryptionKey encryptionkey.PrivKey - identity string -} - -func newACLState( - identity string, - encryptionKey encryptionkey.PrivKey, - signingPubKeyDecoder signingkey.PubKeyDecoder) *ACLState { - return &ACLState{ - identity: identity, - encryptionKey: encryptionKey, - userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclpb.ACLChangeUserState), - userInvites: make(map[string]*aclpb.ACLChangeUserInvite), - signingPubKeyDecoder: signingPubKeyDecoder, - } -} - -func newACLStateFromSnapshotChange( - snapshotChange *aclpb.ACLChange, - identity string, - encryptionKey encryptionkey.PrivKey, - signingPubKeyDecoder signingkey.PubKeyDecoder) (*ACLState, error) { - st := &ACLState{ - identity: identity, - encryptionKey: encryptionKey, - userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclpb.ACLChangeUserState), - userInvites: make(map[string]*aclpb.ACLChangeUserInvite), - signingPubKeyDecoder: signingPubKeyDecoder, - } - err := st.recreateFromSnapshotChange(snapshotChange) - if err != nil { - return nil, err - } - return st, nil -} - -func (st *ACLState) recreateFromSnapshotChange(snapshotChange *aclpb.ACLChange) error { - snapshot := snapshotChange.GetAclData().GetAclSnapshot() - if snapshot == nil { - return fmt.Errorf("could not create state from snapshot, because it is nil") - } - state := snapshot.AclState - for _, userState := range state.UserStates { - st.userStates[userState.Identity] = userState - } - - userState, exists := st.userStates[st.identity] - if !exists { - return ErrNoSuchUser - } - for _, key := range userState.EncryptedReadKeys { - key, hash, err := st.decryptReadKeyAndHash(key) - if err != nil { - return ErrFailedToDecrypt - } - - st.userReadKeys[hash] = key - } - st.currentReadKeyHash = snapshotChange.CurrentReadKeyHash - if snapshot.GetAclState().GetInvites() != nil { - st.userInvites = snapshot.GetAclState().GetInvites() - } - return nil -} - -func (st *ACLState) makeSnapshot() *aclpb.ACLChangeACLSnapshot { - var userStates []*aclpb.ACLChangeUserState - for _, st := range st.userStates { - userStates = append(userStates, st) - } - - return &aclpb.ACLChangeACLSnapshot{AclState: &aclpb.ACLChangeACLState{ - ReadKeyHashes: nil, - UserStates: userStates, // TODO: make states and invites in same format - Invites: st.userInvites, - }} -} - -func (st *ACLState) applyChange(change *aclpb.ACLChange) (err error) { - defer func() { - if err != nil { - return - } - st.currentReadKeyHash = change.CurrentReadKeyHash - }() - - // we can't check this for the user which is joining, because it will not be in our list - // the same is for the first change to be added - skipIdentityCheck := st.isUserJoin(change) || (st.currentReadKeyHash == 0 && st.isUserAdd(change)) - if !skipIdentityCheck { - // we check signature when we add this to the Tree, so no need to do it here - if _, exists := st.userStates[change.Identity]; !exists { - err = ErrNoSuchUser - return - } - - if !st.hasPermission(change.Identity, aclpb.ACLChange_Admin) { - err = fmt.Errorf("user %s must have admin permissions", change.Identity) - return - } - } - - for _, ch := range change.GetAclData().GetAclContent() { - if err = st.applyChangeContent(ch); err != nil { - //log.Infof("error while applying changes: %v; ignore", err) - return err - } - } - - return nil -} - -// TODO: remove changeId, because it is not needed -func (st *ACLState) applyChangeContent(ch *aclpb.ACLChangeACLContentValue) error { - switch { - case ch.GetUserPermissionChange() != nil: - return st.applyUserPermissionChange(ch.GetUserPermissionChange()) - case ch.GetUserAdd() != nil: - return st.applyUserAdd(ch.GetUserAdd()) - case ch.GetUserRemove() != nil: - return st.applyUserRemove(ch.GetUserRemove()) - case ch.GetUserInvite() != nil: - return st.applyUserInvite(ch.GetUserInvite()) - case ch.GetUserJoin() != nil: - return st.applyUserJoin(ch.GetUserJoin()) - case ch.GetUserConfirm() != nil: - return st.applyUserConfirm(ch.GetUserConfirm()) - default: - return fmt.Errorf("unexpected change type: %v", ch) - } -} - -func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLChangeUserPermissionChange) error { - if _, exists := st.userStates[ch.Identity]; !exists { - return ErrNoSuchUser - } - - st.userStates[ch.Identity].Permissions = ch.Permissions - return nil -} - -func (st *ACLState) applyUserInvite(ch *aclpb.ACLChangeUserInvite) error { - st.userInvites[ch.InviteId] = ch - return nil -} - -func (st *ACLState) applyUserJoin(ch *aclpb.ACLChangeUserJoin) error { - invite, exists := st.userInvites[ch.UserInviteId] - if !exists { - return fmt.Errorf("no such invite with id %s", ch.UserInviteId) - } - - if _, exists = st.userStates[ch.Identity]; exists { - return ErrUserAlreadyExists - } - - // validating signature - signature := ch.GetAcceptSignature() - verificationKey, err := st.signingPubKeyDecoder.DecodeFromBytes(invite.AcceptPublicKey) - if err != nil { - return fmt.Errorf("public key verifying invite accepts is given in incorrect format: %v", err) - } - - rawSignedId, err := st.signingPubKeyDecoder.DecodeFromStringIntoBytes(ch.Identity) - if err != nil { - return fmt.Errorf("failed to decode signing identity as bytes") - } - - res, err := verificationKey.Verify(rawSignedId, signature) - if err != nil { - return fmt.Errorf("verification returned error: %w", err) - } - if !res { - return fmt.Errorf("signature is invalid") - } - - // if ourselves -> we need to decrypt the read keys - if st.identity == ch.Identity { - for _, key := range ch.EncryptedReadKeys { - key, hash, err := st.decryptReadKeyAndHash(key) - if err != nil { - return ErrFailedToDecrypt - } - - st.userReadKeys[hash] = key - } - } - - // adding user to the list - userState := &aclpb.ACLChangeUserState{ - Identity: ch.Identity, - EncryptionKey: ch.EncryptionKey, - EncryptedReadKeys: ch.EncryptedReadKeys, - Permissions: invite.Permissions, - IsConfirmed: true, - } - st.userStates[ch.Identity] = userState - return nil -} - -func (st *ACLState) applyUserAdd(ch *aclpb.ACLChangeUserAdd) error { - if _, exists := st.userStates[ch.Identity]; exists { - return ErrUserAlreadyExists - } - - st.userStates[ch.Identity] = &aclpb.ACLChangeUserState{ - Identity: ch.Identity, - EncryptionKey: ch.EncryptionKey, - Permissions: ch.Permissions, - EncryptedReadKeys: ch.EncryptedReadKeys, - } - - if ch.Identity == st.identity { - for _, key := range ch.EncryptedReadKeys { - key, hash, err := st.decryptReadKeyAndHash(key) - if err != nil { - return ErrFailedToDecrypt - } - - st.userReadKeys[hash] = key - } - } - - return nil -} - -func (st *ACLState) applyUserRemove(ch *aclpb.ACLChangeUserRemove) error { - if ch.Identity == st.identity { - return ErrDocumentForbidden - } - - if _, exists := st.userStates[ch.Identity]; !exists { - return ErrNoSuchUser - } - - delete(st.userStates, ch.Identity) - - for _, replace := range ch.ReadKeyReplaces { - userState, exists := st.userStates[replace.Identity] - if !exists { - continue - } - - userState.EncryptedReadKeys = append(userState.EncryptedReadKeys, replace.EncryptedReadKey) - // if this is our identity then we have to decrypt the key - if replace.Identity == st.identity { - key, hash, err := st.decryptReadKeyAndHash(replace.EncryptedReadKey) - if err != nil { - return ErrFailedToDecrypt - } - - st.currentReadKeyHash = hash - st.userReadKeys[st.currentReadKeyHash] = key - } - } - return nil -} - -func (st *ACLState) applyUserConfirm(ch *aclpb.ACLChangeUserConfirm) error { - if _, exists := st.userStates[ch.Identity]; !exists { - return ErrNoSuchUser - } - - userState := st.userStates[ch.Identity] - userState.IsConfirmed = true - return nil -} - -func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, error) { - decrypted, err := st.encryptionKey.Decrypt(msg) - if err != nil { - return nil, 0, ErrFailedToDecrypt - } - - key, err := symmetric.FromBytes(decrypted) - if err != nil { - return nil, 0, ErrFailedToDecrypt - } - - hasher := fnv.New64() - hasher.Write(decrypted) - return key, hasher.Sum64(), nil -} - -func (st *ACLState) hasPermission(identity string, permission aclpb.ACLChangeUserPermissions) bool { - state, exists := st.userStates[identity] - if !exists { - return false - } - - return state.Permissions == permission -} - -func (st *ACLState) isUserJoin(ch *aclpb.ACLChange) bool { - // if we have a UserJoin, then it should always be the first one applied - return ch.AclData.GetAclContent() != nil && ch.AclData.GetAclContent()[0].GetUserJoin() != nil -} - -func (st *ACLState) isUserAdd(ch *aclpb.ACLChange) bool { - // if we have a UserAdd, then it should always be the first one applied - userAdd := ch.AclData.GetAclContent()[0].GetUserAdd() - return ch.AclData.GetAclContent() != nil && userAdd != nil && userAdd.GetIdentity() == ch.Identity -} - -func (st *ACLState) getPermissionDecreasedUsers(ch *aclpb.ACLChange) (identities []*aclpb.ACLChangeUserPermissionChange) { - // this should be called after general checks are completed - if ch.GetAclData().GetAclContent() == nil { - return nil - } - - contents := ch.GetAclData().GetAclContent() - for _, c := range contents { - if c.GetUserPermissionChange() != nil { - content := c.GetUserPermissionChange() - - currentState := st.userStates[content.Identity] - // the comparison works in different direction :-) - if content.Permissions > currentState.Permissions { - identities = append(identities, &aclpb.ACLChangeUserPermissionChange{ - Identity: content.Identity, - Permissions: content.Permissions, - }) - } - } - if c.GetUserRemove() != nil { - content := c.GetUserRemove() - identities = append(identities, &aclpb.ACLChangeUserPermissionChange{ - Identity: content.Identity, - Permissions: aclpb.ACLChange_Removed, - }) - } - } - - return identities -} - -func (st *ACLState) equal(other *ACLState) bool { - if st == nil && other == nil { - return true - } - - if st == nil || other == nil { - return false - } - - if st.currentReadKeyHash != other.currentReadKeyHash { - return false - } - - if st.identity != other.identity { - return false - } - - if len(st.userStates) != len(other.userStates) { - return false - } - - for _, st := range st.userStates { - otherSt, exists := other.userStates[st.Identity] - if !exists { - return false - } - - if st.Permissions != otherSt.Permissions { - return false - } - - if bytes.Compare(st.EncryptionKey, otherSt.EncryptionKey) != 0 { - return false - } - } - - if len(st.userInvites) != len(other.userInvites) { - return false - } - - // TODO: add detailed user invites comparison + compare other stuff - return true -} - -func (st *ACLState) GetUserStates() map[string]*aclpb.ACLChangeUserState { - // TODO: we should provide better API that would not allow to change this map from the outside - return st.userStates -} diff --git a/pkg/acl/acltree/aclstatebuilder.go b/pkg/acl/acltree/aclstatebuilder.go deleted file mode 100644 index d63d535c..00000000 --- a/pkg/acl/acltree/aclstatebuilder.go +++ /dev/null @@ -1,186 +0,0 @@ -package acltree - -import ( - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" -) - -type aclStateBuilder struct { - tree *Tree - identity string - key encryptionkey.PrivKey - decoder signingkey.PubKeyDecoder -} - -type decreasedPermissionsParameters struct { - users []*aclpb.ACLChangeUserPermissionChange - startChange string -} - -func newACLStateBuilder(decoder signingkey.PubKeyDecoder, accountData *account.AccountData) *aclStateBuilder { - return &aclStateBuilder{ - decoder: decoder, - identity: accountData.Identity, - key: accountData.EncKey, - } -} - -func (sb *aclStateBuilder) Init(tree *Tree) error { - sb.tree = tree - return nil -} - -func (sb *aclStateBuilder) Build() (*ACLState, error) { - state, _, err := sb.BuildBefore("") - return state, err -} - -// TODO: we can probably have only one state builder, because we can Build both at the same time -func (sb *aclStateBuilder) BuildBefore(beforeId string) (*ACLState, bool, error) { - var ( - err error - startChange = sb.tree.root - foundId bool - idSeenMap = make(map[string][]*Change) - decreasedPermissions *decreasedPermissionsParameters - ) - root := sb.tree.Root() - if !root.IsSnapshot { - return nil, false, fmt.Errorf("root should always be a snapshot") - } - - state, err := newACLStateFromSnapshotChange( - root.Content, - sb.identity, - sb.key, - sb.decoder) - if err != nil { - return nil, false, fmt.Errorf("could not build ACLState from snapshot: %w", err) - } - - idSeenMap[startChange.Content.Identity] = append(idSeenMap[startChange.Content.Identity], startChange) - - if startChange.Content.GetChangesData() != nil { - key, exists := state.userReadKeys[startChange.Content.CurrentReadKeyHash] - if !exists { - return nil, false, fmt.Errorf("no first snapshot") - } - - err = startChange.DecryptContents(key) - if err != nil { - return nil, false, fmt.Errorf("failed to decrypt contents of first snapshot") - } - } - - if beforeId == startChange.Id { - return state, true, nil - } - - for { - // TODO: we should optimize this method to just remember last state of iterator and not iterate from the start and skip if nothing was removed from the Tree - sb.tree.IterateSkip(sb.tree.root.Id, startChange.Id, func(c *Change) (isContinue bool) { - defer func() { - if err == nil { - startChange = c - } else if err != ErrDocumentForbidden { - //log.Errorf("marking change %s as invalid: %v", c.Id, err) - sb.tree.RemoveInvalidChange(c.Id) - } - }() - - // not applying root change - if c.Id == startChange.Id { - return true - } - - idSeenMap[c.Content.Identity] = append(idSeenMap[c.Content.Identity], c) - if c.Content.GetAclData() != nil { - err = state.applyChange(c.Content) - if err != nil { - return false - } - - // if we have some users who have less permissions now - users := state.getPermissionDecreasedUsers(c.Content) - if len(users) > 0 { - decreasedPermissions = &decreasedPermissionsParameters{ - users: users, - startChange: c.Id, - } - return false - } - } - - // the user can't make changes - if !state.hasPermission(c.Content.Identity, aclpb.ACLChange_Writer) && !state.hasPermission(c.Content.Identity, aclpb.ACLChange_Admin) { - err = fmt.Errorf("user %s cannot make changes", c.Content.Identity) - return false - } - - // decrypting contents on the fly - if c.Content.GetChangesData() != nil { - key, exists := state.userReadKeys[c.Content.CurrentReadKeyHash] - if !exists { - err = fmt.Errorf("failed to find key with hash: %d", c.Content.CurrentReadKeyHash) - return false - } - - err = c.DecryptContents(key) - if err != nil { - err = fmt.Errorf("failed to decrypt contents for hash: %d", c.Content.CurrentReadKeyHash) - return false - } - } - - if c.Id == beforeId { - foundId = true - return false - } - - return true - }) - - // if we have users with decreased permissions - if decreasedPermissions != nil { - var removed bool - validChanges := sb.tree.dfs(decreasedPermissions.startChange) - - for _, permChange := range decreasedPermissions.users { - seenChanges := idSeenMap[permChange.Identity] - - for _, seen := range seenChanges { - // if we find some invalid changes - if _, exists := validChanges[seen.Id]; !exists { - // if the user didn't have enough permission to make changes - if seen.IsACLChange() || permChange.Permissions > aclpb.ACLChange_Writer { - removed = true - sb.tree.RemoveInvalidChange(seen.Id) - } - } - } - } - - decreasedPermissions = nil - if removed { - // starting from the beginning but with updated Tree - return sb.BuildBefore(beforeId) - } - } else if err == nil { - // we can finish the acl state building process - break - } - - // the user is forbidden to access the document - if err == ErrDocumentForbidden { - return nil, foundId, err - } - - // otherwise we have to continue from the change which we had - err = nil - } - - return state, foundId, err -} diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go deleted file mode 100644 index 07acee6c..00000000 --- a/pkg/acl/acltree/acltree.go +++ /dev/null @@ -1,520 +0,0 @@ -package acltree - -import ( - "context" - "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" - "go.uber.org/zap" - "sync" -) - -type AddResultSummary int - -const ( - AddResultSummaryNothing AddResultSummary = iota - AddResultSummaryAppend - AddResultSummaryRebuild -) - -type AddResult struct { - OldHeads []string - Heads []string - Added []*aclpb.RawChange - // TODO: add summary for changes - Summary AddResultSummary -} - -type TreeUpdateListener interface { - Update(tree ACLTree) - Rebuild(tree ACLTree) -} - -type NoOpListener struct{} - -func (n NoOpListener) Update(tree ACLTree) {} - -func (n NoOpListener) Rebuild(tree ACLTree) {} - -type RWLocker interface { - sync.Locker - RLock() - RUnlock() -} - -var ErrNoCommonSnapshot = errors.New("trees doesn't have a common snapshot") - -type ACLTree interface { - RWLocker - ID() string - Header() *treepb.TreeHeader - ACLState() *ACLState - AddContent(ctx context.Context, f func(builder ChangeBuilder) error) (*aclpb.RawChange, error) - AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) - Heads() []string - Root() *Change - Iterate(func(change *Change) bool) - IterateFrom(string, func(change *Change) bool) - HasChange(string) bool - SnapshotPath() []string - ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) - Storage() treestorage.TreeStorage - DebugDump() (string, error) - - Close() error -} - -type aclTree struct { - treeStorage treestorage.TreeStorage - accountData *account.AccountData - updateListener TreeUpdateListener - - id string - header *treepb.TreeHeader - fullTree *Tree - aclTreeFromStart *Tree // TODO: right now we don't use it, we can probably have only local var for now. This tree is built from start of the document - aclState *ACLState - - treeBuilder *treeBuilder - aclTreeBuilder *aclTreeBuilder - aclStateBuilder *aclStateBuilder - snapshotValidator *snapshotValidator - changeBuilder *changeBuilder - - sync.RWMutex -} - -func BuildACLTree( - t treestorage.TreeStorage, - acc *account.AccountData, - listener TreeUpdateListener) (ACLTree, error) { - aclTreeBuilder := newACLTreeBuilder(t, acc.Decoder) - treeBuilder := newTreeBuilder(t, acc.Decoder) - snapshotValidator := newSnapshotValidator(acc.Decoder, acc) // TODO: this looks weird, change it - aclStateBuilder := newACLStateBuilder(acc.Decoder, acc) - changeBuilder := newChangeBuilder() - - aclTree := &aclTree{ - treeStorage: t, - accountData: acc, - fullTree: nil, - aclState: nil, - treeBuilder: treeBuilder, - aclTreeBuilder: aclTreeBuilder, - aclStateBuilder: aclStateBuilder, - snapshotValidator: snapshotValidator, - changeBuilder: changeBuilder, - updateListener: listener, - } - err := aclTree.rebuildFromStorage(false) - if err != nil { - return nil, err - } - err = aclTree.removeOrphans() - if err != nil { - return nil, err - } - err = t.SetHeads(aclTree.Heads()) - if err != nil { - return nil, err - } - aclTree.id, err = t.TreeID() - if err != nil { - return nil, err - } - aclTree.header, err = t.Header() - if err != nil { - return nil, err - } - - listener.Rebuild(aclTree) - - return aclTree, nil -} - -// TODO: this is not used for now, in future we should think about not making full tree rebuild -//func (a *aclTree) rebuildFromTree(validateSnapshot bool) (err error) { -// if validateSnapshot { -// err = a.snapshotValidator.Init(a.aclTreeFromStart) -// if err != nil { -// return err -// } -// -// valid, err := a.snapshotValidator.ValidateSnapshot(a.fullTree.root) -// if err != nil { -// return err -// } -// if !valid { -// return a.rebuildFromStorage(true) -// } -// } -// -// err = a.aclStateBuilder.Init(a.fullTree) -// if err != nil { -// return err -// } -// -// a.aclState, err = a.aclStateBuilder.Build() -// if err != nil { -// return err -// } -// -// return nil -//} - -func (a *aclTree) removeOrphans() error { - // removing attached or invalid orphans - var toRemove []string - - orphans, err := a.treeStorage.Orphans() - if err != nil { - return err - } - for _, orphan := range orphans { - if _, exists := a.fullTree.attached[orphan]; exists { - toRemove = append(toRemove, orphan) - } - if _, exists := a.fullTree.invalidChanges[orphan]; exists { - toRemove = append(toRemove, orphan) - } - } - return a.treeStorage.RemoveOrphans(toRemove...) -} - -func (a *aclTree) rebuildFromStorage(fromStart bool) error { - a.treeBuilder.Init() - a.aclTreeBuilder.Init() - - var err error - a.fullTree, err = a.treeBuilder.Build(fromStart) - if err != nil { - return err - } - - // TODO: remove this from context as this is used only to validate snapshot - a.aclTreeFromStart, err = a.aclTreeBuilder.Build() - if err != nil { - return err - } - - if !fromStart { - err = a.snapshotValidator.Init(a.aclTreeFromStart) - if err != nil { - return err - } - - valid, err := a.snapshotValidator.ValidateSnapshot(a.fullTree.root) - if err != nil { - return err - } - if !valid { - return a.rebuildFromStorage(true) - } - } - // TODO: there is a question how we can validate not only that the full tree is built correctly - // but also that the ACL prev ids are not messed up. I think we should probably compare the resulting - // acl state with the acl state which is built in aclTreeFromStart - - err = a.aclStateBuilder.Init(a.fullTree) - if err != nil { - return err - } - - a.aclState, err = a.aclStateBuilder.Build() - if err != nil { - return err - } - - return nil -} - -func (a *aclTree) ID() string { - return a.id -} - -func (a *aclTree) Header() *treepb.TreeHeader { - return a.header -} - -func (a *aclTree) ACLState() *ACLState { - return a.aclState -} - -func (a *aclTree) Storage() treestorage.TreeStorage { - return a.treeStorage -} - -func (a *aclTree) AddContent(ctx context.Context, build func(builder ChangeBuilder) error) (*aclpb.RawChange, error) { - // TODO: add snapshot creation logic - defer func() { - // TODO: should this be called in a separate goroutine to prevent accidental cycles (tree->updater->tree) - a.updateListener.Update(a) - }() - - a.changeBuilder.Init(a.aclState, a.fullTree, a.accountData) - err := build(a.changeBuilder) - if err != nil { - return nil, err - } - - ch, marshalled, err := a.changeBuilder.BuildAndApply() - if err != nil { - return nil, err - } - a.fullTree.AddFast(ch) - rawCh := &aclpb.RawChange{ - Payload: marshalled, - Signature: ch.Signature(), - Id: ch.Id, - } - - err = a.treeStorage.AddRawChange(rawCh) - if err != nil { - return nil, err - } - - err = a.treeStorage.SetHeads([]string{ch.Id}) - if err != nil { - return nil, err - } - return rawCh, nil -} - -func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (AddResult, error) { - // TODO: make proper error handling, because there are a lot of corner cases where this will break - var err error - var mode Mode - - var changes []*Change // TODO: = addChangesBuf[:0] ... - for _, ch := range rawChanges { - change, err := NewFromRawChange(ch) - // TODO: think what if we will have incorrect signatures on rawChanges, how everything will work - if err != nil { - continue - } - changes = append(changes, change) - } - - defer func() { - if err != nil { - return - } - - err = a.removeOrphans() - if err != nil { - return - } - - err = a.treeStorage.SetHeads(a.fullTree.Heads()) - if err != nil { - return - } - - switch mode { - case Append: - a.updateListener.Update(a) - case Rebuild: - a.updateListener.Rebuild(a) - default: - break - } - }() - - getAddedChanges := func() []*aclpb.RawChange { - var added []*aclpb.RawChange - for _, ch := range rawChanges { - if _, exists := a.fullTree.attached[ch.Id]; exists { - added = append(added, ch) - } - } - return added - } - - for _, ch := range changes { - err = a.treeStorage.AddChange(ch) - if err != nil { - return AddResult{}, err - } - err = a.treeStorage.AddOrphans(ch.Id) - if err != nil { - return AddResult{}, err - } - } - - prevHeads := a.fullTree.Heads() - mode = a.fullTree.Add(changes...) - switch mode { - case Nothing: - return AddResult{ - OldHeads: prevHeads, - Heads: prevHeads, - Summary: AddResultSummaryNothing, - }, nil - - case Rebuild: - err = a.rebuildFromStorage(false) - if err != nil { - return AddResult{}, err - } - - return AddResult{ - OldHeads: prevHeads, - Heads: a.fullTree.Heads(), - Added: getAddedChanges(), - Summary: AddResultSummaryRebuild, - }, nil - default: - // just rebuilding the state from start without reloading everything from tree storage - // as an optimization we could've started from current heads, but I didn't implement that - a.aclState, err = a.aclStateBuilder.Build() - if err != nil { - return AddResult{}, err - } - - return AddResult{ - OldHeads: prevHeads, - Heads: a.fullTree.Heads(), - Added: getAddedChanges(), - Summary: AddResultSummaryAppend, - }, nil - } -} - -func (a *aclTree) Iterate(f func(change *Change) bool) { - a.fullTree.Iterate(a.fullTree.RootId(), f) -} - -func (a *aclTree) IterateFrom(s string, f func(change *Change) bool) { - a.fullTree.Iterate(s, f) -} - -func (a *aclTree) HasChange(s string) bool { - _, attachedExists := a.fullTree.attached[s] - _, unattachedExists := a.fullTree.unAttached[s] - _, invalidExists := a.fullTree.invalidChanges[s] - return attachedExists || unattachedExists || invalidExists -} - -func (a *aclTree) Heads() []string { - return a.fullTree.Heads() -} - -func (a *aclTree) Root() *Change { - return a.fullTree.Root() -} - -func (a *aclTree) Close() error { - return nil -} - -func (a *aclTree) SnapshotPath() []string { - // TODO: think about caching this - - var path []string - // TODO: think that the user may have not all of the snapshots locally - currentSnapshotId := a.fullTree.RootId() - for currentSnapshotId != "" { - sn, err := a.treeBuilder.loadChange(currentSnapshotId) - if err != nil { - break - } - path = append(path, currentSnapshotId) - currentSnapshotId = sn.SnapshotId - } - return path -} - -func (a *aclTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { - // TODO: think about when the clients will have their full acl tree and thus full snapshots - // but no changes after some of the snapshots - - var ( - isNewDocument = len(theirPath) == 0 - ourPath = a.SnapshotPath() - // by default returning everything we have - commonSnapshot = ourPath[len(ourPath)-1] // TODO: root snapshot, probably it is better to have a specific method in treestorage - err error - ) - - // if this is non-empty request - if !isNewDocument { - commonSnapshot, err = a.commonSnapshotForTwoPaths(ourPath, theirPath) - if err != nil { - return nil, err - } - } - var rawChanges []*aclpb.RawChange - // using custom load function to skip verification step and save raw changes - load := func(id string) (*Change, error) { - raw, err := a.treeStorage.GetChange(context.Background(), id) - if err != nil { - return nil, err - } - - aclChange, err := a.treeBuilder.makeUnverifiedACLChange(raw) - if err != nil { - return nil, err - } - - ch := NewChange(id, aclChange) - rawChanges = append(rawChanges, raw) - return ch, nil - } - // we presume that we have everything after the common snapshot, though this may not be the case in case of clients and only ACL tree changes - log.With( - zap.Strings("heads", a.fullTree.Heads()), - zap.String("breakpoint", commonSnapshot), - zap.String("id", a.id)). - Debug("getting all changes from common snapshot") - _, err = a.treeBuilder.dfs(a.fullTree.Heads(), commonSnapshot, load) - if err != nil { - return nil, err - } - if isNewDocument { - // adding snapshot to raw changes - _, err = load(commonSnapshot) - if err != nil { - return nil, err - } - } - log.With( - zap.Int("len(changes)", len(rawChanges)), - zap.String("id", a.id)). - Debug("returning all changes after common snapshot") - - return rawChanges, nil -} - -func (a *aclTree) DebugDump() (string, error) { - return a.fullTree.Graph() -} - -func (a *aclTree) commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) { - var i int - var j int - log.With(zap.Strings("our path", ourPath), zap.Strings("their path", theirPath)). - Debug("finding common snapshot for two paths") -OuterLoop: - // find starting point from the right - for i = len(ourPath) - 1; i >= 0; i-- { - for j = len(theirPath) - 1; j >= 0; j-- { - // most likely there would be only one comparison, because mostly the snapshot path will start from the root for nodes - if ourPath[i] == theirPath[j] { - break OuterLoop - } - } - } - if i < 0 || j < 0 { - return "", ErrNoCommonSnapshot - } - // find last common element of the sequence moving from right to left - for i >= 0 && j >= 0 { - if ourPath[i] == theirPath[j] { - i-- - j-- - } - } - return ourPath[i+1], nil -} diff --git a/pkg/acl/acltree/acltree_test.go b/pkg/acl/acltree/acltree_test.go deleted file mode 100644 index 8d89bac3..00000000 --- a/pkg/acl/acltree/acltree_test.go +++ /dev/null @@ -1,262 +0,0 @@ -package acltree - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/treestoragebuilder" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "testing" - - "github.com/stretchr/testify/assert" -) - -type mockListener struct{} - -func (m *mockListener) Update(tree ACLTree) {} - -func (m *mockListener) Rebuild(tree ACLTree) {} - -func TestACLTree_UserJoinBuild(t *testing.T) { - thr, err := treestoragebuilder.NewTreeStorageBuilderWithTestName("userjoinexample.yml") - if err != nil { - t.Fatal(err) - } - keychain := thr.GetKeychain() - accountData := &account.AccountData{ - Identity: keychain.GetIdentity("A"), - SignKey: keychain.SigningKeys["A"], - EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519PubKeyDecoder(), - } - listener := &mockListener{} - tree, err := BuildACLTree(thr, accountData, listener) - if err != nil { - t.Fatalf("should Build acl ACLState without err: %v", err) - } - aclState := tree.ACLState() - aId := keychain.GeneratedIdentities["A"] - bId := keychain.GeneratedIdentities["B"] - cId := keychain.GeneratedIdentities["C"] - - assert.Equal(t, aclState.identity, aId) - assert.Equal(t, aclState.userStates[aId].Permissions, aclpb.ACLChange_Admin) - assert.Equal(t, aclState.userStates[bId].Permissions, aclpb.ACLChange_Writer) - assert.Equal(t, aclState.userStates[cId].Permissions, aclpb.ACLChange_Reader) - - var changeIds []string - tree.Iterate(func(c *Change) (isContinue bool) { - changeIds = append(changeIds, c.Id) - return true - }) - assert.Equal(t, changeIds, []string{"A.1.1", "A.1.2", "B.1.1", "B.1.2"}) -} - -func TestACLTree_UserJoinUpdate_Append(t *testing.T) { - thr, err := treestoragebuilder.NewTreeStorageBuilderWithTestName("userjoinexampleupdate.yml") - if err != nil { - t.Fatal(err) - } - keychain := thr.GetKeychain() - accountData := &account.AccountData{ - Identity: keychain.GetIdentity("A"), - SignKey: keychain.SigningKeys["A"], - EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519PubKeyDecoder(), - } - - listener := &mockListener{} - tree, err := BuildACLTree(thr, accountData, listener) - if err != nil { - t.Fatalf("should Build acl ACLState without err: %v", err) - } - rawChanges := thr.GetUpdates("append") - res, err := tree.AddRawChanges(context.Background(), rawChanges...) - assert.Equal(t, res.Summary, AddResultSummaryAppend) - - aclState := tree.ACLState() - aId := keychain.GeneratedIdentities["A"] - bId := keychain.GeneratedIdentities["B"] - cId := keychain.GeneratedIdentities["C"] - dId := keychain.GeneratedIdentities["D"] - - assert.Equal(t, aclState.identity, aId) - assert.Equal(t, aclState.userStates[aId].Permissions, aclpb.ACLChange_Admin) - assert.Equal(t, aclState.userStates[bId].Permissions, aclpb.ACLChange_Writer) - assert.Equal(t, aclState.userStates[cId].Permissions, aclpb.ACLChange_Reader) - assert.Equal(t, aclState.userStates[dId].Permissions, aclpb.ACLChange_Writer) - - var changeIds []string - tree.Iterate(func(c *Change) (isContinue bool) { - changeIds = append(changeIds, c.Id) - return true - }) - assert.Equal(t, changeIds, []string{"A.1.1", "A.1.2", "B.1.1", "B.1.2", "B.1.3", "A.1.4"}) -} - -func TestACLTree_UserJoinUpdate_Rebuild(t *testing.T) { - thr, err := treestoragebuilder.NewTreeStorageBuilderWithTestName("userjoinexampleupdate.yml") - if err != nil { - t.Fatal(err) - } - keychain := thr.GetKeychain() - accountData := &account.AccountData{ - Identity: keychain.GetIdentity("A"), - SignKey: keychain.SigningKeys["A"], - EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519PubKeyDecoder(), - } - listener := &mockListener{} - tree, err := BuildACLTree(thr, accountData, listener) - if err != nil { - t.Fatalf("should Build acl ACLState without err: %v", err) - } - rawChanges := thr.GetUpdates("rebuild") - res, err := tree.AddRawChanges(context.Background(), rawChanges...) - assert.Equal(t, res.Summary, AddResultSummaryRebuild) - - aclState := tree.ACLState() - aId := keychain.GeneratedIdentities["A"] - bId := keychain.GeneratedIdentities["B"] - cId := keychain.GeneratedIdentities["C"] - dId := keychain.GeneratedIdentities["D"] - - assert.Equal(t, aclState.identity, aId) - assert.Equal(t, aclState.userStates[aId].Permissions, aclpb.ACLChange_Admin) - assert.Equal(t, aclState.userStates[bId].Permissions, aclpb.ACLChange_Writer) - assert.Equal(t, aclState.userStates[cId].Permissions, aclpb.ACLChange_Reader) - assert.Equal(t, aclState.userStates[dId].Permissions, aclpb.ACLChange_Writer) - - var changeIds []string - - tree.Iterate(func(c *Change) (isContinue bool) { - changeIds = append(changeIds, c.Id) - return true - }) - assert.Equal(t, changeIds, []string{"A.1.1", "A.1.2", "B.1.1", "B.1.2", "A.1.4"}) -} - -func TestACLTree_UserRemoveBuild(t *testing.T) { - thr, err := treestoragebuilder.NewTreeStorageBuilderWithTestName("userremoveexample.yml") - if err != nil { - t.Fatal(err) - } - keychain := thr.GetKeychain() - accountData := &account.AccountData{ - Identity: keychain.GetIdentity("A"), - SignKey: keychain.SigningKeys["A"], - EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519PubKeyDecoder(), - } - listener := &mockListener{} - tree, err := BuildACLTree(thr, accountData, listener) - if err != nil { - t.Fatalf("should Build acl ACLState without err: %v", err) - } - aclState := tree.ACLState() - aId := keychain.GeneratedIdentities["A"] - - assert.Equal(t, aclState.identity, aId) - assert.Equal(t, aclState.userStates[aId].Permissions, aclpb.ACLChange_Admin) - - var changeIds []string - tree.Iterate(func(c *Change) (isContinue bool) { - changeIds = append(changeIds, c.Id) - return true - }) - assert.Equal(t, changeIds, []string{"A.1.1", "A.1.2", "B.1.1", "A.1.3", "A.1.4"}) -} - -func TestACLTree_UserRemoveBeforeBuild(t *testing.T) { - thr, err := treestoragebuilder.NewTreeStorageBuilderWithTestName("userremovebeforeexample.yml") - if err != nil { - t.Fatal(err) - } - keychain := thr.GetKeychain() - accountData := &account.AccountData{ - Identity: keychain.GetIdentity("A"), - SignKey: keychain.SigningKeys["A"], - EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519PubKeyDecoder(), - } - listener := &mockListener{} - tree, err := BuildACLTree(thr, accountData, listener) - if err != nil { - t.Fatalf("should Build acl ACLState without err: %v", err) - } - aclState := tree.ACLState() - for _, s := range []string{"A", "C", "E"} { - assert.Equal(t, aclState.userStates[keychain.GetIdentity(s)].Permissions, aclpb.ACLChange_Admin) - } - assert.Equal(t, aclState.identity, keychain.GetIdentity("A")) - assert.Nil(t, aclState.userStates[keychain.GetIdentity("B")]) - - var changeIds []string - tree.Iterate(func(c *Change) (isContinue bool) { - changeIds = append(changeIds, c.Id) - return true - }) - assert.Equal(t, changeIds, []string{"A.1.1", "B.1.1", "A.1.2", "A.1.3"}) -} - -func TestACLTree_InvalidSnapshotBuild(t *testing.T) { - thr, err := treestoragebuilder.NewTreeStorageBuilderWithTestName("invalidsnapshotexample.yml") - if err != nil { - t.Fatal(err) - } - keychain := thr.GetKeychain() - accountData := &account.AccountData{ - Identity: keychain.GetIdentity("A"), - SignKey: keychain.SigningKeys["A"], - EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519PubKeyDecoder(), - } - listener := &mockListener{} - tree, err := BuildACLTree(thr, accountData, listener) - if err != nil { - t.Fatalf("should Build acl ACLState without err: %v", err) - } - aclState := tree.ACLState() - for _, s := range []string{"A", "B", "C", "D", "E", "F"} { - assert.Equal(t, aclState.userStates[keychain.GetIdentity(s)].Permissions, aclpb.ACLChange_Admin) - } - assert.Equal(t, aclState.identity, keychain.GetIdentity("A")) - - var changeIds []string - tree.Iterate(func(c *Change) (isContinue bool) { - changeIds = append(changeIds, c.Id) - return true - }) - assert.Equal(t, []string{"A.1.1", "B.1.1", "A.1.2", "A.1.3", "B.1.2"}, changeIds) -} - -func TestACLTree_ValidSnapshotBuild(t *testing.T) { - thr, err := treestoragebuilder.NewTreeStorageBuilderWithTestName("validsnapshotexample.yml") - if err != nil { - t.Fatal(err) - } - keychain := thr.GetKeychain() - accountData := &account.AccountData{ - Identity: keychain.GetIdentity("A"), - SignKey: keychain.SigningKeys["A"], - EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519PubKeyDecoder(), - } - listener := &mockListener{} - tree, err := BuildACLTree(thr, accountData, listener) - if err != nil { - t.Fatalf("should Build acl ACLState without err: %v", err) - } - aclState := tree.ACLState() - for _, s := range []string{"A", "B", "C", "D", "E", "F"} { - assert.Equal(t, aclState.userStates[keychain.GetIdentity(s)].Permissions, aclpb.ACLChange_Admin) - } - assert.Equal(t, aclState.identity, keychain.GetIdentity("A")) - - var changeIds []string - tree.Iterate(func(c *Change) (isContinue bool) { - changeIds = append(changeIds, c.Id) - return true - }) - assert.Equal(t, []string{"A.1.2", "A.1.3", "B.1.2"}, changeIds) -} diff --git a/pkg/acl/acltree/acltreebuilder.go b/pkg/acl/acltree/acltreebuilder.go deleted file mode 100644 index 71b5b304..00000000 --- a/pkg/acl/acltree/acltreebuilder.go +++ /dev/null @@ -1,154 +0,0 @@ -package acltree - -import ( - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" -) - -type aclTreeBuilder struct { - cache map[string]*Change - identityKeys map[string]signingkey.PubKey - signingPubKeyDecoder signingkey.PubKeyDecoder - tree *Tree - treeStorage treestorage.TreeStorage - - *changeLoader -} - -func newACLTreeBuilder(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder) *aclTreeBuilder { - return &aclTreeBuilder{ - signingPubKeyDecoder: decoder, - treeStorage: t, - changeLoader: newChangeLoader( - t, - decoder, - NewACLChange), - } -} - -func (tb *aclTreeBuilder) Init() { - tb.cache = make(map[string]*Change) - tb.identityKeys = make(map[string]signingkey.PubKey) - tb.tree = &Tree{} - tb.changeLoader.Init(tb.cache, tb.identityKeys) -} - -func (tb *aclTreeBuilder) Build() (*Tree, error) { - var headsAndOrphans []string - orphans, err := tb.treeStorage.Orphans() - if err != nil { - return nil, err - } - heads, err := tb.treeStorage.Heads() - if err != nil { - return nil, err - } - headsAndOrphans = append(headsAndOrphans, orphans...) - headsAndOrphans = append(headsAndOrphans, heads...) - aclHeads, err := tb.getACLHeads(headsAndOrphans) - - if err != nil { - return nil, err - } - - if err = tb.buildTreeFromStart(aclHeads); err != nil { - return nil, fmt.Errorf("buildTree error: %v", err) - } - tb.cache = nil - - return tb.tree, nil -} - -func (tb *aclTreeBuilder) buildTreeFromStart(heads []string) (err error) { - changes, root, err := tb.dfsFromStart(heads) - if err != nil { - return err - } - - tb.tree.AddFast(root) - tb.tree.AddFast(changes...) - return -} - -func (tb *aclTreeBuilder) dfsFromStart(heads []string) (buf []*Change, root *Change, err error) { - var possibleRoots []*Change - stack := make([]string, len(heads), len(heads)*2) - copy(stack, heads) - - buf = make([]*Change, 0, len(stack)*2) - uniqMap := make(map[string]struct{}) - for len(stack) > 0 { - id := stack[len(stack)-1] - stack = stack[:len(stack)-1] - if _, exists := uniqMap[id]; exists { - continue - } - - ch, err := tb.loadChange(id) - if err != nil { - continue - } - - uniqMap[id] = struct{}{} - buf = append(buf, ch) - - for _, prev := range ch.PreviousIds { - stack = append(stack, prev) - } - if len(ch.PreviousIds) == 0 { - possibleRoots = append(possibleRoots, ch) - } - } - header, err := tb.treeStorage.Header() - if err != nil { - return nil, nil, err - } - - for _, r := range possibleRoots { - if r.Id == header.FirstChangeId { - return buf, r, nil - } - } - - return nil, nil, fmt.Errorf("could not find root change") -} - -func (tb *aclTreeBuilder) getACLHeads(heads []string) (aclTreeHeads []string, err error) { - for _, head := range heads { - if slice.FindPos(aclTreeHeads, head) != -1 { // do not scan known heads - continue - } - precedingHeads, err := tb.getPrecedingACLHeads(head) - if err != nil { - continue - } - - for _, aclHead := range precedingHeads { - if slice.FindPos(aclTreeHeads, aclHead) != -1 { - continue - } - aclTreeHeads = append(aclTreeHeads, aclHead) - } - } - - if len(aclTreeHeads) == 0 { - return nil, fmt.Errorf("no usable ACL heads in tree storage") - } - return aclTreeHeads, nil -} - -func (tb *aclTreeBuilder) getPrecedingACLHeads(head string) ([]string, error) { - headChange, err := tb.loadChange(head) - if err != nil { - return nil, err - } - - if headChange.Content.GetAclData() != nil { - return []string{head}, nil - } else { - return headChange.PreviousIds, nil - } -} diff --git a/pkg/acl/acltree/acltreestorage.go b/pkg/acl/acltree/acltreestorage.go deleted file mode 100644 index df03898a..00000000 --- a/pkg/acl/acltree/acltreestorage.go +++ /dev/null @@ -1,70 +0,0 @@ -package acltree - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/gogo/protobuf/proto" -) - -func CreateNewTreeStorageWithACL( - acc *account.AccountData, - build func(builder ChangeBuilder) error, - create treestorage.CreatorFunc) (treestorage.TreeStorage, error) { - bld := newChangeBuilder() - bld.Init( - newACLState(acc.Identity, acc.EncKey, signingkey.NewEd25519PubKeyDecoder()), - &Tree{}, - acc) - err := build(bld) - if err != nil { - return nil, err - } - bld.SetMakeSnapshot(true) - - change, payload, err := bld.BuildAndApply() - if err != nil { - return nil, err - } - - rawChange := &aclpb.RawChange{ - Payload: payload, - Signature: change.Signature(), - Id: change.CID(), - } - header, id, err := createTreeHeaderAndId(rawChange) - if err != nil { - return nil, err - } - - thr, err := create(id, header, []*aclpb.RawChange{rawChange}) - if err != nil { - return nil, err - } - - err = thr.SetHeads([]string{change.CID()}) - if err != nil { - return nil, err - } - return thr, nil -} - -func createTreeHeaderAndId(change *aclpb.RawChange) (*treepb.TreeHeader, string, error) { - header := &treepb.TreeHeader{ - FirstChangeId: change.Id, - IsWorkspace: false, - } - marshalledHeader, err := proto.Marshal(header) - if err != nil { - return nil, "", err - } - treeId, err := cid.NewCIDFromBytes(marshalledHeader) - if err != nil { - return nil, "", err - } - - return header, treeId, nil -} diff --git a/pkg/acl/acltree/acltreestorage_test.go b/pkg/acl/acltree/acltreestorage_test.go deleted file mode 100644 index 8730a542..00000000 --- a/pkg/acl/acltree/acltreestorage_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package acltree - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/treestoragebuilder" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/stretchr/testify/assert" - "testing" -) - -func Test_BuildTreeStorageWithACL(t *testing.T) { - keychain := treestoragebuilder.NewKeychain() - keychain.AddSigningKey("A") - keychain.AddEncryptionKey("A") - data := &account.AccountData{ - Identity: keychain.GetIdentity("A"), - SignKey: keychain.SigningKeys["A"], - EncKey: keychain.EncryptionKeys["A"], - } - thr, err := CreateNewTreeStorageWithACL( - data, - func(builder ChangeBuilder) error { - return builder.UserAdd( - keychain.GetIdentity("A"), - keychain.EncryptionKeys["A"].GetPublic(), - aclpb.ACLChange_Admin) - }, - treestorage.NewInMemoryTreeStorage) - if err != nil { - t.Fatalf("build should not return error") - } - - heads, err := thr.Heads() - if err != nil { - t.Fatalf("should return heads: %v", err) - } - if len(heads) == 0 { - t.Fatalf("tree storage should have non-empty heads") - } - - header, err := thr.Header() - if err != nil { - t.Fatalf("tree storage header should return without error: %v", err) - } - assert.Equal(t, heads[0], header.FirstChangeId) - - treeId, err := thr.TreeID() - if err != nil { - t.Fatalf("tree id should return without error: %v", err) - } - assert.NotEmpty(t, treeId) - ch, err := thr.GetChange(context.Background(), header.FirstChangeId) - if err != nil { - t.Fatalf("get change should not return error: %v", err) - } - - _, err = NewFromRawChange(ch) - if err != nil { - t.Fatalf("we should be able to unmarshall change: %v", err) - } -} diff --git a/pkg/acl/acltree/change.go b/pkg/acl/acltree/change.go deleted file mode 100644 index 7ad71209..00000000 --- a/pkg/acl/acltree/change.go +++ /dev/null @@ -1,97 +0,0 @@ -package acltree - -import ( - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/gogo/protobuf/proto" - - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" -) - -type ChangeContent struct { - ChangesData proto.Marshaler - ACLData *aclpb.ACLChangeACLData - Id string // TODO: this is just for testing, because id should be created automatically from content -} - -// Change is an abstract type for all types of changes -type Change struct { - Next []*Change - Unattached []*Change - PreviousIds []string - Id string - SnapshotId string - IsSnapshot bool - DecryptedDocumentChange []byte - - Content *aclpb.ACLChange - Sign []byte -} - -func (ch *Change) DecryptContents(key *symmetric.Key) error { - if ch.Content.ChangesData == nil { - return nil - } - - decrypted, err := key.Decrypt(ch.Content.ChangesData) - if err != nil { - return fmt.Errorf("failed to decrypt changes data: %w", err) - } - - ch.DecryptedDocumentChange = decrypted - return nil -} - -func (ch *Change) IsACLChange() bool { - return ch.Content.GetAclData() != nil -} - -func NewFromRawChange(rawChange *aclpb.RawChange) (*Change, error) { - unmarshalled := &aclpb.ACLChange{} - err := proto.Unmarshal(rawChange.Payload, unmarshalled) - if err != nil { - return nil, err - } - - ch := NewChange(rawChange.Id, unmarshalled) - ch.Sign = rawChange.Signature - return ch, nil -} - -func NewChange(id string, ch *aclpb.ACLChange) *Change { - return &Change{ - Next: nil, - PreviousIds: ch.TreeHeadIds, - Id: id, - Content: ch, - SnapshotId: ch.SnapshotBaseId, - IsSnapshot: ch.GetAclData().GetAclSnapshot() != nil, - } -} - -func NewACLChange(id string, ch *aclpb.ACLChange) *Change { - return &Change{ - Next: nil, - PreviousIds: ch.AclHeadIds, - Id: id, - Content: ch, - SnapshotId: ch.SnapshotBaseId, - IsSnapshot: ch.GetAclData().GetAclSnapshot() != nil, - } -} - -func (ch *Change) ProtoChange() proto.Marshaler { - return ch.Content -} - -func (ch *Change) DecryptedChangeContent() []byte { - return ch.DecryptedDocumentChange -} - -func (ch *Change) Signature() []byte { - return ch.Sign -} - -func (ch *Change) CID() string { - return ch.Id -} diff --git a/pkg/acl/acltree/changebuilder.go b/pkg/acl/acltree/changebuilder.go deleted file mode 100644 index b5b26b63..00000000 --- a/pkg/acl/acltree/changebuilder.go +++ /dev/null @@ -1,163 +0,0 @@ -package acltree - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" - "github.com/gogo/protobuf/proto" - "hash/fnv" - "time" -) - -type MarshalledChange = []byte - -type ACLChangeBuilder interface { - UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChangeUserPermissions) error - AddId(id string) // TODO: this is only for testing - SetMakeSnapshot(bool) // TODO: who should decide this? probably ACLTree so we can delete it -} - -type ChangeBuilder interface { - ACLChangeBuilder - AddChangeContent(marshaler proto.Marshaler) // user code should be responsible for making regular snapshots -} - -type changeBuilder struct { - aclState *ACLState - tree *Tree - acc *account.AccountData - - aclData *aclpb.ACLChangeACLData - changeContent proto.Marshaler - id string - makeSnapshot bool - readKey *symmetric.Key - readKeyHash uint64 -} - -func newChangeBuilder() *changeBuilder { - return &changeBuilder{} -} - -func (c *changeBuilder) Init(state *ACLState, tree *Tree, acc *account.AccountData) { - c.aclState = state - c.tree = tree - c.acc = acc - - c.aclData = &aclpb.ACLChangeACLData{} - // setting read key for further encryption etc - if state.currentReadKeyHash == 0 { - c.readKey, _ = symmetric.NewRandom() - - hasher := fnv.New64() - hasher.Write(c.readKey.Bytes()) - c.readKeyHash = hasher.Sum64() - } else { - c.readKey = c.aclState.userReadKeys[c.aclState.currentReadKeyHash] - c.readKeyHash = c.aclState.currentReadKeyHash - } -} - -func (c *changeBuilder) AddId(id string) { - c.id = id -} - -func (c *changeBuilder) SetMakeSnapshot(b bool) { - c.makeSnapshot = b -} - -func (c *changeBuilder) UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChangeUserPermissions) error { - var allKeys []*symmetric.Key - if c.aclState.currentReadKeyHash != 0 { - for _, key := range c.aclState.userReadKeys { - allKeys = append(allKeys, key) - } - } else { - allKeys = append(allKeys, c.readKey) - } - - var encryptedKeys [][]byte - for _, k := range allKeys { - res, err := encryptionKey.Encrypt(k.Bytes()) - if err != nil { - return err - } - - encryptedKeys = append(encryptedKeys, res) - } - rawKey, err := encryptionKey.Raw() - if err != nil { - return err - } - ch := &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserAdd{ - UserAdd: &aclpb.ACLChangeUserAdd{ - Identity: identity, - EncryptionKey: rawKey, - EncryptedReadKeys: encryptedKeys, - Permissions: permissions, - }, - }, - } - c.aclData.AclContent = append(c.aclData.AclContent, ch) - return nil -} - -func (c *changeBuilder) BuildAndApply() (*Change, []byte, error) { - aclChange := &aclpb.ACLChange{ - TreeHeadIds: c.tree.Heads(), - AclHeadIds: c.tree.ACLHeads(), - SnapshotBaseId: c.tree.RootId(), - AclData: c.aclData, - CurrentReadKeyHash: c.readKeyHash, - Timestamp: int64(time.Now().Nanosecond()), - Identity: c.acc.Identity, - } - err := c.aclState.applyChange(aclChange) - if err != nil { - return nil, nil, err - } - - if c.makeSnapshot { - c.aclData.AclSnapshot = c.aclState.makeSnapshot() - } - - var marshalled []byte - if c.changeContent != nil { - marshalled, err = c.changeContent.Marshal() - if err != nil { - return nil, nil, err - } - - encrypted, err := c.aclState.userReadKeys[c.aclState.currentReadKeyHash]. - Encrypt(marshalled) - if err != nil { - return nil, nil, err - } - aclChange.ChangesData = encrypted - } - - fullMarshalledChange, err := proto.Marshal(aclChange) - if err != nil { - return nil, nil, err - } - signature, err := c.acc.SignKey.Sign(fullMarshalledChange) - if err != nil { - return nil, nil, err - } - id, err := cid.NewCIDFromBytes(fullMarshalledChange) - if err != nil { - return nil, nil, err - } - ch := NewChange(id, aclChange) - ch.DecryptedDocumentChange = marshalled - ch.Sign = signature - - return ch, fullMarshalledChange, nil -} - -func (c *changeBuilder) AddChangeContent(marshaler proto.Marshaler) { - c.changeContent = marshaler -} diff --git a/pkg/acl/acltree/changeloader.go b/pkg/acl/acltree/changeloader.go deleted file mode 100644 index b308397a..00000000 --- a/pkg/acl/acltree/changeloader.go +++ /dev/null @@ -1,99 +0,0 @@ -package acltree - -import ( - "context" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "time" - - "github.com/gogo/protobuf/proto" -) - -type changeLoader struct { - cache map[string]*Change - identityKeys map[string]signingkey.PubKey - signingPubKeyDecoder signingkey.PubKeyDecoder - treeStorage treestorage.TreeStorage - changeCreator func(id string, ch *aclpb.ACLChange) *Change -} - -func newChangeLoader( - treeStorage treestorage.TreeStorage, - signingPubKeyDecoder signingkey.PubKeyDecoder, - changeCreator func(id string, ch *aclpb.ACLChange) *Change) *changeLoader { - return &changeLoader{ - signingPubKeyDecoder: signingPubKeyDecoder, - treeStorage: treeStorage, - changeCreator: changeCreator, - } -} - -func (c *changeLoader) Init(cache map[string]*Change, - identityKeys map[string]signingkey.PubKey) { - c.cache = cache - c.identityKeys = identityKeys -} - -func (c *changeLoader) loadChange(id string) (ch *Change, err error) { - if ch, ok := c.cache[id]; ok { - return ch, nil - } - - // TODO: Add virtual changes logic - ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) - defer cancel() - - change, err := c.treeStorage.GetChange(ctx, id) - if err != nil { - return nil, err - } - - aclChange, err := c.makeVerifiedACLChange(change) - if err != nil { - return nil, err - } - - ch = c.changeCreator(id, aclChange) - c.cache[id] = ch - - return ch, nil -} - -func (c *changeLoader) verify(identity string, payload, signature []byte) (isVerified bool, err error) { - identityKey, exists := c.identityKeys[identity] - if !exists { - identityKey, err = c.signingPubKeyDecoder.DecodeFromString(identity) - if err != nil { - return - } - c.identityKeys[identity] = identityKey - } - return identityKey.Verify(payload, signature) -} - -func (c *changeLoader) makeVerifiedACLChange(change *aclpb.RawChange) (aclChange *aclpb.ACLChange, err error) { - aclChange = new(aclpb.ACLChange) - - // TODO: think what should we do with such cases, because this can be used by attacker to break our Tree - if err = proto.Unmarshal(change.Payload, aclChange); err != nil { - return - } - var verified bool - verified, err = c.verify(aclChange.Identity, change.Payload, change.Signature) - if err != nil { - return - } - if !verified { - err = fmt.Errorf("the signature of the payload cannot be verified") - return - } - return -} - -func (c *changeLoader) makeUnverifiedACLChange(change *aclpb.RawChange) (aclChange *aclpb.ACLChange, err error) { - aclChange = new(aclpb.ACLChange) - err = proto.Unmarshal(change.Payload, aclChange) - return -} diff --git a/pkg/acl/acltree/doctree.go b/pkg/acl/acltree/doctree.go deleted file mode 100644 index 50b92e27..00000000 --- a/pkg/acl/acltree/doctree.go +++ /dev/null @@ -1,8 +0,0 @@ -package acltree - -type DocTree interface { -} - -type docTree struct { - tree *Tree -} diff --git a/pkg/acl/acltree/snapshotvalidator.go b/pkg/acl/acltree/snapshotvalidator.go deleted file mode 100644 index 8df94d32..00000000 --- a/pkg/acl/acltree/snapshotvalidator.go +++ /dev/null @@ -1,50 +0,0 @@ -package acltree - -import ( - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" -) - -type snapshotValidator struct { - aclTree *Tree - identity string - key encryptionkey.PrivKey - decoder signingkey.PubKeyDecoder - stateBuilder *aclStateBuilder -} - -func newSnapshotValidator( - decoder signingkey.PubKeyDecoder, - accountData *account.AccountData) *snapshotValidator { - return &snapshotValidator{ - identity: accountData.Identity, - key: accountData.EncKey, - decoder: decoder, - stateBuilder: newACLStateBuilder(decoder, accountData), - } -} - -func (s *snapshotValidator) Init(aclTree *Tree) error { - s.aclTree = aclTree - return s.stateBuilder.Init(aclTree) -} - -func (s *snapshotValidator) ValidateSnapshot(ch *Change) (bool, error) { - st, found, err := s.stateBuilder.BuildBefore(ch.Id) - if err != nil { - return false, err - } - - if !found { - return false, fmt.Errorf("didn't find snapshot in ACL Tree") - } - - otherSt, err := newACLStateFromSnapshotChange(ch.Content, s.identity, s.key, s.decoder) - if err != nil { - return false, err - } - - return st.equal(otherSt), nil -} diff --git a/pkg/acl/acltree/tree.go b/pkg/acl/acltree/tree.go deleted file mode 100644 index e47ed212..00000000 --- a/pkg/acl/acltree/tree.go +++ /dev/null @@ -1,416 +0,0 @@ -package acltree - -import ( - "bytes" - "crypto/md5" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" - "sort" -) - -type Mode int - -const ( - Append Mode = iota - Rebuild - Nothing -) - -// TODO: consider abstracting into separate package with iterator, remove -type Tree struct { - root *Change - headIds []string - metaHeadIds []string - attached map[string]*Change - unAttached map[string]*Change - // missed id -> list of dependency ids - waitList map[string][]string - invalidChanges map[string]struct{} - - // bufs - iterCompBuf []*Change - iterQueue []*Change - - duplicateEvents int -} - -func (t *Tree) GetUnattachedChanges(changes ...*Change) []*Change { - return nil -} - -func (t *Tree) RootId() string { - if t.root != nil { - return t.root.Id - } - return "" -} - -func (t *Tree) Root() *Change { - return t.root -} - -func (t *Tree) AddFast(changes ...*Change) { - for _, c := range changes { - // ignore existing - if _, ok := t.attached[c.Id]; ok { - continue - } else if _, ok := t.unAttached[c.Id]; ok { - continue - } - t.add(c) - } - t.updateHeads() -} - -func (t *Tree) Add(changes ...*Change) (mode Mode) { - var beforeHeadIds = t.headIds - var attached bool - var empty = t.Len() == 0 - for _, c := range changes { - // ignore existing - if _, ok := t.attached[c.Id]; ok { - continue - } else if _, ok := t.unAttached[c.Id]; ok { - continue - } - if t.add(c) { - attached = true - } - } - if !attached { - return Nothing - } - t.updateHeads() - if empty { - return Rebuild - } - for _, hid := range beforeHeadIds { - for _, newCh := range changes { - if _, ok := t.attached[newCh.Id]; ok { - if !t.after(newCh.Id, hid) { - return Rebuild - } - } - } - } - return Append -} - -func (t *Tree) RemoveInvalidChange(id string) { - stack := []string{id} - // removing all children of this id (either next or unattached) - for len(stack) > 0 { - var exists bool - top := stack[len(stack)-1] - stack = stack[:len(stack)-1] - - if _, exists = t.invalidChanges[top]; exists { - continue - } - - var rem *Change - t.invalidChanges[top] = struct{}{} - if rem, exists = t.unAttached[top]; exists { - delete(t.unAttached, top) - } else if rem, exists = t.attached[top]; exists { - // remove from all prev changes - for _, id := range rem.PreviousIds { - prev, exists := t.attached[id] - if !exists { - continue - } - for i, next := range prev.Next { - if next.Id == top { - prev.Next[i] = nil - prev.Next = append(prev.Next[:i], prev.Next[i+1:]...) - break - } - } - } - delete(t.attached, top) - } - for _, el := range rem.Unattached { - stack = append(stack, el.Id) - } - for _, el := range rem.Next { - stack = append(stack, el.Id) - } - } - t.updateHeads() -} - -func (t *Tree) add(c *Change) (attached bool) { - if c == nil { - return false - } - if _, exists := t.invalidChanges[c.Id]; exists { - return false - } - - if t.root == nil { // first element - t.root = c - t.attached = map[string]*Change{ - c.Id: c, - } - t.unAttached = make(map[string]*Change) - t.waitList = make(map[string][]string) - t.invalidChanges = make(map[string]struct{}) - return true - } - if len(c.PreviousIds) > 1 { - sort.Strings(c.PreviousIds) - } - // attaching only if all prev ids are attached - attached = true - for _, pid := range c.PreviousIds { - if prev, ok := t.attached[pid]; ok { - prev.Unattached = append(prev.Unattached, c) - continue - } - attached = false - if prev, ok := t.unAttached[pid]; ok { - prev.Unattached = append(prev.Unattached, c) - continue - } - wl := t.waitList[pid] - wl = append(wl, c.Id) - t.waitList[pid] = wl - } - if attached { - t.attach(c, true) - } else { - // clearing wait list - for _, wid := range t.waitList[c.Id] { - c.Unattached = append(c.Unattached, t.unAttached[wid]) - } - delete(t.waitList, c.Id) - t.unAttached[c.Id] = c - } - return -} - -func (t *Tree) canAttach(c *Change) (attach bool) { - if c == nil { - return false - } - attach = true - for _, id := range c.PreviousIds { - if _, exists := t.attached[id]; !exists { - attach = false - } - } - return -} - -func (t *Tree) attach(c *Change, newEl bool) { - t.attached[c.Id] = c - if !newEl { - delete(t.unAttached, c.Id) - } - - // add next to all prev changes - for _, id := range c.PreviousIds { - // prev id must be attached if we attach this id - prev := t.attached[id] - prev.Next = append(prev.Next, c) - if len(prev.Next) > 1 { - sort.Sort(sortChanges(prev.Next)) - } - for i, next := range prev.Unattached { - if next.Id == c.Id { - prev.Unattached[i] = nil - prev.Unattached = append(prev.Unattached[:i], prev.Unattached[i+1:]...) - break - } - } - } - - // clearing wait list - if waitIds, ok := t.waitList[c.Id]; ok { - for _, wid := range waitIds { - next := t.unAttached[wid] - if t.canAttach(next) { - t.attach(next, false) - } - } - delete(t.waitList, c.Id) - } - - for _, next := range c.Unattached { - if t.canAttach(next) { - t.attach(next, false) - } - } -} - -func (t *Tree) after(id1, id2 string) (found bool) { - t.iterate(t.attached[id2], func(c *Change) (isContinue bool) { - if c.Id == id1 { - found = true - return false - } - return true - }) - return -} - -func (t *Tree) dfs(startChange string) (uniqMap map[string]*Change) { - stack := make([]*Change, 0, 10) - stack = append(stack, t.attached[startChange]) - uniqMap = map[string]*Change{} - - for len(stack) > 0 { - ch := stack[len(stack)-1] - stack = stack[:len(stack)-1] - if _, exists := uniqMap[ch.Id]; exists { - continue - } - - uniqMap[ch.Id] = ch - - for _, prev := range ch.PreviousIds { - stack = append(stack, t.attached[prev]) - } - } - return uniqMap -} - -func (t *Tree) updateHeads() { - var newHeadIds, newMetaHeadIds []string - t.iterate(t.root, func(c *Change) (isContinue bool) { - if len(c.Next) == 0 { - newHeadIds = append(newHeadIds, c.Id) - } - return true - }) - t.headIds = newHeadIds - t.metaHeadIds = newMetaHeadIds - sort.Strings(t.headIds) - sort.Strings(t.metaHeadIds) -} - -func (t *Tree) ACLHeads() []string { - var aclTreeHeads []string - for _, head := range t.Heads() { - if slice.FindPos(aclTreeHeads, head) != -1 { // do not scan known heads - continue - } - precedingHeads := t.getPrecedingACLHeads(head) - - for _, aclHead := range precedingHeads { - if slice.FindPos(aclTreeHeads, aclHead) != -1 { - continue - } - aclTreeHeads = append(aclTreeHeads, aclHead) - } - } - return aclTreeHeads -} - -func (t *Tree) getPrecedingACLHeads(head string) []string { - headChange := t.attached[head] - - if headChange.Content.GetAclData() != nil { - return []string{head} - } else { - return headChange.Content.AclHeadIds - } -} - -func (t *Tree) iterate(start *Change, f func(c *Change) (isContinue bool)) { - it := newIterator() - defer freeIterator(it) - it.iterate(start, f) -} - -func (t *Tree) iterateSkip(start *Change, skipBefore *Change, f func(c *Change) (isContinue bool)) { - it := newIterator() - defer freeIterator(it) - it.iterateSkip(start, skipBefore, f) -} - -func (t *Tree) IterateSkip(startId string, skipBeforeId string, f func(c *Change) (isContinue bool)) { - it := newIterator() - defer freeIterator(it) - it.iterateSkip(t.attached[startId], t.attached[skipBeforeId], f) -} - -func (t *Tree) Iterate(startId string, f func(c *Change) (isContinue bool)) { - t.iterate(t.attached[startId], f) -} - -func (t *Tree) IterateBranching(startId string, f func(c *Change, branchLevel int) (isContinue bool)) { - // branchLevel indicates the number of parallel branches - var bc int - t.iterate(t.attached[startId], func(c *Change) (isContinue bool) { - if pl := len(c.PreviousIds); pl > 1 { - bc -= pl - 1 - } - bl := bc - if nl := len(c.Next); nl > 1 { - bc += nl - 1 - } - return f(c, bl) - }) -} - -func (t *Tree) Hash() string { - h := md5.New() - n := 0 - t.iterate(t.root, func(c *Change) (isContinue bool) { - n++ - fmt.Fprintf(h, "-%s", c.Id) - return true - }) - return fmt.Sprintf("%d-%x", n, h.Sum(nil)) -} - -func (t *Tree) GetDuplicateEvents() int { - return t.duplicateEvents -} - -func (t *Tree) ResetDuplicateEvents() { - t.duplicateEvents = 0 -} - -func (t *Tree) Len() int { - return len(t.attached) -} - -func (t *Tree) Heads() []string { - return t.headIds -} - -func (t *Tree) String() string { - var buf = bytes.NewBuffer(nil) - t.Iterate(t.RootId(), func(c *Change) (isContinue bool) { - buf.WriteString(c.Id) - if len(c.Next) > 1 { - buf.WriteString("-<") - } else if len(c.Next) > 0 { - buf.WriteString("->") - } else { - buf.WriteString("-|") - } - return true - }) - return buf.String() -} - -func (t *Tree) Get(id string) *Change { - return t.attached[id] -} - -type sortChanges []*Change - -func (s sortChanges) Len() int { - return len(s) -} - -func (s sortChanges) Less(i, j int) bool { - return s[i].Id < s[j].Id -} - -func (s sortChanges) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} diff --git a/pkg/acl/acltree/treebuilder.go b/pkg/acl/acltree/treebuilder.go deleted file mode 100644 index 9bb9a4b8..00000000 --- a/pkg/acl/acltree/treebuilder.go +++ /dev/null @@ -1,307 +0,0 @@ -package acltree - -import ( - "errors" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" -) - -var ( - log = logger.NewNamed("acltree").Sugar() - ErrEmpty = errors.New("logs empty") -) - -type treeBuilder struct { - cache map[string]*Change - identityKeys map[string]signingkey.PubKey - signingPubKeyDecoder signingkey.PubKeyDecoder - tree *Tree - treeStorage treestorage.TreeStorage - - *changeLoader -} - -func newTreeBuilder(t treestorage.TreeStorage, decoder signingkey.PubKeyDecoder) *treeBuilder { - return &treeBuilder{ - signingPubKeyDecoder: decoder, - treeStorage: t, - changeLoader: newChangeLoader( - t, - decoder, - NewChange), - } -} - -func (tb *treeBuilder) Init() { - tb.cache = make(map[string]*Change) - tb.identityKeys = make(map[string]signingkey.PubKey) - tb.tree = &Tree{} - tb.changeLoader.Init(tb.cache, tb.identityKeys) -} - -func (tb *treeBuilder) Build(fromStart bool) (*Tree, error) { - var headsAndOrphans []string - orphans, err := tb.treeStorage.Orphans() - if err != nil { - return nil, err - } - heads, err := tb.treeStorage.Heads() - if err != nil { - return nil, err - } - headsAndOrphans = append(headsAndOrphans, orphans...) - headsAndOrphans = append(headsAndOrphans, heads...) - - if fromStart { - if err := tb.buildTreeFromStart(headsAndOrphans); err != nil { - return nil, fmt.Errorf("buildTree error: %v", err) - } - } else { - breakpoint, err := tb.findBreakpoint(headsAndOrphans) - if err != nil { - return nil, fmt.Errorf("findBreakpoint error: %v", err) - } - - if err = tb.buildTree(headsAndOrphans, breakpoint); err != nil { - return nil, fmt.Errorf("buildTree error: %v", err) - } - } - - tb.cache = nil - - return tb.tree, nil -} - -func (tb *treeBuilder) buildTreeFromStart(heads []string) (err error) { - changes, root, err := tb.dfsFromStart(heads) - if err != nil { - return err - } - - tb.tree.AddFast(root) - tb.tree.AddFast(changes...) - return -} - -func (tb *treeBuilder) dfsFromStart(heads []string) (buf []*Change, root *Change, err error) { - var possibleRoots []*Change - stack := make([]string, len(heads), len(heads)*2) - copy(stack, heads) - - buf = make([]*Change, 0, len(stack)*2) - uniqMap := make(map[string]struct{}) - for len(stack) > 0 { - id := stack[len(stack)-1] - stack = stack[:len(stack)-1] - if _, exists := uniqMap[id]; exists { - continue - } - - ch, err := tb.loadChange(id) - if err != nil { - continue - } - - uniqMap[id] = struct{}{} - buf = append(buf, ch) - - for _, prev := range ch.PreviousIds { - stack = append(stack, prev) - } - if len(ch.PreviousIds) == 0 { - possibleRoots = append(possibleRoots, ch) - } - } - header, err := tb.treeStorage.Header() - if err != nil { - return nil, nil, err - } - for _, r := range possibleRoots { - if r.Id == header.FirstChangeId { - return buf, r, nil - } - } - - return nil, nil, fmt.Errorf("could not find root change") -} - -func (tb *treeBuilder) buildTree(heads []string, breakpoint string) (err error) { - ch, err := tb.loadChange(breakpoint) - if err != nil { - return - } - tb.tree.AddFast(ch) - changes, err := tb.dfs(heads, breakpoint, tb.loadChange) - - tb.tree.AddFast(changes...) - return -} - -func (tb *treeBuilder) dfs( - heads []string, - breakpoint string, - load func(string) (*Change, error)) (buf []*Change, err error) { - stack := make([]string, len(heads), len(heads)*2) - copy(stack, heads) - - buf = make([]*Change, 0, len(stack)*2) - uniqMap := map[string]struct{}{breakpoint: {}} - for len(stack) > 0 { - id := stack[len(stack)-1] - stack = stack[:len(stack)-1] - if _, exists := uniqMap[id]; exists { - continue - } - - ch, err := load(id) - if err != nil { - continue - } - - uniqMap[id] = struct{}{} - buf = append(buf, ch) - - for _, prev := range ch.PreviousIds { - stack = append(stack, prev) - } - } - return buf, nil -} - -func (tb *treeBuilder) findBreakpoint(heads []string) (breakpoint string, err error) { - var ( - ch *Change - snapshotIds []string - ) - for _, head := range heads { - if ch, err = tb.loadChange(head); err != nil { - return - } - shId := ch.SnapshotId - if ch.IsSnapshot { - shId = ch.Id - } - if slice.FindPos(snapshotIds, shId) == -1 { - snapshotIds = append(snapshotIds, shId) - } - } - return tb.findCommonSnapshot(snapshotIds) -} - -func (tb *treeBuilder) findCommonSnapshot(snapshotIds []string) (snapshotId string, err error) { - if len(snapshotIds) == 1 { - return snapshotIds[0], nil - } else if len(snapshotIds) == 0 { - return "", fmt.Errorf("snapshots not found") - } - - for len(snapshotIds) > 1 { - l := len(snapshotIds) - shId, e := tb.findCommonForTwoSnapshots(snapshotIds[l-2], snapshotIds[l-1]) - if e != nil { - return "", e - } - snapshotIds[l-2] = shId - snapshotIds = snapshotIds[:l-1] - } - return snapshotIds[0], nil -} - -func (tb *treeBuilder) findCommonForTwoSnapshots(s1, s2 string) (s string, err error) { - // fast cases - if s1 == s2 { - return s1, nil - } - ch1, err := tb.loadChange(s1) - if err != nil { - return "", err - } - if ch1.SnapshotId == s2 { - return s2, nil - } - ch2, err := tb.loadChange(s2) - if err != nil { - return "", err - } - if ch2.SnapshotId == s1 { - return s1, nil - } - if ch1.SnapshotId == ch2.SnapshotId && ch1.SnapshotId != "" { - return ch1.SnapshotId, nil - } - // traverse - var t1 = make([]string, 0, 5) - var t2 = make([]string, 0, 5) - t1 = append(t1, ch1.Id, ch1.SnapshotId) - t2 = append(t2, ch2.Id, ch2.SnapshotId) - for { - lid1 := t1[len(t1)-1] - if lid1 != "" { - l1, e := tb.loadChange(lid1) - if e != nil { - return "", e - } - if l1.SnapshotId != "" { - if slice.FindPos(t2, l1.SnapshotId) != -1 { - return l1.SnapshotId, nil - } - } - t1 = append(t1, l1.SnapshotId) - } - lid2 := t2[len(t2)-1] - if lid2 != "" { - l2, e := tb.loadChange(t2[len(t2)-1]) - if e != nil { - return "", e - } - if l2.SnapshotId != "" { - if slice.FindPos(t1, l2.SnapshotId) != -1 { - return l2.SnapshotId, nil - } - } - t2 = append(t2, l2.SnapshotId) - } - if lid1 == "" && lid2 == "" { - break - } - } - - log.Warnf("changes build Tree: possible versions split") - - // prefer not first snapshot - if len(ch1.PreviousIds) == 0 && len(ch2.PreviousIds) > 0 { - log.Warnf("changes build Tree: prefer %s(%d prevIds) over %s(%d prevIds)", s2, len(ch2.PreviousIds), s1, len(ch1.PreviousIds)) - return s2, nil - } else if len(ch1.PreviousIds) > 0 && len(ch2.PreviousIds) == 0 { - log.Warnf("changes build Tree: prefer %s(%d prevIds) over %s(%d prevIds)", s1, len(ch1.PreviousIds), s2, len(ch2.PreviousIds)) - return s1, nil - } - - isEmptySnapshot := func(ch *Change) bool { - // TODO: add more sophisticated checks in Change for snapshots - return !ch.IsSnapshot - } - - // TODO: can we even have empty snapshots? - // prefer not empty snapshot - if isEmptySnapshot(ch1) && !isEmptySnapshot(ch2) { - log.Warnf("changes build Tree: prefer %s(not empty) over %s(empty)", s2, s1) - return s2, nil - } else if isEmptySnapshot(ch2) && !isEmptySnapshot(ch1) { - log.Warnf("changes build Tree: prefer %s(not empty) over %s(empty)", s1, s2) - return s1, nil - } - - // TODO: add virtual change mechanics - // unexpected behavior - just return lesser id - if s1 < s2 { - log.Warnf("changes build Tree: prefer %s (%s<%s)", s1, s1, s2) - return s1, nil - } - log.Warnf("changes build Tree: prefer %s (%s<%s)", s2, s2, s1) - - return s2, nil -} diff --git a/pkg/acl/acltree/treebuilder_test.go b/pkg/acl/acltree/treebuilder_test.go deleted file mode 100644 index cc586148..00000000 --- a/pkg/acl/acltree/treebuilder_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package acltree - -//func createTreeFromThread(t thread.Thread, fromStart bool) (*Tree, error) { -// treeBuilder := newTreeBuilder(t, keys.NewEd25519Decoder()) -// treeBuilder.Init() -// return treeBuilder.Build(fromStart) -//} -// -//func TestACLTreeBuilder_UserJoinCorrectHeadsAndLen(t *testing.T) { -// thread, err := threadbuilder.NewThreadBuilderWithTestName("threadbuilder/userjoinexample.yml") -// if err != nil { -// t.Fatal(err) -// } -// -// res, err := createTreeFromThread(thread) -// if err != nil { -// t.Fatalf("build Tree should not result in an error: %v", res) -// } -// -// assert.equal(t, res.Heads(), []string{"C.1.1"}) -// assert.equal(t, res.Len(), 4) -//} -// -//func TestTreeBuilder_UserJoinTestTreeIterate(t *testing.T) { -// thread, err := threadbuilder.NewThreadBuilderWithTestName("threadbuilder/userjoinexample.yml") -// if err != nil { -// t.Fatal(err) -// } -// -// res, err := createTreeFromThread(thread) -// if err != nil { -// t.Fatalf("build Tree should not result in an error: %v", res) -// } -// -// assert.equal(t, res.Heads(), []string{"C.1.1"}) -// assert.equal(t, res.Len(), 4) -// var changeIds []string -// res.iterate(res.root, func(c *Change) (isContinue bool) { -// changeIds = append(changeIds, c.Id) -// return true -// }) -// assert.equal(t, changeIds, []string{"A.1.1", "A.1.2", "B.1.1", "C.1.1"}) -//} -// -//func TestTreeBuilder_UserRemoveTestTreeIterate(t *testing.T) { -// thread, err := threadbuilder.NewThreadBuilderWithTestName("threadbuilder/userremoveexample.yml") -// if err != nil { -// t.Fatal(err) -// } -// -// res, err := createTreeFromThread(thread) -// if err != nil { -// t.Fatalf("build Tree should not result in an error: %v", res) -// } -// -// assert.equal(t, res.Heads(), []string{"A.1.3"}) -// assert.equal(t, res.Len(), 4) -// var changeIds []string -// res.iterate(res.root, func(c *Change) (isContinue bool) { -// changeIds = append(changeIds, c.Id) -// return true -// }) -// assert.equal(t, changeIds, []string{"A.1.1", "A.1.2", "B.1.1", "A.1.3"}) -//} diff --git a/pkg/acl/acltree/treegraph.go b/pkg/acl/acltree/treegraph.go deleted file mode 100644 index 3b37fa2e..00000000 --- a/pkg/acl/acltree/treegraph.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build ((!linux && !darwin) || android || ios || nographviz) && !amd64 -// +build !linux,!darwin android ios nographviz -// +build !amd64 - -package acltree - -import "fmt" - -func (t *Tree) Graph() (data string, err error) { - return "", fmt.Errorf("not supported") -} diff --git a/pkg/acl/acltree/treegraph_nix.go b/pkg/acl/acltree/treegraph_nix.go deleted file mode 100644 index 4d798939..00000000 --- a/pkg/acl/acltree/treegraph_nix.go +++ /dev/null @@ -1,152 +0,0 @@ -//go:build (linux || darwin) && !android && !ios && !nographviz && (amd64 || arm64) -// +build linux darwin -// +build !android -// +build !ios -// +build !nographviz -// +build amd64 arm64 - -package acltree - -import ( - "bytes" - "fmt" - "strings" - "time" - "unicode" - - "github.com/goccy/go-graphviz" - "github.com/goccy/go-graphviz/cgraph" -) - -func (t *Tree) Graph() (data string, err error) { - var order = make(map[string]string) - var seq = 0 - t.Iterate(t.RootId(), func(c *Change) (isContinue bool) { - v := order[c.Id] - if v == "" { - order[c.Id] = fmt.Sprint(seq) - } else { - order[c.Id] = fmt.Sprintf("%s,%d", v, seq) - } - seq++ - return true - }) - g := graphviz.New() - defer g.Close() - graph, err := g.Graph() - if err != nil { - return - } - defer func() { - err = graph.Close() - }() - var nodes = make(map[string]*cgraph.Node) - var addChange = func(c *Change) error { - n, e := graph.CreateNode(c.Id) - if e != nil { - return e - } - if c.Content.GetAclData() != nil { - n.SetStyle(cgraph.FilledNodeStyle) - } else if c.IsSnapshot { - n.SetStyle(cgraph.DashedNodeStyle) - } - nodes[c.Id] = n - ord := order[c.Id] - if ord == "" { - ord = "miss" - } - var chSymbs []string - if c.Content.AclData != nil { - for _, chc := range c.Content.AclData.AclContent { - tp := fmt.Sprintf("%T", chc.Value) - tp = strings.Replace(tp, "ACLChangeACLContentValueValueOf", "", 1) - res := "" - for _, ts := range tp { - if unicode.IsUpper(ts) { - res += string(ts) - } - } - chSymbs = append(chSymbs, res) - } - } - if c.DecryptedDocumentChange != nil { - // TODO: add some parser to provide custom unmarshalling for the document change - //for _, chc := range c.DecryptedDocumentChange.Content { - // tp := fmt.Sprintf("%T", chc.Value) - // tp = strings.Replace(tp, "ChangeContentValueOf", "", 1) - // res := "" - // for _, ts := range tp { - // if unicode.IsUpper(ts) { - // res += string(ts) - // } - // } - // chSymbs = append(chSymbs, res) - //} - chSymbs = append(chSymbs, "DEC") - } - - shortId := c.Id - label := fmt.Sprintf("Id: %s\nOrd: %s\nTime: %s\nChanges: %s\n", - shortId, - ord, - time.Unix(c.Content.Timestamp, 0).Format("02.01.06 15:04:05"), - strings.Join(chSymbs, ","), - ) - n.SetLabel(label) - return nil - } - for _, c := range t.attached { - if err = addChange(c); err != nil { - return - } - } - for _, c := range t.unAttached { - if err = addChange(c); err != nil { - return - } - } - var getNode = func(id string) (*cgraph.Node, error) { - if n, ok := nodes[id]; ok { - return n, nil - } - n, err := graph.CreateNode(fmt.Sprintf("%s: not in Tree", id)) - if err != nil { - return nil, err - } - nodes[id] = n - return n, nil - } - var addLinks = func(c *Change) error { - for _, prevId := range c.PreviousIds { - self, e := getNode(c.Id) - if e != nil { - return e - } - prev, e := getNode(prevId) - if e != nil { - return e - } - _, e = graph.CreateEdge("", self, prev) - if e != nil { - return e - } - } - return nil - } - for _, c := range t.attached { - if err = addLinks(c); err != nil { - return - } - } - for _, c := range t.unAttached { - if err = addLinks(c); err != nil { - return - } - } - var buf bytes.Buffer - if err = g.Render(graph, "dot", &buf); err != nil { - return - } - return buf.String(), nil -} diff --git a/pkg/acl/acltree/treeiterator.go b/pkg/acl/acltree/treeiterator.go deleted file mode 100644 index 19a20095..00000000 --- a/pkg/acl/acltree/treeiterator.go +++ /dev/null @@ -1,158 +0,0 @@ -package acltree - -import "sync" - -var itPool = &sync.Pool{ - New: func() interface{} { - return &iterator{} - }, -} - -func newIterator() *iterator { - return itPool.Get().(*iterator) -} - -func freeIterator(i *iterator) { - itPool.Put(i) -} - -type iterator struct { - compBuf []*Change - queue []*Change - doneMap map[*Change]struct{} - breakpoint *Change - f func(c *Change) bool -} - -func (i *iterator) iterateSkip(start *Change, skipBefore *Change, f func(c *Change) (isContinue bool)) { - skipping := true - i.iterate(start, func(c *Change) (isContinue bool) { - if skipping && c != skipBefore { - return true - } - skipping = false - return f(c) - }) -} - -func (i *iterator) iterate(start *Change, f func(c *Change) (isContinue bool)) { - if start == nil { - return - } - // reset - i.queue = i.queue[:0] - i.compBuf = i.compBuf[:0] - i.doneMap = make(map[*Change]struct{}) - i.queue = append(i.queue, start) - i.breakpoint = nil - i.f = f - - for len(i.queue) > 0 { - c := i.queue[0] - i.queue = i.queue[1:] - nl := len(c.Next) - if nl == 1 { - if !i.iterateLin(c) { - return - } - if i.breakpoint != nil { - i.toQueue(i.breakpoint) - i.breakpoint = nil - } - } else { - _, done := i.doneMap[c] - if !done { - if !f(c) { - return - } - i.doneMap[c] = struct{}{} - } - if nl != 0 { - for _, next := range c.Next { - i.toQueue(next) - } - } - } - } -} - -func (i *iterator) iterateLin(c *Change) bool { - for len(c.Next) == 1 { - _, done := i.doneMap[c] - if !done { - if !i.f(c) { - return false - } - i.doneMap[c] = struct{}{} - } - - c = c.Next[0] - if len(c.PreviousIds) > 1 { - break - } - } - if len(c.Next) == 0 && len(c.PreviousIds) <= 1 { - if !i.f(c) { - return false - } - i.doneMap[c] = struct{}{} - } else { - i.breakpoint = c - } - - return true -} - -func (i *iterator) comp(c1, c2 *Change) uint8 { - if c1.Id == c2.Id { - return 0 - } - i.compBuf = i.compBuf[:0] - i.compBuf = append(i.compBuf, c1.Next...) - var uniq = make(map[*Change]struct{}) - var appendUniqueToBuf = func(next []*Change) { - for _, n := range next { - if _, ok := uniq[n]; !ok { - i.compBuf = append(i.compBuf, n) - uniq[n] = struct{}{} - } - } - } - var used int - for len(i.compBuf)-used > 0 { - l := len(i.compBuf) - used - for _, n := range i.compBuf[used:] { - delete(uniq, n) - if n.Id == c2.Id { - return 1 - } else { - appendUniqueToBuf(n.Next) - } - } - used += l - } - return 2 -} - -func (i *iterator) toQueue(c *Change) { - var pos = -1 -For: - for idx, qc := range i.queue { - switch i.comp(c, qc) { - // exists - case 0: - return - // - case 1: - pos = idx - break For - } - } - if pos == -1 { - i.queue = append(i.queue, c) - } else if pos == 0 { - i.queue = append([]*Change{c}, i.queue...) - } else { - i.queue = append(i.queue[:pos], append([]*Change{c}, i.queue[pos:]...)...) - } -} diff --git a/pkg/acl/example/plaintextdocument/document.go b/pkg/acl/example/plaintextdocument/document.go deleted file mode 100644 index d97bf430..00000000 --- a/pkg/acl/example/plaintextdocument/document.go +++ /dev/null @@ -1,169 +0,0 @@ -package plaintextdocument - -import ( - "context" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - aclpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - - "github.com/gogo/protobuf/proto" -) - -type PlainTextDocument interface { - Text() string - AddText(ctx context.Context, text string) error -} - -// TODO: this struct is not thread-safe, so use it wisely :-) -type plainTextDocument struct { - heads []string - aclTree acltree.ACLTree - state *DocumentState -} - -func (p *plainTextDocument) Text() string { - if p.state != nil { - return p.state.Text - } - return "" -} - -func (p *plainTextDocument) AddText(ctx context.Context, text string) error { - _, err := p.aclTree.AddContent(ctx, func(builder acltree.ChangeBuilder) error { - builder.AddChangeContent( - &testchangepb.PlainTextChangeData{ - Content: []*testchangepb.PlainTextChangeContent{ - createAppendTextChangeContent(text), - }, - }) - return nil - }) - return err -} - -func (p *plainTextDocument) Update(tree acltree.ACLTree) { - p.aclTree = tree - var err error - defer func() { - if err != nil { - fmt.Println("rebuild has returned error:", err) - } - }() - - prevHeads := p.heads - p.heads = tree.Heads() - startId := prevHeads[0] - tree.IterateFrom(startId, func(change *acltree.Change) (isContinue bool) { - if change.Id == startId { - return true - } - if change.DecryptedDocumentChange != nil { - p.state, err = p.state.ApplyChange(change.DecryptedDocumentChange, change.Id) - if err != nil { - return false - } - } - return true - }) -} - -func (p *plainTextDocument) Rebuild(tree acltree.ACLTree) { - p.aclTree = tree - p.heads = tree.Heads() - var startId string - var err error - defer func() { - if err != nil { - fmt.Println("rebuild has returned error:", err) - } - }() - - rootChange := tree.Root() - - if rootChange.DecryptedDocumentChange == nil { - err = fmt.Errorf("root doesn't have decrypted change") - return - } - - state, err := BuildDocumentStateFromChange(rootChange.DecryptedDocumentChange, rootChange.Id) - if err != nil { - return - } - - startId = rootChange.Id - tree.Iterate(func(change *acltree.Change) (isContinue bool) { - if startId == change.Id { - return true - } - if change.DecryptedDocumentChange != nil { - state, err = state.ApplyChange(change.DecryptedDocumentChange, change.Id) - if err != nil { - return false - } - } - return true - }) - if err != nil { - return - } - p.state = state -} - -func NewInMemoryPlainTextDocument(acc *account.AccountData, text string) (PlainTextDocument, error) { - return NewPlainTextDocument(acc, treestorage.NewInMemoryTreeStorage, text) -} - -func NewPlainTextDocument( - acc *account.AccountData, - create treestorage.CreatorFunc, - text string) (PlainTextDocument, error) { - changeBuilder := func(builder acltree.ChangeBuilder) error { - err := builder.UserAdd(acc.Identity, acc.EncKey.GetPublic(), aclpb.ACLChange_Admin) - if err != nil { - return err - } - builder.AddChangeContent(createInitialChangeContent(text)) - return nil - } - t, err := acltree.CreateNewTreeStorageWithACL( - acc, - changeBuilder, - create) - if err != nil { - return nil, err - } - - doc := &plainTextDocument{ - heads: nil, - aclTree: nil, - state: nil, - } - tree, err := acltree.BuildACLTree(t, acc, doc) - if err != nil { - return nil, err - } - doc.aclTree = tree - return doc, nil -} - -func createInitialChangeContent(text string) proto.Marshaler { - return &testchangepb.PlainTextChangeData{ - Content: []*testchangepb.PlainTextChangeContent{ - createAppendTextChangeContent(text), - }, - Snapshot: &testchangepb.PlainTextChangeSnapshot{Text: text}, - } -} - -func createAppendTextChangeContent(text string) *testchangepb.PlainTextChangeContent { - return &testchangepb.PlainTextChangeContent{ - Value: &testchangepb.PlainTextChangeContentValueOfTextAppend{ - TextAppend: &testchangepb.PlainTextChangeTextAppend{ - Text: text, - }, - }, - } -} diff --git a/pkg/acl/example/plaintextdocument/document_test.go b/pkg/acl/example/plaintextdocument/document_test.go deleted file mode 100644 index 7cabb4af..00000000 --- a/pkg/acl/example/plaintextdocument/document_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package plaintextdocument - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/treestoragebuilder" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/stretchr/testify/assert" - "testing" -) - -func TestDocument_NewPlainTextDocument(t *testing.T) { - keychain := treestoragebuilder.NewKeychain() - keychain.AddSigningKey("A") - keychain.AddEncryptionKey("A") - data := &account.AccountData{ - Identity: keychain.GetIdentity("A"), - SignKey: keychain.SigningKeys["A"], - EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519PubKeyDecoder(), - } - - doc, err := NewPlainTextDocument(data, treestorage.NewInMemoryTreeStorage, "Some text") - if err != nil { - t.Fatalf("should not create document with error: %v", err) - } - assert.Equal(t, doc.Text(), "Some text") -} - -func TestDocument_PlainTextDocument_AddText(t *testing.T) { - keychain := treestoragebuilder.NewKeychain() - keychain.AddSigningKey("A") - keychain.AddEncryptionKey("A") - data := &account.AccountData{ - Identity: keychain.GetIdentity("A"), - SignKey: keychain.SigningKeys["A"], - EncKey: keychain.EncryptionKeys["A"], - Decoder: signingkey.NewEd25519PubKeyDecoder(), - } - - doc, err := NewPlainTextDocument(data, treestorage.NewInMemoryTreeStorage, "Some text") - if err != nil { - t.Fatalf("should not create document with error: %v", err) - } - - err = doc.AddText(context.Background(), "Next") - if err != nil { - t.Fatalf("should be able to add document: %v", err) - } - assert.Equal(t, doc.Text(), "Some text|Next") - - err = doc.AddText(context.Background(), "Shmext") - if err != nil { - t.Fatalf("should be able to add document: %v", err) - } - assert.Equal(t, doc.Text(), "Some text|Next|Shmext") -} diff --git a/pkg/acl/example/plaintextdocument/plaintextdocstate.go b/pkg/acl/example/plaintextdocument/plaintextdocstate.go deleted file mode 100644 index 3a3afec3..00000000 --- a/pkg/acl/example/plaintextdocument/plaintextdocstate.go +++ /dev/null @@ -1,59 +0,0 @@ -package plaintextdocument - -import ( - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" - - "github.com/gogo/protobuf/proto" -) - -type DocumentState struct { - LastChangeId string - Text string -} - -func NewDocumentState(text string, id string) *DocumentState { - return &DocumentState{ - LastChangeId: id, - Text: text, - } -} - -func BuildDocumentStateFromChange(change []byte, id string) (*DocumentState, error) { - var changesData testchangepb.PlainTextChangeData - err := proto.Unmarshal(change, &changesData) - if err != nil { - return nil, err - } - - if changesData.GetSnapshot() == nil { - return nil, fmt.Errorf("could not create state from empty snapshot") - } - return NewDocumentState(changesData.GetSnapshot().GetText(), id), nil -} - -func (p *DocumentState) ApplyChange(change []byte, id string) (*DocumentState, error) { - var changesData testchangepb.PlainTextChangeData - err := proto.Unmarshal(change, &changesData) - if err != nil { - return nil, err - } - - for _, content := range changesData.GetContent() { - err = p.applyChange(content) - if err != nil { - return nil, err - } - } - p.LastChangeId = id - return p, nil -} - -func (p *DocumentState) applyChange(ch *testchangepb.PlainTextChangeContent) error { - switch { - case ch.GetTextAppend() != nil: - text := ch.GetTextAppend().GetText() - p.Text += "|" + text - } - return nil -} diff --git a/pkg/acl/list/changebuilder.go b/pkg/acl/list/changebuilder.go index c5420b50..bcdabe62 100644 --- a/pkg/acl/list/changebuilder.go +++ b/pkg/acl/list/changebuilder.go @@ -95,7 +95,7 @@ func (c *aclChangeBuilder) UserAdd(identity string, encryptionKey encryptionkey. func (c *aclChangeBuilder) BuildAndApply() (*Record, []byte, error) { aclRecord := &aclpb.Record{ - PrevId: c.list.Last().Id, + PrevId: c.list.Head().Id, CurrentReadKeyHash: c.readKeyHash, Timestamp: int64(time.Now().Nanosecond()), Identity: c.acc.Identity, diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index 420f7e84..c7fa37d8 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -1,16 +1,61 @@ package list -import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" +) type IterFunc = func(record *Record) (IsContinue bool) type ACLList interface { tree.RWLocker ID() string + Header() *aclpb.Header ACLState() ACLState IsAfter(first string, second string) (bool, error) - Last() *Record + Head() *Record Get(id string) (*Record, error) Iterate(iterFunc IterFunc) IterateFrom(startId string, iterFunc IterFunc) } + +//func (t *ACLListStorageBuilder) IsAfter(first string, second string) (bool, error) { +// firstRec, okFirst := t.indexes[first] +// secondRec, okSecond := t.indexes[second] +// if !okFirst || !okSecond { +// return false, fmt.Errorf("not all entries are there: first (%b), second (%b)", okFirst, okSecond) +// } +// return firstRec > secondRec, nil +//} +// +//func (t *ACLListStorageBuilder) Head() *list.Record { +// return t.records[len(t.records)-1] +//} +// +//func (t *ACLListStorageBuilder) Get(id string) (*list.Record, error) { +// recIdx, ok := t.indexes[id] +// if !ok { +// return nil, fmt.Errorf("no such record") +// } +// return t.records[recIdx], nil +//} +// +//func (t *ACLListStorageBuilder) Iterate(iterFunc list.IterFunc) { +// for _, rec := range t.records { +// if !iterFunc(rec) { +// return +// } +// } +//} +// +//func (t *ACLListStorageBuilder) IterateFrom(startId string, iterFunc list.IterFunc) { +// recIdx, ok := t.indexes[startId] +// if !ok { +// return +// } +// for i := recIdx; i < len(t.records); i++ { +// if !iterFunc(t.records[i]) { +// return +// } +// } +//} diff --git a/pkg/acl/list/storage.go b/pkg/acl/list/storage.go new file mode 100644 index 00000000..22fcb732 --- /dev/null +++ b/pkg/acl/list/storage.go @@ -0,0 +1,14 @@ +package list + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" +) + +type Storage interface { + ID() string + Head() (*aclpb.RawRecord, error) + Header() (*aclpb.Header, error) + GetRecord(ctx context.Context, id string) (*aclpb.RawRecord, error) + AddRecord(ctx context.Context, rec *aclpb.RawRecord) error +} diff --git a/pkg/acl/testutils/treestoragebuilder/keychain.go b/pkg/acl/testutils/acllistbuilder/keychain.go similarity index 99% rename from pkg/acl/testutils/treestoragebuilder/keychain.go rename to pkg/acl/testutils/acllistbuilder/keychain.go index 5635f072..a1567f6a 100644 --- a/pkg/acl/testutils/treestoragebuilder/keychain.go +++ b/pkg/acl/testutils/acllistbuilder/keychain.go @@ -1,4 +1,4 @@ -package treestoragebuilder +package acllistbuilder import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go new file mode 100644 index 00000000..e78a7df2 --- /dev/null +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -0,0 +1,320 @@ +package acllistbuilder + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/yamltests" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "io/ioutil" + "path" + "sync" + "time" + + "github.com/gogo/protobuf/proto" + "gopkg.in/yaml.v3" +) + +type ACLListStorageBuilder struct { + aclList string + records []*aclpb.Record + rawRecords []*aclpb.RawRecord + indexes map[string]int + keychain *Keychain + header *aclpb.Header + id string + sync.RWMutex +} + +func NewACLListStorageBuilder(keychain *Keychain) *ACLListStorageBuilder { + return &ACLListStorageBuilder{ + records: make([]*aclpb.Record, 0), + indexes: make(map[string]int), + keychain: keychain, + } +} + +func NewACLListStorageBuilderWithTestName(name string) (*ACLListStorageBuilder, error) { + filePath := path.Join(yamltests.Path(), name) + return NewACLListStorageBuilderFromFile(filePath) +} + +func NewACLListStorageBuilderFromFile(file string) (*ACLListStorageBuilder, error) { + content, err := ioutil.ReadFile(file) + if err != nil { + return nil, err + } + + ymlTree := YMLList{} + err = yaml.Unmarshal(content, &ymlTree) + if err != nil { + return nil, err + } + + tb := NewACLListStorageBuilder(NewKeychain()) + tb.Parse(&ymlTree) + + return tb, nil +} + +func (t *ACLListStorageBuilder) createRaw(rec *aclpb.Record) *aclpb.RawRecord { + aclMarshaled, err := proto.Marshal(rec) + if err != nil { + panic("should be able to marshal final acl message!") + } + + signature, err := t.keychain.SigningKeysByIdentity[rec.Identity].Sign(aclMarshaled) + if err != nil { + panic("should be able to sign final acl message!") + } + + id, _ := cid.NewCIDFromBytes(aclMarshaled) + + return &aclpb.RawRecord{ + Payload: aclMarshaled, + Signature: signature, + Id: id, + } +} + +func (t *ACLListStorageBuilder) getRecord(idx int) *aclpb.RawRecord { + return t.rawRecords[idx] +} + +func (t *ACLListStorageBuilder) Head() (*aclpb.RawRecord, error) { + return t.getRecord(len(t.records) - 1), nil +} + +func (t *ACLListStorageBuilder) Header() (*aclpb.Header, error) { + return t.header, nil +} + +func (t *ACLListStorageBuilder) GetRecord(ctx context.Context, id string) (*aclpb.RawRecord, error) { + recIdx, ok := t.indexes[id] + if !ok { + return nil, fmt.Errorf("no such record") + } + return t.getRecord(recIdx), nil +} + +func (t *ACLListStorageBuilder) AddRecord(ctx context.Context, rec *aclpb.Record) error { + panic("implement me") +} + +func (t *ACLListStorageBuilder) ID() string { + return t.id +} + +func (t *ACLListStorageBuilder) GetKeychain() *Keychain { + return t.keychain +} + +func (t *ACLListStorageBuilder) Parse(tree *YMLList) { + // Just to clarify - we are generating new identities for the ones that + // are specified in the yml file, because our identities should be Ed25519 + // the same thing is happening for the encryption keys + t.keychain.ParseKeys(&tree.Keys) + prevId := "" + for idx, rec := range tree.Records { + newRecord := t.parseRecord(rec, prevId) + rawRecord := t.createRaw(newRecord) + t.records = append(t.records, newRecord) + t.rawRecords = append(t.rawRecords, t.createRaw(newRecord)) + t.indexes[rawRecord.Id] = idx + prevId = rawRecord.Id + } + + t.createHeaderAndId() +} + +func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclpb.Record { + k := t.keychain.GetKey(rec.ReadKey).(*SymKey) + var aclChangeContents []*aclpb.ACLChangeACLContentValue + for _, ch := range rec.AclChanges { + aclChangeContent := t.parseACLChange(ch) + aclChangeContents = append(aclChangeContents, aclChangeContent) + } + data := &aclpb.ACLChangeACLData{ + AclContent: aclChangeContents, + } + bytes, _ := data.Marshal() + + return &aclpb.Record{ + PrevId: prevId, + Identity: t.keychain.GetIdentity(rec.Identity), + Data: bytes, + CurrentReadKeyHash: k.Hash, + Timestamp: time.Now().Unix(), + } +} + +func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLChangeACLContentValue) { + switch { + case ch.UserAdd != nil: + add := ch.UserAdd + + encKey := t.keychain. + GetKey(add.EncryptionKey).(encryptionkey.PrivKey) + rawKey, _ := encKey.GetPublic().Raw() + + convCh = &aclpb.ACLChangeACLContentValue{ + Value: &aclpb.ACLChangeACLContentValueValueOfUserAdd{ + UserAdd: &aclpb.ACLChangeUserAdd{ + Identity: t.keychain.GetIdentity(add.Identity), + EncryptionKey: rawKey, + EncryptedReadKeys: t.encryptReadKeys(add.EncryptedReadKeys, encKey), + Permissions: t.convertPermission(add.Permission), + }, + }, + } + case ch.UserJoin != nil: + join := ch.UserJoin + + encKey := t.keychain. + GetKey(join.EncryptionKey).(encryptionkey.PrivKey) + rawKey, _ := encKey.GetPublic().Raw() + + idKey, _ := t.keychain.SigningKeys[join.Identity].GetPublic().Raw() + signKey := t.keychain.GetKey(join.AcceptSignature).(signingkey.PrivKey) + signature, err := signKey.Sign(idKey) + if err != nil { + panic(err) + } + + convCh = &aclpb.ACLChangeACLContentValue{ + Value: &aclpb.ACLChangeACLContentValueValueOfUserJoin{ + UserJoin: &aclpb.ACLChangeUserJoin{ + Identity: t.keychain.GetIdentity(join.Identity), + EncryptionKey: rawKey, + AcceptSignature: signature, + UserInviteId: join.InviteId, + EncryptedReadKeys: t.encryptReadKeys(join.EncryptedReadKeys, encKey), + }, + }, + } + case ch.UserInvite != nil: + invite := ch.UserInvite + rawAcceptKey, _ := t.keychain.GetKey(invite.AcceptKey).(signingkey.PrivKey).GetPublic().Raw() + encKey := t.keychain. + GetKey(invite.EncryptionKey).(encryptionkey.PrivKey) + rawEncKey, _ := encKey.GetPublic().Raw() + + convCh = &aclpb.ACLChangeACLContentValue{ + Value: &aclpb.ACLChangeACLContentValueValueOfUserInvite{ + UserInvite: &aclpb.ACLChangeUserInvite{ + AcceptPublicKey: rawAcceptKey, + EncryptPublicKey: rawEncKey, + EncryptedReadKeys: t.encryptReadKeys(invite.EncryptedReadKeys, encKey), + Permissions: t.convertPermission(invite.Permissions), + InviteId: invite.InviteId, + }, + }, + } + case ch.UserConfirm != nil: + confirm := ch.UserConfirm + + convCh = &aclpb.ACLChangeACLContentValue{ + Value: &aclpb.ACLChangeACLContentValueValueOfUserConfirm{ + UserConfirm: &aclpb.ACLChangeUserConfirm{ + Identity: t.keychain.GetIdentity(confirm.Identity), + UserAddId: confirm.UserAddId, + }, + }, + } + case ch.UserPermissionChange != nil: + permissionChange := ch.UserPermissionChange + + convCh = &aclpb.ACLChangeACLContentValue{ + Value: &aclpb.ACLChangeACLContentValueValueOfUserPermissionChange{ + UserPermissionChange: &aclpb.ACLChangeUserPermissionChange{ + Identity: t.keychain.GetIdentity(permissionChange.Identity), + Permissions: t.convertPermission(permissionChange.Permission), + }, + }, + } + case ch.UserRemove != nil: + remove := ch.UserRemove + + newReadKey := t.keychain.GetKey(remove.NewReadKey).(*SymKey) + + var replaces []*aclpb.ACLChangeReadKeyReplace + for _, id := range remove.IdentitiesLeft { + identity := t.keychain.GetIdentity(id) + encKey := t.keychain.EncryptionKeys[id] + rawEncKey, _ := encKey.GetPublic().Raw() + encReadKey, err := encKey.GetPublic().Encrypt(newReadKey.Key.Bytes()) + if err != nil { + panic(err) + } + replaces = append(replaces, &aclpb.ACLChangeReadKeyReplace{ + Identity: identity, + EncryptionKey: rawEncKey, + EncryptedReadKey: encReadKey, + }) + } + + convCh = &aclpb.ACLChangeACLContentValue{ + Value: &aclpb.ACLChangeACLContentValueValueOfUserRemove{ + UserRemove: &aclpb.ACLChangeUserRemove{ + Identity: t.keychain.GetIdentity(remove.RemovedIdentity), + ReadKeyReplaces: replaces, + }, + }, + } + } + if convCh == nil { + panic("cannot have empty acl change") + } + + return convCh +} + +func (t *ACLListStorageBuilder) encryptReadKeys(keys []string, encKey encryptionkey.PrivKey) (enc [][]byte) { + for _, k := range keys { + realKey := t.keychain.GetKey(k).(*SymKey).Key.Bytes() + res, err := encKey.GetPublic().Encrypt(realKey) + if err != nil { + panic(err) + } + + enc = append(enc, res) + } + return +} + +func (t *ACLListStorageBuilder) convertPermission(perm string) aclpb.ACLChangeUserPermissions { + switch perm { + case "admin": + return aclpb.ACLChange_Admin + case "writer": + return aclpb.ACLChange_Writer + case "reader": + return aclpb.ACLChange_Reader + default: + panic(fmt.Sprintf("incorrect permission: %s", perm)) + } +} + +func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclpb.Record, id string) error) (err error) { + for i := len(t.records) - 1; i >= 0; i-- { + err = f(t.records[i], t.rawRecords[i].Id) + if err != nil { + return err + } + } + return nil +} + +func (t *ACLListStorageBuilder) createHeaderAndId() { + t.header = &aclpb.Header{ + FirstId: t.rawRecords[0].Id, + AclListId: "", + WorkspaceId: "", + DocType: aclpb.Header_ACL, + } + bytes, _ := t.header.Marshal() + id, _ := cid.NewCIDFromBytes(bytes) + t.id = id +} diff --git a/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph.go b/pkg/acl/testutils/acllistbuilder/treestoragebuildergraph.go similarity index 72% rename from pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph.go rename to pkg/acl/testutils/acllistbuilder/treestoragebuildergraph.go index 11c6609d..ae4f1027 100644 --- a/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph.go +++ b/pkg/acl/testutils/acllistbuilder/treestoragebuildergraph.go @@ -2,10 +2,10 @@ // +build !linux,!darwin android ios nographviz // +build !amd64 -package treestoragebuilder +package acllistbuilder import "fmt" -func (t *TreeStorageBuilder) Graph() (string, error) { +func (t *ACLListStorageBuilder) Graph() (string, error) { return "", fmt.Errorf("building graphs is not supported") } diff --git a/pkg/acl/testutils/acllistbuilder/treestoragebuildergraph_nix.go b/pkg/acl/testutils/acllistbuilder/treestoragebuildergraph_nix.go new file mode 100644 index 00000000..b637827f --- /dev/null +++ b/pkg/acl/testutils/acllistbuilder/treestoragebuildergraph_nix.go @@ -0,0 +1,121 @@ +//go:build (linux || darwin) && !android && !ios && !nographviz && (amd64 || arm64) +// +build linux darwin +// +build !android +// +build !ios +// +build !nographviz +// +build amd64 arm64 + +package acllistbuilder + +import ( + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + + "github.com/gogo/protobuf/proto" + "strings" + "unicode" + + "github.com/awalterschulze/gographviz" +) + +// To quickly look at visualized string you can use https://dreampuf.github.io/GraphvizOnline + +type EdgeParameters struct { + style string + color string + label string +} + +func (t *ACLListStorageBuilder) Graph() (string, error) { + // TODO: check updates on https://github.com/goccy/go-graphviz/issues/52 or make a fix yourself to use better library here + graph := gographviz.NewGraph() + graph.SetName("G") + graph.SetDir(true) + var nodes = make(map[string]struct{}) + + var addNodes = func(r *aclpb.Record, id string) error { + style := "solid" + + var chSymbs []string + aclData := &aclpb.ACLChangeACLData{} + err := proto.Unmarshal(r.GetData(), aclData) + if err != nil { + return err + } + + for _, chc := range aclData.AclContent { + tp := fmt.Sprintf("%T", chc.Value) + tp = strings.Replace(tp, "ACLChangeACLContentValueValueOf", "", 1) + res := "" + for _, ts := range tp { + if unicode.IsUpper(ts) { + res += string(ts) + } + } + chSymbs = append(chSymbs, res) + } + + shortId := id + label := fmt.Sprintf("Id: %s\nChanges: %s\n", + shortId, + strings.Join(chSymbs, ","), + ) + e := graph.AddNode("G", "\""+id+"\"", map[string]string{ + "label": "\"" + label + "\"", + "style": "\"" + style + "\"", + }) + if e != nil { + return e + } + nodes[id] = struct{}{} + return nil + } + + var createEdge = func(firstId, secondId string, params EdgeParameters) error { + _, exists := nodes[firstId] + if !exists { + return fmt.Errorf("no such node") + } + _, exists = nodes[secondId] + if !exists { + return fmt.Errorf("no previous node") + } + + err := graph.AddEdge("\""+firstId+"\"", "\""+secondId+"\"", true, map[string]string{ + "color": params.color, + "style": params.style, + }) + if err != nil { + return err + } + + return nil + } + + var addLinks = func(r *aclpb.Record, id string) error { + if r.PrevId == "" { + return nil + } + err := createEdge(id, r.PrevId, EdgeParameters{ + style: "dashed", + color: "red", + }) + if err != nil { + return err + } + + return nil + } + + err := t.traverseFromHead(addNodes) + if err != nil { + return "", err + } + + err = t.traverseFromHead(addLinks) + if err != nil { + return "", err + } + + return graph.String(), nil +} diff --git a/pkg/acl/testutils/treestoragebuilder/ymlentities.go b/pkg/acl/testutils/acllistbuilder/ymlentities.go similarity index 50% rename from pkg/acl/testutils/treestoragebuilder/ymlentities.go rename to pkg/acl/testutils/acllistbuilder/ymlentities.go index 0a873d99..471155c1 100644 --- a/pkg/acl/testutils/treestoragebuilder/ymlentities.go +++ b/pkg/acl/testutils/acllistbuilder/ymlentities.go @@ -1,8 +1,4 @@ -package treestoragebuilder - -type TreeDescription struct { - Author string `yaml:"author"` -} +package acllistbuilder type Keys struct { Enc []string `yaml:"Enc"` @@ -10,20 +6,6 @@ type Keys struct { Read []string `yaml:"Read"` } -type ACLSnapshot struct { - UserStates []struct { - Identity string `yaml:"identity"` - EncryptionKey string `yaml:"encryptionKey"` - EncryptedReadKeys []string `yaml:"encryptedReadKeys"` - Permissions string `yaml:"permission"` - IsConfirmed bool `yaml:"isConfirmed"` - } `yaml:"userStates"` -} - -type PlainTextSnapshot struct { - Text string `yaml:"text"` -} - type ACLChange struct { UserAdd *struct { Identity string `yaml:"identity"` @@ -65,28 +47,9 @@ type ACLChange struct { } } -type PlainTextChange struct { - TextAppend *struct { - Text string `yaml:"text"` - } `yaml:"textAppend"` -} - -type GraphNode struct { - Id string `yaml:"id"` - BaseSnapshot string `yaml:"baseSnapshot"` - AclSnapshot string `yaml:"aclSnapshot"` - ACLHeads []string `yaml:"aclHeads"` - TreeHeads []string `yaml:"treeHeads"` -} - -type Change struct { - Id string `yaml:"id"` - Identity string `yaml:"identity"` - - AclSnapshot *ACLSnapshot `yaml:"aclSnapshot"` - Snapshot *PlainTextSnapshot `yaml:"snapshot"` - AclChanges []*ACLChange `yaml:"aclChanges"` - Changes []*PlainTextChange `yaml:"changes"` +type Record struct { + Identity string `yaml:"identity"` + AclChanges []*ACLChange `yaml:"aclChanges"` ReadKey string `yaml:"readKey"` } @@ -96,22 +59,8 @@ type Header struct { IsWorkspace bool `yaml:"isWorkspace"` } -type Update struct { - UseCase string `yaml:"useCase"` - Changes []*Change `yaml:"changes"` - Graph []*GraphNode `yaml:"graph"` -} - -type YMLTree struct { - Description *TreeDescription `yaml:"tree"` - Changes []*Change `yaml:"changes"` - Updates []*Update `yaml:"updates"` +type YMLList struct { + Records []*Record `yaml:"records"` Keys Keys `yaml:"keys"` - - Graph []*GraphNode `yaml:"graph"` - - Heads []string `yaml:"heads"` - Orphans []string `yaml:"orphans"` - Header *Header `yaml:"header"` } diff --git a/pkg/acl/testutils/treestoragebuilder/ymlentities_test.go b/pkg/acl/testutils/acllistbuilder/ymlentities_test.go similarity index 51% rename from pkg/acl/testutils/treestoragebuilder/ymlentities_test.go rename to pkg/acl/testutils/acllistbuilder/ymlentities_test.go index 2ae2e716..28780446 100644 --- a/pkg/acl/testutils/treestoragebuilder/ymlentities_test.go +++ b/pkg/acl/testutils/acllistbuilder/ymlentities_test.go @@ -1,4 +1,4 @@ -package treestoragebuilder +package acllistbuilder import ( "fmt" @@ -6,7 +6,7 @@ import ( ) func Test_YamlParse(t *testing.T) { - tb, _ := NewTreeStorageBuilderWithTestName("userjoinexampleupdate.yml") + tb, _ := NewACLListStorageBuilderWithTestName("userjoinexampleupdate.yml") gr, _ := tb.Graph() fmt.Println(gr) } diff --git a/pkg/acl/testutils/testchanges/testchangepb/protos/testdocumentchanges.proto b/pkg/acl/testutils/testchanges/testchangepb/protos/testdocumentchanges.proto deleted file mode 100644 index 59a97c38..00000000 --- a/pkg/acl/testutils/testchanges/testchangepb/protos/testdocumentchanges.proto +++ /dev/null @@ -1,26 +0,0 @@ -syntax = "proto3"; -package anytype; -option go_package = "testchangepb"; - -// TODO: move to separate package - -message PlainTextChange { - message Content { - oneof value { - TextAppend textAppend = 1; - } - } - - message TextAppend { - string text = 1; - } - - message Snapshot { - string text = 1; - } - - message Data { - repeated Content content = 1; - Snapshot snapshot = 2; - } -} diff --git a/pkg/acl/testutils/testchanges/testchangepb/testdocumentchanges.pb.go b/pkg/acl/testutils/testchanges/testchangepb/testdocumentchanges.pb.go deleted file mode 100644 index 874061c6..00000000 --- a/pkg/acl/testutils/testchanges/testchangepb/testdocumentchanges.pb.go +++ /dev/null @@ -1,1089 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: pkg/acl/testutils/testchanges/testchangepb/protos/testdocumentchanges.proto - -package testchangepb - -import ( - fmt "fmt" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type PlainTextChange struct { -} - -func (m *PlainTextChange) Reset() { *m = PlainTextChange{} } -func (m *PlainTextChange) String() string { return proto.CompactTextString(m) } -func (*PlainTextChange) ProtoMessage() {} -func (*PlainTextChange) Descriptor() ([]byte, []int) { - return fileDescriptor_c07268f9f08f2beb, []int{0} -} -func (m *PlainTextChange) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PlainTextChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PlainTextChange.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 *PlainTextChange) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChange.Merge(m, src) -} -func (m *PlainTextChange) XXX_Size() int { - return m.Size() -} -func (m *PlainTextChange) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChange.DiscardUnknown(m) -} - -var xxx_messageInfo_PlainTextChange proto.InternalMessageInfo - -type PlainTextChangeContent struct { - // Types that are valid to be assigned to Value: - // *PlainTextChangeContentValueOfTextAppend - Value IsPlainTextChangeContentValue `protobuf_oneof:"value"` -} - -func (m *PlainTextChangeContent) Reset() { *m = PlainTextChangeContent{} } -func (m *PlainTextChangeContent) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeContent) ProtoMessage() {} -func (*PlainTextChangeContent) Descriptor() ([]byte, []int) { - return fileDescriptor_c07268f9f08f2beb, []int{0, 0} -} -func (m *PlainTextChangeContent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PlainTextChangeContent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PlainTextChangeContent.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 *PlainTextChangeContent) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeContent.Merge(m, src) -} -func (m *PlainTextChangeContent) XXX_Size() int { - return m.Size() -} -func (m *PlainTextChangeContent) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeContent.DiscardUnknown(m) -} - -var xxx_messageInfo_PlainTextChangeContent proto.InternalMessageInfo - -type IsPlainTextChangeContentValue interface { - IsPlainTextChangeContentValue() - MarshalTo([]byte) (int, error) - Size() int -} - -type PlainTextChangeContentValueOfTextAppend struct { - TextAppend *PlainTextChangeTextAppend `protobuf:"bytes,1,opt,name=textAppend,proto3,oneof" json:"textAppend,omitempty"` -} - -func (*PlainTextChangeContentValueOfTextAppend) IsPlainTextChangeContentValue() {} - -func (m *PlainTextChangeContent) GetValue() IsPlainTextChangeContentValue { - if m != nil { - return m.Value - } - return nil -} - -func (m *PlainTextChangeContent) GetTextAppend() *PlainTextChangeTextAppend { - if x, ok := m.GetValue().(*PlainTextChangeContentValueOfTextAppend); ok { - return x.TextAppend - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*PlainTextChangeContent) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*PlainTextChangeContentValueOfTextAppend)(nil), - } -} - -type PlainTextChangeTextAppend struct { - Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` -} - -func (m *PlainTextChangeTextAppend) Reset() { *m = PlainTextChangeTextAppend{} } -func (m *PlainTextChangeTextAppend) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeTextAppend) ProtoMessage() {} -func (*PlainTextChangeTextAppend) Descriptor() ([]byte, []int) { - return fileDescriptor_c07268f9f08f2beb, []int{0, 1} -} -func (m *PlainTextChangeTextAppend) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PlainTextChangeTextAppend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PlainTextChangeTextAppend.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 *PlainTextChangeTextAppend) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeTextAppend.Merge(m, src) -} -func (m *PlainTextChangeTextAppend) XXX_Size() int { - return m.Size() -} -func (m *PlainTextChangeTextAppend) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeTextAppend.DiscardUnknown(m) -} - -var xxx_messageInfo_PlainTextChangeTextAppend proto.InternalMessageInfo - -func (m *PlainTextChangeTextAppend) GetText() string { - if m != nil { - return m.Text - } - return "" -} - -type PlainTextChangeSnapshot struct { - Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` -} - -func (m *PlainTextChangeSnapshot) Reset() { *m = PlainTextChangeSnapshot{} } -func (m *PlainTextChangeSnapshot) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeSnapshot) ProtoMessage() {} -func (*PlainTextChangeSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_c07268f9f08f2beb, []int{0, 2} -} -func (m *PlainTextChangeSnapshot) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PlainTextChangeSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PlainTextChangeSnapshot.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 *PlainTextChangeSnapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeSnapshot.Merge(m, src) -} -func (m *PlainTextChangeSnapshot) XXX_Size() int { - return m.Size() -} -func (m *PlainTextChangeSnapshot) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeSnapshot.DiscardUnknown(m) -} - -var xxx_messageInfo_PlainTextChangeSnapshot proto.InternalMessageInfo - -func (m *PlainTextChangeSnapshot) GetText() string { - if m != nil { - return m.Text - } - return "" -} - -type PlainTextChangeData struct { - Content []*PlainTextChangeContent `protobuf:"bytes,1,rep,name=content,proto3" json:"content,omitempty"` - Snapshot *PlainTextChangeSnapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` -} - -func (m *PlainTextChangeData) Reset() { *m = PlainTextChangeData{} } -func (m *PlainTextChangeData) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeData) ProtoMessage() {} -func (*PlainTextChangeData) Descriptor() ([]byte, []int) { - return fileDescriptor_c07268f9f08f2beb, []int{0, 3} -} -func (m *PlainTextChangeData) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PlainTextChangeData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PlainTextChangeData.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 *PlainTextChangeData) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeData.Merge(m, src) -} -func (m *PlainTextChangeData) XXX_Size() int { - return m.Size() -} -func (m *PlainTextChangeData) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeData.DiscardUnknown(m) -} - -var xxx_messageInfo_PlainTextChangeData proto.InternalMessageInfo - -func (m *PlainTextChangeData) GetContent() []*PlainTextChangeContent { - if m != nil { - return m.Content - } - return nil -} - -func (m *PlainTextChangeData) GetSnapshot() *PlainTextChangeSnapshot { - if m != nil { - return m.Snapshot - } - return nil -} - -func init() { - proto.RegisterType((*PlainTextChange)(nil), "anytype.PlainTextChange") - proto.RegisterType((*PlainTextChangeContent)(nil), "anytype.PlainTextChange.Content") - proto.RegisterType((*PlainTextChangeTextAppend)(nil), "anytype.PlainTextChange.TextAppend") - proto.RegisterType((*PlainTextChangeSnapshot)(nil), "anytype.PlainTextChange.Snapshot") - proto.RegisterType((*PlainTextChangeData)(nil), "anytype.PlainTextChange.Data") -} - -func init() { - proto.RegisterFile("pkg/acl/testutils/testchanges/testchangepb/protos/testdocumentchanges.proto", fileDescriptor_c07268f9f08f2beb) -} - -var fileDescriptor_c07268f9f08f2beb = []byte{ - // 278 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xf2, 0x2e, 0xc8, 0x4e, 0xd7, - 0x4f, 0x4c, 0xce, 0xd1, 0x2f, 0x49, 0x2d, 0x2e, 0x29, 0x2d, 0xc9, 0xcc, 0x29, 0x06, 0xb3, 0x92, - 0x33, 0x12, 0xf3, 0xd2, 0x53, 0x91, 0xd9, 0x05, 0x49, 0xfa, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x10, - 0xb1, 0x94, 0xfc, 0xe4, 0xd2, 0xdc, 0xd4, 0x3c, 0x98, 0x3a, 0x3d, 0xb0, 0x94, 0x10, 0x7b, 0x62, - 0x5e, 0x65, 0x49, 0x65, 0x41, 0xaa, 0xd2, 0x26, 0x26, 0x2e, 0xfe, 0x80, 0x9c, 0xc4, 0xcc, 0xbc, - 0x90, 0xd4, 0x8a, 0x12, 0x67, 0xb0, 0x1a, 0xa9, 0x48, 0x2e, 0x76, 0xe7, 0xfc, 0xbc, 0x92, 0xd4, - 0xbc, 0x12, 0x21, 0x57, 0x2e, 0xae, 0x92, 0xd4, 0x8a, 0x12, 0xc7, 0x82, 0x82, 0xd4, 0xbc, 0x14, - 0x09, 0x46, 0x05, 0x46, 0x0d, 0x6e, 0x23, 0x65, 0x3d, 0xa8, 0x66, 0x3d, 0x34, 0x8d, 0x7a, 0x21, - 0x70, 0xa5, 0x1e, 0x0c, 0x41, 0x48, 0x1a, 0x9d, 0xd8, 0xb9, 0x58, 0xcb, 0x12, 0x73, 0x4a, 0x53, - 0xa5, 0x14, 0xb8, 0xb8, 0x10, 0x8a, 0x84, 0x84, 0xb8, 0x58, 0x40, 0x8a, 0xc0, 0xe6, 0x72, 0x06, - 0x81, 0xd9, 0x52, 0x72, 0x5c, 0x1c, 0xc1, 0x79, 0x89, 0x05, 0xc5, 0x19, 0xf9, 0x25, 0x58, 0xe5, - 0x1b, 0x19, 0xb9, 0x58, 0x5c, 0x12, 0x4b, 0x12, 0x85, 0xac, 0xb8, 0xd8, 0x93, 0x21, 0xae, 0x94, - 0x60, 0x54, 0x60, 0xd6, 0xe0, 0x36, 0x52, 0xc0, 0xe9, 0x2e, 0xa8, 0x6f, 0x82, 0x60, 0x1a, 0x84, - 0x6c, 0xb9, 0x38, 0x8a, 0xa1, 0x96, 0x48, 0x30, 0x81, 0x3d, 0xa5, 0x88, 0x53, 0x33, 0xcc, 0x35, - 0x41, 0x70, 0x2d, 0x4e, 0x6a, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, - 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0xc5, - 0x83, 0x1c, 0x0d, 0x49, 0x6c, 0xe0, 0xc0, 0x36, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x73, - 0xe1, 0xf2, 0xbb, 0x01, 0x00, 0x00, -} - -func (m *PlainTextChange) 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 *PlainTextChange) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PlainTextChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *PlainTextChangeContent) 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 *PlainTextChangeContent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PlainTextChangeContent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Value != nil { - { - size := m.Value.Size() - i -= size - if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *PlainTextChangeContentValueOfTextAppend) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PlainTextChangeContentValueOfTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TextAppend != nil { - { - size, err := m.TextAppend.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTestdocumentchanges(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} -func (m *PlainTextChangeTextAppend) 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 *PlainTextChangeTextAppend) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PlainTextChangeTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Text) > 0 { - i -= len(m.Text) - copy(dAtA[i:], m.Text) - i = encodeVarintTestdocumentchanges(dAtA, i, uint64(len(m.Text))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *PlainTextChangeSnapshot) 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 *PlainTextChangeSnapshot) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PlainTextChangeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Text) > 0 { - i -= len(m.Text) - copy(dAtA[i:], m.Text) - i = encodeVarintTestdocumentchanges(dAtA, i, uint64(len(m.Text))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *PlainTextChangeData) 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 *PlainTextChangeData) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PlainTextChangeData) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Snapshot != nil { - { - size, err := m.Snapshot.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTestdocumentchanges(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Content) > 0 { - for iNdEx := len(m.Content) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Content[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTestdocumentchanges(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintTestdocumentchanges(dAtA []byte, offset int, v uint64) int { - offset -= sovTestdocumentchanges(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *PlainTextChange) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *PlainTextChangeContent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != nil { - n += m.Value.Size() - } - return n -} - -func (m *PlainTextChangeContentValueOfTextAppend) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TextAppend != nil { - l = m.TextAppend.Size() - n += 1 + l + sovTestdocumentchanges(uint64(l)) - } - return n -} -func (m *PlainTextChangeTextAppend) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Text) - if l > 0 { - n += 1 + l + sovTestdocumentchanges(uint64(l)) - } - return n -} - -func (m *PlainTextChangeSnapshot) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Text) - if l > 0 { - n += 1 + l + sovTestdocumentchanges(uint64(l)) - } - return n -} - -func (m *PlainTextChangeData) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Content) > 0 { - for _, e := range m.Content { - l = e.Size() - n += 1 + l + sovTestdocumentchanges(uint64(l)) - } - } - if m.Snapshot != nil { - l = m.Snapshot.Size() - n += 1 + l + sovTestdocumentchanges(uint64(l)) - } - return n -} - -func sovTestdocumentchanges(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozTestdocumentchanges(x uint64) (n int) { - return sovTestdocumentchanges(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *PlainTextChange) 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 ErrIntOverflowTestdocumentchanges - } - 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: PlainTextChange: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PlainTextChange: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTestdocumentchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTestdocumentchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PlainTextChangeContent) 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 ErrIntOverflowTestdocumentchanges - } - 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: Content: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Content: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TextAppend", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTestdocumentchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTestdocumentchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTestdocumentchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PlainTextChangeTextAppend{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &PlainTextChangeContentValueOfTextAppend{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTestdocumentchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTestdocumentchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PlainTextChangeTextAppend) 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 ErrIntOverflowTestdocumentchanges - } - 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: TextAppend: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TextAppend: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Text", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTestdocumentchanges - } - 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 ErrInvalidLengthTestdocumentchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTestdocumentchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Text = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTestdocumentchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTestdocumentchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PlainTextChangeSnapshot) 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 ErrIntOverflowTestdocumentchanges - } - 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: Snapshot: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Snapshot: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Text", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTestdocumentchanges - } - 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 ErrInvalidLengthTestdocumentchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTestdocumentchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Text = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTestdocumentchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTestdocumentchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PlainTextChangeData) 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 ErrIntOverflowTestdocumentchanges - } - 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: Data: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Data: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Content", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTestdocumentchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTestdocumentchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTestdocumentchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Content = append(m.Content, &PlainTextChangeContent{}) - if err := m.Content[len(m.Content)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Snapshot", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTestdocumentchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTestdocumentchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTestdocumentchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Snapshot == nil { - m.Snapshot = &PlainTextChangeSnapshot{} - } - if err := m.Snapshot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTestdocumentchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTestdocumentchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipTestdocumentchanges(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTestdocumentchanges - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTestdocumentchanges - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTestdocumentchanges - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthTestdocumentchanges - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTestdocumentchanges - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTestdocumentchanges - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTestdocumentchanges = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTestdocumentchanges = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTestdocumentchanges = fmt.Errorf("proto: unexpected end of group") -) diff --git a/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go b/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go deleted file mode 100644 index f7bb65bd..00000000 --- a/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go +++ /dev/null @@ -1,539 +0,0 @@ -package treestoragebuilder - -import ( - "context" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - testpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/yamltests" - storagepb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" - "io/ioutil" - "path" - - "github.com/gogo/protobuf/proto" - "gopkg.in/yaml.v3" -) - -const plainTextDocType uint16 = 1 - -type treeChange struct { - *aclpb.ACLChange - id string - readKey *SymKey - signKey signingkey.PrivKey - - changesDataDecrypted []byte -} - -type updateUseCase struct { - changes map[string]*treeChange -} - -type TreeStorageBuilder struct { - treeId string - allChanges map[string]*treeChange - updates map[string]*updateUseCase - heads []string - orphans []string - keychain *Keychain - header *storagepb.TreeHeader -} - -func NewTreeStorageBuilder(keychain *Keychain) *TreeStorageBuilder { - return &TreeStorageBuilder{ - allChanges: make(map[string]*treeChange), - updates: make(map[string]*updateUseCase), - keychain: keychain, - } -} - -func NewTreeStorageBuilderWithTestName(name string) (*TreeStorageBuilder, error) { - filePath := path.Join(yamltests.Path(), name) - return NewTreeStorageBuilderFromFile(filePath) -} - -func NewTreeStorageBuilderFromFile(file string) (*TreeStorageBuilder, error) { - content, err := ioutil.ReadFile(file) - if err != nil { - return nil, err - } - - ymlTree := YMLTree{} - err = yaml.Unmarshal(content, &ymlTree) - if err != nil { - return nil, err - } - - tb := NewTreeStorageBuilder(NewKeychain()) - tb.Parse(&ymlTree) - - return tb, nil -} - -func (t *TreeStorageBuilder) TreeID() (string, error) { - return t.treeId, nil -} - -func (t *TreeStorageBuilder) GetKeychain() *Keychain { - return t.keychain -} - -func (t *TreeStorageBuilder) Heads() ([]string, error) { - return t.heads, nil -} - -func (t *TreeStorageBuilder) AddRawChange(change *aclpb.RawChange) error { - aclChange := new(aclpb.ACLChange) - var err error - - if err = proto.Unmarshal(change.Payload, aclChange); err != nil { - return fmt.Errorf("could not unmarshall changes") - } - var changesData []byte - - // get correct readkey - readKey := t.keychain.ReadKeysByHash[aclChange.CurrentReadKeyHash] - if aclChange.ChangesData != nil { - changesData, err = readKey.Key.Decrypt(aclChange.ChangesData) - if err != nil { - return fmt.Errorf("failed to decrypt changes data: %w", err) - } - } - - // get correct signing key - signKey := t.keychain.SigningKeysByIdentity[aclChange.Identity] - - t.allChanges[change.Id] = &treeChange{ - ACLChange: aclChange, - id: change.Id, - readKey: readKey, - signKey: signKey, - changesDataDecrypted: changesData, - } - return nil -} - -func (t *TreeStorageBuilder) AddOrphans(orphans ...string) error { - t.orphans = append(t.orphans, orphans...) - return nil -} - -func (t *TreeStorageBuilder) AddChange(change aclchanges.Change) error { - aclChange := change.ProtoChange() - var err error - var changesData []byte - - // get correct readkey - readKey := t.keychain.ReadKeysByHash[aclChange.CurrentReadKeyHash] - if aclChange.ChangesData != nil { - changesData, err = readKey.Key.Decrypt(aclChange.ChangesData) - if err != nil { - return fmt.Errorf("failed to decrypt changes data: %w", err) - } - } - - // get correct signing key - signKey := t.keychain.SigningKeysByIdentity[aclChange.Identity] - - t.allChanges[change.CID()] = &treeChange{ - ACLChange: aclChange, - id: change.CID(), - readKey: readKey, - signKey: signKey, - changesDataDecrypted: changesData, - } - return nil -} - -func (t *TreeStorageBuilder) Orphans() ([]string, error) { - return t.orphans, nil -} - -func (t *TreeStorageBuilder) SetHeads(heads []string) error { - // we should copy here instead of just setting the value - t.heads = heads - return nil -} - -func (t *TreeStorageBuilder) RemoveOrphans(orphans ...string) error { - t.orphans = slice.Difference(t.orphans, orphans) - return nil -} - -func (t *TreeStorageBuilder) GetChange(ctx context.Context, recordID string) (*aclpb.RawChange, error) { - return t.getChange(recordID, t.allChanges), nil -} - -func (t *TreeStorageBuilder) GetUpdates(useCase string) []*aclpb.RawChange { - var res []*aclpb.RawChange - update := t.updates[useCase] - for _, ch := range update.changes { - rawCh := t.getChange(ch.id, update.changes) - res = append(res, rawCh) - } - return res -} - -func (t *TreeStorageBuilder) Header() (*storagepb.TreeHeader, error) { - return t.header, nil -} - -func (t *TreeStorageBuilder) getChange(changeId string, m map[string]*treeChange) *aclpb.RawChange { - rec := m[changeId] - - if rec.changesDataDecrypted != nil { - encrypted, err := rec.readKey.Key.Encrypt(rec.changesDataDecrypted) - if err != nil { - panic("should be able to encrypt data with read key!") - } - - rec.ChangesData = encrypted - } - - aclMarshaled, err := proto.Marshal(rec.ACLChange) - if err != nil { - panic("should be able to marshal final acl message!") - } - - signature, err := rec.signKey.Sign(aclMarshaled) - if err != nil { - panic("should be able to sign final acl message!") - } - - transformedRec := &aclpb.RawChange{ - Payload: aclMarshaled, - Signature: signature, - Id: changeId, - } - return transformedRec -} - -func (t *TreeStorageBuilder) Parse(tree *YMLTree) { - // Just to clarify - we are generating new identities for the ones that - // are specified in the yml file, because our identities should be Ed25519 - // the same thing is happening for the encryption keys - t.keychain.ParseKeys(&tree.Keys) - t.treeId = t.parseTreeId(tree.Description) - for _, ch := range tree.Changes { - newChange := t.parseChange(ch) - t.allChanges[newChange.id] = newChange - } - - t.parseGraph(tree) - t.parseOrphans(tree) - t.parseHeader(tree) - t.parseUpdates(tree.Updates) -} - -func (t *TreeStorageBuilder) parseChange(ch *Change) *treeChange { - newChange := &treeChange{ - id: ch.Id, - } - k := t.keychain.GetKey(ch.ReadKey).(*SymKey) - newChange.readKey = k - newChange.signKey = t.keychain.SigningKeys[ch.Identity] - aclChange := &aclpb.ACLChange{} - aclChange.Identity = t.keychain.GetIdentity(ch.Identity) - if len(ch.AclChanges) > 0 || ch.AclSnapshot != nil { - aclChange.AclData = &aclpb.ACLChangeACLData{} - if ch.AclSnapshot != nil { - aclChange.AclData.AclSnapshot = t.parseACLSnapshot(ch.AclSnapshot) - } - if ch.AclChanges != nil { - var aclChangeContents []*aclpb.ACLChangeACLContentValue - for _, ch := range ch.AclChanges { - aclChangeContent := t.parseACLChange(ch) - aclChangeContents = append(aclChangeContents, aclChangeContent) - } - aclChange.AclData.AclContent = aclChangeContents - } - } - if len(ch.Changes) > 0 || ch.Snapshot != nil { - changesData := &testpb.PlainTextChangeData{} - if ch.Snapshot != nil { - changesData.Snapshot = t.parseChangeSnapshot(ch.Snapshot) - } - if len(ch.Changes) > 0 { - var changeContents []*testpb.PlainTextChangeContent - for _, ch := range ch.Changes { - aclChangeContent := t.parseDocumentChange(ch) - changeContents = append(changeContents, aclChangeContent) - } - changesData.Content = changeContents - } - m, err := proto.Marshal(changesData) - if err != nil { - return nil - } - newChange.changesDataDecrypted = m - } - aclChange.CurrentReadKeyHash = k.Hash - newChange.ACLChange = aclChange - return newChange -} - -func (t *TreeStorageBuilder) parseTreeId(description *TreeDescription) string { - if description == nil { - panic("no author in tree") - } - return description.Author + ".tree.id" -} - -func (t *TreeStorageBuilder) parseChangeSnapshot(s *PlainTextSnapshot) *testpb.PlainTextChangeSnapshot { - return &testpb.PlainTextChangeSnapshot{ - Text: s.Text, - } -} - -func (t *TreeStorageBuilder) parseACLSnapshot(s *ACLSnapshot) *aclpb.ACLChangeACLSnapshot { - newState := &aclpb.ACLChangeACLState{} - for _, state := range s.UserStates { - aclUserState := &aclpb.ACLChangeUserState{} - aclUserState.Identity = t.keychain.GetIdentity(state.Identity) - - encKey := t.keychain. - GetKey(state.EncryptionKey).(encryptionkey.PrivKey) - rawKey, _ := encKey.GetPublic().Raw() - aclUserState.EncryptionKey = rawKey - - aclUserState.EncryptedReadKeys = t.encryptReadKeys(state.EncryptedReadKeys, encKey) - aclUserState.Permissions = t.convertPermission(state.Permissions) - newState.UserStates = append(newState.UserStates, aclUserState) - } - return &aclpb.ACLChangeACLSnapshot{ - AclState: newState, - } -} - -func (t *TreeStorageBuilder) parseDocumentChange(ch *PlainTextChange) (convCh *testpb.PlainTextChangeContent) { - switch { - case ch.TextAppend != nil: - convCh = &testpb.PlainTextChangeContent{ - Value: &testpb.PlainTextChangeContentValueOfTextAppend{ - TextAppend: &testpb.PlainTextChangeTextAppend{ - Text: ch.TextAppend.Text, - }, - }, - } - } - if convCh == nil { - panic("cannot have empty document change") - } - - return convCh -} - -func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLChangeACLContentValue) { - switch { - case ch.UserAdd != nil: - add := ch.UserAdd - - encKey := t.keychain. - GetKey(add.EncryptionKey).(encryptionkey.PrivKey) - rawKey, _ := encKey.GetPublic().Raw() - - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserAdd{ - UserAdd: &aclpb.ACLChangeUserAdd{ - Identity: t.keychain.GetIdentity(add.Identity), - EncryptionKey: rawKey, - EncryptedReadKeys: t.encryptReadKeys(add.EncryptedReadKeys, encKey), - Permissions: t.convertPermission(add.Permission), - }, - }, - } - case ch.UserJoin != nil: - join := ch.UserJoin - - encKey := t.keychain. - GetKey(join.EncryptionKey).(encryptionkey.PrivKey) - rawKey, _ := encKey.GetPublic().Raw() - - idKey, _ := t.keychain.SigningKeys[join.Identity].GetPublic().Raw() - signKey := t.keychain.GetKey(join.AcceptSignature).(signingkey.PrivKey) - signature, err := signKey.Sign(idKey) - if err != nil { - panic(err) - } - - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserJoin{ - UserJoin: &aclpb.ACLChangeUserJoin{ - Identity: t.keychain.GetIdentity(join.Identity), - EncryptionKey: rawKey, - AcceptSignature: signature, - UserInviteId: join.InviteId, - EncryptedReadKeys: t.encryptReadKeys(join.EncryptedReadKeys, encKey), - }, - }, - } - case ch.UserInvite != nil: - invite := ch.UserInvite - rawAcceptKey, _ := t.keychain.GetKey(invite.AcceptKey).(signingkey.PrivKey).GetPublic().Raw() - encKey := t.keychain. - GetKey(invite.EncryptionKey).(encryptionkey.PrivKey) - rawEncKey, _ := encKey.GetPublic().Raw() - - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserInvite{ - UserInvite: &aclpb.ACLChangeUserInvite{ - AcceptPublicKey: rawAcceptKey, - EncryptPublicKey: rawEncKey, - EncryptedReadKeys: t.encryptReadKeys(invite.EncryptedReadKeys, encKey), - Permissions: t.convertPermission(invite.Permissions), - InviteId: invite.InviteId, - }, - }, - } - case ch.UserConfirm != nil: - confirm := ch.UserConfirm - - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserConfirm{ - UserConfirm: &aclpb.ACLChangeUserConfirm{ - Identity: t.keychain.GetIdentity(confirm.Identity), - UserAddId: confirm.UserAddId, - }, - }, - } - case ch.UserPermissionChange != nil: - permissionChange := ch.UserPermissionChange - - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserPermissionChange{ - UserPermissionChange: &aclpb.ACLChangeUserPermissionChange{ - Identity: t.keychain.GetIdentity(permissionChange.Identity), - Permissions: t.convertPermission(permissionChange.Permission), - }, - }, - } - case ch.UserRemove != nil: - remove := ch.UserRemove - - newReadKey := t.keychain.GetKey(remove.NewReadKey).(*SymKey) - - var replaces []*aclpb.ACLChangeReadKeyReplace - for _, id := range remove.IdentitiesLeft { - identity := t.keychain.GetIdentity(id) - encKey := t.keychain.EncryptionKeys[id] - rawEncKey, _ := encKey.GetPublic().Raw() - encReadKey, err := encKey.GetPublic().Encrypt(newReadKey.Key.Bytes()) - if err != nil { - panic(err) - } - replaces = append(replaces, &aclpb.ACLChangeReadKeyReplace{ - Identity: identity, - EncryptionKey: rawEncKey, - EncryptedReadKey: encReadKey, - }) - } - - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserRemove{ - UserRemove: &aclpb.ACLChangeUserRemove{ - Identity: t.keychain.GetIdentity(remove.RemovedIdentity), - ReadKeyReplaces: replaces, - }, - }, - } - } - if convCh == nil { - panic("cannot have empty acl change") - } - - return convCh -} - -func (t *TreeStorageBuilder) encryptReadKeys(keys []string, encKey encryptionkey.PrivKey) (enc [][]byte) { - for _, k := range keys { - realKey := t.keychain.GetKey(k).(*SymKey).Key.Bytes() - res, err := encKey.GetPublic().Encrypt(realKey) - if err != nil { - panic(err) - } - - enc = append(enc, res) - } - return -} - -func (t *TreeStorageBuilder) convertPermission(perm string) aclpb.ACLChangeUserPermissions { - switch perm { - case "admin": - return aclpb.ACLChange_Admin - case "writer": - return aclpb.ACLChange_Writer - case "reader": - return aclpb.ACLChange_Reader - default: - panic(fmt.Sprintf("incorrect permission: %s", perm)) - } -} - -func (t *TreeStorageBuilder) traverseFromHeads(f func(t *treeChange) error) error { - uniqMap := map[string]struct{}{} - stack := make([]string, len(t.orphans), 10) - copy(stack, t.orphans) - for len(stack) > 0 { - id := stack[len(stack)-1] - stack = stack[:len(stack)-1] - if _, exists := uniqMap[id]; exists { - continue - } - - ch := t.allChanges[id] - uniqMap[id] = struct{}{} - if err := f(ch); err != nil { - return err - } - - for _, prev := range ch.ACLChange.TreeHeadIds { - stack = append(stack, prev) - } - } - return nil -} - -func (t *TreeStorageBuilder) parseUpdates(updates []*Update) { - for _, update := range updates { - useCase := &updateUseCase{ - changes: map[string]*treeChange{}, - } - for _, ch := range update.Changes { - newChange := t.parseChange(ch) - useCase.changes[newChange.id] = newChange - } - for _, node := range update.Graph { - rec := useCase.changes[node.Id] - rec.AclHeadIds = node.ACLHeads - rec.TreeHeadIds = node.TreeHeads - rec.SnapshotBaseId = node.BaseSnapshot - } - - t.updates[update.UseCase] = useCase - } -} - -func (t *TreeStorageBuilder) parseGraph(tree *YMLTree) { - for _, node := range tree.Graph { - rec := t.allChanges[node.Id] - rec.AclHeadIds = node.ACLHeads - rec.TreeHeadIds = node.TreeHeads - rec.SnapshotBaseId = node.BaseSnapshot - } -} - -func (t *TreeStorageBuilder) parseOrphans(tree *YMLTree) { - t.orphans = tree.Orphans -} - -func (t *TreeStorageBuilder) parseHeader(tree *YMLTree) { - t.header = &storagepb.TreeHeader{ - FirstChangeId: tree.Header.FirstChangeId, - IsWorkspace: tree.Header.IsWorkspace, - } -} diff --git a/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go b/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go deleted file mode 100644 index 935fd711..00000000 --- a/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go +++ /dev/null @@ -1,162 +0,0 @@ -//go:build (linux || darwin) && !android && !ios && !nographviz && (amd64 || arm64) -// +build linux darwin -// +build !android -// +build !ios -// +build !nographviz -// +build amd64 arm64 - -package treestoragebuilder - -import ( - "fmt" - testpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" - - "github.com/gogo/protobuf/proto" - "strings" - "unicode" - - "github.com/awalterschulze/gographviz" -) - -// To quickly look at visualized string you can use https://dreampuf.github.io/GraphvizOnline - -type EdgeParameters struct { - style string - color string - label string -} - -func (t *TreeStorageBuilder) Graph() (string, error) { - // TODO: check updates on https://github.com/goccy/go-graphviz/issues/52 or make a fix yourself to use better library here - graph := gographviz.NewGraph() - graph.SetName("G") - graph.SetDir(true) - var nodes = make(map[string]struct{}) - - var addNodes = func(r *treeChange) error { - // TODO: revisit function after checking - - style := "solid" - if r.GetAclData() != nil { - style = "filled" - } else if r.changesDataDecrypted != nil { - style = "dashed" - } - - var chSymbs []string - if r.changesDataDecrypted != nil { - res := &testpb.PlainTextChangeData{} - err := proto.Unmarshal(r.changesDataDecrypted, res) - if err != nil { - return err - } - - for _, chc := range res.Content { - tp := fmt.Sprintf("%T", chc.Value) - tp = strings.Replace(tp, "ChangeContentValueOf", "", 1) - res := "" - for _, ts := range tp { - if unicode.IsUpper(ts) { - res += string(ts) - } - } - chSymbs = append(chSymbs, res) - } - } - if r.GetAclData() != nil { - for _, chc := range r.GetAclData().AclContent { - tp := fmt.Sprintf("%T", chc.Value) - tp = strings.Replace(tp, "ACLChangeACLContentValueValueOf", "", 1) - res := "" - for _, ts := range tp { - if unicode.IsUpper(ts) { - res += string(ts) - } - } - chSymbs = append(chSymbs, res) - } - } - - shortId := r.id - label := fmt.Sprintf("Id: %s\nChanges: %s\n", - shortId, - strings.Join(chSymbs, ","), - ) - e := graph.AddNode("G", "\""+r.id+"\"", map[string]string{ - "label": "\"" + label + "\"", - "style": "\"" + style + "\"", - }) - if e != nil { - return e - } - nodes[r.id] = struct{}{} - return nil - } - - var createEdge = func(firstId, secondId string, params EdgeParameters) error { - _, exists := nodes[firstId] - if !exists { - return fmt.Errorf("no such node") - } - _, exists = nodes[secondId] - if !exists { - return fmt.Errorf("no previous node") - } - - err := graph.AddEdge("\""+firstId+"\"", "\""+secondId+"\"", true, map[string]string{ - "color": params.color, - "style": params.style, - }) - if err != nil { - return err - } - - return nil - } - - var addLinks = func(t *treeChange) error { - for _, prevId := range t.AclHeadIds { - err := createEdge(t.id, prevId, EdgeParameters{ - style: "dashed", - color: "red", - }) - if err != nil { - return err - } - } - - for _, prevId := range t.TreeHeadIds { - err := createEdge(t.id, prevId, EdgeParameters{ - style: "dashed", - color: "blue", - }) - if err != nil { - return err - } - } - - if t.SnapshotBaseId != "" { - err := createEdge(t.id, t.SnapshotBaseId, EdgeParameters{ - style: "bold", - color: "blue", - }) - if err != nil { - return err - } - } - - return nil - } - - err := t.traverseFromHeads(addNodes) - if err != nil { - return "", err - } - - err = t.traverseFromHeads(addLinks) - if err != nil { - return "", err - } - - return graph.String(), nil -} diff --git a/pkg/acl/testutils/yamltests/invalidsnapshotexample.yml b/pkg/acl/testutils/yamltests/invalidsnapshotexample.yml deleted file mode 100644 index f3eaf00c..00000000 --- a/pkg/acl/testutils/yamltests/invalidsnapshotexample.yml +++ /dev/null @@ -1,126 +0,0 @@ -tree: - author: A -changes: - - id: A.1.1 - identity: A - aclSnapshot: - userStates: - - identity: A - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - permission: admin - - identity: B - encryptionKey: key.Enc.B - encryptedReadKeys: [key.Read.1] - permission: admin - snapshot: - text: "some text" - aclChanges: - - userAdd: - identity: A - permission: admin - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - - userAdd: - identity: B - permission: admin - encryptionKey: key.Enc.B - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 - - id: A.1.2 - identity: A - aclSnapshot: - userStates: - - identity: A - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - permission: admin - - identity: B - encryptionKey: key.Enc.B - encryptedReadKeys: [key.Read.1] - permission: admin - - identity: D - encryptionKey: key.Enc.D - encryptedReadKeys: [ key.Read.1 ] - permission: admin - snapshot: - text: "some text" - aclChanges: - - userAdd: - identity: D - permission: admin - encryptionKey: key.Enc.D - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 - - id: A.1.3 - identity: A - aclChanges: - - userAdd: - identity: E - permission: admin - encryptionKey: key.Enc.E - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 - - id: B.1.1 - identity: B - aclChanges: - - userAdd: - identity: C - permission: admin - encryptionKey: key.Enc.C - encryptedReadKeys: [ key.Read.1 ] - readKey: key.Read.1 - - id: B.1.2 - identity: B - aclChanges: - - userAdd: - identity: F - permission: admin - encryptionKey: key.Enc.F - encryptedReadKeys: [ key.Read.1 ] - readKey: key.Read.1 -keys: - Enc: - - A - - B - - C - - D - - E - - F - Sign: - - A - - B - - C - - D - - E - - F - Read: - - 1 - - 2 -graph: - - id: A.1.1 - baseSnapshot: A.1.1 - aclSnapshot: A.1.1 - - id: A.1.2 - baseSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.1] - - id: B.1.1 - baseSnapshot: A.1.1 - aclHeads: [A.1.1] - treeHeads: [A.1.1] - - id: B.1.2 - baseSnapshot: A.1.2 - aclHeads: [A.1.2] - treeHeads: [A.1.2] - - id: A.1.3 - baseSnapshot: A.1.2 - aclHeads: [A.1.2] - treeHeads: [A.1.2] -header: - firstChangeId: A.1.1 - isWorkspace: false -orphans: - - A.1.3 - - B.1.2 - diff --git a/pkg/acl/testutils/yamltests/userjoinexample.yml b/pkg/acl/testutils/yamltests/userjoinexample.yml index ff15f1f6..9b4ac7f1 100644 --- a/pkg/acl/testutils/yamltests/userjoinexample.yml +++ b/pkg/acl/testutils/yamltests/userjoinexample.yml @@ -1,49 +1,29 @@ -tree: +list: author: A -changes: - - id: A.1.1 - identity: A - aclSnapshot: - userStates: - - identity: A - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - permission: admin - snapshot: - text: "some text" +records: + - identity: A aclChanges: - userAdd: identity: A permission: admin encryptionKey: key.Enc.A encryptedReadKeys: [key.Read.1] - changes: - - textAppend: - text: "some text" readKey: key.Read.1 - - id: A.1.2 - identity: A + - identity: A aclChanges: - userInvite: acceptKey: key.Sign.Onetime1 encryptionKey: key.Enc.Onetime1 encryptedReadKeys: [key.Read.1] permissions: writer - inviteId: A.1.2 + inviteIdx: A.1.2 - userAdd: identity: C permission: reader encryptionKey: key.Enc.C - encryptedReadKeys: [ key.Read.1 ] + encryptedReadKeys: [key.Read.1] readKey: key.Read.1 - - id: A.1.3 - identity: A - changes: - - textAppend: - text: "second" - readKey: key.Read.1 - - id: B.1.1 - identity: B + - identity: B aclChanges: - userJoin: identity: B @@ -52,56 +32,25 @@ changes: inviteId: A.1.2 encryptedReadKeys: [key.Read.1] readKey: key.Read.1 - - id: B.1.2 - identity: B - changes: - - textAppend: - text: "first" - readKey: key.Read.1 - - id: C.1.1 - identity: C - changes: - - textAppend: - text: "third" - readKey: key.Read.1 keys: Enc: - - A - - B - - C - - Onetime1 + - name: A + value: generated + - name: B + value: generated + - name: C + value: generated + - name: Onetime1 + value: generated Sign: - - A - - B - - C - - Onetime1 + - name: A + value: generated + - name: B + value: generated + - name: C + value: generated + - name: Onetime1 + value: generated Read: - - 1 -graph: - - id: A.1.1 - baseSnapshot: A.1.1 - - id: A.1.2 - baseSnapshot: A.1.1 - aclHeads: [A.1.1] - treeHeads: [A.1.1] - - id: B.1.1 - baseSnapshot: A.1.1 - aclHeads: [A.1.2] - treeHeads: [A.1.2] - - id: B.1.2 - baseSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.1] - - id: A.1.3 # this should be invalid, because it is based on one of the invalid changes - baseSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.2, C.1.1] - - id: C.1.1 # this should be invalid, because C is a reader - baseSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.1] -header: - firstChangeId: A.1.1 - isWorkspace: false -orphans: - - "A.1.3" + - name: 1 + value: generated diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index 8717cc09..45a5bca1 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -184,7 +184,7 @@ func (d *docTree) AddContent(ctx context.Context, aclList list.ACLList, content state := aclList.ACLState() change := &aclpb.Change{ TreeHeadIds: d.tree.Heads(), - AclHeadId: aclList.Last().Id, + AclHeadId: aclList.Head().Id, SnapshotBaseId: d.tree.RootId(), CurrentReadKeyHash: state.CurrentReadKeyHash(), Timestamp: int64(time.Now().Nanosecond()), diff --git a/pkg/acl/tree/treestorage.go b/pkg/acl/tree/treestorage.go index 87a3a47d..b5e450db 100644 --- a/pkg/acl/tree/treestorage.go +++ b/pkg/acl/tree/treestorage.go @@ -61,7 +61,7 @@ func CreateNewTreeStorage( state := aclList.ACLState() change := &aclpb.Change{ - AclHeadId: aclList.Last().Id, + AclHeadId: aclList.Head().Id, CurrentReadKeyHash: state.CurrentReadKeyHash(), Timestamp: int64(time.Now().Nanosecond()), Identity: acc.Identity, From e5fe1b5a92a50d65dcd13bd1028cf7e939f7628b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 19 Aug 2022 20:34:09 +0200 Subject: [PATCH 018/219] Change treeheader to header --- .../acllistbuilder/liststoragebuilder.go | 2 - ...dergraph.go => liststoragebuildergraph.go} | 0 ..._nix.go => liststoragebuildergraph_nix.go} | 0 .../yamltests/userjoinexampleupdate.yml | 152 ------ pkg/acl/tree/commontree.go | 3 +- pkg/acl/tree/doctree.go | 11 +- pkg/acl/tree/treebuilder.go | 4 +- pkg/acl/tree/treestorage.go | 13 +- pkg/acl/treestorage/inmemory.go | 56 +-- pkg/acl/treestorage/provider.go | 3 +- pkg/acl/treestorage/storage.go | 14 +- pkg/acl/treestorage/treepb/protos/tree.proto | 16 - pkg/acl/treestorage/treepb/tree.pb.go | 474 ------------------ service/document/service.go | 4 +- 14 files changed, 27 insertions(+), 725 deletions(-) rename pkg/acl/testutils/acllistbuilder/{treestoragebuildergraph.go => liststoragebuildergraph.go} (100%) rename pkg/acl/testutils/acllistbuilder/{treestoragebuildergraph_nix.go => liststoragebuildergraph_nix.go} (100%) delete mode 100644 pkg/acl/testutils/yamltests/userjoinexampleupdate.yml delete mode 100644 pkg/acl/treestorage/treepb/protos/tree.proto delete mode 100644 pkg/acl/treestorage/treepb/tree.pb.go diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index e78a7df2..2116eac7 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -10,7 +10,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "io/ioutil" "path" - "sync" "time" "github.com/gogo/protobuf/proto" @@ -25,7 +24,6 @@ type ACLListStorageBuilder struct { keychain *Keychain header *aclpb.Header id string - sync.RWMutex } func NewACLListStorageBuilder(keychain *Keychain) *ACLListStorageBuilder { diff --git a/pkg/acl/testutils/acllistbuilder/treestoragebuildergraph.go b/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph.go similarity index 100% rename from pkg/acl/testutils/acllistbuilder/treestoragebuildergraph.go rename to pkg/acl/testutils/acllistbuilder/liststoragebuildergraph.go diff --git a/pkg/acl/testutils/acllistbuilder/treestoragebuildergraph_nix.go b/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go similarity index 100% rename from pkg/acl/testutils/acllistbuilder/treestoragebuildergraph_nix.go rename to pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go diff --git a/pkg/acl/testutils/yamltests/userjoinexampleupdate.yml b/pkg/acl/testutils/yamltests/userjoinexampleupdate.yml deleted file mode 100644 index 1e7d2b01..00000000 --- a/pkg/acl/testutils/yamltests/userjoinexampleupdate.yml +++ /dev/null @@ -1,152 +0,0 @@ -tree: - author: A -changes: - - id: A.1.1 - identity: A - aclSnapshot: - userStates: - - identity: A - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - permission: admin - snapshot: - text: "some text" - aclChanges: - - userAdd: - identity: A - permission: admin - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - changes: - - textAppend: - text: "some text" - readKey: key.Read.1 - - id: A.1.2 - identity: A - aclChanges: - - userInvite: - acceptKey: key.Sign.Onetime1 - encryptionKey: key.Enc.Onetime1 - encryptedReadKeys: [key.Read.1] - permissions: writer - inviteId: A.1.2 - - userAdd: - identity: C - permission: reader - encryptionKey: key.Enc.C - encryptedReadKeys: [ key.Read.1 ] - readKey: key.Read.1 - - id: A.1.3 - identity: A - changes: - - textAppend: - text: "second" - readKey: key.Read.1 - - id: B.1.1 - identity: B - aclChanges: - - userJoin: - identity: B - encryptionKey: key.Enc.B - acceptSignature: key.Sign.Onetime1 - inviteId: A.1.2 - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 - - id: B.1.2 - identity: B - changes: - - textAppend: - text: "first" - readKey: key.Read.1 - - id: C.1.1 - identity: C - changes: - - textAppend: - text: "third" - readKey: key.Read.1 -keys: - Enc: - - A - - B - - C - - D - - Onetime1 - Sign: - - A - - B - - C - - D - - Onetime1 - Read: - - 1 -graph: - - id: A.1.1 - baseSnapshot: A.1.1 - - id: A.1.2 - baseSnapshot: A.1.1 - aclHeads: [A.1.1] - treeHeads: [A.1.1] - - id: B.1.1 - baseSnapshot: A.1.1 - aclHeads: [A.1.2] - treeHeads: [A.1.2] - - id: B.1.2 - baseSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.1] - - id: A.1.3 # this should be invalid, because it is based on one of the invalid changes - baseSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.2, C.1.1] - - id: C.1.1 # this should be invalid, because C is a reader - baseSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.1] -header: - firstChangeId: A.1.1 - isWorkspace: false -orphans: - - "A.1.3" -updates: - - useCase: append - changes: - - id: B.1.3 - identity: B - changes: - - textAppend: - text: "second" - readKey: key.Read.1 - - id: A.1.4 - identity: A - aclChanges: - - userAdd: - identity: D - permission: writer - encryptionKey: key.Enc.D - encryptedReadKeys: [ key.Read.1 ] - readKey: key.Read.1 - graph: - - id: B.1.3 - baseSnapshot: A.1.1 - aclHeads: [ B.1.1 ] - treeHeads: [ B.1.2 ] - - id: A.1.4 - baseSnapshot: A.1.1 - aclHeads: [ B.1.1 ] - treeHeads: [ B.1.3 ] - - useCase: rebuild - changes: - - id: A.1.4 - identity: A - aclChanges: - - userAdd: - identity: D - permission: writer - encryptionKey: key.Enc.D - encryptedReadKeys: [ key.Read.1 ] - readKey: key.Read.1 - graph: - - id: A.1.4 - baseSnapshot: A.1.1 - aclHeads: [ A.1.1 ] - treeHeads: [ A.1.1 ] diff --git a/pkg/acl/tree/commontree.go b/pkg/acl/tree/commontree.go index 53c8e62f..9018c878 100644 --- a/pkg/acl/tree/commontree.go +++ b/pkg/acl/tree/commontree.go @@ -3,12 +3,11 @@ package tree import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" ) type CommonTree interface { ID() string - Header() *treepb.TreeHeader + Header() *aclpb.Header Heads() []string Root() *Change Iterate(func(change *Change) bool) diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index 45a5bca1..eeece7e6 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -7,7 +7,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" @@ -61,7 +60,7 @@ type docTree struct { updateListener TreeUpdateListener id string - header *treepb.TreeHeader + header *aclpb.Header tree *Tree treeBuilder *treeBuilder @@ -96,7 +95,7 @@ func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountDat if err != nil { return nil, err } - docTree.id, err = t.TreeID() + docTree.id, err = t.ID() if err != nil { return nil, err } @@ -131,7 +130,7 @@ func BuildDocTree(t treestorage.TreeStorage, decoder keys.Decoder, listener Tree if err != nil { return nil, err } - docTree.id, err = t.TreeID() + docTree.id, err = t.ID() if err != nil { return nil, err } @@ -162,7 +161,7 @@ func (d *docTree) ID() string { return d.id } -func (d *docTree) Header() *treepb.TreeHeader { +func (d *docTree) Header() *aclpb.Header { return d.header } @@ -448,7 +447,7 @@ func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh var rawChanges []*aclpb.RawChange // using custom load function to skip verification step and save raw changes load := func(id string) (*Change, error) { - raw, err := d.treeStorage.GetChange(context.Background(), id) + raw, err := d.treeStorage.GetRawChange(context.Background(), id) if err != nil { return nil, err } diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index e63d2292..ea93af90 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -117,7 +117,7 @@ func (tb *treeBuilder) dfsFromStart(heads []string) (buf []*Change, root *Change return nil, nil, err } for _, r := range possibleRoots { - if r.Id == header.FirstChangeId { + if r.Id == header.FirstId { return buf, r, nil } } @@ -177,7 +177,7 @@ func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) defer cancel() - change, err := tb.treeStorage.GetChange(ctx, id) + change, err := tb.treeStorage.GetRawChange(ctx, id) if err != nil { return nil, err } diff --git a/pkg/acl/tree/treestorage.go b/pkg/acl/tree/treestorage.go index b5e450db..5c9e753b 100644 --- a/pkg/acl/tree/treestorage.go +++ b/pkg/acl/tree/treestorage.go @@ -5,7 +5,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/gogo/protobuf/proto" "time" @@ -96,7 +95,7 @@ func CreateNewTreeStorage( Signature: signature, Id: changeId, } - header, treeId, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_DocTree, aclList.ID()) + header, treeId, err := createTreeHeaderAndId(rawChange, aclpb.Header_DocTree, aclList.ID()) if err != nil { return nil, err } @@ -113,11 +112,11 @@ func CreateNewTreeStorage( return thr, nil } -func createTreeHeaderAndId(change *aclpb.RawChange, treeType treepb.TreeHeaderTreeType, aclTreeId string) (*treepb.TreeHeader, string, error) { - header := &treepb.TreeHeader{ - FirstChangeId: change.Id, - Type: treeType, - AclTreeId: aclTreeId, +func createTreeHeaderAndId(change *aclpb.RawChange, treeType aclpb.HeaderDocType, aclListId string) (*aclpb.Header, string, error) { + header := &aclpb.Header{ + FirstId: change.Id, + DocType: treeType, + AclListId: aclListId, } marshalledHeader, err := proto.Marshal(header) if err != nil { diff --git a/pkg/acl/treestorage/inmemory.go b/pkg/acl/treestorage/inmemory.go index 7025a701..1fd98e7a 100644 --- a/pkg/acl/treestorage/inmemory.go +++ b/pkg/acl/treestorage/inmemory.go @@ -3,16 +3,13 @@ package treestorage import ( "context" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "sync" ) type inMemoryTreeStorage struct { id string - header *treepb.TreeHeader + header *aclpb.Header heads []string orphans []string changes map[string]*aclpb.RawChange @@ -20,11 +17,11 @@ type inMemoryTreeStorage struct { sync.RWMutex } -type CreatorFunc = func(string, *treepb.TreeHeader, []*aclpb.RawChange) (TreeStorage, error) +type CreatorFunc = func(string, *aclpb.Header, []*aclpb.RawChange) (TreeStorage, error) func NewInMemoryTreeStorage( treeId string, - header *treepb.TreeHeader, + header *aclpb.Header, changes []*aclpb.RawChange) (TreeStorage, error) { allChanges := make(map[string]*aclpb.RawChange) var orphans []string @@ -43,13 +40,13 @@ func NewInMemoryTreeStorage( }, nil } -func (t *inMemoryTreeStorage) TreeID() (string, error) { +func (t *inMemoryTreeStorage) ID() (string, error) { t.RLock() defer t.RUnlock() return t.id, nil } -func (t *inMemoryTreeStorage) Header() (*treepb.TreeHeader, error) { +func (t *inMemoryTreeStorage) Header() (*aclpb.Header, error) { t.RLock() defer t.RUnlock() return t.header, nil @@ -61,12 +58,6 @@ func (t *inMemoryTreeStorage) Heads() ([]string, error) { return t.heads, nil } -func (t *inMemoryTreeStorage) Orphans() ([]string, error) { - t.RLock() - defer t.RUnlock() - return t.orphans, nil -} - func (t *inMemoryTreeStorage) SetHeads(heads []string) error { t.Lock() defer t.Unlock() @@ -78,20 +69,6 @@ func (t *inMemoryTreeStorage) SetHeads(heads []string) error { return nil } -func (t *inMemoryTreeStorage) RemoveOrphans(orphans ...string) error { - t.Lock() - defer t.Unlock() - t.orphans = slice.Difference(t.orphans, orphans) - return nil -} - -func (t *inMemoryTreeStorage) AddOrphans(orphans ...string) error { - t.Lock() - defer t.Unlock() - t.orphans = append(t.orphans, orphans...) - return nil -} - func (t *inMemoryTreeStorage) AddRawChange(change *aclpb.RawChange) error { t.Lock() defer t.Unlock() @@ -100,26 +77,7 @@ func (t *inMemoryTreeStorage) AddRawChange(change *aclpb.RawChange) error { return nil } -func (t *inMemoryTreeStorage) AddChange(change aclchanges.Change) error { - t.Lock() - defer t.Unlock() - signature := change.Signature() - id := change.CID() - - fullMarshalledChange, err := change.ProtoChange().Marshal() - if err != nil { - return err - } - rawChange := &aclpb.RawChange{ - Payload: fullMarshalledChange, - Signature: signature, - Id: id, - } - t.changes[id] = rawChange - return nil -} - -func (t *inMemoryTreeStorage) GetChange(ctx context.Context, changeId string) (*aclpb.RawChange, error) { +func (t *inMemoryTreeStorage) GetRawChange(ctx context.Context, changeId string) (*aclpb.RawChange, error) { t.RLock() defer t.RUnlock() if res, exists := t.changes[changeId]; exists { @@ -142,7 +100,7 @@ func (i *inMemoryTreeStorageProvider) TreeStorage(treeId string) (TreeStorage, e return nil, ErrUnknownTreeId } -func (i *inMemoryTreeStorageProvider) CreateTreeStorage(treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) (TreeStorage, error) { +func (i *inMemoryTreeStorageProvider) CreateTreeStorage(treeId string, header *aclpb.Header, changes []*aclpb.RawChange) (TreeStorage, error) { i.Lock() defer i.Unlock() res, err := NewInMemoryTreeStorage(treeId, header, changes) diff --git a/pkg/acl/treestorage/provider.go b/pkg/acl/treestorage/provider.go index 41b472e9..2a2a98e2 100644 --- a/pkg/acl/treestorage/provider.go +++ b/pkg/acl/treestorage/provider.go @@ -3,12 +3,11 @@ package treestorage import ( "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" ) var ErrUnknownTreeId = errors.New("tree does not exist") type Provider interface { TreeStorage(treeId string) (TreeStorage, error) - CreateTreeStorage(treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) (TreeStorage, error) + CreateTreeStorage(treeId string, header *aclpb.Header, changes []*aclpb.RawChange) (TreeStorage, error) } diff --git a/pkg/acl/treestorage/storage.go b/pkg/acl/treestorage/storage.go index df47d809..bc3f5406 100644 --- a/pkg/acl/treestorage/storage.go +++ b/pkg/acl/treestorage/storage.go @@ -2,24 +2,16 @@ package treestorage import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" ) type TreeStorage interface { - TreeID() (string, error) + ID() (string, error) - Header() (*treepb.TreeHeader, error) + Header() (*aclpb.Header, error) Heads() ([]string, error) - Orphans() ([]string, error) SetHeads(heads []string) error - RemoveOrphans(orphan ...string) error - AddOrphans(orphan ...string) error AddRawChange(change *aclpb.RawChange) error - AddChange(change aclchanges.Change) error - - // TODO: have methods with raw changes also - GetChange(ctx context.Context, recordID string) (*aclpb.RawChange, error) + GetRawChange(ctx context.Context, recordID string) (*aclpb.RawChange, error) } diff --git a/pkg/acl/treestorage/treepb/protos/tree.proto b/pkg/acl/treestorage/treepb/protos/tree.proto deleted file mode 100644 index 419dd19f..00000000 --- a/pkg/acl/treestorage/treepb/protos/tree.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; -package tree; -option go_package = "treepb"; - -message TreeHeader { - string firstChangeId = 1; - bool isWorkspace = 2; - TreeType type = 3; - string aclTreeId = 4; - // TODO: add user identity, signature and nano timestamp - - enum TreeType { - ACLTree = 0; - DocTree = 1; - } -} \ No newline at end of file diff --git a/pkg/acl/treestorage/treepb/tree.pb.go b/pkg/acl/treestorage/treepb/tree.pb.go deleted file mode 100644 index aa0838ef..00000000 --- a/pkg/acl/treestorage/treepb/tree.pb.go +++ /dev/null @@ -1,474 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: pkg/acl/treestorage/treepb/protos/tree.proto - -package treepb - -import ( - fmt "fmt" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type TreeHeaderTreeType int32 - -const ( - TreeHeader_ACLTree TreeHeaderTreeType = 0 - TreeHeader_DocTree TreeHeaderTreeType = 1 -) - -var TreeHeaderTreeType_name = map[int32]string{ - 0: "ACLTree", - 1: "DocTree", -} - -var TreeHeaderTreeType_value = map[string]int32{ - "ACLTree": 0, - "DocTree": 1, -} - -func (x TreeHeaderTreeType) String() string { - return proto.EnumName(TreeHeaderTreeType_name, int32(x)) -} - -func (TreeHeaderTreeType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_e7d760b855878644, []int{0, 0} -} - -type TreeHeader struct { - FirstChangeId string `protobuf:"bytes,1,opt,name=firstChangeId,proto3" json:"firstChangeId,omitempty"` - IsWorkspace bool `protobuf:"varint,2,opt,name=isWorkspace,proto3" json:"isWorkspace,omitempty"` - Type TreeHeaderTreeType `protobuf:"varint,3,opt,name=type,proto3,enum=tree.TreeHeaderTreeType" json:"type,omitempty"` - AclTreeId string `protobuf:"bytes,4,opt,name=aclTreeId,proto3" json:"aclTreeId,omitempty"` -} - -func (m *TreeHeader) Reset() { *m = TreeHeader{} } -func (m *TreeHeader) String() string { return proto.CompactTextString(m) } -func (*TreeHeader) ProtoMessage() {} -func (*TreeHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_e7d760b855878644, []int{0} -} -func (m *TreeHeader) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TreeHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TreeHeader.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 *TreeHeader) XXX_Merge(src proto.Message) { - xxx_messageInfo_TreeHeader.Merge(m, src) -} -func (m *TreeHeader) XXX_Size() int { - return m.Size() -} -func (m *TreeHeader) XXX_DiscardUnknown() { - xxx_messageInfo_TreeHeader.DiscardUnknown(m) -} - -var xxx_messageInfo_TreeHeader proto.InternalMessageInfo - -func (m *TreeHeader) GetFirstChangeId() string { - if m != nil { - return m.FirstChangeId - } - return "" -} - -func (m *TreeHeader) GetIsWorkspace() bool { - if m != nil { - return m.IsWorkspace - } - return false -} - -func (m *TreeHeader) GetType() TreeHeaderTreeType { - if m != nil { - return m.Type - } - return TreeHeader_ACLTree -} - -func (m *TreeHeader) GetAclTreeId() string { - if m != nil { - return m.AclTreeId - } - return "" -} - -func init() { - proto.RegisterEnum("tree.TreeHeaderTreeType", TreeHeaderTreeType_name, TreeHeaderTreeType_value) - proto.RegisterType((*TreeHeader)(nil), "tree.TreeHeader") -} - -func init() { - proto.RegisterFile("pkg/acl/treestorage/treepb/protos/tree.proto", fileDescriptor_e7d760b855878644) -} - -var fileDescriptor_e7d760b855878644 = []byte{ - // 237 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x29, 0xc8, 0x4e, 0xd7, - 0x4f, 0x4c, 0xce, 0xd1, 0x2f, 0x29, 0x4a, 0x4d, 0x2d, 0x2e, 0xc9, 0x2f, 0x4a, 0x4c, 0x4f, 0x05, - 0xb3, 0x0b, 0x92, 0xf4, 0x0b, 0x8a, 0xf2, 0x4b, 0xf2, 0x8b, 0xc1, 0x3c, 0x3d, 0x30, 0x5b, 0x88, - 0x05, 0xc4, 0x56, 0x3a, 0xce, 0xc8, 0xc5, 0x15, 0x52, 0x94, 0x9a, 0xea, 0x91, 0x9a, 0x98, 0x92, - 0x5a, 0x24, 0xa4, 0xc2, 0xc5, 0x9b, 0x96, 0x59, 0x54, 0x5c, 0xe2, 0x9c, 0x91, 0x98, 0x97, 0x9e, - 0xea, 0x99, 0x22, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x84, 0x2a, 0x28, 0xa4, 0xc0, 0xc5, 0x9d, - 0x59, 0x1c, 0x9e, 0x5f, 0x94, 0x5d, 0x5c, 0x90, 0x98, 0x9c, 0x2a, 0xc1, 0xa4, 0xc0, 0xa8, 0xc1, - 0x11, 0x84, 0x2c, 0x24, 0xa4, 0xcb, 0xc5, 0x52, 0x52, 0x59, 0x90, 0x2a, 0xc1, 0xac, 0xc0, 0xa8, - 0xc1, 0x67, 0x24, 0xa9, 0x07, 0xb6, 0x17, 0x61, 0x0f, 0x98, 0x19, 0x52, 0x59, 0x90, 0x1a, 0x04, - 0x56, 0x26, 0x24, 0xc3, 0xc5, 0x99, 0x98, 0x9c, 0x03, 0x12, 0xf4, 0x4c, 0x91, 0x60, 0x01, 0x5b, - 0x89, 0x10, 0x50, 0x52, 0xe1, 0xe2, 0x80, 0xa9, 0x17, 0xe2, 0xe6, 0x62, 0x77, 0x74, 0xf6, 0x01, - 0x71, 0x05, 0x18, 0x40, 0x1c, 0x97, 0xfc, 0x64, 0x30, 0x87, 0xd1, 0x49, 0xe1, 0xc4, 0x23, 0x39, - 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, - 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0xd8, 0x20, 0x61, 0x90, 0xc4, 0x06, 0xf6, 0xb8, 0x31, - 0x20, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x86, 0x4d, 0x81, 0x28, 0x01, 0x00, 0x00, -} - -func (m *TreeHeader) 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 *TreeHeader) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TreeHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.AclTreeId) > 0 { - i -= len(m.AclTreeId) - copy(dAtA[i:], m.AclTreeId) - i = encodeVarintTree(dAtA, i, uint64(len(m.AclTreeId))) - i-- - dAtA[i] = 0x22 - } - if m.Type != 0 { - i = encodeVarintTree(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x18 - } - if m.IsWorkspace { - i-- - if m.IsWorkspace { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.FirstChangeId) > 0 { - i -= len(m.FirstChangeId) - copy(dAtA[i:], m.FirstChangeId) - i = encodeVarintTree(dAtA, i, uint64(len(m.FirstChangeId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintTree(dAtA []byte, offset int, v uint64) int { - offset -= sovTree(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *TreeHeader) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FirstChangeId) - if l > 0 { - n += 1 + l + sovTree(uint64(l)) - } - if m.IsWorkspace { - n += 2 - } - if m.Type != 0 { - n += 1 + sovTree(uint64(m.Type)) - } - l = len(m.AclTreeId) - if l > 0 { - n += 1 + l + sovTree(uint64(l)) - } - return n -} - -func sovTree(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozTree(x uint64) (n int) { - return sovTree(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *TreeHeader) 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 ErrIntOverflowTree - } - 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: TreeHeader: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TreeHeader: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FirstChangeId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTree - } - 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 ErrInvalidLengthTree - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTree - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FirstChangeId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsWorkspace", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTree - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IsWorkspace = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTree - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= TreeHeaderTreeType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclTreeId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTree - } - 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 ErrInvalidLengthTree - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTree - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AclTreeId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTree(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTree - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipTree(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTree - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTree - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTree - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthTree - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTree - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTree - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTree = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTree = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTree = fmt.Errorf("proto: unexpected end of group") -) diff --git a/service/document/service.go b/service/document/service.go index ccd4a3aa..33e6a271 100644 --- a/service/document/service.go +++ b/service/document/service.go @@ -195,7 +195,7 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text return err } - id, err = doc.TreeID() + id, err = doc.ID() if err != nil { return err } @@ -207,7 +207,7 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text heads = []string{header.FirstChangeId} snapshotPath = []string{header.FirstChangeId} - ch, err = doc.GetChange(ctx, header.FirstChangeId) + ch, err = doc.GetRawChange(ctx, header.FirstChangeId) if err != nil { return err } From b0432487cc2571391876ca0653914c2bb4a93222 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 19 Aug 2022 21:44:38 +0200 Subject: [PATCH 019/219] Add ACLList struct --- pkg/acl/list/aclstatebuilder.go | 19 +- pkg/acl/list/list.go | 166 +++++++++++++----- pkg/acl/list/record.go | 19 +- pkg/acl/list/storage.go | 2 +- .../acllistbuilder/liststoragebuilder.go | 4 +- pkg/acl/tree/doctree.go | 38 +++- service/account/service.go | 2 +- service/treecache/service.go | 9 +- 8 files changed, 188 insertions(+), 71 deletions(-) diff --git a/pkg/acl/list/aclstatebuilder.go b/pkg/acl/list/aclstatebuilder.go index 51dd9139..3586dec9 100644 --- a/pkg/acl/list/aclstatebuilder.go +++ b/pkg/acl/list/aclstatebuilder.go @@ -7,7 +7,6 @@ import ( ) type aclStateBuilder struct { - log ACLList identity string key encryptionkey.PrivKey decoder keys.Decoder @@ -25,12 +24,7 @@ func newACLStateBuilder() *aclStateBuilder { return &aclStateBuilder{} } -func (sb *aclStateBuilder) Init(aclLog ACLList) error { - sb.log = aclLog - return nil -} - -func (sb *aclStateBuilder) Build() (*ACLState, error) { +func (sb *aclStateBuilder) Build(records []*Record) (*ACLState, error) { var ( err error state *ACLState @@ -41,11 +35,12 @@ func (sb *aclStateBuilder) Build() (*ACLState, error) { } else { state = newACLState() } - - sb.log.Iterate(func(c *Record) (isContinue bool) { - err = state.applyChangeAndUpdate(c) - return err == nil - }) + for _, rec := range records { + err = state.applyChangeAndUpdate(rec) + if err != nil { + return nil, err + } + } return state, err } diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index c7fa37d8..dc355f4c 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -1,8 +1,12 @@ package list import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + "sync" ) type IterFunc = func(record *Record) (IsContinue bool) @@ -11,7 +15,7 @@ type ACLList interface { tree.RWLocker ID() string Header() *aclpb.Header - ACLState() ACLState + ACLState() *ACLState IsAfter(first string, second string) (bool, error) Head() *Record Get(id string) (*Record, error) @@ -19,43 +23,123 @@ type ACLList interface { IterateFrom(startId string, iterFunc IterFunc) } -//func (t *ACLListStorageBuilder) IsAfter(first string, second string) (bool, error) { -// firstRec, okFirst := t.indexes[first] -// secondRec, okSecond := t.indexes[second] -// if !okFirst || !okSecond { -// return false, fmt.Errorf("not all entries are there: first (%b), second (%b)", okFirst, okSecond) -// } -// return firstRec > secondRec, nil -//} -// -//func (t *ACLListStorageBuilder) Head() *list.Record { -// return t.records[len(t.records)-1] -//} -// -//func (t *ACLListStorageBuilder) Get(id string) (*list.Record, error) { -// recIdx, ok := t.indexes[id] -// if !ok { -// return nil, fmt.Errorf("no such record") -// } -// return t.records[recIdx], nil -//} -// -//func (t *ACLListStorageBuilder) Iterate(iterFunc list.IterFunc) { -// for _, rec := range t.records { -// if !iterFunc(rec) { -// return -// } -// } -//} -// -//func (t *ACLListStorageBuilder) IterateFrom(startId string, iterFunc list.IterFunc) { -// recIdx, ok := t.indexes[startId] -// if !ok { -// return -// } -// for i := recIdx; i < len(t.records); i++ { -// if !iterFunc(t.records[i]) { -// return -// } -// } -//} +type aclList struct { + header *aclpb.Header + records []*Record + indexes map[string]int + id string + + builder *aclStateBuilder + aclState *ACLState + + sync.RWMutex +} + +func BuildACLListWithIdentity(acc *account.AccountData, storage Storage) (ACLList, error) { + builder := newACLStateBuilderWithIdentity(acc.Decoder, acc) + header, err := storage.Header() + if err != nil { + return nil, err + } + + rawRecord, err := storage.Head() + if err != nil { + return nil, err + } + + record, err := NewFromRawRecord(rawRecord) + if err != nil { + return nil, err + } + records := []*Record{record} + + for record.Content.PrevId != "" { + rawRecord, err = storage.GetRecord(context.Background(), record.Content.PrevId) + if err != nil { + return nil, err + } + record, err = NewFromRawRecord(rawRecord) + if err != nil { + return nil, err + } + records = append(records, record) + } + + indexes := make(map[string]int) + for i, j := 0, len(records)-1; i < j; i, j = i+1, j-1 { + records[i], records[j] = records[j], records[i] + indexes[records[i].Id] = i + indexes[records[j].Id] = j + } + // adding missed index if needed + if len(records)%2 != 0 { + indexes[records[len(records)/2].Id] = len(records) / 2 + } + + state, err := builder.Build(records) + if err != nil { + return nil, err + } + + return &aclList{ + header: header, + records: records, + indexes: indexes, + builder: builder, + aclState: state, + RWMutex: sync.RWMutex{}, + }, nil +} + +func (a *aclList) ID() string { + return a.id +} + +func (a *aclList) Header() *aclpb.Header { + return a.header +} + +func (a *aclList) ACLState() *ACLState { + return a.aclState +} + +func (a *aclList) IsAfter(first string, second string) (bool, error) { + firstRec, okFirst := a.indexes[first] + secondRec, okSecond := a.indexes[second] + if !okFirst || !okSecond { + return false, fmt.Errorf("not all entries are there: first (%b), second (%b)", okFirst, okSecond) + } + return firstRec > secondRec, nil +} + +func (a *aclList) Head() *Record { + return a.records[len(a.records)-1] +} + +func (a *aclList) Get(id string) (*Record, error) { + recIdx, ok := a.indexes[id] + if !ok { + return nil, fmt.Errorf("no such record") + } + return a.records[recIdx], nil +} + +func (a *aclList) Iterate(iterFunc IterFunc) { + for _, rec := range a.records { + if !iterFunc(rec) { + return + } + } +} + +func (a *aclList) IterateFrom(startId string, iterFunc IterFunc) { + recIdx, ok := a.indexes[startId] + if !ok { + return + } + for i := recIdx; i < len(a.records); i++ { + if !iterFunc(a.records[i]) { + return + } + } +} diff --git a/pkg/acl/list/record.go b/pkg/acl/list/record.go index e20351d2..3227db27 100644 --- a/pkg/acl/list/record.go +++ b/pkg/acl/list/record.go @@ -1,6 +1,9 @@ package list -import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/gogo/protobuf/proto" +) type Record struct { Id string @@ -15,3 +18,17 @@ func NewRecord(id string, aclRecord *aclpb.Record) *Record { Content: aclRecord, } } + +func NewFromRawRecord(rawRec *aclpb.RawRecord) (*Record, error) { + aclRec := &aclpb.Record{} + err := proto.Unmarshal(rawRec.Payload, aclRec) + if err != nil { + return nil, err + } + + return &Record{ + Id: rawRec.Id, + Content: aclRec, + Sign: rawRec.Signature, + }, nil +} diff --git a/pkg/acl/list/storage.go b/pkg/acl/list/storage.go index 22fcb732..d606aa94 100644 --- a/pkg/acl/list/storage.go +++ b/pkg/acl/list/storage.go @@ -6,7 +6,7 @@ import ( ) type Storage interface { - ID() string + ID() (string, error) Head() (*aclpb.RawRecord, error) Header() (*aclpb.Header, error) GetRecord(ctx context.Context, id string) (*aclpb.RawRecord, error) diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index 2116eac7..1037770e 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -101,8 +101,8 @@ func (t *ACLListStorageBuilder) AddRecord(ctx context.Context, rec *aclpb.Record panic("implement me") } -func (t *ACLListStorageBuilder) ID() string { - return t.id +func (t *ACLListStorageBuilder) ID() (string, error) { + return t.id, nil } func (t *ACLListStorageBuilder) GetKeychain() *Keychain { diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index eeece7e6..8e1cfad5 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -10,6 +10,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "github.com/gogo/protobuf/proto" "go.uber.org/zap" "sync" @@ -130,6 +131,22 @@ func BuildDocTree(t treestorage.TreeStorage, decoder keys.Decoder, listener Tree if err != nil { return nil, err } + storageHeads, err := t.Heads() + if err != nil { + return nil, err + } + // comparing rebuilt heads with heads in storage + // in theory it can happen that we didn't set heads because the process has crashed + // therefore we want to set them later + if !slice.UnsortedEquals(storageHeads, docTree.tree.Heads()) { + log.With(zap.Strings("storage", storageHeads), zap.Strings("rebuilt", docTree.tree.Heads())). + Errorf("the heads in storage and tree are different") + err = t.SetHeads(docTree.tree.Heads()) + if err != nil { + return nil, err + } + } + docTree.id, err = t.ID() if err != nil { return nil, err @@ -324,11 +341,22 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawCh return added } + rollback := func() { + for _, ch := range d.tmpChangesBuf { + if _, exists := d.tree.attached[ch.Id]; exists { + delete(d.tree.attached, ch.Id) + } else if _, exists := d.tree.unAttached[ch.Id]; exists { + delete(d.tree.unAttached, ch.Id) + } + } + } + // checking if we have some changes with different snapshot and then rebuilding for _, ch := range d.tmpChangesBuf { if ch.SnapshotId != d.tree.RootId() && ch.SnapshotId != "" { err = d.rebuildFromStorage(aclList, d.tmpChangesBuf) if err != nil { + rollback() return AddResult{}, err } @@ -360,14 +388,7 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawCh // as an optimization we could've started from current heads, but I didn't implement that err = d.validator.ValidateTree(d.tree, aclList) if err != nil { - // rolling back - for _, ch := range d.tmpChangesBuf { - if _, exists := d.tree.attached[ch.Id]; exists { - delete(d.tree.attached, ch.Id) - } else if _, exists := d.tree.unAttached[ch.Id]; exists { - delete(d.tree.unAttached, ch.Id) - } - } + rollback() return AddResult{}, ErrHasInvalidChanges } @@ -444,6 +465,7 @@ func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh return nil, err } } + // TODO: if the snapshot is in the tree we probably can skip going to the DB var rawChanges []*aclpb.RawChange // using custom load function to skip verification step and save raw changes load := func(id string) (*Change, error) { diff --git a/service/account/service.go b/service/account/service.go index ed66fe1e..f617fdd4 100644 --- a/service/account/service.go +++ b/service/account/service.go @@ -61,7 +61,7 @@ func (s *service) Init(ctx context.Context, a *app.App) (err error) { Identity: identity, SignKey: signKey, EncKey: decodedEncryptionKey.(encryptionkey.PrivKey), - Decoder: signingkey.NewEd25519PubKeyDecoder(), + Decoder: signingkey.NewEDPubKeyDecoder(), } s.peerId = acc.PeerId diff --git a/service/treecache/service.go b/service/treecache/service.go index 37b58f21..f442b5ab 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -7,7 +7,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage" @@ -23,7 +22,7 @@ var log = logger.NewNamed("treecache") type Service interface { Do(ctx context.Context, treeId string, f TreeFunc) error - Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f TreeFunc) error + Add(ctx context.Context, treeId string, header *aclpb.Header, changes []*aclpb.RawChange, f TreeFunc) error } type service struct { @@ -91,10 +90,10 @@ func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error return nil, err } - switch header.Type { - case treepb.TreeHeader_ACLTree: + switch header.DocType { + case aclpb.Header_ACL: return tree.BuildACLTreeWithIdentity(t, s.account.Account(), nil) - case treepb.TreeHeader_DocTree: + case aclpb.Header_DocTree: break default: return nil, fmt.Errorf("incorrect type") From 8cf5acd183e1124ced40023ece91b92b957a7357 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 19 Aug 2022 22:31:13 +0200 Subject: [PATCH 020/219] Add some logic in validator --- pkg/acl/list/aclstate.go | 47 ++++++++++++++++++++++++++++++--- pkg/acl/tree/changevalidator.go | 46 +++++++++++++++++++++++++++++--- service/treecache/service.go | 3 ++- 3 files changed, 88 insertions(+), 8 deletions(-) diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index 31c0f464..e15b3ec6 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -22,6 +22,13 @@ var ErrFailedToDecrypt = errors.New("failed to decrypt key") var ErrUserRemoved = errors.New("user was removed from the document") var ErrDocumentForbidden = errors.New("your user was forbidden access to the document") var ErrUserAlreadyExists = errors.New("user already exists") +var ErrNoSuchRecord = errors.New("no such record") +var ErrInsufficientPermissions = errors.New("insufficient permissions") + +type UserPermissionPair struct { + Identity string + Permission aclpb.ACLChangeUserPermissions +} type ACLState struct { currentReadKeyHash uint64 @@ -31,6 +38,7 @@ type ACLState struct { signingPubKeyDecoder keys.Decoder encryptionKey encryptionkey.PrivKey identity string + permissionsAtRecord map[string][]UserPermissionPair } func newACLStateWithIdentity( @@ -44,14 +52,16 @@ func newACLStateWithIdentity( userStates: make(map[string]*aclpb.ACLChangeUserState), userInvites: make(map[string]*aclpb.ACLChangeUserInvite), signingPubKeyDecoder: decoder, + permissionsAtRecord: make(map[string][]UserPermissionPair), } } func newACLState() *ACLState { return &ACLState{ - userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclpb.ACLChangeUserState), - userInvites: make(map[string]*aclpb.ACLChangeUserInvite), + userReadKeys: make(map[uint64]*symmetric.Key), + userStates: make(map[string]*aclpb.ACLChangeUserState), + userInvites: make(map[string]*aclpb.ACLChangeUserInvite), + permissionsAtRecord: make(map[string][]UserPermissionPair), } } @@ -63,7 +73,22 @@ func (st *ACLState) UserReadKeys() map[uint64]*symmetric.Key { return st.userReadKeys } +func (st *ACLState) PermissionsAtRecord(id string, identity string) (UserPermissionPair, error) { + permissions, ok := st.permissionsAtRecord[id] + if !ok { + return UserPermissionPair{}, ErrNoSuchRecord + } + + for _, perm := range permissions { + if perm.Identity == identity { + return perm, nil + } + } + return UserPermissionPair{}, ErrNoSuchUser +} + func (st *ACLState) applyRecord(record *aclpb.Record) (err error) { + // TODO: this should be probably changed aclData := &aclpb.ACLChangeACLData{} err = proto.Unmarshal(record.Data, aclData) @@ -95,7 +120,21 @@ func (st *ACLState) applyChangeAndUpdate(recordWrapper *Record) (err error) { recordWrapper.ParsedModel = aclData } - return st.applyChangeData(aclData, recordWrapper.Content.CurrentReadKeyHash, recordWrapper.Content.Identity) + err = st.applyChangeData(aclData, recordWrapper.Content.CurrentReadKeyHash, recordWrapper.Content.Identity) + if err != nil { + return err + } + + var permissions []UserPermissionPair + for _, state := range st.userStates { + permission := UserPermissionPair{ + Identity: state.Identity, + Permission: state.Permissions, + } + permissions = append(permissions, permission) + } + st.permissionsAtRecord[recordWrapper.Id] = permissions + return nil } func (st *ACLState) applyChangeData(changeData *aclpb.ACLChangeACLData, hash uint64, identity string) (err error) { diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index b1161878..2f0b5fe2 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -1,6 +1,10 @@ package tree -import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" +import ( + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" +) type DocTreeValidator interface { ValidateTree(tree *Tree, aclList list.ACLList) error @@ -11,8 +15,44 @@ type docTreeValidator struct{} func newTreeValidator() DocTreeValidator { return &docTreeValidator{} } -func (v *docTreeValidator) ValidateTree(tree *Tree, list list.ACLList) error { + +func (v *docTreeValidator) ValidateTree(tree *Tree, aclList list.ACLList) (err error) { // TODO: add validation logic where we check that the change refers to correct acl heads // that means that more recent changes should refer to more recent acl heads - return nil + var ( + perm list.UserPermissionPair + state = aclList.ACLState() + ) + + tree.Iterate(tree.RootId(), func(c *Change) (isContinue bool) { + // checking if the user could write + perm, err = state.PermissionsAtRecord(c.Id, c.Content.Identity) + if err != nil { + return false + } + + if perm.Permission != aclpb.ACLChange_Writer && perm.Permission != aclpb.ACLChange_Admin { + err = list.ErrInsufficientPermissions + return false + } + + // checking if the change refers to later acl heads than its previous ids + for _, id := range c.PreviousIds { + prevChange := tree.attached[id] + if prevChange.Content.AclHeadId == c.Content.AclHeadId { + continue + } + var after bool + after, err = aclList.IsAfter(c.Content.AclHeadId, prevChange.Content.AclHeadId) + if err != nil { + return false + } + if !after { + err = fmt.Errorf("current acl head id (%s) should be after each of the previous ones (%s)", c.Content.AclHeadId, prevChange.Content.AclHeadId) + return false + } + } + return true + }) + return err } diff --git a/service/treecache/service.go b/service/treecache/service.go index f442b5ab..ec6cae8a 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -6,6 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" @@ -92,7 +93,7 @@ func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error switch header.DocType { case aclpb.Header_ACL: - return tree.BuildACLTreeWithIdentity(t, s.account.Account(), nil) + return list.BuildACLListWithIdentity(acc) case aclpb.Header_DocTree: break default: From 6bfda6743ecad5deb7df77c3da814f77cc28f8d6 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 20 Aug 2022 14:28:06 +0200 Subject: [PATCH 021/219] Update code to work with acl lists and new models --- Makefile | 8 +- pkg/acl/list/list.go | 12 +- pkg/acl/list/storage.go | 14 - pkg/acl/{treestorage => storage}/inmemory.go | 18 +- pkg/acl/storage/liststorage.go | 14 + pkg/acl/{treestorage => storage}/provider.go | 4 +- pkg/acl/storage/storage.go | 8 + .../storage.go => storage/treestorage.go} | 6 +- .../testutils/testchanges/proto/test.pb.go | 1088 +++++++++++++++++ .../testutils/testchanges/proto/test.proto | 24 + pkg/acl/tree/commontree.go | 4 +- pkg/acl/tree/doctree.go | 10 +- pkg/acl/tree/treebuilder.go | 6 +- pkg/acl/tree/treestorage.go | 6 +- service/api/service.go | 16 +- service/document/service.go | 97 +- service/storage/service.go | 15 +- service/sync/message/service.go | 2 +- service/sync/requesthandler/requesthandler.go | 227 +--- service/treecache/service.go | 23 +- syncproto/helpers.go | 2 +- syncproto/proto/sync.proto | 3 +- syncproto/sync.pb.go | 122 +- 23 files changed, 1338 insertions(+), 391 deletions(-) delete mode 100644 pkg/acl/list/storage.go rename pkg/acl/{treestorage => storage}/inmemory.go (81%) create mode 100644 pkg/acl/storage/liststorage.go rename pkg/acl/{treestorage => storage}/provider.go (81%) create mode 100644 pkg/acl/storage/storage.go rename pkg/acl/{treestorage/storage.go => storage/treestorage.go} (81%) create mode 100644 pkg/acl/testutils/testchanges/proto/test.pb.go create mode 100644 pkg/acl/testutils/testchanges/proto/test.proto diff --git a/Makefile b/Makefile index aeddb2d3..aad9273a 100644 --- a/Makefile +++ b/Makefile @@ -18,19 +18,17 @@ protos-go: # Uncomment if needed @$(eval ROOT_PKG := pkg) @$(eval GOGO_START := GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1) - @$(eval P_TREE_STORAGE_PATH_PB := $(ROOT_PKG)/acl/treestorage/treepb) @$(eval P_ACL_CHANGES_PATH_PB := $(ROOT_PKG)/acl/aclchanges/aclpb) - @$(eval P_PLAINTEXT_CHANGES_PATH_PB := $(ROOT_PKG)/acl/testutils/testchanges/testchangepb) @$(eval P_SYNC_CHANGES_PATH_PB := syncproto) + @$(eval P_TEST_CHANGES_PATH_PB := $(ROOT_PKG)/acl/testutils/testchanges) @$(eval P_TIMESTAMP := Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types) @$(eval P_STRUCT := Mgoogle/protobuf/struct.proto=github.com/gogo/protobuf/types) @$(eval P_ACL_CHANGES := M$(P_ACL_CHANGES_PATH_PB)/protos/aclchanges.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_ACL_CHANGES_PATH_PB)) - @$(eval P_TREE_CHANGES := M$(P_TREE_STORAGE_PATH_PB)/protos/tree.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_TREE_STORAGE_PATH_PB)) # use if needed $(eval PKGMAP := $$(P_TIMESTAMP),$$(P_STRUCT)) $(GOGO_START) protoc --gogofaster_out=:. $(P_ACL_CHANGES_PATH_PB)/protos/*.proto; mv $(P_ACL_CHANGES_PATH_PB)/protos/*.go $(P_ACL_CHANGES_PATH_PB) - $(GOGO_START) protoc --gogofaster_out=:. $(P_TREE_STORAGE_PATH_PB)/protos/*.proto; mv $(P_TREE_STORAGE_PATH_PB)/protos/*.go $(P_TREE_STORAGE_PATH_PB) - $(eval PKGMAP := $$(P_ACL_CHANGES),$$(P_TREE_CHANGES)) + $(GOGO_START) protoc --gogofaster_out=:. $(P_TEST_CHANGES_PATH_PB)/proto/*.proto + $(eval PKGMAP := $$(P_ACL_CHANGES)) $(GOGO_START) protoc --gogofaster_out=$(PKGMAP),plugins=grpc:. $(P_SYNC_CHANGES_PATH_PB)/proto/*.proto build: diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index dc355f4c..ee4a570b 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "sync" ) @@ -21,6 +22,7 @@ type ACLList interface { Get(id string) (*Record, error) Iterate(iterFunc IterFunc) IterateFrom(startId string, iterFunc IterFunc) + Close() (err error) } type aclList struct { @@ -35,7 +37,7 @@ type aclList struct { sync.RWMutex } -func BuildACLListWithIdentity(acc *account.AccountData, storage Storage) (ACLList, error) { +func BuildACLListWithIdentity(acc *account.AccountData, storage storage.ListStorage) (ACLList, error) { builder := newACLStateBuilderWithIdentity(acc.Decoder, acc) header, err := storage.Header() if err != nil { @@ -54,7 +56,7 @@ func BuildACLListWithIdentity(acc *account.AccountData, storage Storage) (ACLLis records := []*Record{record} for record.Content.PrevId != "" { - rawRecord, err = storage.GetRecord(context.Background(), record.Content.PrevId) + rawRecord, err = storage.GetRawRecord(context.Background(), record.Content.PrevId) if err != nil { return nil, err } @@ -109,7 +111,7 @@ func (a *aclList) IsAfter(first string, second string) (bool, error) { if !okFirst || !okSecond { return false, fmt.Errorf("not all entries are there: first (%b), second (%b)", okFirst, okSecond) } - return firstRec > secondRec, nil + return firstRec >= secondRec, nil } func (a *aclList) Head() *Record { @@ -143,3 +145,7 @@ func (a *aclList) IterateFrom(startId string, iterFunc IterFunc) { } } } + +func (a *aclList) Close() (err error) { + return nil +} diff --git a/pkg/acl/list/storage.go b/pkg/acl/list/storage.go deleted file mode 100644 index d606aa94..00000000 --- a/pkg/acl/list/storage.go +++ /dev/null @@ -1,14 +0,0 @@ -package list - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" -) - -type Storage interface { - ID() (string, error) - Head() (*aclpb.RawRecord, error) - Header() (*aclpb.Header, error) - GetRecord(ctx context.Context, id string) (*aclpb.RawRecord, error) - AddRecord(ctx context.Context, rec *aclpb.RawRecord) error -} diff --git a/pkg/acl/treestorage/inmemory.go b/pkg/acl/storage/inmemory.go similarity index 81% rename from pkg/acl/treestorage/inmemory.go rename to pkg/acl/storage/inmemory.go index 1fd98e7a..94e65557 100644 --- a/pkg/acl/treestorage/inmemory.go +++ b/pkg/acl/storage/inmemory.go @@ -1,4 +1,4 @@ -package treestorage +package storage import ( "context" @@ -86,21 +86,21 @@ func (t *inMemoryTreeStorage) GetRawChange(ctx context.Context, changeId string) return nil, fmt.Errorf("could not get change with id: %s", changeId) } -type inMemoryTreeStorageProvider struct { - trees map[string]TreeStorage +type inMemoryStorageProvider struct { + objects map[string]Storage sync.RWMutex } -func (i *inMemoryTreeStorageProvider) TreeStorage(treeId string) (TreeStorage, error) { +func (i *inMemoryStorageProvider) Storage(id string) (Storage, error) { i.RLock() defer i.RUnlock() - if tree, exists := i.trees[treeId]; exists { + if tree, exists := i.objects[id]; exists { return tree, nil } return nil, ErrUnknownTreeId } -func (i *inMemoryTreeStorageProvider) CreateTreeStorage(treeId string, header *aclpb.Header, changes []*aclpb.RawChange) (TreeStorage, error) { +func (i *inMemoryStorageProvider) CreateTreeStorage(treeId string, header *aclpb.Header, changes []*aclpb.RawChange) (TreeStorage, error) { i.Lock() defer i.Unlock() res, err := NewInMemoryTreeStorage(treeId, header, changes) @@ -108,12 +108,12 @@ func (i *inMemoryTreeStorageProvider) CreateTreeStorage(treeId string, header *a return nil, err } - i.trees[treeId] = res + i.objects[treeId] = res return res, nil } func NewInMemoryTreeStorageProvider() Provider { - return &inMemoryTreeStorageProvider{ - trees: make(map[string]TreeStorage), + return &inMemoryStorageProvider{ + objects: make(map[string]Storage), } } diff --git a/pkg/acl/storage/liststorage.go b/pkg/acl/storage/liststorage.go new file mode 100644 index 00000000..ff2ff426 --- /dev/null +++ b/pkg/acl/storage/liststorage.go @@ -0,0 +1,14 @@ +package storage + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" +) + +type ListStorage interface { + Storage + Head() (*aclpb.RawRecord, error) + + GetRawRecord(ctx context.Context, id string) (*aclpb.RawRecord, error) + AddRawRecord(ctx context.Context, rec *aclpb.RawRecord) error +} diff --git a/pkg/acl/treestorage/provider.go b/pkg/acl/storage/provider.go similarity index 81% rename from pkg/acl/treestorage/provider.go rename to pkg/acl/storage/provider.go index 2a2a98e2..8dff81db 100644 --- a/pkg/acl/treestorage/provider.go +++ b/pkg/acl/storage/provider.go @@ -1,4 +1,4 @@ -package treestorage +package storage import ( "errors" @@ -8,6 +8,6 @@ import ( var ErrUnknownTreeId = errors.New("tree does not exist") type Provider interface { - TreeStorage(treeId string) (TreeStorage, error) + Storage(id string) (Storage, error) CreateTreeStorage(treeId string, header *aclpb.Header, changes []*aclpb.RawChange) (TreeStorage, error) } diff --git a/pkg/acl/storage/storage.go b/pkg/acl/storage/storage.go new file mode 100644 index 00000000..7f14166c --- /dev/null +++ b/pkg/acl/storage/storage.go @@ -0,0 +1,8 @@ +package storage + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + +type Storage interface { + ID() (string, error) + Header() (*aclpb.Header, error) +} diff --git a/pkg/acl/treestorage/storage.go b/pkg/acl/storage/treestorage.go similarity index 81% rename from pkg/acl/treestorage/storage.go rename to pkg/acl/storage/treestorage.go index bc3f5406..65146c39 100644 --- a/pkg/acl/treestorage/storage.go +++ b/pkg/acl/storage/treestorage.go @@ -1,4 +1,4 @@ -package treestorage +package storage import ( "context" @@ -6,9 +6,7 @@ import ( ) type TreeStorage interface { - ID() (string, error) - - Header() (*aclpb.Header, error) + Storage Heads() ([]string, error) SetHeads(heads []string) error diff --git a/pkg/acl/testutils/testchanges/proto/test.pb.go b/pkg/acl/testutils/testchanges/proto/test.pb.go new file mode 100644 index 00000000..53be5aba --- /dev/null +++ b/pkg/acl/testutils/testchanges/proto/test.pb.go @@ -0,0 +1,1088 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: pkg/acl/testutils/testchanges/proto/test.proto + +package testchanges + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type PlainTextChange struct { +} + +func (m *PlainTextChange) Reset() { *m = PlainTextChange{} } +func (m *PlainTextChange) String() string { return proto.CompactTextString(m) } +func (*PlainTextChange) ProtoMessage() {} +func (*PlainTextChange) Descriptor() ([]byte, []int) { + return fileDescriptor_37f33c266ada4318, []int{0} +} +func (m *PlainTextChange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PlainTextChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PlainTextChange.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 *PlainTextChange) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChange.Merge(m, src) +} +func (m *PlainTextChange) XXX_Size() int { + return m.Size() +} +func (m *PlainTextChange) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChange.DiscardUnknown(m) +} + +var xxx_messageInfo_PlainTextChange proto.InternalMessageInfo + +type PlainTextChangeContent struct { + // Types that are valid to be assigned to Value: + // *PlainTextChangeContentValueOfTextAppend + Value IsPlainTextChangeContentValue `protobuf_oneof:"value"` +} + +func (m *PlainTextChangeContent) Reset() { *m = PlainTextChangeContent{} } +func (m *PlainTextChangeContent) String() string { return proto.CompactTextString(m) } +func (*PlainTextChangeContent) ProtoMessage() {} +func (*PlainTextChangeContent) Descriptor() ([]byte, []int) { + return fileDescriptor_37f33c266ada4318, []int{0, 0} +} +func (m *PlainTextChangeContent) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PlainTextChangeContent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PlainTextChangeContent.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 *PlainTextChangeContent) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChangeContent.Merge(m, src) +} +func (m *PlainTextChangeContent) XXX_Size() int { + return m.Size() +} +func (m *PlainTextChangeContent) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChangeContent.DiscardUnknown(m) +} + +var xxx_messageInfo_PlainTextChangeContent proto.InternalMessageInfo + +type IsPlainTextChangeContentValue interface { + IsPlainTextChangeContentValue() + MarshalTo([]byte) (int, error) + Size() int +} + +type PlainTextChangeContentValueOfTextAppend struct { + TextAppend *PlainTextChangeTextAppend `protobuf:"bytes,1,opt,name=textAppend,proto3,oneof" json:"textAppend,omitempty"` +} + +func (*PlainTextChangeContentValueOfTextAppend) IsPlainTextChangeContentValue() {} + +func (m *PlainTextChangeContent) GetValue() IsPlainTextChangeContentValue { + if m != nil { + return m.Value + } + return nil +} + +func (m *PlainTextChangeContent) GetTextAppend() *PlainTextChangeTextAppend { + if x, ok := m.GetValue().(*PlainTextChangeContentValueOfTextAppend); ok { + return x.TextAppend + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*PlainTextChangeContent) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*PlainTextChangeContentValueOfTextAppend)(nil), + } +} + +type PlainTextChangeTextAppend struct { + Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` +} + +func (m *PlainTextChangeTextAppend) Reset() { *m = PlainTextChangeTextAppend{} } +func (m *PlainTextChangeTextAppend) String() string { return proto.CompactTextString(m) } +func (*PlainTextChangeTextAppend) ProtoMessage() {} +func (*PlainTextChangeTextAppend) Descriptor() ([]byte, []int) { + return fileDescriptor_37f33c266ada4318, []int{0, 1} +} +func (m *PlainTextChangeTextAppend) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PlainTextChangeTextAppend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PlainTextChangeTextAppend.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 *PlainTextChangeTextAppend) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChangeTextAppend.Merge(m, src) +} +func (m *PlainTextChangeTextAppend) XXX_Size() int { + return m.Size() +} +func (m *PlainTextChangeTextAppend) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChangeTextAppend.DiscardUnknown(m) +} + +var xxx_messageInfo_PlainTextChangeTextAppend proto.InternalMessageInfo + +func (m *PlainTextChangeTextAppend) GetText() string { + if m != nil { + return m.Text + } + return "" +} + +type PlainTextChangeSnapshot struct { + Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` +} + +func (m *PlainTextChangeSnapshot) Reset() { *m = PlainTextChangeSnapshot{} } +func (m *PlainTextChangeSnapshot) String() string { return proto.CompactTextString(m) } +func (*PlainTextChangeSnapshot) ProtoMessage() {} +func (*PlainTextChangeSnapshot) Descriptor() ([]byte, []int) { + return fileDescriptor_37f33c266ada4318, []int{0, 2} +} +func (m *PlainTextChangeSnapshot) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PlainTextChangeSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PlainTextChangeSnapshot.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 *PlainTextChangeSnapshot) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChangeSnapshot.Merge(m, src) +} +func (m *PlainTextChangeSnapshot) XXX_Size() int { + return m.Size() +} +func (m *PlainTextChangeSnapshot) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChangeSnapshot.DiscardUnknown(m) +} + +var xxx_messageInfo_PlainTextChangeSnapshot proto.InternalMessageInfo + +func (m *PlainTextChangeSnapshot) GetText() string { + if m != nil { + return m.Text + } + return "" +} + +type PlainTextChangeData struct { + Content []*PlainTextChangeContent `protobuf:"bytes,1,rep,name=content,proto3" json:"content,omitempty"` + Snapshot *PlainTextChangeSnapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` +} + +func (m *PlainTextChangeData) Reset() { *m = PlainTextChangeData{} } +func (m *PlainTextChangeData) String() string { return proto.CompactTextString(m) } +func (*PlainTextChangeData) ProtoMessage() {} +func (*PlainTextChangeData) Descriptor() ([]byte, []int) { + return fileDescriptor_37f33c266ada4318, []int{0, 3} +} +func (m *PlainTextChangeData) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PlainTextChangeData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PlainTextChangeData.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 *PlainTextChangeData) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChangeData.Merge(m, src) +} +func (m *PlainTextChangeData) XXX_Size() int { + return m.Size() +} +func (m *PlainTextChangeData) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChangeData.DiscardUnknown(m) +} + +var xxx_messageInfo_PlainTextChangeData proto.InternalMessageInfo + +func (m *PlainTextChangeData) GetContent() []*PlainTextChangeContent { + if m != nil { + return m.Content + } + return nil +} + +func (m *PlainTextChangeData) GetSnapshot() *PlainTextChangeSnapshot { + if m != nil { + return m.Snapshot + } + return nil +} + +func init() { + proto.RegisterType((*PlainTextChange)(nil), "anytype.PlainTextChange") + proto.RegisterType((*PlainTextChangeContent)(nil), "anytype.PlainTextChange.Content") + proto.RegisterType((*PlainTextChangeTextAppend)(nil), "anytype.PlainTextChange.TextAppend") + proto.RegisterType((*PlainTextChangeSnapshot)(nil), "anytype.PlainTextChange.Snapshot") + proto.RegisterType((*PlainTextChangeData)(nil), "anytype.PlainTextChange.Data") +} + +func init() { + proto.RegisterFile("pkg/acl/testutils/testchanges/proto/test.proto", fileDescriptor_37f33c266ada4318) +} + +var fileDescriptor_37f33c266ada4318 = []byte{ + // 266 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2b, 0xc8, 0x4e, 0xd7, + 0x4f, 0x4c, 0xce, 0xd1, 0x2f, 0x49, 0x2d, 0x2e, 0x29, 0x2d, 0xc9, 0xcc, 0x29, 0x06, 0xb3, 0x92, + 0x33, 0x12, 0xf3, 0xd2, 0x53, 0x8b, 0xf5, 0x0b, 0x8a, 0xf2, 0x4b, 0xf2, 0xc1, 0x22, 0x7a, 0x60, + 0xa6, 0x10, 0x7b, 0x62, 0x5e, 0x65, 0x49, 0x65, 0x41, 0xaa, 0xd2, 0x26, 0x26, 0x2e, 0xfe, 0x80, + 0x9c, 0xc4, 0xcc, 0xbc, 0x90, 0xd4, 0x8a, 0x12, 0x67, 0xb0, 0x72, 0xa9, 0x48, 0x2e, 0x76, 0xe7, + 0xfc, 0xbc, 0x92, 0xd4, 0xbc, 0x12, 0x21, 0x57, 0x2e, 0xae, 0x92, 0xd4, 0x8a, 0x12, 0xc7, 0x82, + 0x82, 0xd4, 0xbc, 0x14, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x6e, 0x23, 0x65, 0x3d, 0xa8, 0x66, 0x3d, + 0x34, 0x8d, 0x7a, 0x21, 0x70, 0xa5, 0x1e, 0x0c, 0x41, 0x48, 0x1a, 0x9d, 0xd8, 0xb9, 0x58, 0xcb, + 0x12, 0x73, 0x4a, 0x53, 0xa5, 0x14, 0xb8, 0xb8, 0x10, 0x8a, 0x84, 0x84, 0xb8, 0x58, 0x40, 0x8a, + 0xc0, 0xe6, 0x72, 0x06, 0x81, 0xd9, 0x52, 0x72, 0x5c, 0x1c, 0xc1, 0x79, 0x89, 0x05, 0xc5, 0x19, + 0xf9, 0x25, 0x58, 0xe5, 0x1b, 0x19, 0xb9, 0x58, 0x5c, 0x12, 0x4b, 0x12, 0x85, 0xac, 0xb8, 0xd8, + 0x93, 0x21, 0xae, 0x94, 0x60, 0x54, 0x60, 0xd6, 0xe0, 0x36, 0x52, 0xc0, 0xe9, 0x2e, 0xa8, 0x6f, + 0x82, 0x60, 0x1a, 0x84, 0x6c, 0xb9, 0x38, 0x8a, 0xa1, 0x96, 0x48, 0x30, 0x81, 0x3d, 0xa5, 0x88, + 0x53, 0x33, 0xcc, 0x35, 0x41, 0x70, 0x2d, 0x4e, 0xaa, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, + 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, + 0x2c, 0xc7, 0x10, 0xc5, 0x8d, 0x14, 0xea, 0x49, 0x6c, 0xe0, 0xb0, 0x36, 0x06, 0x04, 0x00, 0x00, + 0xff, 0xff, 0xf8, 0x8c, 0x6a, 0x1d, 0x9d, 0x01, 0x00, 0x00, +} + +func (m *PlainTextChange) 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 *PlainTextChange) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PlainTextChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *PlainTextChangeContent) 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 *PlainTextChangeContent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PlainTextChangeContent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Value != nil { + { + size := m.Value.Size() + i -= size + if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *PlainTextChangeContentValueOfTextAppend) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PlainTextChangeContentValueOfTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.TextAppend != nil { + { + size, err := m.TextAppend.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTest(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *PlainTextChangeTextAppend) 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 *PlainTextChangeTextAppend) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PlainTextChangeTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Text) > 0 { + i -= len(m.Text) + copy(dAtA[i:], m.Text) + i = encodeVarintTest(dAtA, i, uint64(len(m.Text))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PlainTextChangeSnapshot) 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 *PlainTextChangeSnapshot) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PlainTextChangeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Text) > 0 { + i -= len(m.Text) + copy(dAtA[i:], m.Text) + i = encodeVarintTest(dAtA, i, uint64(len(m.Text))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PlainTextChangeData) 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 *PlainTextChangeData) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PlainTextChangeData) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Snapshot != nil { + { + size, err := m.Snapshot.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTest(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Content) > 0 { + for iNdEx := len(m.Content) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Content[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTest(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintTest(dAtA []byte, offset int, v uint64) int { + offset -= sovTest(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *PlainTextChange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *PlainTextChangeContent) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != nil { + n += m.Value.Size() + } + return n +} + +func (m *PlainTextChangeContentValueOfTextAppend) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.TextAppend != nil { + l = m.TextAppend.Size() + n += 1 + l + sovTest(uint64(l)) + } + return n +} +func (m *PlainTextChangeTextAppend) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Text) + if l > 0 { + n += 1 + l + sovTest(uint64(l)) + } + return n +} + +func (m *PlainTextChangeSnapshot) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Text) + if l > 0 { + n += 1 + l + sovTest(uint64(l)) + } + return n +} + +func (m *PlainTextChangeData) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Content) > 0 { + for _, e := range m.Content { + l = e.Size() + n += 1 + l + sovTest(uint64(l)) + } + } + if m.Snapshot != nil { + l = m.Snapshot.Size() + n += 1 + l + sovTest(uint64(l)) + } + return n +} + +func sovTest(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTest(x uint64) (n int) { + return sovTest(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *PlainTextChange) 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 ErrIntOverflowTest + } + 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: PlainTextChange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PlainTextChange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTest(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTest + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PlainTextChangeContent) 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 ErrIntOverflowTest + } + 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: Content: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Content: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TextAppend", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTest + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTest + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &PlainTextChangeTextAppend{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &PlainTextChangeContentValueOfTextAppend{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTest(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTest + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PlainTextChangeTextAppend) 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 ErrIntOverflowTest + } + 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: TextAppend: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TextAppend: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Text", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + 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 ErrInvalidLengthTest + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTest + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Text = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTest(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTest + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PlainTextChangeSnapshot) 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 ErrIntOverflowTest + } + 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: Snapshot: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Snapshot: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Text", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + 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 ErrInvalidLengthTest + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTest + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Text = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTest(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTest + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PlainTextChangeData) 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 ErrIntOverflowTest + } + 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: Data: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Data: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Content", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTest + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTest + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Content = append(m.Content, &PlainTextChangeContent{}) + if err := m.Content[len(m.Content)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Snapshot", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTest + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTest + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Snapshot == nil { + m.Snapshot = &PlainTextChangeSnapshot{} + } + if err := m.Snapshot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTest(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTest + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTest(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTest + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTest + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTest + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTest + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTest + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTest + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTest = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTest = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTest = fmt.Errorf("proto: unexpected end of group") +) diff --git a/pkg/acl/testutils/testchanges/proto/test.proto b/pkg/acl/testutils/testchanges/proto/test.proto new file mode 100644 index 00000000..b861050e --- /dev/null +++ b/pkg/acl/testutils/testchanges/proto/test.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; +package anytype; +option go_package = "testchanges"; + +message PlainTextChange { + message Content { + oneof value { + TextAppend textAppend = 1; + } + } + + message TextAppend { + string text = 1; + } + + message Snapshot { + string text = 1; + } + + message Data { + repeated Content content = 1; + Snapshot snapshot = 2; + } +} \ No newline at end of file diff --git a/pkg/acl/tree/commontree.go b/pkg/acl/tree/commontree.go index 9018c878..50a9b0f6 100644 --- a/pkg/acl/tree/commontree.go +++ b/pkg/acl/tree/commontree.go @@ -2,7 +2,7 @@ package tree import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" ) type CommonTree interface { @@ -15,7 +15,7 @@ type CommonTree interface { HasChange(string) bool SnapshotPath() []string ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) - Storage() treestorage.TreeStorage + Storage() storage.TreeStorage DebugDump() (string, error) Close() error } diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index 8e1cfad5..f7ae2e4c 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -6,7 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" @@ -56,7 +56,7 @@ type DocTree interface { } type docTree struct { - treeStorage treestorage.TreeStorage + treeStorage storage.TreeStorage accountData *account.AccountData updateListener TreeUpdateListener @@ -76,7 +76,7 @@ type docTree struct { sync.RWMutex } -func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountData, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { +func BuildDocTreeWithIdentity(t storage.TreeStorage, acc *account.AccountData, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { treeBuilder := newTreeBuilder(t, acc.Decoder) validator := newTreeValidator() @@ -112,7 +112,7 @@ func BuildDocTreeWithIdentity(t treestorage.TreeStorage, acc *account.AccountDat return docTree, nil } -func BuildDocTree(t treestorage.TreeStorage, decoder keys.Decoder, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { +func BuildDocTree(t storage.TreeStorage, decoder keys.Decoder, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { treeBuilder := newTreeBuilder(t, decoder) validator := newTreeValidator() @@ -182,7 +182,7 @@ func (d *docTree) Header() *aclpb.Header { return d.header } -func (d *docTree) Storage() treestorage.TreeStorage { +func (d *docTree) Storage() storage.TreeStorage { return d.treeStorage } diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index ea93af90..11e95955 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" @@ -23,10 +23,10 @@ type treeBuilder struct { identityKeys map[string]signingkey.PubKey signingPubKeyDecoder keys.Decoder tree *Tree - treeStorage treestorage.TreeStorage + treeStorage storage.TreeStorage } -func newTreeBuilder(t treestorage.TreeStorage, decoder keys.Decoder) *treeBuilder { +func newTreeBuilder(t storage.TreeStorage, decoder keys.Decoder) *treeBuilder { return &treeBuilder{ signingPubKeyDecoder: decoder, treeStorage: t, diff --git a/pkg/acl/tree/treestorage.go b/pkg/acl/tree/treestorage.go index 5c9e753b..a82a1ce6 100644 --- a/pkg/acl/tree/treestorage.go +++ b/pkg/acl/tree/treestorage.go @@ -4,7 +4,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/gogo/protobuf/proto" "time" @@ -14,7 +14,7 @@ import ( //func CreateNewTreeStorageWithACL( // acc *account.AccountData, // build func(builder list.ACLChangeBuilder) error, -// create treestorage.CreatorFunc) (treestorage.TreeStorage, error) { +// create treestorage.CreatorFunc) (treestorage.Storage, error) { // bld := list.newACLChangeBuilder() // bld.Init( // list.newACLStateWithIdentity(acc.Identity, acc.EncKey, signingkey.NewEd25519PubKeyDecoder()), @@ -56,7 +56,7 @@ func CreateNewTreeStorage( acc *account.AccountData, aclList list.ACLList, content proto.Marshaler, - create treestorage.CreatorFunc) (treestorage.TreeStorage, error) { + create storage.CreatorFunc) (storage.TreeStorage, error) { state := aclList.ACLState() change := &aclpb.Change{ diff --git a/service/api/service.go b/service/api/service.go index a9b7f1f3..b98ca820 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -54,7 +54,6 @@ func (s *service) Run(ctx context.Context) (err error) { mux := http.NewServeMux() mux.HandleFunc("/treeDump", s.treeDump) mux.HandleFunc("/createDocumentTree", s.createDocumentTree) - mux.HandleFunc("/createACLTree", s.createACLTree) mux.HandleFunc("/appendDocument", s.appendDocument) s.srv.Handler = mux @@ -99,21 +98,10 @@ func (s *service) createDocumentTree(w http.ResponseWriter, req *http.Request) { var ( query = req.URL.Query() text = query.Get("text") - aclTreeId = query.Get("aclTreeId") + aclListId = query.Get("aclListId") ) timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30) - treeId, err := s.documentService.CreateDocumentTree(timeoutCtx, aclTreeId, text) - cancel() - if err != nil { - sendText(w, http.StatusInternalServerError, err.Error()) - return - } - sendText(w, http.StatusOK, treeId) -} - -func (s *service) createACLTree(w http.ResponseWriter, req *http.Request) { - timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30) - treeId, err := s.documentService.CreateACLTree(timeoutCtx) + treeId, err := s.documentService.CreateDocumentTree(timeoutCtx, aclListId, text) cancel() if err != nil { sendText(w, http.StatusInternalServerError, err.Error()) diff --git a/service/document/service.go b/service/document/service.go index 33e6a271..369d8f1c 100644 --- a/service/document/service.go +++ b/service/document/service.go @@ -7,9 +7,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" + testchanges "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/proto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage" @@ -35,7 +34,6 @@ type service struct { type Service interface { UpdateDocumentTree(ctx context.Context, id, text string) error - CreateACLTree(ctx context.Context) (id string, err error) CreateDocumentTree(ctx context.Context, aclTreeId string, text string) (id string, err error) } @@ -60,7 +58,7 @@ func (s *service) Name() (name string) { } func (s *service) Run(ctx context.Context) (err error) { - return nil + return s.importACLList(ctx) } func (s *service) Close(ctx context.Context) (err error) { @@ -70,7 +68,7 @@ func (s *service) Close(ctx context.Context) (err error) { func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err error) { var ( ch *aclpb.RawChange - header *treepb.TreeHeader + header *aclpb.Header snapshotPath []string heads []string ) @@ -85,8 +83,8 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err docTree.Lock() defer docTree.Unlock() - err = s.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error { - aclTree := obj.(tree.ACLTree) + err = s.treeCache.Do(ctx, docTree.Header().AclListId, func(obj interface{}) error { + aclTree := obj.(list.ACLList) aclTree.RLock() defer aclTree.RUnlock() @@ -123,69 +121,20 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err }, header, id)) } -func (s *service) CreateACLTree(ctx context.Context) (id string, err error) { - acc := s.account.Account() - var ( - ch *aclpb.RawChange - header *treepb.TreeHeader - snapshotPath []string - heads []string - ) - - t, err := tree.CreateNewTreeStorageWithACL(acc, func(builder list.ACLChangeBuilder) error { - err := builder.UserAdd(acc.Identity, acc.EncKey.GetPublic(), aclpb.ACLChange_Admin) - if err != nil { - return err - } - // adding all predefined nodes to the document as admins - for _, n := range s.nodes { - err = builder.UserAdd(n.SigningKeyString, n.EncryptionKey, aclpb.ACLChange_Admin) - if err != nil { - return err - } - } - return nil - }, s.storage.CreateTreeStorage) - - id, err = t.TreeID() - if err != nil { - return "", err - } - - header, err = t.Header() - if err != nil { - return "", err - } - - heads = []string{header.FirstChangeId} - snapshotPath = []string{header.FirstChangeId} - ch, err = t.GetChange(ctx, header.FirstChangeId) - if err != nil { - return "", err - } - - if err != nil { - return "", err - } - - err = s.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ - Heads: heads, - Changes: []*aclpb.RawChange{ch}, - SnapshotPath: snapshotPath, - }, header, id)) - return id, nil +func (s *service) importACLList(ctx context.Context) (err error) { + panic("not implemented") } -func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text string) (id string, err error) { +func (s *service) CreateDocumentTree(ctx context.Context, aclListId string, text string) (id string, err error) { acc := s.account.Account() var ( ch *aclpb.RawChange - header *treepb.TreeHeader + header *aclpb.Header snapshotPath []string heads []string ) - err = s.treeCache.Do(ctx, aclTreeId, func(obj interface{}) error { - t := obj.(tree.ACLTree) + err = s.treeCache.Do(ctx, aclListId, func(obj interface{}) error { + t := obj.(list.ACLList) t.RLock() defer t.RUnlock() @@ -205,9 +154,9 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text return err } - heads = []string{header.FirstChangeId} - snapshotPath = []string{header.FirstChangeId} - ch, err = doc.GetRawChange(ctx, header.FirstChangeId) + heads = []string{header.FirstId} + snapshotPath = []string{header.FirstId} + ch, err = doc.GetRawChange(ctx, header.FirstId) if err != nil { return err } @@ -233,26 +182,26 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text } func createInitialTextChange(text string) proto.Marshaler { - return &testchangepb.PlainTextChangeData{ - Content: []*testchangepb.PlainTextChangeContent{ + return &testchanges.PlainTextChangeData{ + Content: []*testchanges.PlainTextChangeContent{ createAppendTextChangeContent(text), }, - Snapshot: &testchangepb.PlainTextChangeSnapshot{Text: text}, + Snapshot: &testchanges.PlainTextChangeSnapshot{Text: text}, } } func createAppendTextChange(text string) proto.Marshaler { - return &testchangepb.PlainTextChangeData{ - Content: []*testchangepb.PlainTextChangeContent{ + return &testchanges.PlainTextChangeData{ + Content: []*testchanges.PlainTextChangeContent{ createAppendTextChangeContent(text), }, } } -func createAppendTextChangeContent(text string) *testchangepb.PlainTextChangeContent { - return &testchangepb.PlainTextChangeContent{ - Value: &testchangepb.PlainTextChangeContentValueOfTextAppend{ - TextAppend: &testchangepb.PlainTextChangeTextAppend{ +func createAppendTextChangeContent(text string) *testchanges.PlainTextChangeContent { + return &testchanges.PlainTextChangeContent{ + Value: &testchanges.PlainTextChangeContentValueOfTextAppend{ + TextAppend: &testchanges.PlainTextChangeTextAppend{ Text: text, }, }, diff --git a/service/storage/service.go b/service/storage/service.go index 1f495034..5ee9efa4 100644 --- a/service/storage/service.go +++ b/service/storage/service.go @@ -4,14 +4,13 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" ) var CName = "storage" type Service interface { - treestorage.Provider + storage.Provider } func New() app.Component { @@ -19,19 +18,19 @@ func New() app.Component { } type service struct { - storageProvider treestorage.Provider + storageProvider storage.Provider } func (s *service) Init(ctx context.Context, a *app.App) (err error) { - s.storageProvider = treestorage.NewInMemoryTreeStorageProvider() + s.storageProvider = storage.NewInMemoryTreeStorageProvider() return nil } -func (s *service) TreeStorage(treeId string) (treestorage.TreeStorage, error) { - return s.storageProvider.TreeStorage(treeId) +func (s *service) Storage(treeId string) (storage.Storage, error) { + return s.storageProvider.Storage(treeId) } -func (s *service) CreateTreeStorage(treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) (treestorage.TreeStorage, error) { +func (s *service) CreateTreeStorage(treeId string, header *aclpb.Header, changes []*aclpb.RawChange) (storage.TreeStorage, error) { return s.storageProvider.CreateTreeStorage(treeId, header, changes) } diff --git a/service/sync/message/service.go b/service/sync/message/service.go index 78a4829c..423f7393 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -119,6 +119,6 @@ func msgInfo(content *syncproto.Sync) (syncMethod string) { case msg.GetHeadUpdate() != nil: syncMethod = "HeadUpdate" } - syncMethod = fmt.Sprintf("method: %s, treeType: %s", syncMethod, content.TreeHeader.Type.String()) + syncMethod = fmt.Sprintf("method: %s, treeType: %s", syncMethod, content.TreeHeader.DocType.String()) return } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 4600ab96..e4938554 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -6,9 +6,9 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" @@ -77,7 +77,7 @@ func (r *requestHandler) HandleHeadUpdate( ctx context.Context, senderId string, update *syncproto.SyncHeadUpdate, - header *treepb.TreeHeader, + header *aclpb.Header, treeId string) (err error) { var ( @@ -88,81 +88,41 @@ func (r *requestHandler) HandleHeadUpdate( log.With(zap.String("peerId", senderId), zap.String("treeId", treeId)). Debug("processing head update") - updateACLTree := func() { - err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { - t := obj.(tree.ACLTree) - t.Lock() - defer t.Unlock() + err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { + docTree := obj.(tree.DocTree) + docTree.Lock() + defer docTree.Unlock() - if slice.UnsortedEquals(update.Heads, t.Heads()) { - return nil - } + if slice.UnsortedEquals(update.Heads, docTree.Heads()) { + return nil + } + + return r.treeCache.Do(ctx, docTree.Header().AclListId, func(obj interface{}) error { + aclTree := obj.(list.ACLList) + aclTree.RLock() + defer aclTree.RUnlock() // TODO: check if we already have those changes - result, err = t.AddRawChanges(ctx, update.Changes...) + result, err = docTree.AddRawChanges(ctx, aclTree, update.Changes...) if err != nil { return err } - log.With(zap.Strings("update heads", update.Heads), zap.Strings("tree heads", t.Heads())). + log.With(zap.Strings("update heads", update.Heads), zap.Strings("tree heads", docTree.Heads())). Debug("comparing heads after head update") - shouldFullSync := !slice.UnsortedEquals(update.Heads, t.Heads()) - snapshotPath = t.SnapshotPath() + shouldFullSync := !slice.UnsortedEquals(update.Heads, docTree.Heads()) + snapshotPath = docTree.SnapshotPath() if shouldFullSync { - fullRequest, err = r.prepareFullSyncRequest(treeId, header, update.SnapshotPath, t) + fullRequest, err = r.prepareFullSyncRequest(update.SnapshotPath, docTree) if err != nil { return err } } return nil }) - } - - updateDocTree := func() { - err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { - docTree := obj.(tree.DocTree) - docTree.Lock() - defer docTree.Unlock() - - if slice.UnsortedEquals(update.Heads, docTree.Heads()) { - return nil - } - - return r.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error { - aclTree := obj.(tree.ACLTree) - aclTree.RLock() - defer aclTree.RUnlock() - - // TODO: check if we already have those changes - result, err = docTree.AddRawChanges(ctx, aclTree, update.Changes...) - if err != nil { - return err - } - log.With(zap.Strings("update heads", update.Heads), zap.Strings("tree heads", docTree.Heads())). - Debug("comparing heads after head update") - shouldFullSync := !slice.UnsortedEquals(update.Heads, docTree.Heads()) - snapshotPath = docTree.SnapshotPath() - if shouldFullSync { - fullRequest, err = r.prepareFullSyncRequest(treeId, header, update.SnapshotPath, docTree) - if err != nil { - return err - } - } - return nil - }) - }) - } - - switch header.Type { - case treepb.TreeHeader_ACLTree: - updateACLTree() - case treepb.TreeHeader_DocTree: - updateDocTree() - default: - return ErrIncorrectDocType - } + }) // if there are no such tree - if err == treestorage.ErrUnknownTreeId { + if err == storage.ErrUnknownTreeId { // TODO: maybe we can optimize this by sending the header and stuff right away, so when the tree is created we are able to add it on first request fullRequest = &syncproto.SyncFullRequest{} } @@ -188,7 +148,7 @@ func (r *requestHandler) HandleFullSyncRequest( ctx context.Context, senderId string, request *syncproto.SyncFullRequest, - header *treepb.TreeHeader, + header *aclpb.Header, treeId string) (err error) { var ( @@ -199,74 +159,36 @@ func (r *requestHandler) HandleFullSyncRequest( log.With(zap.String("peerId", senderId), zap.String("treeId", treeId)). Debug("processing full sync request") - requestACLTree := func() { - err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { - t := obj.(tree.ACLTree) - t.Lock() - defer t.Unlock() - - //if slice.UnsortedEquals(request.Heads, t.Heads()) { - // return nil - //} + log.Info("getting doc tree from treeCache", zap.String("treeId", treeId)) + err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { + docTree := obj.(tree.DocTree) + docTree.Lock() + defer docTree.Unlock() + //if slice.UnsortedEquals(request.Heads, docTree.Heads()) { + // return nil + //} + log.Info("getting tree from treeCache", zap.String("aclId", docTree.Header().AclListId)) + return r.treeCache.Do(ctx, docTree.Header().AclListId, func(obj interface{}) error { + aclTree := obj.(list.ACLList) + aclTree.RLock() + defer aclTree.RUnlock() // TODO: check if we already have those changes // if we have non-empty request if len(request.Heads) != 0 { - result, err = t.AddRawChanges(ctx, request.Changes...) + result, err = docTree.AddRawChanges(ctx, aclTree, request.Changes...) if err != nil { return err } } - snapshotPath = t.SnapshotPath() - fullResponse, err = r.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Changes, t) + snapshotPath = docTree.SnapshotPath() + fullResponse, err = r.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Changes, docTree) if err != nil { return err } return nil }) - } - - requestDocTree := func() { - log.Info("getting doc tree from treeCache", zap.String("treeId", treeId)) - err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { - docTree := obj.(tree.DocTree) - docTree.Lock() - defer docTree.Unlock() - - //if slice.UnsortedEquals(request.Heads, docTree.Heads()) { - // return nil - //} - log.Info("getting tree from treeCache", zap.String("aclId", docTree.Header().AclTreeId)) - return r.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error { - aclTree := obj.(tree.ACLTree) - aclTree.RLock() - defer aclTree.RUnlock() - // TODO: check if we already have those changes - // if we have non-empty request - if len(request.Heads) != 0 { - result, err = docTree.AddRawChanges(ctx, aclTree, request.Changes...) - if err != nil { - return err - } - } - snapshotPath = docTree.SnapshotPath() - fullResponse, err = r.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Changes, docTree) - if err != nil { - return err - } - return nil - }) - }) - } - - switch header.Type { - case treepb.TreeHeader_ACLTree: - requestACLTree() - case treepb.TreeHeader_DocTree: - requestDocTree() - default: - return ErrIncorrectDocType - } + }) if err != nil { return err @@ -290,7 +212,7 @@ func (r *requestHandler) HandleFullSyncResponse( ctx context.Context, senderId string, response *syncproto.SyncFullResponse, - header *treepb.TreeHeader, + header *aclpb.Header, treeId string) (err error) { var ( @@ -300,66 +222,35 @@ func (r *requestHandler) HandleFullSyncResponse( log.With(zap.String("peerId", senderId), zap.String("treeId", treeId)). Debug("processing full sync response") - responseACLTree := func() { - err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { - t := obj.(tree.ACLTree) - t.Lock() - defer t.Unlock() + err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { + docTree := obj.(tree.DocTree) + docTree.Lock() + defer docTree.Unlock() - if slice.UnsortedEquals(response.Heads, t.Heads()) { - return nil - } + if slice.UnsortedEquals(response.Heads, docTree.Heads()) { + return nil + } + return r.treeCache.Do(ctx, docTree.Header().AclListId, func(obj interface{}) error { + aclTree := obj.(list.ACLList) + aclTree.RLock() + defer aclTree.RUnlock() // TODO: check if we already have those changes - result, err = t.AddRawChanges(ctx, response.Changes...) + result, err = docTree.AddRawChanges(ctx, aclTree, response.Changes...) if err != nil { return err } - snapshotPath = t.SnapshotPath() + snapshotPath = docTree.SnapshotPath() return nil }) - } - - responseDocTree := func() { - err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { - docTree := obj.(tree.DocTree) - docTree.Lock() - defer docTree.Unlock() - - if slice.UnsortedEquals(response.Heads, docTree.Heads()) { - return nil - } - - return r.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error { - aclTree := obj.(tree.ACLTree) - aclTree.RLock() - defer aclTree.RUnlock() - // TODO: check if we already have those changes - result, err = docTree.AddRawChanges(ctx, aclTree, response.Changes...) - if err != nil { - return err - } - snapshotPath = docTree.SnapshotPath() - return nil - }) - }) - } - - switch header.Type { - case treepb.TreeHeader_ACLTree: - responseACLTree() - case treepb.TreeHeader_DocTree: - responseDocTree() - default: - return ErrIncorrectDocType - } + }) // if error or nothing has changed - if (err != nil || len(result.Added) == 0) && err != treestorage.ErrUnknownTreeId { + if (err != nil || len(result.Added) == 0) && err != storage.ErrUnknownTreeId { return err } // if we have a new tree - if err == treestorage.ErrUnknownTreeId { + if err == storage.ErrUnknownTreeId { err = r.createTree(ctx, response, header, treeId) if err != nil { return err @@ -379,7 +270,7 @@ func (r *requestHandler) HandleFullSyncResponse( return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) } -func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, t tree.CommonTree) (*syncproto.SyncFullRequest, error) { +func (r *requestHandler) prepareFullSyncRequest(theirPath []string, t tree.CommonTree) (*syncproto.SyncFullRequest, error) { ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath) if err != nil { return nil, err @@ -426,7 +317,7 @@ func (r *requestHandler) prepareFullSyncResponse( func (r *requestHandler) createTree( ctx context.Context, response *syncproto.SyncFullResponse, - header *treepb.TreeHeader, + header *aclpb.Header, treeId string) error { return r.treeCache.Add( diff --git a/service/treecache/service.go b/service/treecache/service.go index ec6cae8a..c94d1fb6 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -7,6 +7,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" + aclstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" @@ -17,13 +18,13 @@ import ( const CName = "treecache" // TODO: add context -type TreeFunc = func(tree interface{}) error +type ObjFunc = func(obj interface{}) error var log = logger.NewNamed("treecache") type Service interface { - Do(ctx context.Context, treeId string, f TreeFunc) error - Add(ctx context.Context, treeId string, header *aclpb.Header, changes []*aclpb.RawChange, f TreeFunc) error + Do(ctx context.Context, treeId string, f ObjFunc) error + Add(ctx context.Context, treeId string, header *aclpb.Header, changes []*aclpb.RawChange, f ObjFunc) error } type service struct { @@ -36,7 +37,7 @@ func New() app.ComponentRunnable { return &service{} } -func (s *service) Do(ctx context.Context, treeId string, f TreeFunc) error { +func (s *service) Do(ctx context.Context, treeId string, f ObjFunc) error { log. With(zap.String("treeId", treeId)). Debug("requesting tree from cache to perform operation") @@ -49,7 +50,7 @@ func (s *service) Do(ctx context.Context, treeId string, f TreeFunc) error { return f(t) } -func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f TreeFunc) error { +func (s *service) Add(ctx context.Context, treeId string, header *aclpb.Header, changes []*aclpb.RawChange, f ObjFunc) error { log. With(zap.String("treeId", treeId), zap.Int("len(changes)", len(changes))). Debug("adding tree with changes") @@ -82,7 +83,7 @@ func (s *service) Close(ctx context.Context) (err error) { } func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error) { - t, err := s.storage.TreeStorage(id) + t, err := s.storage.Storage(id) if err != nil { return nil, err } @@ -93,7 +94,7 @@ func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error switch header.DocType { case aclpb.Header_ACL: - return list.BuildACLListWithIdentity(acc) + return list.BuildACLListWithIdentity(s.account.Account(), t.(aclstorage.ListStorage)) case aclpb.Header_DocTree: break default: @@ -101,13 +102,13 @@ func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error } log.Info("got header", zap.String("header", header.String())) var docTree tree.DocTree - // TODO: it is a question if we need to use ACLTree on the first tree build, because we can think that the tree is already validated - err = s.Do(ctx, header.AclTreeId, func(obj interface{}) error { - aclTree := obj.(tree.ACLTree) + // TODO: it is a question if we need to use ACLList on the first tree build, because we can think that the tree is already validated + err = s.Do(ctx, header.AclListId, func(obj interface{}) error { + aclTree := obj.(list.ACLList) aclTree.RLock() defer aclTree.RUnlock() - docTree, err = tree.BuildDocTreeWithIdentity(t, s.account.Account(), nil, aclTree) + docTree, err = tree.BuildDocTreeWithIdentity(t.(aclstorage.TreeStorage), s.account.Account(), nil, aclTree) if err != nil { return err } diff --git a/syncproto/helpers.go b/syncproto/helpers.go index 38bd5cf1..9fe94914 100644 --- a/syncproto/helpers.go +++ b/syncproto/helpers.go @@ -1,6 +1,6 @@ package syncproto -import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" +import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage/treepb" func WrapHeadUpdate(update *SyncHeadUpdate, header *treepb.TreeHeader, treeId string) *Sync { return &Sync{ diff --git a/syncproto/proto/sync.proto b/syncproto/proto/sync.proto index f83aef9a..c71848e4 100644 --- a/syncproto/proto/sync.proto +++ b/syncproto/proto/sync.proto @@ -3,7 +3,6 @@ package anytype; option go_package = "/syncproto"; import "pkg/acl/aclchanges/aclpb/protos/aclchanges.proto"; -import "pkg/acl/treestorage/treepb/protos/tree.proto"; message Message { Header header = 1; @@ -64,7 +63,7 @@ message Subscription { message Sync { string spaceId = 1; ContentValue message = 2; - tree.TreeHeader treeHeader = 3; + acl.Header treeHeader = 3; string treeId = 4; message ContentValue { diff --git a/syncproto/sync.pb.go b/syncproto/sync.pb.go index bf090662..f047edb3 100644 --- a/syncproto/sync.pb.go +++ b/syncproto/sync.pb.go @@ -6,7 +6,6 @@ package syncproto import ( fmt "fmt" aclpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - treepb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -590,10 +589,10 @@ func (m *SubscriptionUnsubscribeSpace) GetSpaceId() string { } type Sync struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - Message *SyncContentValue `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` - TreeHeader *treepb.TreeHeader `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` - TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Message *SyncContentValue `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + TreeHeader *aclpb.Header `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` + TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` } func (m *Sync) Reset() { *m = Sync{} } @@ -643,7 +642,7 @@ func (m *Sync) GetMessage() *SyncContentValue { return nil } -func (m *Sync) GetTreeHeader() *treepb.TreeHeader { +func (m *Sync) GetTreeHeader() *aclpb.Header { if m != nil { return m.TreeHeader } @@ -996,61 +995,60 @@ func init() { func init() { proto.RegisterFile("syncproto/proto/sync.proto", fileDescriptor_4b28dfdd48a89166) } var fileDescriptor_4b28dfdd48a89166 = []byte{ - // 858 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xd1, 0x8e, 0xda, 0x46, - 0x14, 0xc5, 0x60, 0x20, 0x5c, 0x10, 0xeb, 0x4e, 0x92, 0xd6, 0x75, 0x22, 0x84, 0x50, 0xda, 0x5a, - 0x69, 0xe4, 0x8d, 0x68, 0xa3, 0x4a, 0x7d, 0x4b, 0xb6, 0xbb, 0x02, 0x35, 0x05, 0x34, 0xc0, 0x56, - 0xea, 0x4b, 0x34, 0xd8, 0x13, 0x40, 0x78, 0xc7, 0xae, 0xc7, 0x6e, 0xcb, 0x2f, 0xf4, 0x29, 0xdf, - 0xd0, 0x6f, 0xe8, 0x47, 0xf4, 0x31, 0x8f, 0x7d, 0xac, 0x76, 0xd5, 0x7e, 0x47, 0x35, 0x33, 0x36, - 0xf6, 0x3a, 0xe4, 0x35, 0x0f, 0xc0, 0xdc, 0x33, 0xe7, 0xdc, 0x7b, 0x2e, 0xe3, 0xb9, 0x06, 0x8b, - 0xef, 0x99, 0x1b, 0x46, 0x41, 0x1c, 0x9c, 0xaa, 0x6f, 0x11, 0x3b, 0x72, 0x89, 0x9a, 0x84, 0xed, - 0xe3, 0x7d, 0x48, 0xad, 0xa7, 0xe1, 0x6e, 0x7d, 0x4a, 0x5c, 0x5f, 0x7c, 0xdc, 0x0d, 0x61, 0x6b, - 0xca, 0xc5, 0x32, 0x5c, 0x29, 0x0d, 0x2f, 0xe0, 0x4a, 0x6a, 0x3d, 0xc9, 0x14, 0x71, 0x44, 0x29, - 0x8f, 0x83, 0x88, 0xac, 0xa9, 0x5c, 0xe7, 0x1a, 0x11, 0x29, 0xf6, 0xe0, 0x02, 0x9a, 0x3f, 0x50, - 0xce, 0xc9, 0x9a, 0xa2, 0x2f, 0xa0, 0xb1, 0xa1, 0xc4, 0xa3, 0x91, 0xa9, 0xf5, 0x35, 0xbb, 0x3d, - 0x3c, 0x71, 0x52, 0x13, 0xce, 0x48, 0xc2, 0x38, 0xdd, 0x46, 0x08, 0x74, 0x8f, 0xc4, 0xc4, 0xac, - 0xf6, 0x35, 0xbb, 0x83, 0xe5, 0x7a, 0xf0, 0x87, 0x06, 0x0d, 0x45, 0x43, 0x26, 0x34, 0xe3, 0x88, - 0xb8, 0x74, 0xec, 0xc9, 0x44, 0x1d, 0x9c, 0x85, 0xe8, 0x21, 0xb4, 0x22, 0xfa, 0x73, 0x42, 0x79, - 0x3c, 0xf6, 0xa4, 0x5a, 0xc7, 0x39, 0x20, 0x74, 0x11, 0x0d, 0xfd, 0xfd, 0xd8, 0x33, 0x6b, 0x72, - 0x2f, 0x0b, 0x91, 0x0d, 0xba, 0xf0, 0x61, 0xea, 0x7d, 0xcd, 0xee, 0x0e, 0xef, 0x1d, 0x7c, 0xa5, - 0xce, 0x17, 0xfb, 0x90, 0x62, 0xc9, 0x10, 0x15, 0x3c, 0xba, 0x4a, 0xd6, 0x63, 0xf6, 0x3a, 0x30, - 0xeb, 0x7d, 0xcd, 0x6e, 0xe1, 0x1c, 0x18, 0xfc, 0x59, 0x83, 0xc6, 0x7c, 0xcf, 0x63, 0x7a, 0x85, - 0xbe, 0x81, 0xd6, 0x86, 0x30, 0x8f, 0x6f, 0xc8, 0x8e, 0xa6, 0xfd, 0x7e, 0x7a, 0xc8, 0xab, 0x38, - 0xce, 0x28, 0x23, 0xe0, 0x9c, 0x2b, 0xbc, 0x84, 0x5b, 0xb6, 0x96, 0xf6, 0xdb, 0x05, 0x2f, 0xa9, - 0x66, 0xb6, 0x65, 0x6b, 0x2c, 0x19, 0xe8, 0x33, 0xa8, 0x11, 0x77, 0x27, 0x7b, 0x69, 0x0f, 0xef, - 0x96, 0x89, 0xcf, 0xdd, 0x1d, 0x16, 0xfb, 0xd6, 0x33, 0x68, 0x8d, 0x0a, 0xd9, 0x4f, 0xe4, 0xb9, - 0xb8, 0x81, 0x7f, 0x49, 0x23, 0xbe, 0x0d, 0x98, 0x34, 0xd7, 0xc2, 0x65, 0xd8, 0x1a, 0x80, 0x2e, - 0x6a, 0x21, 0x0b, 0xee, 0x24, 0x6c, 0xfb, 0xdb, 0x62, 0x7b, 0xa5, 0xfa, 0xd0, 0xf1, 0x21, 0xb6, - 0x86, 0x50, 0x7b, 0xee, 0xee, 0xd0, 0x97, 0x50, 0xa7, 0x51, 0x14, 0x44, 0xa9, 0xe7, 0xfb, 0x65, - 0x2b, 0xe7, 0x62, 0x13, 0x2b, 0x8e, 0xf5, 0x46, 0x83, 0xba, 0x04, 0x90, 0x03, 0xba, 0x1b, 0x78, - 0x2a, 0x6b, 0x77, 0x68, 0x1d, 0x55, 0x39, 0x67, 0x81, 0x47, 0xb1, 0xe4, 0xa1, 0x3e, 0xb4, 0x3d, - 0xca, 0xdd, 0x68, 0x1b, 0xc6, 0xc2, 0x77, 0x55, 0xfa, 0x2e, 0x42, 0x83, 0x67, 0xa0, 0x0b, 0x3e, - 0x6a, 0x43, 0x73, 0x39, 0xf9, 0x7e, 0x32, 0xfd, 0x71, 0x62, 0x54, 0x50, 0x1f, 0x1e, 0x2e, 0x27, - 0xf3, 0xe5, 0x6c, 0x36, 0xc5, 0x8b, 0xf3, 0xef, 0x5e, 0xcd, 0xf0, 0x74, 0x31, 0x3d, 0x9b, 0xbe, - 0x7c, 0x75, 0x79, 0x8e, 0xe7, 0xe3, 0xe9, 0xc4, 0x80, 0xc1, 0xef, 0x55, 0xe8, 0xcc, 0x93, 0xd5, - 0x21, 0x0f, 0x7a, 0x09, 0x5d, 0xae, 0xe2, 0x15, 0x9d, 0x87, 0xc4, 0xcd, 0x4e, 0xf0, 0x51, 0xee, - 0xb1, 0x40, 0xcf, 0x82, 0x94, 0x8b, 0x4b, 0x5a, 0x84, 0xc1, 0x48, 0x58, 0x29, 0x9f, 0xfa, 0xa7, - 0x3e, 0x3f, 0x9e, 0x6f, 0x59, 0x62, 0xe3, 0x77, 0xf4, 0xd6, 0x63, 0xe8, 0xde, 0xae, 0x2a, 0x9e, - 0x6e, 0x1e, 0xe6, 0xb7, 0xa2, 0x85, 0xb3, 0xd0, 0x7a, 0x02, 0x46, 0x39, 0xe3, 0xfb, 0xd9, 0x83, - 0x9b, 0x3a, 0xe8, 0xf3, 0x3d, 0x73, 0xdf, 0x4f, 0x41, 0x5f, 0x43, 0xf3, 0x4a, 0xdd, 0x8c, 0xb4, - 0x8f, 0xe2, 0xd9, 0x31, 0xd7, 0x39, 0x0b, 0x58, 0x4c, 0x59, 0x7c, 0x49, 0xfc, 0x84, 0xe2, 0x8c, - 0x8a, 0x9e, 0x02, 0x88, 0xb9, 0xa0, 0x2e, 0x71, 0xfa, 0xd4, 0x1a, 0x8e, 0x1c, 0x15, 0x8b, 0x03, - 0x8e, 0x0b, 0x1c, 0xf4, 0x31, 0x34, 0x44, 0x34, 0xf6, 0xe4, 0xc5, 0x6c, 0xe1, 0x34, 0xb2, 0xfe, - 0xd3, 0xa0, 0x53, 0xac, 0x81, 0xbe, 0x05, 0x10, 0xa3, 0x63, 0x19, 0x7a, 0x24, 0xce, 0xce, 0xca, - 0xbc, 0xed, 0x69, 0x74, 0xd8, 0x1f, 0x55, 0x70, 0x81, 0x8d, 0x2e, 0xe0, 0xe4, 0x75, 0xe2, 0xfb, - 0x82, 0x84, 0xd5, 0xa8, 0x38, 0xde, 0xd4, 0x45, 0xe2, 0xfb, 0x4e, 0xca, 0x18, 0x55, 0x70, 0x59, - 0x84, 0xc6, 0x60, 0xe4, 0x10, 0x0f, 0x03, 0xc6, 0x69, 0xda, 0xe4, 0x83, 0xa3, 0x89, 0x14, 0x65, - 0x54, 0xc1, 0xef, 0xc8, 0x5e, 0x34, 0xa1, 0xfe, 0x8b, 0xe8, 0xcb, 0x0a, 0x01, 0x72, 0xdf, 0xe8, - 0x1e, 0xd4, 0x85, 0x6f, 0x6e, 0x6a, 0xfd, 0x9a, 0xdd, 0xc2, 0x2a, 0x40, 0x36, 0x34, 0xd3, 0xf9, - 0x6c, 0x56, 0xfb, 0x35, 0xbb, 0x3d, 0xec, 0x3a, 0xc4, 0xf5, 0x1d, 0x4c, 0x7e, 0x3d, 0x93, 0x30, - 0xce, 0xb6, 0xd1, 0x00, 0x3a, 0x9c, 0x91, 0x90, 0x6f, 0x82, 0x78, 0x46, 0xe2, 0x8d, 0x59, 0x93, - 0x69, 0x6e, 0x61, 0xd6, 0xbf, 0x1a, 0xe8, 0xc2, 0xa0, 0x75, 0x05, 0xcd, 0xac, 0xb3, 0x0f, 0x51, - 0x97, 0xc1, 0x9d, 0xac, 0xfd, 0x0f, 0x51, 0xef, 0xf1, 0x25, 0xb4, 0x0b, 0xc3, 0x1d, 0xdd, 0x87, - 0x8f, 0x0a, 0xa1, 0x1a, 0x40, 0x46, 0x05, 0x3d, 0x80, 0x4f, 0x8a, 0x70, 0xe1, 0x8e, 0x1a, 0x1a, - 0xba, 0x0b, 0x27, 0xb7, 0x34, 0xcc, 0x35, 0xaa, 0x2f, 0x1e, 0xfd, 0x75, 0xdd, 0xd3, 0xde, 0x5e, - 0xf7, 0xb4, 0x7f, 0xae, 0x7b, 0xda, 0x9b, 0x9b, 0x5e, 0xe5, 0xed, 0x4d, 0xaf, 0xf2, 0xf7, 0x4d, - 0xaf, 0xf2, 0x13, 0x9c, 0x1e, 0x5e, 0xc7, 0xab, 0x86, 0xfc, 0xf9, 0xea, 0xff, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x6a, 0x04, 0xc0, 0x87, 0xa2, 0x07, 0x00, 0x00, + // 840 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xd1, 0x8e, 0xdb, 0x44, + 0x14, 0x8d, 0x13, 0x27, 0x69, 0x6e, 0xa2, 0xac, 0x99, 0xb6, 0x60, 0xdc, 0x2a, 0xb2, 0xac, 0x02, + 0x56, 0x8b, 0xbc, 0x28, 0x50, 0x21, 0xf1, 0xd6, 0x2e, 0xbb, 0x4a, 0x44, 0x49, 0xa2, 0xc9, 0x66, + 0x91, 0x78, 0xa9, 0x26, 0xf6, 0x34, 0x89, 0xe2, 0x1d, 0x1b, 0x8f, 0x0d, 0xe4, 0x17, 0x78, 0xea, + 0x37, 0xf0, 0x0d, 0x7c, 0x04, 0x8f, 0x7d, 0xe4, 0x09, 0xa1, 0x5d, 0xc1, 0x77, 0xa0, 0x99, 0xb1, + 0x13, 0xaf, 0xbb, 0x7d, 0xed, 0x43, 0x92, 0xb9, 0xf7, 0x9e, 0x73, 0xe6, 0x5c, 0x8f, 0xef, 0x04, + 0x2c, 0xbe, 0x63, 0x7e, 0x9c, 0x44, 0x69, 0x74, 0xac, 0xbe, 0x45, 0xec, 0xc9, 0x25, 0x6a, 0x13, + 0xb6, 0x4b, 0x77, 0x31, 0xb5, 0xbe, 0x88, 0xb7, 0xab, 0x63, 0xe2, 0x87, 0xe2, 0xe3, 0xaf, 0x09, + 0x5b, 0x51, 0x2e, 0x96, 0xf1, 0x52, 0x71, 0x78, 0x29, 0xaf, 0xa8, 0xce, 0x19, 0xb4, 0xbf, 0xa7, + 0x9c, 0x93, 0x15, 0x45, 0x9f, 0x41, 0x6b, 0x4d, 0x49, 0x40, 0x13, 0x53, 0xb3, 0x35, 0xb7, 0x3b, + 0x3c, 0xf2, 0x72, 0x59, 0x6f, 0x24, 0xd3, 0x38, 0x2f, 0x23, 0x04, 0x7a, 0x40, 0x52, 0x62, 0xd6, + 0x6d, 0xcd, 0xed, 0x61, 0xb9, 0x76, 0x7e, 0xd7, 0xa0, 0xa5, 0x60, 0xc8, 0x84, 0x76, 0x9a, 0x10, + 0x9f, 0x8e, 0x03, 0x29, 0xd4, 0xc3, 0x45, 0x88, 0x1e, 0x42, 0x27, 0xa1, 0x3f, 0x65, 0x94, 0xa7, + 0xe3, 0x40, 0xb2, 0x75, 0x7c, 0x48, 0x08, 0x5e, 0x42, 0xe3, 0x70, 0x37, 0x0e, 0xcc, 0x86, 0xac, + 0x15, 0x21, 0x72, 0x41, 0x17, 0x3e, 0x4c, 0xdd, 0xd6, 0xdc, 0xfe, 0xf0, 0xde, 0xde, 0x57, 0xee, + 0xfc, 0x7c, 0x17, 0x53, 0x2c, 0x11, 0x62, 0x87, 0x80, 0x2e, 0xb3, 0xd5, 0x98, 0xbd, 0x8a, 0xcc, + 0xa6, 0xad, 0xb9, 0x1d, 0x7c, 0x48, 0x38, 0x7f, 0x34, 0xa0, 0x35, 0xdf, 0xf1, 0x94, 0x5e, 0xa2, + 0xaf, 0xa1, 0xb3, 0x26, 0x2c, 0xe0, 0x6b, 0xb2, 0xa5, 0x79, 0xbf, 0x1f, 0xef, 0x75, 0x15, 0xc6, + 0x1b, 0x15, 0x00, 0x7c, 0xc0, 0x0a, 0x2f, 0xf1, 0x86, 0xad, 0xa4, 0xfd, 0x6e, 0xc9, 0x4b, 0xce, + 0x99, 0x6d, 0xd8, 0x0a, 0x4b, 0x04, 0xfa, 0x04, 0x1a, 0xc4, 0xdf, 0xca, 0x5e, 0xba, 0xc3, 0xbb, + 0x55, 0xe0, 0x33, 0x7f, 0x8b, 0x45, 0xdd, 0x7a, 0x0a, 0x9d, 0x51, 0x49, 0xfd, 0x48, 0x9e, 0x8b, + 0x1f, 0x85, 0x17, 0x34, 0xe1, 0x9b, 0x88, 0x49, 0x73, 0x1d, 0x5c, 0x4d, 0x5b, 0x0e, 0xe8, 0x62, + 0x2f, 0x64, 0xc1, 0x9d, 0x8c, 0x6d, 0x7e, 0x3d, 0xdf, 0x5c, 0xaa, 0x3e, 0x74, 0xbc, 0x8f, 0xad, + 0x21, 0x34, 0x9e, 0xf9, 0x5b, 0xf4, 0x04, 0x9a, 0x34, 0x49, 0xa2, 0x24, 0xf7, 0x7c, 0xbf, 0x6a, + 0xe5, 0x54, 0x14, 0xb1, 0xc2, 0x58, 0xaf, 0x35, 0x68, 0xca, 0x04, 0xf2, 0x40, 0xf7, 0xa3, 0x40, + 0xa9, 0xf6, 0x87, 0xd6, 0xad, 0x2c, 0xef, 0x24, 0x0a, 0x28, 0x96, 0x38, 0x64, 0x43, 0x37, 0xa0, + 0xdc, 0x4f, 0x36, 0x71, 0x2a, 0x7c, 0xd7, 0xa5, 0xef, 0x72, 0xca, 0x79, 0x0a, 0xba, 0xc0, 0xa3, + 0x2e, 0xb4, 0x17, 0x93, 0xef, 0x26, 0xd3, 0x1f, 0x26, 0x46, 0x0d, 0xd9, 0xf0, 0x70, 0x31, 0x99, + 0x2f, 0x66, 0xb3, 0x29, 0x3e, 0x3f, 0xfd, 0xf6, 0xe5, 0x0c, 0x4f, 0xcf, 0xa7, 0x27, 0xd3, 0x17, + 0x2f, 0x2f, 0x4e, 0xf1, 0x7c, 0x3c, 0x9d, 0x18, 0xe0, 0xfc, 0x56, 0x87, 0xde, 0x3c, 0x5b, 0xee, + 0x75, 0xd0, 0x0b, 0xe8, 0x73, 0x15, 0x2f, 0xe9, 0x3c, 0x26, 0x7e, 0x71, 0x82, 0x8f, 0x0e, 0x1e, + 0x4b, 0xf0, 0x22, 0xc8, 0xb1, 0xb8, 0xc2, 0x45, 0x18, 0x8c, 0x8c, 0x55, 0xf4, 0xd4, 0x93, 0xfa, + 0xf4, 0x76, 0xbd, 0x45, 0x05, 0x8d, 0xdf, 0xe2, 0x5b, 0x8f, 0xa1, 0x7f, 0x73, 0x57, 0xf1, 0x76, + 0xf3, 0xf8, 0x30, 0x15, 0x1d, 0x5c, 0x84, 0xd6, 0xe7, 0x60, 0x54, 0x15, 0xdf, 0x8d, 0x76, 0xfe, + 0x6e, 0x82, 0x3e, 0xdf, 0x31, 0xff, 0xdd, 0x10, 0xf4, 0x15, 0xb4, 0x2f, 0xd5, 0x64, 0xe4, 0x7d, + 0x94, 0xcf, 0x8e, 0xf9, 0xde, 0x49, 0xc4, 0x52, 0xca, 0xd2, 0x0b, 0x12, 0x66, 0x14, 0x17, 0x50, + 0xf4, 0x04, 0x20, 0x4d, 0x28, 0x55, 0x43, 0x9c, 0xbf, 0xb5, 0x5d, 0x8f, 0xf8, 0x61, 0x31, 0xfe, + 0xa5, 0x32, 0xfa, 0x10, 0x5a, 0x22, 0x1a, 0x07, 0x72, 0x26, 0x3b, 0x38, 0x8f, 0xac, 0xff, 0x34, + 0xe8, 0x95, 0xe5, 0xd1, 0x37, 0x00, 0xe2, 0xd6, 0x58, 0xc4, 0x01, 0x49, 0x8b, 0x63, 0x32, 0x6f, + 0xda, 0x19, 0xed, 0xeb, 0xa3, 0x1a, 0x2e, 0xa1, 0xd1, 0x19, 0x1c, 0xbd, 0xca, 0xc2, 0x50, 0x80, + 0xb0, 0xba, 0x25, 0x6e, 0xef, 0xe7, 0x2c, 0x0b, 0x43, 0x2f, 0x47, 0x8c, 0x6a, 0xb8, 0x4a, 0x42, + 0x63, 0x30, 0x0e, 0x29, 0x1e, 0x47, 0x8c, 0xd3, 0xbc, 0xbf, 0x07, 0xb7, 0x0a, 0x29, 0xc8, 0xa8, + 0x86, 0xdf, 0xa2, 0x3d, 0x6f, 0x43, 0xf3, 0x67, 0xd1, 0x97, 0x15, 0x03, 0x1c, 0x7c, 0xa3, 0x7b, + 0xd0, 0x14, 0xbe, 0xb9, 0xa9, 0xd9, 0x0d, 0xb7, 0x83, 0x55, 0x80, 0x5c, 0x68, 0xe7, 0x97, 0xad, + 0x59, 0xb7, 0x1b, 0x6e, 0x77, 0xd8, 0x97, 0x8f, 0x13, 0x93, 0x5f, 0x4e, 0x64, 0x1a, 0x17, 0x65, + 0xe4, 0x40, 0x8f, 0x33, 0x12, 0xf3, 0x75, 0x94, 0xce, 0x48, 0xba, 0x36, 0x1b, 0x52, 0xe6, 0x46, + 0xce, 0xfa, 0x57, 0x03, 0x5d, 0x18, 0xb4, 0x2e, 0xa1, 0x5d, 0x74, 0xf6, 0x3e, 0xf6, 0x65, 0x70, + 0xa7, 0x68, 0xff, 0x7d, 0xec, 0xf7, 0xf8, 0x02, 0xba, 0xa5, 0x7b, 0x1d, 0xdd, 0x87, 0x0f, 0x4a, + 0xa1, 0xba, 0x7b, 0x8c, 0x1a, 0x7a, 0x00, 0x1f, 0x95, 0xd3, 0xa5, 0xf1, 0x34, 0x34, 0x74, 0x17, + 0x8e, 0x6e, 0x70, 0x98, 0x6f, 0xd4, 0x9f, 0x3f, 0xfa, 0xf3, 0x6a, 0xa0, 0xbd, 0xb9, 0x1a, 0x68, + 0xff, 0x5c, 0x0d, 0xb4, 0xd7, 0xd7, 0x83, 0xda, 0x9b, 0xeb, 0x41, 0xed, 0xaf, 0xeb, 0x41, 0xed, + 0x47, 0x38, 0xde, 0xff, 0xb7, 0x2e, 0x5b, 0xf2, 0xe7, 0xcb, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, + 0x34, 0xaa, 0x76, 0x9b, 0x6f, 0x07, 0x00, 0x00, } func (m *Message) Marshal() (dAtA []byte, err error) { @@ -3328,7 +3326,7 @@ func (m *Sync) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.TreeHeader == nil { - m.TreeHeader = &treepb.TreeHeader{} + m.TreeHeader = &aclpb.Header{} } if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err From d3ed644b9c6d966fb0388612c6f43956fc0c44a9 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 20 Aug 2022 16:57:32 +0200 Subject: [PATCH 022/219] Optimize and simplify tree algorithm --- pkg/acl/tree/change.go | 1 - pkg/acl/tree/tree.go | 72 ++++++++++++++---------------------------- 2 files changed, 24 insertions(+), 49 deletions(-) diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index 7924ea5d..ae655839 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -19,7 +19,6 @@ type ChangeContent struct { // Change is an abstract type for all types of changes type Change struct { Next []*Change - Unattached []*Change PreviousIds []string Id string SnapshotId string diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go index ef8cc23d..a6c6d8ac 100644 --- a/pkg/acl/tree/tree.go +++ b/pkg/acl/tree/tree.go @@ -33,10 +33,6 @@ type Tree struct { duplicateEvents int } -func (t *Tree) GetUnattachedChanges(changes ...*Change) []*Change { - return nil -} - func (t *Tree) RootId() string { if t.root != nil { return t.root.Id @@ -111,6 +107,7 @@ func (t *Tree) RemoveInvalidChange(id string) { t.invalidChanges[top] = struct{}{} if rem, exists = t.unAttached[top]; exists { delete(t.unAttached, top) + // TODO: delete waitlist, this can only help for memory/performance } else if rem, exists = t.attached[top]; exists { // remove from all prev changes for _, id := range rem.PreviousIds { @@ -128,9 +125,6 @@ func (t *Tree) RemoveInvalidChange(id string) { } delete(t.attached, top) } - for _, el := range rem.Unattached { - stack = append(stack, el.Id) - } for _, el := range rem.Next { stack = append(stack, el.Id) } @@ -161,16 +155,13 @@ func (t *Tree) add(c *Change) (attached bool) { } // attaching only if all prev ids are attached attached = true + // the logic below is the following for _, pid := range c.PreviousIds { - if prev, ok := t.attached[pid]; ok { - prev.Unattached = append(prev.Unattached, c) + if _, ok := t.attached[pid]; ok { continue } attached = false - if prev, ok := t.unAttached[pid]; ok { - prev.Unattached = append(prev.Unattached, c) - continue - } + // updating wait list for either unseen or unAttached changes wl := t.waitList[pid] wl = append(wl, c.Id) t.waitList[pid] = wl @@ -178,11 +169,6 @@ func (t *Tree) add(c *Change) (attached bool) { if attached { t.attach(c, true) } else { - // clearing wait list - for _, wid := range t.waitList[c.Id] { - c.Unattached = append(c.Unattached, t.unAttached[wid]) - } - delete(t.waitList, c.Id) t.unAttached[c.Id] = c } return @@ -196,6 +182,7 @@ func (t *Tree) canAttach(c *Change) (attach bool) { for _, id := range c.PreviousIds { if _, exists := t.attached[id]; !exists { attach = false + break } } return @@ -209,37 +196,40 @@ func (t *Tree) attach(c *Change, newEl bool) { // add next to all prev changes for _, id := range c.PreviousIds { - // prev id must be attached if we attach this id + // prev id must already be attached if we attach this id, so we don't need to check if it exists prev := t.attached[id] - prev.Next = append(prev.Next, c) - if len(prev.Next) > 1 { - sort.Sort(sortChanges(prev.Next)) - } - for i, next := range prev.Unattached { - if next.Id == c.Id { - prev.Unattached[i] = nil - prev.Unattached = append(prev.Unattached[:i], prev.Unattached[i+1:]...) - break + // appending c to next changes of all previous changes + if len(prev.Next) == 0 || prev.Next[len(prev.Next)-1].Id <= c.Id { + prev.Next = append(prev.Next, c) + } else { + // inserting in correct position, before the change which is greater or equal + insertIdx := 0 + for idx, el := range prev.Next { + if el.Id >= c.Id { + insertIdx = idx + break + } } + prev.Next = append(prev.Next[:insertIdx+1], prev.Next[:insertIdx]...) + prev.Next[insertIdx] = c } } + // TODO: as a future optimization we can actually sort next later after we finished building the tree // clearing wait list if waitIds, ok := t.waitList[c.Id]; ok { for _, wid := range waitIds { + // next can only be in unAttached, because if next is attached then previous (we) are attached + // which is obviously not true, because we are attaching previous only now next := t.unAttached[wid] if t.canAttach(next) { t.attach(next, false) } + // if we can't attach next that means that some other change will trigger attachment later, + // so we don't care about those changes } delete(t.waitList, c.Id) } - - for _, next := range c.Unattached { - if t.canAttach(next) { - t.attach(next, false) - } - } } func (t *Tree) after(id1, id2 string) (found bool) { @@ -371,17 +361,3 @@ func (t *Tree) String() string { func (t *Tree) Get(id string) *Change { return t.attached[id] } - -type sortChanges []*Change - -func (s sortChanges) Len() int { - return len(s) -} - -func (s sortChanges) Less(i, j int) bool { - return s[i].Id < s[j].Id -} - -func (s sortChanges) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} From 03d8c187edc95f5d1d5ec0feda7991cfdf8a81fb Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 20 Aug 2022 23:22:01 +0200 Subject: [PATCH 023/219] Add tree tests and benchmarks --- pkg/acl/list/list.go | 9 +- pkg/acl/tree/tree.go | 4 +- pkg/acl/tree/tree_test.go | 214 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 222 insertions(+), 5 deletions(-) create mode 100644 pkg/acl/tree/tree_test.go diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index ee4a570b..54863bee 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -6,14 +6,19 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "sync" ) type IterFunc = func(record *Record) (IsContinue bool) +type RWLocker interface { + sync.Locker + RLock() + RUnlock() +} + type ACLList interface { - tree.RWLocker + RWLocker ID() string Header() *aclpb.Header ACLState() *ACLState diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go index a6c6d8ac..1836719c 100644 --- a/pkg/acl/tree/tree.go +++ b/pkg/acl/tree/tree.go @@ -15,7 +15,6 @@ const ( Nothing ) -// TODO: consider abstracting into separate package with iterator, remove type Tree struct { root *Change headIds []string @@ -155,7 +154,6 @@ func (t *Tree) add(c *Change) (attached bool) { } // attaching only if all prev ids are attached attached = true - // the logic below is the following for _, pid := range c.PreviousIds { if _, ok := t.attached[pid]; ok { continue @@ -210,7 +208,7 @@ func (t *Tree) attach(c *Change, newEl bool) { break } } - prev.Next = append(prev.Next[:insertIdx+1], prev.Next[:insertIdx]...) + prev.Next = append(prev.Next[:insertIdx+1], prev.Next[insertIdx:]...) prev.Next[insertIdx] = c } } diff --git a/pkg/acl/tree/tree_test.go b/pkg/acl/tree/tree_test.go new file mode 100644 index 00000000..cc2c82bc --- /dev/null +++ b/pkg/acl/tree/tree_test.go @@ -0,0 +1,214 @@ +package tree + +import ( + "fmt" + "github.com/stretchr/testify/assert" + "math/rand" + "testing" + "time" +) + +func newChange(id string, snapshotId string, prevIds ...string) *Change { + return &Change{ + PreviousIds: prevIds, + Id: id, + SnapshotId: snapshotId, + IsSnapshot: false, + } +} + +func newSnapshot(id string, snapshotId string, prevIds ...string) *Change { + return &Change{ + PreviousIds: prevIds, + Id: id, + SnapshotId: snapshotId, + IsSnapshot: true, + } +} + +func TestTree_Add(t *testing.T) { + t.Run("add first el", func(t *testing.T) { + tr := new(Tree) + assert.Equal(t, Rebuild, tr.Add(newSnapshot("root", ""))) + assert.Equal(t, tr.root.Id, "root") + assert.Equal(t, []string{"root"}, tr.Heads()) + }) + t.Run("linear add", func(t *testing.T) { + tr := new(Tree) + assert.Equal(t, Rebuild, tr.Add( + newSnapshot("root", ""), + newChange("one", "root", "root"), + newChange("two", "root", "one"), + )) + assert.Equal(t, []string{"two"}, tr.Heads()) + assert.Equal(t, Append, tr.Add(newChange("three", "root", "two"))) + el := tr.root + var ids []string + for el != nil { + ids = append(ids, el.Id) + if len(el.Next) > 0 { + el = el.Next[0] + } else { + el = nil + } + } + assert.Equal(t, []string{"root", "one", "two", "three"}, ids) + assert.Equal(t, []string{"three"}, tr.Heads()) + }) + t.Run("branch", func(t *testing.T) { + tr := new(Tree) + assert.Equal(t, Rebuild, tr.Add( + newSnapshot("root", ""), + newChange("1", "root", "root"), + newChange("2", "root", "1"), + )) + assert.Equal(t, []string{"2"}, tr.Heads()) + assert.Equal(t, Rebuild, tr.Add( + newChange("1.2", "root", "1.1"), + newChange("1.3", "root", "1.2"), + newChange("1.1", "root", "1"), + )) + assert.Len(t, tr.attached["1"].Next, 2) + assert.Len(t, tr.unAttached, 0) + assert.Len(t, tr.attached, 6) + assert.Equal(t, []string{"1.3", "2"}, tr.Heads()) + }) + t.Run("branch union", func(t *testing.T) { + tr := new(Tree) + assert.Equal(t, Rebuild, tr.Add( + newSnapshot("root", ""), + newChange("1", "root", "root"), + newChange("2", "root", "1"), + newChange("1.2", "root", "1.1"), + newChange("1.3", "root", "1.2"), + newChange("1.1", "root", "1"), + newChange("3", "root", "2", "1.3"), + newChange("4", "root", "3"), + )) + assert.Len(t, tr.unAttached, 0) + assert.Len(t, tr.attached, 8) + assert.Equal(t, []string{"4"}, tr.Heads()) + }) + t.Run("big set", func(t *testing.T) { + tr := new(Tree) + tr.Add(newSnapshot("root", "")) + var changes []*Change + for i := 0; i < 10000; i++ { + if i == 0 { + changes = append(changes, newChange(fmt.Sprint(i), "root", "root")) + } else { + changes = append(changes, newChange(fmt.Sprint(i), "root", fmt.Sprint(i-1))) + } + } + st := time.Now() + tr.AddFast(changes...) + t.Log(time.Since(st)) + assert.Equal(t, []string{"9999"}, tr.Heads()) + }) +} + +func TestTree_Hash(t *testing.T) { + tr := new(Tree) + tr.Add(newSnapshot("root", "")) + hash1 := tr.Hash() + assert.Equal(t, tr.Hash(), hash1) + tr.Add(newChange("1", "root", "root")) + assert.NotEqual(t, tr.Hash(), hash1) + assert.Equal(t, tr.Hash(), tr.Hash()) +} + +func TestTree_AddFuzzy(t *testing.T) { + rand.Seed(time.Now().UnixNano()) + getChanges := func() []*Change { + changes := []*Change{ + newChange("1", "root", "root"), + newChange("2", "root", "1"), + newChange("1.2", "root", "1.1"), + newChange("1.3", "root", "1.2"), + newChange("1.1", "root", "1"), + newChange("3", "root", "2", "1.3"), + } + rand.Shuffle(len(changes), func(i, j int) { + changes[i], changes[j] = changes[j], changes[i] + }) + return changes + } + var phash string + for i := 0; i < 100; i++ { + tr := new(Tree) + tr.Add(newSnapshot("root", "")) + tr.Add(getChanges()...) + assert.Len(t, tr.unAttached, 0) + assert.Len(t, tr.attached, 7) + hash := tr.Hash() + if phash != "" { + assert.Equal(t, phash, hash) + } + phash = hash + assert.Equal(t, []string{"3"}, tr.Heads()) + } +} + +func TestTree_Iterate(t *testing.T) { + t.Run("complex tree", func(t *testing.T) { + tr := new(Tree) + tr.Add( + newSnapshot("0", ""), + newChange("1", "0", "0"), + newChange("1.1", "0", "1"), + newChange("1.2", "0", "1"), + newChange("1.3", "0", "1"), + newChange("1.3.1", "0", "1.3"), + newChange("1.2+3", "0", "1.2", "1.3.1"), + newChange("1.2+3.1", "0", "1.2+3"), + newChange("10", "0", "1.2+3.1", "1.1"), + newChange("last", "0", "10"), + ) + var res []string + tr.Iterate("0", func(c *Change) (isContinue bool) { + res = append(res, c.Id) + return true + }) + res = res[:0] + tr.Iterate("0", func(c *Change) (isContinue bool) { + res = append(res, c.Id) + return true + }) + assert.Equal(t, []string{"0", "1", "1.1", "1.2", "1.3", "1.3.1", "1.2+3", "1.2+3.1", "10", "last"}, res) + }) +} + +func BenchmarkTree_Add(b *testing.B) { + getChanges := func() []*Change { + return []*Change{ + newChange("1", "root", "root"), + newChange("2", "root", "1"), + newChange("1.2", "root", "1.1"), + newChange("1.3", "root", "1.2"), + newChange("1.1", "root", "1"), + newChange("3", "root", "2", "1.3"), + } + } + b.Run("by one", func(b *testing.B) { + tr := new(Tree) + tr.Add(newSnapshot("root", "")) + tr.Add(getChanges()...) + for i := 0; i < b.N; i++ { + tr.Add(newChange(fmt.Sprint(i+4), "root", fmt.Sprint(i+3))) + } + }) + b.Run("add", func(b *testing.B) { + for i := 0; i < b.N; i++ { + tr := new(Tree) + tr.Add(newSnapshot("root", "")) + tr.Add(getChanges()...) + } + }) + b.Run("add fast", func(b *testing.B) { + for i := 0; i < b.N; i++ { + tr := new(Tree) + tr.AddFast(newSnapshot("root", "")) + tr.AddFast(getChanges()...) + } + }) +} From 88c58237c1cf52e13c58686745624fdef053266d Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 20 Aug 2022 23:55:18 +0200 Subject: [PATCH 024/219] Few tree fixes --- pkg/acl/tree/doctree.go | 5 ++++- pkg/acl/tree/tree.go | 29 ++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index f7ae2e4c..d0d373d4 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -238,7 +238,10 @@ func (d *docTree) AddContent(ctx context.Context, aclList list.ACLList, content // clearing tree, because we already fixed everything in the last snapshot d.tree = &Tree{} } - d.tree.AddFast(ch) // TODO: Add head + err = d.tree.AddMergedHead(ch) + if err != nil { + panic("error in adding head") + } rawCh := &aclpb.RawChange{ Payload: fullMarshalledChange, Signature: ch.Signature(), diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go index 1836719c..687561fa 100644 --- a/pkg/acl/tree/tree.go +++ b/pkg/acl/tree/tree.go @@ -56,6 +56,31 @@ func (t *Tree) AddFast(changes ...*Change) { t.updateHeads() } +func (t *Tree) AddMergedHead(c *Change) error { + // check that it was not inserted previously + if _, ok := t.attached[c.Id]; ok { + return fmt.Errorf("change already exists") + } else if _, ok := t.unAttached[c.Id]; ok { + return fmt.Errorf("change already exists") + } + t.add(c) + + // check that it was attached after adding + if _, ok := t.attached[c.Id]; !ok { + return fmt.Errorf("change is not attached") + } + + // check that previous heads have new change as next + for _, prevHead := range t.headIds { + head := t.attached[prevHead] + if len(head.Next) != 1 || head.Next[0].Id != c.Id { + return fmt.Errorf("this is not a new head") + } + } + t.headIds = []string{c.Id} + return nil +} + func (t *Tree) Add(changes ...*Change) (mode Mode) { var beforeHeadIds = t.headIds var attached bool @@ -263,7 +288,7 @@ func (t *Tree) dfs(startChange string) (uniqMap map[string]*Change) { } func (t *Tree) updateHeads() { - var newHeadIds, newMetaHeadIds []string + var newHeadIds []string t.iterate(t.root, func(c *Change) (isContinue bool) { if len(c.Next) == 0 { newHeadIds = append(newHeadIds, c.Id) @@ -271,9 +296,7 @@ func (t *Tree) updateHeads() { return true }) t.headIds = newHeadIds - t.metaHeadIds = newMetaHeadIds sort.Strings(t.headIds) - sort.Strings(t.metaHeadIds) } func (t *Tree) iterate(start *Change, f func(c *Change) (isContinue bool)) { From f5d79a5469cb2768b9ba3510730a4b6f29e85a7e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 21 Aug 2022 15:23:47 +0200 Subject: [PATCH 025/219] Add first ACL list test and other refactoring --- pkg/acl/list/aclstate.go | 11 +++-- pkg/acl/list/aclstatebuilder.go | 10 ++-- pkg/acl/list/list.go | 17 ++++++- pkg/acl/list/list_test.go | 46 +++++++++++++++++++ pkg/acl/testutils/acllistbuilder/keychain.go | 39 ++++++++-------- .../acllistbuilder/liststoragebuilder.go | 7 +-- .../testutils/acllistbuilder/ymlentities.go | 14 ++++-- .../acllistbuilder/ymlentities_test.go | 2 +- .../testutils/yamltests/userjoinexample.yml | 4 +- pkg/acl/tree/doctree.go | 45 +++++------------- 10 files changed, 120 insertions(+), 75 deletions(-) create mode 100644 pkg/acl/list/list_test.go diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index e15b3ec6..0424dc42 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -56,12 +56,13 @@ func newACLStateWithIdentity( } } -func newACLState() *ACLState { +func newACLState(decoder keys.Decoder) *ACLState { return &ACLState{ - userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclpb.ACLChangeUserState), - userInvites: make(map[string]*aclpb.ACLChangeUserInvite), - permissionsAtRecord: make(map[string][]UserPermissionPair), + signingPubKeyDecoder: decoder, + userReadKeys: make(map[uint64]*symmetric.Key), + userStates: make(map[string]*aclpb.ACLChangeUserState), + userInvites: make(map[string]*aclpb.ACLChangeUserInvite), + permissionsAtRecord: make(map[string][]UserPermissionPair), } } diff --git a/pkg/acl/list/aclstatebuilder.go b/pkg/acl/list/aclstatebuilder.go index 3586dec9..f7a06f51 100644 --- a/pkg/acl/list/aclstatebuilder.go +++ b/pkg/acl/list/aclstatebuilder.go @@ -20,8 +20,10 @@ func newACLStateBuilderWithIdentity(decoder keys.Decoder, accountData *account.A } } -func newACLStateBuilder() *aclStateBuilder { - return &aclStateBuilder{} +func newACLStateBuilder(decoder keys.Decoder) *aclStateBuilder { + return &aclStateBuilder{ + decoder: decoder, + } } func (sb *aclStateBuilder) Build(records []*Record) (*ACLState, error) { @@ -30,10 +32,10 @@ func (sb *aclStateBuilder) Build(records []*Record) (*ACLState, error) { state *ACLState ) - if sb.decoder != nil { + if sb.key != nil { state = newACLStateWithIdentity(sb.identity, sb.key, sb.decoder) } else { - state = newACLState() + state = newACLState(sb.decoder) } for _, rec := range records { err = state.applyChangeAndUpdate(rec) diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index 54863bee..cf898271 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -6,6 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "sync" ) @@ -44,11 +45,24 @@ type aclList struct { func BuildACLListWithIdentity(acc *account.AccountData, storage storage.ListStorage) (ACLList, error) { builder := newACLStateBuilderWithIdentity(acc.Decoder, acc) + return buildWithACLStateBuilder(builder, storage) +} + +func BuildACLList(decoder keys.Decoder, storage storage.ListStorage) (ACLList, error) { + return buildWithACLStateBuilder(newACLStateBuilder(decoder), storage) +} + +func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStorage) (ACLList, error) { header, err := storage.Header() if err != nil { return nil, err } + id, err := storage.ID() + if err != nil { + return nil, err + } + rawRecord, err := storage.Head() if err != nil { return nil, err @@ -94,6 +108,7 @@ func BuildACLListWithIdentity(acc *account.AccountData, storage storage.ListStor indexes: indexes, builder: builder, aclState: state, + id: id, RWMutex: sync.RWMutex{}, }, nil } @@ -114,7 +129,7 @@ func (a *aclList) IsAfter(first string, second string) (bool, error) { firstRec, okFirst := a.indexes[first] secondRec, okSecond := a.indexes[second] if !okFirst || !okSecond { - return false, fmt.Errorf("not all entries are there: first (%b), second (%b)", okFirst, okSecond) + return false, fmt.Errorf("not all entries are there: first (%t), second (%t)", okFirst, okSecond) } return firstRec >= secondRec, nil } diff --git a/pkg/acl/list/list_test.go b/pkg/acl/list/list_test.go new file mode 100644 index 00000000..60804186 --- /dev/null +++ b/pkg/acl/list/list_test.go @@ -0,0 +1,46 @@ +package list + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" +) + +func TestAclList_ACLState_UserInviteAndJoin(t *testing.T) { + st, err := acllistbuilder.NewListStorageWithTestName("userjoinexample.yml") + require.NoError(t, err, "building storage should not result in error") + + keychain := st.(*acllistbuilder.ACLListStorageBuilder).GetKeychain() + + aclList, err := BuildACLList(signingkey.NewEDPubKeyDecoder(), st) + require.NoError(t, err, "building acl list should be without error") + + idA := keychain.GetIdentity("A") + idB := keychain.GetIdentity("B") + idC := keychain.GetIdentity("C") + + // checking final state + assert.Equal(t, aclList.ACLState().GetUserStates()[idA].Permissions, aclpb.ACLChange_Admin) + assert.Equal(t, aclList.ACLState().GetUserStates()[idB].Permissions, aclpb.ACLChange_Writer) + assert.Equal(t, aclList.ACLState().GetUserStates()[idC].Permissions, aclpb.ACLChange_Reader) + assert.Equal(t, aclList.ACLState().CurrentReadKeyHash(), aclList.Head().Content.CurrentReadKeyHash) + var records []*Record + aclList.Iterate(func(record *Record) (IsContinue bool) { + records = append(records, record) + return true + }) + + // checking permissions at specific records + assert.Equal(t, 3, len(records)) + _, err = aclList.ACLState().PermissionsAtRecord(records[1].Id, idB) + assert.Error(t, err, "B should have no permissions at record 1") + perm, err := aclList.ACLState().PermissionsAtRecord(records[2].Id, idB) + assert.NoError(t, err, "should have no error with permissions of B in the record 2") + assert.Equal(t, perm, UserPermissionPair{ + Identity: idB, + Permission: aclpb.ACLChange_Writer, + }) +} diff --git a/pkg/acl/testutils/acllistbuilder/keychain.go b/pkg/acl/testutils/acllistbuilder/keychain.go index a1567f6a..7098650e 100644 --- a/pkg/acl/testutils/acllistbuilder/keychain.go +++ b/pkg/acl/testutils/acllistbuilder/keychain.go @@ -50,8 +50,8 @@ func (k *Keychain) ParseKeys(keys *Keys) { } } -func (k *Keychain) AddEncryptionKey(name string) { - if _, exists := k.EncryptionKeys[name]; exists { +func (k *Keychain) AddEncryptionKey(key *Key) { + if _, exists := k.EncryptionKeys[key.Name]; exists { return } newPrivKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) @@ -59,11 +59,11 @@ func (k *Keychain) AddEncryptionKey(name string) { panic(err) } - k.EncryptionKeys[name] = newPrivKey + k.EncryptionKeys[key.Name] = newPrivKey } -func (k *Keychain) AddSigningKey(name string) { - if _, exists := k.SigningKeys[name]; exists { +func (k *Keychain) AddSigningKey(key *Key) { + if _, exists := k.SigningKeys[key.Name]; exists { return } newPrivKey, pubKey, err := signingkey.GenerateRandomEd25519KeyPair() @@ -71,48 +71,47 @@ func (k *Keychain) AddSigningKey(name string) { panic(err) } - k.SigningKeys[name] = newPrivKey + k.SigningKeys[key.Name] = newPrivKey res, err := k.coder.EncodeToString(pubKey) if err != nil { panic(err) } k.SigningKeysByIdentity[res] = newPrivKey - k.GeneratedIdentities[name] = res + k.GeneratedIdentities[key.Name] = res } -func (k *Keychain) AddReadKey(name string) { - if _, exists := k.ReadKeys[name]; exists { +func (k *Keychain) AddReadKey(key *Key) { + if _, exists := k.ReadKeys[key.Name]; exists { return } - key, _ := symmetric.NewRandom() + rkey, _ := symmetric.NewRandom() hasher := fnv.New64() - hasher.Write(key.Bytes()) + hasher.Write(rkey.Bytes()) - k.ReadKeys[name] = &SymKey{ + k.ReadKeys[key.Name] = &SymKey{ Hash: hasher.Sum64(), - Key: key, + Key: rkey, } k.ReadKeysByHash[hasher.Sum64()] = &SymKey{ Hash: hasher.Sum64(), - Key: key, + Key: rkey, } } -func (k *Keychain) AddKey(key string) { - parts := strings.Split(key, ".") +func (k *Keychain) AddKey(key *Key) { + parts := strings.Split(key.Name, ".") if len(parts) != 3 { panic("cannot parse a key") } - name := parts[2] switch parts[1] { case "Sign": - k.AddSigningKey(name) + k.AddSigningKey(key) case "Enc": - k.AddEncryptionKey(name) + k.AddEncryptionKey(key) case "Read": - k.AddReadKey(name) + k.AddReadKey(key) default: panic("incorrect format") } diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index 1037770e..25c09586 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/yamltests" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" @@ -34,7 +35,7 @@ func NewACLListStorageBuilder(keychain *Keychain) *ACLListStorageBuilder { } } -func NewACLListStorageBuilderWithTestName(name string) (*ACLListStorageBuilder, error) { +func NewListStorageWithTestName(name string) (storage.ListStorage, error) { filePath := path.Join(yamltests.Path(), name) return NewACLListStorageBuilderFromFile(filePath) } @@ -89,7 +90,7 @@ func (t *ACLListStorageBuilder) Header() (*aclpb.Header, error) { return t.header, nil } -func (t *ACLListStorageBuilder) GetRecord(ctx context.Context, id string) (*aclpb.RawRecord, error) { +func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*aclpb.RawRecord, error) { recIdx, ok := t.indexes[id] if !ok { return nil, fmt.Errorf("no such record") @@ -97,7 +98,7 @@ func (t *ACLListStorageBuilder) GetRecord(ctx context.Context, id string) (*aclp return t.getRecord(recIdx), nil } -func (t *ACLListStorageBuilder) AddRecord(ctx context.Context, rec *aclpb.Record) error { +func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclpb.RawRecord) error { panic("implement me") } diff --git a/pkg/acl/testutils/acllistbuilder/ymlentities.go b/pkg/acl/testutils/acllistbuilder/ymlentities.go index 471155c1..4d0fb069 100644 --- a/pkg/acl/testutils/acllistbuilder/ymlentities.go +++ b/pkg/acl/testutils/acllistbuilder/ymlentities.go @@ -1,9 +1,14 @@ package acllistbuilder +type Key struct { + Name string `yaml:"name"` + Value string `yaml:"value"` +} + type Keys struct { - Enc []string `yaml:"Enc"` - Sign []string `yaml:"Sign"` - Read []string `yaml:"Read"` + Enc []*Key `yaml:"Enc"` + Sign []*Key `yaml:"Sign"` + Read []*Key `yaml:"Read"` } type ACLChange struct { @@ -50,8 +55,7 @@ type ACLChange struct { type Record struct { Identity string `yaml:"identity"` AclChanges []*ACLChange `yaml:"aclChanges"` - - ReadKey string `yaml:"readKey"` + ReadKey string `yaml:"readKey"` } type Header struct { diff --git a/pkg/acl/testutils/acllistbuilder/ymlentities_test.go b/pkg/acl/testutils/acllistbuilder/ymlentities_test.go index 28780446..29d86d31 100644 --- a/pkg/acl/testutils/acllistbuilder/ymlentities_test.go +++ b/pkg/acl/testutils/acllistbuilder/ymlentities_test.go @@ -6,7 +6,7 @@ import ( ) func Test_YamlParse(t *testing.T) { - tb, _ := NewACLListStorageBuilderWithTestName("userjoinexampleupdate.yml") + tb, _ := NewListStorageWithTestName("userjoinexampleupdate.yml") gr, _ := tb.Graph() fmt.Println(gr) } diff --git a/pkg/acl/testutils/yamltests/userjoinexample.yml b/pkg/acl/testutils/yamltests/userjoinexample.yml index 9b4ac7f1..014c9349 100644 --- a/pkg/acl/testutils/yamltests/userjoinexample.yml +++ b/pkg/acl/testutils/yamltests/userjoinexample.yml @@ -1,5 +1,3 @@ -list: - author: A records: - identity: A aclChanges: @@ -16,7 +14,7 @@ records: encryptionKey: key.Enc.Onetime1 encryptedReadKeys: [key.Read.1] permissions: writer - inviteIdx: A.1.2 + inviteId: A.1.2 - userAdd: identity: C permission: reader diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index d0d373d4..4aa1b061 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -77,48 +77,27 @@ type docTree struct { } func BuildDocTreeWithIdentity(t storage.TreeStorage, acc *account.AccountData, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { - treeBuilder := newTreeBuilder(t, acc.Decoder) - validator := newTreeValidator() - - docTree := &docTree{ - treeStorage: t, - accountData: acc, - tree: nil, - treeBuilder: treeBuilder, - validator: validator, - updateListener: listener, - tmpChangesBuf: make([]*Change, 0, 10), - difSnapshotBuf: make([]*aclpb.RawChange, 0, 10), - notSeenIdxBuf: make([]int, 0, 10), - identityKeys: make(map[string]signingkey.PubKey), - } - err := docTree.rebuildFromStorage(aclList, nil) - if err != nil { - return nil, err - } - docTree.id, err = t.ID() - if err != nil { - return nil, err - } - docTree.header, err = t.Header() - if err != nil { - return nil, err - } - - if listener != nil { - listener.Rebuild(docTree) - } - - return docTree, nil + return buildDocTreeWithAccount(t, acc, acc.Decoder, listener, aclList) } func BuildDocTree(t storage.TreeStorage, decoder keys.Decoder, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { + return buildDocTreeWithAccount(t, nil, decoder, listener, aclList) +} + +func buildDocTreeWithAccount( + t storage.TreeStorage, + acc *account.AccountData, + decoder keys.Decoder, + listener TreeUpdateListener, + aclList list.ACLList) (DocTree, error) { + treeBuilder := newTreeBuilder(t, decoder) validator := newTreeValidator() docTree := &docTree{ treeStorage: t, tree: nil, + accountData: acc, treeBuilder: treeBuilder, validator: validator, updateListener: listener, From d19f0534e41c016f07b93a9fd8889ae61b3c5806 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 21 Aug 2022 15:50:06 +0200 Subject: [PATCH 026/219] Add test for user remove --- pkg/acl/list/list_test.go | 58 +++++++- .../yamltests/userremovebeforeexample.yml | 109 -------------- .../testutils/yamltests/userremoveexample.yml | 119 +++++----------- .../yamltests/validsnapshotexample.yml | 133 ------------------ service/sync/requesthandler/requesthandler.go | 3 - 5 files changed, 88 insertions(+), 334 deletions(-) delete mode 100644 pkg/acl/testutils/yamltests/userremovebeforeexample.yml delete mode 100644 pkg/acl/testutils/yamltests/validsnapshotexample.yml diff --git a/pkg/acl/list/list_test.go b/pkg/acl/list/list_test.go index 60804186..8ca208be 100644 --- a/pkg/acl/list/list_test.go +++ b/pkg/acl/list/list_test.go @@ -23,10 +23,11 @@ func TestAclList_ACLState_UserInviteAndJoin(t *testing.T) { idC := keychain.GetIdentity("C") // checking final state - assert.Equal(t, aclList.ACLState().GetUserStates()[idA].Permissions, aclpb.ACLChange_Admin) - assert.Equal(t, aclList.ACLState().GetUserStates()[idB].Permissions, aclpb.ACLChange_Writer) - assert.Equal(t, aclList.ACLState().GetUserStates()[idC].Permissions, aclpb.ACLChange_Reader) - assert.Equal(t, aclList.ACLState().CurrentReadKeyHash(), aclList.Head().Content.CurrentReadKeyHash) + assert.Equal(t, aclpb.ACLChange_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) + assert.Equal(t, aclpb.ACLChange_Writer, aclList.ACLState().GetUserStates()[idB].Permissions) + assert.Equal(t, aclpb.ACLChange_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) + assert.Equal(t, aclList.Head().Content.CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) + var records []*Record aclList.Iterate(func(record *Record) (IsContinue bool) { records = append(records, record) @@ -35,12 +36,57 @@ func TestAclList_ACLState_UserInviteAndJoin(t *testing.T) { // checking permissions at specific records assert.Equal(t, 3, len(records)) + _, err = aclList.ACLState().PermissionsAtRecord(records[1].Id, idB) assert.Error(t, err, "B should have no permissions at record 1") + perm, err := aclList.ACLState().PermissionsAtRecord(records[2].Id, idB) assert.NoError(t, err, "should have no error with permissions of B in the record 2") - assert.Equal(t, perm, UserPermissionPair{ + assert.Equal(t, UserPermissionPair{ Identity: idB, Permission: aclpb.ACLChange_Writer, - }) + }, perm) +} + +func TestAclList_ACLState_UserJoinAndRemove(t *testing.T) { + st, err := acllistbuilder.NewListStorageWithTestName("userremoveexample.yml") + require.NoError(t, err, "building storage should not result in error") + + keychain := st.(*acllistbuilder.ACLListStorageBuilder).GetKeychain() + + aclList, err := BuildACLList(signingkey.NewEDPubKeyDecoder(), st) + require.NoError(t, err, "building acl list should be without error") + + idA := keychain.GetIdentity("A") + idB := keychain.GetIdentity("B") + idC := keychain.GetIdentity("C") + + // checking final state + assert.Equal(t, aclpb.ACLChange_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) + assert.Equal(t, aclpb.ACLChange_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) + assert.Equal(t, aclList.Head().Content.CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) + + _, exists := aclList.ACLState().GetUserStates()[idB] + assert.Equal(t, false, exists) + + var records []*Record + aclList.Iterate(func(record *Record) (IsContinue bool) { + records = append(records, record) + return true + }) + + // checking permissions at specific records + assert.Equal(t, 4, len(records)) + + assert.NotEqual(t, records[2].Content.CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) + + perm, err := aclList.ACLState().PermissionsAtRecord(records[2].Id, idB) + assert.NoError(t, err, "should have no error with permissions of B in the record 2") + assert.Equal(t, UserPermissionPair{ + Identity: idB, + Permission: aclpb.ACLChange_Writer, + }, perm) + + _, err = aclList.ACLState().PermissionsAtRecord(records[3].Id, idB) + assert.Error(t, err, "B should have no permissions at record 3, because user should be removed") } diff --git a/pkg/acl/testutils/yamltests/userremovebeforeexample.yml b/pkg/acl/testutils/yamltests/userremovebeforeexample.yml deleted file mode 100644 index 2cd58df4..00000000 --- a/pkg/acl/testutils/yamltests/userremovebeforeexample.yml +++ /dev/null @@ -1,109 +0,0 @@ -tree: - author: A -changes: - - id: A.1.1 - identity: A - aclSnapshot: - userStates: - - identity: A - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - permission: admin - - identity: B - encryptionKey: key.Enc.B - encryptedReadKeys: [key.Read.1] - permission: admin - snapshot: - text: "some text" - aclChanges: - - userAdd: - identity: A - permission: admin - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - - userAdd: - identity: B - permission: admin - encryptionKey: key.Enc.B - encryptedReadKeys: [key.Read.1] - changes: - - textAppend: - text: "some text" - readKey: key.Read.1 - - id: A.1.2 - identity: A - aclChanges: - - userRemove: - removedIdentity: B - newReadKey: key.Read.2 - identitiesLeft: [A, C] - readKey: key.Read.2 - - id: A.1.3 - identity: A - aclChanges: - - userAdd: - identity: E - permission: admin - encryptionKey: key.Enc.E - encryptedReadKeys: [key.Read.1, key.Read.2] - readKey: key.Read.2 - - id: B.1.1 - identity: B - aclChanges: - - userAdd: - identity: C - permission: admin - encryptionKey: key.Enc.C - encryptedReadKeys: [ key.Read.1 ] - readKey: key.Read.1 - - id: B.1.2 - identity: B - aclChanges: - - userAdd: - identity: D - permission: admin - encryptionKey: key.Enc.D - encryptedReadKeys: [ key.Read.1 ] - readKey: key.Read.1 -keys: - Enc: - - A - - B - - C - - D - - E - Sign: - - A - - B - - C - - D - - E - Read: - - 1 - - 2 -graph: - - id: A.1.1 - baseSnapshot: A.1.1 - aclSnapshot: A.1.1 - - id: A.1.2 - baseSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.1] - - id: B.1.1 - baseSnapshot: A.1.1 - aclHeads: [A.1.1] - treeHeads: [A.1.1] - - id: B.1.2 - baseSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.1] - - id: A.1.3 - baseSnapshot: A.1.1 - aclHeads: [A.1.2] - treeHeads: [A.1.2] -orphans: - - "A.1.3" - - "B.1.2" -header: - firstChangeId: A.1.1 - isWorkspace: false diff --git a/pkg/acl/testutils/yamltests/userremoveexample.yml b/pkg/acl/testutils/yamltests/userremoveexample.yml index c3da9fe2..9d90468c 100644 --- a/pkg/acl/testutils/yamltests/userremoveexample.yml +++ b/pkg/acl/testutils/yamltests/userremoveexample.yml @@ -1,28 +1,13 @@ -tree: - author: A -changes: - - id: A.1.1 - identity: A - aclSnapshot: - userStates: - - identity: A - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - permission: admin - snapshot: - text: "some text" +records: + - identity: A aclChanges: - userAdd: identity: A permission: admin encryptionKey: key.Enc.A encryptedReadKeys: [key.Read.1] - changes: - - textAppend: - text: "some text" readKey: key.Read.1 - - id: A.1.2 - identity: A + - identity: A aclChanges: - userInvite: acceptKey: key.Sign.Onetime1 @@ -30,23 +15,13 @@ changes: encryptedReadKeys: [key.Read.1] permissions: writer inviteId: A.1.2 + - userAdd: + identity: C + permission: reader + encryptionKey: key.Enc.C + encryptedReadKeys: [key.Read.1] readKey: key.Read.1 - - id: A.1.3 - identity: A - aclChanges: - - userRemove: - removedIdentity: B - newReadKey: key.Read.2 - identitiesLeft: [A] - readKey: key.Read.2 - - id: A.1.4 - identity: A - changes: - - textAppend: - text: "first" - readKey: key.Read.2 - - id: B.1.1 - identity: B + - identity: B aclChanges: - userJoin: identity: B @@ -55,56 +30,34 @@ changes: inviteId: A.1.2 encryptedReadKeys: [key.Read.1] readKey: key.Read.1 - - id: B.1.2 - identity: B - changes: - - textAppend: - text: "second" - readKey: key.Read.1 + - identity: A + aclChanges: + - userRemove: + removedIdentity: B + newReadKey: key.Read.2 + identitiesLeft: [A, C] + readKey: key.Read.2 keys: Enc: - - A - - B - - Onetime1 + - name: A + value: generated + - name: B + value: generated + - name: C + value: generated + - name: Onetime1 + value: generated Sign: - - A - - B - - Onetime1 + - name: A + value: generated + - name: B + value: generated + - name: C + value: generated + - name: Onetime1 + value: generated Read: - - 1 - - 2 -graph: - - id: A.1.1 - baseSnapshot: A.1.1 - aclSnapshot: A.1.1 - - id: A.1.2 - baseSnapshot: A.1.1 - aclSnapshot: A.1.1 - aclHeads: [A.1.1] - treeHeads: [A.1.1] - - id: B.1.1 - baseSnapshot: A.1.1 - aclSnapshot: A.1.1 - aclHeads: [A.1.2] - treeHeads: [A.1.2] - - id: B.1.2 - baseSnapshot: A.1.1 - aclSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.1] - - id: A.1.3 - baseSnapshot: A.1.1 - aclSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.1] - - id: A.1.4 - baseSnapshot: A.1.1 - aclSnapshot: A.1.1 - aclHeads: [A.1.3] - treeHeads: [A.1.3] -orphans: - - "A.1.4" - - "B.1.2" -header: - firstChangeId: A.1.1 - isWorkspace: false + - name: 1 + value: generated + - name: 2 + value: generated diff --git a/pkg/acl/testutils/yamltests/validsnapshotexample.yml b/pkg/acl/testutils/yamltests/validsnapshotexample.yml deleted file mode 100644 index c75cda0a..00000000 --- a/pkg/acl/testutils/yamltests/validsnapshotexample.yml +++ /dev/null @@ -1,133 +0,0 @@ -tree: - author: A -changes: - - id: A.1.1 - identity: A - aclSnapshot: - userStates: - - identity: A - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - permission: admin - - identity: B - encryptionKey: key.Enc.B - encryptedReadKeys: [key.Read.1] - permission: admin - snapshot: - text: "some text" - aclChanges: - - userAdd: - identity: A - permission: admin - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - - userAdd: - identity: B - permission: admin - encryptionKey: key.Enc.B - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 - changes: - - textAppend: - text: "some text" - - id: A.1.2 - identity: A - aclSnapshot: - userStates: - - identity: A - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - permission: admin - - identity: B - encryptionKey: key.Enc.B - encryptedReadKeys: [key.Read.1] - permission: admin - - identity: C - encryptionKey: key.Enc.C - encryptedReadKeys: [ key.Read.1 ] - permission: admin - - identity: D - encryptionKey: key.Enc.D - encryptedReadKeys: [ key.Read.1 ] - permission: admin - snapshot: - text: "some text" - aclChanges: - - userAdd: - identity: D - permission: admin - encryptionKey: key.Enc.D - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 - - id: A.1.3 - identity: A - aclChanges: - - userAdd: - identity: E - permission: admin - encryptionKey: key.Enc.E - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 - - id: B.1.1 - identity: B - aclChanges: - - userAdd: - identity: C - permission: admin - encryptionKey: key.Enc.C - encryptedReadKeys: [ key.Read.1 ] - readKey: key.Read.1 - - id: B.1.2 - identity: B - aclChanges: - - userAdd: - identity: F - permission: admin - encryptionKey: key.Enc.F - encryptedReadKeys: [ key.Read.1 ] - readKey: key.Read.1 -keys: - Enc: - - A - - B - - C - - D - - E - - F - Sign: - - A - - B - - C - - D - - E - - F - Read: - - 1 - - 2 -graph: - - id: A.1.1 - baseSnapshot: A.1.1 - aclSnapshot: A.1.1 - - id: A.1.2 - baseSnapshot: A.1.1 - aclHeads: [B.1.1] - treeHeads: [B.1.1] - - id: B.1.1 - baseSnapshot: A.1.1 - aclHeads: [A.1.1] - treeHeads: [A.1.1] - - id: B.1.2 - baseSnapshot: A.1.2 - aclHeads: [A.1.2] - treeHeads: [A.1.2] - - id: A.1.3 - baseSnapshot: A.1.2 - aclHeads: [A.1.2] - treeHeads: [A.1.2] -orphans: - - "A.1.3" - - "B.1.2" -header: - firstChangeId: A.1.1 - isWorkspace: false - diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index e4938554..2ccfb9aa 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -2,7 +2,6 @@ package requesthandler import ( "context" - "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" @@ -24,8 +23,6 @@ type requestHandler struct { var log = logger.NewNamed("requesthandler") -var ErrIncorrectDocType = errors.New("incorrec doc type") - func New() app.Component { return &requestHandler{} } From 13236d8ebc482302f4b6f704db46b7469001745f Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 21 Aug 2022 16:44:05 +0200 Subject: [PATCH 027/219] Import acl document from the start --- etc/acl.yml | 28 ++++++++ etc/path.go | 15 +++++ pkg/acl/storage/inmemory.go | 11 ++++ pkg/acl/storage/provider.go | 1 + pkg/acl/testutils/acllistbuilder/keychain.go | 41 ++++++++++-- .../acllistbuilder/liststoragebuilder.go | 3 +- service/document/service.go | 6 +- service/storage/service.go | 64 ++++++++++++++++++- syncproto/helpers.go | 10 +-- 9 files changed, 160 insertions(+), 19 deletions(-) create mode 100644 etc/acl.yml create mode 100644 etc/path.go diff --git a/etc/acl.yml b/etc/acl.yml new file mode 100644 index 00000000..85bcfacc --- /dev/null +++ b/etc/acl.yml @@ -0,0 +1,28 @@ +records: + - identity: A + aclChanges: + - userAdd: + identity: A + permission: admin + encryptionKey: key.Enc.A + encryptedReadKeys: [key.Read.1] + - userAdd: + identity: B + permission: admin + encryptionKey: key.Enc.B + encryptedReadKeys: [key.Read.1] + readKey: key.Read.1 +keys: + Enc: + - name: A + value: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd + - name: B + value: JgG4CcCbae1qEpe7mKXzp7m5hNc56SSyZd9DwUaEStKJrq7RToAC2Vgd3i6hKRwa58zCWeN6Wjc3o6qrdKPEPRvcyEPysamajVo5mdQiUgWAmr97pGEsyjuRjQoC2GY2LvLiEQxEgwFgJxKGMHMiaWMtDfxCDUaDEm4bu5RdMhqRZekAWho6c3WoEeruSr14iX1TrocFNfBkBY7CjEw8kcywXCTNgtvhb2Qiwgj5AxEF4wyw4bzaNA9ctXb1hoHPFVMu6C51pkFY7jUD9zwyH3ukgnAewkGAcPNbKmaTAtMosKRVaAN97mAwXh2VRt1hWmRvVk7r76EjnVKhD4vbsKZc56RVcHTVWRVdhU7FGyPsiE5rSQAz1JQGYzxnZpX7EG77CyrmUGyfueVfRHhwY2oq8A4uQCRaQxSaJHYLowjXSxh8DQ2V6MTqyzti32C27utBYdHzLVCJSGkmdzGwrFcHqsq7nLDxmvJVErPvyReixEe8kFmqopJ3e6LLm8WdYw9K6JYBjXnEfwPzm7Von9sf3dcaGDUHYfttMyeke7fAXJkvPRje69hYVyzdQGAauuojzGkkvQWCSMK1KCMNMznRaPDCNvofrQhYrub24WhmwpKhorufdfW8Cb4T6reBDCtaWVsbuinjtL6F6Sui5aYHJFLJ6e4pPewr1P4EuZYRbMBZwN5KvDLhTGLBuBnaTqUUdF6bj2U22NoRYMogiHiftqKqiexKNDXX1Zg9RQEvxgjuVo6SBW42mVEA8agrLhruRqCmiduJxVrfqLNGeYXHXrcmMEgW7uosJbPXvTcfRvdFWS1ov7oSALvj6vhDQ28Yi9D2ETNdNsfVWAFQuwvPpW7CHQGXTitprVbqH8JYxNZuGygcLmr5efbB22Vzu4ntd1HoraQpG12qeDEUA7tXYUpoYyuSdWwKPjSAMtaQcCSfVrhKQHQuKJargrVrez8vjWuwLfvSucV7ZHe7gjqvYgULdE1ubRCRSd7DuLjEN2Vd6obzV2c3MRet7ZSf4Sp88WM5AuTyW7BjArBc4S3gUQ8rYaiZ8Tu7NCxkEzbFwWRaemZkwfvcsX3XxqjyF37tFSGkEqE5kuBvpZW72675LkDffj7kH1zA8yE6dVujJjWsNYVFJWndUtz5Vy2KCdZAbBgq19q4AtsxWPodU2N3yZXzFAFAzTrxS6V4P7Scpdau1avgRvHLcBQPunA37xaYMy8YMifJwtmRY25mnAQwZAk3eANk7tXwZd58SDnciLNvARJvwKzTQBXcshkwyy52SX8XmXDJsPnRLaHmiYBJ63Yzr5XpZuuAtxb9qrWG2NHCNxfomHokWacV1hjZPPd6ZxT1FuRozB6Qt2NLcyqY7bnTcQJb1jPUaTAGXXCR8WVmmmYo2fDQe8CdBmgyPvbzNTEJUyScBz4RdycB5PZap4SurJCWtHbuMyQbQUB6jJgURDstfXS5Akfe4oruNq9rnYcNtnsDJPtrhXHBqzDizmf1BDxR5FB2RCxzCgeAfg8WQ1Ug9PVAGTzob6ZqCrGXzWXEUniZnf1vjr7QhGKBYXEX9SWDoSMUpP4FreVDTnx15ijRZTV3p8xG5fE9e36TnugRVvTyq7XzmyPBjW2r66f1bior + Sign: + - name: A + value: 3id6ddLcoNoe9rDgGM88ET8T6TnvHm5GFqFdN6kBzn7Q8d6VUGgjeT59CNWFiaofdeRnHBvX2A5ZacMXvfwaYEFuCbug + - name: B + value: 3iiLPj6wMUQpPwTBNZcUgkbXub1jumg4AEV9LfMyFHZVc84GLyAjVbVvH6EAGhcNrxRxL82aW4BimhDZCpLsRCqx5vwj + Read: + - name: 1 + value: generated diff --git a/etc/path.go b/etc/path.go new file mode 100644 index 00000000..a90b9125 --- /dev/null +++ b/etc/path.go @@ -0,0 +1,15 @@ +package etc + +import ( + "path/filepath" + "runtime" +) + +var ( + _, b, _, _ = runtime.Caller(0) + basepath = filepath.Dir(b) +) + +func Path() string { + return basepath +} diff --git a/pkg/acl/storage/inmemory.go b/pkg/acl/storage/inmemory.go index 94e65557..651c2145 100644 --- a/pkg/acl/storage/inmemory.go +++ b/pkg/acl/storage/inmemory.go @@ -91,6 +91,17 @@ type inMemoryStorageProvider struct { sync.RWMutex } +func (i *inMemoryStorageProvider) AddStorage(id string, st Storage) error { + i.Lock() + defer i.Unlock() + if _, exists := i.objects[id]; exists { + return fmt.Errorf("storage already exists") + } + + i.objects[id] = st + return nil +} + func (i *inMemoryStorageProvider) Storage(id string) (Storage, error) { i.RLock() defer i.RUnlock() diff --git a/pkg/acl/storage/provider.go b/pkg/acl/storage/provider.go index 8dff81db..c1cf5fa9 100644 --- a/pkg/acl/storage/provider.go +++ b/pkg/acl/storage/provider.go @@ -9,5 +9,6 @@ var ErrUnknownTreeId = errors.New("tree does not exist") type Provider interface { Storage(id string) (Storage, error) + AddStorage(id string, st Storage) error CreateTreeStorage(treeId string, header *aclpb.Header, changes []*aclpb.RawChange) (TreeStorage, error) } diff --git a/pkg/acl/testutils/acllistbuilder/keychain.go b/pkg/acl/testutils/acllistbuilder/keychain.go index 7098650e..2456160b 100644 --- a/pkg/acl/testutils/acllistbuilder/keychain.go +++ b/pkg/acl/testutils/acllistbuilder/keychain.go @@ -54,11 +54,23 @@ func (k *Keychain) AddEncryptionKey(key *Key) { if _, exists := k.EncryptionKeys[key.Name]; exists { return } - newPrivKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) - if err != nil { - panic(err) + var ( + newPrivKey encryptionkey.PrivKey + err error + ) + if key.Value == "generated" { + newPrivKey, _, err = encryptionkey.GenerateRandomRSAKeyPair(2048) + if err != nil { + panic(err) + } + } else { + decoder := encryptionkey.NewRSAPrivKeyDecoder() + privKey, err := decoder.DecodeFromString(key.Value) + if err != nil { + panic(err) + } + newPrivKey = privKey.(encryptionkey.PrivKey) } - k.EncryptionKeys[key.Name] = newPrivKey } @@ -66,9 +78,24 @@ func (k *Keychain) AddSigningKey(key *Key) { if _, exists := k.SigningKeys[key.Name]; exists { return } - newPrivKey, pubKey, err := signingkey.GenerateRandomEd25519KeyPair() - if err != nil { - panic(err) + var ( + newPrivKey signingkey.PrivKey + pubKey signingkey.PubKey + err error + ) + if key.Value == "generated" { + newPrivKey, pubKey, err = signingkey.GenerateRandomEd25519KeyPair() + if err != nil { + panic(err) + } + } else { + decoder := signingkey.NewEDPrivKeyDecoder() + privKey, err := decoder.DecodeFromString(key.Value) + if err != nil { + panic(err) + } + newPrivKey = privKey.(signingkey.PrivKey) + pubKey = newPrivKey.GetPublic() } k.SigningKeys[key.Name] = newPrivKey diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index 25c09586..30383fc3 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -154,8 +154,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL case ch.UserAdd != nil: add := ch.UserAdd - encKey := t.keychain. - GetKey(add.EncryptionKey).(encryptionkey.PrivKey) + encKey := t.keychain.GetKey(add.EncryptionKey).(encryptionkey.PrivKey) rawKey, _ := encKey.GetPublic().Raw() convCh = &aclpb.ACLChangeACLContentValue{ diff --git a/service/document/service.go b/service/document/service.go index 369d8f1c..f6cdc097 100644 --- a/service/document/service.go +++ b/service/document/service.go @@ -58,7 +58,7 @@ func (s *service) Name() (name string) { } func (s *service) Run(ctx context.Context) (err error) { - return s.importACLList(ctx) + return nil } func (s *service) Close(ctx context.Context) (err error) { @@ -121,10 +121,6 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err }, header, id)) } -func (s *service) importACLList(ctx context.Context) (err error) { - panic("not implemented") -} - func (s *service) CreateDocumentTree(ctx context.Context, aclListId string, text string) (id string, err error) { acc := s.account.Account() var ( diff --git a/service/storage/service.go b/service/storage/service.go index 5ee9efa4..fad4aa6d 100644 --- a/service/storage/service.go +++ b/service/storage/service.go @@ -2,13 +2,22 @@ package storage import ( "context" + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/etc" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" ) var CName = "storage" +var log = logger.NewNamed("storage").Sugar() + type Service interface { storage.Provider } @@ -23,13 +32,18 @@ type service struct { func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.storageProvider = storage.NewInMemoryTreeStorageProvider() - return nil + // importing hardcoded acl list, check that the keys there are correct + return s.importACLList(a) } func (s *service) Storage(treeId string) (storage.Storage, error) { return s.storageProvider.Storage(treeId) } +func (s *service) AddStorage(id string, st storage.Storage) error { + return s.storageProvider.AddStorage(id, st) +} + func (s *service) CreateTreeStorage(treeId string, header *aclpb.Header, changes []*aclpb.RawChange) (storage.TreeStorage, error) { return s.storageProvider.CreateTreeStorage(treeId, header, changes) } @@ -45,3 +59,51 @@ func (s *service) Run(ctx context.Context) (err error) { func (s service) Close(ctx context.Context) (err error) { return nil } + +func (s *service) importACLList(a *app.App) (err error) { + path := fmt.Sprintf("%s/%s", etc.Path(), "acl.yml") + st, err := acllistbuilder.NewACLListStorageBuilderFromFile(path) + if err != nil { + return err + } + + id, err := st.ID() + if err != nil { + return err + } + + // checking that acl list contains all the needed permissions for all our nodes + err = s.checkActualNodesPermissions(st, a) + if err != nil { + return err + } + + log.Infof("imported ACLList with id %s", id) + return s.storageProvider.AddStorage(id, st) +} + +func (s *service) checkActualNodesPermissions(st *acllistbuilder.ACLListStorageBuilder, a *app.App) error { + nodes := a.MustComponent(node.CName).(node.Service) + acc := a.MustComponent(account.CName).(account.Service) + + aclList, err := list.BuildACLListWithIdentity(acc.Account(), st) + if err != nil { + return err + } + + state := aclList.ACLState() + + // checking own state + if state.GetUserStates()[acc.Account().Identity].Permissions != aclpb.ACLChange_Admin { + return fmt.Errorf("own node with signing key %s should be admin", acc.Account().Identity) + } + + // checking other nodes' states + for _, n := range nodes.Nodes() { + if state.GetUserStates()[n.SigningKeyString].Permissions != aclpb.ACLChange_Admin { + return fmt.Errorf("other node with signing key %s should be admin", n.SigningKeyString) + } + } + + return nil +} diff --git a/syncproto/helpers.go b/syncproto/helpers.go index 9fe94914..57a1def0 100644 --- a/syncproto/helpers.go +++ b/syncproto/helpers.go @@ -1,8 +1,10 @@ package syncproto -import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage/treepb" +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" +) -func WrapHeadUpdate(update *SyncHeadUpdate, header *treepb.TreeHeader, treeId string) *Sync { +func WrapHeadUpdate(update *SyncHeadUpdate, header *aclpb.Header, treeId string) *Sync { return &Sync{ Message: &SyncContentValue{ Value: &SyncContentValueValueOfHeadUpdate{HeadUpdate: update}, @@ -12,7 +14,7 @@ func WrapHeadUpdate(update *SyncHeadUpdate, header *treepb.TreeHeader, treeId st } } -func WrapFullRequest(request *SyncFullRequest, header *treepb.TreeHeader, treeId string) *Sync { +func WrapFullRequest(request *SyncFullRequest, header *aclpb.Header, treeId string) *Sync { return &Sync{ Message: &SyncContentValue{ Value: &SyncContentValueValueOfFullSyncRequest{FullSyncRequest: request}, @@ -22,7 +24,7 @@ func WrapFullRequest(request *SyncFullRequest, header *treepb.TreeHeader, treeId } } -func WrapFullResponse(response *SyncFullResponse, header *treepb.TreeHeader, treeId string) *Sync { +func WrapFullResponse(response *SyncFullResponse, header *aclpb.Header, treeId string) *Sync { return &Sync{ Message: &SyncContentValue{ Value: &SyncContentValueValueOfFullSyncResponse{FullSyncResponse: response}, From f2cedfd08e393205a8ee9e358c24ad16de559dd5 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 21 Aug 2022 17:43:22 +0200 Subject: [PATCH 028/219] Add generated read keys --- etc/acl.yml | 2 +- pkg/acl/testutils/acllistbuilder/keychain.go | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/etc/acl.yml b/etc/acl.yml index 85bcfacc..a9a44268 100644 --- a/etc/acl.yml +++ b/etc/acl.yml @@ -25,4 +25,4 @@ keys: value: 3iiLPj6wMUQpPwTBNZcUgkbXub1jumg4AEV9LfMyFHZVc84GLyAjVbVvH6EAGhcNrxRxL82aW4BimhDZCpLsRCqx5vwj Read: - name: 1 - value: generated + value: bamccoi5jdypwnjkiuuogkawvhkbowha4qg756uhnbkecr5vt3h4q diff --git a/pkg/acl/testutils/acllistbuilder/keychain.go b/pkg/acl/testutils/acllistbuilder/keychain.go index 2456160b..d968cd4c 100644 --- a/pkg/acl/testutils/acllistbuilder/keychain.go +++ b/pkg/acl/testutils/acllistbuilder/keychain.go @@ -111,7 +111,22 @@ func (k *Keychain) AddReadKey(key *Key) { if _, exists := k.ReadKeys[key.Name]; exists { return } - rkey, _ := symmetric.NewRandom() + + var ( + rkey *symmetric.Key + err error + ) + if key.Value == "generated" { + rkey, err = symmetric.NewRandom() + if err != nil { + panic("should be able to generate symmetric key") + } + } else { + rkey, err = symmetric.FromString(key.Value) + if err != nil { + panic("should be able to parse symmetric key") + } + } hasher := fnv.New64() hasher.Write(rkey.Bytes()) From 10a5677241ff427e12739b75ddd45fe5581de072 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 22 Aug 2022 23:53:14 +0200 Subject: [PATCH 029/219] Add ACL exchange logic --- pkg/acl/list/list.go | 5 + pkg/acl/storage/inmemory.go | 70 +++- pkg/acl/storage/provider.go | 1 + .../acllistbuilder/liststoragebuilder.go | 4 + service/document/service.go | 10 +- service/storage/service.go | 29 +- service/sync/requesthandler/requesthandler.go | 45 ++- service/treecache/service.go | 46 ++- syncproto/helpers.go | 10 + syncproto/proto/sync.proto | 5 + syncproto/sync.pb.go | 381 +++++++++++++++--- 11 files changed, 526 insertions(+), 80 deletions(-) diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index cf898271..a4f64f8e 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -22,6 +22,7 @@ type ACLList interface { RWLocker ID() string Header() *aclpb.Header + Records() []*Record ACLState() *ACLState IsAfter(first string, second string) (bool, error) Head() *Record @@ -113,6 +114,10 @@ func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStor }, nil } +func (a *aclList) Records() []*Record { + return a.records +} + func (a *aclList) ID() string { return a.id } diff --git a/pkg/acl/storage/inmemory.go b/pkg/acl/storage/inmemory.go index 651c2145..59235d5e 100644 --- a/pkg/acl/storage/inmemory.go +++ b/pkg/acl/storage/inmemory.go @@ -7,11 +7,64 @@ import ( "sync" ) +type inMemoryACLListStorage struct { + header *aclpb.Header + records []*aclpb.RawRecord + + id string + + sync.RWMutex +} + +func NewInMemoryACLListStorage( + id string, + header *aclpb.Header, + records []*aclpb.RawRecord) (ListStorage, error) { + return &inMemoryACLListStorage{ + id: id, + header: header, + records: records, + RWMutex: sync.RWMutex{}, + }, nil +} + +func (i *inMemoryACLListStorage) Header() (*aclpb.Header, error) { + i.RLock() + defer i.RUnlock() + return i.header, nil +} + +func (i *inMemoryACLListStorage) Head() (*aclpb.RawRecord, error) { + i.RLock() + defer i.RUnlock() + return i.records[len(i.records)-1], nil +} + +func (i *inMemoryACLListStorage) GetRawRecord(ctx context.Context, id string) (*aclpb.RawRecord, error) { + i.RLock() + defer i.RUnlock() + for _, rec := range i.records { + if rec.Id == id { + return rec, nil + } + } + return nil, fmt.Errorf("no such record") +} + +func (i *inMemoryACLListStorage) AddRawRecord(ctx context.Context, rec *aclpb.RawRecord) error { + panic("implement me") +} + +func (i *inMemoryACLListStorage) ID() (string, error) { + i.RLock() + defer i.RUnlock() + return i.id, nil +} + type inMemoryTreeStorage struct { id string header *aclpb.Header heads []string - orphans []string changes map[string]*aclpb.RawChange sync.RWMutex @@ -24,17 +77,14 @@ func NewInMemoryTreeStorage( header *aclpb.Header, changes []*aclpb.RawChange) (TreeStorage, error) { allChanges := make(map[string]*aclpb.RawChange) - var orphans []string for _, ch := range changes { allChanges[ch.Id] = ch - orphans = append(orphans, ch.Id) } return &inMemoryTreeStorage{ id: treeId, header: header, heads: nil, - orphans: orphans, changes: allChanges, RWMutex: sync.RWMutex{}, }, nil @@ -123,6 +173,18 @@ func (i *inMemoryStorageProvider) CreateTreeStorage(treeId string, header *aclpb return res, nil } +func (i *inMemoryStorageProvider) CreateACLListStorage(id string, header *aclpb.Header, records []*aclpb.RawRecord) (ListStorage, error) { + i.Lock() + defer i.Unlock() + res, err := NewInMemoryACLListStorage(id, header, records) + if err != nil { + return nil, err + } + + i.objects[id] = res + return res, nil +} + func NewInMemoryTreeStorageProvider() Provider { return &inMemoryStorageProvider{ objects: make(map[string]Storage), diff --git a/pkg/acl/storage/provider.go b/pkg/acl/storage/provider.go index c1cf5fa9..a9be29b9 100644 --- a/pkg/acl/storage/provider.go +++ b/pkg/acl/storage/provider.go @@ -11,4 +11,5 @@ type Provider interface { Storage(id string) (Storage, error) AddStorage(id string, st Storage) error CreateTreeStorage(treeId string, header *aclpb.Header, changes []*aclpb.RawChange) (TreeStorage, error) + CreateACLListStorage(id string, header *aclpb.Header, records []*aclpb.RawRecord) (ListStorage, error) } diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index 30383fc3..324f8733 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -106,6 +106,10 @@ func (t *ACLListStorageBuilder) ID() (string, error) { return t.id, nil } +func (t *ACLListStorageBuilder) GetRawRecords() []*aclpb.RawRecord { + return t.rawRecords +} + func (t *ACLListStorageBuilder) GetKeychain() *Keychain { return t.keychain } diff --git a/service/document/service.go b/service/document/service.go index f6cdc097..30350a2d 100644 --- a/service/document/service.go +++ b/service/document/service.go @@ -58,7 +58,15 @@ func (s *service) Name() (name string) { } func (s *service) Run(ctx context.Context) (err error) { - return nil + syncData := s.storage.ImportedACLSyncData() + + // we could have added a timeout or some additional logic, + // but let's just use the ACL id of the latest started node :-) + return s.messageService.SendToSpaceAsync("", syncproto.WrapACLList( + &syncproto.SyncACLList{Records: syncData.Records}, + syncData.Header, + syncData.Id, + )) } func (s *service) Close(ctx context.Context) (err error) { diff --git a/service/storage/service.go b/service/storage/service.go index fad4aa6d..c8b96a52 100644 --- a/service/storage/service.go +++ b/service/storage/service.go @@ -18,8 +18,15 @@ var CName = "storage" var log = logger.NewNamed("storage").Sugar() +type ImportedACLSyncData struct { + Id string + Header *aclpb.Header + Records []*aclpb.RawRecord +} + type Service interface { storage.Provider + ImportedACLSyncData() ImportedACLSyncData } func New() app.Component { @@ -27,7 +34,8 @@ func New() app.Component { } type service struct { - storageProvider storage.Provider + storageProvider storage.Provider + importedACLSyncData ImportedACLSyncData } func (s *service) Init(ctx context.Context, a *app.App) (err error) { @@ -48,10 +56,18 @@ func (s *service) CreateTreeStorage(treeId string, header *aclpb.Header, changes return s.storageProvider.CreateTreeStorage(treeId, header, changes) } +func (s *service) CreateACLListStorage(id string, header *aclpb.Header, records []*aclpb.RawRecord) (storage.ListStorage, error) { + return s.storageProvider.CreateACLListStorage(id, header, records) +} + func (s *service) Name() (name string) { return CName } +func (s *service) ImportedACLSyncData() ImportedACLSyncData { + return s.importedACLSyncData +} + func (s *service) Run(ctx context.Context) (err error) { return nil } @@ -72,12 +88,23 @@ func (s *service) importACLList(a *app.App) (err error) { return err } + header, err := st.Header() + if err != nil { + return err + } + // checking that acl list contains all the needed permissions for all our nodes err = s.checkActualNodesPermissions(st, a) if err != nil { return err } + s.importedACLSyncData = ImportedACLSyncData{ + Id: id, + Header: header, + Records: st.GetRawRecords(), + } + log.Infof("imported ACLList with id %s", id) return s.storageProvider.AddStorage(id, st) } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 2ccfb9aa..50e35083 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -66,6 +66,8 @@ func (r *requestHandler) HandleSyncMessage(ctx context.Context, senderId string, return r.HandleFullSyncResponse(ctx, senderId, msg.GetFullSyncResponse(), content.GetTreeHeader(), content.GetTreeId()) case msg.GetHeadUpdate() != nil: return r.HandleHeadUpdate(ctx, senderId, msg.GetHeadUpdate(), content.GetTreeHeader(), content.GetTreeId()) + case msg.GetAclList() != nil: + return r.HandleACLList(ctx, senderId, msg.GetAclList(), content.GetTreeHeader(), content.GetTreeId()) } return nil } @@ -267,6 +269,27 @@ func (r *requestHandler) HandleFullSyncResponse( return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) } +func (r *requestHandler) HandleACLList( + ctx context.Context, + senderId string, + req *syncproto.SyncACLList, + header *aclpb.Header, + id string) (err error) { + + err = r.treeCache.Do(ctx, id, func(obj interface{}) error { + return nil + }) + // do nothing if already added + if err == nil { + return nil + } + // if not found then add to storage + if err == storage.ErrUnknownTreeId { + return r.createACLList(ctx, req, header, id) + } + return err +} + func (r *requestHandler) prepareFullSyncRequest(theirPath []string, t tree.CommonTree) (*syncproto.SyncFullRequest, error) { ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath) if err != nil { @@ -320,9 +343,23 @@ func (r *requestHandler) createTree( return r.treeCache.Add( ctx, treeId, - header, - response.Changes, - func(obj interface{}) error { - return nil + treecache.TreePayload{ + Header: header, + Changes: response.Changes, + }) +} + +func (r *requestHandler) createACLList( + ctx context.Context, + req *syncproto.SyncACLList, + header *aclpb.Header, + treeId string) error { + + return r.treeCache.Add( + ctx, + treeId, + treecache.ACLListPayload{ + Header: header, + Records: req.Records, }) } diff --git a/service/treecache/service.go b/service/treecache/service.go index c94d1fb6..f37823f6 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -17,14 +17,23 @@ import ( const CName = "treecache" -// TODO: add context type ObjFunc = func(obj interface{}) error var log = logger.NewNamed("treecache") +type TreePayload struct { + Header *aclpb.Header + Changes []*aclpb.RawChange +} + +type ACLListPayload struct { + Header *aclpb.Header + Records []*aclpb.RawRecord +} + type Service interface { - Do(ctx context.Context, treeId string, f ObjFunc) error - Add(ctx context.Context, treeId string, header *aclpb.Header, changes []*aclpb.RawChange, f ObjFunc) error + Do(ctx context.Context, id string, f ObjFunc) error + Add(ctx context.Context, id string, payload interface{}) error } type service struct { @@ -50,16 +59,29 @@ func (s *service) Do(ctx context.Context, treeId string, f ObjFunc) error { return f(t) } -func (s *service) Add(ctx context.Context, treeId string, header *aclpb.Header, changes []*aclpb.RawChange, f ObjFunc) error { - log. - With(zap.String("treeId", treeId), zap.Int("len(changes)", len(changes))). - Debug("adding tree with changes") +func (s *service) Add(ctx context.Context, treeId string, payload interface{}) error { + switch pl := payload.(type) { + case TreePayload: + log. + With(zap.String("treeId", treeId), zap.Int("len(changes)", len(pl.Changes))). + Debug("adding Tree with changes") + + _, err := s.storage.CreateTreeStorage(treeId, pl.Header, pl.Changes) + if err != nil { + return err + } + case ACLListPayload: + log. + With(zap.String("treeId", treeId), zap.Int("len(changes)", len(pl.Records))). + Debug("adding ACLList with records") + + _, err := s.storage.CreateACLListStorage(treeId, pl.Header, pl.Records) + if err != nil { + return err + } - _, err := s.storage.CreateTreeStorage(treeId, header, changes) - if err != nil { - return err } - return s.Do(ctx, treeId, f) + return nil } func (s *service) Init(ctx context.Context, a *app.App) (err error) { @@ -92,7 +114,7 @@ func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error return nil, err } - switch header.DocType { + switch header.DocType { // handler case aclpb.Header_ACL: return list.BuildACLListWithIdentity(s.account.Account(), t.(aclstorage.ListStorage)) case aclpb.Header_DocTree: diff --git a/syncproto/helpers.go b/syncproto/helpers.go index 57a1def0..fbbf11dc 100644 --- a/syncproto/helpers.go +++ b/syncproto/helpers.go @@ -33,3 +33,13 @@ func WrapFullResponse(response *SyncFullResponse, header *aclpb.Header, treeId s TreeId: treeId, } } + +func WrapACLList(aclList *SyncACLList, header *aclpb.Header, id string) *Sync { + return &Sync{ + Message: &SyncContentValue{ + Value: &SyncContentValueValueOfAclList{AclList: aclList}, + }, + TreeHeader: header, + TreeId: id, + } +} diff --git a/syncproto/proto/sync.proto b/syncproto/proto/sync.proto index c71848e4..ea6dd3f2 100644 --- a/syncproto/proto/sync.proto +++ b/syncproto/proto/sync.proto @@ -71,9 +71,14 @@ message Sync { HeadUpdate headUpdate = 1; Full.Request fullSyncRequest = 2; Full.Response fullSyncResponse = 3; + ACLList aclList = 4; } } + message ACLList { + repeated acl.RawRecord records = 1; + } + message HeadUpdate { repeated string heads = 1; repeated acl.RawChange changes = 2; diff --git a/syncproto/sync.pb.go b/syncproto/sync.pb.go index f047edb3..65da1f85 100644 --- a/syncproto/sync.pb.go +++ b/syncproto/sync.pb.go @@ -661,6 +661,7 @@ type SyncContentValue struct { // *SyncContentValueValueOfHeadUpdate // *SyncContentValueValueOfFullSyncRequest // *SyncContentValueValueOfFullSyncResponse + // *SyncContentValueValueOfAclList Value IsSyncContentValueValue `protobuf_oneof:"value"` } @@ -712,10 +713,14 @@ type SyncContentValueValueOfFullSyncRequest struct { type SyncContentValueValueOfFullSyncResponse struct { FullSyncResponse *SyncFullResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` } +type SyncContentValueValueOfAclList struct { + AclList *SyncACLList `protobuf:"bytes,4,opt,name=aclList,proto3,oneof" json:"aclList,omitempty"` +} func (*SyncContentValueValueOfHeadUpdate) IsSyncContentValueValue() {} func (*SyncContentValueValueOfFullSyncRequest) IsSyncContentValueValue() {} func (*SyncContentValueValueOfFullSyncResponse) IsSyncContentValueValue() {} +func (*SyncContentValueValueOfAclList) IsSyncContentValueValue() {} func (m *SyncContentValue) GetValue() IsSyncContentValueValue { if m != nil { @@ -745,15 +750,67 @@ func (m *SyncContentValue) GetFullSyncResponse() *SyncFullResponse { return nil } +func (m *SyncContentValue) GetAclList() *SyncACLList { + if x, ok := m.GetValue().(*SyncContentValueValueOfAclList); ok { + return x.AclList + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*SyncContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ (*SyncContentValueValueOfHeadUpdate)(nil), (*SyncContentValueValueOfFullSyncRequest)(nil), (*SyncContentValueValueOfFullSyncResponse)(nil), + (*SyncContentValueValueOfAclList)(nil), } } +type SyncACLList struct { + Records []*aclpb.RawRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"` +} + +func (m *SyncACLList) Reset() { *m = SyncACLList{} } +func (m *SyncACLList) String() string { return proto.CompactTextString(m) } +func (*SyncACLList) ProtoMessage() {} +func (*SyncACLList) Descriptor() ([]byte, []int) { + return fileDescriptor_4b28dfdd48a89166, []int{4, 1} +} +func (m *SyncACLList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SyncACLList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SyncACLList.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 *SyncACLList) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncACLList.Merge(m, src) +} +func (m *SyncACLList) XXX_Size() int { + return m.Size() +} +func (m *SyncACLList) XXX_DiscardUnknown() { + xxx_messageInfo_SyncACLList.DiscardUnknown(m) +} + +var xxx_messageInfo_SyncACLList proto.InternalMessageInfo + +func (m *SyncACLList) GetRecords() []*aclpb.RawRecord { + if m != nil { + return m.Records + } + return nil +} + type SyncHeadUpdate struct { Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` @@ -764,7 +821,7 @@ func (m *SyncHeadUpdate) Reset() { *m = SyncHeadUpdate{} } func (m *SyncHeadUpdate) String() string { return proto.CompactTextString(m) } func (*SyncHeadUpdate) ProtoMessage() {} func (*SyncHeadUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{4, 1} + return fileDescriptor_4b28dfdd48a89166, []int{4, 2} } func (m *SyncHeadUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -821,7 +878,7 @@ func (m *SyncFull) Reset() { *m = SyncFull{} } func (m *SyncFull) String() string { return proto.CompactTextString(m) } func (*SyncFull) ProtoMessage() {} func (*SyncFull) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{4, 2} + return fileDescriptor_4b28dfdd48a89166, []int{4, 3} } func (m *SyncFull) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -861,7 +918,7 @@ func (m *SyncFullRequest) Reset() { *m = SyncFullRequest{} } func (m *SyncFullRequest) String() string { return proto.CompactTextString(m) } func (*SyncFullRequest) ProtoMessage() {} func (*SyncFullRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{4, 2, 0} + return fileDescriptor_4b28dfdd48a89166, []int{4, 3, 0} } func (m *SyncFullRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -921,7 +978,7 @@ func (m *SyncFullResponse) Reset() { *m = SyncFullResponse{} } func (m *SyncFullResponse) String() string { return proto.CompactTextString(m) } func (*SyncFullResponse) ProtoMessage() {} func (*SyncFullResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{4, 2, 1} + return fileDescriptor_4b28dfdd48a89166, []int{4, 3, 1} } func (m *SyncFullResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -986,6 +1043,7 @@ func init() { proto.RegisterType((*SubscriptionUnsubscribeSpace)(nil), "anytype.Subscription.UnsubscribeSpace") proto.RegisterType((*Sync)(nil), "anytype.Sync") proto.RegisterType((*SyncContentValue)(nil), "anytype.Sync.ContentValue") + proto.RegisterType((*SyncACLList)(nil), "anytype.Sync.ACLList") proto.RegisterType((*SyncHeadUpdate)(nil), "anytype.Sync.HeadUpdate") proto.RegisterType((*SyncFull)(nil), "anytype.Sync.Full") proto.RegisterType((*SyncFullRequest)(nil), "anytype.Sync.Full.Request") @@ -995,60 +1053,63 @@ func init() { func init() { proto.RegisterFile("syncproto/proto/sync.proto", fileDescriptor_4b28dfdd48a89166) } var fileDescriptor_4b28dfdd48a89166 = []byte{ - // 840 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xd1, 0x8e, 0xdb, 0x44, - 0x14, 0x8d, 0x13, 0x27, 0x69, 0x6e, 0xa2, 0xac, 0x99, 0xb6, 0x60, 0xdc, 0x2a, 0xb2, 0xac, 0x02, - 0x56, 0x8b, 0xbc, 0x28, 0x50, 0x21, 0xf1, 0xd6, 0x2e, 0xbb, 0x4a, 0x44, 0x49, 0xa2, 0xc9, 0x66, - 0x91, 0x78, 0xa9, 0x26, 0xf6, 0x34, 0x89, 0xe2, 0x1d, 0x1b, 0x8f, 0x0d, 0xe4, 0x17, 0x78, 0xea, - 0x37, 0xf0, 0x0d, 0x7c, 0x04, 0x8f, 0x7d, 0xe4, 0x09, 0xa1, 0x5d, 0xc1, 0x77, 0xa0, 0x99, 0xb1, - 0x13, 0xaf, 0xbb, 0x7d, 0xed, 0x43, 0x92, 0xb9, 0xf7, 0x9e, 0x73, 0xe6, 0x5c, 0x8f, 0xef, 0x04, - 0x2c, 0xbe, 0x63, 0x7e, 0x9c, 0x44, 0x69, 0x74, 0xac, 0xbe, 0x45, 0xec, 0xc9, 0x25, 0x6a, 0x13, - 0xb6, 0x4b, 0x77, 0x31, 0xb5, 0xbe, 0x88, 0xb7, 0xab, 0x63, 0xe2, 0x87, 0xe2, 0xe3, 0xaf, 0x09, - 0x5b, 0x51, 0x2e, 0x96, 0xf1, 0x52, 0x71, 0x78, 0x29, 0xaf, 0xa8, 0xce, 0x19, 0xb4, 0xbf, 0xa7, - 0x9c, 0x93, 0x15, 0x45, 0x9f, 0x41, 0x6b, 0x4d, 0x49, 0x40, 0x13, 0x53, 0xb3, 0x35, 0xb7, 0x3b, - 0x3c, 0xf2, 0x72, 0x59, 0x6f, 0x24, 0xd3, 0x38, 0x2f, 0x23, 0x04, 0x7a, 0x40, 0x52, 0x62, 0xd6, - 0x6d, 0xcd, 0xed, 0x61, 0xb9, 0x76, 0x7e, 0xd7, 0xa0, 0xa5, 0x60, 0xc8, 0x84, 0x76, 0x9a, 0x10, - 0x9f, 0x8e, 0x03, 0x29, 0xd4, 0xc3, 0x45, 0x88, 0x1e, 0x42, 0x27, 0xa1, 0x3f, 0x65, 0x94, 0xa7, - 0xe3, 0x40, 0xb2, 0x75, 0x7c, 0x48, 0x08, 0x5e, 0x42, 0xe3, 0x70, 0x37, 0x0e, 0xcc, 0x86, 0xac, - 0x15, 0x21, 0x72, 0x41, 0x17, 0x3e, 0x4c, 0xdd, 0xd6, 0xdc, 0xfe, 0xf0, 0xde, 0xde, 0x57, 0xee, - 0xfc, 0x7c, 0x17, 0x53, 0x2c, 0x11, 0x62, 0x87, 0x80, 0x2e, 0xb3, 0xd5, 0x98, 0xbd, 0x8a, 0xcc, - 0xa6, 0xad, 0xb9, 0x1d, 0x7c, 0x48, 0x38, 0x7f, 0x34, 0xa0, 0x35, 0xdf, 0xf1, 0x94, 0x5e, 0xa2, - 0xaf, 0xa1, 0xb3, 0x26, 0x2c, 0xe0, 0x6b, 0xb2, 0xa5, 0x79, 0xbf, 0x1f, 0xef, 0x75, 0x15, 0xc6, - 0x1b, 0x15, 0x00, 0x7c, 0xc0, 0x0a, 0x2f, 0xf1, 0x86, 0xad, 0xa4, 0xfd, 0x6e, 0xc9, 0x4b, 0xce, - 0x99, 0x6d, 0xd8, 0x0a, 0x4b, 0x04, 0xfa, 0x04, 0x1a, 0xc4, 0xdf, 0xca, 0x5e, 0xba, 0xc3, 0xbb, - 0x55, 0xe0, 0x33, 0x7f, 0x8b, 0x45, 0xdd, 0x7a, 0x0a, 0x9d, 0x51, 0x49, 0xfd, 0x48, 0x9e, 0x8b, - 0x1f, 0x85, 0x17, 0x34, 0xe1, 0x9b, 0x88, 0x49, 0x73, 0x1d, 0x5c, 0x4d, 0x5b, 0x0e, 0xe8, 0x62, - 0x2f, 0x64, 0xc1, 0x9d, 0x8c, 0x6d, 0x7e, 0x3d, 0xdf, 0x5c, 0xaa, 0x3e, 0x74, 0xbc, 0x8f, 0xad, - 0x21, 0x34, 0x9e, 0xf9, 0x5b, 0xf4, 0x04, 0x9a, 0x34, 0x49, 0xa2, 0x24, 0xf7, 0x7c, 0xbf, 0x6a, - 0xe5, 0x54, 0x14, 0xb1, 0xc2, 0x58, 0xaf, 0x35, 0x68, 0xca, 0x04, 0xf2, 0x40, 0xf7, 0xa3, 0x40, - 0xa9, 0xf6, 0x87, 0xd6, 0xad, 0x2c, 0xef, 0x24, 0x0a, 0x28, 0x96, 0x38, 0x64, 0x43, 0x37, 0xa0, - 0xdc, 0x4f, 0x36, 0x71, 0x2a, 0x7c, 0xd7, 0xa5, 0xef, 0x72, 0xca, 0x79, 0x0a, 0xba, 0xc0, 0xa3, - 0x2e, 0xb4, 0x17, 0x93, 0xef, 0x26, 0xd3, 0x1f, 0x26, 0x46, 0x0d, 0xd9, 0xf0, 0x70, 0x31, 0x99, - 0x2f, 0x66, 0xb3, 0x29, 0x3e, 0x3f, 0xfd, 0xf6, 0xe5, 0x0c, 0x4f, 0xcf, 0xa7, 0x27, 0xd3, 0x17, - 0x2f, 0x2f, 0x4e, 0xf1, 0x7c, 0x3c, 0x9d, 0x18, 0xe0, 0xfc, 0x56, 0x87, 0xde, 0x3c, 0x5b, 0xee, - 0x75, 0xd0, 0x0b, 0xe8, 0x73, 0x15, 0x2f, 0xe9, 0x3c, 0x26, 0x7e, 0x71, 0x82, 0x8f, 0x0e, 0x1e, - 0x4b, 0xf0, 0x22, 0xc8, 0xb1, 0xb8, 0xc2, 0x45, 0x18, 0x8c, 0x8c, 0x55, 0xf4, 0xd4, 0x93, 0xfa, - 0xf4, 0x76, 0xbd, 0x45, 0x05, 0x8d, 0xdf, 0xe2, 0x5b, 0x8f, 0xa1, 0x7f, 0x73, 0x57, 0xf1, 0x76, - 0xf3, 0xf8, 0x30, 0x15, 0x1d, 0x5c, 0x84, 0xd6, 0xe7, 0x60, 0x54, 0x15, 0xdf, 0x8d, 0x76, 0xfe, - 0x6e, 0x82, 0x3e, 0xdf, 0x31, 0xff, 0xdd, 0x10, 0xf4, 0x15, 0xb4, 0x2f, 0xd5, 0x64, 0xe4, 0x7d, - 0x94, 0xcf, 0x8e, 0xf9, 0xde, 0x49, 0xc4, 0x52, 0xca, 0xd2, 0x0b, 0x12, 0x66, 0x14, 0x17, 0x50, - 0xf4, 0x04, 0x20, 0x4d, 0x28, 0x55, 0x43, 0x9c, 0xbf, 0xb5, 0x5d, 0x8f, 0xf8, 0x61, 0x31, 0xfe, - 0xa5, 0x32, 0xfa, 0x10, 0x5a, 0x22, 0x1a, 0x07, 0x72, 0x26, 0x3b, 0x38, 0x8f, 0xac, 0xff, 0x34, - 0xe8, 0x95, 0xe5, 0xd1, 0x37, 0x00, 0xe2, 0xd6, 0x58, 0xc4, 0x01, 0x49, 0x8b, 0x63, 0x32, 0x6f, - 0xda, 0x19, 0xed, 0xeb, 0xa3, 0x1a, 0x2e, 0xa1, 0xd1, 0x19, 0x1c, 0xbd, 0xca, 0xc2, 0x50, 0x80, - 0xb0, 0xba, 0x25, 0x6e, 0xef, 0xe7, 0x2c, 0x0b, 0x43, 0x2f, 0x47, 0x8c, 0x6a, 0xb8, 0x4a, 0x42, - 0x63, 0x30, 0x0e, 0x29, 0x1e, 0x47, 0x8c, 0xd3, 0xbc, 0xbf, 0x07, 0xb7, 0x0a, 0x29, 0xc8, 0xa8, - 0x86, 0xdf, 0xa2, 0x3d, 0x6f, 0x43, 0xf3, 0x67, 0xd1, 0x97, 0x15, 0x03, 0x1c, 0x7c, 0xa3, 0x7b, - 0xd0, 0x14, 0xbe, 0xb9, 0xa9, 0xd9, 0x0d, 0xb7, 0x83, 0x55, 0x80, 0x5c, 0x68, 0xe7, 0x97, 0xad, - 0x59, 0xb7, 0x1b, 0x6e, 0x77, 0xd8, 0x97, 0x8f, 0x13, 0x93, 0x5f, 0x4e, 0x64, 0x1a, 0x17, 0x65, - 0xe4, 0x40, 0x8f, 0x33, 0x12, 0xf3, 0x75, 0x94, 0xce, 0x48, 0xba, 0x36, 0x1b, 0x52, 0xe6, 0x46, - 0xce, 0xfa, 0x57, 0x03, 0x5d, 0x18, 0xb4, 0x2e, 0xa1, 0x5d, 0x74, 0xf6, 0x3e, 0xf6, 0x65, 0x70, - 0xa7, 0x68, 0xff, 0x7d, 0xec, 0xf7, 0xf8, 0x02, 0xba, 0xa5, 0x7b, 0x1d, 0xdd, 0x87, 0x0f, 0x4a, - 0xa1, 0xba, 0x7b, 0x8c, 0x1a, 0x7a, 0x00, 0x1f, 0x95, 0xd3, 0xa5, 0xf1, 0x34, 0x34, 0x74, 0x17, - 0x8e, 0x6e, 0x70, 0x98, 0x6f, 0xd4, 0x9f, 0x3f, 0xfa, 0xf3, 0x6a, 0xa0, 0xbd, 0xb9, 0x1a, 0x68, - 0xff, 0x5c, 0x0d, 0xb4, 0xd7, 0xd7, 0x83, 0xda, 0x9b, 0xeb, 0x41, 0xed, 0xaf, 0xeb, 0x41, 0xed, - 0x47, 0x38, 0xde, 0xff, 0xb7, 0x2e, 0x5b, 0xf2, 0xe7, 0xcb, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, - 0x34, 0xaa, 0x76, 0x9b, 0x6f, 0x07, 0x00, 0x00, + // 882 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x41, 0x8f, 0xda, 0x46, + 0x14, 0xb6, 0xc1, 0xe0, 0xf0, 0x40, 0x2c, 0x9d, 0x24, 0xad, 0xeb, 0x44, 0x08, 0xa1, 0xb4, 0x45, + 0x49, 0xe5, 0x6d, 0x49, 0xa3, 0x4a, 0xbd, 0x6d, 0xe8, 0xae, 0x40, 0xdd, 0x02, 0x1a, 0x96, 0xad, + 0xd4, 0x4b, 0x34, 0x8c, 0x27, 0x80, 0xf0, 0x8e, 0x5d, 0x8f, 0x69, 0xcb, 0x5f, 0xe8, 0x29, 0xd7, + 0x5e, 0xfb, 0x1b, 0xfa, 0x1b, 0xaa, 0x1e, 0x73, 0xec, 0xb1, 0xda, 0x55, 0xff, 0x47, 0x35, 0x33, + 0x36, 0x18, 0xb2, 0xb9, 0xee, 0x61, 0x17, 0xbf, 0xf7, 0xbe, 0xef, 0x9b, 0xef, 0xbd, 0xf1, 0x8c, + 0xc1, 0x15, 0x1b, 0x4e, 0xa3, 0x38, 0x4c, 0xc2, 0x63, 0xfd, 0x5f, 0xc6, 0x9e, 0x7a, 0x44, 0x36, + 0xe1, 0x9b, 0x64, 0x13, 0x31, 0xf7, 0x8b, 0x68, 0x35, 0x3f, 0x26, 0x34, 0x90, 0x7f, 0x74, 0x41, + 0xf8, 0x9c, 0x09, 0xf9, 0x18, 0xcd, 0x34, 0x47, 0xe4, 0xf2, 0x9a, 0xda, 0x3e, 0x03, 0xfb, 0x7b, + 0x26, 0x04, 0x99, 0x33, 0xf4, 0x19, 0x94, 0x17, 0x8c, 0xf8, 0x2c, 0x76, 0xcc, 0x96, 0xd9, 0xa9, + 0x76, 0x8f, 0xbc, 0x54, 0xd6, 0xeb, 0xab, 0x34, 0x4e, 0xcb, 0x08, 0x81, 0xe5, 0x93, 0x84, 0x38, + 0x85, 0x96, 0xd9, 0xa9, 0x61, 0xf5, 0xdc, 0xfe, 0xc3, 0x84, 0xb2, 0x86, 0x21, 0x07, 0xec, 0x24, + 0x26, 0x94, 0x0d, 0x7c, 0x25, 0x54, 0xc3, 0x59, 0x88, 0x1e, 0x43, 0x25, 0x66, 0x3f, 0xad, 0x99, + 0x48, 0x06, 0xbe, 0x62, 0x5b, 0x78, 0x97, 0x90, 0xbc, 0x98, 0x45, 0xc1, 0x66, 0xe0, 0x3b, 0x45, + 0x55, 0xcb, 0x42, 0xd4, 0x01, 0x4b, 0xfa, 0x70, 0xac, 0x96, 0xd9, 0xa9, 0x77, 0x1f, 0x6c, 0x7d, + 0xa5, 0xce, 0x2f, 0x36, 0x11, 0xc3, 0x0a, 0x21, 0x57, 0xf0, 0xd9, 0x6c, 0x3d, 0x1f, 0xf0, 0xd7, + 0xa1, 0x53, 0x6a, 0x99, 0x9d, 0x0a, 0xde, 0x25, 0xda, 0x7f, 0x16, 0xa1, 0x3c, 0xd9, 0x88, 0x84, + 0x5d, 0xa1, 0xaf, 0xa1, 0xb2, 0x20, 0xdc, 0x17, 0x0b, 0xb2, 0x62, 0x69, 0xbf, 0x1f, 0x6f, 0x75, + 0x35, 0xc6, 0xeb, 0x67, 0x00, 0xbc, 0xc3, 0x4a, 0x2f, 0xd1, 0x92, 0xcf, 0x95, 0xfd, 0x6a, 0xce, + 0x4b, 0xca, 0x19, 0x2f, 0xf9, 0x1c, 0x2b, 0x04, 0xfa, 0x04, 0x8a, 0x84, 0xae, 0x54, 0x2f, 0xd5, + 0xee, 0xfd, 0x43, 0xe0, 0x09, 0x5d, 0x61, 0x59, 0x77, 0x5f, 0x40, 0xa5, 0x9f, 0x53, 0x3f, 0x52, + 0xfb, 0x42, 0xc3, 0xe0, 0x92, 0xc5, 0x62, 0x19, 0x72, 0x65, 0xae, 0x82, 0x0f, 0xd3, 0x6e, 0x1b, + 0x2c, 0xb9, 0x16, 0x72, 0xe1, 0xde, 0x9a, 0x2f, 0x7f, 0xbd, 0x58, 0x5e, 0xe9, 0x3e, 0x2c, 0xbc, + 0x8d, 0xdd, 0x2e, 0x14, 0x4f, 0xe8, 0x0a, 0x3d, 0x83, 0x12, 0x8b, 0xe3, 0x30, 0x4e, 0x3d, 0x3f, + 0x3c, 0xb4, 0x72, 0x2a, 0x8b, 0x58, 0x63, 0xdc, 0x37, 0x26, 0x94, 0x54, 0x02, 0x79, 0x60, 0xd1, + 0xd0, 0xd7, 0xaa, 0xf5, 0xae, 0x7b, 0x2b, 0xcb, 0xeb, 0x85, 0x3e, 0xc3, 0x0a, 0x87, 0x5a, 0x50, + 0xf5, 0x99, 0xa0, 0xf1, 0x32, 0x4a, 0xa4, 0xef, 0x82, 0xf2, 0x9d, 0x4f, 0xb5, 0x5f, 0x80, 0x25, + 0xf1, 0xa8, 0x0a, 0xf6, 0x74, 0xf8, 0xdd, 0x70, 0xf4, 0xc3, 0xb0, 0x61, 0xa0, 0x16, 0x3c, 0x9e, + 0x0e, 0x27, 0xd3, 0xf1, 0x78, 0x84, 0x2f, 0x4e, 0xbf, 0x7d, 0x35, 0xc6, 0xa3, 0x8b, 0x51, 0x6f, + 0x74, 0xfe, 0xea, 0xf2, 0x14, 0x4f, 0x06, 0xa3, 0x61, 0x03, 0xda, 0xbf, 0x15, 0xa0, 0x36, 0x59, + 0xcf, 0xb6, 0x3a, 0xe8, 0x1c, 0xea, 0x42, 0xc7, 0x33, 0x36, 0x89, 0x08, 0xcd, 0x76, 0xf0, 0xc9, + 0xce, 0x63, 0x0e, 0x9e, 0x05, 0x29, 0x16, 0x1f, 0x70, 0x11, 0x86, 0xc6, 0x9a, 0x1f, 0xe8, 0xe9, + 0x49, 0x7d, 0x7a, 0xbb, 0xde, 0xf4, 0x00, 0x8d, 0xdf, 0xe1, 0xbb, 0x4f, 0xa1, 0xbe, 0xbf, 0xaa, + 0x7c, 0xbb, 0x45, 0xb4, 0x3b, 0x15, 0x15, 0x9c, 0x85, 0xee, 0xe7, 0xd0, 0x38, 0x54, 0x7c, 0x3f, + 0xba, 0xfd, 0x57, 0x19, 0xac, 0xc9, 0x86, 0xd3, 0xf7, 0x43, 0xd0, 0x57, 0x60, 0x5f, 0xe9, 0x93, + 0x91, 0xf6, 0x91, 0xdf, 0x3b, 0x4e, 0xbd, 0x5e, 0xc8, 0x13, 0xc6, 0x93, 0x4b, 0x12, 0xac, 0x19, + 0xce, 0xa0, 0xe8, 0x19, 0x40, 0x12, 0x33, 0xa6, 0x0f, 0x71, 0xfa, 0xd6, 0x56, 0x3d, 0x42, 0x83, + 0xec, 0xf8, 0xe7, 0xca, 0xe8, 0x43, 0x28, 0xcb, 0x68, 0xe0, 0xab, 0x33, 0x59, 0xc1, 0x69, 0xe4, + 0xfe, 0x5e, 0x80, 0x5a, 0x5e, 0x1e, 0x7d, 0x03, 0x20, 0x6f, 0x8d, 0x69, 0xe4, 0x93, 0x24, 0xdb, + 0x26, 0x67, 0xdf, 0x4e, 0x7f, 0x5b, 0xef, 0x1b, 0x38, 0x87, 0x46, 0x67, 0x70, 0xf4, 0x7a, 0x1d, + 0x04, 0x12, 0x84, 0xf5, 0x2d, 0x71, 0x7b, 0x3f, 0x67, 0xeb, 0x20, 0xf0, 0x52, 0x44, 0xdf, 0xc0, + 0x87, 0x24, 0x34, 0x80, 0xc6, 0x2e, 0x25, 0xa2, 0x90, 0x0b, 0x96, 0xf6, 0xf7, 0xe8, 0x56, 0x21, + 0x0d, 0xe9, 0x1b, 0xf8, 0x1d, 0x1a, 0xfa, 0x12, 0x6c, 0x42, 0x83, 0xf3, 0xa5, 0x48, 0x54, 0xe3, + 0xfb, 0x87, 0x89, 0x53, 0xef, 0xa4, 0x77, 0x2e, 0x8b, 0x7d, 0x03, 0x67, 0xb8, 0x97, 0x36, 0x94, + 0x7e, 0x96, 0xa3, 0x70, 0x9f, 0x83, 0x9d, 0x96, 0x51, 0x47, 0x5e, 0x75, 0x34, 0x8c, 0x7d, 0xe1, + 0x98, 0xad, 0x62, 0xa7, 0xda, 0xad, 0xab, 0x41, 0x63, 0xf2, 0x0b, 0x56, 0x69, 0x9c, 0x95, 0xdd, + 0x08, 0x60, 0x37, 0x1f, 0xf4, 0x00, 0x4a, 0x72, 0x3e, 0x9a, 0x55, 0xc1, 0x3a, 0x90, 0x6a, 0xe9, + 0xa5, 0xee, 0x14, 0xf6, 0xd5, 0x7a, 0x2a, 0x8d, 0xb3, 0x32, 0x6a, 0x43, 0x4d, 0x70, 0x12, 0x89, + 0x45, 0x98, 0x8c, 0x49, 0xb2, 0x70, 0x8a, 0x4a, 0x66, 0x2f, 0xe7, 0xfe, 0x67, 0x82, 0x25, 0x07, + 0xe1, 0x5e, 0x81, 0x9d, 0x4d, 0xf0, 0x2e, 0xd6, 0xe5, 0x70, 0x6f, 0x3b, 0xe6, 0x3b, 0x58, 0xef, + 0xe9, 0x25, 0x54, 0x73, 0xdf, 0x0f, 0xf4, 0x10, 0x3e, 0xc8, 0x85, 0xfa, 0x8e, 0x6b, 0x18, 0xe8, + 0x11, 0x7c, 0x94, 0x4f, 0xe7, 0xae, 0x81, 0x86, 0x89, 0xee, 0xc3, 0xd1, 0x1e, 0x87, 0xd3, 0x46, + 0xe1, 0xe5, 0x93, 0xbf, 0xaf, 0x9b, 0xe6, 0xdb, 0xeb, 0xa6, 0xf9, 0xef, 0x75, 0xd3, 0x7c, 0x73, + 0xd3, 0x34, 0xde, 0xde, 0x34, 0x8d, 0x7f, 0x6e, 0x9a, 0xc6, 0x8f, 0x70, 0xbc, 0xfd, 0x86, 0xcf, + 0xca, 0xea, 0xe7, 0xf9, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x8e, 0x29, 0x21, 0xd7, 0x07, + 0x00, 0x00, } func (m *Message) Marshal() (dAtA []byte, err error) { @@ -1595,6 +1656,64 @@ func (m *SyncContentValueValueOfFullSyncResponse) MarshalToSizedBuffer(dAtA []by } return len(dAtA) - i, nil } +func (m *SyncContentValueValueOfAclList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncContentValueValueOfAclList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.AclList != nil { + { + size, err := m.AclList.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} +func (m *SyncACLList) 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 *SyncACLList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SyncACLList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Records) > 0 { + for iNdEx := len(m.Records) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Records[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *SyncHeadUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2028,6 +2147,33 @@ func (m *SyncContentValueValueOfFullSyncResponse) Size() (n int) { } return n } +func (m *SyncContentValueValueOfAclList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AclList != nil { + l = m.AclList.Size() + n += 1 + l + sovSync(uint64(l)) + } + return n +} +func (m *SyncACLList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Records) > 0 { + for _, e := range m.Records { + l = e.Size() + n += 1 + l + sovSync(uint64(l)) + } + } + return n +} + func (m *SyncHeadUpdate) Size() (n int) { if m == nil { return 0 @@ -3519,6 +3665,125 @@ func (m *SyncContentValue) Unmarshal(dAtA []byte) error { } m.Value = &SyncContentValueValueOfFullSyncResponse{v} iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AclList", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SyncACLList{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &SyncContentValueValueOfAclList{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SyncACLList) 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 ErrIntOverflowSync + } + 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: ACLList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Records", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Records = append(m.Records, &aclpb.RawRecord{}) + if err := m.Records[len(m.Records)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSync(dAtA[iNdEx:]) From 9f4dbf00023236e40d8cb5094c1559f900423f53 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 23 Aug 2022 00:21:46 +0200 Subject: [PATCH 030/219] Fix change validator --- pkg/acl/list/aclstate.go | 4 +++- pkg/acl/list/list.go | 3 +++ pkg/acl/tree/changevalidator.go | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index 0424dc42..c5a2d63f 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -15,7 +15,7 @@ import ( "hash/fnv" ) -var log = logger.NewNamed("acllist") +var log = logger.NewNamed("acllist").Sugar() var ErrNoSuchUser = errors.New("no such user") var ErrFailedToDecrypt = errors.New("failed to decrypt key") @@ -77,6 +77,7 @@ func (st *ACLState) UserReadKeys() map[uint64]*symmetric.Key { func (st *ACLState) PermissionsAtRecord(id string, identity string) (UserPermissionPair, error) { permissions, ok := st.permissionsAtRecord[id] if !ok { + log.Errorf("missing record at id %s", id) return UserPermissionPair{}, ErrNoSuchRecord } @@ -135,6 +136,7 @@ func (st *ACLState) applyChangeAndUpdate(recordWrapper *Record) (err error) { permissions = append(permissions, permission) } st.permissionsAtRecord[recordWrapper.Id] = permissions + log.Infof("adding permissions at record %s", recordWrapper.Id) return nil } diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index a4f64f8e..acd2b131 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "go.uber.org/zap" "sync" ) @@ -98,6 +99,8 @@ func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStor indexes[records[len(records)/2].Id] = len(records) / 2 } + log.With(zap.String("head id", records[len(records)-1].Id), zap.String("list id", id)). + Info("building acl tree") state, err := builder.Build(records) if err != nil { return nil, err diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index 2f0b5fe2..0c77d169 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -26,7 +26,7 @@ func (v *docTreeValidator) ValidateTree(tree *Tree, aclList list.ACLList) (err e tree.Iterate(tree.RootId(), func(c *Change) (isContinue bool) { // checking if the user could write - perm, err = state.PermissionsAtRecord(c.Id, c.Content.Identity) + perm, err = state.PermissionsAtRecord(c.Content.AclHeadId, c.Content.Identity) if err != nil { return false } From b602c086039ed843f1fc0b8406a4c7bdfc54bfd2 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 4 Sep 2022 14:34:37 +0200 Subject: [PATCH 031/219] Change tree iterate --- pkg/acl/tree/change.go | 1 + pkg/acl/tree/tree_test.go | 19 ++++- pkg/acl/tree/treeiterator.go | 160 ++++++++++------------------------- 3 files changed, 61 insertions(+), 119 deletions(-) diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index ae655839..97a45e75 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -25,6 +25,7 @@ type Change struct { IsSnapshot bool DecryptedChange []byte // TODO: check if we need it ParsedModel interface{} + visited bool Content *aclpb.Change Sign []byte diff --git a/pkg/acl/tree/tree_test.go b/pkg/acl/tree/tree_test.go index cc2c82bc..563280bf 100644 --- a/pkg/acl/tree/tree_test.go +++ b/pkg/acl/tree/tree_test.go @@ -105,6 +105,7 @@ func TestTree_Add(t *testing.T) { t.Log(time.Since(st)) assert.Equal(t, []string{"9999"}, tr.Heads()) }) + // TODO: add my tests } func TestTree_Hash(t *testing.T) { @@ -157,9 +158,10 @@ func TestTree_Iterate(t *testing.T) { newChange("1", "0", "0"), newChange("1.1", "0", "1"), newChange("1.2", "0", "1"), + newChange("1.4", "0", "1.2"), newChange("1.3", "0", "1"), newChange("1.3.1", "0", "1.3"), - newChange("1.2+3", "0", "1.2", "1.3.1"), + newChange("1.2+3", "0", "1.4", "1.3.1"), newChange("1.2+3.1", "0", "1.2+3"), newChange("10", "0", "1.2+3.1", "1.1"), newChange("last", "0", "10"), @@ -174,7 +176,7 @@ func TestTree_Iterate(t *testing.T) { res = append(res, c.Id) return true }) - assert.Equal(t, []string{"0", "1", "1.1", "1.2", "1.3", "1.3.1", "1.2+3", "1.2+3.1", "10", "last"}, res) + assert.Equal(t, []string{"0", "1", "1.1", "1.2", "1.4", "1.3", "1.3.1", "1.2+3", "1.2+3.1", "10", "last"}, res) }) } @@ -211,4 +213,17 @@ func BenchmarkTree_Add(b *testing.B) { tr.AddFast(getChanges()...) } }) + // prepare linear tree + tr := new(Tree) + tr.AddFast(newSnapshot("0", "")) + for j := 0; j < 10000; j++ { + tr.Add(newChange(fmt.Sprint(j+1), "0", fmt.Sprint(j))) + } + b.Run("add linear", func(b *testing.B) { + for i := 0; i < b.N; i++ { + tr.Iterate("0", func(c *Change) (isContinue bool) { + return true + }) + } + }) } diff --git a/pkg/acl/tree/treeiterator.go b/pkg/acl/tree/treeiterator.go index 2bc1db58..6d2301e9 100644 --- a/pkg/acl/tree/treeiterator.go +++ b/pkg/acl/tree/treeiterator.go @@ -1,10 +1,15 @@ package tree -import "sync" +import ( + "sync" +) var itPool = &sync.Pool{ New: func() interface{} { - return &iterator{} + return &iterator{ + stack: make([]*Change, 0, 100), + resBuf: make([]*Change, 0, 100), + } }, } @@ -17,11 +22,9 @@ func freeIterator(i *iterator) { } type iterator struct { - compBuf []*Change - queue []*Change - doneMap map[*Change]struct{} - breakpoint *Change - f func(c *Change) bool + resBuf []*Change + stack []*Change + f func(c *Change) bool } func (i *iterator) iterateSkip(start *Change, skipBefore *Change, f func(c *Change) (isContinue bool)) { @@ -35,124 +38,47 @@ func (i *iterator) iterateSkip(start *Change, skipBefore *Change, f func(c *Chan }) } +func (i *iterator) topSort(start *Change) { + stack := i.stack + stack = append(stack, start) + + for len(stack) > 0 { + ch := stack[len(stack)-1] + stack = stack[:len(stack)-1] + + if ch.visited { + i.resBuf = append(i.resBuf, ch) + continue + } + + ch.visited = true + stack = append(stack, ch) + + for j := 0; j < len(ch.Next); j++ { + if ch.Next[j].visited { + continue + } + stack = append(stack, ch.Next[j]) + } + } + for _, ch := range i.resBuf { + ch.visited = false + } +} + func (i *iterator) iterate(start *Change, f func(c *Change) (isContinue bool)) { if start == nil { return } // reset - i.queue = i.queue[:0] - i.compBuf = i.compBuf[:0] - i.doneMap = make(map[*Change]struct{}) - i.queue = append(i.queue, start) - i.breakpoint = nil + i.resBuf = i.resBuf[:0] + i.stack = i.stack[:0] i.f = f - for len(i.queue) > 0 { - c := i.queue[0] - i.queue = i.queue[1:] - nl := len(c.Next) - if nl == 1 { - if !i.iterateLin(c) { - return - } - if i.breakpoint != nil { - i.toQueue(i.breakpoint) - i.breakpoint = nil - } - } else { - _, done := i.doneMap[c] - if !done { - if !f(c) { - return - } - i.doneMap[c] = struct{}{} - } - if nl != 0 { - for _, next := range c.Next { - i.toQueue(next) - } - } - } - } -} - -func (i *iterator) iterateLin(c *Change) bool { - for len(c.Next) == 1 { - _, done := i.doneMap[c] - if !done { - if !i.f(c) { - return false - } - i.doneMap[c] = struct{}{} - } - - c = c.Next[0] - if len(c.PreviousIds) > 1 { - break - } - } - if len(c.Next) == 0 && len(c.PreviousIds) <= 1 { - if !i.f(c) { - return false - } - i.doneMap[c] = struct{}{} - } else { - i.breakpoint = c - } - - return true -} - -func (i *iterator) comp(c1, c2 *Change) uint8 { - if c1.Id == c2.Id { - return 0 - } - i.compBuf = i.compBuf[:0] - i.compBuf = append(i.compBuf, c1.Next...) - var uniq = make(map[*Change]struct{}) - var appendUniqueToBuf = func(next []*Change) { - for _, n := range next { - if _, ok := uniq[n]; !ok { - i.compBuf = append(i.compBuf, n) - uniq[n] = struct{}{} - } - } - } - var used int - for len(i.compBuf)-used > 0 { - l := len(i.compBuf) - used - for _, n := range i.compBuf[used:] { - delete(uniq, n) - if n.Id == c2.Id { - return 1 - } else { - appendUniqueToBuf(n.Next) - } - } - used += l - } - return 2 -} - -func (i *iterator) toQueue(c *Change) { - var pos = -1 -For: - for idx, qc := range i.queue { - switch i.comp(c, qc) { - // exists - case 0: + i.topSort(start) + for idx := len(i.resBuf) - 1; idx >= 0; idx-- { + if !f(i.resBuf[idx]) { return - // - case 1: - pos = idx - break For } } - if pos == -1 { - i.queue = append(i.queue, c) - } else if pos == 0 { - i.queue = append([]*Change{c}, i.queue...) - } else { - i.queue = append(i.queue[:pos], append([]*Change{c}, i.queue[pos:]...)...) - } } From b87c38e232640cf7bf57bcf3f7aa9af32f128fab Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 4 Sep 2022 16:05:38 +0200 Subject: [PATCH 032/219] Add tree reduce --- pkg/acl/tree/tree_test.go | 91 ++++++++++++++++++++++++++++++++++++++ pkg/acl/tree/treereduce.go | 89 +++++++++++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 pkg/acl/tree/treereduce.go diff --git a/pkg/acl/tree/tree_test.go b/pkg/acl/tree/tree_test.go index 563280bf..6fe31994 100644 --- a/pkg/acl/tree/tree_test.go +++ b/pkg/acl/tree/tree_test.go @@ -150,6 +150,97 @@ func TestTree_AddFuzzy(t *testing.T) { } } +func TestTree_CheckRootReduce(t *testing.T) { + t.Run("check root once", func(t *testing.T) { + tr := new(Tree) + tr.Add( + newSnapshot("0", ""), + newChange("1", "0", "0"), + newChange("1.1", "0", "1"), + newChange("1.2", "0", "1"), + newChange("1.4", "0", "1.2"), + newChange("1.3", "0", "1"), + newChange("1.3.1", "0", "1.3"), + newChange("1.2+3", "0", "1.4", "1.3.1"), + newChange("1.2+3.1", "0", "1.2+3"), + newSnapshot("10", "0", "1.2+3.1", "1.1"), + newChange("last", "10", "10"), + ) + t.Run("check root", func(t *testing.T) { + total := tr.checkRoot(tr.attached["10"]) + assert.Equal(t, 1, total) + }) + t.Run("reduce", func(t *testing.T) { + tr.reduceTree() + assert.Equal(t, "10", tr.RootId()) + var res []string + tr.Iterate(tr.RootId(), func(c *Change) (isContinue bool) { + res = append(res, c.Id) + return true + }) + assert.Equal(t, []string{"10", "last"}, res) + }) + }) + t.Run("check root many", func(t *testing.T) { + tr := new(Tree) + tr.Add( + newSnapshot("0", ""), + newSnapshot("1", "0", "0"), + newChange("1.1", "0", "1"), + newChange("1.2", "0", "1"), + newChange("1.4", "0", "1.2"), + newChange("1.3", "0", "1"), + newChange("1.3.1", "0", "1.3"), + newChange("1.2+3", "0", "1.4", "1.3.1"), + newChange("1.2+3.1", "0", "1.2+3"), + newSnapshot("10", "0", "1.2+3.1", "1.1"), + newChange("last", "10", "10"), + ) + t.Run("check root", func(t *testing.T) { + total := tr.checkRoot(tr.attached["10"]) + assert.Equal(t, 1, total) + + total = tr.checkRoot(tr.attached["1"]) + assert.Equal(t, 9, total) + }) + t.Run("reduce", func(t *testing.T) { + tr.reduceTree() + assert.Equal(t, "10", tr.RootId()) + var res []string + tr.Iterate(tr.RootId(), func(c *Change) (isContinue bool) { + res = append(res, c.Id) + return true + }) + assert.Equal(t, []string{"10", "last"}, res) + }) + }) + t.Run("check root incorrect", func(t *testing.T) { + tr := new(Tree) + tr.Add( + newSnapshot("0", ""), + newChange("1", "0", "0"), + newChange("1.1", "0", "1"), + newChange("1.2", "0", "1"), + newChange("1.4", "0", "1.2"), + newChange("1.3", "0", "1"), + newSnapshot("1.3.1", "0", "1.3"), + newChange("1.2+3", "0", "1.4", "1.3.1"), + newChange("1.2+3.1", "0", "1.2+3"), + newChange("10", "0", "1.2+3.1", "1.1"), + newChange("last", "10", "10"), + ) + t.Run("check root", func(t *testing.T) { + total := tr.checkRoot(tr.attached["1.3.1"]) + assert.Equal(t, -1, total) + }) + t.Run("reduce", func(t *testing.T) { + tr.reduceTree() + assert.Equal(t, "0", tr.RootId()) + assert.Equal(t, 0, len(tr.possibleRoots)) + }) + }) +} + func TestTree_Iterate(t *testing.T) { t.Run("complex tree", func(t *testing.T) { tr := new(Tree) diff --git a/pkg/acl/tree/treereduce.go b/pkg/acl/tree/treereduce.go new file mode 100644 index 00000000..d1a788ac --- /dev/null +++ b/pkg/acl/tree/treereduce.go @@ -0,0 +1,89 @@ +package tree + +import "math" + +// clearPossibleRoots force removes any snapshots which can further be deemed as roots +func (t *Tree) clearPossibleRoots() { + t.possibleRoots = t.possibleRoots[:0] +} + +// checkRoot checks if a change can be a new root for the tree +// it returns total changes which were discovered during dfsPrev from heads +func (t *Tree) checkRoot(change *Change) (total int) { + t.stackBuf = t.stackBuf[:0] + stack := t.stackBuf + + // starting with heads + for _, h := range t.headIds { + stack = append(stack, t.attached[h]) + } + + change.visited = true + t.dfsPrev( + stack, + func(ch *Change) { + total += 1 + }, + func(changes []*Change) { + if t.root.visited { + total = -1 + } + }, + ) + change.visited = false + + return +} + +// makeRootAndRemove removes all changes before start and makes start the root +func (t *Tree) makeRootAndRemove(start *Change) { + t.stackBuf = t.stackBuf[:0] + stack := t.stackBuf + for _, prev := range start.PreviousIds { + stack = append(stack, t.attached[prev]) + } + + t.dfsPrev( + stack, + func(ch *Change) {}, + func(changes []*Change) { + for _, ch := range changes { + delete(t.unAttached, ch.Id) + } + }, + ) + + // removing unattached because they may refer to previous root + t.unAttached = make(map[string]*Change) + t.root = start +} + +// reduceTree tries to reduce the tree to one of possible tree roots +func (t *Tree) reduceTree() (res bool) { + if len(t.possibleRoots) == 0 { + return + } + var ( + minRoot *Change + minTotal = math.MaxInt + ) + + // checking if we can reduce tree to other root + for _, root := range t.possibleRoots { + totalChanges := t.checkRoot(root) + // we prefer new root with min amount of total changes + if totalChanges != -1 && totalChanges < minTotal { + minRoot = root + minTotal = totalChanges + } + } + + t.clearPossibleRoots() + if minRoot == nil { + return + } + + t.makeRootAndRemove(minRoot) + res = true + return +} From 1ad4eba17ea8dcb7ae2c35260f1b734d0f068dab Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 4 Sep 2022 17:05:00 +0200 Subject: [PATCH 033/219] Fix algorithms and add tests --- pkg/acl/tree/change.go | 5 ++++- pkg/acl/tree/tree.go | 38 +++++++++++++++++++++++------------- pkg/acl/tree/tree_test.go | 17 ++++++++++------ pkg/acl/tree/treeiterator.go | 19 +++++++++++++----- 4 files changed, 53 insertions(+), 26 deletions(-) diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index 97a45e75..b3243fdb 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -25,7 +25,10 @@ type Change struct { IsSnapshot bool DecryptedChange []byte // TODO: check if we need it ParsedModel interface{} - visited bool + + // iterator helpers + visited bool + branchesFinished bool Content *aclpb.Change Sign []byte diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go index 687561fa..aa36d667 100644 --- a/pkg/acl/tree/tree.go +++ b/pkg/acl/tree/tree.go @@ -24,10 +24,11 @@ type Tree struct { // missed id -> list of dependency ids waitList map[string][]string invalidChanges map[string]struct{} + possibleRoots []*Change // bufs - iterCompBuf []*Change - iterQueue []*Change + visitedBuf []*Change + stackBuf []*Change duplicateEvents int } @@ -59,14 +60,13 @@ func (t *Tree) AddFast(changes ...*Change) { func (t *Tree) AddMergedHead(c *Change) error { // check that it was not inserted previously if _, ok := t.attached[c.Id]; ok { - return fmt.Errorf("change already exists") + return fmt.Errorf("change already exists") // TODO: named error } else if _, ok := t.unAttached[c.Id]; ok { return fmt.Errorf("change already exists") } - t.add(c) // check that it was attached after adding - if _, ok := t.attached[c.Id]; !ok { + if !t.add(c) { return fmt.Errorf("change is not attached") } @@ -172,6 +172,7 @@ func (t *Tree) add(c *Change) (attached bool) { t.unAttached = make(map[string]*Change) t.waitList = make(map[string][]string) t.invalidChanges = make(map[string]struct{}) + t.possibleRoots = make([]*Change, 0, 10) return true } if len(c.PreviousIds) > 1 { @@ -216,6 +217,9 @@ func (t *Tree) attach(c *Change, newEl bool) { if !newEl { delete(t.unAttached, c.Id) } + if c.IsSnapshot { + t.possibleRoots = append(t.possibleRoots, c) + } // add next to all prev changes for _, id := range c.PreviousIds { @@ -266,25 +270,31 @@ func (t *Tree) after(id1, id2 string) (found bool) { return } -func (t *Tree) dfs(startChange string) (uniqMap map[string]*Change) { - stack := make([]*Change, 0, 10) - stack = append(stack, t.attached[startChange]) - uniqMap = map[string]*Change{} +func (t *Tree) dfsPrev(stack []*Change, visit func(ch *Change), afterVisit func([]*Change)) { + t.visitedBuf = t.visitedBuf[:0] for len(stack) > 0 { ch := stack[len(stack)-1] stack = stack[:len(stack)-1] - if _, exists := uniqMap[ch.Id]; exists { + if ch.visited { continue } - uniqMap[ch.Id] = ch + ch.visited = true + t.visitedBuf = append(t.visitedBuf, ch) - for _, prev := range ch.PreviousIds { - stack = append(stack, t.attached[prev]) + for _, prevId := range ch.PreviousIds { + prevCh := t.attached[prevId] + if !prevCh.visited { + stack = append(stack, prevCh) + } } + visit(ch) + } + afterVisit(t.visitedBuf) + for _, ch := range t.visitedBuf { + ch.visited = false } - return uniqMap } func (t *Tree) updateHeads() { diff --git a/pkg/acl/tree/tree_test.go b/pkg/acl/tree/tree_test.go index 6fe31994..615da851 100644 --- a/pkg/acl/tree/tree_test.go +++ b/pkg/acl/tree/tree_test.go @@ -186,22 +186,24 @@ func TestTree_CheckRootReduce(t *testing.T) { tr.Add( newSnapshot("0", ""), newSnapshot("1", "0", "0"), - newChange("1.1", "0", "1"), newChange("1.2", "0", "1"), - newChange("1.4", "0", "1.2"), newChange("1.3", "0", "1"), newChange("1.3.1", "0", "1.3"), - newChange("1.2+3", "0", "1.4", "1.3.1"), - newChange("1.2+3.1", "0", "1.2+3"), - newSnapshot("10", "0", "1.2+3.1", "1.1"), + newSnapshot("1.2+3", "1", "1.2", "1.3.1"), + newChange("1.2+3.1", "1", "1.2+3"), + newChange("1.2+3.2", "1", "1.2+3"), + newSnapshot("10", "1.2+3", "1.2+3.1", "1.2+3.2"), newChange("last", "10", "10"), ) t.Run("check root", func(t *testing.T) { total := tr.checkRoot(tr.attached["10"]) assert.Equal(t, 1, total) + total = tr.checkRoot(tr.attached["1.2+3"]) + assert.Equal(t, 4, total) + total = tr.checkRoot(tr.attached["1"]) - assert.Equal(t, 9, total) + assert.Equal(t, 8, total) }) t.Run("reduce", func(t *testing.T) { tr.reduceTree() @@ -304,6 +306,9 @@ func BenchmarkTree_Add(b *testing.B) { tr.AddFast(getChanges()...) } }) +} + +func BenchmarkTree_IterateLinear(b *testing.B) { // prepare linear tree tr := new(Tree) tr.AddFast(newSnapshot("0", "")) diff --git a/pkg/acl/tree/treeiterator.go b/pkg/acl/tree/treeiterator.go index 6d2301e9..eb42f7b4 100644 --- a/pkg/acl/tree/treeiterator.go +++ b/pkg/acl/tree/treeiterator.go @@ -46,19 +46,28 @@ func (i *iterator) topSort(start *Change) { ch := stack[len(stack)-1] stack = stack[:len(stack)-1] - if ch.visited { + // this looks a bit clumsy, but the idea is that we will go through the change again as soon as we finished + // going through its branches + if ch.branchesFinished { i.resBuf = append(i.resBuf, ch) + ch.branchesFinished = false + continue + } + + // in theory, it may be the case that we add the change two times + // but probably due to the way how we build the tree, we won't need it + if ch.visited { continue } - ch.visited = true stack = append(stack, ch) + ch.visited = true + ch.branchesFinished = true for j := 0; j < len(ch.Next); j++ { - if ch.Next[j].visited { - continue + if !ch.Next[j].visited { + stack = append(stack, ch.Next[j]) } - stack = append(stack, ch.Next[j]) } } for _, ch := range i.resBuf { From 90cee0031941f5cc51a19dfaf2df7036df55ff70 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 5 Sep 2022 11:48:50 +0200 Subject: [PATCH 034/219] Further changes to treebuilder etc --- pkg/acl/list/aclstate.go | 9 + pkg/acl/tree/change.go | 21 +-- pkg/acl/tree/doctree.go | 315 ++++++++++++++++---------------- pkg/acl/tree/keychain.go | 30 +++ pkg/acl/tree/signablecontent.go | 13 ++ pkg/acl/tree/tree.go | 25 ++- pkg/acl/tree/treebuilder.go | 123 ++++--------- pkg/acl/tree/treereduce.go | 7 +- pkg/acl/tree/treestorage.go | 53 +----- pkg/acl/tree/util.go | 27 +++ service/document/service.go | 8 +- 11 files changed, 322 insertions(+), 309 deletions(-) create mode 100644 pkg/acl/tree/keychain.go create mode 100644 pkg/acl/tree/signablecontent.go create mode 100644 pkg/acl/tree/util.go diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index c5a2d63f..c34e73e8 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -24,6 +24,7 @@ var ErrDocumentForbidden = errors.New("your user was forbidden access to the doc var ErrUserAlreadyExists = errors.New("user already exists") var ErrNoSuchRecord = errors.New("no such record") var ErrInsufficientPermissions = errors.New("insufficient permissions") +var ErrNoReadKey = errors.New("acl state doesn't have a read key") type UserPermissionPair struct { Identity string @@ -70,6 +71,14 @@ func (st *ACLState) CurrentReadKeyHash() uint64 { return st.currentReadKeyHash } +func (st *ACLState) CurrentReadKey() (*symmetric.Key, error) { + key, exists := st.userReadKeys[st.currentReadKeyHash] + if !exists { + return nil, ErrNoReadKey + } + return key, nil +} + func (st *ACLState) UserReadKeys() map[uint64]*symmetric.Key { return st.userReadKeys } diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index b3243fdb..2e1d3dce 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -3,8 +3,6 @@ package tree import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/gogo/protobuf/proto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" @@ -52,7 +50,7 @@ func (ch *Change) DecryptContents(key *symmetric.Key) error { return nil } -func NewFromRawChange(rawChange *aclpb.RawChange) (*Change, error) { +func NewChangeFromRaw(rawChange *aclpb.RawChange) (*Change, error) { unmarshalled := &aclpb.Change{} err := proto.Unmarshal(rawChange.Payload, unmarshalled) if err != nil { @@ -64,25 +62,20 @@ func NewFromRawChange(rawChange *aclpb.RawChange) (*Change, error) { return ch, nil } -func NewFromVerifiedRawChange( +func NewVerifiedChangeFromRaw( rawChange *aclpb.RawChange, - identityKeys map[string]signingkey.PubKey, - decoder keys.Decoder) (*Change, error) { + kch *keychain) (*Change, error) { unmarshalled := &aclpb.Change{} err := proto.Unmarshal(rawChange.Payload, unmarshalled) if err != nil { return nil, err } - identityKey, exists := identityKeys[unmarshalled.Identity] - if !exists { - key, err := decoder.DecodeFromString(unmarshalled.Identity) - if err != nil { - return nil, err - } - identityKey = key.(signingkey.PubKey) - identityKeys[unmarshalled.Identity] = identityKey + identityKey, err := kch.getOrAdd(unmarshalled.Identity) + if err != nil { + return nil, err } + res, err := identityKey.Verify(rawChange.Payload, rawChange.Signature) if err != nil { return nil, err diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index 4aa1b061..91bbe925 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -3,13 +3,10 @@ package tree import ( "context" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "github.com/gogo/protobuf/proto" "go.uber.org/zap" @@ -30,7 +27,6 @@ type RWLocker interface { var ErrHasInvalidChanges = errors.New("the change is invalid") var ErrNoCommonSnapshot = errors.New("trees doesn't have a common snapshot") -var ErrTreeWithoutIdentity = errors.New("acl tree is created without identity") type AddResultSummary int @@ -51,13 +47,12 @@ type AddResult struct { type DocTree interface { RWLocker CommonTree - AddContent(ctx context.Context, aclList list.ACLList, content proto.Marshaler, isSnapshot bool) (*aclpb.RawChange, error) + AddContent(ctx context.Context, aclList list.ACLList, content SignableChangeContent) (*aclpb.RawChange, error) AddRawChanges(ctx context.Context, aclList list.ACLList, changes ...*aclpb.RawChange) (AddResult, error) } type docTree struct { treeStorage storage.TreeStorage - accountData *account.AccountData updateListener TreeUpdateListener id string @@ -66,45 +61,31 @@ type docTree struct { treeBuilder *treeBuilder validator DocTreeValidator + kch *keychain + // buffers difSnapshotBuf []*aclpb.RawChange tmpChangesBuf []*Change + newSnapshots []*Change notSeenIdxBuf []int - identityKeys map[string]signingkey.PubKey - sync.RWMutex } -func BuildDocTreeWithIdentity(t storage.TreeStorage, acc *account.AccountData, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { - return buildDocTreeWithAccount(t, acc, acc.Decoder, listener, aclList) -} - -func BuildDocTree(t storage.TreeStorage, decoder keys.Decoder, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { - return buildDocTreeWithAccount(t, nil, decoder, listener, aclList) -} - -func buildDocTreeWithAccount( - t storage.TreeStorage, - acc *account.AccountData, - decoder keys.Decoder, - listener TreeUpdateListener, - aclList list.ACLList) (DocTree, error) { - - treeBuilder := newTreeBuilder(t, decoder) +func BuildDocTree(t storage.TreeStorage, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { + treeBuilder := newTreeBuilder(t) validator := newTreeValidator() docTree := &docTree{ treeStorage: t, tree: nil, - accountData: acc, treeBuilder: treeBuilder, validator: validator, updateListener: listener, tmpChangesBuf: make([]*Change, 0, 10), difSnapshotBuf: make([]*aclpb.RawChange, 0, 10), notSeenIdxBuf: make([]int, 0, 10), - identityKeys: make(map[string]signingkey.PubKey), + kch: newKeychain(), } err := docTree.rebuildFromStorage(aclList, nil) if err != nil { @@ -143,13 +124,17 @@ func buildDocTreeWithAccount( } func (d *docTree) rebuildFromStorage(aclList list.ACLList, newChanges []*Change) (err error) { - d.treeBuilder.Init(d.identityKeys) + d.treeBuilder.Init(d.kch) - d.tree, err = d.treeBuilder.Build(false, newChanges) + d.tree, err = d.treeBuilder.Build(newChanges) if err != nil { return err } + // during building the tree we may have marked some changes as possible roots, + // but obviously they are not roots, because of the way how we construct the tree + d.tree.clearPossibleRoots() + return d.validator.ValidateTree(d.tree, aclList) } @@ -165,152 +150,159 @@ func (d *docTree) Storage() storage.TreeStorage { return d.treeStorage } -func (d *docTree) AddContent(ctx context.Context, aclList list.ACLList, content proto.Marshaler, isSnapshot bool) (*aclpb.RawChange, error) { - if d.accountData == nil { - return nil, ErrTreeWithoutIdentity - } - +func (d *docTree) AddContent(ctx context.Context, aclList list.ACLList, content SignableChangeContent) (rawChange *aclpb.RawChange, err error) { defer func() { - // TODO: should this be called in a separate goroutine to prevent accidental cycles (tree->updater->tree) if d.updateListener != nil { d.updateListener.Update(d) } }() - state := aclList.ACLState() - change := &aclpb.Change{ + state := aclList.ACLState() // special method for own keys + aclChange := &aclpb.Change{ TreeHeadIds: d.tree.Heads(), AclHeadId: aclList.Head().Id, SnapshotBaseId: d.tree.RootId(), CurrentReadKeyHash: state.CurrentReadKeyHash(), Timestamp: int64(time.Now().Nanosecond()), - Identity: d.accountData.Identity, - IsSnapshot: isSnapshot, + Identity: content.Identity, + IsSnapshot: content.IsSnapshot, } - marshalledData, err := content.Marshal() + marshalledData, err := content.Proto.Marshal() if err != nil { return nil, err } - encrypted, err := state.UserReadKeys()[state.CurrentReadKeyHash()].Encrypt(marshalledData) - if err != nil { - return nil, err - } - change.ChangesData = encrypted - fullMarshalledChange, err := proto.Marshal(change) + readKey, err := state.CurrentReadKey() if err != nil { return nil, err } - signature, err := d.accountData.SignKey.Sign(fullMarshalledChange) + + encrypted, err := readKey.Encrypt(marshalledData) if err != nil { return nil, err } + aclChange.ChangesData = encrypted + + fullMarshalledChange, err := proto.Marshal(aclChange) + if err != nil { + return nil, err + } + + signature, err := content.Key.Sign(fullMarshalledChange) + if err != nil { + return nil, err + } + id, err := cid.NewCIDFromBytes(fullMarshalledChange) if err != nil { return nil, err } - ch := NewChange(id, change) - ch.ParsedModel = content - ch.Sign = signature - if isSnapshot { + docChange := NewChange(id, aclChange) + docChange.ParsedModel = content + docChange.Sign = signature + + if content.IsSnapshot { // clearing tree, because we already fixed everything in the last snapshot d.tree = &Tree{} } - err = d.tree.AddMergedHead(ch) + err = d.tree.AddMergedHead(docChange) if err != nil { - panic("error in adding head") + panic(err) } - rawCh := &aclpb.RawChange{ + rawChange = &aclpb.RawChange{ Payload: fullMarshalledChange, - Signature: ch.Signature(), - Id: ch.Id, + Signature: docChange.Signature(), + Id: docChange.Id, } - err = d.treeStorage.AddRawChange(rawCh) + err = d.treeStorage.AddRawChange(rawChange) if err != nil { - return nil, err + return } - err = d.treeStorage.SetHeads([]string{ch.Id}) - if err != nil { - return nil, err - } - return rawCh, nil + err = d.treeStorage.SetHeads([]string{docChange.Id}) + return } func (d *docTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawChanges ...*aclpb.RawChange) (addResult AddResult, err error) { var mode Mode + mode, addResult, err = d.addRawChanges(ctx, aclList, rawChanges...) + if err != nil { + return + } + // reducing tree if we have new roots + d.tree.reduceTree() + + // adding to database all the added changes only after they are good + for _, ch := range addResult.Added { + err = d.treeStorage.AddRawChange(ch) + if err != nil { + return + } + } + + // setting heads + err = d.treeStorage.SetHeads(d.tree.Heads()) + if err != nil { + return + } + + if d.updateListener == nil { + return + } + + switch mode { + case Append: + d.updateListener.Update(d) + case Rebuild: + d.updateListener.Rebuild(d) + default: + break + } + return +} + +func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawChanges ...*aclpb.RawChange) (mode Mode, addResult AddResult, err error) { // resetting buffers d.tmpChangesBuf = d.tmpChangesBuf[:0] d.notSeenIdxBuf = d.notSeenIdxBuf[:0] d.difSnapshotBuf = d.difSnapshotBuf[:0] + d.newSnapshots = d.newSnapshots[:0] prevHeads := d.tree.Heads() + // TODO: if we can use new snapshot -> update tree, check if some snapshot, dfsPrev? // filtering changes, verifying and unmarshalling them for idx, ch := range rawChanges { if d.HasChange(ch.Id) { continue } - // if we already added the change to invalid ones - if _, exists := d.tree.invalidChanges[ch.Id]; exists { - return AddResult{}, ErrHasInvalidChanges - } var change *Change - change, err = NewFromVerifiedRawChange(ch, d.identityKeys, d.treeBuilder.signingPubKeyDecoder) + change, err = NewVerifiedChangeFromRaw(ch, d.kch) if err != nil { - return AddResult{}, err + return } + if change.IsSnapshot { + d.newSnapshots = append(d.newSnapshots, change) + } d.tmpChangesBuf = append(d.tmpChangesBuf, change) d.notSeenIdxBuf = append(d.notSeenIdxBuf, idx) } // if no new changes, then returning if len(d.notSeenIdxBuf) == 0 { - return AddResult{ + addResult = AddResult{ OldHeads: prevHeads, Heads: prevHeads, Summary: AddResultSummaryNothing, - }, nil + } + return } - defer func() { - if err != nil { - return - } - - // adding to database all the added changes only after they are good - for _, ch := range addResult.Added { - err = d.treeStorage.AddRawChange(ch) - if err != nil { - return - } - } - - // setting heads - err = d.treeStorage.SetHeads(d.tree.Heads()) - if err != nil { - return - } - - if d.updateListener == nil { - return - } - - switch mode { - case Append: - d.updateListener.Update(d) - case Rebuild: - d.updateListener.Rebuild(d) - default: - break - } - }() - // returns changes that we added to the tree getAddedChanges := func() []*aclpb.RawChange { var added []*aclpb.RawChange @@ -333,13 +325,28 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawCh } } + // checks if we need to go to database + isOldSnapshot := func(ch *Change) bool { + if ch.SnapshotId == d.tree.RootId() { + return false + } + for _, sn := range d.newSnapshots { + // if change refers to newly received snapshot + if ch.SnapshotId == sn.Id { + return false + } + } + return true + } + // checking if we have some changes with different snapshot and then rebuilding for _, ch := range d.tmpChangesBuf { - if ch.SnapshotId != d.tree.RootId() && ch.SnapshotId != "" { + if isOldSnapshot(ch) { err = d.rebuildFromStorage(aclList, d.tmpChangesBuf) if err != nil { - rollback() - return AddResult{}, err + // rebuilding without new changes + d.rebuildFromStorage(aclList, nil) + return } addResult = AddResult{ @@ -348,7 +355,6 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawCh Added: getAddedChanges(), Summary: AddResultSummaryRebuild, } - err = nil return } } @@ -362,7 +368,6 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawCh Heads: prevHeads, Summary: AddResultSummaryNothing, } - err = nil return default: @@ -371,7 +376,8 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawCh err = d.validator.ValidateTree(d.tree, aclList) if err != nil { rollback() - return AddResult{}, ErrHasInvalidChanges + err = ErrHasInvalidChanges + return } addResult = AddResult{ @@ -380,7 +386,6 @@ func (d *docTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawCh Added: getAddedChanges(), Summary: AddResultSummaryAppend, } - err = nil } return } @@ -429,14 +434,11 @@ func (d *docTree) SnapshotPath() []string { } func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { - // TODO: think about when the clients will have their full acl tree and thus full snapshots - // but no changes after some of the snapshots - var ( isNewDocument = len(theirPath) == 0 ourPath = d.SnapshotPath() // by default returning everything we have - commonSnapshot = ourPath[len(ourPath)-1] // TODO: root snapshot, probably it is better to have a specific method in treestorage + commonSnapshot = ourPath[len(ourPath)-1] err error ) @@ -447,16 +449,55 @@ func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh return nil, err } } - // TODO: if the snapshot is in the tree we probably can skip going to the DB + + log.With( + zap.Strings("heads", d.tree.Heads()), + zap.String("breakpoint", commonSnapshot), + zap.String("id", d.id)). + Debug("getting all changes from common snapshot") + + if commonSnapshot == d.tree.RootId() { + return d.getChangesFromTree(isNewDocument) + } else { + return d.getChangesFromDB(commonSnapshot, isNewDocument) + } +} + +func (d *docTree) getChangesFromTree(isNewDocument bool) (marshalledChanges []*aclpb.RawChange, err error) { + if !isNewDocument { + // ignoring root change + d.tree.Root().visited = true + } + d.tree.dfsPrev(d.tree.HeadsChanges(), func(ch *Change) bool { + var marshalled []byte + marshalled, err = ch.Content.Marshal() + if err != nil { + return false + } + raw := &aclpb.RawChange{ + Payload: marshalled, + Signature: ch.Signature(), + Id: ch.Id, + } + marshalledChanges = append(marshalledChanges, raw) + return true + }, func(changes []*Change) {}) + + if err != nil { + return nil, err + } + return +} + +func (d *docTree) getChangesFromDB(commonSnapshot string, isNewDocument bool) (marshalledChanges []*aclpb.RawChange, err error) { var rawChanges []*aclpb.RawChange - // using custom load function to skip verification step and save raw changes load := func(id string) (*Change, error) { raw, err := d.treeStorage.GetRawChange(context.Background(), id) if err != nil { return nil, err } - ch, err := NewFromRawChange(raw) + ch, err := NewChangeFromRaw(raw) if err != nil { return nil, err } @@ -464,16 +505,12 @@ func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh rawChanges = append(rawChanges, raw) return ch, nil } - // we presume that we have everything after the common snapshot, though this may not be the case in case of clients and only ACL tree changes - log.With( - zap.Strings("heads", d.tree.Heads()), - zap.String("breakpoint", commonSnapshot), - zap.String("id", d.id)). - Debug("getting all changes from common snapshot") + _, err = d.treeBuilder.dfs(d.tree.Heads(), commonSnapshot, load) if err != nil { return nil, err } + if isNewDocument { // adding snapshot to raw changes _, err = load(commonSnapshot) @@ -481,10 +518,6 @@ func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh return nil, err } } - log.With( - zap.Int("len(changes)", len(rawChanges)), - zap.String("id", d.id)). - Debug("returning all changes after common snapshot") return rawChanges, nil } @@ -492,31 +525,3 @@ func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh func (d *docTree) DebugDump() (string, error) { return d.tree.Graph(NoOpDescriptionParser) } - -func commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) { - var i int - var j int - log.With(zap.Strings("our path", ourPath), zap.Strings("their path", theirPath)). - Debug("finding common snapshot for two paths") -OuterLoop: - // find starting point from the right - for i = len(ourPath) - 1; i >= 0; i-- { - for j = len(theirPath) - 1; j >= 0; j-- { - // most likely there would be only one comparison, because mostly the snapshot path will start from the root for nodes - if ourPath[i] == theirPath[j] { - break OuterLoop - } - } - } - if i < 0 || j < 0 { - return "", ErrNoCommonSnapshot - } - // find last common element of the sequence moving from right to left - for i >= 0 && j >= 0 { - if ourPath[i] == theirPath[j] { - i-- - j-- - } - } - return ourPath[i+1], nil -} diff --git a/pkg/acl/tree/keychain.go b/pkg/acl/tree/keychain.go new file mode 100644 index 00000000..2e6eca83 --- /dev/null +++ b/pkg/acl/tree/keychain.go @@ -0,0 +1,30 @@ +package tree + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" +) + +type keychain struct { + decoder keys.Decoder + keys map[string]signingkey.PubKey +} + +func newKeychain() *keychain { + return &keychain{ + decoder: signingkey.NewEDPubKeyDecoder(), + } +} + +func (k *keychain) getOrAdd(identity string) (signingkey.PubKey, error) { + if key, exists := k.keys[identity]; exists { + return key, nil + } + res, err := k.decoder.DecodeFromString(identity) + if err != nil { + return nil, err + } + + k.keys[identity] = res.(signingkey.PubKey) + return res.(signingkey.PubKey), nil +} diff --git a/pkg/acl/tree/signablecontent.go b/pkg/acl/tree/signablecontent.go new file mode 100644 index 00000000..f97ed44a --- /dev/null +++ b/pkg/acl/tree/signablecontent.go @@ -0,0 +1,13 @@ +package tree + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/gogo/protobuf/proto" +) + +type SignableChangeContent struct { + Proto proto.Marshaler + Key signingkey.PrivKey + Identity string + IsSnapshot bool +} diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go index aa36d667..e251d911 100644 --- a/pkg/acl/tree/tree.go +++ b/pkg/acl/tree/tree.go @@ -270,9 +270,16 @@ func (t *Tree) after(id1, id2 string) (found bool) { return } -func (t *Tree) dfsPrev(stack []*Change, visit func(ch *Change), afterVisit func([]*Change)) { +func (t *Tree) dfsPrev(stack []*Change, visit func(ch *Change) (isContinue bool), afterVisit func([]*Change)) { t.visitedBuf = t.visitedBuf[:0] + defer func() { + afterVisit(t.visitedBuf) + for _, ch := range t.visitedBuf { + ch.visited = false + } + }() + for len(stack) > 0 { ch := stack[len(stack)-1] stack = stack[:len(stack)-1] @@ -289,11 +296,9 @@ func (t *Tree) dfsPrev(stack []*Change, visit func(ch *Change), afterVisit func( stack = append(stack, prevCh) } } - visit(ch) - } - afterVisit(t.visitedBuf) - for _, ch := range t.visitedBuf { - ch.visited = false + if !visit(ch) { + return + } } } @@ -373,6 +378,14 @@ func (t *Tree) Heads() []string { return t.headIds } +func (t *Tree) HeadsChanges() []*Change { + var heads []*Change + for _, head := range t.headIds { + heads = append(heads, t.attached[head]) + } + return heads +} + func (t *Tree) String() string { var buf = bytes.NewBuffer(nil) t.Iterate(t.RootId(), func(c *Change) (isContinue bool) { diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index 11e95955..af229cd5 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -19,112 +19,55 @@ var ( ) type treeBuilder struct { - cache map[string]*Change - identityKeys map[string]signingkey.PubKey - signingPubKeyDecoder keys.Decoder - tree *Tree - treeStorage storage.TreeStorage + cache map[string]*Change + kch *keychain + tree *Tree + treeStorage storage.TreeStorage + + // buffers + idStack []string + loadBuffer []*Change } -func newTreeBuilder(t storage.TreeStorage, decoder keys.Decoder) *treeBuilder { +func newTreeBuilder(t storage.TreeStorage) *treeBuilder { return &treeBuilder{ - signingPubKeyDecoder: decoder, - treeStorage: t, + treeStorage: t, } } -func (tb *treeBuilder) Init(identityKeys map[string]signingkey.PubKey) { +func (tb *treeBuilder) Init(kch *keychain) { tb.cache = make(map[string]*Change) - tb.identityKeys = identityKeys + tb.kch = kch tb.tree = &Tree{} } -func (tb *treeBuilder) Build(fromStart bool, newChanges []*Change) (*Tree, error) { - var headsAndOrphans []string +func (tb *treeBuilder) Build(newChanges []*Change) (*Tree, error) { + var headsAndNewChanges []string heads, err := tb.treeStorage.Heads() if err != nil { return nil, err } - headsAndOrphans = append(headsAndOrphans, heads...) + headsAndNewChanges = append(headsAndNewChanges, heads...) tb.cache = make(map[string]*Change) for _, ch := range newChanges { - headsAndOrphans = append(headsAndOrphans, ch.Id) + headsAndNewChanges = append(headsAndNewChanges, ch.Id) tb.cache[ch.Id] = ch } log.With(zap.Strings("heads", heads)).Debug("building tree") - if fromStart { - if err := tb.buildTreeFromStart(headsAndOrphans); err != nil { - return nil, fmt.Errorf("buildTree error: %v", err) - } - } else { - breakpoint, err := tb.findBreakpoint(headsAndOrphans) - if err != nil { - return nil, fmt.Errorf("findBreakpoint error: %v", err) - } + breakpoint, err := tb.findBreakpoint(headsAndNewChanges) + if err != nil { + return nil, fmt.Errorf("findBreakpoint error: %v", err) + } - if err = tb.buildTree(headsAndOrphans, breakpoint); err != nil { - return nil, fmt.Errorf("buildTree error: %v", err) - } + if err = tb.buildTree(headsAndNewChanges, breakpoint); err != nil { + return nil, fmt.Errorf("buildTree error: %v", err) } return tb.tree, nil } -func (tb *treeBuilder) buildTreeFromStart(heads []string) (err error) { - changes, root, err := tb.dfsFromStart(heads) - if err != nil { - return err - } - - tb.tree.AddFast(root) - tb.tree.AddFast(changes...) - return -} - -func (tb *treeBuilder) dfsFromStart(heads []string) (buf []*Change, root *Change, err error) { - var possibleRoots []*Change - stack := make([]string, len(heads), len(heads)*2) - copy(stack, heads) - - buf = make([]*Change, 0, len(stack)*2) - uniqMap := make(map[string]struct{}) - for len(stack) > 0 { - id := stack[len(stack)-1] - stack = stack[:len(stack)-1] - if _, exists := uniqMap[id]; exists { - continue - } - - ch, err := tb.loadChange(id) - if err != nil { - continue - } - - uniqMap[id] = struct{}{} - buf = append(buf, ch) - - for _, prev := range ch.PreviousIds { - stack = append(stack, prev) - } - if len(ch.PreviousIds) == 0 { - possibleRoots = append(possibleRoots, ch) - } - } - header, err := tb.treeStorage.Header() - if err != nil { - return nil, nil, err - } - for _, r := range possibleRoots { - if r.Id == header.FirstId { - return buf, r, nil - } - } - - return nil, nil, fmt.Errorf("could not find root change") -} - func (tb *treeBuilder) buildTree(heads []string, breakpoint string) (err error) { ch, err := tb.loadChange(breakpoint) if err != nil { @@ -141,11 +84,17 @@ func (tb *treeBuilder) dfs( heads []string, breakpoint string, load func(string) (*Change, error)) (buf []*Change, err error) { - stack := make([]string, len(heads), len(heads)*2) + tb.idStack = tb.idStack[:0] + tb.loadBuffer = tb.loadBuffer[:0] + buf = tb.loadBuffer + + var ( + stack = tb.idStack + uniqMap = map[string]struct{}{breakpoint: {}} + ) + copy(stack, heads) - buf = make([]*Change, 0, len(stack)*2) - uniqMap := map[string]struct{}{breakpoint: {}} for len(stack) > 0 { id := stack[len(stack)-1] stack = stack[:len(stack)-1] @@ -162,6 +111,9 @@ func (tb *treeBuilder) dfs( buf = append(buf, ch) for _, prev := range ch.PreviousIds { + if _, exists := uniqMap[id]; exists { + continue + } stack = append(stack, prev) } } @@ -173,7 +125,6 @@ func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { return ch, nil } - // TODO: Add virtual changes logic ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) defer cancel() @@ -182,8 +133,7 @@ func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { return nil, err } - // TODO: maybe we can use unverified changes here, because we shouldn't put bad changes in the DB in the first place - ch, err = NewFromVerifiedRawChange(change, tb.identityKeys, tb.signingPubKeyDecoder) + ch, err = NewVerifiedChangeFromRaw(change, tb.identityKeys, tb.signingPubKeyDecoder) if err != nil { return nil, err } @@ -302,11 +252,9 @@ func (tb *treeBuilder) findCommonForTwoSnapshots(s1, s2 string) (s string, err e } isEmptySnapshot := func(ch *Change) bool { - // TODO: add more sophisticated checks in Change for snapshots return !ch.IsSnapshot } - // TODO: can we even have empty snapshots? // prefer not empty snapshot if isEmptySnapshot(ch1) && !isEmptySnapshot(ch2) { log.Warnf("changes build Tree: prefer %s(not empty) over %s(empty)", s2, s1) @@ -316,7 +264,6 @@ func (tb *treeBuilder) findCommonForTwoSnapshots(s1, s2 string) (s string, err e return s1, nil } - // TODO: add virtual change mechanics // unexpected behavior - just return lesser id if s1 < s2 { log.Warnf("changes build Tree: prefer %s (%s<%s)", s1, s1, s2) diff --git a/pkg/acl/tree/treereduce.go b/pkg/acl/tree/treereduce.go index d1a788ac..7677f1cb 100644 --- a/pkg/acl/tree/treereduce.go +++ b/pkg/acl/tree/treereduce.go @@ -21,8 +21,9 @@ func (t *Tree) checkRoot(change *Change) (total int) { change.visited = true t.dfsPrev( stack, - func(ch *Change) { + func(ch *Change) bool { total += 1 + return true }, func(changes []*Change) { if t.root.visited { @@ -45,7 +46,9 @@ func (t *Tree) makeRootAndRemove(start *Change) { t.dfsPrev( stack, - func(ch *Change) {}, + func(ch *Change) bool { + return true + }, func(changes []*Change) { for _, ch := range changes { delete(t.unAttached, ch.Id) diff --git a/pkg/acl/tree/treestorage.go b/pkg/acl/tree/treestorage.go index a82a1ce6..af31d339 100644 --- a/pkg/acl/tree/treestorage.go +++ b/pkg/acl/tree/treestorage.go @@ -10,48 +10,6 @@ import ( "time" ) -// -//func CreateNewTreeStorageWithACL( -// acc *account.AccountData, -// build func(builder list.ACLChangeBuilder) error, -// create treestorage.CreatorFunc) (treestorage.Storage, error) { -// bld := list.newACLChangeBuilder() -// bld.Init( -// list.newACLStateWithIdentity(acc.Identity, acc.EncKey, signingkey.NewEd25519PubKeyDecoder()), -// &Tree{}, -// acc) -// err := build(bld) -// if err != nil { -// return nil, err -// } -// -// change, payload, err := bld.BuildAndApply() -// if err != nil { -// return nil, err -// } -// -// rawChange := &aclpb.RawChange{ -// Payload: payload, -// Signature: change.Signature(), -// Id: change.CID(), -// } -// header, id, err := createTreeHeaderAndId(rawChange, treepb.TreeHeader_ACLTree, "") -// if err != nil { -// return nil, err -// } -// -// thr, err := create(id, header, []*aclpb.RawChange{rawChange}) -// if err != nil { -// return nil, err -// } -// -// err = thr.SetHeads([]string{change.CID()}) -// if err != nil { -// return nil, err -// } -// return thr, nil -//} - func CreateNewTreeStorage( acc *account.AccountData, aclList list.ACLList, @@ -71,20 +29,29 @@ func CreateNewTreeStorage( if err != nil { return nil, err } - encrypted, err := state.UserReadKeys()[state.CurrentReadKeyHash()].Encrypt(marshalledData) + + readKey, err := state.CurrentReadKey() if err != nil { return nil, err } + + encrypted, err := readKey.Encrypt(marshalledData) + if err != nil { + return nil, err + } + change.ChangesData = encrypted fullMarshalledChange, err := proto.Marshal(change) if err != nil { return nil, err } + signature, err := acc.SignKey.Sign(fullMarshalledChange) if err != nil { return nil, err } + changeId, err := cid.NewCIDFromBytes(fullMarshalledChange) if err != nil { return nil, err diff --git a/pkg/acl/tree/util.go b/pkg/acl/tree/util.go new file mode 100644 index 00000000..37a08d31 --- /dev/null +++ b/pkg/acl/tree/util.go @@ -0,0 +1,27 @@ +package tree + +func commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) { + var i int + var j int +OuterLoop: + // find starting point from the right + for i = len(ourPath) - 1; i >= 0; i-- { + for j = len(theirPath) - 1; j >= 0; j-- { + // most likely there would be only one comparison, because mostly the snapshot path will start from the root for nodes + if ourPath[i] == theirPath[j] { + break OuterLoop + } + } + } + if i < 0 || j < 0 { + return "", ErrNoCommonSnapshot + } + // find last common element of the sequence moving from right to left + for i >= 0 && j >= 0 { + if ourPath[i] == theirPath[j] { + i-- + j-- + } + } + return ourPath[i+1], nil +} diff --git a/service/document/service.go b/service/document/service.go index 30350a2d..cf62124e 100644 --- a/service/document/service.go +++ b/service/document/service.go @@ -97,7 +97,13 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err defer aclTree.RUnlock() content := createAppendTextChange(text) - ch, err = docTree.AddContent(ctx, aclTree, content, false) + signable := tree.SignableChangeContent{ + Proto: content, + Key: s.account.Account().SignKey, + Identity: s.account.Account().Identity, + IsSnapshot: false, + } + ch, err = docTree.AddContent(ctx, aclTree, signable) if err != nil { return err } From 9a1dc89a992e5e73dbacaf360b2e2c067b4b2088 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 5 Sep 2022 12:35:54 +0200 Subject: [PATCH 035/219] Fixing several copy issues and other stuff in doc tree --- pkg/acl/tree/change.go | 19 ++++--- pkg/acl/tree/doctree.go | 99 ++++++++++++++++++++----------------- pkg/acl/tree/treebuilder.go | 4 +- 3 files changed, 65 insertions(+), 57 deletions(-) diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index 2e1d3dce..05413f08 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -1,6 +1,7 @@ package tree import ( + "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/gogo/protobuf/proto" @@ -8,6 +9,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" ) +var ErrIncorrectSignature = errors.New("change has incorrect signature") + type ChangeContent struct { ChangesData proto.Marshaler ACLData *aclpb.ACLChangeACLData @@ -21,8 +24,8 @@ type Change struct { Id string SnapshotId string IsSnapshot bool - DecryptedChange []byte // TODO: check if we need it - ParsedModel interface{} + DecryptedChange []byte // TODO: check if we need it + ParsedModel interface{} // TODO: check if we need it // iterator helpers visited bool @@ -57,8 +60,7 @@ func NewChangeFromRaw(rawChange *aclpb.RawChange) (*Change, error) { return nil, err } - ch := NewChange(rawChange.Id, unmarshalled) - ch.Sign = rawChange.Signature + ch := NewChange(rawChange.Id, unmarshalled, rawChange.Signature) return ch, nil } @@ -66,7 +68,7 @@ func NewVerifiedChangeFromRaw( rawChange *aclpb.RawChange, kch *keychain) (*Change, error) { unmarshalled := &aclpb.Change{} - err := proto.Unmarshal(rawChange.Payload, unmarshalled) + ch, err := NewChangeFromRaw(rawChange) if err != nil { return nil, err } @@ -81,13 +83,13 @@ func NewVerifiedChangeFromRaw( return nil, err } if !res { - return nil, fmt.Errorf("change has incorrect signature") + return nil, ErrIncorrectSignature } - return NewChange(rawChange.Id, unmarshalled), nil + return ch, nil } -func NewChange(id string, ch *aclpb.Change) *Change { +func NewChange(id string, ch *aclpb.Change, signature []byte) *Change { return &Change{ Next: nil, PreviousIds: ch.TreeHeadIds, @@ -95,6 +97,7 @@ func NewChange(id string, ch *aclpb.Change) *Change { Content: ch, SnapshotId: ch.SnapshotBaseId, IsSnapshot: ch.IsSnapshot, + Sign: signature, } } diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/doctree.go index 91bbe925..57f96e4d 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/doctree.go @@ -25,8 +25,10 @@ type RWLocker interface { RUnlock() } -var ErrHasInvalidChanges = errors.New("the change is invalid") -var ErrNoCommonSnapshot = errors.New("trees doesn't have a common snapshot") +var ( + ErrHasInvalidChanges = errors.New("the change is invalid") + ErrNoCommonSnapshot = errors.New("trees doesn't have a common snapshot") +) type AddResultSummary int @@ -40,7 +42,7 @@ type AddResult struct { OldHeads []string Heads []string Added []*aclpb.RawChange - // TODO: add summary for changes + Summary AddResultSummary } @@ -64,10 +66,12 @@ type docTree struct { kch *keychain // buffers - difSnapshotBuf []*aclpb.RawChange - tmpChangesBuf []*Change - newSnapshots []*Change - notSeenIdxBuf []int + difSnapshotBuf []*aclpb.RawChange + tmpChangesBuf []*Change + newSnapshotsBuf []*Change + notSeenIdxBuf []int + + snapshotPath []string sync.RWMutex } @@ -128,7 +132,7 @@ func (d *docTree) rebuildFromStorage(aclList list.ACLList, newChanges []*Change) d.tree, err = d.treeBuilder.Build(newChanges) if err != nil { - return err + return } // during building the tree we may have marked some changes as possible roots, @@ -198,9 +202,8 @@ func (d *docTree) AddContent(ctx context.Context, aclList list.ACLList, content return nil, err } - docChange := NewChange(id, aclChange) + docChange := NewChange(id, aclChange, signature) docChange.ParsedModel = content - docChange.Sign = signature if content.IsSnapshot { // clearing tree, because we already fixed everything in the last snapshot @@ -269,10 +272,11 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh d.tmpChangesBuf = d.tmpChangesBuf[:0] d.notSeenIdxBuf = d.notSeenIdxBuf[:0] d.difSnapshotBuf = d.difSnapshotBuf[:0] - d.newSnapshots = d.newSnapshots[:0] + d.newSnapshotsBuf = d.newSnapshotsBuf[:0] - prevHeads := d.tree.Heads() - // TODO: if we can use new snapshot -> update tree, check if some snapshot, dfsPrev? + // this will be returned to client so we shouldn't use buffer here + prevHeadsCopy := make([]string, 0, len(d.tree.Heads())) + copy(prevHeadsCopy, d.tree.Heads()) // filtering changes, verifying and unmarshalling them for idx, ch := range rawChanges { @@ -287,7 +291,7 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh } if change.IsSnapshot { - d.newSnapshots = append(d.newSnapshots, change) + d.newSnapshotsBuf = append(d.newSnapshotsBuf, change) } d.tmpChangesBuf = append(d.tmpChangesBuf, change) d.notSeenIdxBuf = append(d.notSeenIdxBuf, idx) @@ -296,13 +300,19 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh // if no new changes, then returning if len(d.notSeenIdxBuf) == 0 { addResult = AddResult{ - OldHeads: prevHeads, - Heads: prevHeads, + OldHeads: prevHeadsCopy, + Heads: prevHeadsCopy, Summary: AddResultSummaryNothing, } return } + headsCopy := func() []string { + newHeads := make([]string, 0, len(d.tree.Heads())) + copy(newHeads, d.tree.Heads()) + return newHeads + } + // returns changes that we added to the tree getAddedChanges := func() []*aclpb.RawChange { var added []*aclpb.RawChange @@ -330,7 +340,7 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh if ch.SnapshotId == d.tree.RootId() { return false } - for _, sn := range d.newSnapshots { + for _, sn := range d.newSnapshotsBuf { // if change refers to newly received snapshot if ch.SnapshotId == sn.Id { return false @@ -350,8 +360,8 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh } addResult = AddResult{ - OldHeads: prevHeads, - Heads: d.tree.Heads(), + OldHeads: prevHeadsCopy, + Heads: headsCopy(), Added: getAddedChanges(), Summary: AddResultSummaryRebuild, } @@ -364,8 +374,8 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh switch mode { case Nothing: addResult = AddResult{ - OldHeads: prevHeads, - Heads: prevHeads, + OldHeads: prevHeadsCopy, + Heads: prevHeadsCopy, Summary: AddResultSummaryNothing, } return @@ -381,8 +391,8 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh } addResult = AddResult{ - OldHeads: prevHeads, - Heads: d.tree.Heads(), + OldHeads: prevHeadsCopy, + Heads: headsCopy(), Added: getAddedChanges(), Summary: AddResultSummaryAppend, } @@ -417,7 +427,9 @@ func (d *docTree) Close() error { } func (d *docTree) SnapshotPath() []string { - // TODO: think about caching this + if d.snapshotPathIsActual() { + return d.snapshotPath + } var path []string // TODO: think that the user may have not all of the snapshots locally @@ -430,20 +442,22 @@ func (d *docTree) SnapshotPath() []string { path = append(path, currentSnapshotId) currentSnapshotId = sn.SnapshotId } + d.snapshotPath = path + return path } func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { var ( - isNewDocument = len(theirPath) == 0 - ourPath = d.SnapshotPath() + needFullDocument = len(theirPath) == 0 + ourPath = d.SnapshotPath() // by default returning everything we have commonSnapshot = ourPath[len(ourPath)-1] err error ) // if this is non-empty request - if !isNewDocument { + if !needFullDocument { commonSnapshot, err = commonSnapshotForTwoPaths(ourPath, theirPath) if err != nil { return nil, err @@ -457,17 +471,13 @@ func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh Debug("getting all changes from common snapshot") if commonSnapshot == d.tree.RootId() { - return d.getChangesFromTree(isNewDocument) + return d.getChangesFromTree() } else { - return d.getChangesFromDB(commonSnapshot, isNewDocument) + return d.getChangesFromDB(commonSnapshot, needFullDocument) } } -func (d *docTree) getChangesFromTree(isNewDocument bool) (marshalledChanges []*aclpb.RawChange, err error) { - if !isNewDocument { - // ignoring root change - d.tree.Root().visited = true - } +func (d *docTree) getChangesFromTree() (rawChanges []*aclpb.RawChange, err error) { d.tree.dfsPrev(d.tree.HeadsChanges(), func(ch *Change) bool { var marshalled []byte marshalled, err = ch.Content.Marshal() @@ -479,18 +489,14 @@ func (d *docTree) getChangesFromTree(isNewDocument bool) (marshalledChanges []*a Signature: ch.Signature(), Id: ch.Id, } - marshalledChanges = append(marshalledChanges, raw) + rawChanges = append(rawChanges, raw) return true }, func(changes []*Change) {}) - if err != nil { - return nil, err - } return } -func (d *docTree) getChangesFromDB(commonSnapshot string, isNewDocument bool) (marshalledChanges []*aclpb.RawChange, err error) { - var rawChanges []*aclpb.RawChange +func (d *docTree) getChangesFromDB(commonSnapshot string, needStartSnapshot bool) (rawChanges []*aclpb.RawChange, err error) { load := func(id string) (*Change, error) { raw, err := d.treeStorage.GetRawChange(context.Background(), id) if err != nil { @@ -508,18 +514,19 @@ func (d *docTree) getChangesFromDB(commonSnapshot string, isNewDocument bool) (m _, err = d.treeBuilder.dfs(d.tree.Heads(), commonSnapshot, load) if err != nil { - return nil, err + return } - if isNewDocument { + if needStartSnapshot { // adding snapshot to raw changes _, err = load(commonSnapshot) - if err != nil { - return nil, err - } } - return rawChanges, nil + return +} + +func (d *docTree) snapshotPathIsActual() bool { + return len(d.snapshotPath) != 0 && d.snapshotPath[len(d.snapshotPath)-1] == d.tree.RootId() } func (d *docTree) DebugDump() (string, error) { diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index af229cd5..b5b2dd9c 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -6,8 +6,6 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "go.uber.org/zap" "time" @@ -133,7 +131,7 @@ func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { return nil, err } - ch, err = NewVerifiedChangeFromRaw(change, tb.identityKeys, tb.signingPubKeyDecoder) + ch, err = NewVerifiedChangeFromRaw(change, tb.kch) if err != nil { return nil, err } From b8e3ec8b7b77c0b5efb00a1f5a511325fb789b31 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 5 Sep 2022 13:08:49 +0200 Subject: [PATCH 036/219] Rename to object tree --- pkg/acl/tree/change.go | 2 +- pkg/acl/tree/commontree.go | 21 -- pkg/acl/tree/{doctree.go => objecttree.go} | 242 ++++++++++-------- pkg/acl/tree/treebuilder.go | 2 +- service/api/service.go | 2 +- service/document/service.go | 2 +- service/sync/requesthandler/requesthandler.go | 10 +- service/treecache/service.go | 2 +- 8 files changed, 140 insertions(+), 143 deletions(-) delete mode 100644 pkg/acl/tree/commontree.go rename pkg/acl/tree/{doctree.go => objecttree.go} (57%) diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index 05413f08..8fc3b1af 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -64,7 +64,7 @@ func NewChangeFromRaw(rawChange *aclpb.RawChange) (*Change, error) { return ch, nil } -func NewVerifiedChangeFromRaw( +func newVerifiedChangeFromRaw( rawChange *aclpb.RawChange, kch *keychain) (*Change, error) { unmarshalled := &aclpb.Change{} diff --git a/pkg/acl/tree/commontree.go b/pkg/acl/tree/commontree.go deleted file mode 100644 index 50a9b0f6..00000000 --- a/pkg/acl/tree/commontree.go +++ /dev/null @@ -1,21 +0,0 @@ -package tree - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" -) - -type CommonTree interface { - ID() string - Header() *aclpb.Header - Heads() []string - Root() *Change - Iterate(func(change *Change) bool) - IterateFrom(string, func(change *Change) bool) - HasChange(string) bool - SnapshotPath() []string - ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) - Storage() storage.TreeStorage - DebugDump() (string, error) - Close() error -} diff --git a/pkg/acl/tree/doctree.go b/pkg/acl/tree/objecttree.go similarity index 57% rename from pkg/acl/tree/doctree.go rename to pkg/acl/tree/objecttree.go index 57f96e4d..474dd1ff 100644 --- a/pkg/acl/tree/doctree.go +++ b/pkg/acl/tree/objecttree.go @@ -14,9 +14,9 @@ import ( "time" ) -type TreeUpdateListener interface { - Update(tree DocTree) - Rebuild(tree DocTree) +type ObjectTreeUpdateListener interface { + Update(tree ObjectTree) + Rebuild(tree ObjectTree) } type RWLocker interface { @@ -46,16 +46,33 @@ type AddResult struct { Summary AddResultSummary } -type DocTree interface { +type ObjectTree interface { RWLocker - CommonTree + + ID() string + Header() *aclpb.Header + Heads() []string + Root() *Change + HasChange(string) bool + + Iterate(func(change *Change) bool) + IterateFrom(string, func(change *Change) bool) + + SnapshotPath() []string + ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) + + Storage() storage.TreeStorage + DebugDump() (string, error) + AddContent(ctx context.Context, aclList list.ACLList, content SignableChangeContent) (*aclpb.RawChange, error) AddRawChanges(ctx context.Context, aclList list.ACLList, changes ...*aclpb.RawChange) (AddResult, error) + + Close() error } -type docTree struct { +type objectTree struct { treeStorage storage.TreeStorage - updateListener TreeUpdateListener + updateListener ObjectTreeUpdateListener id string header *aclpb.Header @@ -76,12 +93,12 @@ type docTree struct { sync.RWMutex } -func BuildDocTree(t storage.TreeStorage, listener TreeUpdateListener, aclList list.ACLList) (DocTree, error) { - treeBuilder := newTreeBuilder(t) +func BuildObjectTree(treeStorage storage.TreeStorage, listener ObjectTreeUpdateListener, aclList list.ACLList) (ObjectTree, error) { + treeBuilder := newTreeBuilder(treeStorage) validator := newTreeValidator() - docTree := &docTree{ - treeStorage: t, + objTree := &objectTree{ + treeStorage: treeStorage, tree: nil, treeBuilder: treeBuilder, validator: validator, @@ -91,80 +108,81 @@ func BuildDocTree(t storage.TreeStorage, listener TreeUpdateListener, aclList li notSeenIdxBuf: make([]int, 0, 10), kch: newKeychain(), } - err := docTree.rebuildFromStorage(aclList, nil) + err := objTree.rebuildFromStorage(aclList, nil) if err != nil { return nil, err } - storageHeads, err := t.Heads() + storageHeads, err := treeStorage.Heads() if err != nil { return nil, err } + // comparing rebuilt heads with heads in storage // in theory it can happen that we didn't set heads because the process has crashed // therefore we want to set them later - if !slice.UnsortedEquals(storageHeads, docTree.tree.Heads()) { - log.With(zap.Strings("storage", storageHeads), zap.Strings("rebuilt", docTree.tree.Heads())). - Errorf("the heads in storage and tree are different") - err = t.SetHeads(docTree.tree.Heads()) + if !slice.UnsortedEquals(storageHeads, objTree.tree.Heads()) { + log.With(zap.Strings("storage", storageHeads), zap.Strings("rebuilt", objTree.tree.Heads())). + Errorf("the heads in storage and objTree are different") + err = treeStorage.SetHeads(objTree.tree.Heads()) if err != nil { return nil, err } } - docTree.id, err = t.ID() + objTree.id, err = treeStorage.ID() if err != nil { return nil, err } - docTree.header, err = t.Header() + objTree.header, err = treeStorage.Header() if err != nil { return nil, err } if listener != nil { - listener.Rebuild(docTree) + listener.Rebuild(objTree) } - return docTree, nil + return objTree, nil } -func (d *docTree) rebuildFromStorage(aclList list.ACLList, newChanges []*Change) (err error) { - d.treeBuilder.Init(d.kch) +func (ot *objectTree) rebuildFromStorage(aclList list.ACLList, newChanges []*Change) (err error) { + ot.treeBuilder.Init(ot.kch) - d.tree, err = d.treeBuilder.Build(newChanges) + ot.tree, err = ot.treeBuilder.Build(newChanges) if err != nil { return } // during building the tree we may have marked some changes as possible roots, // but obviously they are not roots, because of the way how we construct the tree - d.tree.clearPossibleRoots() + ot.tree.clearPossibleRoots() - return d.validator.ValidateTree(d.tree, aclList) + return ot.validator.ValidateTree(ot.tree, aclList) } -func (d *docTree) ID() string { - return d.id +func (ot *objectTree) ID() string { + return ot.id } -func (d *docTree) Header() *aclpb.Header { - return d.header +func (ot *objectTree) Header() *aclpb.Header { + return ot.header } -func (d *docTree) Storage() storage.TreeStorage { - return d.treeStorage +func (ot *objectTree) Storage() storage.TreeStorage { + return ot.treeStorage } -func (d *docTree) AddContent(ctx context.Context, aclList list.ACLList, content SignableChangeContent) (rawChange *aclpb.RawChange, err error) { +func (ot *objectTree) AddContent(ctx context.Context, aclList list.ACLList, content SignableChangeContent) (rawChange *aclpb.RawChange, err error) { defer func() { - if d.updateListener != nil { - d.updateListener.Update(d) + if ot.updateListener != nil { + ot.updateListener.Update(ot) } }() state := aclList.ACLState() // special method for own keys aclChange := &aclpb.Change{ - TreeHeadIds: d.tree.Heads(), + TreeHeadIds: ot.tree.Heads(), AclHeadId: aclList.Head().Id, - SnapshotBaseId: d.tree.RootId(), + SnapshotBaseId: ot.tree.RootId(), CurrentReadKeyHash: state.CurrentReadKeyHash(), Timestamp: int64(time.Now().Nanosecond()), Identity: content.Identity, @@ -207,9 +225,9 @@ func (d *docTree) AddContent(ctx context.Context, aclList list.ACLList, content if content.IsSnapshot { // clearing tree, because we already fixed everything in the last snapshot - d.tree = &Tree{} + ot.tree = &Tree{} } - err = d.tree.AddMergedHead(docChange) + err = ot.tree.AddMergedHead(docChange) if err != nil { panic(err) } @@ -219,86 +237,86 @@ func (d *docTree) AddContent(ctx context.Context, aclList list.ACLList, content Id: docChange.Id, } - err = d.treeStorage.AddRawChange(rawChange) + err = ot.treeStorage.AddRawChange(rawChange) if err != nil { return } - err = d.treeStorage.SetHeads([]string{docChange.Id}) + err = ot.treeStorage.SetHeads([]string{docChange.Id}) return } -func (d *docTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawChanges ...*aclpb.RawChange) (addResult AddResult, err error) { +func (ot *objectTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawChanges ...*aclpb.RawChange) (addResult AddResult, err error) { var mode Mode - mode, addResult, err = d.addRawChanges(ctx, aclList, rawChanges...) + mode, addResult, err = ot.addRawChanges(ctx, aclList, rawChanges...) if err != nil { return } // reducing tree if we have new roots - d.tree.reduceTree() + ot.tree.reduceTree() // adding to database all the added changes only after they are good for _, ch := range addResult.Added { - err = d.treeStorage.AddRawChange(ch) + err = ot.treeStorage.AddRawChange(ch) if err != nil { return } } // setting heads - err = d.treeStorage.SetHeads(d.tree.Heads()) + err = ot.treeStorage.SetHeads(ot.tree.Heads()) if err != nil { return } - if d.updateListener == nil { + if ot.updateListener == nil { return } switch mode { case Append: - d.updateListener.Update(d) + ot.updateListener.Update(ot) case Rebuild: - d.updateListener.Rebuild(d) + ot.updateListener.Rebuild(ot) default: break } return } -func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawChanges ...*aclpb.RawChange) (mode Mode, addResult AddResult, err error) { +func (ot *objectTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawChanges ...*aclpb.RawChange) (mode Mode, addResult AddResult, err error) { // resetting buffers - d.tmpChangesBuf = d.tmpChangesBuf[:0] - d.notSeenIdxBuf = d.notSeenIdxBuf[:0] - d.difSnapshotBuf = d.difSnapshotBuf[:0] - d.newSnapshotsBuf = d.newSnapshotsBuf[:0] + ot.tmpChangesBuf = ot.tmpChangesBuf[:0] + ot.notSeenIdxBuf = ot.notSeenIdxBuf[:0] + ot.difSnapshotBuf = ot.difSnapshotBuf[:0] + ot.newSnapshotsBuf = ot.newSnapshotsBuf[:0] // this will be returned to client so we shouldn't use buffer here - prevHeadsCopy := make([]string, 0, len(d.tree.Heads())) - copy(prevHeadsCopy, d.tree.Heads()) + prevHeadsCopy := make([]string, 0, len(ot.tree.Heads())) + copy(prevHeadsCopy, ot.tree.Heads()) // filtering changes, verifying and unmarshalling them for idx, ch := range rawChanges { - if d.HasChange(ch.Id) { + if ot.HasChange(ch.Id) { continue } var change *Change - change, err = NewVerifiedChangeFromRaw(ch, d.kch) + change, err = newVerifiedChangeFromRaw(ch, ot.kch) if err != nil { return } if change.IsSnapshot { - d.newSnapshotsBuf = append(d.newSnapshotsBuf, change) + ot.newSnapshotsBuf = append(ot.newSnapshotsBuf, change) } - d.tmpChangesBuf = append(d.tmpChangesBuf, change) - d.notSeenIdxBuf = append(d.notSeenIdxBuf, idx) + ot.tmpChangesBuf = append(ot.tmpChangesBuf, change) + ot.notSeenIdxBuf = append(ot.notSeenIdxBuf, idx) } // if no new changes, then returning - if len(d.notSeenIdxBuf) == 0 { + if len(ot.notSeenIdxBuf) == 0 { addResult = AddResult{ OldHeads: prevHeadsCopy, Heads: prevHeadsCopy, @@ -308,17 +326,17 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh } headsCopy := func() []string { - newHeads := make([]string, 0, len(d.tree.Heads())) - copy(newHeads, d.tree.Heads()) + newHeads := make([]string, 0, len(ot.tree.Heads())) + copy(newHeads, ot.tree.Heads()) return newHeads } // returns changes that we added to the tree getAddedChanges := func() []*aclpb.RawChange { var added []*aclpb.RawChange - for _, idx := range d.notSeenIdxBuf { + for _, idx := range ot.notSeenIdxBuf { rawChange := rawChanges[idx] - if _, exists := d.tree.attached[rawChange.Id]; exists { + if _, exists := ot.tree.attached[rawChange.Id]; exists { added = append(added, rawChange) } } @@ -326,21 +344,21 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh } rollback := func() { - for _, ch := range d.tmpChangesBuf { - if _, exists := d.tree.attached[ch.Id]; exists { - delete(d.tree.attached, ch.Id) - } else if _, exists := d.tree.unAttached[ch.Id]; exists { - delete(d.tree.unAttached, ch.Id) + for _, ch := range ot.tmpChangesBuf { + if _, exists := ot.tree.attached[ch.Id]; exists { + delete(ot.tree.attached, ch.Id) + } else if _, exists := ot.tree.unAttached[ch.Id]; exists { + delete(ot.tree.unAttached, ch.Id) } } } // checks if we need to go to database isOldSnapshot := func(ch *Change) bool { - if ch.SnapshotId == d.tree.RootId() { + if ch.SnapshotId == ot.tree.RootId() { return false } - for _, sn := range d.newSnapshotsBuf { + for _, sn := range ot.newSnapshotsBuf { // if change refers to newly received snapshot if ch.SnapshotId == sn.Id { return false @@ -350,12 +368,12 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh } // checking if we have some changes with different snapshot and then rebuilding - for _, ch := range d.tmpChangesBuf { + for _, ch := range ot.tmpChangesBuf { if isOldSnapshot(ch) { - err = d.rebuildFromStorage(aclList, d.tmpChangesBuf) + err = ot.rebuildFromStorage(aclList, ot.tmpChangesBuf) if err != nil { // rebuilding without new changes - d.rebuildFromStorage(aclList, nil) + ot.rebuildFromStorage(aclList, nil) return } @@ -370,7 +388,7 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh } // normal mode of operation, where we don't need to rebuild from database - mode = d.tree.Add(d.tmpChangesBuf...) + mode = ot.tree.Add(ot.tmpChangesBuf...) switch mode { case Nothing: addResult = AddResult{ @@ -383,7 +401,7 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh default: // just rebuilding the state from start without reloading everything from tree storage // as an optimization we could've started from current heads, but I didn't implement that - err = d.validator.ValidateTree(d.tree, aclList) + err = ot.validator.ValidateTree(ot.tree, aclList) if err != nil { rollback() err = ErrHasInvalidChanges @@ -400,57 +418,57 @@ func (d *docTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawCh return } -func (d *docTree) Iterate(f func(change *Change) bool) { - d.tree.Iterate(d.tree.RootId(), f) +func (ot *objectTree) Iterate(f func(change *Change) bool) { + ot.tree.Iterate(ot.tree.RootId(), f) } -func (d *docTree) IterateFrom(s string, f func(change *Change) bool) { - d.tree.Iterate(s, f) +func (ot *objectTree) IterateFrom(s string, f func(change *Change) bool) { + ot.tree.Iterate(s, f) } -func (d *docTree) HasChange(s string) bool { - _, attachedExists := d.tree.attached[s] - _, unattachedExists := d.tree.unAttached[s] +func (ot *objectTree) HasChange(s string) bool { + _, attachedExists := ot.tree.attached[s] + _, unattachedExists := ot.tree.unAttached[s] return attachedExists || unattachedExists } -func (d *docTree) Heads() []string { - return d.tree.Heads() +func (ot *objectTree) Heads() []string { + return ot.tree.Heads() } -func (d *docTree) Root() *Change { - return d.tree.Root() +func (ot *objectTree) Root() *Change { + return ot.tree.Root() } -func (d *docTree) Close() error { +func (ot *objectTree) Close() error { return nil } -func (d *docTree) SnapshotPath() []string { - if d.snapshotPathIsActual() { - return d.snapshotPath +func (ot *objectTree) SnapshotPath() []string { + if ot.snapshotPathIsActual() { + return ot.snapshotPath } var path []string // TODO: think that the user may have not all of the snapshots locally - currentSnapshotId := d.tree.RootId() + currentSnapshotId := ot.tree.RootId() for currentSnapshotId != "" { - sn, err := d.treeBuilder.loadChange(currentSnapshotId) + sn, err := ot.treeBuilder.loadChange(currentSnapshotId) if err != nil { break } path = append(path, currentSnapshotId) currentSnapshotId = sn.SnapshotId } - d.snapshotPath = path + ot.snapshotPath = path return path } -func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { +func (ot *objectTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { var ( needFullDocument = len(theirPath) == 0 - ourPath = d.SnapshotPath() + ourPath = ot.SnapshotPath() // by default returning everything we have commonSnapshot = ourPath[len(ourPath)-1] err error @@ -465,20 +483,20 @@ func (d *docTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawCh } log.With( - zap.Strings("heads", d.tree.Heads()), + zap.Strings("heads", ot.tree.Heads()), zap.String("breakpoint", commonSnapshot), - zap.String("id", d.id)). + zap.String("id", ot.id)). Debug("getting all changes from common snapshot") - if commonSnapshot == d.tree.RootId() { - return d.getChangesFromTree() + if commonSnapshot == ot.tree.RootId() { + return ot.getChangesFromTree() } else { - return d.getChangesFromDB(commonSnapshot, needFullDocument) + return ot.getChangesFromDB(commonSnapshot, needFullDocument) } } -func (d *docTree) getChangesFromTree() (rawChanges []*aclpb.RawChange, err error) { - d.tree.dfsPrev(d.tree.HeadsChanges(), func(ch *Change) bool { +func (ot *objectTree) getChangesFromTree() (rawChanges []*aclpb.RawChange, err error) { + ot.tree.dfsPrev(ot.tree.HeadsChanges(), func(ch *Change) bool { var marshalled []byte marshalled, err = ch.Content.Marshal() if err != nil { @@ -496,9 +514,9 @@ func (d *docTree) getChangesFromTree() (rawChanges []*aclpb.RawChange, err error return } -func (d *docTree) getChangesFromDB(commonSnapshot string, needStartSnapshot bool) (rawChanges []*aclpb.RawChange, err error) { +func (ot *objectTree) getChangesFromDB(commonSnapshot string, needStartSnapshot bool) (rawChanges []*aclpb.RawChange, err error) { load := func(id string) (*Change, error) { - raw, err := d.treeStorage.GetRawChange(context.Background(), id) + raw, err := ot.treeStorage.GetRawChange(context.Background(), id) if err != nil { return nil, err } @@ -512,7 +530,7 @@ func (d *docTree) getChangesFromDB(commonSnapshot string, needStartSnapshot bool return ch, nil } - _, err = d.treeBuilder.dfs(d.tree.Heads(), commonSnapshot, load) + _, err = ot.treeBuilder.dfs(ot.tree.Heads(), commonSnapshot, load) if err != nil { return } @@ -525,10 +543,10 @@ func (d *docTree) getChangesFromDB(commonSnapshot string, needStartSnapshot bool return } -func (d *docTree) snapshotPathIsActual() bool { - return len(d.snapshotPath) != 0 && d.snapshotPath[len(d.snapshotPath)-1] == d.tree.RootId() +func (ot *objectTree) snapshotPathIsActual() bool { + return len(ot.snapshotPath) != 0 && ot.snapshotPath[len(ot.snapshotPath)-1] == ot.tree.RootId() } -func (d *docTree) DebugDump() (string, error) { - return d.tree.Graph(NoOpDescriptionParser) +func (ot *objectTree) DebugDump() (string, error) { + return ot.tree.Graph(NoOpDescriptionParser) } diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index b5b2dd9c..f5af5800 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -131,7 +131,7 @@ func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { return nil, err } - ch, err = NewVerifiedChangeFromRaw(change, tb.kch) + ch, err = newVerifiedChangeFromRaw(change, tb.kch) if err != nil { return nil, err } diff --git a/service/api/service.go b/service/api/service.go index b98ca820..f1373e28 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -80,7 +80,7 @@ func (s *service) treeDump(w http.ResponseWriter, req *http.Request) { err error ) err = s.treeCache.Do(context.Background(), treeId, func(obj interface{}) error { - t := obj.(tree.CommonTree) + t := obj.(tree.ObjectTree) dump, err = t.DebugDump() if err != nil { return err diff --git a/service/document/service.go b/service/document/service.go index cf62124e..96084d48 100644 --- a/service/document/service.go +++ b/service/document/service.go @@ -84,7 +84,7 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err Debug("updating document") err = s.treeCache.Do(ctx, id, func(obj interface{}) error { - docTree, ok := obj.(tree.DocTree) + docTree, ok := obj.(tree.ObjectTree) if !ok { return fmt.Errorf("can't update acl trees with text") } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 50e35083..c7212bc9 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -88,7 +88,7 @@ func (r *requestHandler) HandleHeadUpdate( Debug("processing head update") err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { - docTree := obj.(tree.DocTree) + docTree := obj.(tree.ObjectTree) docTree.Lock() defer docTree.Unlock() @@ -160,7 +160,7 @@ func (r *requestHandler) HandleFullSyncRequest( log.Info("getting doc tree from treeCache", zap.String("treeId", treeId)) err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { - docTree := obj.(tree.DocTree) + docTree := obj.(tree.ObjectTree) docTree.Lock() defer docTree.Unlock() @@ -222,7 +222,7 @@ func (r *requestHandler) HandleFullSyncResponse( Debug("processing full sync response") err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { - docTree := obj.(tree.DocTree) + docTree := obj.(tree.ObjectTree) docTree.Lock() defer docTree.Unlock() @@ -290,7 +290,7 @@ func (r *requestHandler) HandleACLList( return err } -func (r *requestHandler) prepareFullSyncRequest(theirPath []string, t tree.CommonTree) (*syncproto.SyncFullRequest, error) { +func (r *requestHandler) prepareFullSyncRequest(theirPath []string, t tree.ObjectTree) (*syncproto.SyncFullRequest, error) { ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath) if err != nil { return nil, err @@ -306,7 +306,7 @@ func (r *requestHandler) prepareFullSyncResponse( treeId string, theirPath []string, theirChanges []*aclpb.RawChange, - t tree.CommonTree) (*syncproto.SyncFullResponse, error) { + t tree.ObjectTree) (*syncproto.SyncFullResponse, error) { // TODO: we can probably use the common snapshot calculated on the request step from previous peer ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath) if err != nil { diff --git a/service/treecache/service.go b/service/treecache/service.go index f37823f6..8b02a120 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -123,7 +123,7 @@ func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error return nil, fmt.Errorf("incorrect type") } log.Info("got header", zap.String("header", header.String())) - var docTree tree.DocTree + var docTree tree.ObjectTree // TODO: it is a question if we need to use ACLList on the first tree build, because we can think that the tree is already validated err = s.Do(ctx, header.AclListId, func(obj interface{}) error { aclTree := obj.(list.ACLList) From 94c95b44ec916fa5f86773facc3d18f3fb4f0adf Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 6 Sep 2022 18:08:24 +0200 Subject: [PATCH 037/219] Make better dependencies for object tree --- pkg/acl/tree/changebuilder.go | 119 +++++++++++++++++++++++ pkg/acl/tree/changevalidator.go | 14 +-- pkg/acl/tree/keychain.go | 1 + pkg/acl/tree/objecttree.go | 161 ++++++++++++++++---------------- pkg/acl/tree/objecttree_test.go | 21 +++++ pkg/acl/tree/tree.go | 1 + pkg/acl/tree/treebuilder.go | 17 ++-- 7 files changed, 238 insertions(+), 96 deletions(-) create mode 100644 pkg/acl/tree/changebuilder.go create mode 100644 pkg/acl/tree/objecttree_test.go diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go new file mode 100644 index 00000000..b9f2dc9d --- /dev/null +++ b/pkg/acl/tree/changebuilder.go @@ -0,0 +1,119 @@ +package tree + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" + "github.com/gogo/protobuf/proto" + "time" +) + +const componentBuilder = "tree.changebuilder" + +type BuilderContent struct { + treeHeadIds []string + aclHeadId string + snapshotBaseId string + currentReadKeyHash uint64 + identity string + isSnapshot bool + signingKey signingkey.PrivKey + readKey *symmetric.Key + content proto.Marshaler +} + +type ChangeBuilder interface { + ConvertFromRaw(rawChange *aclpb.RawChange) (ch *Change, err error) + ConvertFromRawAndVerify(rawChange *aclpb.RawChange) (ch *Change, err error) + BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawChange, err error) +} + +type changeBuilder struct { + keys *keychain +} + +func newChangeBuilder(keys *keychain) *changeBuilder { + return &changeBuilder{keys: keys} +} + +func (c *changeBuilder) ConvertFromRaw(rawChange *aclpb.RawChange) (ch *Change, err error) { + unmarshalled := &aclpb.Change{} + err = proto.Unmarshal(rawChange.Payload, unmarshalled) + if err != nil { + return nil, err + } + + ch = NewChange(rawChange.Id, unmarshalled, rawChange.Signature) + return +} + +func (c *changeBuilder) ConvertFromRawAndVerify(rawChange *aclpb.RawChange) (ch *Change, err error) { + unmarshalled := &aclpb.Change{} + ch, err = c.ConvertFromRaw(rawChange) + if err != nil { + return nil, err + } + + identityKey, err := c.keys.getOrAdd(unmarshalled.Identity) + if err != nil { + return + } + + res, err := identityKey.Verify(rawChange.Payload, rawChange.Signature) + if err != nil { + return + } + if !res { + err = ErrIncorrectSignature + } + + return +} + +func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawChange, err error) { + aclChange := &aclpb.Change{ + TreeHeadIds: payload.treeHeadIds, + AclHeadId: payload.aclHeadId, + SnapshotBaseId: payload.snapshotBaseId, + CurrentReadKeyHash: payload.currentReadKeyHash, + Timestamp: int64(time.Now().Nanosecond()), + Identity: payload.identity, + IsSnapshot: payload.isSnapshot, + } + marshalledData, err := payload.content.Marshal() + if err != nil { + return + } + + encrypted, err := payload.readKey.Encrypt(marshalledData) + if err != nil { + return + } + aclChange.ChangesData = encrypted + + fullMarshalledChange, err := proto.Marshal(aclChange) + if err != nil { + return + } + + signature, err := payload.signingKey.Sign(fullMarshalledChange) + if err != nil { + return + } + + id, err := cid.NewCIDFromBytes(fullMarshalledChange) + if err != nil { + return + } + + ch = NewChange(id, aclChange, signature) + ch.ParsedModel = payload.content + + raw = &aclpb.RawChange{ + Payload: fullMarshalledChange, + Signature: signature, + Id: id, + } + return +} diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index 0c77d169..63c515f0 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -6,19 +6,19 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" ) -type DocTreeValidator interface { +type ObjectTreeValidator interface { ValidateTree(tree *Tree, aclList list.ACLList) error } -type docTreeValidator struct{} +type objectTreeValidator struct{} -func newTreeValidator() DocTreeValidator { - return &docTreeValidator{} +func newTreeValidator() ObjectTreeValidator { + return &objectTreeValidator{} } -func (v *docTreeValidator) ValidateTree(tree *Tree, aclList list.ACLList) (err error) { - // TODO: add validation logic where we check that the change refers to correct acl heads - // that means that more recent changes should refer to more recent acl heads +func (v *objectTreeValidator) ValidateTree(tree *Tree, aclList list.ACLList) (err error) { + aclList.RLock() + defer aclList.RUnlock() var ( perm list.UserPermissionPair state = aclList.ACLState() diff --git a/pkg/acl/tree/keychain.go b/pkg/acl/tree/keychain.go index 2e6eca83..582a8102 100644 --- a/pkg/acl/tree/keychain.go +++ b/pkg/acl/tree/keychain.go @@ -13,6 +13,7 @@ type keychain struct { func newKeychain() *keychain { return &keychain{ decoder: signingkey.NewEDPubKeyDecoder(), + keys: make(map[string]signingkey.PubKey), } } diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 474dd1ff..2eae9247 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -6,12 +6,9 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" - "github.com/gogo/protobuf/proto" "go.uber.org/zap" "sync" - "time" ) type ObjectTreeUpdateListener interface { @@ -64,24 +61,24 @@ type ObjectTree interface { Storage() storage.TreeStorage DebugDump() (string, error) - AddContent(ctx context.Context, aclList list.ACLList, content SignableChangeContent) (*aclpb.RawChange, error) - AddRawChanges(ctx context.Context, aclList list.ACLList, changes ...*aclpb.RawChange) (AddResult, error) + AddContent(ctx context.Context, content SignableChangeContent) (*aclpb.RawChange, error) + AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) Close() error } type objectTree struct { treeStorage storage.TreeStorage + changeBuilder ChangeBuilder updateListener ObjectTreeUpdateListener + validator ObjectTreeValidator + treeBuilder *treeBuilder + aclList list.ACLList id string header *aclpb.Header tree *Tree - treeBuilder *treeBuilder - validator DocTreeValidator - kch *keychain - // buffers difSnapshotBuf []*aclpb.RawChange tmpChangesBuf []*Change @@ -93,26 +90,52 @@ type objectTree struct { sync.RWMutex } -func BuildObjectTree(treeStorage storage.TreeStorage, listener ObjectTreeUpdateListener, aclList list.ACLList) (ObjectTree, error) { - treeBuilder := newTreeBuilder(treeStorage) - validator := newTreeValidator() +type objectTreeDeps struct { + changeBuilder ChangeBuilder + treeBuilder *treeBuilder + treeStorage storage.TreeStorage + updateListener ObjectTreeUpdateListener + validator ObjectTreeValidator + aclList list.ACLList +} - objTree := &objectTree{ - treeStorage: treeStorage, - tree: nil, +func defaultObjectTreeDeps( + treeStorage storage.TreeStorage, + listener ObjectTreeUpdateListener, + aclList list.ACLList) objectTreeDeps { + + keychain := newKeychain() + changeBuilder := newChangeBuilder(keychain) + treeBuilder := newTreeBuilder(treeStorage, changeBuilder) + return objectTreeDeps{ + changeBuilder: changeBuilder, treeBuilder: treeBuilder, - validator: validator, + treeStorage: treeStorage, updateListener: listener, + validator: newTreeValidator(), + aclList: aclList, + } +} + +func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { + objTree := &objectTree{ + treeStorage: deps.treeStorage, + updateListener: deps.updateListener, + treeBuilder: deps.treeBuilder, + validator: deps.validator, + aclList: deps.aclList, + changeBuilder: deps.changeBuilder, + tree: nil, tmpChangesBuf: make([]*Change, 0, 10), difSnapshotBuf: make([]*aclpb.RawChange, 0, 10), notSeenIdxBuf: make([]int, 0, 10), - kch: newKeychain(), } - err := objTree.rebuildFromStorage(aclList, nil) + + err := objTree.rebuildFromStorage(nil) if err != nil { return nil, err } - storageHeads, err := treeStorage.Heads() + storageHeads, err := objTree.treeStorage.Heads() if err != nil { return nil, err } @@ -123,30 +146,35 @@ func BuildObjectTree(treeStorage storage.TreeStorage, listener ObjectTreeUpdateL if !slice.UnsortedEquals(storageHeads, objTree.tree.Heads()) { log.With(zap.Strings("storage", storageHeads), zap.Strings("rebuilt", objTree.tree.Heads())). Errorf("the heads in storage and objTree are different") - err = treeStorage.SetHeads(objTree.tree.Heads()) + err = objTree.treeStorage.SetHeads(objTree.tree.Heads()) if err != nil { return nil, err } } - objTree.id, err = treeStorage.ID() + objTree.id, err = objTree.treeStorage.ID() if err != nil { return nil, err } - objTree.header, err = treeStorage.Header() + objTree.header, err = objTree.treeStorage.Header() if err != nil { return nil, err } - if listener != nil { - listener.Rebuild(objTree) + if objTree.updateListener != nil { + objTree.updateListener.Rebuild(objTree) } return objTree, nil } -func (ot *objectTree) rebuildFromStorage(aclList list.ACLList, newChanges []*Change) (err error) { - ot.treeBuilder.Init(ot.kch) +func BuildObjectTree(treeStorage storage.TreeStorage, listener ObjectTreeUpdateListener, aclList list.ACLList) (ObjectTree, error) { + deps := defaultObjectTreeDeps(treeStorage, listener, aclList) + return buildObjectTree(deps) +} + +func (ot *objectTree) rebuildFromStorage(newChanges []*Change) (err error) { + ot.treeBuilder.Reset() ot.tree, err = ot.treeBuilder.Build(newChanges) if err != nil { @@ -157,7 +185,7 @@ func (ot *objectTree) rebuildFromStorage(aclList list.ACLList, newChanges []*Cha // but obviously they are not roots, because of the way how we construct the tree ot.tree.clearPossibleRoots() - return ot.validator.ValidateTree(ot.tree, aclList) + return ot.validator.ValidateTree(ot.tree, ot.aclList) } func (ot *objectTree) ID() string { @@ -172,83 +200,54 @@ func (ot *objectTree) Storage() storage.TreeStorage { return ot.treeStorage } -func (ot *objectTree) AddContent(ctx context.Context, aclList list.ACLList, content SignableChangeContent) (rawChange *aclpb.RawChange, err error) { +func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeContent) (rawChange *aclpb.RawChange, err error) { + ot.aclList.Lock() defer func() { + ot.aclList.Unlock() if ot.updateListener != nil { ot.updateListener.Update(ot) } }() - state := aclList.ACLState() // special method for own keys - aclChange := &aclpb.Change{ - TreeHeadIds: ot.tree.Heads(), - AclHeadId: aclList.Head().Id, - SnapshotBaseId: ot.tree.RootId(), - CurrentReadKeyHash: state.CurrentReadKeyHash(), - Timestamp: int64(time.Now().Nanosecond()), - Identity: content.Identity, - IsSnapshot: content.IsSnapshot, - } - - marshalledData, err := content.Proto.Marshal() - if err != nil { - return nil, err - } + state := ot.aclList.ACLState() // special method for own keys readKey, err := state.CurrentReadKey() if err != nil { return nil, err } - encrypted, err := readKey.Encrypt(marshalledData) - if err != nil { - return nil, err + payload := BuilderContent{ + treeHeadIds: ot.tree.Heads(), + aclHeadId: ot.aclList.Head().Id, + snapshotBaseId: ot.tree.RootId(), + currentReadKeyHash: state.CurrentReadKeyHash(), + identity: content.Identity, + isSnapshot: content.IsSnapshot, + signingKey: content.Key, + readKey: readKey, + content: content.Proto, } - aclChange.ChangesData = encrypted - - fullMarshalledChange, err := proto.Marshal(aclChange) - if err != nil { - return nil, err - } - - signature, err := content.Key.Sign(fullMarshalledChange) - if err != nil { - return nil, err - } - - id, err := cid.NewCIDFromBytes(fullMarshalledChange) - if err != nil { - return nil, err - } - - docChange := NewChange(id, aclChange, signature) - docChange.ParsedModel = content - + objChange, rawChange, err := ot.changeBuilder.BuildContent(payload) if content.IsSnapshot { // clearing tree, because we already fixed everything in the last snapshot ot.tree = &Tree{} } - err = ot.tree.AddMergedHead(docChange) + err = ot.tree.AddMergedHead(objChange) if err != nil { panic(err) } - rawChange = &aclpb.RawChange{ - Payload: fullMarshalledChange, - Signature: docChange.Signature(), - Id: docChange.Id, - } err = ot.treeStorage.AddRawChange(rawChange) if err != nil { return } - err = ot.treeStorage.SetHeads([]string{docChange.Id}) + err = ot.treeStorage.SetHeads([]string{objChange.Id}) return } -func (ot *objectTree) AddRawChanges(ctx context.Context, aclList list.ACLList, rawChanges ...*aclpb.RawChange) (addResult AddResult, err error) { +func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (addResult AddResult, err error) { var mode Mode - mode, addResult, err = ot.addRawChanges(ctx, aclList, rawChanges...) + mode, addResult, err = ot.addRawChanges(ctx, rawChanges...) if err != nil { return } @@ -285,14 +284,14 @@ func (ot *objectTree) AddRawChanges(ctx context.Context, aclList list.ACLList, r return } -func (ot *objectTree) addRawChanges(ctx context.Context, aclList list.ACLList, rawChanges ...*aclpb.RawChange) (mode Mode, addResult AddResult, err error) { +func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (mode Mode, addResult AddResult, err error) { // resetting buffers ot.tmpChangesBuf = ot.tmpChangesBuf[:0] ot.notSeenIdxBuf = ot.notSeenIdxBuf[:0] ot.difSnapshotBuf = ot.difSnapshotBuf[:0] ot.newSnapshotsBuf = ot.newSnapshotsBuf[:0] - // this will be returned to client so we shouldn't use buffer here + // this will be returned to client, so we shouldn't use buffer here prevHeadsCopy := make([]string, 0, len(ot.tree.Heads())) copy(prevHeadsCopy, ot.tree.Heads()) @@ -303,7 +302,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, aclList list.ACLList, r } var change *Change - change, err = newVerifiedChangeFromRaw(ch, ot.kch) + change, err = ot.changeBuilder.ConvertFromRawAndVerify(ch) if err != nil { return } @@ -370,10 +369,10 @@ func (ot *objectTree) addRawChanges(ctx context.Context, aclList list.ACLList, r // checking if we have some changes with different snapshot and then rebuilding for _, ch := range ot.tmpChangesBuf { if isOldSnapshot(ch) { - err = ot.rebuildFromStorage(aclList, ot.tmpChangesBuf) + err = ot.rebuildFromStorage(ot.tmpChangesBuf) if err != nil { // rebuilding without new changes - ot.rebuildFromStorage(aclList, nil) + ot.rebuildFromStorage(nil) return } @@ -401,7 +400,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, aclList list.ACLList, r default: // just rebuilding the state from start without reloading everything from tree storage // as an optimization we could've started from current heads, but I didn't implement that - err = ot.validator.ValidateTree(ot.tree, aclList) + err = ot.validator.ValidateTree(ot.tree, ot.aclList) if err != nil { rollback() err = ErrHasInvalidChanges diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go new file mode 100644 index 00000000..fbdd85d9 --- /dev/null +++ b/pkg/acl/tree/objecttree_test.go @@ -0,0 +1,21 @@ +package tree + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "testing" +) + +func TestObjectTree(t *testing.T) { + a := &app.App{} + inmemory := storage.NewInMemoryTreeStorage(...) + app.RegisterWithType[storage.TreeStorage](a, inmemory) + app.RegisterWithType[]() + + a.Start(context.Background()) + objectTree := app.MustComponentWithType[ObjectTree](a).(ObjectTree) + + + +} diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go index e251d911..c15b15d1 100644 --- a/pkg/acl/tree/tree.go +++ b/pkg/acl/tree/tree.go @@ -115,6 +115,7 @@ func (t *Tree) Add(changes ...*Change) (mode Mode) { return Append } +// RemoveInvalidChange removes all the changes that are descendants of id func (t *Tree) RemoveInvalidChange(id string) { stack := []string{id} // removing all children of this id (either next or unattached) diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index f5af5800..e284336d 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -17,25 +17,26 @@ var ( ) type treeBuilder struct { - cache map[string]*Change - kch *keychain - tree *Tree treeStorage storage.TreeStorage + builder ChangeBuilder + + cache map[string]*Change + tree *Tree // buffers idStack []string loadBuffer []*Change } -func newTreeBuilder(t storage.TreeStorage) *treeBuilder { +func newTreeBuilder(storage storage.TreeStorage, builder ChangeBuilder) *treeBuilder { return &treeBuilder{ - treeStorage: t, + treeStorage: storage, + builder: builder, } } -func (tb *treeBuilder) Init(kch *keychain) { +func (tb *treeBuilder) Reset() { tb.cache = make(map[string]*Change) - tb.kch = kch tb.tree = &Tree{} } @@ -131,7 +132,7 @@ func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { return nil, err } - ch, err = newVerifiedChangeFromRaw(change, tb.kch) + ch, err = tb.builder.ConvertFromRawAndVerify(change) if err != nil { return nil, err } From cde907e15aa3f57edb0a478868d02eefaba63d28 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 6 Sep 2022 19:25:06 +0200 Subject: [PATCH 038/219] Add mocks for tree --- pkg/acl/tree/change.go | 5 +- pkg/acl/tree/changebuilder.go | 7 +++ pkg/acl/tree/objecttree_test.go | 99 +++++++++++++++++++++++++++++---- pkg/acl/tree/tree_test.go | 2 +- 4 files changed, 99 insertions(+), 14 deletions(-) diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index 8fc3b1af..e89cbae6 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -9,7 +9,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" ) -var ErrIncorrectSignature = errors.New("change has incorrect signature") +var ( + ErrIncorrectSignature = errors.New("change has incorrect signature") + ErrIncorrectCID = errors.New("change has incorrect CID") +) type ChangeContent struct { ChangesData proto.Marshaler diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index b9f2dc9d..bdba5382 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -60,12 +60,19 @@ func (c *changeBuilder) ConvertFromRawAndVerify(rawChange *aclpb.RawChange) (ch return } + // verifying signature res, err := identityKey.Verify(rawChange.Payload, rawChange.Signature) if err != nil { return } if !res { err = ErrIncorrectSignature + return + } + + // verifying ID + if !cid.VerifyCID(rawChange.Payload, rawChange.Id) { + err = ErrIncorrectCID } return diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index fbdd85d9..62c921bc 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -1,21 +1,96 @@ package tree import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/require" "testing" ) -func TestObjectTree(t *testing.T) { - a := &app.App{} - inmemory := storage.NewInMemoryTreeStorage(...) - app.RegisterWithType[storage.TreeStorage](a, inmemory) - app.RegisterWithType[]() - - a.Start(context.Background()) - objectTree := app.MustComponentWithType[ObjectTree](a).(ObjectTree) - - +type mockChangeCreator struct{} +func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot bool, prevIds ...string) *aclpb.RawChange { + aclChange := &aclpb.Change{ + TreeHeadIds: prevIds, + AclHeadId: aclId, + SnapshotBaseId: snapshotId, + ChangesData: nil, + IsSnapshot: isSnapshot, + } + res, _ := aclChange.Marshal() + return &aclpb.RawChange{ + Payload: res, + Signature: nil, + Id: id, + } +} + +func (c *mockChangeCreator) createNewTreeStorage(treeId, aclListId, aclHeadId, firstChangeId string) storage.TreeStorage { + firstChange := c.createRaw(firstChangeId, aclHeadId, "", true) + header := &aclpb.Header{ + FirstId: firstChangeId, + AclListId: aclListId, + WorkspaceId: "", + DocType: aclpb.Header_DocTree, + } + treeStorage, _ := storage.NewInMemoryTreeStorage(treeId, header, []*aclpb.RawChange{firstChange}) + return treeStorage +} + +type mockChangeBuilder struct{} + +func (c *mockChangeBuilder) ConvertFromRaw(rawChange *aclpb.RawChange) (ch *Change, err error) { + unmarshalled := &aclpb.Change{} + err = proto.Unmarshal(rawChange.Payload, unmarshalled) + if err != nil { + return nil, err + } + + ch = NewChange(rawChange.Id, unmarshalled, rawChange.Signature) + return +} +func (c *mockChangeBuilder) ConvertFromRawAndVerify(rawChange *aclpb.RawChange) (ch *Change, err error) { + return c.ConvertFromRaw(rawChange) +} + +func (c *mockChangeBuilder) BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawChange, err error) { + panic("implement me") +} + +type mockChangeValidator struct{} + +func (m *mockChangeValidator) ValidateTree(tree *Tree, aclList list.ACLList) error { + return nil +} + +func prepareACLList(t *testing.T) list.ACLList { + st, err := acllistbuilder.NewListStorageWithTestName("userjoinexample.yml") + require.NoError(t, err, "building storage should not result in error") + + aclList, err := list.BuildACLList(signingkey.NewEDPubKeyDecoder(), st) + require.NoError(t, err, "building acl list should be without error") + + return aclList +} + +func TestObjectTree_Build(t *testing.T) { + aclList := prepareACLList(t) + changeCreator := &mockChangeCreator{} + treeStorage := changeCreator.createNewTreeStorage("treeId", aclList.ID(), aclList.Head().Id, "0") + changeBuilder := &mockChangeBuilder{} + deps := objectTreeDeps{ + changeBuilder: changeBuilder, + treeBuilder: newTreeBuilder(treeStorage, changeBuilder), + treeStorage: treeStorage, + updateListener: nil, + validator: &mockChangeValidator{}, + aclList: aclList, + } + + _, err := buildObjectTree(deps) + require.NoError(t, err, "building tree should be without error") } diff --git a/pkg/acl/tree/tree_test.go b/pkg/acl/tree/tree_test.go index 615da851..ff228e43 100644 --- a/pkg/acl/tree/tree_test.go +++ b/pkg/acl/tree/tree_test.go @@ -17,7 +17,7 @@ func newChange(id string, snapshotId string, prevIds ...string) *Change { } } -func newSnapshot(id string, snapshotId string, prevIds ...string) *Change { +func newSnapshot(id, snapshotId string, prevIds ...string) *Change { return &Change{ PreviousIds: prevIds, Id: id, From 06f80f0646db120ebb0ca70cd09f78222b957a98 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 6 Sep 2022 20:23:57 +0200 Subject: [PATCH 039/219] Change storages and add iterate --- pkg/acl/storage/inmemory.go | 17 +++---- pkg/acl/storage/provider.go | 17 ++++++- pkg/acl/storage/treestorage.go | 2 + pkg/acl/tree/changevalidator.go | 4 +- pkg/acl/tree/objecttree.go | 89 ++++++++++++++++++++++++++------- pkg/acl/tree/objecttree_test.go | 2 +- pkg/acl/tree/treestorage.go | 45 +++++++---------- 7 files changed, 118 insertions(+), 58 deletions(-) diff --git a/pkg/acl/storage/inmemory.go b/pkg/acl/storage/inmemory.go index 59235d5e..16879c38 100644 --- a/pkg/acl/storage/inmemory.go +++ b/pkg/acl/storage/inmemory.go @@ -70,11 +70,10 @@ type inMemoryTreeStorage struct { sync.RWMutex } -type CreatorFunc = func(string, *aclpb.Header, []*aclpb.RawChange) (TreeStorage, error) - func NewInMemoryTreeStorage( treeId string, header *aclpb.Header, + heads []string, changes []*aclpb.RawChange) (TreeStorage, error) { allChanges := make(map[string]*aclpb.RawChange) for _, ch := range changes { @@ -84,7 +83,7 @@ func NewInMemoryTreeStorage( return &inMemoryTreeStorage{ id: treeId, header: header, - heads: nil, + heads: heads, changes: allChanges, RWMutex: sync.RWMutex{}, }, nil @@ -161,27 +160,27 @@ func (i *inMemoryStorageProvider) Storage(id string) (Storage, error) { return nil, ErrUnknownTreeId } -func (i *inMemoryStorageProvider) CreateTreeStorage(treeId string, header *aclpb.Header, changes []*aclpb.RawChange) (TreeStorage, error) { +func (i *inMemoryStorageProvider) CreateTreeStorage(payload TreeStorageCreatePayload) (TreeStorage, error) { i.Lock() defer i.Unlock() - res, err := NewInMemoryTreeStorage(treeId, header, changes) + res, err := NewInMemoryTreeStorage(payload.TreeId, payload.Header, payload.Heads, payload.Changes) if err != nil { return nil, err } - i.objects[treeId] = res + i.objects[payload.TreeId] = res return res, nil } -func (i *inMemoryStorageProvider) CreateACLListStorage(id string, header *aclpb.Header, records []*aclpb.RawRecord) (ListStorage, error) { +func (i *inMemoryStorageProvider) CreateACLListStorage(payload ACLListStorageCreatePayload) (ListStorage, error) { i.Lock() defer i.Unlock() - res, err := NewInMemoryACLListStorage(id, header, records) + res, err := NewInMemoryACLListStorage(payload.ListId, payload.Header, payload.Records) if err != nil { return nil, err } - i.objects[id] = res + i.objects[payload.ListId] = res return res, nil } diff --git a/pkg/acl/storage/provider.go b/pkg/acl/storage/provider.go index a9be29b9..12d47d00 100644 --- a/pkg/acl/storage/provider.go +++ b/pkg/acl/storage/provider.go @@ -7,9 +7,22 @@ import ( var ErrUnknownTreeId = errors.New("tree does not exist") +type TreeStorageCreatePayload struct { + TreeId string + Header *aclpb.Header + Changes []*aclpb.RawChange + Heads []string +} + +type ACLListStorageCreatePayload struct { + ListId string + Header *aclpb.Header + Records []*aclpb.RawRecord +} + type Provider interface { Storage(id string) (Storage, error) AddStorage(id string, st Storage) error - CreateTreeStorage(treeId string, header *aclpb.Header, changes []*aclpb.RawChange) (TreeStorage, error) - CreateACLListStorage(id string, header *aclpb.Header, records []*aclpb.RawRecord) (ListStorage, error) + CreateTreeStorage(payload TreeStorageCreatePayload) (TreeStorage, error) + CreateACLListStorage(payload ACLListStorageCreatePayload) (ListStorage, error) } diff --git a/pkg/acl/storage/treestorage.go b/pkg/acl/storage/treestorage.go index 65146c39..d2cf7eec 100644 --- a/pkg/acl/storage/treestorage.go +++ b/pkg/acl/storage/treestorage.go @@ -13,3 +13,5 @@ type TreeStorage interface { AddRawChange(change *aclpb.RawChange) error GetRawChange(ctx context.Context, recordID string) (*aclpb.RawChange, error) } + +type TreeStorageCreatorFunc = func(payload TreeStorageCreatePayload) (TreeStorage, error) diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index 63c515f0..f0dfbdc7 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -7,6 +7,7 @@ import ( ) type ObjectTreeValidator interface { + // ValidateTree should always be entered while holding a read lock on ACLList ValidateTree(tree *Tree, aclList list.ACLList) error } @@ -17,8 +18,7 @@ func newTreeValidator() ObjectTreeValidator { } func (v *objectTreeValidator) ValidateTree(tree *Tree, aclList list.ACLList) (err error) { - aclList.RLock() - defer aclList.RUnlock() + var ( perm list.UserPermissionPair state = aclList.ACLState() diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 2eae9247..fcb57d3b 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -6,6 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "go.uber.org/zap" "sync" @@ -43,6 +44,9 @@ type AddResult struct { Summary AddResultSummary } +type ChangeIterateFunc = func(change *Change) bool +type ChangeConvertFunc = func(decrypted []byte) (any, error) + type ObjectTree interface { RWLocker @@ -52,8 +56,8 @@ type ObjectTree interface { Root() *Change HasChange(string) bool - Iterate(func(change *Change) bool) - IterateFrom(string, func(change *Change) bool) + Iterate(convert ChangeConvertFunc, iterate ChangeIterateFunc) error + IterateFrom(id string, convert ChangeConvertFunc, iterate ChangeIterateFunc) error SnapshotPath() []string ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) @@ -79,6 +83,8 @@ type objectTree struct { header *aclpb.Header tree *Tree + keys map[uint64]*symmetric.Key + // buffers difSnapshotBuf []*aclpb.RawChange tmpChangesBuf []*Change @@ -119,16 +125,18 @@ func defaultObjectTreeDeps( func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { objTree := &objectTree{ - treeStorage: deps.treeStorage, - updateListener: deps.updateListener, - treeBuilder: deps.treeBuilder, - validator: deps.validator, - aclList: deps.aclList, - changeBuilder: deps.changeBuilder, - tree: nil, - tmpChangesBuf: make([]*Change, 0, 10), - difSnapshotBuf: make([]*aclpb.RawChange, 0, 10), - notSeenIdxBuf: make([]int, 0, 10), + treeStorage: deps.treeStorage, + updateListener: deps.updateListener, + treeBuilder: deps.treeBuilder, + validator: deps.validator, + aclList: deps.aclList, + changeBuilder: deps.changeBuilder, + tree: nil, + keys: make(map[uint64]*symmetric.Key), + tmpChangesBuf: make([]*Change, 0, 10), + difSnapshotBuf: make([]*aclpb.RawChange, 0, 10), + notSeenIdxBuf: make([]int, 0, 10), + newSnapshotsBuf: make([]*Change, 0, 10), } err := objTree.rebuildFromStorage(nil) @@ -185,7 +193,7 @@ func (ot *objectTree) rebuildFromStorage(newChanges []*Change) (err error) { // but obviously they are not roots, because of the way how we construct the tree ot.tree.clearPossibleRoots() - return ot.validator.ValidateTree(ot.tree, ot.aclList) + return ot.validateTree() } func (ot *objectTree) ID() string { @@ -400,7 +408,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra default: // just rebuilding the state from start without reloading everything from tree storage // as an optimization we could've started from current heads, but I didn't implement that - err = ot.validator.ValidateTree(ot.tree, ot.aclList) + err = ot.validateTree() if err != nil { rollback() err = ErrHasInvalidChanges @@ -417,12 +425,42 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra return } -func (ot *objectTree) Iterate(f func(change *Change) bool) { - ot.tree.Iterate(ot.tree.RootId(), f) +func (ot *objectTree) Iterate(convert ChangeConvertFunc, iterate ChangeIterateFunc) (err error) { + return ot.IterateFrom(ot.tree.RootId(), convert, iterate) } -func (ot *objectTree) IterateFrom(s string, f func(change *Change) bool) { - ot.tree.Iterate(s, f) +func (ot *objectTree) IterateFrom(id string, convert ChangeConvertFunc, iterate ChangeIterateFunc) (err error) { + if convert == nil { + ot.tree.Iterate(id, iterate) + return + } + + ot.tree.Iterate(ot.tree.RootId(), func(c *Change) (isContinue bool) { + var model any + if c.ParsedModel != nil { + return iterate(c) + } + readKey, exists := ot.keys[c.Content.CurrentReadKeyHash] + if !exists { + err = list.ErrNoReadKey + return false + } + + var decrypted []byte + decrypted, err = readKey.Decrypt(c.Content.GetChangesData()) + if err != nil { + return false + } + + model, err = convert(decrypted) + if err != nil { + return false + } + + c.ParsedModel = model + return iterate(c) + }) + return } func (ot *objectTree) HasChange(s string) bool { @@ -546,6 +584,21 @@ func (ot *objectTree) snapshotPathIsActual() bool { return len(ot.snapshotPath) != 0 && ot.snapshotPath[len(ot.snapshotPath)-1] == ot.tree.RootId() } +func (ot *objectTree) validateTree() error { + ot.aclList.RLock() + defer ot.aclList.RUnlock() + state := ot.aclList.ACLState() + + // just not to take lock many times, updating the key map from aclList + if len(ot.keys) != len(state.UserReadKeys()) { + for key, value := range state.UserReadKeys() { + ot.keys[key] = value + } + } + + return ot.validator.ValidateTree(ot.tree, ot.aclList) +} + func (ot *objectTree) DebugDump() (string, error) { return ot.tree.Graph(NoOpDescriptionParser) } diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index 62c921bc..075d9d21 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -37,7 +37,7 @@ func (c *mockChangeCreator) createNewTreeStorage(treeId, aclListId, aclHeadId, f WorkspaceId: "", DocType: aclpb.Header_DocTree, } - treeStorage, _ := storage.NewInMemoryTreeStorage(treeId, header, []*aclpb.RawChange{firstChange}) + treeStorage, _ := storage.NewInMemoryTreeStorage(treeId, header, []string{firstChangeId}, []*aclpb.RawChange{firstChange}) return treeStorage } diff --git a/pkg/acl/tree/treestorage.go b/pkg/acl/tree/treestorage.go index af31d339..27fce1d5 100644 --- a/pkg/acl/tree/treestorage.go +++ b/pkg/acl/tree/treestorage.go @@ -14,7 +14,7 @@ func CreateNewTreeStorage( acc *account.AccountData, aclList list.ACLList, content proto.Marshaler, - create storage.CreatorFunc) (storage.TreeStorage, error) { + create storage.TreeStorageCreatorFunc) (thr storage.TreeStorage, err error) { state := aclList.ACLState() change := &aclpb.Change{ @@ -27,34 +27,34 @@ func CreateNewTreeStorage( marshalledData, err := content.Marshal() if err != nil { - return nil, err + return } readKey, err := state.CurrentReadKey() if err != nil { - return nil, err + return } encrypted, err := readKey.Encrypt(marshalledData) if err != nil { - return nil, err + return } change.ChangesData = encrypted fullMarshalledChange, err := proto.Marshal(change) if err != nil { - return nil, err + return } signature, err := acc.SignKey.Sign(fullMarshalledChange) if err != nil { - return nil, err + return } changeId, err := cid.NewCIDFromBytes(fullMarshalledChange) if err != nil { - return nil, err + return } rawChange := &aclpb.RawChange{ @@ -64,35 +64,28 @@ func CreateNewTreeStorage( } header, treeId, err := createTreeHeaderAndId(rawChange, aclpb.Header_DocTree, aclList.ID()) if err != nil { - return nil, err + return } - thr, err := create(treeId, header, []*aclpb.RawChange{rawChange}) - if err != nil { - return nil, err - } - - err = thr.SetHeads([]string{changeId}) - if err != nil { - return nil, err - } - return thr, nil + return create(storage.TreeStorageCreatePayload{ + TreeId: treeId, + Header: header, + Changes: []*aclpb.RawChange{rawChange}, + Heads: []string{rawChange.Id}, + }) } -func createTreeHeaderAndId(change *aclpb.RawChange, treeType aclpb.HeaderDocType, aclListId string) (*aclpb.Header, string, error) { - header := &aclpb.Header{ +func createTreeHeaderAndId(change *aclpb.RawChange, treeType aclpb.HeaderDocType, aclListId string) (header *aclpb.Header, treeId string, err error) { + header = &aclpb.Header{ FirstId: change.Id, DocType: treeType, AclListId: aclListId, } marshalledHeader, err := proto.Marshal(header) if err != nil { - return nil, "", err - } - treeId, err := cid.NewCIDFromBytes(marshalledHeader) - if err != nil { - return nil, "", err + return } - return header, treeId, nil + treeId, err = cid.NewCIDFromBytes(marshalledHeader) + return } From 9905b2608b5a23077404077efb4217bf20220399 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 6 Sep 2022 20:58:41 +0200 Subject: [PATCH 040/219] Add first test for object tree --- pkg/acl/tree/objecttree.go | 15 +++++----- pkg/acl/tree/objecttree_test.go | 52 +++++++++++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index fcb57d3b..74f92b10 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -299,9 +299,14 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra ot.difSnapshotBuf = ot.difSnapshotBuf[:0] ot.newSnapshotsBuf = ot.newSnapshotsBuf[:0] + headsCopy := func() []string { + newHeads := make([]string, 0, len(ot.tree.Heads())) + newHeads = append(newHeads, ot.tree.Heads()...) + return newHeads + } + // this will be returned to client, so we shouldn't use buffer here - prevHeadsCopy := make([]string, 0, len(ot.tree.Heads())) - copy(prevHeadsCopy, ot.tree.Heads()) + prevHeadsCopy := headsCopy() // filtering changes, verifying and unmarshalling them for idx, ch := range rawChanges { @@ -332,12 +337,6 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra return } - headsCopy := func() []string { - newHeads := make([]string, 0, len(ot.tree.Heads())) - copy(newHeads, ot.tree.Heads()) - return newHeads - } - // returns changes that we added to the tree getAddedChanges := func() []*aclpb.RawChange { var added []*aclpb.RawChange diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index 075d9d21..ea7bddfd 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -1,12 +1,14 @@ package tree import ( + "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" ) @@ -77,7 +79,7 @@ func prepareACLList(t *testing.T) list.ACLList { return aclList } -func TestObjectTree_Build(t *testing.T) { +func TestObjectTree(t *testing.T) { aclList := prepareACLList(t) changeCreator := &mockChangeCreator{} treeStorage := changeCreator.createNewTreeStorage("treeId", aclList.ID(), aclList.Head().Id, "0") @@ -91,6 +93,52 @@ func TestObjectTree_Build(t *testing.T) { aclList: aclList, } - _, err := buildObjectTree(deps) + // check build + objTree, err := buildObjectTree(deps) require.NoError(t, err, "building tree should be without error") + + // check tree iterate + var iterChangesId []string + err = objTree.Iterate(nil, func(change *Change) bool { + iterChangesId = append(iterChangesId, change.Id) + return true + }) + require.NoError(t, err, "iterate should be without error") + assert.Equal(t, []string{"0"}, iterChangesId) + + t.Run("add simple", func(t *testing.T) { + rawChanges := []*aclpb.RawChange{ + 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...) + require.NoError(t, err, "adding changes should be without error") + + // check result + assert.Equal(t, []string{"0"}, res.OldHeads) + assert.Equal(t, []string{"2"}, res.Heads) + assert.Equal(t, len(rawChanges), len(res.Added)) + + // check tree heads + assert.Equal(t, []string{"2"}, objTree.Heads()) + + // check tree iterate + var iterChangesId []string + err = objTree.Iterate(nil, func(change *Change) bool { + iterChangesId = append(iterChangesId, change.Id) + return true + }) + require.NoError(t, err, "iterate should be without error") + assert.Equal(t, []string{"0", "1", "2"}, iterChangesId) + + // check storage + heads, _ := treeStorage.Heads() + assert.Equal(t, []string{"2"}, heads) + + for _, ch := range rawChanges { + raw, err := treeStorage.GetRawChange(context.Background(), ch.Id) + assert.NoError(t, err, "storage should have all the changes") + assert.Equal(t, ch, raw, "the changes in the storage should be the same") + } + }) } From 276d935cee91c751310ec33a2a3a4839bc38bd09 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 7 Sep 2022 00:12:11 +0200 Subject: [PATCH 041/219] Add more tests and fix bugs --- pkg/acl/tree/objecttree.go | 1 + pkg/acl/tree/objecttree_test.go | 169 +++++++++++++++++++++++++++++++- pkg/acl/tree/treebuilder.go | 23 ++--- 3 files changed, 177 insertions(+), 16 deletions(-) diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 74f92b10..62798038 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -481,6 +481,7 @@ func (ot *objectTree) Close() error { } func (ot *objectTree) SnapshotPath() []string { + // TODO: Add error as return parameter if ot.snapshotPathIsActual() { return ot.snapshotPath } diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index ea7bddfd..2c96aaf1 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -69,6 +69,14 @@ func (m *mockChangeValidator) ValidateTree(tree *Tree, aclList list.ACLList) err return nil } +type testTreeContext struct { + aclList list.ACLList + treeStorage storage.TreeStorage + changeBuilder *mockChangeBuilder + changeCreator *mockChangeCreator + objTree ObjectTree +} + func prepareACLList(t *testing.T) list.ACLList { st, err := acllistbuilder.NewListStorageWithTestName("userjoinexample.yml") require.NoError(t, err, "building storage should not result in error") @@ -79,8 +87,7 @@ func prepareACLList(t *testing.T) list.ACLList { return aclList } -func TestObjectTree(t *testing.T) { - aclList := prepareACLList(t) +func prepareTreeContext(t *testing.T, aclList list.ACLList) testTreeContext { changeCreator := &mockChangeCreator{} treeStorage := changeCreator.createNewTreeStorage("treeId", aclList.ID(), aclList.Head().Id, "0") changeBuilder := &mockChangeBuilder{} @@ -105,8 +112,24 @@ func TestObjectTree(t *testing.T) { }) require.NoError(t, err, "iterate should be without error") assert.Equal(t, []string{"0"}, iterChangesId) + return testTreeContext{ + aclList: aclList, + treeStorage: treeStorage, + changeBuilder: changeBuilder, + changeCreator: changeCreator, + objTree: objTree, + } +} + +func TestObjectTree(t *testing.T) { + aclList := prepareACLList(t) t.Run("add simple", func(t *testing.T) { + ctx := prepareTreeContext(t, aclList) + treeStorage := ctx.treeStorage + changeCreator := ctx.changeCreator + objTree := ctx.objTree + rawChanges := []*aclpb.RawChange{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), @@ -141,4 +164,146 @@ func TestObjectTree(t *testing.T) { assert.Equal(t, ch, raw, "the changes in the storage should be the same") } }) + + t.Run("add new snapshot simple", func(t *testing.T) { + ctx := prepareTreeContext(t, aclList) + treeStorage := ctx.treeStorage + changeCreator := ctx.changeCreator + objTree := ctx.objTree + + rawChanges := []*aclpb.RawChange{ + changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), + 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...) + require.NoError(t, err, "adding changes should be without error") + + // check result + assert.Equal(t, []string{"0"}, res.OldHeads) + assert.Equal(t, []string{"3"}, res.Heads) + assert.Equal(t, len(rawChanges), len(res.Added)) + + // check tree heads + assert.Equal(t, []string{"3"}, objTree.Heads()) + + // check tree iterate + var iterChangesId []string + err = objTree.Iterate(nil, func(change *Change) bool { + iterChangesId = append(iterChangesId, change.Id) + return true + }) + require.NoError(t, err, "iterate should be without error") + assert.Equal(t, []string{"3"}, iterChangesId) + assert.Equal(t, "3", objTree.Root().Id) + + // check storage + heads, _ := treeStorage.Heads() + assert.Equal(t, []string{"3"}, heads) + + for _, ch := range rawChanges { + raw, err := treeStorage.GetRawChange(context.Background(), ch.Id) + assert.NoError(t, err, "storage should have all the changes") + assert.Equal(t, ch, raw, "the changes in the storage should be the same") + } + }) + + t.Run("snapshot path", func(t *testing.T) { + ctx := prepareTreeContext(t, aclList) + changeCreator := ctx.changeCreator + objTree := ctx.objTree + + rawChanges := []*aclpb.RawChange{ + changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), + changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), + changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), + } + _, err := objTree.AddRawChanges(context.Background(), rawChanges...) + require.NoError(t, err, "adding changes should be without error") + + snapshotPath := objTree.SnapshotPath() + assert.Equal(t, []string{"3", "0"}, snapshotPath) + }) + + t.Run("changes after common snapshot", func(t *testing.T) { + ctx := prepareTreeContext(t, aclList) + changeCreator := ctx.changeCreator + objTree := ctx.objTree + + rawChanges := []*aclpb.RawChange{ + changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), + changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), + changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), + changeCreator.createRaw("4", aclList.Head().Id, "0", false, "2"), + changeCreator.createRaw("5", aclList.Head().Id, "0", false, "1"), + changeCreator.createRaw("6", aclList.Head().Id, "0", false, "3", "4", "5"), + } + + _, err := objTree.AddRawChanges(context.Background(), rawChanges...) + require.NoError(t, err, "adding changes should be without error") + require.Equal(t, "0", objTree.Root().Id) + + changeIds := make(map[string]struct{}) + changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}) + for _, ch := range changes { + changeIds[ch.Id] = struct{}{} + } + + for _, raw := range rawChanges { + _, ok := changeIds[raw.Id] + assert.Equal(t, true, ok) + } + }) + + t.Run("add new changes related to previous snapshot", func(t *testing.T) { + ctx := prepareTreeContext(t, aclList) + treeStorage := ctx.treeStorage + changeCreator := ctx.changeCreator + objTree := ctx.objTree + + rawChanges := []*aclpb.RawChange{ + changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), + 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...) + require.NoError(t, err, "adding changes should be without error") + require.Equal(t, "3", objTree.Root().Id) + + rawChanges = []*aclpb.RawChange{ + changeCreator.createRaw("4", aclList.Head().Id, "0", false, "2"), + 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...) + require.NoError(t, err, "adding changes should be without error") + + // check result + assert.Equal(t, []string{"3"}, res.OldHeads) + assert.Equal(t, []string{"6"}, res.Heads) + assert.Equal(t, len(rawChanges), len(res.Added)) + + // check tree heads + assert.Equal(t, []string{"6"}, objTree.Heads()) + + // check tree iterate + var iterChangesId []string + err = objTree.Iterate(nil, func(change *Change) bool { + iterChangesId = append(iterChangesId, change.Id) + return true + }) + require.NoError(t, err, "iterate should be without error") + assert.Equal(t, []string{"0", "1", "2", "3", "4", "5", "6"}, iterChangesId) + assert.Equal(t, "0", objTree.Root().Id) + + // check storage + heads, _ := treeStorage.Heads() + assert.Equal(t, []string{"6"}, heads) + + for _, ch := range rawChanges { + raw, err := treeStorage.GetRawChange(context.Background(), ch.Id) + assert.NoError(t, err, "storage should have all the changes") + assert.Equal(t, ch, raw, "the changes in the storage should be the same") + } + }) } diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index e284336d..c88324b3 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -85,18 +85,13 @@ func (tb *treeBuilder) dfs( load func(string) (*Change, error)) (buf []*Change, err error) { tb.idStack = tb.idStack[:0] tb.loadBuffer = tb.loadBuffer[:0] - buf = tb.loadBuffer - var ( - stack = tb.idStack - uniqMap = map[string]struct{}{breakpoint: {}} - ) + uniqMap := map[string]struct{}{breakpoint: {}} + tb.idStack = append(tb.idStack, heads...) - copy(stack, heads) - - for len(stack) > 0 { - id := stack[len(stack)-1] - stack = stack[:len(stack)-1] + for len(tb.idStack) > 0 { + id := tb.idStack[len(tb.idStack)-1] + tb.idStack = tb.idStack[:len(tb.idStack)-1] if _, exists := uniqMap[id]; exists { continue } @@ -107,16 +102,16 @@ func (tb *treeBuilder) dfs( } uniqMap[id] = struct{}{} - buf = append(buf, ch) + tb.loadBuffer = append(tb.loadBuffer, ch) for _, prev := range ch.PreviousIds { - if _, exists := uniqMap[id]; exists { + if _, exists := uniqMap[prev]; exists { continue } - stack = append(stack, prev) + tb.idStack = append(tb.idStack, prev) } } - return buf, nil + return tb.loadBuffer, nil } func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { From c7fdd816916b01907d773282cd0335e57e7e14c8 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 7 Sep 2022 01:02:53 +0200 Subject: [PATCH 042/219] More test cases --- pkg/acl/tree/objecttree.go | 3 +- pkg/acl/tree/objecttree_test.go | 113 ++++++++++++++++++++++++++++++-- 2 files changed, 110 insertions(+), 6 deletions(-) diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 62798038..2fbb5298 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -539,6 +539,7 @@ func (ot *objectTree) getChangesFromTree() (rawChanges []*aclpb.RawChange, err e if err != nil { return false } + raw := &aclpb.RawChange{ Payload: marshalled, Signature: ch.Signature(), @@ -581,7 +582,7 @@ func (ot *objectTree) getChangesFromDB(commonSnapshot string, needStartSnapshot } func (ot *objectTree) snapshotPathIsActual() bool { - return len(ot.snapshotPath) != 0 && ot.snapshotPath[len(ot.snapshotPath)-1] == ot.tree.RootId() + return len(ot.snapshotPath) != 0 && ot.snapshotPath[0] == ot.tree.RootId() } func (ot *objectTree) validateTree() error { diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index 2c96aaf1..7f5c7ce8 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -141,6 +141,7 @@ func TestObjectTree(t *testing.T) { assert.Equal(t, []string{"0"}, res.OldHeads) assert.Equal(t, []string{"2"}, res.Heads) assert.Equal(t, len(rawChanges), len(res.Added)) + assert.Equal(t, AddResultSummaryAppend, res.Summary) // check tree heads assert.Equal(t, []string{"2"}, objTree.Heads()) @@ -165,6 +166,47 @@ func TestObjectTree(t *testing.T) { } }) + t.Run("add no new changes", func(t *testing.T) { + ctx := prepareTreeContext(t, aclList) + changeCreator := ctx.changeCreator + objTree := ctx.objTree + + rawChanges := []*aclpb.RawChange{ + changeCreator.createRaw("0", aclList.Head().Id, "", true, ""), + } + res, err := objTree.AddRawChanges(context.Background(), rawChanges...) + require.NoError(t, err, "adding changes should be without error") + + // check result + assert.Equal(t, []string{"0"}, res.OldHeads) + assert.Equal(t, []string{"0"}, res.Heads) + assert.Equal(t, 0, len(res.Added)) + + // check tree heads + assert.Equal(t, []string{"0"}, objTree.Heads()) + }) + + t.Run("add unattachable changes", func(t *testing.T) { + ctx := prepareTreeContext(t, aclList) + changeCreator := ctx.changeCreator + objTree := ctx.objTree + + rawChanges := []*aclpb.RawChange{ + changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), + } + res, err := objTree.AddRawChanges(context.Background(), rawChanges...) + require.NoError(t, err, "adding changes should be without error") + + // check result + assert.Equal(t, []string{"0"}, res.OldHeads) + assert.Equal(t, []string{"0"}, res.Heads) + assert.Equal(t, 0, len(res.Added)) + assert.Equal(t, AddResultSummaryNothing, res.Summary) + + // check tree heads + assert.Equal(t, []string{"0"}, objTree.Heads()) + }) + t.Run("add new snapshot simple", func(t *testing.T) { ctx := prepareTreeContext(t, aclList) treeStorage := ctx.treeStorage @@ -175,17 +217,19 @@ func TestObjectTree(t *testing.T) { changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), 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...) require.NoError(t, err, "adding changes should be without error") // check result assert.Equal(t, []string{"0"}, res.OldHeads) - assert.Equal(t, []string{"3"}, res.Heads) + assert.Equal(t, []string{"4"}, res.Heads) assert.Equal(t, len(rawChanges), len(res.Added)) + assert.Equal(t, AddResultSummaryAppend, res.Summary) // check tree heads - assert.Equal(t, []string{"3"}, objTree.Heads()) + assert.Equal(t, []string{"4"}, objTree.Heads()) // check tree iterate var iterChangesId []string @@ -194,12 +238,12 @@ func TestObjectTree(t *testing.T) { return true }) require.NoError(t, err, "iterate should be without error") - assert.Equal(t, []string{"3"}, iterChangesId) + assert.Equal(t, []string{"3", "4"}, iterChangesId) assert.Equal(t, "3", objTree.Root().Id) // check storage heads, _ := treeStorage.Heads() - assert.Equal(t, []string{"3"}, heads) + assert.Equal(t, []string{"4"}, heads) for _, ch := range rawChanges { raw, err := treeStorage.GetRawChange(context.Background(), ch.Id) @@ -223,9 +267,11 @@ func TestObjectTree(t *testing.T) { snapshotPath := objTree.SnapshotPath() assert.Equal(t, []string{"3", "0"}, snapshotPath) + + assert.Equal(t, true, objTree.(*objectTree).snapshotPathIsActual()) }) - t.Run("changes after common snapshot", func(t *testing.T) { + t.Run("changes after common snapshot from tree", func(t *testing.T) { ctx := prepareTreeContext(t, aclList) changeCreator := ctx.changeCreator objTree := ctx.objTree @@ -255,6 +301,62 @@ func TestObjectTree(t *testing.T) { } }) + t.Run("changes after common snapshot from db", func(t *testing.T) { + ctx := prepareTreeContext(t, aclList) + changeCreator := ctx.changeCreator + objTree := ctx.objTree + + rawChanges := []*aclpb.RawChange{ + changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), + changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), + changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), + } + + _, err := objTree.AddRawChanges(context.Background(), rawChanges...) + require.NoError(t, err, "adding changes should be without error") + require.Equal(t, "3", objTree.Root().Id) + + changeIds := make(map[string]struct{}) + changes, err := objTree.ChangesAfterCommonSnapshot([]string{"0"}) + for _, ch := range changes { + changeIds[ch.Id] = struct{}{} + } + + for _, raw := range rawChanges { + _, ok := changeIds[raw.Id] + assert.Equal(t, true, ok) + } + }) + + t.Run("changes after common snapshot from db, they have empty path", func(t *testing.T) { + ctx := prepareTreeContext(t, aclList) + changeCreator := ctx.changeCreator + objTree := ctx.objTree + + rawChanges := []*aclpb.RawChange{ + changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), + changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), + changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), + } + + _, err := objTree.AddRawChanges(context.Background(), rawChanges...) + require.NoError(t, err, "adding changes should be without error") + require.Equal(t, "3", objTree.Root().Id) + + changeIds := make(map[string]struct{}) + changes, err := objTree.ChangesAfterCommonSnapshot([]string{}) + for _, ch := range changes { + changeIds[ch.Id] = struct{}{} + } + + for _, raw := range rawChanges { + _, ok := changeIds[raw.Id] + assert.Equal(t, true, ok) + } + _, ok := changeIds["0"] + assert.Equal(t, true, ok) + }) + t.Run("add new changes related to previous snapshot", func(t *testing.T) { ctx := prepareTreeContext(t, aclList) treeStorage := ctx.treeStorage @@ -282,6 +384,7 @@ func TestObjectTree(t *testing.T) { assert.Equal(t, []string{"3"}, res.OldHeads) assert.Equal(t, []string{"6"}, res.Heads) assert.Equal(t, len(rawChanges), len(res.Added)) + assert.Equal(t, AddResultSummaryRebuild, res.Summary) // check tree heads assert.Equal(t, []string{"6"}, objTree.Heads()) From 1375854237205bb983b5f68cf0e398a7a84dc8e3 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 7 Sep 2022 11:31:16 +0200 Subject: [PATCH 043/219] Fix addcontent acl list locks --- pkg/acl/tree/objecttree.go | 43 +++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 2fbb5298..f12f1d1b 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -209,31 +209,17 @@ func (ot *objectTree) Storage() storage.TreeStorage { } func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeContent) (rawChange *aclpb.RawChange, err error) { - ot.aclList.Lock() defer func() { - ot.aclList.Unlock() - if ot.updateListener != nil { + if err == nil && ot.updateListener != nil { ot.updateListener.Update(ot) } }() - state := ot.aclList.ACLState() // special method for own keys - readKey, err := state.CurrentReadKey() + payload, err := ot.prepareBuilderContent(content) if err != nil { - return nil, err + return } - payload := BuilderContent{ - treeHeadIds: ot.tree.Heads(), - aclHeadId: ot.aclList.Head().Id, - snapshotBaseId: ot.tree.RootId(), - currentReadKeyHash: state.CurrentReadKeyHash(), - identity: content.Identity, - isSnapshot: content.IsSnapshot, - signingKey: content.Key, - readKey: readKey, - content: content.Proto, - } objChange, rawChange, err := ot.changeBuilder.BuildContent(payload) if content.IsSnapshot { // clearing tree, because we already fixed everything in the last snapshot @@ -253,6 +239,29 @@ func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeCont return } +func (ot *objectTree) prepareBuilderContent(content SignableChangeContent) (cnt BuilderContent, err error) { + ot.aclList.RLock() + defer ot.aclList.RUnlock() + + state := ot.aclList.ACLState() // special method for own keys + readKey, err := state.CurrentReadKey() + if err != nil { + return + } + cnt = BuilderContent{ + treeHeadIds: ot.tree.Heads(), + aclHeadId: ot.aclList.Head().Id, + snapshotBaseId: ot.tree.RootId(), + currentReadKeyHash: state.CurrentReadKeyHash(), + identity: content.Identity, + isSnapshot: content.IsSnapshot, + signingKey: content.Key, + readKey: readKey, + content: content.Proto, + } + return +} + func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (addResult AddResult, err error) { var mode Mode mode, addResult, err = ot.addRawChanges(ctx, rawChanges...) From 357e889dad0f3e7404184211107b8bb55aa57074 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Wed, 7 Sep 2022 19:43:01 +0300 Subject: [PATCH 044/219] change proto generator to std gogo --- go.mod | 2 + go.sum | 8 + pkg/acl/aclchanges/aclpb/aclchanges.pb.go | 811 +++++++++--------- pkg/acl/acltree/aclstate.go | 46 +- pkg/acl/acltree/aclstatebuilder.go | 2 +- pkg/acl/acltree/change.go | 2 +- pkg/acl/acltree/changebuilder.go | 14 +- pkg/acl/acltree/treegraph_nix.go | 4 +- pkg/acl/example/plaintextdocument/document.go | 18 +- .../plaintextdocument/plaintextdocstate.go | 6 +- .../testchangepb/testdocumentchanges.pb.go | 211 ++--- .../treestoragebuilder/treestoragebuilder.go | 68 +- .../treestoragebuildergraph_nix.go | 6 +- service/net/pool/message.go | 8 +- service/space/remotediff/remotediff.go | 22 +- service/space/service.go | 6 +- service/space/space.go | 2 +- service/space/spacesync/spacesync.pb.go | 327 +++---- service/sync/document/service.go | 22 +- service/sync/message/service.go | 2 +- service/sync/requesthandler/requesthandler.go | 28 +- syncproto/helpers.go | 18 +- syncproto/sync.pb.go | 538 ++++++------ 23 files changed, 1092 insertions(+), 1079 deletions(-) diff --git a/go.mod b/go.mod index 61ad4841..e27f9d45 100644 --- a/go.mod +++ b/go.mod @@ -32,6 +32,7 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/protobuf v1.5.2 // indirect github.com/klauspost/cpuid/v2 v2.0.12 // indirect github.com/libp2p/go-buffer-pool v0.0.2 // indirect github.com/libp2p/go-openssl v0.0.7 // indirect @@ -52,6 +53,7 @@ require ( golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.1.6 // indirect diff --git a/go.sum b/go.sum index 3aecda9c..84667305 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,10 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +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/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= @@ -178,6 +182,10 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T 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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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/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= diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go index 4a892fdf..d42f22ba 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go @@ -22,34 +22,34 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -type ACLChangeUserPermissions int32 +type ACLChange_UserPermissions int32 const ( - ACLChange_Admin ACLChangeUserPermissions = 0 - ACLChange_Writer ACLChangeUserPermissions = 1 - ACLChange_Reader ACLChangeUserPermissions = 2 - ACLChange_Removed ACLChangeUserPermissions = 3 + ACLChange_Admin ACLChange_UserPermissions = 0 + ACLChange_Writer ACLChange_UserPermissions = 1 + ACLChange_Reader ACLChange_UserPermissions = 2 + ACLChange_Removed ACLChange_UserPermissions = 3 ) -var ACLChangeUserPermissions_name = map[int32]string{ +var ACLChange_UserPermissions_name = map[int32]string{ 0: "Admin", 1: "Writer", 2: "Reader", 3: "Removed", } -var ACLChangeUserPermissions_value = map[string]int32{ +var ACLChange_UserPermissions_value = map[string]int32{ "Admin": 0, "Writer": 1, "Reader": 2, "Removed": 3, } -func (x ACLChangeUserPermissions) String() string { - return proto.EnumName(ACLChangeUserPermissions_name, int32(x)) +func (x ACLChange_UserPermissions) String() string { + return proto.EnumName(ACLChange_UserPermissions_name, int32(x)) } -func (ACLChangeUserPermissions) EnumDescriptor() ([]byte, []int) { +func (ACLChange_UserPermissions) EnumDescriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 0} } @@ -115,10 +115,10 @@ func (m *RawChange) GetId() string { // the element of change tree used to store and internal apply smartBlock history type ACLChange struct { - TreeHeadIds []string `protobuf:"bytes,1,rep,name=treeHeadIds,proto3" json:"treeHeadIds,omitempty"` - AclHeadIds []string `protobuf:"bytes,2,rep,name=aclHeadIds,proto3" json:"aclHeadIds,omitempty"` - SnapshotBaseId string `protobuf:"bytes,3,opt,name=snapshotBaseId,proto3" json:"snapshotBaseId,omitempty"` - AclData *ACLChangeACLData `protobuf:"bytes,4,opt,name=aclData,proto3" json:"aclData,omitempty"` + TreeHeadIds []string `protobuf:"bytes,1,rep,name=treeHeadIds,proto3" json:"treeHeadIds,omitempty"` + AclHeadIds []string `protobuf:"bytes,2,rep,name=aclHeadIds,proto3" json:"aclHeadIds,omitempty"` + SnapshotBaseId string `protobuf:"bytes,3,opt,name=snapshotBaseId,proto3" json:"snapshotBaseId,omitempty"` + AclData *ACLChange_ACLData `protobuf:"bytes,4,opt,name=aclData,proto3" json:"aclData,omitempty"` // the data is encoded with read key and should be read in ChangesData format ChangesData []byte `protobuf:"bytes,5,opt,name=changesData,proto3" json:"changesData,omitempty"` CurrentReadKeyHash uint64 `protobuf:"varint,6,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` @@ -180,7 +180,7 @@ func (m *ACLChange) GetSnapshotBaseId() string { return "" } -func (m *ACLChange) GetAclData() *ACLChangeACLData { +func (m *ACLChange) GetAclData() *ACLChange_ACLData { if m != nil { return m.AclData } @@ -215,29 +215,30 @@ func (m *ACLChange) GetIdentity() string { return "" } -type ACLChangeACLContentValue struct { +type ACLChange_ACLContentValue struct { // Types that are valid to be assigned to Value: - // *ACLChangeACLContentValueValueOfUserAdd - // *ACLChangeACLContentValueValueOfUserRemove - // *ACLChangeACLContentValueValueOfUserPermissionChange - // *ACLChangeACLContentValueValueOfUserInvite - // *ACLChangeACLContentValueValueOfUserJoin - // *ACLChangeACLContentValueValueOfUserConfirm - Value IsACLChangeACLContentValueValue `protobuf_oneof:"value"` + // + // *ACLChange_ACLContent_Value_UserAdd + // *ACLChange_ACLContent_Value_UserRemove + // *ACLChange_ACLContent_Value_UserPermissionChange + // *ACLChange_ACLContent_Value_UserInvite + // *ACLChange_ACLContent_Value_UserJoin + // *ACLChange_ACLContent_Value_UserConfirm + Value isACLChange_ACLContent_Value_Value `protobuf_oneof:"value"` } -func (m *ACLChangeACLContentValue) Reset() { *m = ACLChangeACLContentValue{} } -func (m *ACLChangeACLContentValue) String() string { return proto.CompactTextString(m) } -func (*ACLChangeACLContentValue) ProtoMessage() {} -func (*ACLChangeACLContentValue) Descriptor() ([]byte, []int) { +func (m *ACLChange_ACLContentValue) Reset() { *m = ACLChange_ACLContentValue{} } +func (m *ACLChange_ACLContentValue) String() string { return proto.CompactTextString(m) } +func (*ACLChange_ACLContentValue) ProtoMessage() {} +func (*ACLChange_ACLContentValue) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 0} } -func (m *ACLChangeACLContentValue) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_ACLContentValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeACLContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_ACLContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeACLContentValue.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_ACLContentValue.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -247,128 +248,128 @@ func (m *ACLChangeACLContentValue) XXX_Marshal(b []byte, deterministic bool) ([] return b[:n], nil } } -func (m *ACLChangeACLContentValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeACLContentValue.Merge(m, src) +func (m *ACLChange_ACLContentValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_ACLContentValue.Merge(m, src) } -func (m *ACLChangeACLContentValue) XXX_Size() int { +func (m *ACLChange_ACLContentValue) XXX_Size() int { return m.Size() } -func (m *ACLChangeACLContentValue) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeACLContentValue.DiscardUnknown(m) +func (m *ACLChange_ACLContentValue) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_ACLContentValue.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeACLContentValue proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_ACLContentValue proto.InternalMessageInfo -type IsACLChangeACLContentValueValue interface { - IsACLChangeACLContentValueValue() +type isACLChange_ACLContent_Value_Value interface { + isACLChange_ACLContent_Value_Value() MarshalTo([]byte) (int, error) Size() int } -type ACLChangeACLContentValueValueOfUserAdd struct { - UserAdd *ACLChangeUserAdd `protobuf:"bytes,1,opt,name=userAdd,proto3,oneof" json:"userAdd,omitempty"` +type ACLChange_ACLContent_Value_UserAdd struct { + UserAdd *ACLChange_UserAdd `protobuf:"bytes,1,opt,name=userAdd,proto3,oneof" json:"userAdd,omitempty"` } -type ACLChangeACLContentValueValueOfUserRemove struct { - UserRemove *ACLChangeUserRemove `protobuf:"bytes,2,opt,name=userRemove,proto3,oneof" json:"userRemove,omitempty"` +type ACLChange_ACLContent_Value_UserRemove struct { + UserRemove *ACLChange_UserRemove `protobuf:"bytes,2,opt,name=userRemove,proto3,oneof" json:"userRemove,omitempty"` } -type ACLChangeACLContentValueValueOfUserPermissionChange struct { - UserPermissionChange *ACLChangeUserPermissionChange `protobuf:"bytes,3,opt,name=userPermissionChange,proto3,oneof" json:"userPermissionChange,omitempty"` +type ACLChange_ACLContent_Value_UserPermissionChange struct { + UserPermissionChange *ACLChange_UserPermissionChange `protobuf:"bytes,3,opt,name=userPermissionChange,proto3,oneof" json:"userPermissionChange,omitempty"` } -type ACLChangeACLContentValueValueOfUserInvite struct { - UserInvite *ACLChangeUserInvite `protobuf:"bytes,4,opt,name=userInvite,proto3,oneof" json:"userInvite,omitempty"` +type ACLChange_ACLContent_Value_UserInvite struct { + UserInvite *ACLChange_UserInvite `protobuf:"bytes,4,opt,name=userInvite,proto3,oneof" json:"userInvite,omitempty"` } -type ACLChangeACLContentValueValueOfUserJoin struct { - UserJoin *ACLChangeUserJoin `protobuf:"bytes,5,opt,name=userJoin,proto3,oneof" json:"userJoin,omitempty"` +type ACLChange_ACLContent_Value_UserJoin struct { + UserJoin *ACLChange_UserJoin `protobuf:"bytes,5,opt,name=userJoin,proto3,oneof" json:"userJoin,omitempty"` } -type ACLChangeACLContentValueValueOfUserConfirm struct { - UserConfirm *ACLChangeUserConfirm `protobuf:"bytes,6,opt,name=userConfirm,proto3,oneof" json:"userConfirm,omitempty"` +type ACLChange_ACLContent_Value_UserConfirm struct { + UserConfirm *ACLChange_UserConfirm `protobuf:"bytes,6,opt,name=userConfirm,proto3,oneof" json:"userConfirm,omitempty"` } -func (*ACLChangeACLContentValueValueOfUserAdd) IsACLChangeACLContentValueValue() {} -func (*ACLChangeACLContentValueValueOfUserRemove) IsACLChangeACLContentValueValue() {} -func (*ACLChangeACLContentValueValueOfUserPermissionChange) IsACLChangeACLContentValueValue() {} -func (*ACLChangeACLContentValueValueOfUserInvite) IsACLChangeACLContentValueValue() {} -func (*ACLChangeACLContentValueValueOfUserJoin) IsACLChangeACLContentValueValue() {} -func (*ACLChangeACLContentValueValueOfUserConfirm) IsACLChangeACLContentValueValue() {} +func (*ACLChange_ACLContent_Value_UserAdd) isACLChange_ACLContent_Value_Value() {} +func (*ACLChange_ACLContent_Value_UserRemove) isACLChange_ACLContent_Value_Value() {} +func (*ACLChange_ACLContent_Value_UserPermissionChange) isACLChange_ACLContent_Value_Value() {} +func (*ACLChange_ACLContent_Value_UserInvite) isACLChange_ACLContent_Value_Value() {} +func (*ACLChange_ACLContent_Value_UserJoin) isACLChange_ACLContent_Value_Value() {} +func (*ACLChange_ACLContent_Value_UserConfirm) isACLChange_ACLContent_Value_Value() {} -func (m *ACLChangeACLContentValue) GetValue() IsACLChangeACLContentValueValue { +func (m *ACLChange_ACLContentValue) GetValue() isACLChange_ACLContent_Value_Value { if m != nil { return m.Value } return nil } -func (m *ACLChangeACLContentValue) GetUserAdd() *ACLChangeUserAdd { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserAdd); ok { +func (m *ACLChange_ACLContentValue) GetUserAdd() *ACLChange_UserAdd { + if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserAdd); ok { return x.UserAdd } return nil } -func (m *ACLChangeACLContentValue) GetUserRemove() *ACLChangeUserRemove { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserRemove); ok { +func (m *ACLChange_ACLContentValue) GetUserRemove() *ACLChange_UserRemove { + if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserRemove); ok { return x.UserRemove } return nil } -func (m *ACLChangeACLContentValue) GetUserPermissionChange() *ACLChangeUserPermissionChange { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserPermissionChange); ok { +func (m *ACLChange_ACLContentValue) GetUserPermissionChange() *ACLChange_UserPermissionChange { + if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserPermissionChange); ok { return x.UserPermissionChange } return nil } -func (m *ACLChangeACLContentValue) GetUserInvite() *ACLChangeUserInvite { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserInvite); ok { +func (m *ACLChange_ACLContentValue) GetUserInvite() *ACLChange_UserInvite { + if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserInvite); ok { return x.UserInvite } return nil } -func (m *ACLChangeACLContentValue) GetUserJoin() *ACLChangeUserJoin { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserJoin); ok { +func (m *ACLChange_ACLContentValue) GetUserJoin() *ACLChange_UserJoin { + if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserJoin); ok { return x.UserJoin } return nil } -func (m *ACLChangeACLContentValue) GetUserConfirm() *ACLChangeUserConfirm { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserConfirm); ok { +func (m *ACLChange_ACLContentValue) GetUserConfirm() *ACLChange_UserConfirm { + if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserConfirm); ok { return x.UserConfirm } return nil } // XXX_OneofWrappers is for the internal use of the proto package. -func (*ACLChangeACLContentValue) XXX_OneofWrappers() []interface{} { +func (*ACLChange_ACLContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*ACLChangeACLContentValueValueOfUserAdd)(nil), - (*ACLChangeACLContentValueValueOfUserRemove)(nil), - (*ACLChangeACLContentValueValueOfUserPermissionChange)(nil), - (*ACLChangeACLContentValueValueOfUserInvite)(nil), - (*ACLChangeACLContentValueValueOfUserJoin)(nil), - (*ACLChangeACLContentValueValueOfUserConfirm)(nil), + (*ACLChange_ACLContent_Value_UserAdd)(nil), + (*ACLChange_ACLContent_Value_UserRemove)(nil), + (*ACLChange_ACLContent_Value_UserPermissionChange)(nil), + (*ACLChange_ACLContent_Value_UserInvite)(nil), + (*ACLChange_ACLContent_Value_UserJoin)(nil), + (*ACLChange_ACLContent_Value_UserConfirm)(nil), } } -type ACLChangeACLData struct { - AclSnapshot *ACLChangeACLSnapshot `protobuf:"bytes,1,opt,name=aclSnapshot,proto3" json:"aclSnapshot,omitempty"` - AclContent []*ACLChangeACLContentValue `protobuf:"bytes,2,rep,name=aclContent,proto3" json:"aclContent,omitempty"` +type ACLChange_ACLData struct { + AclSnapshot *ACLChange_ACLSnapshot `protobuf:"bytes,1,opt,name=aclSnapshot,proto3" json:"aclSnapshot,omitempty"` + AclContent []*ACLChange_ACLContentValue `protobuf:"bytes,2,rep,name=aclContent,proto3" json:"aclContent,omitempty"` } -func (m *ACLChangeACLData) Reset() { *m = ACLChangeACLData{} } -func (m *ACLChangeACLData) String() string { return proto.CompactTextString(m) } -func (*ACLChangeACLData) ProtoMessage() {} -func (*ACLChangeACLData) Descriptor() ([]byte, []int) { +func (m *ACLChange_ACLData) Reset() { *m = ACLChange_ACLData{} } +func (m *ACLChange_ACLData) String() string { return proto.CompactTextString(m) } +func (*ACLChange_ACLData) ProtoMessage() {} +func (*ACLChange_ACLData) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 1} } -func (m *ACLChangeACLData) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_ACLData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeACLData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_ACLData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeACLData.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_ACLData.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -378,49 +379,49 @@ func (m *ACLChangeACLData) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *ACLChangeACLData) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeACLData.Merge(m, src) +func (m *ACLChange_ACLData) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_ACLData.Merge(m, src) } -func (m *ACLChangeACLData) XXX_Size() int { +func (m *ACLChange_ACLData) XXX_Size() int { return m.Size() } -func (m *ACLChangeACLData) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeACLData.DiscardUnknown(m) +func (m *ACLChange_ACLData) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_ACLData.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeACLData proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_ACLData proto.InternalMessageInfo -func (m *ACLChangeACLData) GetAclSnapshot() *ACLChangeACLSnapshot { +func (m *ACLChange_ACLData) GetAclSnapshot() *ACLChange_ACLSnapshot { if m != nil { return m.AclSnapshot } return nil } -func (m *ACLChangeACLData) GetAclContent() []*ACLChangeACLContentValue { +func (m *ACLChange_ACLData) GetAclContent() []*ACLChange_ACLContentValue { if m != nil { return m.AclContent } return nil } -type ACLChangeACLSnapshot struct { +type ACLChange_ACLSnapshot struct { // We don't need ACLState as a separate message now, because we simplified the snapshot model - AclState *ACLChangeACLState `protobuf:"bytes,1,opt,name=aclState,proto3" json:"aclState,omitempty"` + AclState *ACLChange_ACLState `protobuf:"bytes,1,opt,name=aclState,proto3" json:"aclState,omitempty"` } -func (m *ACLChangeACLSnapshot) Reset() { *m = ACLChangeACLSnapshot{} } -func (m *ACLChangeACLSnapshot) String() string { return proto.CompactTextString(m) } -func (*ACLChangeACLSnapshot) ProtoMessage() {} -func (*ACLChangeACLSnapshot) Descriptor() ([]byte, []int) { +func (m *ACLChange_ACLSnapshot) Reset() { *m = ACLChange_ACLSnapshot{} } +func (m *ACLChange_ACLSnapshot) String() string { return proto.CompactTextString(m) } +func (*ACLChange_ACLSnapshot) ProtoMessage() {} +func (*ACLChange_ACLSnapshot) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 2} } -func (m *ACLChangeACLSnapshot) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_ACLSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeACLSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_ACLSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeACLSnapshot.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_ACLSnapshot.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -430,43 +431,43 @@ func (m *ACLChangeACLSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *ACLChangeACLSnapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeACLSnapshot.Merge(m, src) +func (m *ACLChange_ACLSnapshot) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_ACLSnapshot.Merge(m, src) } -func (m *ACLChangeACLSnapshot) XXX_Size() int { +func (m *ACLChange_ACLSnapshot) XXX_Size() int { return m.Size() } -func (m *ACLChangeACLSnapshot) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeACLSnapshot.DiscardUnknown(m) +func (m *ACLChange_ACLSnapshot) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_ACLSnapshot.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeACLSnapshot proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_ACLSnapshot proto.InternalMessageInfo -func (m *ACLChangeACLSnapshot) GetAclState() *ACLChangeACLState { +func (m *ACLChange_ACLSnapshot) GetAclState() *ACLChange_ACLState { if m != nil { return m.AclState } return nil } -type ACLChangeACLState struct { - ReadKeyHashes []uint64 `protobuf:"varint,1,rep,packed,name=readKeyHashes,proto3" json:"readKeyHashes,omitempty"` - UserStates []*ACLChangeUserState `protobuf:"bytes,2,rep,name=userStates,proto3" json:"userStates,omitempty"` - Invites map[string]*ACLChangeUserInvite `protobuf:"bytes,3,rep,name=invites,proto3" json:"invites,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +type ACLChange_ACLState struct { + ReadKeyHashes []uint64 `protobuf:"varint,1,rep,packed,name=readKeyHashes,proto3" json:"readKeyHashes,omitempty"` + UserStates []*ACLChange_UserState `protobuf:"bytes,2,rep,name=userStates,proto3" json:"userStates,omitempty"` + Invites map[string]*ACLChange_UserInvite `protobuf:"bytes,3,rep,name=invites,proto3" json:"invites,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *ACLChangeACLState) Reset() { *m = ACLChangeACLState{} } -func (m *ACLChangeACLState) String() string { return proto.CompactTextString(m) } -func (*ACLChangeACLState) ProtoMessage() {} -func (*ACLChangeACLState) Descriptor() ([]byte, []int) { +func (m *ACLChange_ACLState) Reset() { *m = ACLChange_ACLState{} } +func (m *ACLChange_ACLState) String() string { return proto.CompactTextString(m) } +func (*ACLChange_ACLState) ProtoMessage() {} +func (*ACLChange_ACLState) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 3} } -func (m *ACLChangeACLState) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_ACLState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeACLState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_ACLState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeACLState.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_ACLState.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -476,59 +477,59 @@ func (m *ACLChangeACLState) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *ACLChangeACLState) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeACLState.Merge(m, src) +func (m *ACLChange_ACLState) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_ACLState.Merge(m, src) } -func (m *ACLChangeACLState) XXX_Size() int { +func (m *ACLChange_ACLState) XXX_Size() int { return m.Size() } -func (m *ACLChangeACLState) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeACLState.DiscardUnknown(m) +func (m *ACLChange_ACLState) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_ACLState.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeACLState proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_ACLState proto.InternalMessageInfo -func (m *ACLChangeACLState) GetReadKeyHashes() []uint64 { +func (m *ACLChange_ACLState) GetReadKeyHashes() []uint64 { if m != nil { return m.ReadKeyHashes } return nil } -func (m *ACLChangeACLState) GetUserStates() []*ACLChangeUserState { +func (m *ACLChange_ACLState) GetUserStates() []*ACLChange_UserState { if m != nil { return m.UserStates } return nil } -func (m *ACLChangeACLState) GetInvites() map[string]*ACLChangeUserInvite { +func (m *ACLChange_ACLState) GetInvites() map[string]*ACLChange_UserInvite { if m != nil { return m.Invites } return nil } -type ACLChangeUserState struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` - EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` - IsConfirmed bool `protobuf:"varint,5,opt,name=IsConfirmed,proto3" json:"IsConfirmed,omitempty"` +type ACLChange_UserState struct { + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` + EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` + Permissions ACLChange_UserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChange_UserPermissions" json:"permissions,omitempty"` + IsConfirmed bool `protobuf:"varint,5,opt,name=IsConfirmed,proto3" json:"IsConfirmed,omitempty"` } -func (m *ACLChangeUserState) Reset() { *m = ACLChangeUserState{} } -func (m *ACLChangeUserState) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserState) ProtoMessage() {} -func (*ACLChangeUserState) Descriptor() ([]byte, []int) { +func (m *ACLChange_UserState) Reset() { *m = ACLChange_UserState{} } +func (m *ACLChange_UserState) String() string { return proto.CompactTextString(m) } +func (*ACLChange_UserState) ProtoMessage() {} +func (*ACLChange_UserState) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 4} } -func (m *ACLChangeUserState) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_UserState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_UserState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserState.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_UserState.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -538,47 +539,47 @@ func (m *ACLChangeUserState) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *ACLChangeUserState) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserState.Merge(m, src) +func (m *ACLChange_UserState) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_UserState.Merge(m, src) } -func (m *ACLChangeUserState) XXX_Size() int { +func (m *ACLChange_UserState) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserState) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserState.DiscardUnknown(m) +func (m *ACLChange_UserState) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_UserState.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserState proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_UserState proto.InternalMessageInfo -func (m *ACLChangeUserState) GetIdentity() string { +func (m *ACLChange_UserState) GetIdentity() string { if m != nil { return m.Identity } return "" } -func (m *ACLChangeUserState) GetEncryptionKey() []byte { +func (m *ACLChange_UserState) GetEncryptionKey() []byte { if m != nil { return m.EncryptionKey } return nil } -func (m *ACLChangeUserState) GetEncryptedReadKeys() [][]byte { +func (m *ACLChange_UserState) GetEncryptedReadKeys() [][]byte { if m != nil { return m.EncryptedReadKeys } return nil } -func (m *ACLChangeUserState) GetPermissions() ACLChangeUserPermissions { +func (m *ACLChange_UserState) GetPermissions() ACLChange_UserPermissions { if m != nil { return m.Permissions } return ACLChange_Admin } -func (m *ACLChangeUserState) GetIsConfirmed() bool { +func (m *ACLChange_UserState) GetIsConfirmed() bool { if m != nil { return m.IsConfirmed } @@ -586,25 +587,25 @@ func (m *ACLChangeUserState) GetIsConfirmed() bool { } // we already know identity and encryptionKey -type ACLChangeUserAdd struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` - EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` +type ACLChange_UserAdd struct { + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` + EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` + Permissions ACLChange_UserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChange_UserPermissions" json:"permissions,omitempty"` } -func (m *ACLChangeUserAdd) Reset() { *m = ACLChangeUserAdd{} } -func (m *ACLChangeUserAdd) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserAdd) ProtoMessage() {} -func (*ACLChangeUserAdd) Descriptor() ([]byte, []int) { +func (m *ACLChange_UserAdd) Reset() { *m = ACLChange_UserAdd{} } +func (m *ACLChange_UserAdd) String() string { return proto.CompactTextString(m) } +func (*ACLChange_UserAdd) ProtoMessage() {} +func (*ACLChange_UserAdd) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 5} } -func (m *ACLChangeUserAdd) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_UserAdd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserAdd) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_UserAdd) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserAdd.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_UserAdd.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -614,40 +615,40 @@ func (m *ACLChangeUserAdd) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *ACLChangeUserAdd) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserAdd.Merge(m, src) +func (m *ACLChange_UserAdd) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_UserAdd.Merge(m, src) } -func (m *ACLChangeUserAdd) XXX_Size() int { +func (m *ACLChange_UserAdd) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserAdd) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserAdd.DiscardUnknown(m) +func (m *ACLChange_UserAdd) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_UserAdd.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserAdd proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_UserAdd proto.InternalMessageInfo -func (m *ACLChangeUserAdd) GetIdentity() string { +func (m *ACLChange_UserAdd) GetIdentity() string { if m != nil { return m.Identity } return "" } -func (m *ACLChangeUserAdd) GetEncryptionKey() []byte { +func (m *ACLChange_UserAdd) GetEncryptionKey() []byte { if m != nil { return m.EncryptionKey } return nil } -func (m *ACLChangeUserAdd) GetEncryptedReadKeys() [][]byte { +func (m *ACLChange_UserAdd) GetEncryptedReadKeys() [][]byte { if m != nil { return m.EncryptedReadKeys } return nil } -func (m *ACLChangeUserAdd) GetPermissions() ACLChangeUserPermissions { +func (m *ACLChange_UserAdd) GetPermissions() ACLChange_UserPermissions { if m != nil { return m.Permissions } @@ -655,23 +656,23 @@ func (m *ACLChangeUserAdd) GetPermissions() ACLChangeUserPermissions { } // TODO: this is not used as of now -type ACLChangeUserConfirm struct { +type ACLChange_UserConfirm struct { Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` UserAddId string `protobuf:"bytes,2,opt,name=userAddId,proto3" json:"userAddId,omitempty"` } -func (m *ACLChangeUserConfirm) Reset() { *m = ACLChangeUserConfirm{} } -func (m *ACLChangeUserConfirm) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserConfirm) ProtoMessage() {} -func (*ACLChangeUserConfirm) Descriptor() ([]byte, []int) { +func (m *ACLChange_UserConfirm) Reset() { *m = ACLChange_UserConfirm{} } +func (m *ACLChange_UserConfirm) String() string { return proto.CompactTextString(m) } +func (*ACLChange_UserConfirm) ProtoMessage() {} +func (*ACLChange_UserConfirm) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 6} } -func (m *ACLChangeUserConfirm) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_UserConfirm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserConfirm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_UserConfirm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserConfirm.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_UserConfirm.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -681,52 +682,52 @@ func (m *ACLChangeUserConfirm) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *ACLChangeUserConfirm) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserConfirm.Merge(m, src) +func (m *ACLChange_UserConfirm) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_UserConfirm.Merge(m, src) } -func (m *ACLChangeUserConfirm) XXX_Size() int { +func (m *ACLChange_UserConfirm) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserConfirm) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserConfirm.DiscardUnknown(m) +func (m *ACLChange_UserConfirm) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_UserConfirm.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserConfirm proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_UserConfirm proto.InternalMessageInfo -func (m *ACLChangeUserConfirm) GetIdentity() string { +func (m *ACLChange_UserConfirm) GetIdentity() string { if m != nil { return m.Identity } return "" } -func (m *ACLChangeUserConfirm) GetUserAddId() string { +func (m *ACLChange_UserConfirm) GetUserAddId() string { if m != nil { return m.UserAddId } return "" } -type ACLChangeUserInvite struct { - AcceptPublicKey []byte `protobuf:"bytes,1,opt,name=acceptPublicKey,proto3" json:"acceptPublicKey,omitempty"` - EncryptPublicKey []byte `protobuf:"bytes,2,opt,name=encryptPublicKey,proto3" json:"encryptPublicKey,omitempty"` - EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` - InviteId string `protobuf:"bytes,5,opt,name=InviteId,proto3" json:"InviteId,omitempty"` +type ACLChange_UserInvite struct { + AcceptPublicKey []byte `protobuf:"bytes,1,opt,name=acceptPublicKey,proto3" json:"acceptPublicKey,omitempty"` + EncryptPublicKey []byte `protobuf:"bytes,2,opt,name=encryptPublicKey,proto3" json:"encryptPublicKey,omitempty"` + EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` + Permissions ACLChange_UserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChange_UserPermissions" json:"permissions,omitempty"` + InviteId string `protobuf:"bytes,5,opt,name=InviteId,proto3" json:"InviteId,omitempty"` } -func (m *ACLChangeUserInvite) Reset() { *m = ACLChangeUserInvite{} } -func (m *ACLChangeUserInvite) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserInvite) ProtoMessage() {} -func (*ACLChangeUserInvite) Descriptor() ([]byte, []int) { +func (m *ACLChange_UserInvite) Reset() { *m = ACLChange_UserInvite{} } +func (m *ACLChange_UserInvite) String() string { return proto.CompactTextString(m) } +func (*ACLChange_UserInvite) ProtoMessage() {} +func (*ACLChange_UserInvite) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 7} } -func (m *ACLChangeUserInvite) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_UserInvite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserInvite) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_UserInvite) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserInvite.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_UserInvite.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -736,54 +737,54 @@ func (m *ACLChangeUserInvite) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *ACLChangeUserInvite) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserInvite.Merge(m, src) +func (m *ACLChange_UserInvite) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_UserInvite.Merge(m, src) } -func (m *ACLChangeUserInvite) XXX_Size() int { +func (m *ACLChange_UserInvite) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserInvite) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserInvite.DiscardUnknown(m) +func (m *ACLChange_UserInvite) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_UserInvite.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserInvite proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_UserInvite proto.InternalMessageInfo -func (m *ACLChangeUserInvite) GetAcceptPublicKey() []byte { +func (m *ACLChange_UserInvite) GetAcceptPublicKey() []byte { if m != nil { return m.AcceptPublicKey } return nil } -func (m *ACLChangeUserInvite) GetEncryptPublicKey() []byte { +func (m *ACLChange_UserInvite) GetEncryptPublicKey() []byte { if m != nil { return m.EncryptPublicKey } return nil } -func (m *ACLChangeUserInvite) GetEncryptedReadKeys() [][]byte { +func (m *ACLChange_UserInvite) GetEncryptedReadKeys() [][]byte { if m != nil { return m.EncryptedReadKeys } return nil } -func (m *ACLChangeUserInvite) GetPermissions() ACLChangeUserPermissions { +func (m *ACLChange_UserInvite) GetPermissions() ACLChange_UserPermissions { if m != nil { return m.Permissions } return ACLChange_Admin } -func (m *ACLChangeUserInvite) GetInviteId() string { +func (m *ACLChange_UserInvite) GetInviteId() string { if m != nil { return m.InviteId } return "" } -type ACLChangeUserJoin struct { +type ACLChange_UserJoin struct { Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` AcceptSignature []byte `protobuf:"bytes,3,opt,name=acceptSignature,proto3" json:"acceptSignature,omitempty"` @@ -791,18 +792,18 @@ type ACLChangeUserJoin struct { EncryptedReadKeys [][]byte `protobuf:"bytes,5,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` } -func (m *ACLChangeUserJoin) Reset() { *m = ACLChangeUserJoin{} } -func (m *ACLChangeUserJoin) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserJoin) ProtoMessage() {} -func (*ACLChangeUserJoin) Descriptor() ([]byte, []int) { +func (m *ACLChange_UserJoin) Reset() { *m = ACLChange_UserJoin{} } +func (m *ACLChange_UserJoin) String() string { return proto.CompactTextString(m) } +func (*ACLChange_UserJoin) ProtoMessage() {} +func (*ACLChange_UserJoin) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 8} } -func (m *ACLChangeUserJoin) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_UserJoin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserJoin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_UserJoin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserJoin.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_UserJoin.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -812,70 +813,70 @@ func (m *ACLChangeUserJoin) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *ACLChangeUserJoin) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserJoin.Merge(m, src) +func (m *ACLChange_UserJoin) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_UserJoin.Merge(m, src) } -func (m *ACLChangeUserJoin) XXX_Size() int { +func (m *ACLChange_UserJoin) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserJoin) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserJoin.DiscardUnknown(m) +func (m *ACLChange_UserJoin) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_UserJoin.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserJoin proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_UserJoin proto.InternalMessageInfo -func (m *ACLChangeUserJoin) GetIdentity() string { +func (m *ACLChange_UserJoin) GetIdentity() string { if m != nil { return m.Identity } return "" } -func (m *ACLChangeUserJoin) GetEncryptionKey() []byte { +func (m *ACLChange_UserJoin) GetEncryptionKey() []byte { if m != nil { return m.EncryptionKey } return nil } -func (m *ACLChangeUserJoin) GetAcceptSignature() []byte { +func (m *ACLChange_UserJoin) GetAcceptSignature() []byte { if m != nil { return m.AcceptSignature } return nil } -func (m *ACLChangeUserJoin) GetUserInviteId() string { +func (m *ACLChange_UserJoin) GetUserInviteId() string { if m != nil { return m.UserInviteId } return "" } -func (m *ACLChangeUserJoin) GetEncryptedReadKeys() [][]byte { +func (m *ACLChange_UserJoin) GetEncryptedReadKeys() [][]byte { if m != nil { return m.EncryptedReadKeys } return nil } -type ACLChangeUserRemove struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - ReadKeyReplaces []*ACLChangeReadKeyReplace `protobuf:"bytes,3,rep,name=readKeyReplaces,proto3" json:"readKeyReplaces,omitempty"` +type ACLChange_UserRemove struct { + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + ReadKeyReplaces []*ACLChange_ReadKeyReplace `protobuf:"bytes,3,rep,name=readKeyReplaces,proto3" json:"readKeyReplaces,omitempty"` } -func (m *ACLChangeUserRemove) Reset() { *m = ACLChangeUserRemove{} } -func (m *ACLChangeUserRemove) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserRemove) ProtoMessage() {} -func (*ACLChangeUserRemove) Descriptor() ([]byte, []int) { +func (m *ACLChange_UserRemove) Reset() { *m = ACLChange_UserRemove{} } +func (m *ACLChange_UserRemove) String() string { return proto.CompactTextString(m) } +func (*ACLChange_UserRemove) ProtoMessage() {} +func (*ACLChange_UserRemove) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 9} } -func (m *ACLChangeUserRemove) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_UserRemove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserRemove) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_UserRemove) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserRemove.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_UserRemove.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -885,50 +886,50 @@ func (m *ACLChangeUserRemove) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *ACLChangeUserRemove) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserRemove.Merge(m, src) +func (m *ACLChange_UserRemove) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_UserRemove.Merge(m, src) } -func (m *ACLChangeUserRemove) XXX_Size() int { +func (m *ACLChange_UserRemove) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserRemove) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserRemove.DiscardUnknown(m) +func (m *ACLChange_UserRemove) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_UserRemove.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserRemove proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_UserRemove proto.InternalMessageInfo -func (m *ACLChangeUserRemove) GetIdentity() string { +func (m *ACLChange_UserRemove) GetIdentity() string { if m != nil { return m.Identity } return "" } -func (m *ACLChangeUserRemove) GetReadKeyReplaces() []*ACLChangeReadKeyReplace { +func (m *ACLChange_UserRemove) GetReadKeyReplaces() []*ACLChange_ReadKeyReplace { if m != nil { return m.ReadKeyReplaces } return nil } -type ACLChangeReadKeyReplace struct { +type ACLChange_ReadKeyReplace struct { Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKey []byte `protobuf:"bytes,3,opt,name=encryptedReadKey,proto3" json:"encryptedReadKey,omitempty"` } -func (m *ACLChangeReadKeyReplace) Reset() { *m = ACLChangeReadKeyReplace{} } -func (m *ACLChangeReadKeyReplace) String() string { return proto.CompactTextString(m) } -func (*ACLChangeReadKeyReplace) ProtoMessage() {} -func (*ACLChangeReadKeyReplace) Descriptor() ([]byte, []int) { +func (m *ACLChange_ReadKeyReplace) Reset() { *m = ACLChange_ReadKeyReplace{} } +func (m *ACLChange_ReadKeyReplace) String() string { return proto.CompactTextString(m) } +func (*ACLChange_ReadKeyReplace) ProtoMessage() {} +func (*ACLChange_ReadKeyReplace) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 10} } -func (m *ACLChangeReadKeyReplace) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_ReadKeyReplace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeReadKeyReplace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_ReadKeyReplace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeReadKeyReplace.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_ReadKeyReplace.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -938,56 +939,56 @@ func (m *ACLChangeReadKeyReplace) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *ACLChangeReadKeyReplace) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeReadKeyReplace.Merge(m, src) +func (m *ACLChange_ReadKeyReplace) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_ReadKeyReplace.Merge(m, src) } -func (m *ACLChangeReadKeyReplace) XXX_Size() int { +func (m *ACLChange_ReadKeyReplace) XXX_Size() int { return m.Size() } -func (m *ACLChangeReadKeyReplace) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeReadKeyReplace.DiscardUnknown(m) +func (m *ACLChange_ReadKeyReplace) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_ReadKeyReplace.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeReadKeyReplace proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_ReadKeyReplace proto.InternalMessageInfo -func (m *ACLChangeReadKeyReplace) GetIdentity() string { +func (m *ACLChange_ReadKeyReplace) GetIdentity() string { if m != nil { return m.Identity } return "" } -func (m *ACLChangeReadKeyReplace) GetEncryptionKey() []byte { +func (m *ACLChange_ReadKeyReplace) GetEncryptionKey() []byte { if m != nil { return m.EncryptionKey } return nil } -func (m *ACLChangeReadKeyReplace) GetEncryptedReadKey() []byte { +func (m *ACLChange_ReadKeyReplace) GetEncryptedReadKey() []byte { if m != nil { return m.EncryptedReadKey } return nil } -type ACLChangeUserPermissionChange struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,2,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` +type ACLChange_UserPermissionChange struct { + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Permissions ACLChange_UserPermissions `protobuf:"varint,2,opt,name=permissions,proto3,enum=acl.ACLChange_UserPermissions" json:"permissions,omitempty"` } -func (m *ACLChangeUserPermissionChange) Reset() { *m = ACLChangeUserPermissionChange{} } -func (m *ACLChangeUserPermissionChange) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserPermissionChange) ProtoMessage() {} -func (*ACLChangeUserPermissionChange) Descriptor() ([]byte, []int) { +func (m *ACLChange_UserPermissionChange) Reset() { *m = ACLChange_UserPermissionChange{} } +func (m *ACLChange_UserPermissionChange) String() string { return proto.CompactTextString(m) } +func (*ACLChange_UserPermissionChange) ProtoMessage() {} +func (*ACLChange_UserPermissionChange) Descriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{1, 11} } -func (m *ACLChangeUserPermissionChange) XXX_Unmarshal(b []byte) error { +func (m *ACLChange_UserPermissionChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserPermissionChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLChange_UserPermissionChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserPermissionChange.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLChange_UserPermissionChange.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -997,26 +998,26 @@ func (m *ACLChangeUserPermissionChange) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } -func (m *ACLChangeUserPermissionChange) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserPermissionChange.Merge(m, src) +func (m *ACLChange_UserPermissionChange) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLChange_UserPermissionChange.Merge(m, src) } -func (m *ACLChangeUserPermissionChange) XXX_Size() int { +func (m *ACLChange_UserPermissionChange) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserPermissionChange) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserPermissionChange.DiscardUnknown(m) +func (m *ACLChange_UserPermissionChange) XXX_DiscardUnknown() { + xxx_messageInfo_ACLChange_UserPermissionChange.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserPermissionChange proto.InternalMessageInfo +var xxx_messageInfo_ACLChange_UserPermissionChange proto.InternalMessageInfo -func (m *ACLChangeUserPermissionChange) GetIdentity() string { +func (m *ACLChange_UserPermissionChange) GetIdentity() string { if m != nil { return m.Identity } return "" } -func (m *ACLChangeUserPermissionChange) GetPermissions() ACLChangeUserPermissions { +func (m *ACLChange_UserPermissionChange) GetPermissions() ACLChange_UserPermissions { if m != nil { return m.Permissions } @@ -1024,22 +1025,22 @@ func (m *ACLChangeUserPermissionChange) GetPermissions() ACLChangeUserPermission } func init() { - proto.RegisterEnum("acl.ACLChangeUserPermissions", ACLChangeUserPermissions_name, ACLChangeUserPermissions_value) + proto.RegisterEnum("acl.ACLChange_UserPermissions", ACLChange_UserPermissions_name, ACLChange_UserPermissions_value) proto.RegisterType((*RawChange)(nil), "acl.RawChange") proto.RegisterType((*ACLChange)(nil), "acl.ACLChange") - proto.RegisterType((*ACLChangeACLContentValue)(nil), "acl.ACLChange.ACLContentValue") - proto.RegisterType((*ACLChangeACLData)(nil), "acl.ACLChange.ACLData") - proto.RegisterType((*ACLChangeACLSnapshot)(nil), "acl.ACLChange.ACLSnapshot") - proto.RegisterType((*ACLChangeACLState)(nil), "acl.ACLChange.ACLState") - proto.RegisterMapType((map[string]*ACLChangeUserInvite)(nil), "acl.ACLChange.ACLState.InvitesEntry") - proto.RegisterType((*ACLChangeUserState)(nil), "acl.ACLChange.UserState") - proto.RegisterType((*ACLChangeUserAdd)(nil), "acl.ACLChange.UserAdd") - proto.RegisterType((*ACLChangeUserConfirm)(nil), "acl.ACLChange.UserConfirm") - proto.RegisterType((*ACLChangeUserInvite)(nil), "acl.ACLChange.UserInvite") - proto.RegisterType((*ACLChangeUserJoin)(nil), "acl.ACLChange.UserJoin") - proto.RegisterType((*ACLChangeUserRemove)(nil), "acl.ACLChange.UserRemove") - proto.RegisterType((*ACLChangeReadKeyReplace)(nil), "acl.ACLChange.ReadKeyReplace") - proto.RegisterType((*ACLChangeUserPermissionChange)(nil), "acl.ACLChange.UserPermissionChange") + proto.RegisterType((*ACLChange_ACLContentValue)(nil), "acl.ACLChange.ACLContentValue") + proto.RegisterType((*ACLChange_ACLData)(nil), "acl.ACLChange.ACLData") + proto.RegisterType((*ACLChange_ACLSnapshot)(nil), "acl.ACLChange.ACLSnapshot") + proto.RegisterType((*ACLChange_ACLState)(nil), "acl.ACLChange.ACLState") + proto.RegisterMapType((map[string]*ACLChange_UserInvite)(nil), "acl.ACLChange.ACLState.InvitesEntry") + proto.RegisterType((*ACLChange_UserState)(nil), "acl.ACLChange.UserState") + proto.RegisterType((*ACLChange_UserAdd)(nil), "acl.ACLChange.UserAdd") + proto.RegisterType((*ACLChange_UserConfirm)(nil), "acl.ACLChange.UserConfirm") + proto.RegisterType((*ACLChange_UserInvite)(nil), "acl.ACLChange.UserInvite") + proto.RegisterType((*ACLChange_UserJoin)(nil), "acl.ACLChange.UserJoin") + proto.RegisterType((*ACLChange_UserRemove)(nil), "acl.ACLChange.UserRemove") + proto.RegisterType((*ACLChange_ReadKeyReplace)(nil), "acl.ACLChange.ReadKeyReplace") + proto.RegisterType((*ACLChange_UserPermissionChange)(nil), "acl.ACLChange.UserPermissionChange") } func init() { @@ -1238,7 +1239,7 @@ func (m *ACLChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValue) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_ACLContentValue) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1248,12 +1249,12 @@ func (m *ACLChangeACLContentValue) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeACLContentValue) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1270,12 +1271,12 @@ func (m *ACLChangeACLContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserAdd) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserAdd) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserAdd != nil { { @@ -1291,12 +1292,12 @@ func (m *ACLChangeACLContentValueValueOfUserAdd) MarshalToSizedBuffer(dAtA []byt } return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserRemove) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserRemove) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserRemove != nil { { @@ -1312,12 +1313,12 @@ func (m *ACLChangeACLContentValueValueOfUserRemove) MarshalToSizedBuffer(dAtA [] } return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserPermissionChange) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserPermissionChange) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserPermissionChange != nil { { @@ -1333,12 +1334,12 @@ func (m *ACLChangeACLContentValueValueOfUserPermissionChange) MarshalToSizedBuff } return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserInvite) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserInvite) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserInvite != nil { { @@ -1354,12 +1355,12 @@ func (m *ACLChangeACLContentValueValueOfUserInvite) MarshalToSizedBuffer(dAtA [] } return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserJoin) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserJoin) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserJoin != nil { { @@ -1375,12 +1376,12 @@ func (m *ACLChangeACLContentValueValueOfUserJoin) MarshalToSizedBuffer(dAtA []by } return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserConfirm) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserConfirm) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContent_Value_UserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserConfirm != nil { { @@ -1396,7 +1397,7 @@ func (m *ACLChangeACLContentValueValueOfUserConfirm) MarshalToSizedBuffer(dAtA [ } return len(dAtA) - i, nil } -func (m *ACLChangeACLData) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_ACLData) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1406,12 +1407,12 @@ func (m *ACLChangeACLData) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeACLData) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLData) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLData) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLData) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1445,7 +1446,7 @@ func (m *ACLChangeACLData) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeACLSnapshot) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_ACLSnapshot) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1455,12 +1456,12 @@ func (m *ACLChangeACLSnapshot) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeACLSnapshot) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLSnapshot) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1480,7 +1481,7 @@ func (m *ACLChangeACLSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeACLState) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_ACLState) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1490,12 +1491,12 @@ func (m *ACLChangeACLState) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeACLState) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLState) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLState) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1561,7 +1562,7 @@ func (m *ACLChangeACLState) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeUserState) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_UserState) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1571,12 +1572,12 @@ func (m *ACLChangeUserState) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserState) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_UserState) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserState) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_UserState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1622,7 +1623,7 @@ func (m *ACLChangeUserState) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeUserAdd) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_UserAdd) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1632,12 +1633,12 @@ func (m *ACLChangeUserAdd) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserAdd) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_UserAdd) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_UserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1673,7 +1674,7 @@ func (m *ACLChangeUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeUserConfirm) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_UserConfirm) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1683,12 +1684,12 @@ func (m *ACLChangeUserConfirm) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserConfirm) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_UserConfirm) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_UserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1710,7 +1711,7 @@ func (m *ACLChangeUserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeUserInvite) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_UserInvite) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1720,12 +1721,12 @@ func (m *ACLChangeUserInvite) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserInvite) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_UserInvite) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_UserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1768,7 +1769,7 @@ func (m *ACLChangeUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeUserJoin) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_UserJoin) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1778,12 +1779,12 @@ func (m *ACLChangeUserJoin) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserJoin) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_UserJoin) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_UserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1828,7 +1829,7 @@ func (m *ACLChangeUserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeUserRemove) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_UserRemove) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1838,12 +1839,12 @@ func (m *ACLChangeUserRemove) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserRemove) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_UserRemove) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_UserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1872,7 +1873,7 @@ func (m *ACLChangeUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeReadKeyReplace) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_ReadKeyReplace) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1882,12 +1883,12 @@ func (m *ACLChangeReadKeyReplace) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeReadKeyReplace) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ReadKeyReplace) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeReadKeyReplace) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ReadKeyReplace) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1916,7 +1917,7 @@ func (m *ACLChangeReadKeyReplace) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *ACLChangeUserPermissionChange) Marshal() (dAtA []byte, err error) { +func (m *ACLChange_UserPermissionChange) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1926,12 +1927,12 @@ func (m *ACLChangeUserPermissionChange) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserPermissionChange) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_UserPermissionChange) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_UserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2026,7 +2027,7 @@ func (m *ACLChange) Size() (n int) { return n } -func (m *ACLChangeACLContentValue) Size() (n int) { +func (m *ACLChange_ACLContentValue) Size() (n int) { if m == nil { return 0 } @@ -2038,7 +2039,7 @@ func (m *ACLChangeACLContentValue) Size() (n int) { return n } -func (m *ACLChangeACLContentValueValueOfUserAdd) Size() (n int) { +func (m *ACLChange_ACLContent_Value_UserAdd) Size() (n int) { if m == nil { return 0 } @@ -2050,7 +2051,7 @@ func (m *ACLChangeACLContentValueValueOfUserAdd) Size() (n int) { } return n } -func (m *ACLChangeACLContentValueValueOfUserRemove) Size() (n int) { +func (m *ACLChange_ACLContent_Value_UserRemove) Size() (n int) { if m == nil { return 0 } @@ -2062,7 +2063,7 @@ func (m *ACLChangeACLContentValueValueOfUserRemove) Size() (n int) { } return n } -func (m *ACLChangeACLContentValueValueOfUserPermissionChange) Size() (n int) { +func (m *ACLChange_ACLContent_Value_UserPermissionChange) Size() (n int) { if m == nil { return 0 } @@ -2074,7 +2075,7 @@ func (m *ACLChangeACLContentValueValueOfUserPermissionChange) Size() (n int) { } return n } -func (m *ACLChangeACLContentValueValueOfUserInvite) Size() (n int) { +func (m *ACLChange_ACLContent_Value_UserInvite) Size() (n int) { if m == nil { return 0 } @@ -2086,7 +2087,7 @@ func (m *ACLChangeACLContentValueValueOfUserInvite) Size() (n int) { } return n } -func (m *ACLChangeACLContentValueValueOfUserJoin) Size() (n int) { +func (m *ACLChange_ACLContent_Value_UserJoin) Size() (n int) { if m == nil { return 0 } @@ -2098,7 +2099,7 @@ func (m *ACLChangeACLContentValueValueOfUserJoin) Size() (n int) { } return n } -func (m *ACLChangeACLContentValueValueOfUserConfirm) Size() (n int) { +func (m *ACLChange_ACLContent_Value_UserConfirm) Size() (n int) { if m == nil { return 0 } @@ -2110,7 +2111,7 @@ func (m *ACLChangeACLContentValueValueOfUserConfirm) Size() (n int) { } return n } -func (m *ACLChangeACLData) Size() (n int) { +func (m *ACLChange_ACLData) Size() (n int) { if m == nil { return 0 } @@ -2129,7 +2130,7 @@ func (m *ACLChangeACLData) Size() (n int) { return n } -func (m *ACLChangeACLSnapshot) Size() (n int) { +func (m *ACLChange_ACLSnapshot) Size() (n int) { if m == nil { return 0 } @@ -2142,7 +2143,7 @@ func (m *ACLChangeACLSnapshot) Size() (n int) { return n } -func (m *ACLChangeACLState) Size() (n int) { +func (m *ACLChange_ACLState) Size() (n int) { if m == nil { return 0 } @@ -2177,7 +2178,7 @@ func (m *ACLChangeACLState) Size() (n int) { return n } -func (m *ACLChangeUserState) Size() (n int) { +func (m *ACLChange_UserState) Size() (n int) { if m == nil { return 0 } @@ -2206,7 +2207,7 @@ func (m *ACLChangeUserState) Size() (n int) { return n } -func (m *ACLChangeUserAdd) Size() (n int) { +func (m *ACLChange_UserAdd) Size() (n int) { if m == nil { return 0 } @@ -2232,7 +2233,7 @@ func (m *ACLChangeUserAdd) Size() (n int) { return n } -func (m *ACLChangeUserConfirm) Size() (n int) { +func (m *ACLChange_UserConfirm) Size() (n int) { if m == nil { return 0 } @@ -2249,7 +2250,7 @@ func (m *ACLChangeUserConfirm) Size() (n int) { return n } -func (m *ACLChangeUserInvite) Size() (n int) { +func (m *ACLChange_UserInvite) Size() (n int) { if m == nil { return 0 } @@ -2279,7 +2280,7 @@ func (m *ACLChangeUserInvite) Size() (n int) { return n } -func (m *ACLChangeUserJoin) Size() (n int) { +func (m *ACLChange_UserJoin) Size() (n int) { if m == nil { return 0 } @@ -2310,7 +2311,7 @@ func (m *ACLChangeUserJoin) Size() (n int) { return n } -func (m *ACLChangeUserRemove) Size() (n int) { +func (m *ACLChange_UserRemove) Size() (n int) { if m == nil { return 0 } @@ -2329,7 +2330,7 @@ func (m *ACLChangeUserRemove) Size() (n int) { return n } -func (m *ACLChangeReadKeyReplace) Size() (n int) { +func (m *ACLChange_ReadKeyReplace) Size() (n int) { if m == nil { return 0 } @@ -2350,7 +2351,7 @@ func (m *ACLChangeReadKeyReplace) Size() (n int) { return n } -func (m *ACLChangeUserPermissionChange) Size() (n int) { +func (m *ACLChange_UserPermissionChange) Size() (n int) { if m == nil { return 0 } @@ -2677,7 +2678,7 @@ func (m *ACLChange) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.AclData == nil { - m.AclData = &ACLChangeACLData{} + m.AclData = &ACLChange_ACLData{} } if err := m.AclData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2808,7 +2809,7 @@ func (m *ACLChange) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { +func (m *ACLChange_ACLContentValue) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2866,11 +2867,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserAdd{} + v := &ACLChange_UserAdd{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserAdd{v} + m.Value = &ACLChange_ACLContent_Value_UserAdd{v} iNdEx = postIndex case 2: if wireType != 2 { @@ -2901,11 +2902,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserRemove{} + v := &ACLChange_UserRemove{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserRemove{v} + m.Value = &ACLChange_ACLContent_Value_UserRemove{v} iNdEx = postIndex case 3: if wireType != 2 { @@ -2936,11 +2937,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserPermissionChange{} + v := &ACLChange_UserPermissionChange{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserPermissionChange{v} + m.Value = &ACLChange_ACLContent_Value_UserPermissionChange{v} iNdEx = postIndex case 4: if wireType != 2 { @@ -2971,11 +2972,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserInvite{} + v := &ACLChange_UserInvite{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserInvite{v} + m.Value = &ACLChange_ACLContent_Value_UserInvite{v} iNdEx = postIndex case 5: if wireType != 2 { @@ -3006,11 +3007,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserJoin{} + v := &ACLChange_UserJoin{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserJoin{v} + m.Value = &ACLChange_ACLContent_Value_UserJoin{v} iNdEx = postIndex case 6: if wireType != 2 { @@ -3041,11 +3042,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserConfirm{} + v := &ACLChange_UserConfirm{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserConfirm{v} + m.Value = &ACLChange_ACLContent_Value_UserConfirm{v} iNdEx = postIndex default: iNdEx = preIndex @@ -3068,7 +3069,7 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeACLData) Unmarshal(dAtA []byte) error { +func (m *ACLChange_ACLData) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3127,7 +3128,7 @@ func (m *ACLChangeACLData) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.AclSnapshot == nil { - m.AclSnapshot = &ACLChangeACLSnapshot{} + m.AclSnapshot = &ACLChange_ACLSnapshot{} } if err := m.AclSnapshot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3162,7 +3163,7 @@ func (m *ACLChangeACLData) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AclContent = append(m.AclContent, &ACLChangeACLContentValue{}) + m.AclContent = append(m.AclContent, &ACLChange_ACLContentValue{}) if err := m.AclContent[len(m.AclContent)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -3188,7 +3189,7 @@ func (m *ACLChangeACLData) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeACLSnapshot) Unmarshal(dAtA []byte) error { +func (m *ACLChange_ACLSnapshot) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3247,7 +3248,7 @@ func (m *ACLChangeACLSnapshot) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.AclState == nil { - m.AclState = &ACLChangeACLState{} + m.AclState = &ACLChange_ACLState{} } if err := m.AclState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3274,7 +3275,7 @@ func (m *ACLChangeACLSnapshot) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeACLState) Unmarshal(dAtA []byte) error { +func (m *ACLChange_ACLState) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3408,7 +3409,7 @@ func (m *ACLChangeACLState) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.UserStates = append(m.UserStates, &ACLChangeUserState{}) + m.UserStates = append(m.UserStates, &ACLChange_UserState{}) if err := m.UserStates[len(m.UserStates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -3443,10 +3444,10 @@ func (m *ACLChangeACLState) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Invites == nil { - m.Invites = make(map[string]*ACLChangeUserInvite) + m.Invites = make(map[string]*ACLChange_UserInvite) } var mapkey string - var mapvalue *ACLChangeUserInvite + var mapvalue *ACLChange_UserInvite for iNdEx < postIndex { entryPreIndex := iNdEx var wire uint64 @@ -3520,7 +3521,7 @@ func (m *ACLChangeACLState) Unmarshal(dAtA []byte) error { if postmsgIndex > l { return io.ErrUnexpectedEOF } - mapvalue = &ACLChangeUserInvite{} + mapvalue = &ACLChange_UserInvite{} if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { return err } @@ -3563,7 +3564,7 @@ func (m *ACLChangeACLState) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserState) Unmarshal(dAtA []byte) error { +func (m *ACLChange_UserState) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3704,7 +3705,7 @@ func (m *ACLChangeUserState) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Permissions |= ACLChangeUserPermissions(b&0x7F) << shift + m.Permissions |= ACLChange_UserPermissions(b&0x7F) << shift if b < 0x80 { break } @@ -3750,7 +3751,7 @@ func (m *ACLChangeUserState) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserAdd) Unmarshal(dAtA []byte) error { +func (m *ACLChange_UserAdd) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3891,7 +3892,7 @@ func (m *ACLChangeUserAdd) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Permissions |= ACLChangeUserPermissions(b&0x7F) << shift + m.Permissions |= ACLChange_UserPermissions(b&0x7F) << shift if b < 0x80 { break } @@ -3917,7 +3918,7 @@ func (m *ACLChangeUserAdd) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserConfirm) Unmarshal(dAtA []byte) error { +func (m *ACLChange_UserConfirm) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4031,7 +4032,7 @@ func (m *ACLChangeUserConfirm) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserInvite) Unmarshal(dAtA []byte) error { +func (m *ACLChange_UserInvite) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4174,7 +4175,7 @@ func (m *ACLChangeUserInvite) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Permissions |= ACLChangeUserPermissions(b&0x7F) << shift + m.Permissions |= ACLChange_UserPermissions(b&0x7F) << shift if b < 0x80 { break } @@ -4232,7 +4233,7 @@ func (m *ACLChangeUserInvite) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserJoin) Unmarshal(dAtA []byte) error { +func (m *ACLChange_UserJoin) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4446,7 +4447,7 @@ func (m *ACLChangeUserJoin) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserRemove) Unmarshal(dAtA []byte) error { +func (m *ACLChange_UserRemove) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4536,7 +4537,7 @@ func (m *ACLChangeUserRemove) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ReadKeyReplaces = append(m.ReadKeyReplaces, &ACLChangeReadKeyReplace{}) + m.ReadKeyReplaces = append(m.ReadKeyReplaces, &ACLChange_ReadKeyReplace{}) if err := m.ReadKeyReplaces[len(m.ReadKeyReplaces)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -4562,7 +4563,7 @@ func (m *ACLChangeUserRemove) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeReadKeyReplace) Unmarshal(dAtA []byte) error { +func (m *ACLChange_ReadKeyReplace) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4712,7 +4713,7 @@ func (m *ACLChangeReadKeyReplace) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserPermissionChange) Unmarshal(dAtA []byte) error { +func (m *ACLChange_UserPermissionChange) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4787,7 +4788,7 @@ func (m *ACLChangeUserPermissionChange) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Permissions |= ACLChangeUserPermissions(b&0x7F) << shift + m.Permissions |= ACLChange_UserPermissions(b&0x7F) << shift if b < 0x80 { break } diff --git a/pkg/acl/acltree/aclstate.go b/pkg/acl/acltree/aclstate.go index a7443f69..d28d59b2 100644 --- a/pkg/acl/acltree/aclstate.go +++ b/pkg/acl/acltree/aclstate.go @@ -20,8 +20,8 @@ var ErrUserAlreadyExists = errors.New("user already exists") type ACLState struct { currentReadKeyHash uint64 userReadKeys map[uint64]*symmetric.Key - userStates map[string]*aclpb.ACLChangeUserState - userInvites map[string]*aclpb.ACLChangeUserInvite + userStates map[string]*aclpb.ACLChange_UserState + userInvites map[string]*aclpb.ACLChange_UserInvite signingPubKeyDecoder signingkey.PubKeyDecoder encryptionKey encryptionkey.PrivKey identity string @@ -35,8 +35,8 @@ func newACLState( identity: identity, encryptionKey: encryptionKey, userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclpb.ACLChangeUserState), - userInvites: make(map[string]*aclpb.ACLChangeUserInvite), + userStates: make(map[string]*aclpb.ACLChange_UserState), + userInvites: make(map[string]*aclpb.ACLChange_UserInvite), signingPubKeyDecoder: signingPubKeyDecoder, } } @@ -50,8 +50,8 @@ func newACLStateFromSnapshotChange( identity: identity, encryptionKey: encryptionKey, userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclpb.ACLChangeUserState), - userInvites: make(map[string]*aclpb.ACLChangeUserInvite), + userStates: make(map[string]*aclpb.ACLChange_UserState), + userInvites: make(map[string]*aclpb.ACLChange_UserInvite), signingPubKeyDecoder: signingPubKeyDecoder, } err := st.recreateFromSnapshotChange(snapshotChange) @@ -90,13 +90,13 @@ func (st *ACLState) recreateFromSnapshotChange(snapshotChange *aclpb.ACLChange) return nil } -func (st *ACLState) makeSnapshot() *aclpb.ACLChangeACLSnapshot { - var userStates []*aclpb.ACLChangeUserState +func (st *ACLState) makeSnapshot() *aclpb.ACLChange_ACLSnapshot { + var userStates []*aclpb.ACLChange_UserState for _, st := range st.userStates { userStates = append(userStates, st) } - return &aclpb.ACLChangeACLSnapshot{AclState: &aclpb.ACLChangeACLState{ + return &aclpb.ACLChange_ACLSnapshot{AclState: &aclpb.ACLChange_ACLState{ ReadKeyHashes: nil, UserStates: userStates, // TODO: make states and invites in same format Invites: st.userInvites, @@ -138,7 +138,7 @@ func (st *ACLState) applyChange(change *aclpb.ACLChange) (err error) { } // TODO: remove changeId, because it is not needed -func (st *ACLState) applyChangeContent(ch *aclpb.ACLChangeACLContentValue) error { +func (st *ACLState) applyChangeContent(ch *aclpb.ACLChange_ACLContentValue) error { switch { case ch.GetUserPermissionChange() != nil: return st.applyUserPermissionChange(ch.GetUserPermissionChange()) @@ -157,7 +157,7 @@ func (st *ACLState) applyChangeContent(ch *aclpb.ACLChangeACLContentValue) error } } -func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLChangeUserPermissionChange) error { +func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLChange_UserPermissionChange) error { if _, exists := st.userStates[ch.Identity]; !exists { return ErrNoSuchUser } @@ -166,12 +166,12 @@ func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLChangeUserPermissionC return nil } -func (st *ACLState) applyUserInvite(ch *aclpb.ACLChangeUserInvite) error { +func (st *ACLState) applyUserInvite(ch *aclpb.ACLChange_UserInvite) error { st.userInvites[ch.InviteId] = ch return nil } -func (st *ACLState) applyUserJoin(ch *aclpb.ACLChangeUserJoin) error { +func (st *ACLState) applyUserJoin(ch *aclpb.ACLChange_UserJoin) error { invite, exists := st.userInvites[ch.UserInviteId] if !exists { return fmt.Errorf("no such invite with id %s", ch.UserInviteId) @@ -214,7 +214,7 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLChangeUserJoin) error { } // adding user to the list - userState := &aclpb.ACLChangeUserState{ + userState := &aclpb.ACLChange_UserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, EncryptedReadKeys: ch.EncryptedReadKeys, @@ -225,12 +225,12 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLChangeUserJoin) error { return nil } -func (st *ACLState) applyUserAdd(ch *aclpb.ACLChangeUserAdd) error { +func (st *ACLState) applyUserAdd(ch *aclpb.ACLChange_UserAdd) error { if _, exists := st.userStates[ch.Identity]; exists { return ErrUserAlreadyExists } - st.userStates[ch.Identity] = &aclpb.ACLChangeUserState{ + st.userStates[ch.Identity] = &aclpb.ACLChange_UserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, Permissions: ch.Permissions, @@ -251,7 +251,7 @@ func (st *ACLState) applyUserAdd(ch *aclpb.ACLChangeUserAdd) error { return nil } -func (st *ACLState) applyUserRemove(ch *aclpb.ACLChangeUserRemove) error { +func (st *ACLState) applyUserRemove(ch *aclpb.ACLChange_UserRemove) error { if ch.Identity == st.identity { return ErrDocumentForbidden } @@ -283,7 +283,7 @@ func (st *ACLState) applyUserRemove(ch *aclpb.ACLChangeUserRemove) error { return nil } -func (st *ACLState) applyUserConfirm(ch *aclpb.ACLChangeUserConfirm) error { +func (st *ACLState) applyUserConfirm(ch *aclpb.ACLChange_UserConfirm) error { if _, exists := st.userStates[ch.Identity]; !exists { return ErrNoSuchUser } @@ -309,7 +309,7 @@ func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, e return key, hasher.Sum64(), nil } -func (st *ACLState) hasPermission(identity string, permission aclpb.ACLChangeUserPermissions) bool { +func (st *ACLState) hasPermission(identity string, permission aclpb.ACLChange_UserPermissions) bool { state, exists := st.userStates[identity] if !exists { return false @@ -329,7 +329,7 @@ func (st *ACLState) isUserAdd(ch *aclpb.ACLChange) bool { return ch.AclData.GetAclContent() != nil && userAdd != nil && userAdd.GetIdentity() == ch.Identity } -func (st *ACLState) getPermissionDecreasedUsers(ch *aclpb.ACLChange) (identities []*aclpb.ACLChangeUserPermissionChange) { +func (st *ACLState) getPermissionDecreasedUsers(ch *aclpb.ACLChange) (identities []*aclpb.ACLChange_UserPermissionChange) { // this should be called after general checks are completed if ch.GetAclData().GetAclContent() == nil { return nil @@ -343,7 +343,7 @@ func (st *ACLState) getPermissionDecreasedUsers(ch *aclpb.ACLChange) (identities currentState := st.userStates[content.Identity] // the comparison works in different direction :-) if content.Permissions > currentState.Permissions { - identities = append(identities, &aclpb.ACLChangeUserPermissionChange{ + identities = append(identities, &aclpb.ACLChange_UserPermissionChange{ Identity: content.Identity, Permissions: content.Permissions, }) @@ -351,7 +351,7 @@ func (st *ACLState) getPermissionDecreasedUsers(ch *aclpb.ACLChange) (identities } if c.GetUserRemove() != nil { content := c.GetUserRemove() - identities = append(identities, &aclpb.ACLChangeUserPermissionChange{ + identities = append(identities, &aclpb.ACLChange_UserPermissionChange{ Identity: content.Identity, Permissions: aclpb.ACLChange_Removed, }) @@ -405,7 +405,7 @@ func (st *ACLState) equal(other *ACLState) bool { return true } -func (st *ACLState) GetUserStates() map[string]*aclpb.ACLChangeUserState { +func (st *ACLState) GetUserStates() map[string]*aclpb.ACLChange_UserState { // TODO: we should provide better API that would not allow to change this map from the outside return st.userStates } diff --git a/pkg/acl/acltree/aclstatebuilder.go b/pkg/acl/acltree/aclstatebuilder.go index d63d535c..8528f9cf 100644 --- a/pkg/acl/acltree/aclstatebuilder.go +++ b/pkg/acl/acltree/aclstatebuilder.go @@ -16,7 +16,7 @@ type aclStateBuilder struct { } type decreasedPermissionsParameters struct { - users []*aclpb.ACLChangeUserPermissionChange + users []*aclpb.ACLChange_UserPermissionChange startChange string } diff --git a/pkg/acl/acltree/change.go b/pkg/acl/acltree/change.go index c768ef23..a615dfa9 100644 --- a/pkg/acl/acltree/change.go +++ b/pkg/acl/acltree/change.go @@ -10,7 +10,7 @@ import ( type ChangeContent struct { ChangesData proto.Marshaler - ACLData *aclpb.ACLChangeACLData + ACLData *aclpb.ACLChange_ACLData Id string // TODO: this is just for testing, because id should be created automatically from content } diff --git a/pkg/acl/acltree/changebuilder.go b/pkg/acl/acltree/changebuilder.go index b5b26b63..5bfb145f 100644 --- a/pkg/acl/acltree/changebuilder.go +++ b/pkg/acl/acltree/changebuilder.go @@ -14,7 +14,7 @@ import ( type MarshalledChange = []byte type ACLChangeBuilder interface { - UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChangeUserPermissions) error + UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChange_UserPermissions) error AddId(id string) // TODO: this is only for testing SetMakeSnapshot(bool) // TODO: who should decide this? probably ACLTree so we can delete it } @@ -29,7 +29,7 @@ type changeBuilder struct { tree *Tree acc *account.AccountData - aclData *aclpb.ACLChangeACLData + aclData *aclpb.ACLChange_ACLData changeContent proto.Marshaler id string makeSnapshot bool @@ -46,7 +46,7 @@ func (c *changeBuilder) Init(state *ACLState, tree *Tree, acc *account.AccountDa c.tree = tree c.acc = acc - c.aclData = &aclpb.ACLChangeACLData{} + c.aclData = &aclpb.ACLChange_ACLData{} // setting read key for further encryption etc if state.currentReadKeyHash == 0 { c.readKey, _ = symmetric.NewRandom() @@ -68,7 +68,7 @@ func (c *changeBuilder) SetMakeSnapshot(b bool) { c.makeSnapshot = b } -func (c *changeBuilder) UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChangeUserPermissions) error { +func (c *changeBuilder) UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChange_UserPermissions) error { var allKeys []*symmetric.Key if c.aclState.currentReadKeyHash != 0 { for _, key := range c.aclState.userReadKeys { @@ -91,9 +91,9 @@ func (c *changeBuilder) UserAdd(identity string, encryptionKey encryptionkey.Pub if err != nil { return err } - ch := &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserAdd{ - UserAdd: &aclpb.ACLChangeUserAdd{ + ch := &aclpb.ACLChange_ACLContentValue{ + Value: &aclpb.ACLChange_ACLContent_Value_UserAdd{ + UserAdd: &aclpb.ACLChange_UserAdd{ Identity: identity, EncryptionKey: rawKey, EncryptedReadKeys: encryptedKeys, diff --git a/pkg/acl/acltree/treegraph_nix.go b/pkg/acl/acltree/treegraph_nix.go index 4d798939..72dc0c7d 100644 --- a/pkg/acl/acltree/treegraph_nix.go +++ b/pkg/acl/acltree/treegraph_nix.go @@ -60,7 +60,7 @@ func (t *Tree) Graph() (data string, err error) { if c.Content.AclData != nil { for _, chc := range c.Content.AclData.AclContent { tp := fmt.Sprintf("%T", chc.Value) - tp = strings.Replace(tp, "ACLChangeACLContentValueValueOf", "", 1) + tp = strings.Replace(tp, "ACLChange_ACLContentValueValueOf", "", 1) res := "" for _, ts := range tp { if unicode.IsUpper(ts) { @@ -74,7 +74,7 @@ func (t *Tree) Graph() (data string, err error) { // TODO: add some parser to provide custom unmarshalling for the document change //for _, chc := range c.DecryptedDocumentChange.Content { // tp := fmt.Sprintf("%T", chc.Value) - // tp = strings.Replace(tp, "ChangeContentValueOf", "", 1) + // tp = strings.Replace(tp, "ChangeContent_Value_", "", 1) // res := "" // for _, ts := range tp { // if unicode.IsUpper(ts) { diff --git a/pkg/acl/example/plaintextdocument/document.go b/pkg/acl/example/plaintextdocument/document.go index d97bf430..2c66b5b1 100644 --- a/pkg/acl/example/plaintextdocument/document.go +++ b/pkg/acl/example/plaintextdocument/document.go @@ -34,8 +34,8 @@ func (p *plainTextDocument) Text() string { func (p *plainTextDocument) AddText(ctx context.Context, text string) error { _, err := p.aclTree.AddContent(ctx, func(builder acltree.ChangeBuilder) error { builder.AddChangeContent( - &testchangepb.PlainTextChangeData{ - Content: []*testchangepb.PlainTextChangeContent{ + &testchangepb.PlainTextChange_Data{ + Content: []*testchangepb.PlainTextChange_Content{ createAppendTextChangeContent(text), }, }) @@ -150,18 +150,18 @@ func NewPlainTextDocument( } func createInitialChangeContent(text string) proto.Marshaler { - return &testchangepb.PlainTextChangeData{ - Content: []*testchangepb.PlainTextChangeContent{ + return &testchangepb.PlainTextChange_Data{ + Content: []*testchangepb.PlainTextChange_Content{ createAppendTextChangeContent(text), }, - Snapshot: &testchangepb.PlainTextChangeSnapshot{Text: text}, + Snapshot: &testchangepb.PlainTextChange_Snapshot{Text: text}, } } -func createAppendTextChangeContent(text string) *testchangepb.PlainTextChangeContent { - return &testchangepb.PlainTextChangeContent{ - Value: &testchangepb.PlainTextChangeContentValueOfTextAppend{ - TextAppend: &testchangepb.PlainTextChangeTextAppend{ +func createAppendTextChangeContent(text string) *testchangepb.PlainTextChange_Content { + return &testchangepb.PlainTextChange_Content{ + Value: &testchangepb.PlainTextChange_Content_TextAppend{ + TextAppend: &testchangepb.PlainTextChange_TextAppend{ Text: text, }, }, diff --git a/pkg/acl/example/plaintextdocument/plaintextdocstate.go b/pkg/acl/example/plaintextdocument/plaintextdocstate.go index 3a3afec3..22ac1e4d 100644 --- a/pkg/acl/example/plaintextdocument/plaintextdocstate.go +++ b/pkg/acl/example/plaintextdocument/plaintextdocstate.go @@ -20,7 +20,7 @@ func NewDocumentState(text string, id string) *DocumentState { } func BuildDocumentStateFromChange(change []byte, id string) (*DocumentState, error) { - var changesData testchangepb.PlainTextChangeData + var changesData testchangepb.PlainTextChange_Data err := proto.Unmarshal(change, &changesData) if err != nil { return nil, err @@ -33,7 +33,7 @@ func BuildDocumentStateFromChange(change []byte, id string) (*DocumentState, err } func (p *DocumentState) ApplyChange(change []byte, id string) (*DocumentState, error) { - var changesData testchangepb.PlainTextChangeData + var changesData testchangepb.PlainTextChange_Data err := proto.Unmarshal(change, &changesData) if err != nil { return nil, err @@ -49,7 +49,7 @@ func (p *DocumentState) ApplyChange(change []byte, id string) (*DocumentState, e return p, nil } -func (p *DocumentState) applyChange(ch *testchangepb.PlainTextChangeContent) error { +func (p *DocumentState) applyChange(ch *testchangepb.PlainTextChange_Content) error { switch { case ch.GetTextAppend() != nil: text := ch.GetTextAppend().GetText() diff --git a/pkg/acl/testutils/testchanges/testchangepb/testdocumentchanges.pb.go b/pkg/acl/testutils/testchanges/testchangepb/testdocumentchanges.pb.go index 874061c6..cfec475b 100644 --- a/pkg/acl/testutils/testchanges/testchangepb/testdocumentchanges.pb.go +++ b/pkg/acl/testutils/testchanges/testchangepb/testdocumentchanges.pb.go @@ -58,24 +58,25 @@ func (m *PlainTextChange) XXX_DiscardUnknown() { var xxx_messageInfo_PlainTextChange proto.InternalMessageInfo -type PlainTextChangeContent struct { +type PlainTextChange_Content struct { // Types that are valid to be assigned to Value: - // *PlainTextChangeContentValueOfTextAppend - Value IsPlainTextChangeContentValue `protobuf_oneof:"value"` + // + // *PlainTextChange_Content_TextAppend + Value isPlainTextChange_Content_Value `protobuf_oneof:"value"` } -func (m *PlainTextChangeContent) Reset() { *m = PlainTextChangeContent{} } -func (m *PlainTextChangeContent) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeContent) ProtoMessage() {} -func (*PlainTextChangeContent) Descriptor() ([]byte, []int) { +func (m *PlainTextChange_Content) Reset() { *m = PlainTextChange_Content{} } +func (m *PlainTextChange_Content) String() string { return proto.CompactTextString(m) } +func (*PlainTextChange_Content) ProtoMessage() {} +func (*PlainTextChange_Content) Descriptor() ([]byte, []int) { return fileDescriptor_c07268f9f08f2beb, []int{0, 0} } -func (m *PlainTextChangeContent) XXX_Unmarshal(b []byte) error { +func (m *PlainTextChange_Content) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChangeContent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *PlainTextChange_Content) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChangeContent.Marshal(b, m, deterministic) + return xxx_messageInfo_PlainTextChange_Content.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -85,67 +86,67 @@ func (m *PlainTextChangeContent) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } -func (m *PlainTextChangeContent) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeContent.Merge(m, src) +func (m *PlainTextChange_Content) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChange_Content.Merge(m, src) } -func (m *PlainTextChangeContent) XXX_Size() int { +func (m *PlainTextChange_Content) XXX_Size() int { return m.Size() } -func (m *PlainTextChangeContent) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeContent.DiscardUnknown(m) +func (m *PlainTextChange_Content) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChange_Content.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChangeContent proto.InternalMessageInfo +var xxx_messageInfo_PlainTextChange_Content proto.InternalMessageInfo -type IsPlainTextChangeContentValue interface { - IsPlainTextChangeContentValue() +type isPlainTextChange_Content_Value interface { + isPlainTextChange_Content_Value() MarshalTo([]byte) (int, error) Size() int } -type PlainTextChangeContentValueOfTextAppend struct { - TextAppend *PlainTextChangeTextAppend `protobuf:"bytes,1,opt,name=textAppend,proto3,oneof" json:"textAppend,omitempty"` +type PlainTextChange_Content_TextAppend struct { + TextAppend *PlainTextChange_TextAppend `protobuf:"bytes,1,opt,name=textAppend,proto3,oneof" json:"textAppend,omitempty"` } -func (*PlainTextChangeContentValueOfTextAppend) IsPlainTextChangeContentValue() {} +func (*PlainTextChange_Content_TextAppend) isPlainTextChange_Content_Value() {} -func (m *PlainTextChangeContent) GetValue() IsPlainTextChangeContentValue { +func (m *PlainTextChange_Content) GetValue() isPlainTextChange_Content_Value { if m != nil { return m.Value } return nil } -func (m *PlainTextChangeContent) GetTextAppend() *PlainTextChangeTextAppend { - if x, ok := m.GetValue().(*PlainTextChangeContentValueOfTextAppend); ok { +func (m *PlainTextChange_Content) GetTextAppend() *PlainTextChange_TextAppend { + if x, ok := m.GetValue().(*PlainTextChange_Content_TextAppend); ok { return x.TextAppend } return nil } // XXX_OneofWrappers is for the internal use of the proto package. -func (*PlainTextChangeContent) XXX_OneofWrappers() []interface{} { +func (*PlainTextChange_Content) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*PlainTextChangeContentValueOfTextAppend)(nil), + (*PlainTextChange_Content_TextAppend)(nil), } } -type PlainTextChangeTextAppend struct { +type PlainTextChange_TextAppend struct { Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` } -func (m *PlainTextChangeTextAppend) Reset() { *m = PlainTextChangeTextAppend{} } -func (m *PlainTextChangeTextAppend) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeTextAppend) ProtoMessage() {} -func (*PlainTextChangeTextAppend) Descriptor() ([]byte, []int) { +func (m *PlainTextChange_TextAppend) Reset() { *m = PlainTextChange_TextAppend{} } +func (m *PlainTextChange_TextAppend) String() string { return proto.CompactTextString(m) } +func (*PlainTextChange_TextAppend) ProtoMessage() {} +func (*PlainTextChange_TextAppend) Descriptor() ([]byte, []int) { return fileDescriptor_c07268f9f08f2beb, []int{0, 1} } -func (m *PlainTextChangeTextAppend) XXX_Unmarshal(b []byte) error { +func (m *PlainTextChange_TextAppend) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChangeTextAppend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *PlainTextChange_TextAppend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChangeTextAppend.Marshal(b, m, deterministic) + return xxx_messageInfo_PlainTextChange_TextAppend.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -155,41 +156,41 @@ func (m *PlainTextChangeTextAppend) XXX_Marshal(b []byte, deterministic bool) ([ return b[:n], nil } } -func (m *PlainTextChangeTextAppend) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeTextAppend.Merge(m, src) +func (m *PlainTextChange_TextAppend) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChange_TextAppend.Merge(m, src) } -func (m *PlainTextChangeTextAppend) XXX_Size() int { +func (m *PlainTextChange_TextAppend) XXX_Size() int { return m.Size() } -func (m *PlainTextChangeTextAppend) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeTextAppend.DiscardUnknown(m) +func (m *PlainTextChange_TextAppend) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChange_TextAppend.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChangeTextAppend proto.InternalMessageInfo +var xxx_messageInfo_PlainTextChange_TextAppend proto.InternalMessageInfo -func (m *PlainTextChangeTextAppend) GetText() string { +func (m *PlainTextChange_TextAppend) GetText() string { if m != nil { return m.Text } return "" } -type PlainTextChangeSnapshot struct { +type PlainTextChange_Snapshot struct { Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` } -func (m *PlainTextChangeSnapshot) Reset() { *m = PlainTextChangeSnapshot{} } -func (m *PlainTextChangeSnapshot) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeSnapshot) ProtoMessage() {} -func (*PlainTextChangeSnapshot) Descriptor() ([]byte, []int) { +func (m *PlainTextChange_Snapshot) Reset() { *m = PlainTextChange_Snapshot{} } +func (m *PlainTextChange_Snapshot) String() string { return proto.CompactTextString(m) } +func (*PlainTextChange_Snapshot) ProtoMessage() {} +func (*PlainTextChange_Snapshot) Descriptor() ([]byte, []int) { return fileDescriptor_c07268f9f08f2beb, []int{0, 2} } -func (m *PlainTextChangeSnapshot) XXX_Unmarshal(b []byte) error { +func (m *PlainTextChange_Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChangeSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *PlainTextChange_Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChangeSnapshot.Marshal(b, m, deterministic) + return xxx_messageInfo_PlainTextChange_Snapshot.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -199,42 +200,42 @@ func (m *PlainTextChangeSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *PlainTextChangeSnapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeSnapshot.Merge(m, src) +func (m *PlainTextChange_Snapshot) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChange_Snapshot.Merge(m, src) } -func (m *PlainTextChangeSnapshot) XXX_Size() int { +func (m *PlainTextChange_Snapshot) XXX_Size() int { return m.Size() } -func (m *PlainTextChangeSnapshot) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeSnapshot.DiscardUnknown(m) +func (m *PlainTextChange_Snapshot) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChange_Snapshot.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChangeSnapshot proto.InternalMessageInfo +var xxx_messageInfo_PlainTextChange_Snapshot proto.InternalMessageInfo -func (m *PlainTextChangeSnapshot) GetText() string { +func (m *PlainTextChange_Snapshot) GetText() string { if m != nil { return m.Text } return "" } -type PlainTextChangeData struct { - Content []*PlainTextChangeContent `protobuf:"bytes,1,rep,name=content,proto3" json:"content,omitempty"` - Snapshot *PlainTextChangeSnapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` +type PlainTextChange_Data struct { + Content []*PlainTextChange_Content `protobuf:"bytes,1,rep,name=content,proto3" json:"content,omitempty"` + Snapshot *PlainTextChange_Snapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` } -func (m *PlainTextChangeData) Reset() { *m = PlainTextChangeData{} } -func (m *PlainTextChangeData) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeData) ProtoMessage() {} -func (*PlainTextChangeData) Descriptor() ([]byte, []int) { +func (m *PlainTextChange_Data) Reset() { *m = PlainTextChange_Data{} } +func (m *PlainTextChange_Data) String() string { return proto.CompactTextString(m) } +func (*PlainTextChange_Data) ProtoMessage() {} +func (*PlainTextChange_Data) Descriptor() ([]byte, []int) { return fileDescriptor_c07268f9f08f2beb, []int{0, 3} } -func (m *PlainTextChangeData) XXX_Unmarshal(b []byte) error { +func (m *PlainTextChange_Data) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChangeData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *PlainTextChange_Data) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChangeData.Marshal(b, m, deterministic) + return xxx_messageInfo_PlainTextChange_Data.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -244,26 +245,26 @@ func (m *PlainTextChangeData) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *PlainTextChangeData) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeData.Merge(m, src) +func (m *PlainTextChange_Data) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChange_Data.Merge(m, src) } -func (m *PlainTextChangeData) XXX_Size() int { +func (m *PlainTextChange_Data) XXX_Size() int { return m.Size() } -func (m *PlainTextChangeData) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeData.DiscardUnknown(m) +func (m *PlainTextChange_Data) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChange_Data.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChangeData proto.InternalMessageInfo +var xxx_messageInfo_PlainTextChange_Data proto.InternalMessageInfo -func (m *PlainTextChangeData) GetContent() []*PlainTextChangeContent { +func (m *PlainTextChange_Data) GetContent() []*PlainTextChange_Content { if m != nil { return m.Content } return nil } -func (m *PlainTextChangeData) GetSnapshot() *PlainTextChangeSnapshot { +func (m *PlainTextChange_Data) GetSnapshot() *PlainTextChange_Snapshot { if m != nil { return m.Snapshot } @@ -272,10 +273,10 @@ func (m *PlainTextChangeData) GetSnapshot() *PlainTextChangeSnapshot { func init() { proto.RegisterType((*PlainTextChange)(nil), "anytype.PlainTextChange") - proto.RegisterType((*PlainTextChangeContent)(nil), "anytype.PlainTextChange.Content") - proto.RegisterType((*PlainTextChangeTextAppend)(nil), "anytype.PlainTextChange.TextAppend") - proto.RegisterType((*PlainTextChangeSnapshot)(nil), "anytype.PlainTextChange.Snapshot") - proto.RegisterType((*PlainTextChangeData)(nil), "anytype.PlainTextChange.Data") + proto.RegisterType((*PlainTextChange_Content)(nil), "anytype.PlainTextChange.Content") + proto.RegisterType((*PlainTextChange_TextAppend)(nil), "anytype.PlainTextChange.TextAppend") + proto.RegisterType((*PlainTextChange_Snapshot)(nil), "anytype.PlainTextChange.Snapshot") + proto.RegisterType((*PlainTextChange_Data)(nil), "anytype.PlainTextChange.Data") } func init() { @@ -327,7 +328,7 @@ func (m *PlainTextChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *PlainTextChangeContent) Marshal() (dAtA []byte, err error) { +func (m *PlainTextChange_Content) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -337,12 +338,12 @@ func (m *PlainTextChangeContent) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChangeContent) MarshalTo(dAtA []byte) (int, error) { +func (m *PlainTextChange_Content) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChangeContent) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PlainTextChange_Content) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -359,12 +360,12 @@ func (m *PlainTextChangeContent) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *PlainTextChangeContentValueOfTextAppend) MarshalTo(dAtA []byte) (int, error) { +func (m *PlainTextChange_Content_TextAppend) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChangeContentValueOfTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PlainTextChange_Content_TextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.TextAppend != nil { { @@ -380,7 +381,7 @@ func (m *PlainTextChangeContentValueOfTextAppend) MarshalToSizedBuffer(dAtA []by } return len(dAtA) - i, nil } -func (m *PlainTextChangeTextAppend) Marshal() (dAtA []byte, err error) { +func (m *PlainTextChange_TextAppend) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -390,12 +391,12 @@ func (m *PlainTextChangeTextAppend) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChangeTextAppend) MarshalTo(dAtA []byte) (int, error) { +func (m *PlainTextChange_TextAppend) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChangeTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PlainTextChange_TextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -410,7 +411,7 @@ func (m *PlainTextChangeTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *PlainTextChangeSnapshot) Marshal() (dAtA []byte, err error) { +func (m *PlainTextChange_Snapshot) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -420,12 +421,12 @@ func (m *PlainTextChangeSnapshot) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChangeSnapshot) MarshalTo(dAtA []byte) (int, error) { +func (m *PlainTextChange_Snapshot) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChangeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PlainTextChange_Snapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -440,7 +441,7 @@ func (m *PlainTextChangeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *PlainTextChangeData) Marshal() (dAtA []byte, err error) { +func (m *PlainTextChange_Data) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -450,12 +451,12 @@ func (m *PlainTextChangeData) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChangeData) MarshalTo(dAtA []byte) (int, error) { +func (m *PlainTextChange_Data) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChangeData) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PlainTextChange_Data) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -509,7 +510,7 @@ func (m *PlainTextChange) Size() (n int) { return n } -func (m *PlainTextChangeContent) Size() (n int) { +func (m *PlainTextChange_Content) Size() (n int) { if m == nil { return 0 } @@ -521,7 +522,7 @@ func (m *PlainTextChangeContent) Size() (n int) { return n } -func (m *PlainTextChangeContentValueOfTextAppend) Size() (n int) { +func (m *PlainTextChange_Content_TextAppend) Size() (n int) { if m == nil { return 0 } @@ -533,7 +534,7 @@ func (m *PlainTextChangeContentValueOfTextAppend) Size() (n int) { } return n } -func (m *PlainTextChangeTextAppend) Size() (n int) { +func (m *PlainTextChange_TextAppend) Size() (n int) { if m == nil { return 0 } @@ -546,7 +547,7 @@ func (m *PlainTextChangeTextAppend) Size() (n int) { return n } -func (m *PlainTextChangeSnapshot) Size() (n int) { +func (m *PlainTextChange_Snapshot) Size() (n int) { if m == nil { return 0 } @@ -559,7 +560,7 @@ func (m *PlainTextChangeSnapshot) Size() (n int) { return n } -func (m *PlainTextChangeData) Size() (n int) { +func (m *PlainTextChange_Data) Size() (n int) { if m == nil { return 0 } @@ -634,7 +635,7 @@ func (m *PlainTextChange) Unmarshal(dAtA []byte) error { } return nil } -func (m *PlainTextChangeContent) Unmarshal(dAtA []byte) error { +func (m *PlainTextChange_Content) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -692,11 +693,11 @@ func (m *PlainTextChangeContent) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &PlainTextChangeTextAppend{} + v := &PlainTextChange_TextAppend{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &PlainTextChangeContentValueOfTextAppend{v} + m.Value = &PlainTextChange_Content_TextAppend{v} iNdEx = postIndex default: iNdEx = preIndex @@ -719,7 +720,7 @@ func (m *PlainTextChangeContent) Unmarshal(dAtA []byte) error { } return nil } -func (m *PlainTextChangeTextAppend) Unmarshal(dAtA []byte) error { +func (m *PlainTextChange_TextAppend) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -801,7 +802,7 @@ func (m *PlainTextChangeTextAppend) Unmarshal(dAtA []byte) error { } return nil } -func (m *PlainTextChangeSnapshot) Unmarshal(dAtA []byte) error { +func (m *PlainTextChange_Snapshot) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -883,7 +884,7 @@ func (m *PlainTextChangeSnapshot) Unmarshal(dAtA []byte) error { } return nil } -func (m *PlainTextChangeData) Unmarshal(dAtA []byte) error { +func (m *PlainTextChange_Data) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -941,7 +942,7 @@ func (m *PlainTextChangeData) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Content = append(m.Content, &PlainTextChangeContent{}) + m.Content = append(m.Content, &PlainTextChange_Content{}) if err := m.Content[len(m.Content)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -976,7 +977,7 @@ func (m *PlainTextChangeData) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Snapshot == nil { - m.Snapshot = &PlainTextChangeSnapshot{} + m.Snapshot = &PlainTextChange_Snapshot{} } if err := m.Snapshot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go b/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go index f7bb65bd..3b7c6f7d 100644 --- a/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go +++ b/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go @@ -239,12 +239,12 @@ func (t *TreeStorageBuilder) parseChange(ch *Change) *treeChange { aclChange := &aclpb.ACLChange{} aclChange.Identity = t.keychain.GetIdentity(ch.Identity) if len(ch.AclChanges) > 0 || ch.AclSnapshot != nil { - aclChange.AclData = &aclpb.ACLChangeACLData{} + aclChange.AclData = &aclpb.ACLChange_ACLData{} if ch.AclSnapshot != nil { aclChange.AclData.AclSnapshot = t.parseACLSnapshot(ch.AclSnapshot) } if ch.AclChanges != nil { - var aclChangeContents []*aclpb.ACLChangeACLContentValue + var aclChangeContents []*aclpb.ACLChange_ACLContentValue for _, ch := range ch.AclChanges { aclChangeContent := t.parseACLChange(ch) aclChangeContents = append(aclChangeContents, aclChangeContent) @@ -253,12 +253,12 @@ func (t *TreeStorageBuilder) parseChange(ch *Change) *treeChange { } } if len(ch.Changes) > 0 || ch.Snapshot != nil { - changesData := &testpb.PlainTextChangeData{} + changesData := &testpb.PlainTextChange_Data{} if ch.Snapshot != nil { changesData.Snapshot = t.parseChangeSnapshot(ch.Snapshot) } if len(ch.Changes) > 0 { - var changeContents []*testpb.PlainTextChangeContent + var changeContents []*testpb.PlainTextChange_Content for _, ch := range ch.Changes { aclChangeContent := t.parseDocumentChange(ch) changeContents = append(changeContents, aclChangeContent) @@ -283,16 +283,16 @@ func (t *TreeStorageBuilder) parseTreeId(description *TreeDescription) string { return description.Author + ".tree.id" } -func (t *TreeStorageBuilder) parseChangeSnapshot(s *PlainTextSnapshot) *testpb.PlainTextChangeSnapshot { - return &testpb.PlainTextChangeSnapshot{ +func (t *TreeStorageBuilder) parseChangeSnapshot(s *PlainTextSnapshot) *testpb.PlainTextChange_Snapshot { + return &testpb.PlainTextChange_Snapshot{ Text: s.Text, } } -func (t *TreeStorageBuilder) parseACLSnapshot(s *ACLSnapshot) *aclpb.ACLChangeACLSnapshot { - newState := &aclpb.ACLChangeACLState{} +func (t *TreeStorageBuilder) parseACLSnapshot(s *ACLSnapshot) *aclpb.ACLChange_ACLSnapshot { + newState := &aclpb.ACLChange_ACLState{} for _, state := range s.UserStates { - aclUserState := &aclpb.ACLChangeUserState{} + aclUserState := &aclpb.ACLChange_UserState{} aclUserState.Identity = t.keychain.GetIdentity(state.Identity) encKey := t.keychain. @@ -304,17 +304,17 @@ func (t *TreeStorageBuilder) parseACLSnapshot(s *ACLSnapshot) *aclpb.ACLChangeAC aclUserState.Permissions = t.convertPermission(state.Permissions) newState.UserStates = append(newState.UserStates, aclUserState) } - return &aclpb.ACLChangeACLSnapshot{ + return &aclpb.ACLChange_ACLSnapshot{ AclState: newState, } } -func (t *TreeStorageBuilder) parseDocumentChange(ch *PlainTextChange) (convCh *testpb.PlainTextChangeContent) { +func (t *TreeStorageBuilder) parseDocumentChange(ch *PlainTextChange) (convCh *testpb.PlainTextChange_Content) { switch { case ch.TextAppend != nil: - convCh = &testpb.PlainTextChangeContent{ - Value: &testpb.PlainTextChangeContentValueOfTextAppend{ - TextAppend: &testpb.PlainTextChangeTextAppend{ + convCh = &testpb.PlainTextChange_Content{ + Value: &testpb.PlainTextChange_Content_TextAppend{ + TextAppend: &testpb.PlainTextChange_TextAppend{ Text: ch.TextAppend.Text, }, }, @@ -327,7 +327,7 @@ func (t *TreeStorageBuilder) parseDocumentChange(ch *PlainTextChange) (convCh *t return convCh } -func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLChangeACLContentValue) { +func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLChange_ACLContentValue) { switch { case ch.UserAdd != nil: add := ch.UserAdd @@ -336,9 +336,9 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha GetKey(add.EncryptionKey).(encryptionkey.PrivKey) rawKey, _ := encKey.GetPublic().Raw() - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserAdd{ - UserAdd: &aclpb.ACLChangeUserAdd{ + convCh = &aclpb.ACLChange_ACLContentValue{ + Value: &aclpb.ACLChange_ACLContent_Value_UserAdd{ + UserAdd: &aclpb.ACLChange_UserAdd{ Identity: t.keychain.GetIdentity(add.Identity), EncryptionKey: rawKey, EncryptedReadKeys: t.encryptReadKeys(add.EncryptedReadKeys, encKey), @@ -360,9 +360,9 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha panic(err) } - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserJoin{ - UserJoin: &aclpb.ACLChangeUserJoin{ + convCh = &aclpb.ACLChange_ACLContentValue{ + Value: &aclpb.ACLChange_ACLContentValueValueOfUserJoin{ + UserJoin: &aclpb.ACLChange_UserJoin{ Identity: t.keychain.GetIdentity(join.Identity), EncryptionKey: rawKey, AcceptSignature: signature, @@ -378,9 +378,9 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha GetKey(invite.EncryptionKey).(encryptionkey.PrivKey) rawEncKey, _ := encKey.GetPublic().Raw() - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserInvite{ - UserInvite: &aclpb.ACLChangeUserInvite{ + convCh = &aclpb.ACLChange_ACLContentValue{ + Value: &aclpb.ACLChange_ACLContentValueValueOfUserInvite{ + UserInvite: &aclpb.ACLChange_UserInvite{ AcceptPublicKey: rawAcceptKey, EncryptPublicKey: rawEncKey, EncryptedReadKeys: t.encryptReadKeys(invite.EncryptedReadKeys, encKey), @@ -392,9 +392,9 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha case ch.UserConfirm != nil: confirm := ch.UserConfirm - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserConfirm{ - UserConfirm: &aclpb.ACLChangeUserConfirm{ + convCh = &aclpb.ACLChange_ACLContentValue{ + Value: &aclpb.ACLChange_ACLContentValueValueOfUserConfirm{ + UserConfirm: &aclpb.ACLChange_UserConfirm{ Identity: t.keychain.GetIdentity(confirm.Identity), UserAddId: confirm.UserAddId, }, @@ -403,9 +403,9 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha case ch.UserPermissionChange != nil: permissionChange := ch.UserPermissionChange - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserPermissionChange{ - UserPermissionChange: &aclpb.ACLChangeUserPermissionChange{ + convCh = &aclpb.ACLChange_ACLContentValue{ + Value: &aclpb.ACLChange_ACLContentValueValueOfUserPermissionChange{ + UserPermissionChange: &aclpb.ACLChange_UserPermissionChange{ Identity: t.keychain.GetIdentity(permissionChange.Identity), Permissions: t.convertPermission(permissionChange.Permission), }, @@ -432,9 +432,9 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha }) } - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserRemove{ - UserRemove: &aclpb.ACLChangeUserRemove{ + convCh = &aclpb.ACLChange_ACLContentValue{ + Value: &aclpb.ACLChange_ACLContentValueValueOfUserRemove{ + UserRemove: &aclpb.ACLChange_UserRemove{ Identity: t.keychain.GetIdentity(remove.RemovedIdentity), ReadKeyReplaces: replaces, }, @@ -461,7 +461,7 @@ func (t *TreeStorageBuilder) encryptReadKeys(keys []string, encKey encryptionkey return } -func (t *TreeStorageBuilder) convertPermission(perm string) aclpb.ACLChangeUserPermissions { +func (t *TreeStorageBuilder) convertPermission(perm string) aclpb.ACLChange_UserPermissions { switch perm { case "admin": return aclpb.ACLChange_Admin diff --git a/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go b/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go index 935fd711..9d973a24 100644 --- a/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go +++ b/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go @@ -45,7 +45,7 @@ func (t *TreeStorageBuilder) Graph() (string, error) { var chSymbs []string if r.changesDataDecrypted != nil { - res := &testpb.PlainTextChangeData{} + res := &testpb.PlainTextChange_Data{} err := proto.Unmarshal(r.changesDataDecrypted, res) if err != nil { return err @@ -53,7 +53,7 @@ func (t *TreeStorageBuilder) Graph() (string, error) { for _, chc := range res.Content { tp := fmt.Sprintf("%T", chc.Value) - tp = strings.Replace(tp, "ChangeContentValueOf", "", 1) + tp = strings.Replace(tp, "ChangeContent_Value_", "", 1) res := "" for _, ts := range tp { if unicode.IsUpper(ts) { @@ -66,7 +66,7 @@ func (t *TreeStorageBuilder) Graph() (string, error) { if r.GetAclData() != nil { for _, chc := range r.GetAclData().AclContent { tp := fmt.Sprintf("%T", chc.Value) - tp = strings.Replace(tp, "ACLChangeACLContentValueValueOf", "", 1) + tp = strings.Replace(tp, "ACLChange_ACLContentValueValueOf", "", 1) res := "" for _, ts := range tp { if unicode.IsUpper(ts) { diff --git a/service/net/pool/message.go b/service/net/pool/message.go index 7535a55f..15a76f2e 100644 --- a/service/net/pool/message.go +++ b/service/net/pool/message.go @@ -48,7 +48,7 @@ func (m *Message) ReplyType(tp syncproto.MessageType, data proto.Marshaler) (err func (m *Message) Ack() (err error) { ack := &syncproto.System{ - Ack: &syncproto.SystemAck{}, + Ack: &syncproto.System_Ack{}, } data, err := ack.Marshal() if err != nil { @@ -78,10 +78,10 @@ func (m *Message) Ack() (err error) { return } -func (m *Message) AckError(code syncproto.SystemErrorCode, description string) (err error) { +func (m *Message) AckError(code syncproto.System_Error_Code, description string) (err error) { ack := &syncproto.System{ - Ack: &syncproto.SystemAck{ - Error: &syncproto.SystemError{ + Ack: &syncproto.System_Ack{ + Error: &syncproto.System_Error{ Code: code, Description: description, }, diff --git a/service/space/remotediff/remotediff.go b/service/space/remotediff/remotediff.go index 6ace7a33..0bab5350 100644 --- a/service/space/remotediff/remotediff.go +++ b/service/space/remotediff/remotediff.go @@ -25,9 +25,9 @@ type remote struct { func (r remote) Ranges(ctx context.Context, ranges []ldiff.Range, resBuf []ldiff.RangeResult) (results []ldiff.RangeResult, err error) { results = resBuf[:0] - pbRanges := make([]*spacesync.DiffRangeRequestRange, 0, len(ranges)) + pbRanges := make([]*spacesync.DiffRange_Request_Range, 0, len(ranges)) for _, rg := range ranges { - pbRanges = append(pbRanges, &spacesync.DiffRangeRequestRange{ + pbRanges = append(pbRanges, &spacesync.DiffRange_Request_Range{ From: rg.From, To: rg.To, Limit: uint32(rg.Limit), @@ -35,10 +35,10 @@ func (r remote) Ranges(ctx context.Context, ranges []ldiff.Range, resBuf []ldiff } req := &spacesync.Space{ SpaceId: r.spaceId, - Message: &spacesync.SpaceContent{ - Value: &spacesync.SpaceContentValueOfDiffRange{ + Message: &spacesync.Space_Content{ + Value: &spacesync.Space_Content_DiffRange{ DiffRange: &spacesync.DiffRange{ - Request: &spacesync.DiffRangeRequest{ + Request: &spacesync.DiffRange_Request{ Ranges: pbRanges, }, }, @@ -99,21 +99,21 @@ func HandlerRangeRequest(ctx context.Context, d ldiff.Diff, diffRange *spacesync return } - var rangeResp = &spacesync.DiffRangeResponse{ - Results: make([]*spacesync.DiffRangeResponseResult, len(res)), + var rangeResp = &spacesync.DiffRange_Response{ + Results: make([]*spacesync.DiffRange_Response_Result, len(res)), } for _, rangeRes := range res { - var elements []*spacesync.DiffRangeResponseResultElement + var elements []*spacesync.DiffRange_Response_Result_Element if len(rangeRes.Elements) > 0 { - elements = make([]*spacesync.DiffRangeResponseResultElement, 0, len(rangeRes.Elements)) + elements = make([]*spacesync.DiffRange_Response_Result_Element, 0, len(rangeRes.Elements)) for _, el := range rangeRes.Elements { - elements = append(elements, &spacesync.DiffRangeResponseResultElement{ + elements = append(elements, &spacesync.DiffRange_Response_Result_Element{ Id: el.Id, Head: el.Head, }) } } - rangeResp.Results = append(rangeResp.Results, &spacesync.DiffRangeResponseResult{ + rangeResp.Results = append(rangeResp.Results, &spacesync.DiffRange_Response_Result{ Hash: rangeRes.Hash, Elements: elements, Count: uint32(rangeRes.Count), diff --git a/service/space/service.go b/service/space/service.go index 364ce91d..5e61366d 100644 --- a/service/space/service.go +++ b/service/space/service.go @@ -78,9 +78,9 @@ func (s *service) Handle(ctx context.Context, data []byte) (resp proto.Marshaler return } if spaceReq.SpaceId != "" { - sp, err := s.get(ctx, spaceReq.SpaceId) - if err != nil { - return + sp, e := s.get(ctx, spaceReq.SpaceId) + if e != nil { + return nil, e } return sp.Handle(ctx, spaceReq) } diff --git a/service/space/space.go b/service/space/space.go index 776df945..f35452c1 100644 --- a/service/space/space.go +++ b/service/space/space.go @@ -73,7 +73,7 @@ func (s *space) Handle(ctx context.Context, msg *spacesync.Space) (repl *spacesy return nil, er } return &spacesync.Space{SpaceId: s.id, Message: &spacesync.SpaceContent{ - Value: &spacesync.SpaceContentValueOfDiffRange{ + Value: &spacesync.SpaceContent_Value_DiffRange{ DiffRange: resp, }, }}, nil diff --git a/service/space/spacesync/spacesync.pb.go b/service/space/spacesync/spacesync.pb.go index 530c11e3..af6fd478 100644 --- a/service/space/spacesync/spacesync.pb.go +++ b/service/space/spacesync/spacesync.pb.go @@ -23,8 +23,8 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type Space struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - Message *SpaceContent `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Message *Space_Content `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` } func (m *Space) Reset() { *m = Space{} } @@ -67,31 +67,32 @@ func (m *Space) GetSpaceId() string { return "" } -func (m *Space) GetMessage() *SpaceContent { +func (m *Space) GetMessage() *Space_Content { if m != nil { return m.Message } return nil } -type SpaceContent struct { +type Space_Content struct { // Types that are valid to be assigned to Value: - // *SpaceContentValueOfDiffRange - Value IsSpaceContentValue `protobuf_oneof:"value"` + // + // *Space_Content_DiffRange + Value isSpace_Content_Value `protobuf_oneof:"value"` } -func (m *SpaceContent) Reset() { *m = SpaceContent{} } -func (m *SpaceContent) String() string { return proto.CompactTextString(m) } -func (*SpaceContent) ProtoMessage() {} -func (*SpaceContent) Descriptor() ([]byte, []int) { +func (m *Space_Content) Reset() { *m = Space_Content{} } +func (m *Space_Content) String() string { return proto.CompactTextString(m) } +func (*Space_Content) ProtoMessage() {} +func (*Space_Content) Descriptor() ([]byte, []int) { return fileDescriptor_11d78c2fb7c80384, []int{0, 0} } -func (m *SpaceContent) XXX_Unmarshal(b []byte) error { +func (m *Space_Content) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SpaceContent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Space_Content) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SpaceContent.Marshal(b, m, deterministic) + return xxx_messageInfo_Space_Content.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -101,54 +102,54 @@ func (m *SpaceContent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *SpaceContent) XXX_Merge(src proto.Message) { - xxx_messageInfo_SpaceContent.Merge(m, src) +func (m *Space_Content) XXX_Merge(src proto.Message) { + xxx_messageInfo_Space_Content.Merge(m, src) } -func (m *SpaceContent) XXX_Size() int { +func (m *Space_Content) XXX_Size() int { return m.Size() } -func (m *SpaceContent) XXX_DiscardUnknown() { - xxx_messageInfo_SpaceContent.DiscardUnknown(m) +func (m *Space_Content) XXX_DiscardUnknown() { + xxx_messageInfo_Space_Content.DiscardUnknown(m) } -var xxx_messageInfo_SpaceContent proto.InternalMessageInfo +var xxx_messageInfo_Space_Content proto.InternalMessageInfo -type IsSpaceContentValue interface { - IsSpaceContentValue() +type isSpace_Content_Value interface { + isSpace_Content_Value() MarshalTo([]byte) (int, error) Size() int } -type SpaceContentValueOfDiffRange struct { +type Space_Content_DiffRange struct { DiffRange *DiffRange `protobuf:"bytes,1,opt,name=diffRange,proto3,oneof" json:"diffRange,omitempty"` } -func (*SpaceContentValueOfDiffRange) IsSpaceContentValue() {} +func (*Space_Content_DiffRange) isSpace_Content_Value() {} -func (m *SpaceContent) GetValue() IsSpaceContentValue { +func (m *Space_Content) GetValue() isSpace_Content_Value { if m != nil { return m.Value } return nil } -func (m *SpaceContent) GetDiffRange() *DiffRange { - if x, ok := m.GetValue().(*SpaceContentValueOfDiffRange); ok { +func (m *Space_Content) GetDiffRange() *DiffRange { + if x, ok := m.GetValue().(*Space_Content_DiffRange); ok { return x.DiffRange } return nil } // XXX_OneofWrappers is for the internal use of the proto package. -func (*SpaceContent) XXX_OneofWrappers() []interface{} { +func (*Space_Content) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*SpaceContentValueOfDiffRange)(nil), + (*Space_Content_DiffRange)(nil), } } type DiffRange struct { - Request *DiffRangeRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - Response *DiffRangeResponse `protobuf:"bytes,2,opt,name=response,proto3" json:"response,omitempty"` + Request *DiffRange_Request `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + Response *DiffRange_Response `protobuf:"bytes,2,opt,name=response,proto3" json:"response,omitempty"` } func (m *DiffRange) Reset() { *m = DiffRange{} } @@ -184,36 +185,36 @@ func (m *DiffRange) XXX_DiscardUnknown() { var xxx_messageInfo_DiffRange proto.InternalMessageInfo -func (m *DiffRange) GetRequest() *DiffRangeRequest { +func (m *DiffRange) GetRequest() *DiffRange_Request { if m != nil { return m.Request } return nil } -func (m *DiffRange) GetResponse() *DiffRangeResponse { +func (m *DiffRange) GetResponse() *DiffRange_Response { if m != nil { return m.Response } return nil } -type DiffRangeRequest struct { - Ranges []*DiffRangeRequestRange `protobuf:"bytes,1,rep,name=ranges,proto3" json:"ranges,omitempty"` +type DiffRange_Request struct { + Ranges []*DiffRange_Request_Range `protobuf:"bytes,1,rep,name=ranges,proto3" json:"ranges,omitempty"` } -func (m *DiffRangeRequest) Reset() { *m = DiffRangeRequest{} } -func (m *DiffRangeRequest) String() string { return proto.CompactTextString(m) } -func (*DiffRangeRequest) ProtoMessage() {} -func (*DiffRangeRequest) Descriptor() ([]byte, []int) { +func (m *DiffRange_Request) Reset() { *m = DiffRange_Request{} } +func (m *DiffRange_Request) String() string { return proto.CompactTextString(m) } +func (*DiffRange_Request) ProtoMessage() {} +func (*DiffRange_Request) Descriptor() ([]byte, []int) { return fileDescriptor_11d78c2fb7c80384, []int{1, 0} } -func (m *DiffRangeRequest) XXX_Unmarshal(b []byte) error { +func (m *DiffRange_Request) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DiffRangeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DiffRange_Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DiffRangeRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_DiffRange_Request.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -223,43 +224,43 @@ func (m *DiffRangeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *DiffRangeRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DiffRangeRequest.Merge(m, src) +func (m *DiffRange_Request) XXX_Merge(src proto.Message) { + xxx_messageInfo_DiffRange_Request.Merge(m, src) } -func (m *DiffRangeRequest) XXX_Size() int { +func (m *DiffRange_Request) XXX_Size() int { return m.Size() } -func (m *DiffRangeRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DiffRangeRequest.DiscardUnknown(m) +func (m *DiffRange_Request) XXX_DiscardUnknown() { + xxx_messageInfo_DiffRange_Request.DiscardUnknown(m) } -var xxx_messageInfo_DiffRangeRequest proto.InternalMessageInfo +var xxx_messageInfo_DiffRange_Request proto.InternalMessageInfo -func (m *DiffRangeRequest) GetRanges() []*DiffRangeRequestRange { +func (m *DiffRange_Request) GetRanges() []*DiffRange_Request_Range { if m != nil { return m.Ranges } return nil } -type DiffRangeRequestRange struct { +type DiffRange_Request_Range struct { From uint64 `protobuf:"varint,1,opt,name=from,proto3" json:"from,omitempty"` To uint64 `protobuf:"varint,2,opt,name=to,proto3" json:"to,omitempty"` Limit uint32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` } -func (m *DiffRangeRequestRange) Reset() { *m = DiffRangeRequestRange{} } -func (m *DiffRangeRequestRange) String() string { return proto.CompactTextString(m) } -func (*DiffRangeRequestRange) ProtoMessage() {} -func (*DiffRangeRequestRange) Descriptor() ([]byte, []int) { +func (m *DiffRange_Request_Range) Reset() { *m = DiffRange_Request_Range{} } +func (m *DiffRange_Request_Range) String() string { return proto.CompactTextString(m) } +func (*DiffRange_Request_Range) ProtoMessage() {} +func (*DiffRange_Request_Range) Descriptor() ([]byte, []int) { return fileDescriptor_11d78c2fb7c80384, []int{1, 0, 0} } -func (m *DiffRangeRequestRange) XXX_Unmarshal(b []byte) error { +func (m *DiffRange_Request_Range) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DiffRangeRequestRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DiffRange_Request_Range) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DiffRangeRequestRange.Marshal(b, m, deterministic) + return xxx_messageInfo_DiffRange_Request_Range.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -269,55 +270,55 @@ func (m *DiffRangeRequestRange) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *DiffRangeRequestRange) XXX_Merge(src proto.Message) { - xxx_messageInfo_DiffRangeRequestRange.Merge(m, src) +func (m *DiffRange_Request_Range) XXX_Merge(src proto.Message) { + xxx_messageInfo_DiffRange_Request_Range.Merge(m, src) } -func (m *DiffRangeRequestRange) XXX_Size() int { +func (m *DiffRange_Request_Range) XXX_Size() int { return m.Size() } -func (m *DiffRangeRequestRange) XXX_DiscardUnknown() { - xxx_messageInfo_DiffRangeRequestRange.DiscardUnknown(m) +func (m *DiffRange_Request_Range) XXX_DiscardUnknown() { + xxx_messageInfo_DiffRange_Request_Range.DiscardUnknown(m) } -var xxx_messageInfo_DiffRangeRequestRange proto.InternalMessageInfo +var xxx_messageInfo_DiffRange_Request_Range proto.InternalMessageInfo -func (m *DiffRangeRequestRange) GetFrom() uint64 { +func (m *DiffRange_Request_Range) GetFrom() uint64 { if m != nil { return m.From } return 0 } -func (m *DiffRangeRequestRange) GetTo() uint64 { +func (m *DiffRange_Request_Range) GetTo() uint64 { if m != nil { return m.To } return 0 } -func (m *DiffRangeRequestRange) GetLimit() uint32 { +func (m *DiffRange_Request_Range) GetLimit() uint32 { if m != nil { return m.Limit } return 0 } -type DiffRangeResponse struct { - Results []*DiffRangeResponseResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +type DiffRange_Response struct { + Results []*DiffRange_Response_Result `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` } -func (m *DiffRangeResponse) Reset() { *m = DiffRangeResponse{} } -func (m *DiffRangeResponse) String() string { return proto.CompactTextString(m) } -func (*DiffRangeResponse) ProtoMessage() {} -func (*DiffRangeResponse) Descriptor() ([]byte, []int) { +func (m *DiffRange_Response) Reset() { *m = DiffRange_Response{} } +func (m *DiffRange_Response) String() string { return proto.CompactTextString(m) } +func (*DiffRange_Response) ProtoMessage() {} +func (*DiffRange_Response) Descriptor() ([]byte, []int) { return fileDescriptor_11d78c2fb7c80384, []int{1, 1} } -func (m *DiffRangeResponse) XXX_Unmarshal(b []byte) error { +func (m *DiffRange_Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DiffRangeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DiffRange_Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DiffRangeResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_DiffRange_Response.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -327,43 +328,43 @@ func (m *DiffRangeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *DiffRangeResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_DiffRangeResponse.Merge(m, src) +func (m *DiffRange_Response) XXX_Merge(src proto.Message) { + xxx_messageInfo_DiffRange_Response.Merge(m, src) } -func (m *DiffRangeResponse) XXX_Size() int { +func (m *DiffRange_Response) XXX_Size() int { return m.Size() } -func (m *DiffRangeResponse) XXX_DiscardUnknown() { - xxx_messageInfo_DiffRangeResponse.DiscardUnknown(m) +func (m *DiffRange_Response) XXX_DiscardUnknown() { + xxx_messageInfo_DiffRange_Response.DiscardUnknown(m) } -var xxx_messageInfo_DiffRangeResponse proto.InternalMessageInfo +var xxx_messageInfo_DiffRange_Response proto.InternalMessageInfo -func (m *DiffRangeResponse) GetResults() []*DiffRangeResponseResult { +func (m *DiffRange_Response) GetResults() []*DiffRange_Response_Result { if m != nil { return m.Results } return nil } -type DiffRangeResponseResult struct { - Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` - Elements []*DiffRangeResponseResultElement `protobuf:"bytes,2,rep,name=elements,proto3" json:"elements,omitempty"` - Count uint32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"` +type DiffRange_Response_Result struct { + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + Elements []*DiffRange_Response_Result_Element `protobuf:"bytes,2,rep,name=elements,proto3" json:"elements,omitempty"` + Count uint32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"` } -func (m *DiffRangeResponseResult) Reset() { *m = DiffRangeResponseResult{} } -func (m *DiffRangeResponseResult) String() string { return proto.CompactTextString(m) } -func (*DiffRangeResponseResult) ProtoMessage() {} -func (*DiffRangeResponseResult) Descriptor() ([]byte, []int) { +func (m *DiffRange_Response_Result) Reset() { *m = DiffRange_Response_Result{} } +func (m *DiffRange_Response_Result) String() string { return proto.CompactTextString(m) } +func (*DiffRange_Response_Result) ProtoMessage() {} +func (*DiffRange_Response_Result) Descriptor() ([]byte, []int) { return fileDescriptor_11d78c2fb7c80384, []int{1, 1, 0} } -func (m *DiffRangeResponseResult) XXX_Unmarshal(b []byte) error { +func (m *DiffRange_Response_Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DiffRangeResponseResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DiffRange_Response_Result) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DiffRangeResponseResult.Marshal(b, m, deterministic) + return xxx_messageInfo_DiffRange_Response_Result.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -373,56 +374,56 @@ func (m *DiffRangeResponseResult) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *DiffRangeResponseResult) XXX_Merge(src proto.Message) { - xxx_messageInfo_DiffRangeResponseResult.Merge(m, src) +func (m *DiffRange_Response_Result) XXX_Merge(src proto.Message) { + xxx_messageInfo_DiffRange_Response_Result.Merge(m, src) } -func (m *DiffRangeResponseResult) XXX_Size() int { +func (m *DiffRange_Response_Result) XXX_Size() int { return m.Size() } -func (m *DiffRangeResponseResult) XXX_DiscardUnknown() { - xxx_messageInfo_DiffRangeResponseResult.DiscardUnknown(m) +func (m *DiffRange_Response_Result) XXX_DiscardUnknown() { + xxx_messageInfo_DiffRange_Response_Result.DiscardUnknown(m) } -var xxx_messageInfo_DiffRangeResponseResult proto.InternalMessageInfo +var xxx_messageInfo_DiffRange_Response_Result proto.InternalMessageInfo -func (m *DiffRangeResponseResult) GetHash() []byte { +func (m *DiffRange_Response_Result) GetHash() []byte { if m != nil { return m.Hash } return nil } -func (m *DiffRangeResponseResult) GetElements() []*DiffRangeResponseResultElement { +func (m *DiffRange_Response_Result) GetElements() []*DiffRange_Response_Result_Element { if m != nil { return m.Elements } return nil } -func (m *DiffRangeResponseResult) GetCount() uint32 { +func (m *DiffRange_Response_Result) GetCount() uint32 { if m != nil { return m.Count } return 0 } -type DiffRangeResponseResultElement struct { +type DiffRange_Response_Result_Element struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Head string `protobuf:"bytes,2,opt,name=head,proto3" json:"head,omitempty"` } -func (m *DiffRangeResponseResultElement) Reset() { *m = DiffRangeResponseResultElement{} } -func (m *DiffRangeResponseResultElement) String() string { return proto.CompactTextString(m) } -func (*DiffRangeResponseResultElement) ProtoMessage() {} -func (*DiffRangeResponseResultElement) Descriptor() ([]byte, []int) { +func (m *DiffRange_Response_Result_Element) Reset() { *m = DiffRange_Response_Result_Element{} } +func (m *DiffRange_Response_Result_Element) String() string { return proto.CompactTextString(m) } +func (*DiffRange_Response_Result_Element) ProtoMessage() {} +func (*DiffRange_Response_Result_Element) Descriptor() ([]byte, []int) { return fileDescriptor_11d78c2fb7c80384, []int{1, 1, 0, 0} } -func (m *DiffRangeResponseResultElement) XXX_Unmarshal(b []byte) error { +func (m *DiffRange_Response_Result_Element) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DiffRangeResponseResultElement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DiffRange_Response_Result_Element) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DiffRangeResponseResultElement.Marshal(b, m, deterministic) + return xxx_messageInfo_DiffRange_Response_Result_Element.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -432,26 +433,26 @@ func (m *DiffRangeResponseResultElement) XXX_Marshal(b []byte, deterministic boo return b[:n], nil } } -func (m *DiffRangeResponseResultElement) XXX_Merge(src proto.Message) { - xxx_messageInfo_DiffRangeResponseResultElement.Merge(m, src) +func (m *DiffRange_Response_Result_Element) XXX_Merge(src proto.Message) { + xxx_messageInfo_DiffRange_Response_Result_Element.Merge(m, src) } -func (m *DiffRangeResponseResultElement) XXX_Size() int { +func (m *DiffRange_Response_Result_Element) XXX_Size() int { return m.Size() } -func (m *DiffRangeResponseResultElement) XXX_DiscardUnknown() { - xxx_messageInfo_DiffRangeResponseResultElement.DiscardUnknown(m) +func (m *DiffRange_Response_Result_Element) XXX_DiscardUnknown() { + xxx_messageInfo_DiffRange_Response_Result_Element.DiscardUnknown(m) } -var xxx_messageInfo_DiffRangeResponseResultElement proto.InternalMessageInfo +var xxx_messageInfo_DiffRange_Response_Result_Element proto.InternalMessageInfo -func (m *DiffRangeResponseResultElement) GetId() string { +func (m *DiffRange_Response_Result_Element) GetId() string { if m != nil { return m.Id } return "" } -func (m *DiffRangeResponseResultElement) GetHead() string { +func (m *DiffRange_Response_Result_Element) GetHead() string { if m != nil { return m.Head } @@ -460,13 +461,13 @@ func (m *DiffRangeResponseResultElement) GetHead() string { func init() { proto.RegisterType((*Space)(nil), "anytype.Space") - proto.RegisterType((*SpaceContent)(nil), "anytype.Space.Content") + proto.RegisterType((*Space_Content)(nil), "anytype.Space.Content") proto.RegisterType((*DiffRange)(nil), "anytype.DiffRange") - proto.RegisterType((*DiffRangeRequest)(nil), "anytype.DiffRange.Request") - proto.RegisterType((*DiffRangeRequestRange)(nil), "anytype.DiffRange.Request.Range") - proto.RegisterType((*DiffRangeResponse)(nil), "anytype.DiffRange.Response") - proto.RegisterType((*DiffRangeResponseResult)(nil), "anytype.DiffRange.Response.Result") - proto.RegisterType((*DiffRangeResponseResultElement)(nil), "anytype.DiffRange.Response.Result.Element") + proto.RegisterType((*DiffRange_Request)(nil), "anytype.DiffRange.Request") + proto.RegisterType((*DiffRange_Request_Range)(nil), "anytype.DiffRange.Request.Range") + proto.RegisterType((*DiffRange_Response)(nil), "anytype.DiffRange.Response") + proto.RegisterType((*DiffRange_Response_Result)(nil), "anytype.DiffRange.Response.Result") + proto.RegisterType((*DiffRange_Response_Result_Element)(nil), "anytype.DiffRange.Response.Result.Element") } func init() { @@ -546,7 +547,7 @@ func (m *Space) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SpaceContent) Marshal() (dAtA []byte, err error) { +func (m *Space_Content) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -556,12 +557,12 @@ func (m *SpaceContent) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SpaceContent) MarshalTo(dAtA []byte) (int, error) { +func (m *Space_Content) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SpaceContent) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Space_Content) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -578,12 +579,12 @@ func (m *SpaceContent) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SpaceContentValueOfDiffRange) MarshalTo(dAtA []byte) (int, error) { +func (m *Space_Content_DiffRange) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SpaceContentValueOfDiffRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Space_Content_DiffRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.DiffRange != nil { { @@ -646,7 +647,7 @@ func (m *DiffRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *DiffRangeRequest) Marshal() (dAtA []byte, err error) { +func (m *DiffRange_Request) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -656,12 +657,12 @@ func (m *DiffRangeRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DiffRangeRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *DiffRange_Request) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DiffRangeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DiffRange_Request) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -683,7 +684,7 @@ func (m *DiffRangeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *DiffRangeRequestRange) Marshal() (dAtA []byte, err error) { +func (m *DiffRange_Request_Range) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -693,12 +694,12 @@ func (m *DiffRangeRequestRange) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DiffRangeRequestRange) MarshalTo(dAtA []byte) (int, error) { +func (m *DiffRange_Request_Range) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DiffRangeRequestRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DiffRange_Request_Range) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -721,7 +722,7 @@ func (m *DiffRangeRequestRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *DiffRangeResponse) Marshal() (dAtA []byte, err error) { +func (m *DiffRange_Response) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -731,12 +732,12 @@ func (m *DiffRangeResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DiffRangeResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *DiffRange_Response) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DiffRangeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DiffRange_Response) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -758,7 +759,7 @@ func (m *DiffRangeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *DiffRangeResponseResult) Marshal() (dAtA []byte, err error) { +func (m *DiffRange_Response_Result) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -768,12 +769,12 @@ func (m *DiffRangeResponseResult) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DiffRangeResponseResult) MarshalTo(dAtA []byte) (int, error) { +func (m *DiffRange_Response_Result) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DiffRangeResponseResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DiffRange_Response_Result) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -807,7 +808,7 @@ func (m *DiffRangeResponseResult) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *DiffRangeResponseResultElement) Marshal() (dAtA []byte, err error) { +func (m *DiffRange_Response_Result_Element) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -817,12 +818,12 @@ func (m *DiffRangeResponseResultElement) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DiffRangeResponseResultElement) MarshalTo(dAtA []byte) (int, error) { +func (m *DiffRange_Response_Result_Element) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DiffRangeResponseResultElement) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DiffRange_Response_Result_Element) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -872,7 +873,7 @@ func (m *Space) Size() (n int) { return n } -func (m *SpaceContent) Size() (n int) { +func (m *Space_Content) Size() (n int) { if m == nil { return 0 } @@ -884,7 +885,7 @@ func (m *SpaceContent) Size() (n int) { return n } -func (m *SpaceContentValueOfDiffRange) Size() (n int) { +func (m *Space_Content_DiffRange) Size() (n int) { if m == nil { return 0 } @@ -913,7 +914,7 @@ func (m *DiffRange) Size() (n int) { return n } -func (m *DiffRangeRequest) Size() (n int) { +func (m *DiffRange_Request) Size() (n int) { if m == nil { return 0 } @@ -928,7 +929,7 @@ func (m *DiffRangeRequest) Size() (n int) { return n } -func (m *DiffRangeRequestRange) Size() (n int) { +func (m *DiffRange_Request_Range) Size() (n int) { if m == nil { return 0 } @@ -946,7 +947,7 @@ func (m *DiffRangeRequestRange) Size() (n int) { return n } -func (m *DiffRangeResponse) Size() (n int) { +func (m *DiffRange_Response) Size() (n int) { if m == nil { return 0 } @@ -961,7 +962,7 @@ func (m *DiffRangeResponse) Size() (n int) { return n } -func (m *DiffRangeResponseResult) Size() (n int) { +func (m *DiffRange_Response_Result) Size() (n int) { if m == nil { return 0 } @@ -983,7 +984,7 @@ func (m *DiffRangeResponseResult) Size() (n int) { return n } -func (m *DiffRangeResponseResultElement) Size() (n int) { +func (m *DiffRange_Response_Result_Element) Size() (n int) { if m == nil { return 0 } @@ -1097,7 +1098,7 @@ func (m *Space) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Message == nil { - m.Message = &SpaceContent{} + m.Message = &Space_Content{} } if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -1124,7 +1125,7 @@ func (m *Space) Unmarshal(dAtA []byte) error { } return nil } -func (m *SpaceContent) Unmarshal(dAtA []byte) error { +func (m *Space_Content) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1186,7 +1187,7 @@ func (m *SpaceContent) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &SpaceContentValueOfDiffRange{v} + m.Value = &Space_Content_DiffRange{v} iNdEx = postIndex default: iNdEx = preIndex @@ -1268,7 +1269,7 @@ func (m *DiffRange) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Request == nil { - m.Request = &DiffRangeRequest{} + m.Request = &DiffRange_Request{} } if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -1304,7 +1305,7 @@ func (m *DiffRange) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Response == nil { - m.Response = &DiffRangeResponse{} + m.Response = &DiffRange_Response{} } if err := m.Response.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -1331,7 +1332,7 @@ func (m *DiffRange) Unmarshal(dAtA []byte) error { } return nil } -func (m *DiffRangeRequest) Unmarshal(dAtA []byte) error { +func (m *DiffRange_Request) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1389,7 +1390,7 @@ func (m *DiffRangeRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Ranges = append(m.Ranges, &DiffRangeRequestRange{}) + m.Ranges = append(m.Ranges, &DiffRange_Request_Range{}) if err := m.Ranges[len(m.Ranges)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -1415,7 +1416,7 @@ func (m *DiffRangeRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *DiffRangeRequestRange) Unmarshal(dAtA []byte) error { +func (m *DiffRange_Request_Range) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1522,7 +1523,7 @@ func (m *DiffRangeRequestRange) Unmarshal(dAtA []byte) error { } return nil } -func (m *DiffRangeResponse) Unmarshal(dAtA []byte) error { +func (m *DiffRange_Response) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1580,7 +1581,7 @@ func (m *DiffRangeResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Results = append(m.Results, &DiffRangeResponseResult{}) + m.Results = append(m.Results, &DiffRange_Response_Result{}) if err := m.Results[len(m.Results)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -1606,7 +1607,7 @@ func (m *DiffRangeResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *DiffRangeResponseResult) Unmarshal(dAtA []byte) error { +func (m *DiffRange_Response_Result) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1698,7 +1699,7 @@ func (m *DiffRangeResponseResult) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Elements = append(m.Elements, &DiffRangeResponseResultElement{}) + m.Elements = append(m.Elements, &DiffRange_Response_Result_Element{}) if err := m.Elements[len(m.Elements)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -1743,7 +1744,7 @@ func (m *DiffRangeResponseResult) Unmarshal(dAtA []byte) error { } return nil } -func (m *DiffRangeResponseResultElement) Unmarshal(dAtA []byte) error { +func (m *DiffRange_Response_Result_Element) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { diff --git a/service/sync/document/service.go b/service/sync/document/service.go index b684e64b..03799c09 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -74,8 +74,8 @@ func (s *service) UpdateDocument(ctx context.Context, id, text string) (err erro err = s.treeCache.Do(ctx, id, func(tree acltree.ACLTree) error { ch, err = tree.AddContent(ctx, func(builder acltree.ChangeBuilder) error { builder.AddChangeContent( - &testchangepb.PlainTextChangeData{ - Content: []*testchangepb.PlainTextChangeContent{ + &testchangepb.PlainTextChange_Data{ + Content: []*testchangepb.PlainTextChange_Content{ createAppendTextChangeContent(text), }, }) @@ -100,7 +100,7 @@ func (s *service) UpdateDocument(ctx context.Context, id, text string) (err erro zap.String("header", header.String())). Debug("document updated in the database") - return s.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ + return s.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(&syncproto.Sync_HeadUpdate{ Heads: heads, Changes: []*aclpb.RawChange{ch}, TreeId: id, @@ -155,7 +155,7 @@ func (s *service) CreateDocument(ctx context.Context, text string) (id string, e log.With(zap.String("id", id), zap.String("text", text)). Debug("creating document") - err = s.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ + err = s.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(&syncproto.Sync_HeadUpdate{ Heads: heads, Changes: []*aclpb.RawChange{ch}, TreeId: id, @@ -169,18 +169,18 @@ func (s *service) CreateDocument(ctx context.Context, text string) (id string, e } func createInitialChangeContent(text string) proto.Marshaler { - return &testchangepb.PlainTextChangeData{ - Content: []*testchangepb.PlainTextChangeContent{ + return &testchangepb.PlainTextChange_Data{ + Content: []*testchangepb.PlainTextChange_Content{ createAppendTextChangeContent(text), }, - Snapshot: &testchangepb.PlainTextChangeSnapshot{Text: text}, + Snapshot: &testchangepb.PlainTextChange_Snapshot{Text: text}, } } -func createAppendTextChangeContent(text string) *testchangepb.PlainTextChangeContent { - return &testchangepb.PlainTextChangeContent{ - Value: &testchangepb.PlainTextChangeContentValueOfTextAppend{ - TextAppend: &testchangepb.PlainTextChangeTextAppend{ +func createAppendTextChangeContent(text string) *testchangepb.PlainTextChange_Content { + return &testchangepb.PlainTextChange_Content{ + Value: &testchangepb.PlainTextChange_Content_TextAppend{ + TextAppend: &testchangepb.PlainTextChange_TextAppend{ Text: text, }, }, diff --git a/service/sync/message/service.go b/service/sync/message/service.go index efe76900..7207a302 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -56,7 +56,7 @@ func (s *service) Close(ctx context.Context) (err error) { func (s *service) HandleMessage(ctx context.Context, msg *pool.Message) (err error) { defer func() { if err != nil { - msg.AckError(syncproto.SystemError_UNKNOWN, err.Error()) + msg.AckError(syncproto.System_Error_UNKNOWN, err.Error()) } else { msg.Ack() } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 2eb70551..2a960104 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -70,9 +70,9 @@ func (r *requestHandler) HandleSyncMessage(ctx context.Context, senderId string, return nil } -func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, update *syncproto.SyncHeadUpdate) (err error) { +func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, update *syncproto.Sync_HeadUpdate) (err error) { var ( - fullRequest *syncproto.SyncFullRequest + fullRequest *syncproto.Sync_Full_Request snapshotPath []string result acltree.AddResult ) @@ -100,7 +100,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, // if there are no such tree if err == treestorage.ErrUnknownTreeId { // TODO: maybe we can optimize this by sending the header and stuff right away, so when the tree is created we are able to add it on first request - fullRequest = &syncproto.SyncFullRequest{ + fullRequest = &syncproto.Sync_Full_Request{ TreeId: update.TreeId, TreeHeader: update.TreeHeader, } @@ -114,7 +114,7 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, return err } // otherwise sending heads update message - newUpdate := &syncproto.SyncHeadUpdate{ + newUpdate := &syncproto.Sync_HeadUpdate{ Heads: result.Heads, Changes: result.Added, SnapshotPath: snapshotPath, @@ -124,9 +124,9 @@ func (r *requestHandler) HandleHeadUpdate(ctx context.Context, senderId string, return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate)) } -func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncproto.SyncFullRequest) (err error) { +func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId string, request *syncproto.Sync_Full_Request) (err error) { var ( - fullResponse *syncproto.SyncFullResponse + fullResponse *syncproto.Sync_Full_Response snapshotPath []string result acltree.AddResult ) @@ -159,7 +159,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str } // otherwise sending heads update message - newUpdate := &syncproto.SyncHeadUpdate{ + newUpdate := &syncproto.Sync_HeadUpdate{ Heads: result.Heads, Changes: result.Added, SnapshotPath: snapshotPath, @@ -169,7 +169,7 @@ func (r *requestHandler) HandleFullSyncRequest(ctx context.Context, senderId str return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate)) } -func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncproto.SyncFullResponse) (err error) { +func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId string, response *syncproto.Sync_Full_Response) (err error) { var ( snapshotPath []string result acltree.AddResult @@ -203,7 +203,7 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st } } // sending heads update message - newUpdate := &syncproto.SyncHeadUpdate{ + newUpdate := &syncproto.Sync_HeadUpdate{ Heads: result.Heads, Changes: result.Added, SnapshotPath: snapshotPath, @@ -212,12 +212,12 @@ func (r *requestHandler) HandleFullSyncResponse(ctx context.Context, senderId st return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate)) } -func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, tree acltree.ACLTree) (*syncproto.SyncFullRequest, error) { +func (r *requestHandler) prepareFullSyncRequest(treeId string, header *treepb.TreeHeader, theirPath []string, tree acltree.ACLTree) (*syncproto.Sync_Full_Request, error) { ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) if err != nil { return nil, err } - return &syncproto.SyncFullRequest{ + return &syncproto.Sync_Full_Request{ Heads: tree.Heads(), Changes: ourChanges, TreeId: treeId, @@ -230,7 +230,7 @@ func (r *requestHandler) prepareFullSyncResponse( treeId string, theirPath []string, theirChanges []*aclpb.RawChange, - tree acltree.ACLTree) (*syncproto.SyncFullResponse, error) { + tree acltree.ACLTree) (*syncproto.Sync_Full_Response, error) { // TODO: we can probably use the common snapshot calculated on the request step from previous peer ourChanges, err := tree.ChangesAfterCommonSnapshot(theirPath) if err != nil { @@ -251,7 +251,7 @@ func (r *requestHandler) prepareFullSyncResponse( log.With(zap.Int("len(changes)", len(final)), zap.String("id", treeId)). Debug("preparing changes for tree") - return &syncproto.SyncFullResponse{ + return &syncproto.Sync_Full_Response{ Heads: tree.Heads(), Changes: final, TreeId: treeId, @@ -260,7 +260,7 @@ func (r *requestHandler) prepareFullSyncResponse( }, nil } -func (r *requestHandler) createTree(ctx context.Context, response *syncproto.SyncFullResponse) error { +func (r *requestHandler) createTree(ctx context.Context, response *syncproto.Sync_Full_Response) error { return r.treeCache.Add( ctx, response.TreeId, diff --git a/syncproto/helpers.go b/syncproto/helpers.go index e3059bda..fe19c267 100644 --- a/syncproto/helpers.go +++ b/syncproto/helpers.go @@ -1,19 +1,19 @@ package syncproto -func WrapHeadUpdate(update *SyncHeadUpdate) *Sync { - return &Sync{Message: &SyncContentValue{ - Value: &SyncContentValueValueOfHeadUpdate{HeadUpdate: update}, +func WrapHeadUpdate(update *Sync_HeadUpdate) *Sync { + return &Sync{Message: &Sync_ContentValue{ + Value: &Sync_Content_Value_HeadUpdate{HeadUpdate: update}, }} } -func WrapFullRequest(request *SyncFullRequest) *Sync { - return &Sync{Message: &SyncContentValue{ - Value: &SyncContentValueValueOfFullSyncRequest{FullSyncRequest: request}, +func WrapFullRequest(request *Sync_Full_Request) *Sync { + return &Sync{Message: &Sync_ContentValue{ + Value: &Sync_Content_Value_FullSyncRequest{FullSyncRequest: request}, }} } -func WrapFullResponse(response *SyncFullResponse) *Sync { - return &Sync{Message: &SyncContentValue{ - Value: &SyncContentValueValueOfFullSyncResponse{FullSyncResponse: response}, +func WrapFullResponse(response *Sync_Full_Response) *Sync { + return &Sync{Message: &Sync_ContentValue{ + Value: &Sync_Content_Value_FullSyncResponse{FullSyncResponse: response}, }} } diff --git a/syncproto/sync.pb.go b/syncproto/sync.pb.go index aa69618b..e8df4661 100644 --- a/syncproto/sync.pb.go +++ b/syncproto/sync.pb.go @@ -52,28 +52,28 @@ func (MessageType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{0} } -type SystemErrorCode int32 +type System_Error_Code int32 const ( - SystemError_UNKNOWN SystemErrorCode = 0 - SystemError_UNSUPPORTED_PROTOCOL_VERSION SystemErrorCode = 10 + System_Error_UNKNOWN System_Error_Code = 0 + System_Error_UNSUPPORTED_PROTOCOL_VERSION System_Error_Code = 10 ) -var SystemErrorCode_name = map[int32]string{ +var System_Error_Code_name = map[int32]string{ 0: "UNKNOWN", 10: "UNSUPPORTED_PROTOCOL_VERSION", } -var SystemErrorCode_value = map[string]int32{ +var System_Error_Code_value = map[string]int32{ "UNKNOWN": 0, "UNSUPPORTED_PROTOCOL_VERSION": 10, } -func (x SystemErrorCode) String() string { - return proto.EnumName(SystemErrorCode_name, int32(x)) +func (x System_Error_Code) String() string { + return proto.EnumName(System_Error_Code_name, int32(x)) } -func (SystemErrorCode) EnumDescriptor() ([]byte, []int) { +func (System_Error_Code) EnumDescriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{2, 3, 0} } @@ -206,9 +206,9 @@ func (m *Header) GetDebugInfo() string { } type System struct { - Handshake *SystemHandshake `protobuf:"bytes,1,opt,name=handshake,proto3" json:"handshake,omitempty"` - Ping *SystemPing `protobuf:"bytes,2,opt,name=ping,proto3" json:"ping,omitempty"` - Ack *SystemAck `protobuf:"bytes,3,opt,name=ack,proto3" json:"ack,omitempty"` + Handshake *System_Handshake `protobuf:"bytes,1,opt,name=handshake,proto3" json:"handshake,omitempty"` + Ping *System_Ping `protobuf:"bytes,2,opt,name=ping,proto3" json:"ping,omitempty"` + Ack *System_Ack `protobuf:"bytes,3,opt,name=ack,proto3" json:"ack,omitempty"` } func (m *System) Reset() { *m = System{} } @@ -244,43 +244,43 @@ func (m *System) XXX_DiscardUnknown() { var xxx_messageInfo_System proto.InternalMessageInfo -func (m *System) GetHandshake() *SystemHandshake { +func (m *System) GetHandshake() *System_Handshake { if m != nil { return m.Handshake } return nil } -func (m *System) GetPing() *SystemPing { +func (m *System) GetPing() *System_Ping { if m != nil { return m.Ping } return nil } -func (m *System) GetAck() *SystemAck { +func (m *System) GetAck() *System_Ack { if m != nil { return m.Ack } return nil } -type SystemHandshake struct { +type System_Handshake struct { ProtocolVersion string `protobuf:"bytes,1,opt,name=protocolVersion,proto3" json:"protocolVersion,omitempty"` } -func (m *SystemHandshake) Reset() { *m = SystemHandshake{} } -func (m *SystemHandshake) String() string { return proto.CompactTextString(m) } -func (*SystemHandshake) ProtoMessage() {} -func (*SystemHandshake) Descriptor() ([]byte, []int) { +func (m *System_Handshake) Reset() { *m = System_Handshake{} } +func (m *System_Handshake) String() string { return proto.CompactTextString(m) } +func (*System_Handshake) ProtoMessage() {} +func (*System_Handshake) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{2, 0} } -func (m *SystemHandshake) XXX_Unmarshal(b []byte) error { +func (m *System_Handshake) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SystemHandshake) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *System_Handshake) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SystemHandshake.Marshal(b, m, deterministic) + return xxx_messageInfo_System_Handshake.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -290,41 +290,41 @@ func (m *SystemHandshake) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *SystemHandshake) XXX_Merge(src proto.Message) { - xxx_messageInfo_SystemHandshake.Merge(m, src) +func (m *System_Handshake) XXX_Merge(src proto.Message) { + xxx_messageInfo_System_Handshake.Merge(m, src) } -func (m *SystemHandshake) XXX_Size() int { +func (m *System_Handshake) XXX_Size() int { return m.Size() } -func (m *SystemHandshake) XXX_DiscardUnknown() { - xxx_messageInfo_SystemHandshake.DiscardUnknown(m) +func (m *System_Handshake) XXX_DiscardUnknown() { + xxx_messageInfo_System_Handshake.DiscardUnknown(m) } -var xxx_messageInfo_SystemHandshake proto.InternalMessageInfo +var xxx_messageInfo_System_Handshake proto.InternalMessageInfo -func (m *SystemHandshake) GetProtocolVersion() string { +func (m *System_Handshake) GetProtocolVersion() string { if m != nil { return m.ProtocolVersion } return "" } -type SystemPing struct { +type System_Ping struct { UnixTime uint64 `protobuf:"varint,1,opt,name=unixTime,proto3" json:"unixTime,omitempty"` } -func (m *SystemPing) Reset() { *m = SystemPing{} } -func (m *SystemPing) String() string { return proto.CompactTextString(m) } -func (*SystemPing) ProtoMessage() {} -func (*SystemPing) Descriptor() ([]byte, []int) { +func (m *System_Ping) Reset() { *m = System_Ping{} } +func (m *System_Ping) String() string { return proto.CompactTextString(m) } +func (*System_Ping) ProtoMessage() {} +func (*System_Ping) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{2, 1} } -func (m *SystemPing) XXX_Unmarshal(b []byte) error { +func (m *System_Ping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SystemPing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *System_Ping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SystemPing.Marshal(b, m, deterministic) + return xxx_messageInfo_System_Ping.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -334,41 +334,41 @@ func (m *SystemPing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *SystemPing) XXX_Merge(src proto.Message) { - xxx_messageInfo_SystemPing.Merge(m, src) +func (m *System_Ping) XXX_Merge(src proto.Message) { + xxx_messageInfo_System_Ping.Merge(m, src) } -func (m *SystemPing) XXX_Size() int { +func (m *System_Ping) XXX_Size() int { return m.Size() } -func (m *SystemPing) XXX_DiscardUnknown() { - xxx_messageInfo_SystemPing.DiscardUnknown(m) +func (m *System_Ping) XXX_DiscardUnknown() { + xxx_messageInfo_System_Ping.DiscardUnknown(m) } -var xxx_messageInfo_SystemPing proto.InternalMessageInfo +var xxx_messageInfo_System_Ping proto.InternalMessageInfo -func (m *SystemPing) GetUnixTime() uint64 { +func (m *System_Ping) GetUnixTime() uint64 { if m != nil { return m.UnixTime } return 0 } -type SystemAck struct { - Error *SystemError `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +type System_Ack struct { + Error *System_Error `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` } -func (m *SystemAck) Reset() { *m = SystemAck{} } -func (m *SystemAck) String() string { return proto.CompactTextString(m) } -func (*SystemAck) ProtoMessage() {} -func (*SystemAck) Descriptor() ([]byte, []int) { +func (m *System_Ack) Reset() { *m = System_Ack{} } +func (m *System_Ack) String() string { return proto.CompactTextString(m) } +func (*System_Ack) ProtoMessage() {} +func (*System_Ack) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{2, 2} } -func (m *SystemAck) XXX_Unmarshal(b []byte) error { +func (m *System_Ack) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SystemAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *System_Ack) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SystemAck.Marshal(b, m, deterministic) + return xxx_messageInfo_System_Ack.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -378,42 +378,42 @@ func (m *SystemAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *SystemAck) XXX_Merge(src proto.Message) { - xxx_messageInfo_SystemAck.Merge(m, src) +func (m *System_Ack) XXX_Merge(src proto.Message) { + xxx_messageInfo_System_Ack.Merge(m, src) } -func (m *SystemAck) XXX_Size() int { +func (m *System_Ack) XXX_Size() int { return m.Size() } -func (m *SystemAck) XXX_DiscardUnknown() { - xxx_messageInfo_SystemAck.DiscardUnknown(m) +func (m *System_Ack) XXX_DiscardUnknown() { + xxx_messageInfo_System_Ack.DiscardUnknown(m) } -var xxx_messageInfo_SystemAck proto.InternalMessageInfo +var xxx_messageInfo_System_Ack proto.InternalMessageInfo -func (m *SystemAck) GetError() *SystemError { +func (m *System_Ack) GetError() *System_Error { if m != nil { return m.Error } return nil } -type SystemError struct { - Code SystemErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.SystemErrorCode" json:"code,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +type System_Error struct { + Code System_Error_Code `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.System_Error_Code" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` } -func (m *SystemError) Reset() { *m = SystemError{} } -func (m *SystemError) String() string { return proto.CompactTextString(m) } -func (*SystemError) ProtoMessage() {} -func (*SystemError) Descriptor() ([]byte, []int) { +func (m *System_Error) Reset() { *m = System_Error{} } +func (m *System_Error) String() string { return proto.CompactTextString(m) } +func (*System_Error) ProtoMessage() {} +func (*System_Error) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{2, 3} } -func (m *SystemError) XXX_Unmarshal(b []byte) error { +func (m *System_Error) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SystemError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *System_Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SystemError.Marshal(b, m, deterministic) + return xxx_messageInfo_System_Error.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -423,26 +423,26 @@ func (m *SystemError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *SystemError) XXX_Merge(src proto.Message) { - xxx_messageInfo_SystemError.Merge(m, src) +func (m *System_Error) XXX_Merge(src proto.Message) { + xxx_messageInfo_System_Error.Merge(m, src) } -func (m *SystemError) XXX_Size() int { +func (m *System_Error) XXX_Size() int { return m.Size() } -func (m *SystemError) XXX_DiscardUnknown() { - xxx_messageInfo_SystemError.DiscardUnknown(m) +func (m *System_Error) XXX_DiscardUnknown() { + xxx_messageInfo_System_Error.DiscardUnknown(m) } -var xxx_messageInfo_SystemError proto.InternalMessageInfo +var xxx_messageInfo_System_Error proto.InternalMessageInfo -func (m *SystemError) GetCode() SystemErrorCode { +func (m *System_Error) GetCode() System_Error_Code { if m != nil { return m.Code } - return SystemError_UNKNOWN + return System_Error_UNKNOWN } -func (m *SystemError) GetDescription() string { +func (m *System_Error) GetDescription() string { if m != nil { return m.Description } @@ -450,8 +450,8 @@ func (m *SystemError) GetDescription() string { } type Sync struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - Message *SyncContentValue `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Message *Sync_ContentValue `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` } func (m *Sync) Reset() { *m = Sync{} } @@ -494,33 +494,33 @@ func (m *Sync) GetSpaceId() string { return "" } -func (m *Sync) GetMessage() *SyncContentValue { +func (m *Sync) GetMessage() *Sync_ContentValue { if m != nil { return m.Message } return nil } -type SyncContentValue struct { +type Sync_ContentValue struct { // Types that are valid to be assigned to Value: - // *SyncContentValueValueOfHeadUpdate - // *SyncContentValueValueOfFullSyncRequest - // *SyncContentValueValueOfFullSyncResponse - Value IsSyncContentValueValue `protobuf_oneof:"value"` + // *Sync_Content_Value_HeadUpdate + // *Sync_Content_Value_FullSyncRequest + // *Sync_Content_Value_FullSyncResponse + Value isSync_Content_Value_Value `protobuf_oneof:"value"` } -func (m *SyncContentValue) Reset() { *m = SyncContentValue{} } -func (m *SyncContentValue) String() string { return proto.CompactTextString(m) } -func (*SyncContentValue) ProtoMessage() {} -func (*SyncContentValue) Descriptor() ([]byte, []int) { +func (m *Sync_ContentValue) Reset() { *m = Sync_ContentValue{} } +func (m *Sync_ContentValue) String() string { return proto.CompactTextString(m) } +func (*Sync_ContentValue) ProtoMessage() {} +func (*Sync_ContentValue) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{3, 0} } -func (m *SyncContentValue) XXX_Unmarshal(b []byte) error { +func (m *Sync_ContentValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SyncContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Sync_ContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SyncContentValue.Marshal(b, m, deterministic) + return xxx_messageInfo_Sync_ContentValue.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -530,76 +530,76 @@ func (m *SyncContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *SyncContentValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncContentValue.Merge(m, src) +func (m *Sync_ContentValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_Sync_ContentValue.Merge(m, src) } -func (m *SyncContentValue) XXX_Size() int { +func (m *Sync_ContentValue) XXX_Size() int { return m.Size() } -func (m *SyncContentValue) XXX_DiscardUnknown() { - xxx_messageInfo_SyncContentValue.DiscardUnknown(m) +func (m *Sync_ContentValue) XXX_DiscardUnknown() { + xxx_messageInfo_Sync_ContentValue.DiscardUnknown(m) } -var xxx_messageInfo_SyncContentValue proto.InternalMessageInfo +var xxx_messageInfo_Sync_ContentValue proto.InternalMessageInfo -type IsSyncContentValueValue interface { - IsSyncContentValueValue() +type isSync_Content_Value_Value interface { + isSync_Content_Value_Value() MarshalTo([]byte) (int, error) Size() int } -type SyncContentValueValueOfHeadUpdate struct { - HeadUpdate *SyncHeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` +type Sync_Content_Value_HeadUpdate struct { + HeadUpdate *Sync_HeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` } -type SyncContentValueValueOfFullSyncRequest struct { - FullSyncRequest *SyncFullRequest `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` +type Sync_Content_Value_FullSyncRequest struct { + FullSyncRequest *Sync_Full_Request `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` } -type SyncContentValueValueOfFullSyncResponse struct { - FullSyncResponse *SyncFullResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` +type Sync_Content_Value_FullSyncResponse struct { + FullSyncResponse *Sync_Full_Response `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` } -func (*SyncContentValueValueOfHeadUpdate) IsSyncContentValueValue() {} -func (*SyncContentValueValueOfFullSyncRequest) IsSyncContentValueValue() {} -func (*SyncContentValueValueOfFullSyncResponse) IsSyncContentValueValue() {} +func (*Sync_Content_Value_HeadUpdate) isSync_Content_Value_Value() {} +func (*Sync_Content_Value_FullSyncRequest) isSync_Content_Value_Value() {} +func (*Sync_Content_Value_FullSyncResponse) isSync_Content_Value_Value() {} -func (m *SyncContentValue) GetValue() IsSyncContentValueValue { +func (m *Sync_ContentValue) GetValue() isSync_Content_Value_Value { if m != nil { return m.Value } return nil } -func (m *SyncContentValue) GetHeadUpdate() *SyncHeadUpdate { - if x, ok := m.GetValue().(*SyncContentValueValueOfHeadUpdate); ok { +func (m *Sync_ContentValue) GetHeadUpdate() *Sync_HeadUpdate { + if x, ok := m.GetValue().(*Sync_Content_Value_HeadUpdate); ok { return x.HeadUpdate } return nil } -func (m *SyncContentValue) GetFullSyncRequest() *SyncFullRequest { - if x, ok := m.GetValue().(*SyncContentValueValueOfFullSyncRequest); ok { +func (m *Sync_ContentValue) GetFullSyncRequest() *Sync_Full_Request { + if x, ok := m.GetValue().(*Sync_Content_Value_FullSyncRequest); ok { return x.FullSyncRequest } return nil } -func (m *SyncContentValue) GetFullSyncResponse() *SyncFullResponse { - if x, ok := m.GetValue().(*SyncContentValueValueOfFullSyncResponse); ok { +func (m *Sync_ContentValue) GetFullSyncResponse() *Sync_Full_Response { + if x, ok := m.GetValue().(*Sync_Content_Value_FullSyncResponse); ok { return x.FullSyncResponse } return nil } // XXX_OneofWrappers is for the internal use of the proto package. -func (*SyncContentValue) XXX_OneofWrappers() []interface{} { +func (*Sync_ContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*SyncContentValueValueOfHeadUpdate)(nil), - (*SyncContentValueValueOfFullSyncRequest)(nil), - (*SyncContentValueValueOfFullSyncResponse)(nil), + (*Sync_Content_Value_HeadUpdate)(nil), + (*Sync_Content_Value_FullSyncRequest)(nil), + (*Sync_Content_Value_FullSyncResponse)(nil), } } -type SyncHeadUpdate struct { +type Sync_HeadUpdate struct { Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` @@ -607,18 +607,18 @@ type SyncHeadUpdate struct { TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` } -func (m *SyncHeadUpdate) Reset() { *m = SyncHeadUpdate{} } -func (m *SyncHeadUpdate) String() string { return proto.CompactTextString(m) } -func (*SyncHeadUpdate) ProtoMessage() {} -func (*SyncHeadUpdate) Descriptor() ([]byte, []int) { +func (m *Sync_HeadUpdate) Reset() { *m = Sync_HeadUpdate{} } +func (m *Sync_HeadUpdate) String() string { return proto.CompactTextString(m) } +func (*Sync_HeadUpdate) ProtoMessage() {} +func (*Sync_HeadUpdate) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{3, 1} } -func (m *SyncHeadUpdate) XXX_Unmarshal(b []byte) error { +func (m *Sync_HeadUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SyncHeadUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Sync_HeadUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SyncHeadUpdate.Marshal(b, m, deterministic) + return xxx_messageInfo_Sync_HeadUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -628,68 +628,68 @@ func (m *SyncHeadUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } -func (m *SyncHeadUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncHeadUpdate.Merge(m, src) +func (m *Sync_HeadUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_Sync_HeadUpdate.Merge(m, src) } -func (m *SyncHeadUpdate) XXX_Size() int { +func (m *Sync_HeadUpdate) XXX_Size() int { return m.Size() } -func (m *SyncHeadUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_SyncHeadUpdate.DiscardUnknown(m) +func (m *Sync_HeadUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_Sync_HeadUpdate.DiscardUnknown(m) } -var xxx_messageInfo_SyncHeadUpdate proto.InternalMessageInfo +var xxx_messageInfo_Sync_HeadUpdate proto.InternalMessageInfo -func (m *SyncHeadUpdate) GetHeads() []string { +func (m *Sync_HeadUpdate) GetHeads() []string { if m != nil { return m.Heads } return nil } -func (m *SyncHeadUpdate) GetChanges() []*aclpb.RawChange { +func (m *Sync_HeadUpdate) GetChanges() []*aclpb.RawChange { if m != nil { return m.Changes } return nil } -func (m *SyncHeadUpdate) GetTreeId() string { +func (m *Sync_HeadUpdate) GetTreeId() string { if m != nil { return m.TreeId } return "" } -func (m *SyncHeadUpdate) GetSnapshotPath() []string { +func (m *Sync_HeadUpdate) GetSnapshotPath() []string { if m != nil { return m.SnapshotPath } return nil } -func (m *SyncHeadUpdate) GetTreeHeader() *treepb.TreeHeader { +func (m *Sync_HeadUpdate) GetTreeHeader() *treepb.TreeHeader { if m != nil { return m.TreeHeader } return nil } -type SyncFull struct { +type Sync_Full struct { } -func (m *SyncFull) Reset() { *m = SyncFull{} } -func (m *SyncFull) String() string { return proto.CompactTextString(m) } -func (*SyncFull) ProtoMessage() {} -func (*SyncFull) Descriptor() ([]byte, []int) { +func (m *Sync_Full) Reset() { *m = Sync_Full{} } +func (m *Sync_Full) String() string { return proto.CompactTextString(m) } +func (*Sync_Full) ProtoMessage() {} +func (*Sync_Full) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{3, 2} } -func (m *SyncFull) XXX_Unmarshal(b []byte) error { +func (m *Sync_Full) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SyncFull) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Sync_Full) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SyncFull.Marshal(b, m, deterministic) + return xxx_messageInfo_Sync_Full.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -699,20 +699,20 @@ func (m *SyncFull) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *SyncFull) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncFull.Merge(m, src) +func (m *Sync_Full) XXX_Merge(src proto.Message) { + xxx_messageInfo_Sync_Full.Merge(m, src) } -func (m *SyncFull) XXX_Size() int { +func (m *Sync_Full) XXX_Size() int { return m.Size() } -func (m *SyncFull) XXX_DiscardUnknown() { - xxx_messageInfo_SyncFull.DiscardUnknown(m) +func (m *Sync_Full) XXX_DiscardUnknown() { + xxx_messageInfo_Sync_Full.DiscardUnknown(m) } -var xxx_messageInfo_SyncFull proto.InternalMessageInfo +var xxx_messageInfo_Sync_Full proto.InternalMessageInfo // here with send the request with all changes we have (we already know sender's snapshot path) -type SyncFullRequest struct { +type Sync_Full_Request struct { Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` @@ -720,18 +720,18 @@ type SyncFullRequest struct { TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` } -func (m *SyncFullRequest) Reset() { *m = SyncFullRequest{} } -func (m *SyncFullRequest) String() string { return proto.CompactTextString(m) } -func (*SyncFullRequest) ProtoMessage() {} -func (*SyncFullRequest) Descriptor() ([]byte, []int) { +func (m *Sync_Full_Request) Reset() { *m = Sync_Full_Request{} } +func (m *Sync_Full_Request) String() string { return proto.CompactTextString(m) } +func (*Sync_Full_Request) ProtoMessage() {} +func (*Sync_Full_Request) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{3, 2, 0} } -func (m *SyncFullRequest) XXX_Unmarshal(b []byte) error { +func (m *Sync_Full_Request) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SyncFullRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Sync_Full_Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SyncFullRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Sync_Full_Request.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -741,54 +741,54 @@ func (m *SyncFullRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *SyncFullRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncFullRequest.Merge(m, src) +func (m *Sync_Full_Request) XXX_Merge(src proto.Message) { + xxx_messageInfo_Sync_Full_Request.Merge(m, src) } -func (m *SyncFullRequest) XXX_Size() int { +func (m *Sync_Full_Request) XXX_Size() int { return m.Size() } -func (m *SyncFullRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SyncFullRequest.DiscardUnknown(m) +func (m *Sync_Full_Request) XXX_DiscardUnknown() { + xxx_messageInfo_Sync_Full_Request.DiscardUnknown(m) } -var xxx_messageInfo_SyncFullRequest proto.InternalMessageInfo +var xxx_messageInfo_Sync_Full_Request proto.InternalMessageInfo -func (m *SyncFullRequest) GetHeads() []string { +func (m *Sync_Full_Request) GetHeads() []string { if m != nil { return m.Heads } return nil } -func (m *SyncFullRequest) GetChanges() []*aclpb.RawChange { +func (m *Sync_Full_Request) GetChanges() []*aclpb.RawChange { if m != nil { return m.Changes } return nil } -func (m *SyncFullRequest) GetTreeId() string { +func (m *Sync_Full_Request) GetTreeId() string { if m != nil { return m.TreeId } return "" } -func (m *SyncFullRequest) GetSnapshotPath() []string { +func (m *Sync_Full_Request) GetSnapshotPath() []string { if m != nil { return m.SnapshotPath } return nil } -func (m *SyncFullRequest) GetTreeHeader() *treepb.TreeHeader { +func (m *Sync_Full_Request) GetTreeHeader() *treepb.TreeHeader { if m != nil { return m.TreeHeader } return nil } -type SyncFullResponse struct { +type Sync_Full_Response struct { Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` TreeId string `protobuf:"bytes,3,opt,name=treeId,proto3" json:"treeId,omitempty"` @@ -796,18 +796,18 @@ type SyncFullResponse struct { TreeHeader *treepb.TreeHeader `protobuf:"bytes,5,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` } -func (m *SyncFullResponse) Reset() { *m = SyncFullResponse{} } -func (m *SyncFullResponse) String() string { return proto.CompactTextString(m) } -func (*SyncFullResponse) ProtoMessage() {} -func (*SyncFullResponse) Descriptor() ([]byte, []int) { +func (m *Sync_Full_Response) Reset() { *m = Sync_Full_Response{} } +func (m *Sync_Full_Response) String() string { return proto.CompactTextString(m) } +func (*Sync_Full_Response) ProtoMessage() {} +func (*Sync_Full_Response) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{3, 2, 1} } -func (m *SyncFullResponse) XXX_Unmarshal(b []byte) error { +func (m *Sync_Full_Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SyncFullResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Sync_Full_Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SyncFullResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_Sync_Full_Response.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -817,47 +817,47 @@ func (m *SyncFullResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *SyncFullResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncFullResponse.Merge(m, src) +func (m *Sync_Full_Response) XXX_Merge(src proto.Message) { + xxx_messageInfo_Sync_Full_Response.Merge(m, src) } -func (m *SyncFullResponse) XXX_Size() int { +func (m *Sync_Full_Response) XXX_Size() int { return m.Size() } -func (m *SyncFullResponse) XXX_DiscardUnknown() { - xxx_messageInfo_SyncFullResponse.DiscardUnknown(m) +func (m *Sync_Full_Response) XXX_DiscardUnknown() { + xxx_messageInfo_Sync_Full_Response.DiscardUnknown(m) } -var xxx_messageInfo_SyncFullResponse proto.InternalMessageInfo +var xxx_messageInfo_Sync_Full_Response proto.InternalMessageInfo -func (m *SyncFullResponse) GetHeads() []string { +func (m *Sync_Full_Response) GetHeads() []string { if m != nil { return m.Heads } return nil } -func (m *SyncFullResponse) GetChanges() []*aclpb.RawChange { +func (m *Sync_Full_Response) GetChanges() []*aclpb.RawChange { if m != nil { return m.Changes } return nil } -func (m *SyncFullResponse) GetTreeId() string { +func (m *Sync_Full_Response) GetTreeId() string { if m != nil { return m.TreeId } return "" } -func (m *SyncFullResponse) GetSnapshotPath() []string { +func (m *Sync_Full_Response) GetSnapshotPath() []string { if m != nil { return m.SnapshotPath } return nil } -func (m *SyncFullResponse) GetTreeHeader() *treepb.TreeHeader { +func (m *Sync_Full_Response) GetTreeHeader() *treepb.TreeHeader { if m != nil { return m.TreeHeader } @@ -866,20 +866,20 @@ func (m *SyncFullResponse) GetTreeHeader() *treepb.TreeHeader { func init() { proto.RegisterEnum("anytype.MessageType", MessageType_name, MessageType_value) - proto.RegisterEnum("anytype.SystemErrorCode", SystemErrorCode_name, SystemErrorCode_value) + proto.RegisterEnum("anytype.System_Error_Code", System_Error_Code_name, System_Error_Code_value) proto.RegisterType((*Message)(nil), "anytype.Message") proto.RegisterType((*Header)(nil), "anytype.Header") proto.RegisterType((*System)(nil), "anytype.System") - proto.RegisterType((*SystemHandshake)(nil), "anytype.System.Handshake") - proto.RegisterType((*SystemPing)(nil), "anytype.System.Ping") - proto.RegisterType((*SystemAck)(nil), "anytype.System.Ack") - proto.RegisterType((*SystemError)(nil), "anytype.System.Error") + proto.RegisterType((*System_Handshake)(nil), "anytype.System.Handshake") + proto.RegisterType((*System_Ping)(nil), "anytype.System.Ping") + proto.RegisterType((*System_Ack)(nil), "anytype.System.Ack") + proto.RegisterType((*System_Error)(nil), "anytype.System.Error") proto.RegisterType((*Sync)(nil), "anytype.Sync") - proto.RegisterType((*SyncContentValue)(nil), "anytype.Sync.ContentValue") - proto.RegisterType((*SyncHeadUpdate)(nil), "anytype.Sync.HeadUpdate") - proto.RegisterType((*SyncFull)(nil), "anytype.Sync.Full") - proto.RegisterType((*SyncFullRequest)(nil), "anytype.Sync.Full.Request") - proto.RegisterType((*SyncFullResponse)(nil), "anytype.Sync.Full.Response") + proto.RegisterType((*Sync_ContentValue)(nil), "anytype.Sync.ContentValue") + proto.RegisterType((*Sync_HeadUpdate)(nil), "anytype.Sync.HeadUpdate") + proto.RegisterType((*Sync_Full)(nil), "anytype.Sync.Full") + proto.RegisterType((*Sync_Full_Request)(nil), "anytype.Sync.Full.Request") + proto.RegisterType((*Sync_Full_Response)(nil), "anytype.Sync.Full.Response") } func init() { proto.RegisterFile("syncproto/proto/sync.proto", fileDescriptor_4b28dfdd48a89166) } @@ -1091,7 +1091,7 @@ func (m *System) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SystemHandshake) Marshal() (dAtA []byte, err error) { +func (m *System_Handshake) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1101,12 +1101,12 @@ func (m *SystemHandshake) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SystemHandshake) MarshalTo(dAtA []byte) (int, error) { +func (m *System_Handshake) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SystemHandshake) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *System_Handshake) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1121,7 +1121,7 @@ func (m *SystemHandshake) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SystemPing) Marshal() (dAtA []byte, err error) { +func (m *System_Ping) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1131,12 +1131,12 @@ func (m *SystemPing) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SystemPing) MarshalTo(dAtA []byte) (int, error) { +func (m *System_Ping) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SystemPing) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *System_Ping) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1149,7 +1149,7 @@ func (m *SystemPing) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SystemAck) Marshal() (dAtA []byte, err error) { +func (m *System_Ack) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1159,12 +1159,12 @@ func (m *SystemAck) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SystemAck) MarshalTo(dAtA []byte) (int, error) { +func (m *System_Ack) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SystemAck) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *System_Ack) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1184,7 +1184,7 @@ func (m *SystemAck) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SystemError) Marshal() (dAtA []byte, err error) { +func (m *System_Error) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1194,12 +1194,12 @@ func (m *SystemError) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SystemError) MarshalTo(dAtA []byte) (int, error) { +func (m *System_Error) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SystemError) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *System_Error) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1261,7 +1261,7 @@ func (m *Sync) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SyncContentValue) Marshal() (dAtA []byte, err error) { +func (m *Sync_ContentValue) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1271,12 +1271,12 @@ func (m *SyncContentValue) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SyncContentValue) MarshalTo(dAtA []byte) (int, error) { +func (m *Sync_ContentValue) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Sync_ContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1293,12 +1293,12 @@ func (m *SyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SyncContentValueValueOfHeadUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *Sync_Content_Value_HeadUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SyncContentValueValueOfHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Sync_Content_Value_HeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.HeadUpdate != nil { { @@ -1314,12 +1314,12 @@ func (m *SyncContentValueValueOfHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (i } return len(dAtA) - i, nil } -func (m *SyncContentValueValueOfFullSyncRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Sync_Content_Value_FullSyncRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SyncContentValueValueOfFullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Sync_Content_Value_FullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.FullSyncRequest != nil { { @@ -1335,12 +1335,12 @@ func (m *SyncContentValueValueOfFullSyncRequest) MarshalToSizedBuffer(dAtA []byt } return len(dAtA) - i, nil } -func (m *SyncContentValueValueOfFullSyncResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *Sync_Content_Value_FullSyncResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SyncContentValueValueOfFullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Sync_Content_Value_FullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.FullSyncResponse != nil { { @@ -1356,7 +1356,7 @@ func (m *SyncContentValueValueOfFullSyncResponse) MarshalToSizedBuffer(dAtA []by } return len(dAtA) - i, nil } -func (m *SyncHeadUpdate) Marshal() (dAtA []byte, err error) { +func (m *Sync_HeadUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1366,12 +1366,12 @@ func (m *SyncHeadUpdate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SyncHeadUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *Sync_HeadUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Sync_HeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1430,7 +1430,7 @@ func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SyncFull) Marshal() (dAtA []byte, err error) { +func (m *Sync_Full) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1440,12 +1440,12 @@ func (m *SyncFull) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SyncFull) MarshalTo(dAtA []byte) (int, error) { +func (m *Sync_Full) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SyncFull) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Sync_Full) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1453,7 +1453,7 @@ func (m *SyncFull) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SyncFullRequest) Marshal() (dAtA []byte, err error) { +func (m *Sync_Full_Request) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1463,12 +1463,12 @@ func (m *SyncFullRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SyncFullRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Sync_Full_Request) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SyncFullRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Sync_Full_Request) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1527,7 +1527,7 @@ func (m *SyncFullRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SyncFullResponse) Marshal() (dAtA []byte, err error) { +func (m *Sync_Full_Response) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1537,12 +1537,12 @@ func (m *SyncFullResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SyncFullResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *Sync_Full_Response) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SyncFullResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Sync_Full_Response) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1676,7 +1676,7 @@ func (m *System) Size() (n int) { return n } -func (m *SystemHandshake) Size() (n int) { +func (m *System_Handshake) Size() (n int) { if m == nil { return 0 } @@ -1689,7 +1689,7 @@ func (m *SystemHandshake) Size() (n int) { return n } -func (m *SystemPing) Size() (n int) { +func (m *System_Ping) Size() (n int) { if m == nil { return 0 } @@ -1701,7 +1701,7 @@ func (m *SystemPing) Size() (n int) { return n } -func (m *SystemAck) Size() (n int) { +func (m *System_Ack) Size() (n int) { if m == nil { return 0 } @@ -1714,7 +1714,7 @@ func (m *SystemAck) Size() (n int) { return n } -func (m *SystemError) Size() (n int) { +func (m *System_Error) Size() (n int) { if m == nil { return 0 } @@ -1747,7 +1747,7 @@ func (m *Sync) Size() (n int) { return n } -func (m *SyncContentValue) Size() (n int) { +func (m *Sync_ContentValue) Size() (n int) { if m == nil { return 0 } @@ -1759,7 +1759,7 @@ func (m *SyncContentValue) Size() (n int) { return n } -func (m *SyncContentValueValueOfHeadUpdate) Size() (n int) { +func (m *Sync_Content_Value_HeadUpdate) Size() (n int) { if m == nil { return 0 } @@ -1771,7 +1771,7 @@ func (m *SyncContentValueValueOfHeadUpdate) Size() (n int) { } return n } -func (m *SyncContentValueValueOfFullSyncRequest) Size() (n int) { +func (m *Sync_Content_Value_FullSyncRequest) Size() (n int) { if m == nil { return 0 } @@ -1783,7 +1783,7 @@ func (m *SyncContentValueValueOfFullSyncRequest) Size() (n int) { } return n } -func (m *SyncContentValueValueOfFullSyncResponse) Size() (n int) { +func (m *Sync_Content_Value_FullSyncResponse) Size() (n int) { if m == nil { return 0 } @@ -1795,7 +1795,7 @@ func (m *SyncContentValueValueOfFullSyncResponse) Size() (n int) { } return n } -func (m *SyncHeadUpdate) Size() (n int) { +func (m *Sync_HeadUpdate) Size() (n int) { if m == nil { return 0 } @@ -1830,7 +1830,7 @@ func (m *SyncHeadUpdate) Size() (n int) { return n } -func (m *SyncFull) Size() (n int) { +func (m *Sync_Full) Size() (n int) { if m == nil { return 0 } @@ -1839,7 +1839,7 @@ func (m *SyncFull) Size() (n int) { return n } -func (m *SyncFullRequest) Size() (n int) { +func (m *Sync_Full_Request) Size() (n int) { if m == nil { return 0 } @@ -1874,7 +1874,7 @@ func (m *SyncFullRequest) Size() (n int) { return n } -func (m *SyncFullResponse) Size() (n int) { +func (m *Sync_Full_Response) Size() (n int) { if m == nil { return 0 } @@ -2267,7 +2267,7 @@ func (m *System) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Handshake == nil { - m.Handshake = &SystemHandshake{} + m.Handshake = &System_Handshake{} } if err := m.Handshake.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2303,7 +2303,7 @@ func (m *System) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Ping == nil { - m.Ping = &SystemPing{} + m.Ping = &System_Ping{} } if err := m.Ping.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2339,7 +2339,7 @@ func (m *System) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Ack == nil { - m.Ack = &SystemAck{} + m.Ack = &System_Ack{} } if err := m.Ack.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2366,7 +2366,7 @@ func (m *System) Unmarshal(dAtA []byte) error { } return nil } -func (m *SystemHandshake) Unmarshal(dAtA []byte) error { +func (m *System_Handshake) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2448,7 +2448,7 @@ func (m *SystemHandshake) Unmarshal(dAtA []byte) error { } return nil } -func (m *SystemPing) Unmarshal(dAtA []byte) error { +func (m *System_Ping) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2517,7 +2517,7 @@ func (m *SystemPing) Unmarshal(dAtA []byte) error { } return nil } -func (m *SystemAck) Unmarshal(dAtA []byte) error { +func (m *System_Ack) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2576,7 +2576,7 @@ func (m *SystemAck) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Error == nil { - m.Error = &SystemError{} + m.Error = &System_Error{} } if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2603,7 +2603,7 @@ func (m *SystemAck) Unmarshal(dAtA []byte) error { } return nil } -func (m *SystemError) Unmarshal(dAtA []byte) error { +func (m *System_Error) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2646,7 +2646,7 @@ func (m *SystemError) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Code |= SystemErrorCode(b&0x7F) << shift + m.Code |= System_Error_Code(b&0x7F) << shift if b < 0x80 { break } @@ -2795,7 +2795,7 @@ func (m *Sync) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Message == nil { - m.Message = &SyncContentValue{} + m.Message = &Sync_ContentValue{} } if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2822,7 +2822,7 @@ func (m *Sync) Unmarshal(dAtA []byte) error { } return nil } -func (m *SyncContentValue) Unmarshal(dAtA []byte) error { +func (m *Sync_ContentValue) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2880,11 +2880,11 @@ func (m *SyncContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &SyncHeadUpdate{} + v := &Sync_HeadUpdate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &SyncContentValueValueOfHeadUpdate{v} + m.Value = &Sync_Content_Value_HeadUpdate{v} iNdEx = postIndex case 2: if wireType != 2 { @@ -2915,11 +2915,11 @@ func (m *SyncContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &SyncFullRequest{} + v := &Sync_Full_Request{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &SyncContentValueValueOfFullSyncRequest{v} + m.Value = &Sync_Content_Value_FullSyncRequest{v} iNdEx = postIndex case 3: if wireType != 2 { @@ -2950,11 +2950,11 @@ func (m *SyncContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &SyncFullResponse{} + v := &Sync_Full_Response{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &SyncContentValueValueOfFullSyncResponse{v} + m.Value = &Sync_Content_Value_FullSyncResponse{v} iNdEx = postIndex default: iNdEx = preIndex @@ -2977,7 +2977,7 @@ func (m *SyncContentValue) Unmarshal(dAtA []byte) error { } return nil } -func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { +func (m *Sync_HeadUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3193,7 +3193,7 @@ func (m *SyncHeadUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *SyncFull) Unmarshal(dAtA []byte) error { +func (m *Sync_Full) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3243,7 +3243,7 @@ func (m *SyncFull) Unmarshal(dAtA []byte) error { } return nil } -func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { +func (m *Sync_Full_Request) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3459,7 +3459,7 @@ func (m *SyncFullRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *SyncFullResponse) Unmarshal(dAtA []byte) error { +func (m *Sync_Full_Response) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { From 7afde45ac69747636b496b2ba803ec196882abce Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Wed, 7 Sep 2022 19:49:54 +0300 Subject: [PATCH 045/219] change proto generator to std gogo: fix tests --- pkg/acl/acltree/treegraph_nix.go | 2 +- .../treestoragebuilder/treestoragebuilder.go | 14 +++++++------- .../treestoragebuildergraph_nix.go | 2 +- service/space/space.go | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pkg/acl/acltree/treegraph_nix.go b/pkg/acl/acltree/treegraph_nix.go index 72dc0c7d..68382fad 100644 --- a/pkg/acl/acltree/treegraph_nix.go +++ b/pkg/acl/acltree/treegraph_nix.go @@ -60,7 +60,7 @@ func (t *Tree) Graph() (data string, err error) { if c.Content.AclData != nil { for _, chc := range c.Content.AclData.AclContent { tp := fmt.Sprintf("%T", chc.Value) - tp = strings.Replace(tp, "ACLChange_ACLContentValueValueOf", "", 1) + tp = strings.Replace(tp, "ACLChange_ACLContent_Value_", "", 1) res := "" for _, ts := range tp { if unicode.IsUpper(ts) { diff --git a/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go b/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go index 3b7c6f7d..162a3f5f 100644 --- a/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go +++ b/pkg/acl/testutils/treestoragebuilder/treestoragebuilder.go @@ -361,7 +361,7 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha } convCh = &aclpb.ACLChange_ACLContentValue{ - Value: &aclpb.ACLChange_ACLContentValueValueOfUserJoin{ + Value: &aclpb.ACLChange_ACLContent_Value_UserJoin{ UserJoin: &aclpb.ACLChange_UserJoin{ Identity: t.keychain.GetIdentity(join.Identity), EncryptionKey: rawKey, @@ -379,7 +379,7 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha rawEncKey, _ := encKey.GetPublic().Raw() convCh = &aclpb.ACLChange_ACLContentValue{ - Value: &aclpb.ACLChange_ACLContentValueValueOfUserInvite{ + Value: &aclpb.ACLChange_ACLContent_Value_UserInvite{ UserInvite: &aclpb.ACLChange_UserInvite{ AcceptPublicKey: rawAcceptKey, EncryptPublicKey: rawEncKey, @@ -393,7 +393,7 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha confirm := ch.UserConfirm convCh = &aclpb.ACLChange_ACLContentValue{ - Value: &aclpb.ACLChange_ACLContentValueValueOfUserConfirm{ + Value: &aclpb.ACLChange_ACLContent_Value_UserConfirm{ UserConfirm: &aclpb.ACLChange_UserConfirm{ Identity: t.keychain.GetIdentity(confirm.Identity), UserAddId: confirm.UserAddId, @@ -404,7 +404,7 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha permissionChange := ch.UserPermissionChange convCh = &aclpb.ACLChange_ACLContentValue{ - Value: &aclpb.ACLChange_ACLContentValueValueOfUserPermissionChange{ + Value: &aclpb.ACLChange_ACLContent_Value_UserPermissionChange{ UserPermissionChange: &aclpb.ACLChange_UserPermissionChange{ Identity: t.keychain.GetIdentity(permissionChange.Identity), Permissions: t.convertPermission(permissionChange.Permission), @@ -416,7 +416,7 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha newReadKey := t.keychain.GetKey(remove.NewReadKey).(*SymKey) - var replaces []*aclpb.ACLChangeReadKeyReplace + var replaces []*aclpb.ACLChange_ReadKeyReplace for _, id := range remove.IdentitiesLeft { identity := t.keychain.GetIdentity(id) encKey := t.keychain.EncryptionKeys[id] @@ -425,7 +425,7 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha if err != nil { panic(err) } - replaces = append(replaces, &aclpb.ACLChangeReadKeyReplace{ + replaces = append(replaces, &aclpb.ACLChange_ReadKeyReplace{ Identity: identity, EncryptionKey: rawEncKey, EncryptedReadKey: encReadKey, @@ -433,7 +433,7 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLCha } convCh = &aclpb.ACLChange_ACLContentValue{ - Value: &aclpb.ACLChange_ACLContentValueValueOfUserRemove{ + Value: &aclpb.ACLChange_ACLContent_Value_UserRemove{ UserRemove: &aclpb.ACLChange_UserRemove{ Identity: t.keychain.GetIdentity(remove.RemovedIdentity), ReadKeyReplaces: replaces, diff --git a/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go b/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go index 9d973a24..a68cb0a1 100644 --- a/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go +++ b/pkg/acl/testutils/treestoragebuilder/treestoragebuildergraph_nix.go @@ -66,7 +66,7 @@ func (t *TreeStorageBuilder) Graph() (string, error) { if r.GetAclData() != nil { for _, chc := range r.GetAclData().AclContent { tp := fmt.Sprintf("%T", chc.Value) - tp = strings.Replace(tp, "ACLChange_ACLContentValueValueOf", "", 1) + tp = strings.Replace(tp, "ACLChange_ACLContent_Value_", "", 1) res := "" for _, ts := range tp { if unicode.IsUpper(ts) { diff --git a/service/space/space.go b/service/space/space.go index f35452c1..59f04932 100644 --- a/service/space/space.go +++ b/service/space/space.go @@ -72,8 +72,8 @@ func (s *space) Handle(ctx context.Context, msg *spacesync.Space) (repl *spacesy if er != nil { return nil, er } - return &spacesync.Space{SpaceId: s.id, Message: &spacesync.SpaceContent{ - Value: &spacesync.SpaceContent_Value_DiffRange{ + return &spacesync.Space{SpaceId: s.id, Message: &spacesync.Space_Content{ + Value: &spacesync.Space_Content_DiffRange{ DiffRange: resp, }, }}, nil From 3ca8814e46356beacb2941c19fc360571a371c48 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 7 Sep 2022 21:02:42 +0200 Subject: [PATCH 046/219] WIP algorithm --- pkg/acl/tree/objecttree.go | 59 ++++---- pkg/acl/tree/objecttree_test.go | 112 +++++++++------- pkg/acl/tree/rawloader.go | 231 ++++++++++++++++++++++++++++++++ pkg/acl/tree/tree.go | 10 +- pkg/acl/tree/treereduce.go | 4 +- 5 files changed, 337 insertions(+), 79 deletions(-) create mode 100644 pkg/acl/tree/rawloader.go diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index f12f1d1b..b56616ca 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -60,7 +60,7 @@ type ObjectTree interface { IterateFrom(id string, convert ChangeConvertFunc, iterate ChangeIterateFunc) error SnapshotPath() []string - ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error) + ChangesAfterCommonSnapshot(snapshotPath, heads []string) ([]*aclpb.RawChange, error) Storage() storage.TreeStorage DebugDump() (string, error) @@ -511,11 +511,11 @@ func (ot *objectTree) SnapshotPath() []string { return path } -func (ot *objectTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.RawChange, error) { +func (ot *objectTree) ChangesAfterCommonSnapshot(theirPath, theirHeads []string) ([]*aclpb.RawChange, error) { var ( needFullDocument = len(theirPath) == 0 ourPath = ot.SnapshotPath() - // by default returning everything we have + // by default returning everything we have from start commonSnapshot = ourPath[len(ourPath)-1] err error ) @@ -528,40 +528,38 @@ func (ot *objectTree) ChangesAfterCommonSnapshot(theirPath []string) ([]*aclpb.R } } - log.With( - zap.Strings("heads", ot.tree.Heads()), - zap.String("breakpoint", commonSnapshot), - zap.String("id", ot.id)). - Debug("getting all changes from common snapshot") - if commonSnapshot == ot.tree.RootId() { - return ot.getChangesFromTree() + return ot.getChangesFromTree(theirHeads) } else { - return ot.getChangesFromDB(commonSnapshot, needFullDocument) + return ot.getChangesFromDB(commonSnapshot, theirHeads, needFullDocument) } } -func (ot *objectTree) getChangesFromTree() (rawChanges []*aclpb.RawChange, err error) { - ot.tree.dfsPrev(ot.tree.HeadsChanges(), func(ch *Change) bool { - var marshalled []byte - marshalled, err = ch.Content.Marshal() - if err != nil { - return false - } +func (ot *objectTree) getChangesFromTree(theirHeads []string) (rawChanges []*aclpb.RawChange, err error) { + ot.tree.dfsPrev( + ot.tree.HeadsChanges(), + theirHeads, + func(ch *Change) bool { + var marshalled []byte + marshalled, err = ch.Content.Marshal() + if err != nil { + return false + } - raw := &aclpb.RawChange{ - Payload: marshalled, - Signature: ch.Signature(), - Id: ch.Id, - } - rawChanges = append(rawChanges, raw) - return true - }, func(changes []*Change) {}) + raw := &aclpb.RawChange{ + Payload: marshalled, + Signature: ch.Signature(), + Id: ch.Id, + } + rawChanges = append(rawChanges, raw) + return true + }, + func(changes []*Change) {}) return } -func (ot *objectTree) getChangesFromDB(commonSnapshot string, needStartSnapshot bool) (rawChanges []*aclpb.RawChange, err error) { +func (ot *objectTree) getChangesFromDB(commonSnapshot string, theirHeads []string, needStartSnapshot bool) (rawChanges []*aclpb.RawChange, err error) { load := func(id string) (*Change, error) { raw, err := ot.treeStorage.GetRawChange(context.Background(), id) if err != nil { @@ -576,8 +574,13 @@ func (ot *objectTree) getChangesFromDB(commonSnapshot string, needStartSnapshot rawChanges = append(rawChanges, raw) return ch, nil } + // setting breakpoints to include head and common snapshot + // that means that we will ignore all changes which start at theirHeads + breakpoints := make([]string, 0, len(theirHeads)+1) + breakpoints = append(breakpoints, commonSnapshot) + breakpoints = append(breakpoints, theirHeads...) - _, err = ot.treeBuilder.dfs(ot.tree.Heads(), commonSnapshot, load) + _, err = ot.treeBuilder.dfs(ot.tree.Heads(), breakpoints, load) if err != nil { return } diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index 7f5c7ce8..5acfd5be 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -271,7 +271,7 @@ func TestObjectTree(t *testing.T) { assert.Equal(t, true, objTree.(*objectTree).snapshotPathIsActual()) }) - t.Run("changes after common snapshot from tree", func(t *testing.T) { + t.Run("changes after common snapshot complex", func(t *testing.T) { ctx := prepareTreeContext(t, aclList) changeCreator := ctx.changeCreator objTree := ctx.objTree @@ -289,19 +289,43 @@ func TestObjectTree(t *testing.T) { require.NoError(t, err, "adding changes should be without error") require.Equal(t, "0", objTree.Root().Id) - changeIds := make(map[string]struct{}) - changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}) - for _, ch := range changes { - changeIds[ch.Id] = struct{}{} - } + t.Run("changes from tree", func(t *testing.T) { + changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{}) + require.NoError(t, err, "changes after common snapshot should be without error") - for _, raw := range rawChanges { - _, ok := changeIds[raw.Id] - assert.Equal(t, true, ok) - } + changeIds := make(map[string]struct{}) + for _, ch := range changes { + changeIds[ch.Id] = struct{}{} + } + + for _, raw := range rawChanges { + _, ok := changeIds[raw.Id] + assert.Equal(t, true, ok) + } + }) + + t.Run("changes from tree after first", func(t *testing.T) { + changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{"1"}) + require.NoError(t, err, "changes after common snapshot should be without error") + + changeIds := make(map[string]struct{}) + for _, ch := range changes { + changeIds[ch.Id] = struct{}{} + } + + for _, raw := range rawChanges { + if raw.Id == "1" { + _, ok := changeIds[raw.Id] + assert.Equal(t, false, ok) + continue + } + _, ok := changeIds[raw.Id] + assert.Equal(t, true, ok) + } + }) }) - t.Run("changes after common snapshot from db", func(t *testing.T) { + t.Run("changes after common snapshot simple", func(t *testing.T) { ctx := prepareTreeContext(t, aclList) changeCreator := ctx.changeCreator objTree := ctx.objTree @@ -316,45 +340,37 @@ func TestObjectTree(t *testing.T) { require.NoError(t, err, "adding changes should be without error") require.Equal(t, "3", objTree.Root().Id) - changeIds := make(map[string]struct{}) - changes, err := objTree.ChangesAfterCommonSnapshot([]string{"0"}) - for _, ch := range changes { - changeIds[ch.Id] = struct{}{} - } + t.Run("changes from db", func(t *testing.T) { + changes, err := objTree.ChangesAfterCommonSnapshot([]string{"0"}, []string{}) + require.NoError(t, err, "changes after common snapshot should be without error") - for _, raw := range rawChanges { - _, ok := changeIds[raw.Id] + changeIds := make(map[string]struct{}) + for _, ch := range changes { + changeIds[ch.Id] = struct{}{} + } + + for _, raw := range rawChanges { + _, ok := changeIds[raw.Id] + assert.Equal(t, true, ok) + } + }) + + t.Run("changes from db with empty path", func(t *testing.T) { + changes, err := objTree.ChangesAfterCommonSnapshot([]string{}, []string{}) + require.NoError(t, err, "changes after common snapshot should be without error") + + changeIds := make(map[string]struct{}) + for _, ch := range changes { + changeIds[ch.Id] = struct{}{} + } + + for _, raw := range rawChanges { + _, ok := changeIds[raw.Id] + assert.Equal(t, true, ok) + } + _, ok := changeIds["0"] assert.Equal(t, true, ok) - } - }) - - t.Run("changes after common snapshot from db, they have empty path", func(t *testing.T) { - ctx := prepareTreeContext(t, aclList) - changeCreator := ctx.changeCreator - objTree := ctx.objTree - - rawChanges := []*aclpb.RawChange{ - changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), - changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), - changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), - } - - _, err := objTree.AddRawChanges(context.Background(), rawChanges...) - require.NoError(t, err, "adding changes should be without error") - require.Equal(t, "3", objTree.Root().Id) - - changeIds := make(map[string]struct{}) - changes, err := objTree.ChangesAfterCommonSnapshot([]string{}) - for _, ch := range changes { - changeIds[ch.Id] = struct{}{} - } - - for _, raw := range rawChanges { - _, ok := changeIds[raw.Id] - assert.Equal(t, true, ok) - } - _, ok := changeIds["0"] - assert.Equal(t, true, ok) + }) }) t.Run("add new changes related to previous snapshot", func(t *testing.T) { diff --git a/pkg/acl/tree/rawloader.go b/pkg/acl/tree/rawloader.go new file mode 100644 index 00000000..473b2017 --- /dev/null +++ b/pkg/acl/tree/rawloader.go @@ -0,0 +1,231 @@ +package tree + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "time" +) + +type rawChangeLoader struct { + treeStorage storage.TreeStorage + changeBuilder ChangeBuilder + + // buffers + idStack []string + cache map[string]rawCacheEntry +} + +type rawCacheEntry struct { + change *Change + rawChange *aclpb.RawChange +} + +func newRawChangeLoader(treeStorage storage.TreeStorage, changeBuilder ChangeBuilder) *rawChangeLoader { + return &rawChangeLoader{ + treeStorage: treeStorage, + changeBuilder: changeBuilder, + } +} + +func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb.RawChange, error) { + var stack []*Change + for _, h := range t.headIds { + stack = append(stack, t.attached[h]) + } + + convert := func(chs []*Change) (rawChanges []*aclpb.RawChange, err error) { + for _, ch := range chs { + var marshalled []byte + marshalled, err = ch.Content.Marshal() + if err != nil { + return + } + + raw := &aclpb.RawChange{ + Payload: marshalled, + Signature: ch.Signature(), + Id: ch.Id, + } + rawChanges = append(rawChanges, raw) + } + return + } + + // getting all changes that we visit + var results []*Change + rootVisited := false + t.dfsPrev( + stack, + breakpoints, + func(ch *Change) bool { + results = append(results, ch) + return true + }, + func(visited []*Change) { + if t.root.visited { + rootVisited = true + } + }, + ) + + // if we stopped at breakpoints or there are no breakpoints + if !rootVisited || len(breakpoints) == 0 { + return convert(results) + } + + // now starting from breakpoints + stack = stack[:0] + for _, h := range breakpoints { + stack = append(stack, t.attached[h]) + } + + // doing another dfs to get all changes before breakpoints, we need to exclude them from results + t.dfsPrev( + stack, + []string{}, + func(ch *Change) bool { + return true + }, + func(visited []*Change) { + discardFromSlice(results, func(change *Change) bool { + return change.visited + }) + }, + ) + + // otherwise we want to exclude everything that wasn't in breakpoints + return convert(results) +} + +func (r *rawChangeLoader) loadEntry(id string) (entry rawCacheEntry, err error) { + var ok bool + if entry, ok = r.cache[id]; ok { + return + } + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + rawChange, err := r.treeStorage.GetRawChange(ctx, id) + if err != nil { + return + } + + change, err := r.changeBuilder.ConvertFromRaw(rawChange) + if err != nil { + return + } + entry = rawCacheEntry{ + change: change, + rawChange: rawChange, + } + r.cache[id] = entry + return +} + +func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoints []string) ([]*aclpb.RawChange, error) { + // initializing buffers + r.idStack = r.idStack[:0] + + // updating map + bufPosMap := make(map[string]int) + for _, breakpoint := range breakpoints { + bufPosMap[breakpoint] = -1 + } + bufPosMap[commonSnapshot] = -1 + + dfs := func( + commonSnapshot string, + heads []string, + startCounter int, + shouldVisit func(counter int, mapExists bool) bool, + visit func(prevCounter int, entry rawCacheEntry) int) bool { + + commonSnapshotVisited := false + for len(r.idStack) > 0 { + id := r.idStack[len(r.idStack)-1] + r.idStack = r.idStack[:len(r.idStack)-1] + + cnt, exists := bufPosMap[id] + if !shouldVisit(cnt, exists) { + continue + } + + entry, err := r.loadEntry(id) + if err != nil { + continue + } + + // setting the counter when we visit + bufPosMap[id] = visit(cnt, entry) + + for _, prev := range entry.change.PreviousIds { + if prev == commonSnapshot { + commonSnapshotVisited = true + break + } + cnt, exists = bufPosMap[prev] + if !shouldVisit(cnt, exists) { + continue + } + r.idStack = append(r.idStack, prev) + } + } + return commonSnapshotVisited + } + + // preparing first pass + r.idStack = append(r.idStack, heads...) + var buffer []*aclpb.RawChange + + rootVisited := dfs(commonSnapshot, heads, 0, + func(counter int, mapExists bool) bool { + return !mapExists + }, + func(_ int, entry rawCacheEntry) int { + buffer = append(buffer, entry.rawChange) + return len(buffer) - 1 + }) + + // checking if we stopped at breakpoints + if !rootVisited || len(breakpoints) == 0 { + return buffer, nil + } + + // resetting stack + r.idStack = r.idStack[:0] + r.idStack = append(r.idStack, breakpoints...) + + // marking all visited as nil + dfs(commonSnapshot, heads, len(buffer), + func(counter int, mapExists bool) bool { + return !mapExists || counter < len(buffer) + }, + func(discardedPosition int, entry rawCacheEntry) int { + if discardedPosition != -1 { + buffer[discardedPosition] = nil + } + return len(buffer) + 1 + }) + discardFromSlice(buffer, func(change *aclpb.RawChange) bool { + return change == nil + }) + + return buffer, nil +} + +func discardFromSlice[T any](elements []T, isDiscarded func(T) bool) { + var ( + finishedIdx = 0 + currentIdx = 0 + ) + for currentIdx < len(elements) { + if !isDiscarded(elements[currentIdx]) && finishedIdx != currentIdx { + elements[finishedIdx] = elements[currentIdx] + finishedIdx++ + } + currentIdx++ + } + elements = elements[:finishedIdx] +} diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go index c15b15d1..549d7f84 100644 --- a/pkg/acl/tree/tree.go +++ b/pkg/acl/tree/tree.go @@ -271,9 +271,17 @@ func (t *Tree) after(id1, id2 string) (found bool) { return } -func (t *Tree) dfsPrev(stack []*Change, visit func(ch *Change) (isContinue bool), afterVisit func([]*Change)) { +func (t *Tree) dfsPrev(stack []*Change, breakpoints []string, visit func(ch *Change) (isContinue bool), afterVisit func([]*Change)) { t.visitedBuf = t.visitedBuf[:0] + // setting breakpoints as visited + for _, breakpoint := range breakpoints { + if ch, ok := t.attached[breakpoint]; ok { + ch.visited = true + t.visitedBuf = append(t.visitedBuf, ch) + } + } + defer func() { afterVisit(t.visitedBuf) for _, ch := range t.visitedBuf { diff --git a/pkg/acl/tree/treereduce.go b/pkg/acl/tree/treereduce.go index 7677f1cb..98532339 100644 --- a/pkg/acl/tree/treereduce.go +++ b/pkg/acl/tree/treereduce.go @@ -18,9 +18,9 @@ func (t *Tree) checkRoot(change *Change) (total int) { stack = append(stack, t.attached[h]) } - change.visited = true t.dfsPrev( stack, + []string{change.Id}, func(ch *Change) bool { total += 1 return true @@ -31,7 +31,6 @@ func (t *Tree) checkRoot(change *Change) (total int) { } }, ) - change.visited = false return } @@ -46,6 +45,7 @@ func (t *Tree) makeRootAndRemove(start *Change) { t.dfsPrev( stack, + []string{}, func(ch *Change) bool { return true }, From de1a5baacad57b0c49e139269922092f6d0effd1 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 7 Sep 2022 22:01:11 +0200 Subject: [PATCH 047/219] Change sync logic --- pkg/acl/tree/objecttree.go | 98 +++++-------------- pkg/acl/tree/rawloader.go | 84 +++++++++------- service/sync/requesthandler/requesthandler.go | 68 ++----------- 3 files changed, 87 insertions(+), 163 deletions(-) diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index b56616ca..2fc0eaa5 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -72,12 +72,13 @@ type ObjectTree interface { } type objectTree struct { - treeStorage storage.TreeStorage - changeBuilder ChangeBuilder - updateListener ObjectTreeUpdateListener - validator ObjectTreeValidator - treeBuilder *treeBuilder - aclList list.ACLList + treeStorage storage.TreeStorage + changeBuilder ChangeBuilder + updateListener ObjectTreeUpdateListener + validator ObjectTreeValidator + rawChangeLoader *rawChangeLoader + treeBuilder *treeBuilder + aclList list.ACLList id string header *aclpb.Header @@ -97,12 +98,13 @@ type objectTree struct { } type objectTreeDeps struct { - changeBuilder ChangeBuilder - treeBuilder *treeBuilder - treeStorage storage.TreeStorage - updateListener ObjectTreeUpdateListener - validator ObjectTreeValidator - aclList list.ACLList + changeBuilder ChangeBuilder + treeBuilder *treeBuilder + treeStorage storage.TreeStorage + updateListener ObjectTreeUpdateListener + validator ObjectTreeValidator + rawChangeLoader *rawChangeLoader + aclList list.ACLList } func defaultObjectTreeDeps( @@ -114,12 +116,13 @@ func defaultObjectTreeDeps( changeBuilder := newChangeBuilder(keychain) treeBuilder := newTreeBuilder(treeStorage, changeBuilder) return objectTreeDeps{ - changeBuilder: changeBuilder, - treeBuilder: treeBuilder, - treeStorage: treeStorage, - updateListener: listener, - validator: newTreeValidator(), - aclList: aclList, + changeBuilder: changeBuilder, + treeBuilder: treeBuilder, + treeStorage: treeStorage, + updateListener: listener, + validator: newTreeValidator(), + rawChangeLoader: newRawChangeLoader(treeStorage, changeBuilder), + aclList: aclList, } } @@ -131,6 +134,7 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { validator: deps.validator, aclList: deps.aclList, changeBuilder: deps.changeBuilder, + rawChangeLoader: deps.rawChangeLoader, tree: nil, keys: make(map[uint64]*symmetric.Key), tmpChangesBuf: make([]*Change, 0, 10), @@ -531,66 +535,16 @@ func (ot *objectTree) ChangesAfterCommonSnapshot(theirPath, theirHeads []string) if commonSnapshot == ot.tree.RootId() { return ot.getChangesFromTree(theirHeads) } else { - return ot.getChangesFromDB(commonSnapshot, theirHeads, needFullDocument) + return ot.getChangesFromDB(commonSnapshot, theirHeads) } } func (ot *objectTree) getChangesFromTree(theirHeads []string) (rawChanges []*aclpb.RawChange, err error) { - ot.tree.dfsPrev( - ot.tree.HeadsChanges(), - theirHeads, - func(ch *Change) bool { - var marshalled []byte - marshalled, err = ch.Content.Marshal() - if err != nil { - return false - } - - raw := &aclpb.RawChange{ - Payload: marshalled, - Signature: ch.Signature(), - Id: ch.Id, - } - rawChanges = append(rawChanges, raw) - return true - }, - func(changes []*Change) {}) - - return + return ot.rawChangeLoader.LoadFromTree(ot.tree, theirHeads) } -func (ot *objectTree) getChangesFromDB(commonSnapshot string, theirHeads []string, needStartSnapshot bool) (rawChanges []*aclpb.RawChange, err error) { - load := func(id string) (*Change, error) { - raw, err := ot.treeStorage.GetRawChange(context.Background(), id) - if err != nil { - return nil, err - } - - ch, err := NewChangeFromRaw(raw) - if err != nil { - return nil, err - } - - rawChanges = append(rawChanges, raw) - return ch, nil - } - // setting breakpoints to include head and common snapshot - // that means that we will ignore all changes which start at theirHeads - breakpoints := make([]string, 0, len(theirHeads)+1) - breakpoints = append(breakpoints, commonSnapshot) - breakpoints = append(breakpoints, theirHeads...) - - _, err = ot.treeBuilder.dfs(ot.tree.Heads(), breakpoints, load) - if err != nil { - return - } - - if needStartSnapshot { - // adding snapshot to raw changes - _, err = load(commonSnapshot) - } - - return +func (ot *objectTree) getChangesFromDB(commonSnapshot string, theirHeads []string) (rawChanges []*aclpb.RawChange, err error) { + return ot.rawChangeLoader.LoadFromStorage(commonSnapshot, ot.tree.headIds, theirHeads) } func (ot *objectTree) snapshotPathIsActual() bool { diff --git a/pkg/acl/tree/rawloader.go b/pkg/acl/tree/rawloader.go index 473b2017..27cb7ba7 100644 --- a/pkg/acl/tree/rawloader.go +++ b/pkg/acl/tree/rawloader.go @@ -71,6 +71,7 @@ func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb. // if we stopped at breakpoints or there are no breakpoints if !rootVisited || len(breakpoints) == 0 { + // in this case we will add root if there are no breakpoints return convert(results) } @@ -81,6 +82,7 @@ func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb. } // doing another dfs to get all changes before breakpoints, we need to exclude them from results + // if we don't have some breakpoints we will just ignore them t.dfsPrev( stack, []string{}, @@ -98,35 +100,12 @@ func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb. return convert(results) } -func (r *rawChangeLoader) loadEntry(id string) (entry rawCacheEntry, err error) { - var ok bool - if entry, ok = r.cache[id]; ok { - return - } - - ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) - defer cancel() - - rawChange, err := r.treeStorage.GetRawChange(ctx, id) - if err != nil { - return - } - - change, err := r.changeBuilder.ConvertFromRaw(rawChange) - if err != nil { - return - } - entry = rawCacheEntry{ - change: change, - rawChange: rawChange, - } - r.cache[id] = entry - return -} - func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoints []string) ([]*aclpb.RawChange, error) { - // initializing buffers - r.idStack = r.idStack[:0] + // resetting cache + r.cache = make(map[string]rawCacheEntry) + defer func() { + r.cache = nil + }() // updating map bufPosMap := make(map[string]int) @@ -142,6 +121,10 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi shouldVisit func(counter int, mapExists bool) bool, visit func(prevCounter int, entry rawCacheEntry) int) bool { + // resetting stack + r.idStack = r.idStack[:0] + r.idStack = append(r.idStack, heads...) + commonSnapshotVisited := false for len(r.idStack) > 0 { id := r.idStack[len(r.idStack)-1] @@ -152,6 +135,7 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi continue } + // TODO: add proper error handling, we must ignore errors on missing breakpoints though entry, err := r.loadEntry(id) if err != nil { continue @@ -189,16 +173,22 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi }) // checking if we stopped at breakpoints - if !rootVisited || len(breakpoints) == 0 { + if !rootVisited { return buffer, nil } - // resetting stack - r.idStack = r.idStack[:0] - r.idStack = append(r.idStack, breakpoints...) + // if there are no breakpoints then we should load root also + if len(breakpoints) == 0 { + common, err := r.loadEntry(commonSnapshot) + if err != nil { + return nil, err + } + buffer = append(buffer, common.rawChange) + return buffer, nil + } // marking all visited as nil - dfs(commonSnapshot, heads, len(buffer), + dfs(commonSnapshot, breakpoints, len(buffer), func(counter int, mapExists bool) bool { return !mapExists || counter < len(buffer) }, @@ -208,6 +198,8 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi } return len(buffer) + 1 }) + + // discarding visited discardFromSlice(buffer, func(change *aclpb.RawChange) bool { return change == nil }) @@ -215,6 +207,32 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi return buffer, nil } +func (r *rawChangeLoader) loadEntry(id string) (entry rawCacheEntry, err error) { + var ok bool + if entry, ok = r.cache[id]; ok { + return + } + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) + defer cancel() + + rawChange, err := r.treeStorage.GetRawChange(ctx, id) + if err != nil { + return + } + + change, err := r.changeBuilder.ConvertFromRaw(rawChange) + if err != nil { + return + } + entry = rawCacheEntry{ + change: change, + rawChange: rawChange, + } + r.cache[id] = entry + return +} + func discardFromSlice[T any](elements []T, isDiscarded func(T) bool) { var ( finishedIdx = 0 diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index c9108acf..0b50d156 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -101,10 +101,10 @@ func (r *requestHandler) HandleHeadUpdate( } // if we couldn't add all the changes - shouldFullSync := !slice.UnsortedEquals(update.Heads, objTree.Heads()) + shouldFullSync := len(update.Changes) != len(result.Added) snapshotPath = objTree.SnapshotPath() if shouldFullSync { - fullRequest, err = r.prepareFullSyncRequest(update.SnapshotPath, objTree) + fullRequest, err = r.prepareFullSyncRequest(objTree) if err != nil { return err } @@ -141,26 +141,13 @@ func (r *requestHandler) HandleFullSyncRequest( header *aclpb.Header, treeId string) (err error) { - var ( - fullResponse *syncproto.SyncFullResponse - snapshotPath []string - result tree.AddResult - ) + var fullResponse *syncproto.SyncFullResponse err = r.treeCache.Do(ctx, treeId, func(obj any) error { objTree := obj.(tree.ObjectTree) objTree.Lock() defer objTree.Unlock() - log.Info("getting tree from treeCache", zap.String("aclId", objTree.Header().AclListId)) - // if we have non-empty request - if len(request.Heads) != 0 { - result, err = objTree.AddRawChanges(ctx, request.Changes...) - if err != nil { - return err - } - } - snapshotPath = objTree.SnapshotPath() - fullResponse, err = r.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Changes, objTree) + fullResponse, err = r.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Heads, objTree) if err != nil { return err } @@ -170,19 +157,7 @@ func (r *requestHandler) HandleFullSyncRequest( if err != nil { return err } - err = r.messageService.SendMessageAsync(senderId, syncproto.WrapFullResponse(fullResponse, header, treeId)) - // if error or nothing has changed - if err != nil || len(result.Added) == 0 { - return err - } - - // otherwise sending heads update message - newUpdate := &syncproto.SyncHeadUpdate{ - Heads: result.Heads, - Changes: result.Added, - SnapshotPath: snapshotPath, - } - return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) + return r.messageService.SendMessageAsync(senderId, syncproto.WrapFullResponse(fullResponse, header, treeId)) } func (r *requestHandler) HandleFullSyncResponse( @@ -196,19 +171,17 @@ func (r *requestHandler) HandleFullSyncResponse( snapshotPath []string result tree.AddResult ) - log.With(zap.String("peerId", senderId), zap.String("treeId", treeId)). - Debug("processing full sync response") err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { objTree := obj.(tree.ObjectTree) objTree.Lock() defer objTree.Unlock() + // if we already have the heads for whatever reason if slice.UnsortedEquals(response.Heads, objTree.Heads()) { return nil } - // TODO: check if we already have those changes result, err = objTree.AddRawChanges(ctx, response.Changes...) if err != nil { return err @@ -263,46 +236,25 @@ func (r *requestHandler) HandleACLList( return err } -func (r *requestHandler) prepareFullSyncRequest(theirPath []string, t tree.ObjectTree) (*syncproto.SyncFullRequest, error) { - ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath) - if err != nil { - return nil, err - } +func (r *requestHandler) prepareFullSyncRequest(t tree.ObjectTree) (*syncproto.SyncFullRequest, error) { return &syncproto.SyncFullRequest{ Heads: t.Heads(), - Changes: ourChanges, SnapshotPath: t.SnapshotPath(), }, nil } func (r *requestHandler) prepareFullSyncResponse( treeId string, - theirPath []string, - theirChanges []*aclpb.RawChange, + theirPath, theirHeads []string, t tree.ObjectTree) (*syncproto.SyncFullResponse, error) { - // TODO: we can probably use the common snapshot calculated on the request step from previous peer - ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath) + ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath, theirHeads) if err != nil { return nil, err } - theirMap := make(map[string]struct{}) - for _, ch := range theirChanges { - theirMap[ch.Id] = struct{}{} - } - - // filtering our changes, so we will not send the same changes back - var final []*aclpb.RawChange - for _, ch := range ourChanges { - if _, exists := theirMap[ch.Id]; !exists { - final = append(final, ch) - } - } - log.With(zap.Int("len(changes)", len(final)), zap.String("id", treeId)). - Debug("preparing changes for tree") return &syncproto.SyncFullResponse{ Heads: t.Heads(), - Changes: final, + Changes: ourChanges, SnapshotPath: t.SnapshotPath(), }, nil } From 5b1228e14ddc96ca7b5838b4c58edeec24b13261 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 7 Sep 2022 22:30:29 +0200 Subject: [PATCH 048/219] More tests and fixes for reading from tree --- pkg/acl/tree/objecttree_test.go | 53 +++++++++++++++++++++++---------- pkg/acl/tree/rawloader.go | 13 ++++---- pkg/acl/tree/treebuilder.go | 14 +++++---- 3 files changed, 53 insertions(+), 27 deletions(-) diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index 5acfd5be..463dca31 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -92,12 +92,13 @@ func prepareTreeContext(t *testing.T, aclList list.ACLList) testTreeContext { treeStorage := changeCreator.createNewTreeStorage("treeId", aclList.ID(), aclList.Head().Id, "0") changeBuilder := &mockChangeBuilder{} deps := objectTreeDeps{ - changeBuilder: changeBuilder, - treeBuilder: newTreeBuilder(treeStorage, changeBuilder), - treeStorage: treeStorage, - updateListener: nil, - validator: &mockChangeValidator{}, - aclList: aclList, + changeBuilder: changeBuilder, + treeBuilder: newTreeBuilder(treeStorage, changeBuilder), + treeStorage: treeStorage, + updateListener: nil, + rawChangeLoader: newRawChangeLoader(treeStorage, changeBuilder), + validator: &mockChangeValidator{}, + aclList: aclList, } // check build @@ -271,7 +272,7 @@ func TestObjectTree(t *testing.T) { assert.Equal(t, true, objTree.(*objectTree).snapshotPathIsActual()) }) - t.Run("changes after common snapshot complex", func(t *testing.T) { + t.Run("changes from tree after common snapshot complex", func(t *testing.T) { ctx := prepareTreeContext(t, aclList) changeCreator := ctx.changeCreator objTree := ctx.objTree @@ -289,7 +290,7 @@ func TestObjectTree(t *testing.T) { require.NoError(t, err, "adding changes should be without error") require.Equal(t, "0", objTree.Root().Id) - t.Run("changes from tree", func(t *testing.T) { + t.Run("all changes from tree", func(t *testing.T) { changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{}) require.NoError(t, err, "changes after common snapshot should be without error") @@ -302,9 +303,11 @@ func TestObjectTree(t *testing.T) { _, ok := changeIds[raw.Id] assert.Equal(t, true, ok) } + _, ok := changeIds["0"] + assert.Equal(t, true, ok) }) - t.Run("changes from tree after first", func(t *testing.T) { + t.Run("changes from tree after 1", func(t *testing.T) { changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{"1"}) require.NoError(t, err, "changes after common snapshot should be without error") @@ -313,15 +316,33 @@ func TestObjectTree(t *testing.T) { changeIds[ch.Id] = struct{}{} } - for _, raw := range rawChanges { - if raw.Id == "1" { - _, ok := changeIds[raw.Id] - assert.Equal(t, false, ok) - continue - } - _, ok := changeIds[raw.Id] + for _, id := range []string{"2", "3", "4", "5", "6"} { + _, ok := changeIds[id] assert.Equal(t, true, ok) } + for _, id := range []string{"0", "1"} { + _, ok := changeIds[id] + assert.Equal(t, false, ok) + } + }) + + t.Run("changes from tree after 5", func(t *testing.T) { + changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{"5"}) + require.NoError(t, err, "changes after common snapshot should be without error") + + changeIds := make(map[string]struct{}) + for _, ch := range changes { + changeIds[ch.Id] = struct{}{} + } + + for _, id := range []string{"2", "3", "4", "6"} { + _, ok := changeIds[id] + assert.Equal(t, true, ok) + } + for _, id := range []string{"0", "1", "5"} { + _, ok := changeIds[id] + assert.Equal(t, false, ok) + } }) }) diff --git a/pkg/acl/tree/rawloader.go b/pkg/acl/tree/rawloader.go index 27cb7ba7..0c1956a9 100644 --- a/pkg/acl/tree/rawloader.go +++ b/pkg/acl/tree/rawloader.go @@ -90,7 +90,7 @@ func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb. return true }, func(visited []*Change) { - discardFromSlice(results, func(change *Change) bool { + results = discardFromSlice(results, func(change *Change) bool { return change.visited }) }, @@ -200,7 +200,7 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi }) // discarding visited - discardFromSlice(buffer, func(change *aclpb.RawChange) bool { + buffer = discardFromSlice(buffer, func(change *aclpb.RawChange) bool { return change == nil }) @@ -233,17 +233,20 @@ func (r *rawChangeLoader) loadEntry(id string) (entry rawCacheEntry, err error) return } -func discardFromSlice[T any](elements []T, isDiscarded func(T) bool) { +func discardFromSlice[T any](elements []T, isDiscarded func(T) bool) []T { var ( finishedIdx = 0 currentIdx = 0 ) for currentIdx < len(elements) { - if !isDiscarded(elements[currentIdx]) && finishedIdx != currentIdx { - elements[finishedIdx] = elements[currentIdx] + if !isDiscarded(elements[currentIdx]) { + if finishedIdx != currentIdx { + elements[finishedIdx] = elements[currentIdx] + } finishedIdx++ } currentIdx++ } elements = elements[:finishedIdx] + return elements } diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index c88324b3..fdf69873 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -73,22 +73,24 @@ func (tb *treeBuilder) buildTree(heads []string, breakpoint string) (err error) return } tb.tree.AddFast(ch) - changes, err := tb.dfs(heads, breakpoint, tb.loadChange) + changes, err := tb.dfs(heads, breakpoint) tb.tree.AddFast(changes...) return } -func (tb *treeBuilder) dfs( - heads []string, - breakpoint string, - load func(string) (*Change, error)) (buf []*Change, err error) { +func (tb *treeBuilder) dfs(heads []string, breakpoint string) (buf []*Change, err error) { + // initializing buffers tb.idStack = tb.idStack[:0] tb.loadBuffer = tb.loadBuffer[:0] + // updating map uniqMap := map[string]struct{}{breakpoint: {}} + + // preparing dfs tb.idStack = append(tb.idStack, heads...) + // dfs for len(tb.idStack) > 0 { id := tb.idStack[len(tb.idStack)-1] tb.idStack = tb.idStack[:len(tb.idStack)-1] @@ -96,7 +98,7 @@ func (tb *treeBuilder) dfs( continue } - ch, err := load(id) + ch, err := tb.loadChange(id) if err != nil { continue } From 11cb1e1f31a2be87c4205d9a324c56b8de3df792 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 8 Sep 2022 00:00:46 +0300 Subject: [PATCH 049/219] drpc space service, new pool, new peer --- Makefile | 2 +- cmd/node/node.go | 2 +- go.mod | 2 +- go.sum | 2 + pkg/acl/aclchanges/aclpb/aclchanges.pb.go | 116 +- pkg/ocache/ocache.go | 20 +- service/configuration/configuration.go | 4 +- service/net/dialer/dialer.go | 20 +- service/net/peer/peer.go | 70 +- service/net/pool/handler/reply.go | 32 - service/net/pool/message.go | 136 -- service/net/pool/peer.go | 28 - service/net/pool/pool.go | 375 +--- service/net/pool/pool_test.go | 213 ++ service/net/pool/request.go | 45 - service/net/pool/result.go | 53 - service/net/rpc/encoding.go | 18 - service/net/rpc/server/drpcserver.go | 18 +- service/net/rpc/stream.go | 55 - service/space/service.go | 24 +- service/space/space.go | 18 - .../space/spacesync/protos/spacesync.proto | 73 +- service/space/spacesync/spacesync.pb.go | 1713 ++++++----------- service/space/spacesync/spacesync_drpc.pb.go | 113 ++ syncproto/sync.pb.go | 62 +- 25 files changed, 1123 insertions(+), 2091 deletions(-) delete mode 100644 service/net/pool/handler/reply.go delete mode 100644 service/net/pool/message.go delete mode 100644 service/net/pool/peer.go create mode 100644 service/net/pool/pool_test.go delete mode 100644 service/net/pool/request.go delete mode 100644 service/net/pool/result.go delete mode 100644 service/net/rpc/encoding.go delete mode 100644 service/net/rpc/stream.go create mode 100644 service/space/spacesync/spacesync_drpc.pb.go diff --git a/Makefile b/Makefile index 82cb14de..8d0d2cb3 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ protos-go: $(GOGO_START) protoc --gogofaster_out=:. $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.proto; mv $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.go $(P_PLAINTEXT_CHANGES_PATH_PB) $(eval PKGMAP := $$(P_ACL_CHANGES),$$(P_TREE_CHANGES)) $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. $(P_SYNC_CHANGES_PATH_PB)/proto/*.proto - $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. service/space/spacesync/protos/*.proto + $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. --go-drpc_out=protolib=github.com/gogo/protobuf:. service/space/spacesync/protos/*.proto build: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) diff --git a/cmd/node/node.go b/cmd/node/node.go index d9433a35..d6ded226 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -97,7 +97,7 @@ func Bootstrap(a *app.App) { Register(secure.New()). Register(server.New()). Register(dialer.New()). - Register(pool.NewPool()). + Register(pool.New()). Register(configuration.New()). Register(document.New()). Register(message.New()). diff --git a/go.mod b/go.mod index e27f9d45..47537c53 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/zeebo/errs v1.2.2 // indirect + github.com/zeebo/errs v1.3.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect diff --git a/go.sum b/go.sum index 84667305..ba61ef8a 100644 --- a/go.sum +++ b/go.sum @@ -119,6 +119,8 @@ github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= github.com/zeebo/errs v1.2.2 h1:5NFypMTuSdoySVTqlNs1dEoU21QVamMQJxW/Fii5O7g= github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= +github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go index d42f22ba..a6d2fca5 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go @@ -218,13 +218,13 @@ func (m *ACLChange) GetIdentity() string { type ACLChange_ACLContentValue struct { // Types that are valid to be assigned to Value: // - // *ACLChange_ACLContent_Value_UserAdd - // *ACLChange_ACLContent_Value_UserRemove - // *ACLChange_ACLContent_Value_UserPermissionChange - // *ACLChange_ACLContent_Value_UserInvite - // *ACLChange_ACLContent_Value_UserJoin - // *ACLChange_ACLContent_Value_UserConfirm - Value isACLChange_ACLContent_Value_Value `protobuf_oneof:"value"` + // *ACLChange_ACLContentValue_UserAdd + // *ACLChange_ACLContentValue_UserRemove + // *ACLChange_ACLContentValue_UserPermissionChange + // *ACLChange_ACLContentValue_UserInvite + // *ACLChange_ACLContentValue_UserJoin + // *ACLChange_ACLContentValue_UserConfirm + Value isACLChange_ACLContentValue_Value `protobuf_oneof:"value"` } func (m *ACLChange_ACLContentValue) Reset() { *m = ACLChange_ACLContentValue{} } @@ -260,39 +260,39 @@ func (m *ACLChange_ACLContentValue) XXX_DiscardUnknown() { var xxx_messageInfo_ACLChange_ACLContentValue proto.InternalMessageInfo -type isACLChange_ACLContent_Value_Value interface { - isACLChange_ACLContent_Value_Value() +type isACLChange_ACLContentValue_Value interface { + isACLChange_ACLContentValue_Value() MarshalTo([]byte) (int, error) Size() int } -type ACLChange_ACLContent_Value_UserAdd struct { +type ACLChange_ACLContentValue_UserAdd struct { UserAdd *ACLChange_UserAdd `protobuf:"bytes,1,opt,name=userAdd,proto3,oneof" json:"userAdd,omitempty"` } -type ACLChange_ACLContent_Value_UserRemove struct { +type ACLChange_ACLContentValue_UserRemove struct { UserRemove *ACLChange_UserRemove `protobuf:"bytes,2,opt,name=userRemove,proto3,oneof" json:"userRemove,omitempty"` } -type ACLChange_ACLContent_Value_UserPermissionChange struct { +type ACLChange_ACLContentValue_UserPermissionChange struct { UserPermissionChange *ACLChange_UserPermissionChange `protobuf:"bytes,3,opt,name=userPermissionChange,proto3,oneof" json:"userPermissionChange,omitempty"` } -type ACLChange_ACLContent_Value_UserInvite struct { +type ACLChange_ACLContentValue_UserInvite struct { UserInvite *ACLChange_UserInvite `protobuf:"bytes,4,opt,name=userInvite,proto3,oneof" json:"userInvite,omitempty"` } -type ACLChange_ACLContent_Value_UserJoin struct { +type ACLChange_ACLContentValue_UserJoin struct { UserJoin *ACLChange_UserJoin `protobuf:"bytes,5,opt,name=userJoin,proto3,oneof" json:"userJoin,omitempty"` } -type ACLChange_ACLContent_Value_UserConfirm struct { +type ACLChange_ACLContentValue_UserConfirm struct { UserConfirm *ACLChange_UserConfirm `protobuf:"bytes,6,opt,name=userConfirm,proto3,oneof" json:"userConfirm,omitempty"` } -func (*ACLChange_ACLContent_Value_UserAdd) isACLChange_ACLContent_Value_Value() {} -func (*ACLChange_ACLContent_Value_UserRemove) isACLChange_ACLContent_Value_Value() {} -func (*ACLChange_ACLContent_Value_UserPermissionChange) isACLChange_ACLContent_Value_Value() {} -func (*ACLChange_ACLContent_Value_UserInvite) isACLChange_ACLContent_Value_Value() {} -func (*ACLChange_ACLContent_Value_UserJoin) isACLChange_ACLContent_Value_Value() {} -func (*ACLChange_ACLContent_Value_UserConfirm) isACLChange_ACLContent_Value_Value() {} +func (*ACLChange_ACLContentValue_UserAdd) isACLChange_ACLContentValue_Value() {} +func (*ACLChange_ACLContentValue_UserRemove) isACLChange_ACLContentValue_Value() {} +func (*ACLChange_ACLContentValue_UserPermissionChange) isACLChange_ACLContentValue_Value() {} +func (*ACLChange_ACLContentValue_UserInvite) isACLChange_ACLContentValue_Value() {} +func (*ACLChange_ACLContentValue_UserJoin) isACLChange_ACLContentValue_Value() {} +func (*ACLChange_ACLContentValue_UserConfirm) isACLChange_ACLContentValue_Value() {} -func (m *ACLChange_ACLContentValue) GetValue() isACLChange_ACLContent_Value_Value { +func (m *ACLChange_ACLContentValue) GetValue() isACLChange_ACLContentValue_Value { if m != nil { return m.Value } @@ -300,42 +300,42 @@ func (m *ACLChange_ACLContentValue) GetValue() isACLChange_ACLContent_Value_Valu } func (m *ACLChange_ACLContentValue) GetUserAdd() *ACLChange_UserAdd { - if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserAdd); ok { + if x, ok := m.GetValue().(*ACLChange_ACLContentValue_UserAdd); ok { return x.UserAdd } return nil } func (m *ACLChange_ACLContentValue) GetUserRemove() *ACLChange_UserRemove { - if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserRemove); ok { + if x, ok := m.GetValue().(*ACLChange_ACLContentValue_UserRemove); ok { return x.UserRemove } return nil } func (m *ACLChange_ACLContentValue) GetUserPermissionChange() *ACLChange_UserPermissionChange { - if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserPermissionChange); ok { + if x, ok := m.GetValue().(*ACLChange_ACLContentValue_UserPermissionChange); ok { return x.UserPermissionChange } return nil } func (m *ACLChange_ACLContentValue) GetUserInvite() *ACLChange_UserInvite { - if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserInvite); ok { + if x, ok := m.GetValue().(*ACLChange_ACLContentValue_UserInvite); ok { return x.UserInvite } return nil } func (m *ACLChange_ACLContentValue) GetUserJoin() *ACLChange_UserJoin { - if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserJoin); ok { + if x, ok := m.GetValue().(*ACLChange_ACLContentValue_UserJoin); ok { return x.UserJoin } return nil } func (m *ACLChange_ACLContentValue) GetUserConfirm() *ACLChange_UserConfirm { - if x, ok := m.GetValue().(*ACLChange_ACLContent_Value_UserConfirm); ok { + if x, ok := m.GetValue().(*ACLChange_ACLContentValue_UserConfirm); ok { return x.UserConfirm } return nil @@ -344,12 +344,12 @@ func (m *ACLChange_ACLContentValue) GetUserConfirm() *ACLChange_UserConfirm { // XXX_OneofWrappers is for the internal use of the proto package. func (*ACLChange_ACLContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*ACLChange_ACLContent_Value_UserAdd)(nil), - (*ACLChange_ACLContent_Value_UserRemove)(nil), - (*ACLChange_ACLContent_Value_UserPermissionChange)(nil), - (*ACLChange_ACLContent_Value_UserInvite)(nil), - (*ACLChange_ACLContent_Value_UserJoin)(nil), - (*ACLChange_ACLContent_Value_UserConfirm)(nil), + (*ACLChange_ACLContentValue_UserAdd)(nil), + (*ACLChange_ACLContentValue_UserRemove)(nil), + (*ACLChange_ACLContentValue_UserPermissionChange)(nil), + (*ACLChange_ACLContentValue_UserInvite)(nil), + (*ACLChange_ACLContentValue_UserJoin)(nil), + (*ACLChange_ACLContentValue_UserConfirm)(nil), } } @@ -1271,12 +1271,12 @@ func (m *ACLChange_ACLContentValue) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *ACLChange_ACLContent_Value_UserAdd) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserAdd) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChange_ACLContent_Value_UserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserAdd != nil { { @@ -1292,12 +1292,12 @@ func (m *ACLChange_ACLContent_Value_UserAdd) MarshalToSizedBuffer(dAtA []byte) ( } return len(dAtA) - i, nil } -func (m *ACLChange_ACLContent_Value_UserRemove) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserRemove) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChange_ACLContent_Value_UserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserRemove != nil { { @@ -1313,12 +1313,12 @@ func (m *ACLChange_ACLContent_Value_UserRemove) MarshalToSizedBuffer(dAtA []byte } return len(dAtA) - i, nil } -func (m *ACLChange_ACLContent_Value_UserPermissionChange) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserPermissionChange) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChange_ACLContent_Value_UserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserPermissionChange != nil { { @@ -1334,12 +1334,12 @@ func (m *ACLChange_ACLContent_Value_UserPermissionChange) MarshalToSizedBuffer(d } return len(dAtA) - i, nil } -func (m *ACLChange_ACLContent_Value_UserInvite) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserInvite) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChange_ACLContent_Value_UserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserInvite != nil { { @@ -1355,12 +1355,12 @@ func (m *ACLChange_ACLContent_Value_UserInvite) MarshalToSizedBuffer(dAtA []byte } return len(dAtA) - i, nil } -func (m *ACLChange_ACLContent_Value_UserJoin) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserJoin) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChange_ACLContent_Value_UserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserJoin != nil { { @@ -1376,12 +1376,12 @@ func (m *ACLChange_ACLContent_Value_UserJoin) MarshalToSizedBuffer(dAtA []byte) } return len(dAtA) - i, nil } -func (m *ACLChange_ACLContent_Value_UserConfirm) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserConfirm) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChange_ACLContent_Value_UserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLChange_ACLContentValue_UserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserConfirm != nil { { @@ -2039,7 +2039,7 @@ func (m *ACLChange_ACLContentValue) Size() (n int) { return n } -func (m *ACLChange_ACLContent_Value_UserAdd) Size() (n int) { +func (m *ACLChange_ACLContentValue_UserAdd) Size() (n int) { if m == nil { return 0 } @@ -2051,7 +2051,7 @@ func (m *ACLChange_ACLContent_Value_UserAdd) Size() (n int) { } return n } -func (m *ACLChange_ACLContent_Value_UserRemove) Size() (n int) { +func (m *ACLChange_ACLContentValue_UserRemove) Size() (n int) { if m == nil { return 0 } @@ -2063,7 +2063,7 @@ func (m *ACLChange_ACLContent_Value_UserRemove) Size() (n int) { } return n } -func (m *ACLChange_ACLContent_Value_UserPermissionChange) Size() (n int) { +func (m *ACLChange_ACLContentValue_UserPermissionChange) Size() (n int) { if m == nil { return 0 } @@ -2075,7 +2075,7 @@ func (m *ACLChange_ACLContent_Value_UserPermissionChange) Size() (n int) { } return n } -func (m *ACLChange_ACLContent_Value_UserInvite) Size() (n int) { +func (m *ACLChange_ACLContentValue_UserInvite) Size() (n int) { if m == nil { return 0 } @@ -2087,7 +2087,7 @@ func (m *ACLChange_ACLContent_Value_UserInvite) Size() (n int) { } return n } -func (m *ACLChange_ACLContent_Value_UserJoin) Size() (n int) { +func (m *ACLChange_ACLContentValue_UserJoin) Size() (n int) { if m == nil { return 0 } @@ -2099,7 +2099,7 @@ func (m *ACLChange_ACLContent_Value_UserJoin) Size() (n int) { } return n } -func (m *ACLChange_ACLContent_Value_UserConfirm) Size() (n int) { +func (m *ACLChange_ACLContentValue_UserConfirm) Size() (n int) { if m == nil { return 0 } @@ -2871,7 +2871,7 @@ func (m *ACLChange_ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChange_ACLContent_Value_UserAdd{v} + m.Value = &ACLChange_ACLContentValue_UserAdd{v} iNdEx = postIndex case 2: if wireType != 2 { @@ -2906,7 +2906,7 @@ func (m *ACLChange_ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChange_ACLContent_Value_UserRemove{v} + m.Value = &ACLChange_ACLContentValue_UserRemove{v} iNdEx = postIndex case 3: if wireType != 2 { @@ -2941,7 +2941,7 @@ func (m *ACLChange_ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChange_ACLContent_Value_UserPermissionChange{v} + m.Value = &ACLChange_ACLContentValue_UserPermissionChange{v} iNdEx = postIndex case 4: if wireType != 2 { @@ -2976,7 +2976,7 @@ func (m *ACLChange_ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChange_ACLContent_Value_UserInvite{v} + m.Value = &ACLChange_ACLContentValue_UserInvite{v} iNdEx = postIndex case 5: if wireType != 2 { @@ -3011,7 +3011,7 @@ func (m *ACLChange_ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChange_ACLContent_Value_UserJoin{v} + m.Value = &ACLChange_ACLContentValue_UserJoin{v} iNdEx = postIndex case 6: if wireType != 2 { @@ -3046,7 +3046,7 @@ func (m *ACLChange_ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChange_ACLContent_Value_UserConfirm{v} + m.Value = &ACLChange_ACLContentValue_UserConfirm{v} iNdEx = postIndex default: iNdEx = preIndex diff --git a/pkg/ocache/ocache.go b/pkg/ocache/ocache.go index b0460ca6..5e10508a 100644 --- a/pkg/ocache/ocache.go +++ b/pkg/ocache/ocache.go @@ -69,10 +69,13 @@ type Object interface { } type ObjectLocker interface { - Object Locked() bool } +type ObjectLastUsage interface { + LastUsage() time.Time +} + type entry struct { id string lastUsage time.Time @@ -99,7 +102,7 @@ type OCache interface { // When 'loadFunc' returns a non-nil error, an object will not be stored to cache Get(ctx context.Context, id string) (value Object, err error) // Pick returns value if it's presents in cache (will not call loadFunc) - Pick(id string) (value Object, err error) + Pick(ctx context.Context, id string) (value Object, err error) // Add adds new object to cache // Returns error when object exists Add(id string, value Object) (err error) @@ -166,13 +169,18 @@ func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) { return e.value, e.loadErr } -func (c *oCache) Pick(id string) (value Object, err error) { +func (c *oCache) Pick(ctx context.Context, id string) (value Object, err error) { c.mu.Lock() val, ok := c.data[id] c.mu.Unlock() if !ok { return nil, ErrNotExists } + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-val.load: + } <-val.load return val.value, val.loadErr } @@ -307,7 +315,11 @@ func (c *oCache) GC() { deadline := c.timeNow().Add(-c.ttl) var toClose []*entry for k, e := range c.data { - if !e.locked() && e.refCount <= 0 && e.lastUsage.Before(deadline) { + lu := e.lastUsage + if lug, ok := e.value.(ObjectLastUsage); ok { + lu = lug.LastUsage() + } + if !e.locked() && e.refCount <= 0 && lu.Before(deadline) { delete(c.data, k) toClose = append(toClose, e) } diff --git a/service/configuration/configuration.go b/service/configuration/configuration.go index 5701eca6..c242d79d 100644 --- a/service/configuration/configuration.go +++ b/service/configuration/configuration.go @@ -40,7 +40,7 @@ func (c *configuration) AllPeers(ctx context.Context, spaceId string) (peers []p nodeIds := c.NodeIds(spaceId) peers = make([]peer.Peer, 0, len(nodeIds)) for _, id := range nodeIds { - p, e := c.pool.DialAndAddPeer(ctx, id) + p, e := c.pool.Get(ctx, id) if e == nil { peers = append(peers, p) } @@ -53,7 +53,7 @@ func (c *configuration) AllPeers(ctx context.Context, spaceId string) (peers []p func (c *configuration) OnePeer(ctx context.Context, spaceId string) (p peer.Peer, err error) { nodeIds := c.NodeIds(spaceId) - return c.pool.GetOrDialOneOf(ctx, nodeIds) + return c.pool.GetOneOf(ctx, nodeIds) } func (c *configuration) NodeIds(spaceId string) []string { diff --git a/service/net/dialer/dialer.go b/service/net/dialer/dialer.go index b90bf872..ade01444 100644 --- a/service/net/dialer/dialer.go +++ b/service/net/dialer/dialer.go @@ -7,7 +7,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" "github.com/libp2p/go-libp2p-core/sec" "go.uber.org/zap" @@ -60,7 +59,7 @@ func (d *dialer) UpdateAddrs(addrs map[string][]string) { d.mu.Unlock() } -func (d *dialer) Dial(ctx context.Context, peerId string) (peer peer.Peer, err error) { +func (d *dialer) Dial(ctx context.Context, peerId string) (p peer.Peer, err error) { d.mu.RLock() defer d.mu.RUnlock() addrs, ok := d.peerAddrs[peerId] @@ -68,11 +67,11 @@ func (d *dialer) Dial(ctx context.Context, peerId string) (peer peer.Peer, err e return nil, ErrArrdsNotFound } var ( - stream drpc.Stream - sc sec.SecureConn + conn drpc.Conn + sc sec.SecureConn ) for _, addr := range addrs { - stream, sc, err = d.makeStream(ctx, addr) + conn, sc, err = d.handshake(ctx, addr) if err != nil { log.Info("can't connect to host", zap.String("addr", addr)) } else { @@ -83,10 +82,10 @@ func (d *dialer) Dial(ctx context.Context, peerId string) (peer peer.Peer, err e if err != nil { return } - return rpc.PeerFromStream(sc, stream, false), nil + return peer.NewPeer(sc, conn), nil } -func (d *dialer) makeStream(ctx context.Context, addr string) (stream drpc.Stream, sc sec.SecureConn, err error) { +func (d *dialer) handshake(ctx context.Context, addr string) (conn drpc.Conn, sc sec.SecureConn, err error) { tcpConn, err := net.Dial("tcp", addr) if err != nil { return @@ -96,9 +95,6 @@ func (d *dialer) makeStream(ctx context.Context, addr string) (stream drpc.Strea return } log.Info("connected with remote host", zap.String("serverPeer", sc.RemotePeer().String()), zap.String("per", sc.LocalPeer().String())) - stream, err = drpcconn.New(sc).NewStream(ctx, "", rpc.Encoding) - if err != nil { - return - } - return stream, sc, err + conn = drpcconn.New(sc) + return conn, sc, err } diff --git a/service/net/peer/peer.go b/service/net/peer/peer.go index 331b0982..d73dc596 100644 --- a/service/net/peer/peer.go +++ b/service/net/peer/peer.go @@ -2,34 +2,58 @@ package peer import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "github.com/libp2p/go-libp2p-core/sec" + "storj.io/drpc" + "sync/atomic" "time" ) -type Dir uint - -const ( - // DirInbound indicates peer created connection - DirInbound Dir = iota - // DirOutbound indicates that our host created connection - DirOutbound -) - -type Info struct { - Id string - Dir Dir - LastActiveUnix int64 -} - -func (i Info) LastActive() time.Time { - return time.Unix(i.LastActiveUnix, 0) +func NewPeer(sc sec.SecureConn, conn drpc.Conn) Peer { + return &peer{ + id: sc.RemotePeer().String(), + lastUsage: time.Now().Unix(), + sc: sc, + Conn: conn, + } } type Peer interface { Id() string - Info() Info - Recv() (*syncproto.Message, error) - Send(msg *syncproto.Message) (err error) - Context() context.Context - Close() error + LastUsage() time.Time + UpdateLastUsage() + drpc.Conn +} + +type peer struct { + id string + lastUsage int64 + sc sec.SecureConn + drpc.Conn +} + +func (p *peer) Id() string { + return p.id +} + +func (p *peer) LastUsage() time.Time { + select { + case <-p.Closed(): + return time.Unix(0, 0) + default: + } + return time.Unix(atomic.LoadInt64(&p.lastUsage), 0) +} + +func (p *peer) Invoke(ctx context.Context, rpc string, enc drpc.Encoding, in, out drpc.Message) error { + defer p.UpdateLastUsage() + return p.Conn.Invoke(ctx, rpc, enc, in, out) +} + +func (p *peer) NewStream(ctx context.Context, rpc string, enc drpc.Encoding) (drpc.Stream, error) { + defer p.UpdateLastUsage() + return p.Conn.NewStream(ctx, rpc, enc) +} + +func (p *peer) UpdateLastUsage() { + atomic.StoreInt64(&p.lastUsage, time.Now().Unix()) } diff --git a/service/net/pool/handler/reply.go b/service/net/pool/handler/reply.go deleted file mode 100644 index 21dda1dd..00000000 --- a/service/net/pool/handler/reply.go +++ /dev/null @@ -1,32 +0,0 @@ -package handler - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" - "github.com/gogo/protobuf/proto" - "go.uber.org/zap" -) - -var log = logger.NewNamed("replyHandler") - -type ReplyHandler interface { - Handle(ctx context.Context, req []byte) (rep proto.Marshaler, err error) -} - -type Reply struct { - ReplyHandler -} - -func (r Reply) Handle(ctx context.Context, msg *pool.Message) error { - rep, e := r.ReplyHandler.Handle(ctx, msg.GetData()) - if msg.GetHeader().RequestId == 0 { - if e != nil { - log.Error("handler returned error", zap.Error(e)) - } else if rep != nil { - log.Debug("sender didn't expect a reply, but the handler made") - } - return nil - } - return msg.ReplyType(msg.GetHeader().GetType(), rep) -} diff --git a/service/net/pool/message.go b/service/net/pool/message.go deleted file mode 100644 index 15a76f2e..00000000 --- a/service/net/pool/message.go +++ /dev/null @@ -1,136 +0,0 @@ -package pool - -import ( - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "github.com/gogo/protobuf/proto" - "go.uber.org/zap" - "gopkg.in/mgo.v2/bson" -) - -type Message struct { - *syncproto.Message - peer peer.Peer -} - -func (m *Message) Peer() peer.Peer { - return m.peer -} - -func (m *Message) Reply(data []byte) (err error) { - rep := &syncproto.Message{ - Header: &syncproto.Header{ - TraceId: m.GetHeader().TraceId, - ReplyId: m.GetHeader().RequestId, - Type: syncproto.MessageType_MessageTypeSync, - }, - Data: data, - } - return m.peer.Send(rep) -} - -func (m *Message) ReplyType(tp syncproto.MessageType, data proto.Marshaler) (err error) { - dataBytes, err := data.Marshal() - if err != nil { - return err - } - rep := &syncproto.Message{ - Header: &syncproto.Header{ - TraceId: m.GetHeader().TraceId, - ReplyId: m.GetHeader().RequestId, - Type: tp, - }, - Data: dataBytes, - } - return m.peer.Send(rep) -} - -func (m *Message) Ack() (err error) { - ack := &syncproto.System{ - Ack: &syncproto.System_Ack{}, - } - data, err := ack.Marshal() - if err != nil { - return - } - rep := &syncproto.Message{ - Header: &syncproto.Header{ - TraceId: m.GetHeader().TraceId, - ReplyId: m.GetHeader().RequestId, - Type: syncproto.MessageType_MessageTypeSystem, - DebugInfo: "Ack", - }, - Data: data, - } - err = m.peer.Send(rep) - if err != nil { - log.With( - zap.String("peerId", m.peer.Id()), - zap.String("header", rep.GetHeader().String())). - Error("failed sending ack to peer", zap.Error(err)) - } else { - log.With( - zap.String("peerId", m.peer.Id()), - zap.String("header", rep.GetHeader().String())). - Debug("sent ack to peer") - } - return -} - -func (m *Message) AckError(code syncproto.System_Error_Code, description string) (err error) { - ack := &syncproto.System{ - Ack: &syncproto.System_Ack{ - Error: &syncproto.System_Error{ - Code: code, - Description: description, - }, - }, - } - data, err := ack.Marshal() - if err != nil { - return - } - rep := &syncproto.Message{ - Header: &syncproto.Header{ - TraceId: []byte(bson.NewObjectId()), - ReplyId: m.GetHeader().RequestId, - Type: syncproto.MessageType_MessageTypeSystem, - DebugInfo: "AckError", - }, - Data: data, - } - if err != nil { - log.With( - zap.String("peerId", m.peer.Id()), - zap.String("header", rep.GetHeader().String())). - Error("failed sending ackError to peer", zap.Error(err)) - } else { - log.With( - zap.String("peerId", m.peer.Id()), - zap.String("header", rep.GetHeader().String())). - Debug("sent ackError to peer") - } - return m.peer.Send(rep) -} - -func (m *Message) IsAck() (err error) { - if tp := m.GetHeader().GetType(); tp != syncproto.MessageType_MessageTypeSystem { - return fmt.Errorf("unexpected message type in response: %v, want System", tp) - } - sys := &syncproto.System{} - if err = sys.Unmarshal(m.GetData()); err != nil { - return - } - if ack := sys.Ack; ack != nil { - if ack.Error != nil { - return fmt.Errorf("response error: code=%d; descriptipon=%s", ack.Error.Code, ack.Error.Description) - } - return nil - } - return fmt.Errorf("received not ack response") -} - -func (m *Message) UnmarshalData(msg proto.Unmarshaler) error { - return msg.Unmarshal(m.Data) -} diff --git a/service/net/pool/peer.go b/service/net/pool/peer.go deleted file mode 100644 index 6a7a96d0..00000000 --- a/service/net/pool/peer.go +++ /dev/null @@ -1,28 +0,0 @@ -package pool - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" -) - -type peerEntry struct { - peer peer.Peer - groupIds []string - ready chan struct{} -} - -func (pe *peerEntry) addGroup(groupId string) (ok bool) { - if slice.FindPos(pe.groupIds, groupId) != -1 { - return false - } - pe.groupIds = append(pe.groupIds, groupId) - return true -} - -func (pe *peerEntry) removeGroup(groupId string) (ok bool) { - if slice.FindPos(pe.groupIds, groupId) == -1 { - return false - } - pe.groupIds = slice.Remove(pe.groupIds, groupId) - return true -} diff --git a/service/net/pool/pool.go b/service/net/pool/pool.go index 97a7dcc1..cbd0973a 100644 --- a/service/net/pool/pool.go +++ b/service/net/pool/pool.go @@ -3,72 +3,47 @@ package pool import ( "context" "errors" - "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" - "go.uber.org/zap" "math/rand" - "sync" - "sync/atomic" ) const ( - CName = "sync/peerPool" - maxSimultaneousOperationsPerStream = 10 + CName = "net.pool" ) -var log = logger.NewNamed("peerPool") +var log = logger.NewNamed(CName) var ( - ErrPoolClosed = errors.New("peer pool is closed") - ErrPeerNotFound = errors.New("peer not found") + ErrUnableToConnect = errors.New("unable to connect") ) -func NewPool() Pool { - return &pool{closed: true} +func New() Pool { + return &pool{} } -type Handler func(ctx context.Context, msg *Message) (err error) - +// Pool creates and caches outgoing connection type Pool interface { - AddAndReadPeer(peer peer.Peer) (err error) - AddHandler(msgType syncproto.MessageType, h Handler) - AddPeerIdToGroup(peerId, groupId string) (err error) - RemovePeerIdFromGroup(peerId, groupId string) (err error) - DialAndAddPeer(ctx context.Context, id string) (peer.Peer, error) - GetOrDialOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) - - SendAndWait(ctx context.Context, peerId string, msg *syncproto.Message) (err error) - SendAndWaitResponse(ctx context.Context, id string, s *syncproto.Message) (resp *Message, err error) - Broadcast(ctx context.Context, groupId string, msg *syncproto.Message) (err error) + // Get lookups to peer in existing connections or creates and cache new one + Get(ctx context.Context, id string) (peer.Peer, error) + // GetOneOf searches at least one existing connection in cache or creates a new one from a randomly selected id from given list + GetOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) app.ComponentRunnable } type pool struct { - peersById map[string]*peerEntry - waiters *waiters - handlers map[syncproto.MessageType][]Handler - peersIdsByGroup map[string][]string - - dialer dialer.Dialer - - closed bool - mu sync.RWMutex - wg *sync.WaitGroup + cache ocache.OCache } func (p *pool) Init(ctx context.Context, a *app.App) (err error) { - p.peersById = map[string]*peerEntry{} - p.handlers = map[syncproto.MessageType][]Handler{} - p.peersIdsByGroup = map[string][]string{} - p.waiters = &waiters{waiters: map[uint64]*waiter{}} - p.dialer = a.MustComponent(dialer.CName).(dialer.Dialer) - p.wg = &sync.WaitGroup{} + dialer := a.MustComponent(dialer.CName).(dialer.Dialer) + p.cache = ocache.New(func(ctx context.Context, id string) (value ocache.Object, err error) { + return dialer.Dial(ctx, id) + }) return nil } @@ -77,321 +52,49 @@ func (p *pool) Name() (name string) { } func (p *pool) Run(ctx context.Context) (err error) { - p.closed = false return nil } -func (p *pool) AddHandler(msgType syncproto.MessageType, h Handler) { - p.mu.Lock() - defer p.mu.Unlock() - if !p.closed { - // unable to add handler after Run - return - } - p.handlers[msgType] = append(p.handlers[msgType], h) -} - -func (p *pool) DialAndAddPeer(ctx context.Context, peerId string) (peer.Peer, error) { - p.mu.Lock() - defer p.mu.Unlock() - if p.closed { - return nil, ErrPoolClosed - } - return p.dialAndAdd(ctx, peerId) -} - -func (p *pool) dialAndAdd(ctx context.Context, peerId string) (peer.Peer, error) { - if peer, ok := p.peersById[peerId]; ok { - return peer.peer, nil - } - peer, err := p.dialer.Dial(ctx, peerId) +func (p *pool) Get(ctx context.Context, id string) (peer.Peer, error) { + v, err := p.cache.Get(ctx, id) if err != nil { return nil, err } - p.peersById[peer.Id()] = &peerEntry{ - peer: peer, - } - p.wg.Add(1) - go p.readPeerLoop(peer) - return peer, nil -} - -func (p *pool) AddAndReadPeer(peer peer.Peer) (err error) { - p.mu.Lock() - if p.closed { - p.mu.Unlock() - return ErrPoolClosed - } - p.peersById[peer.Id()] = &peerEntry{ - peer: peer, - } - p.wg.Add(1) - p.mu.Unlock() - return p.readPeerLoop(peer) -} - -func (p *pool) AddPeerIdToGroup(peerId, groupId string) (err error) { - p.mu.Lock() - defer p.mu.Unlock() - peer, ok := p.peersById[peerId] - if !ok { - return ErrPeerNotFound - } - if slice.FindPos(peer.groupIds, groupId) != -1 { - return nil - } - peer.addGroup(groupId) - p.peersIdsByGroup[groupId] = append(p.peersIdsByGroup[groupId], peerId) - return -} - -func (p *pool) RemovePeerIdFromGroup(peerId, groupId string) (err error) { - p.mu.Lock() - defer p.mu.Unlock() - peer, ok := p.peersById[peerId] - if !ok { - return ErrPeerNotFound - } - if slice.FindPos(peer.groupIds, groupId) == -1 { - return nil - } - peer.removeGroup(groupId) - p.peersIdsByGroup[groupId] = slice.Remove(p.peersIdsByGroup[groupId], peerId) - return -} - -func (p *pool) SendAndWait(ctx context.Context, peerId string, msg *syncproto.Message) (err error) { - resp, err := p.SendAndWaitResponse(ctx, peerId, msg) - if err != nil { - return - } - return resp.IsAck() -} - -func (p *pool) SendAndWaitResponse(ctx context.Context, peerId string, msg *syncproto.Message) (resp *Message, err error) { - defer func() { - if err != nil { - log.With( - zap.String("peerId", peerId), - zap.String("header", msg.GetHeader().String())). - Error("failed sending message to peer", zap.Error(err)) - } else { - log.With( - zap.String("peerId", peerId), - zap.String("header", msg.GetHeader().String())). - Debug("sent message to peer") - } - }() - - p.mu.RLock() - peer := p.peersById[peerId] - p.mu.RUnlock() - if peer == nil { - err = ErrPeerNotFound - return - } - - repId := p.waiters.NewReplyId() - msg.GetHeader().RequestId = repId - ch := make(chan Reply, 1) - - log.With(zap.Uint64("reply id", repId)).Debug("adding waiter for reply id") - p.waiters.Add(repId, &waiter{ch: ch}) - defer p.waiters.Remove(repId) - - if err = peer.peer.Send(msg); err != nil { - return - } + pr := v.(peer.Peer) select { - case rep := <-ch: - if rep.Error != nil { - err = rep.Error - return - } - resp = rep.Message - return - case <-ctx.Done(): - log.Debug("context done in SendAndWait") - err = ctx.Err() + case <-pr.Closed(): + default: + return pr, nil } - return + p.cache.Remove(id) + return p.Get(ctx, id) } -func (p *pool) GetOrDialOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) { - p.mu.RLock() - if p.closed { - p.mu.RUnlock() - return nil, ErrPoolClosed - } +func (p *pool) GetOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) { + // finding existing connection for _, peerId := range peerIds { - peer, ok := p.peersById[peerId] - if ok { - p.mu.RUnlock() - return peer.peer, nil + if v, err := p.cache.Pick(ctx, peerId); err == nil { + pr := v.(peer.Peer) + select { + case <-pr.Closed(): + default: + return pr, nil + } } } - p.mu.RUnlock() + // shuffle ids for better consistency rand.Shuffle(len(peerIds), func(i, j int) { peerIds[i], peerIds[j] = peerIds[j], peerIds[i] }) - p.mu.Lock() - defer p.mu.Unlock() - var lastErr error + // connecting for _, peerId := range peerIds { - peer, err := p.dialAndAdd(ctx, peerId) - if err != nil { - lastErr = err - continue - } else { - return peer, nil - } - } - return nil, lastErr -} - -func (p *pool) Broadcast(ctx context.Context, groupId string, msg *syncproto.Message) (err error) { - //TODO implement me - panic("implement me") -} - -func (p *pool) readPeerLoop(peer peer.Peer) (err error) { - defer p.wg.Done() - - limiter := make(chan struct{}, maxSimultaneousOperationsPerStream) - for i := 0; i < maxSimultaneousOperationsPerStream; i++ { - limiter <- struct{}{} - } -Loop: - for { - msg, err := peer.Recv() - if err != nil { - log.Debug("peer receive error", zap.Error(err), zap.String("peerId", peer.Id())) - break - } - select { - case <-limiter: - case <-peer.Context().Done(): - break Loop - } - go func() { - defer func() { - limiter <- struct{}{} - }() - p.handleMessage(peer, msg) - }() - } - if err = p.removePeer(peer.Id()); err != nil { - log.Error("remove peer error", zap.String("peerId", peer.Id()), zap.Error(err)) - } - return -} - -func (p *pool) removePeer(peerId string) (err error) { - p.mu.Lock() - defer p.mu.Unlock() - _, ok := p.peersById[peerId] - if !ok { - return ErrPeerNotFound - } - delete(p.peersById, peerId) - return -} - -func (p *pool) handleMessage(peer peer.Peer, msg *syncproto.Message) { - log.With(zap.String("peerId", peer.Id()), zap.String("header", msg.GetHeader().String())). - Debug("received message from peer") - replyId := msg.GetHeader().GetReplyId() - if replyId != 0 { - if !p.waiters.Send(replyId, Reply{ - PeerInfo: peer.Info(), - Message: &Message{ - Message: msg, - peer: peer, - }, - }) { - log.Debug("received reply with unknown (or expired) replyId", zap.Uint64("replyId", replyId), zap.String("header", msg.GetHeader().String())) - } - return - } - handlers := p.handlers[msg.GetHeader().GetType()] - if len(handlers) == 0 { - log.With(zap.String("peerId", peer.Id())).Debug("no handlers for such message") - return - } - - message := &Message{Message: msg, peer: peer} - - for _, h := range handlers { - if err := h(peer.Context(), message); err != nil { - log.Error("handle message error", zap.Error(err)) + if v, err := p.cache.Get(ctx, peerId); err == nil { + return v.(peer.Peer), nil } } + return nil, ErrUnableToConnect } func (p *pool) Close(ctx context.Context) (err error) { - p.mu.Lock() - for _, peer := range p.peersById { - peer.peer.Close() - } - wg := p.wg - p.mu.Unlock() - if wg != nil { - wg.Wait() - } - return nil -} - -type waiter struct { - sent int - ch chan<- Reply -} - -type waiters struct { - waiters map[uint64]*waiter - replySeq uint64 - mu sync.Mutex -} - -func (w *waiters) Send(replyId uint64, r Reply) (ok bool) { - w.mu.Lock() - wait := w.waiters[replyId] - if wait == nil { - w.mu.Unlock() - return false - } - wait.sent++ - var lastMessage = wait.sent == cap(wait.ch) - if lastMessage { - delete(w.waiters, replyId) - } - w.mu.Unlock() - wait.ch <- r - if lastMessage { - close(wait.ch) - } - return true -} - -func (w *waiters) Add(replyId uint64, wait *waiter) { - w.mu.Lock() - w.waiters[replyId] = wait - w.mu.Unlock() -} - -func (w *waiters) Remove(id uint64) error { - w.mu.Lock() - defer w.mu.Unlock() - if _, ok := w.waiters[id]; ok { - delete(w.waiters, id) - return nil - } - return fmt.Errorf("waiter not found") -} - -func (w *waiters) NewReplyId() uint64 { - res := atomic.AddUint64(&w.replySeq, 1) - if res == 0 { - return w.NewReplyId() - } - return res + return p.cache.Close() } diff --git a/service/net/pool/pool_test.go b/service/net/pool/pool_test.go new file mode 100644 index 00000000..efc51d38 --- /dev/null +++ b/service/net/pool/pool_test.go @@ -0,0 +1,213 @@ +package pool + +import ( + "context" + "errors" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "storj.io/drpc" + "testing" + "time" +) + +var ctx = context.Background() + +func TestPool_Get(t *testing.T) { + t.Run("dial error", func(t *testing.T) { + fx := newFixture(t) + defer fx.Finish() + var expErr = errors.New("dial error") + fx.Dialer.dial = func(ctx context.Context, peerId string) (peer peer.Peer, err error) { + return nil, expErr + } + p, err := fx.Get(ctx, "1") + assert.Nil(t, p) + assert.EqualError(t, err, expErr.Error()) + }) + t.Run("dial and cached", func(t *testing.T) { + fx := newFixture(t) + defer fx.Finish() + fx.Dialer.dial = func(ctx context.Context, peerId string) (peer peer.Peer, err error) { + return newTestPeer("1"), nil + } + p, err := fx.Get(ctx, "1") + assert.NoError(t, err) + assert.NotNil(t, p) + fx.Dialer.dial = nil + p, err = fx.Get(ctx, "1") + assert.NoError(t, err) + assert.NotNil(t, p) + }) + t.Run("retry for closed", func(t *testing.T) { + fx := newFixture(t) + defer fx.Finish() + tp := newTestPeer("1") + fx.Dialer.dial = func(ctx context.Context, peerId string) (peer peer.Peer, err error) { + return tp, nil + } + p, err := fx.Get(ctx, "1") + assert.NoError(t, err) + assert.NotNil(t, p) + p.Close() + tp2 := newTestPeer("1") + fx.Dialer.dial = func(ctx context.Context, peerId string) (peer peer.Peer, err error) { + return tp2, nil + } + p, err = fx.Get(ctx, "1") + assert.NoError(t, err) + assert.Equal(t, p, tp2) + }) +} + +func TestPool_GetOneOf(t *testing.T) { + addToCache := func(t *testing.T, fx *fixture, tp *testPeer) { + fx.Dialer.dial = func(ctx context.Context, peerId string) (peer peer.Peer, err error) { + return tp, nil + } + gp, err := fx.Get(ctx, tp.Id()) + require.NoError(t, err) + require.Equal(t, gp, tp) + } + + t.Run("from cache", func(t *testing.T) { + fx := newFixture(t) + defer fx.Finish() + tp1 := newTestPeer("1") + addToCache(t, fx, tp1) + p, err := fx.GetOneOf(ctx, []string{"3", "2", "1"}) + require.NoError(t, err) + assert.Equal(t, tp1, p) + }) + t.Run("from cache - skip closed", func(t *testing.T) { + fx := newFixture(t) + defer fx.Finish() + tp2 := newTestPeer("2") + addToCache(t, fx, tp2) + tp2.Close() + tp1 := newTestPeer("1") + addToCache(t, fx, tp1) + p, err := fx.GetOneOf(ctx, []string{"3", "2", "1"}) + require.NoError(t, err) + assert.Equal(t, tp1, p) + }) + t.Run("dial", func(t *testing.T) { + fx := newFixture(t) + defer fx.Finish() + var called bool + fx.Dialer.dial = func(ctx context.Context, peerId string) (peer peer.Peer, err error) { + if called { + return nil, fmt.Errorf("not expected call") + } + called = true + return newTestPeer(peerId), nil + } + p, err := fx.GetOneOf(ctx, []string{"3", "2", "1"}) + require.NoError(t, err) + assert.NotNil(t, p) + }) + t.Run("unable to connect", func(t *testing.T) { + fx := newFixture(t) + defer fx.Finish() + fx.Dialer.dial = func(ctx context.Context, peerId string) (peer peer.Peer, err error) { + return nil, fmt.Errorf("persistent error") + } + p, err := fx.GetOneOf(ctx, []string{"3", "2", "1"}) + assert.Equal(t, ErrUnableToConnect, err) + assert.Nil(t, p) + }) +} + +func newFixture(t *testing.T) *fixture { + fx := &fixture{ + Pool: New(), + Dialer: &dialerMock{}, + } + a := new(app.App) + a.Register(fx.Pool) + a.Register(fx.Dialer) + require.NoError(t, a.Start(context.Background())) + fx.a = a + fx.t = t + return fx +} + +func (fx *fixture) Finish() { + require.NoError(fx.t, fx.a.Close(context.Background())) +} + +type fixture struct { + Pool + Dialer *dialerMock + a *app.App + t *testing.T +} + +var _ dialer.Dialer = (*dialerMock)(nil) + +type dialerMock struct { + dial func(ctx context.Context, peerId string) (peer peer.Peer, err error) +} + +func (d *dialerMock) Dial(ctx context.Context, peerId string) (peer peer.Peer, err error) { + return d.dial(ctx, peerId) +} + +func (d *dialerMock) UpdateAddrs(addrs map[string][]string) { + return +} + +func (d *dialerMock) Init(ctx context.Context, a *app.App) (err error) { + return +} + +func (d *dialerMock) Name() (name string) { + return dialer.CName +} + +func newTestPeer(id string) *testPeer { + return &testPeer{ + id: id, + closed: make(chan struct{}), + } +} + +type testPeer struct { + id string + closed chan struct{} +} + +func (t *testPeer) Id() string { + return t.id +} + +func (t *testPeer) LastUsage() time.Time { + return time.Now() +} + +func (t *testPeer) UpdateLastUsage() {} + +func (t *testPeer) Close() error { + select { + case <-t.closed: + return fmt.Errorf("already closed") + default: + close(t.closed) + } + return nil +} + +func (t *testPeer) Closed() <-chan struct{} { + return t.closed +} + +func (t *testPeer) Invoke(ctx context.Context, rpc string, enc drpc.Encoding, in, out drpc.Message) error { + return fmt.Errorf("call Invoke on test peer") +} + +func (t *testPeer) NewStream(ctx context.Context, rpc string, enc drpc.Encoding) (drpc.Stream, error) { + return nil, fmt.Errorf("call NewStream on test peer") +} diff --git a/service/net/pool/request.go b/service/net/pool/request.go deleted file mode 100644 index 8584f0dd..00000000 --- a/service/net/pool/request.go +++ /dev/null @@ -1,45 +0,0 @@ -package pool - -import "context" - -// 1. message for one peerId with ack -// pool.SendAndWait(ctx context,.C -// 2. message for many peers without ack (or group) - -type Request struct { - groupId string - oneOf []string - all []string - tryDial bool - needReply bool - pool *pool -} - -func (r *Request) GroupId(groupId string) *Request { - r.groupId = groupId - return r -} - -func (r *Request) All(peerIds ...string) *Request { - r.all = peerIds - return r -} - -func (r *Request) OneOf(peerIds ...string) *Request { - r.oneOf = peerIds - return r -} - -func (r *Request) TryDial(is bool) *Request { - r.tryDial = is - return r -} - -func (r *Request) NeedReply(is bool) *Request { - r.needReply = is - return r -} - -func (r *Request) Exec(ctx context.Context, msg *Message) *Results { - return nil -} diff --git a/service/net/pool/result.go b/service/net/pool/result.go deleted file mode 100644 index 94f1ac93..00000000 --- a/service/net/pool/result.go +++ /dev/null @@ -1,53 +0,0 @@ -package pool - -import ( - "context" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" -) - -// Results of request collects replies and errors -// Must be closed after usage r.Close() -type Results struct { - ctx context.Context - cancel func() - waiterId uint64 - ch chan Reply - pool *pool -} - -// Iterate iterates over replies -// if callback will return a non-nil error then iteration stops -func (r *Results) Iterate(callback func(r Reply) (err error)) (err error) { - if r.ctx == nil || r.ch == nil { - return fmt.Errorf("results not initialized") - } - for { - select { - case <-r.ctx.Done(): - return r.ctx.Err() - case m, ok := <-r.ch: - if ok { - if err = callback(m); err != nil { - return err - } - } else { - return - } - } - } -} - -// Close cancels iteration and unregister reply handler in the pool -// Required to call to avoid memory leaks -func (r *Results) Close() (err error) { - r.cancel() - return r.pool.waiters.Remove(r.waiterId) -} - -// Reply presents the result of request executing can be error or result message -type Reply struct { - PeerInfo peer.Info - Error error - Message *Message -} diff --git a/service/net/rpc/encoding.go b/service/net/rpc/encoding.go deleted file mode 100644 index eb983b9d..00000000 --- a/service/net/rpc/encoding.go +++ /dev/null @@ -1,18 +0,0 @@ -package rpc - -import ( - "github.com/gogo/protobuf/proto" - "storj.io/drpc" -) - -var Encoding = enc{} - -type enc struct{} - -func (e enc) Marshal(msg drpc.Message) ([]byte, error) { - return msg.(proto.Marshaler).Marshal() -} - -func (e enc) Unmarshal(buf []byte, msg drpc.Message) error { - return msg.(proto.Unmarshaler).Unmarshal(buf) -} diff --git a/service/net/rpc/server/drpcserver.go b/service/net/rpc/server/drpcserver.go index dcdf2156..1af9af7b 100644 --- a/service/net/rpc/server/drpcserver.go +++ b/service/net/rpc/server/drpcserver.go @@ -6,11 +6,11 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" "go.uber.org/zap" "net" "storj.io/drpc" + "storj.io/drpc/drpcmux" "storj.io/drpc/drpcserver" "strings" "time" @@ -21,11 +21,12 @@ const CName = "net/drpcserver" var log = logger.NewNamed(CName) func New() DRPCServer { - return &drpcServer{} + return &drpcServer{Mux: drpcmux.New()} } type DRPCServer interface { app.ComponentRunnable + drpc.Mux } type drpcServer struct { @@ -35,6 +36,7 @@ type drpcServer struct { listeners []secure.ContextListener pool pool.Pool cancel func() + *drpcmux.Mux } func (s *drpcServer) Init(ctx context.Context, a *app.App) (err error) { @@ -49,7 +51,7 @@ func (s *drpcServer) Name() (name string) { } func (s *drpcServer) Run(ctx context.Context) (err error) { - s.drpcServer = drpcserver.New(s) + s.drpcServer = drpcserver.New(s.Mux) ctx, s.cancel = context.WithCancel(ctx) for _, addr := range s.config.ListenAddrs { tcpList, err := net.Listen("tcp", addr) @@ -109,16 +111,6 @@ func (s *drpcServer) serveConn(ctx context.Context, conn net.Conn) { } } -func (s *drpcServer) HandleRPC(stream drpc.Stream, _ string) (err error) { - ctx := stream.Context() - sc, err := secure.CtxSecureConn(ctx) - if err != nil { - return - } - log.With(zap.String("peer", sc.RemotePeer().String())).Debug("stream opened") - return s.pool.AddAndReadPeer(rpc.PeerFromStream(sc, stream, true)) -} - func (s *drpcServer) Close(ctx context.Context) (err error) { if s.cancel != nil { s.cancel() diff --git a/service/net/rpc/stream.go b/service/net/rpc/stream.go deleted file mode 100644 index c05691da..00000000 --- a/service/net/rpc/stream.go +++ /dev/null @@ -1,55 +0,0 @@ -package rpc - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "github.com/libp2p/go-libp2p-core/sec" - "storj.io/drpc" - "sync/atomic" - "time" -) - -func PeerFromStream(sc sec.SecureConn, stream drpc.Stream, incoming bool) peer.Peer { - dp := &drpcPeer{ - sc: sc, - Stream: stream, - } - dp.info.Id = sc.RemotePeer().String() - if incoming { - dp.info.Dir = peer.DirInbound - } else { - dp.info.Dir = peer.DirOutbound - } - return dp -} - -type drpcPeer struct { - sc sec.SecureConn - info peer.Info - drpc.Stream -} - -func (d *drpcPeer) Id() string { - return d.info.Id -} - -func (d *drpcPeer) Info() peer.Info { - return d.info -} - -func (d *drpcPeer) Recv() (msg *syncproto.Message, err error) { - msg = &syncproto.Message{} - if err = d.Stream.MsgRecv(msg, Encoding); err != nil { - return - } - atomic.StoreInt64(&d.info.LastActiveUnix, time.Now().Unix()) - return -} - -func (d *drpcPeer) Send(msg *syncproto.Message) (err error) { - if err = d.Stream.MsgSend(msg, Encoding); err != nil { - return - } - atomic.StoreInt64(&d.info.LastActiveUnix, time.Now().Unix()) - return -} diff --git a/service/space/service.go b/service/space/service.go index 5e61366d..183b5425 100644 --- a/service/space/service.go +++ b/service/space/service.go @@ -9,10 +9,9 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/configuration" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool/handler" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "github.com/gogo/protobuf/proto" + "storj.io/drpc/drpcerr" "time" ) @@ -25,7 +24,7 @@ func New() Service { } type Service interface { - handler.ReplyHandler + spacesync.DRPCSpaceServer app.ComponentRunnable } @@ -42,7 +41,7 @@ func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.confService = a.MustComponent(configuration.CName).(configuration.Service) ttlSec := time.Second * time.Duration(s.conf.GCTTL) s.cache = ocache.New(s.loadSpace, ocache.WithTTL(ttlSec), ocache.WithGCPeriod(time.Minute)) - s.pool.AddHandler(syncproto.MessageType_MessageTypeSpace, handler.Reply{ReplyHandler: s}.Handle) + spacesync.DRPCRegisterSpace(a.MustComponent(server.CName).(server.DRPCServer), s) return nil } @@ -72,19 +71,8 @@ func (s *service) get(ctx context.Context, id string) (Space, error) { return obj.(Space), nil } -func (s *service) Handle(ctx context.Context, data []byte) (resp proto.Marshaler, err error) { - var spaceReq = &spacesync.Space{} - if err = spaceReq.Unmarshal(data); err != nil { - return - } - if spaceReq.SpaceId != "" { - sp, e := s.get(ctx, spaceReq.SpaceId) - if e != nil { - return nil, e - } - return sp.Handle(ctx, spaceReq) - } - return nil, fmt.Errorf("unexpected space message") +func (s *service) HeadSync(ctx context.Context, request *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) { + return nil, drpcerr.WithCode(fmt.Errorf("check"), 42) } func (s *service) Close(ctx context.Context) (err error) { diff --git a/service/space/space.go b/service/space/space.go index 59f04932..169fd408 100644 --- a/service/space/space.go +++ b/service/space/space.go @@ -6,7 +6,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/configuration" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/remotediff" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" "go.uber.org/zap" "math/rand" "sync" @@ -15,7 +14,6 @@ import ( type Space interface { Id() string - Handle(ctx context.Context, msg *spacesync.Space) (repl *spacesync.Space, err error) Close() error } @@ -66,22 +64,6 @@ func (s *space) testFill() { s.diff.Set(els...) } -func (s *space) Handle(ctx context.Context, msg *spacesync.Space) (repl *spacesync.Space, err error) { - if diffRange := msg.GetMessage().GetDiffRange(); diffRange != nil { - resp, er := remotediff.HandlerRangeRequest(ctx, s.diff, diffRange) - if er != nil { - return nil, er - } - return &spacesync.Space{SpaceId: s.id, Message: &spacesync.Space_Content{ - Value: &spacesync.Space_Content_DiffRange{ - DiffRange: resp, - }, - }}, nil - } - - return nil, fmt.Errorf("unexpected request") -} - func (s *space) syncLoop() { defer close(s.syncLoopDone) doSync := func() { diff --git a/service/space/spacesync/protos/spacesync.proto b/service/space/spacesync/protos/spacesync.proto index b0b9cf0e..f0b68b11 100644 --- a/service/space/spacesync/protos/spacesync.proto +++ b/service/space/spacesync/protos/spacesync.proto @@ -1,41 +1,44 @@ syntax = "proto3"; -package anytype; +package anySpace; option go_package = "service/space/spacesync"; -message Space { - string spaceId = 1; - - Content message = 2; - - message Content { - oneof value { - DiffRange diffRange = 1; - } - } +enum ErrCodes { + Unexpected = 0; } -message DiffRange { - Request request = 1; - Response response = 2; +service Space { + // HeadSync compares all objects and their hashes in a space + rpc HeadSync(HeadSyncRequest) returns (HeadSyncResponse); +} - message Request { - repeated Range ranges = 1; - message Range { - uint64 from = 1; - uint64 to = 2; - uint32 limit = 3; - } - } - message Response { - repeated Result results = 1; - message Result { - bytes hash = 1; - repeated Element elements = 2; - uint32 count = 3; - message Element { - string id = 1; - string head = 2; - } - } - } -} \ No newline at end of file + +// HeadSyncRange presenting a request for one range +message HeadSyncRange { + uint64 from = 1; + uint64 to = 2; + uint32 limit = 3; +} + +// HeadSyncResult presenting a response for one range +message HeadSyncResult { + bytes hash = 1; + repeated HeadSyncResultElement elements = 2; + uint32 count = 3; +} + +// HeadSyncResultElement presenting state of one object +message HeadSyncResultElement { + string id = 1; + string head = 2; +} + +// HeadSyncRequest is a request for HeadSync +message HeadSyncRequest { + string spaceId = 1; + repeated HeadSyncRange ranges = 2; +} + +// HeadSyncResponse is a response for HeadSync +message HeadSyncResponse { + repeated HeadSyncResult results = 1; +} diff --git a/service/space/spacesync/spacesync.pb.go b/service/space/spacesync/spacesync.pb.go index af6fd478..92772dc4 100644 --- a/service/space/spacesync/spacesync.pb.go +++ b/service/space/spacesync/spacesync.pb.go @@ -22,245 +22,47 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -type Space struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - Message *Space_Content `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` +type ErrCodes int32 + +const ( + ErrCodes_Unexpected ErrCodes = 0 +) + +var ErrCodes_name = map[int32]string{ + 0: "Unexpected", } -func (m *Space) Reset() { *m = Space{} } -func (m *Space) String() string { return proto.CompactTextString(m) } -func (*Space) ProtoMessage() {} -func (*Space) Descriptor() ([]byte, []int) { +var ErrCodes_value = map[string]int32{ + "Unexpected": 0, +} + +func (x ErrCodes) String() string { + return proto.EnumName(ErrCodes_name, int32(x)) +} + +func (ErrCodes) EnumDescriptor() ([]byte, []int) { return fileDescriptor_11d78c2fb7c80384, []int{0} } -func (m *Space) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Space) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Space.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 *Space) XXX_Merge(src proto.Message) { - xxx_messageInfo_Space.Merge(m, src) -} -func (m *Space) XXX_Size() int { - return m.Size() -} -func (m *Space) XXX_DiscardUnknown() { - xxx_messageInfo_Space.DiscardUnknown(m) -} -var xxx_messageInfo_Space proto.InternalMessageInfo - -func (m *Space) GetSpaceId() string { - if m != nil { - return m.SpaceId - } - return "" -} - -func (m *Space) GetMessage() *Space_Content { - if m != nil { - return m.Message - } - return nil -} - -type Space_Content struct { - // Types that are valid to be assigned to Value: - // - // *Space_Content_DiffRange - Value isSpace_Content_Value `protobuf_oneof:"value"` -} - -func (m *Space_Content) Reset() { *m = Space_Content{} } -func (m *Space_Content) String() string { return proto.CompactTextString(m) } -func (*Space_Content) ProtoMessage() {} -func (*Space_Content) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{0, 0} -} -func (m *Space_Content) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Space_Content) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Space_Content.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 *Space_Content) XXX_Merge(src proto.Message) { - xxx_messageInfo_Space_Content.Merge(m, src) -} -func (m *Space_Content) XXX_Size() int { - return m.Size() -} -func (m *Space_Content) XXX_DiscardUnknown() { - xxx_messageInfo_Space_Content.DiscardUnknown(m) -} - -var xxx_messageInfo_Space_Content proto.InternalMessageInfo - -type isSpace_Content_Value interface { - isSpace_Content_Value() - MarshalTo([]byte) (int, error) - Size() int -} - -type Space_Content_DiffRange struct { - DiffRange *DiffRange `protobuf:"bytes,1,opt,name=diffRange,proto3,oneof" json:"diffRange,omitempty"` -} - -func (*Space_Content_DiffRange) isSpace_Content_Value() {} - -func (m *Space_Content) GetValue() isSpace_Content_Value { - if m != nil { - return m.Value - } - return nil -} - -func (m *Space_Content) GetDiffRange() *DiffRange { - if x, ok := m.GetValue().(*Space_Content_DiffRange); ok { - return x.DiffRange - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Space_Content) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Space_Content_DiffRange)(nil), - } -} - -type DiffRange struct { - Request *DiffRange_Request `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - Response *DiffRange_Response `protobuf:"bytes,2,opt,name=response,proto3" json:"response,omitempty"` -} - -func (m *DiffRange) Reset() { *m = DiffRange{} } -func (m *DiffRange) String() string { return proto.CompactTextString(m) } -func (*DiffRange) ProtoMessage() {} -func (*DiffRange) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{1} -} -func (m *DiffRange) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DiffRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DiffRange.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 *DiffRange) XXX_Merge(src proto.Message) { - xxx_messageInfo_DiffRange.Merge(m, src) -} -func (m *DiffRange) XXX_Size() int { - return m.Size() -} -func (m *DiffRange) XXX_DiscardUnknown() { - xxx_messageInfo_DiffRange.DiscardUnknown(m) -} - -var xxx_messageInfo_DiffRange proto.InternalMessageInfo - -func (m *DiffRange) GetRequest() *DiffRange_Request { - if m != nil { - return m.Request - } - return nil -} - -func (m *DiffRange) GetResponse() *DiffRange_Response { - if m != nil { - return m.Response - } - return nil -} - -type DiffRange_Request struct { - Ranges []*DiffRange_Request_Range `protobuf:"bytes,1,rep,name=ranges,proto3" json:"ranges,omitempty"` -} - -func (m *DiffRange_Request) Reset() { *m = DiffRange_Request{} } -func (m *DiffRange_Request) String() string { return proto.CompactTextString(m) } -func (*DiffRange_Request) ProtoMessage() {} -func (*DiffRange_Request) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{1, 0} -} -func (m *DiffRange_Request) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DiffRange_Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DiffRange_Request.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 *DiffRange_Request) XXX_Merge(src proto.Message) { - xxx_messageInfo_DiffRange_Request.Merge(m, src) -} -func (m *DiffRange_Request) XXX_Size() int { - return m.Size() -} -func (m *DiffRange_Request) XXX_DiscardUnknown() { - xxx_messageInfo_DiffRange_Request.DiscardUnknown(m) -} - -var xxx_messageInfo_DiffRange_Request proto.InternalMessageInfo - -func (m *DiffRange_Request) GetRanges() []*DiffRange_Request_Range { - if m != nil { - return m.Ranges - } - return nil -} - -type DiffRange_Request_Range struct { +// HeadSyncRange presenting a request for one range +type HeadSyncRange struct { From uint64 `protobuf:"varint,1,opt,name=from,proto3" json:"from,omitempty"` To uint64 `protobuf:"varint,2,opt,name=to,proto3" json:"to,omitempty"` Limit uint32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` } -func (m *DiffRange_Request_Range) Reset() { *m = DiffRange_Request_Range{} } -func (m *DiffRange_Request_Range) String() string { return proto.CompactTextString(m) } -func (*DiffRange_Request_Range) ProtoMessage() {} -func (*DiffRange_Request_Range) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{1, 0, 0} +func (m *HeadSyncRange) Reset() { *m = HeadSyncRange{} } +func (m *HeadSyncRange) String() string { return proto.CompactTextString(m) } +func (*HeadSyncRange) ProtoMessage() {} +func (*HeadSyncRange) Descriptor() ([]byte, []int) { + return fileDescriptor_11d78c2fb7c80384, []int{0} } -func (m *DiffRange_Request_Range) XXX_Unmarshal(b []byte) error { +func (m *HeadSyncRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DiffRange_Request_Range) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *HeadSyncRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DiffRange_Request_Range.Marshal(b, m, deterministic) + return xxx_messageInfo_HeadSyncRange.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -270,55 +72,58 @@ func (m *DiffRange_Request_Range) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *DiffRange_Request_Range) XXX_Merge(src proto.Message) { - xxx_messageInfo_DiffRange_Request_Range.Merge(m, src) +func (m *HeadSyncRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_HeadSyncRange.Merge(m, src) } -func (m *DiffRange_Request_Range) XXX_Size() int { +func (m *HeadSyncRange) XXX_Size() int { return m.Size() } -func (m *DiffRange_Request_Range) XXX_DiscardUnknown() { - xxx_messageInfo_DiffRange_Request_Range.DiscardUnknown(m) +func (m *HeadSyncRange) XXX_DiscardUnknown() { + xxx_messageInfo_HeadSyncRange.DiscardUnknown(m) } -var xxx_messageInfo_DiffRange_Request_Range proto.InternalMessageInfo +var xxx_messageInfo_HeadSyncRange proto.InternalMessageInfo -func (m *DiffRange_Request_Range) GetFrom() uint64 { +func (m *HeadSyncRange) GetFrom() uint64 { if m != nil { return m.From } return 0 } -func (m *DiffRange_Request_Range) GetTo() uint64 { +func (m *HeadSyncRange) GetTo() uint64 { if m != nil { return m.To } return 0 } -func (m *DiffRange_Request_Range) GetLimit() uint32 { +func (m *HeadSyncRange) GetLimit() uint32 { if m != nil { return m.Limit } return 0 } -type DiffRange_Response struct { - Results []*DiffRange_Response_Result `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +// HeadSyncResult presenting a response for one range +type HeadSyncResult struct { + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + Elements []*HeadSyncResultElement `protobuf:"bytes,2,rep,name=elements,proto3" json:"elements,omitempty"` + Count uint32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"` } -func (m *DiffRange_Response) Reset() { *m = DiffRange_Response{} } -func (m *DiffRange_Response) String() string { return proto.CompactTextString(m) } -func (*DiffRange_Response) ProtoMessage() {} -func (*DiffRange_Response) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{1, 1} +func (m *HeadSyncResult) Reset() { *m = HeadSyncResult{} } +func (m *HeadSyncResult) String() string { return proto.CompactTextString(m) } +func (*HeadSyncResult) ProtoMessage() {} +func (*HeadSyncResult) Descriptor() ([]byte, []int) { + return fileDescriptor_11d78c2fb7c80384, []int{1} } -func (m *DiffRange_Response) XXX_Unmarshal(b []byte) error { +func (m *HeadSyncResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DiffRange_Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *HeadSyncResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DiffRange_Response.Marshal(b, m, deterministic) + return xxx_messageInfo_HeadSyncResult.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -328,102 +133,57 @@ func (m *DiffRange_Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *DiffRange_Response) XXX_Merge(src proto.Message) { - xxx_messageInfo_DiffRange_Response.Merge(m, src) +func (m *HeadSyncResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_HeadSyncResult.Merge(m, src) } -func (m *DiffRange_Response) XXX_Size() int { +func (m *HeadSyncResult) XXX_Size() int { return m.Size() } -func (m *DiffRange_Response) XXX_DiscardUnknown() { - xxx_messageInfo_DiffRange_Response.DiscardUnknown(m) +func (m *HeadSyncResult) XXX_DiscardUnknown() { + xxx_messageInfo_HeadSyncResult.DiscardUnknown(m) } -var xxx_messageInfo_DiffRange_Response proto.InternalMessageInfo +var xxx_messageInfo_HeadSyncResult proto.InternalMessageInfo -func (m *DiffRange_Response) GetResults() []*DiffRange_Response_Result { - if m != nil { - return m.Results - } - return nil -} - -type DiffRange_Response_Result struct { - Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` - Elements []*DiffRange_Response_Result_Element `protobuf:"bytes,2,rep,name=elements,proto3" json:"elements,omitempty"` - Count uint32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"` -} - -func (m *DiffRange_Response_Result) Reset() { *m = DiffRange_Response_Result{} } -func (m *DiffRange_Response_Result) String() string { return proto.CompactTextString(m) } -func (*DiffRange_Response_Result) ProtoMessage() {} -func (*DiffRange_Response_Result) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{1, 1, 0} -} -func (m *DiffRange_Response_Result) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DiffRange_Response_Result) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DiffRange_Response_Result.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 *DiffRange_Response_Result) XXX_Merge(src proto.Message) { - xxx_messageInfo_DiffRange_Response_Result.Merge(m, src) -} -func (m *DiffRange_Response_Result) XXX_Size() int { - return m.Size() -} -func (m *DiffRange_Response_Result) XXX_DiscardUnknown() { - xxx_messageInfo_DiffRange_Response_Result.DiscardUnknown(m) -} - -var xxx_messageInfo_DiffRange_Response_Result proto.InternalMessageInfo - -func (m *DiffRange_Response_Result) GetHash() []byte { +func (m *HeadSyncResult) GetHash() []byte { if m != nil { return m.Hash } return nil } -func (m *DiffRange_Response_Result) GetElements() []*DiffRange_Response_Result_Element { +func (m *HeadSyncResult) GetElements() []*HeadSyncResultElement { if m != nil { return m.Elements } return nil } -func (m *DiffRange_Response_Result) GetCount() uint32 { +func (m *HeadSyncResult) GetCount() uint32 { if m != nil { return m.Count } return 0 } -type DiffRange_Response_Result_Element struct { +// HeadSyncResultElement presenting state of one object +type HeadSyncResultElement struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Head string `protobuf:"bytes,2,opt,name=head,proto3" json:"head,omitempty"` } -func (m *DiffRange_Response_Result_Element) Reset() { *m = DiffRange_Response_Result_Element{} } -func (m *DiffRange_Response_Result_Element) String() string { return proto.CompactTextString(m) } -func (*DiffRange_Response_Result_Element) ProtoMessage() {} -func (*DiffRange_Response_Result_Element) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{1, 1, 0, 0} +func (m *HeadSyncResultElement) Reset() { *m = HeadSyncResultElement{} } +func (m *HeadSyncResultElement) String() string { return proto.CompactTextString(m) } +func (*HeadSyncResultElement) ProtoMessage() {} +func (*HeadSyncResultElement) Descriptor() ([]byte, []int) { + return fileDescriptor_11d78c2fb7c80384, []int{2} } -func (m *DiffRange_Response_Result_Element) XXX_Unmarshal(b []byte) error { +func (m *HeadSyncResultElement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DiffRange_Response_Result_Element) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *HeadSyncResultElement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DiffRange_Response_Result_Element.Marshal(b, m, deterministic) + return xxx_messageInfo_HeadSyncResultElement.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -433,41 +193,137 @@ func (m *DiffRange_Response_Result_Element) XXX_Marshal(b []byte, deterministic return b[:n], nil } } -func (m *DiffRange_Response_Result_Element) XXX_Merge(src proto.Message) { - xxx_messageInfo_DiffRange_Response_Result_Element.Merge(m, src) +func (m *HeadSyncResultElement) XXX_Merge(src proto.Message) { + xxx_messageInfo_HeadSyncResultElement.Merge(m, src) } -func (m *DiffRange_Response_Result_Element) XXX_Size() int { +func (m *HeadSyncResultElement) XXX_Size() int { return m.Size() } -func (m *DiffRange_Response_Result_Element) XXX_DiscardUnknown() { - xxx_messageInfo_DiffRange_Response_Result_Element.DiscardUnknown(m) +func (m *HeadSyncResultElement) XXX_DiscardUnknown() { + xxx_messageInfo_HeadSyncResultElement.DiscardUnknown(m) } -var xxx_messageInfo_DiffRange_Response_Result_Element proto.InternalMessageInfo +var xxx_messageInfo_HeadSyncResultElement proto.InternalMessageInfo -func (m *DiffRange_Response_Result_Element) GetId() string { +func (m *HeadSyncResultElement) GetId() string { if m != nil { return m.Id } return "" } -func (m *DiffRange_Response_Result_Element) GetHead() string { +func (m *HeadSyncResultElement) GetHead() string { if m != nil { return m.Head } return "" } +// HeadSyncRequest is a request for HeadSync +type HeadSyncRequest struct { + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Ranges []*HeadSyncRange `protobuf:"bytes,2,rep,name=ranges,proto3" json:"ranges,omitempty"` +} + +func (m *HeadSyncRequest) Reset() { *m = HeadSyncRequest{} } +func (m *HeadSyncRequest) String() string { return proto.CompactTextString(m) } +func (*HeadSyncRequest) ProtoMessage() {} +func (*HeadSyncRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_11d78c2fb7c80384, []int{3} +} +func (m *HeadSyncRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *HeadSyncRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_HeadSyncRequest.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 *HeadSyncRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_HeadSyncRequest.Merge(m, src) +} +func (m *HeadSyncRequest) XXX_Size() int { + return m.Size() +} +func (m *HeadSyncRequest) XXX_DiscardUnknown() { + xxx_messageInfo_HeadSyncRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_HeadSyncRequest proto.InternalMessageInfo + +func (m *HeadSyncRequest) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +func (m *HeadSyncRequest) GetRanges() []*HeadSyncRange { + if m != nil { + return m.Ranges + } + return nil +} + +// HeadSyncResponse is a response for HeadSync +type HeadSyncResponse struct { + Results []*HeadSyncResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +} + +func (m *HeadSyncResponse) Reset() { *m = HeadSyncResponse{} } +func (m *HeadSyncResponse) String() string { return proto.CompactTextString(m) } +func (*HeadSyncResponse) ProtoMessage() {} +func (*HeadSyncResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_11d78c2fb7c80384, []int{4} +} +func (m *HeadSyncResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *HeadSyncResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_HeadSyncResponse.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 *HeadSyncResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_HeadSyncResponse.Merge(m, src) +} +func (m *HeadSyncResponse) XXX_Size() int { + return m.Size() +} +func (m *HeadSyncResponse) XXX_DiscardUnknown() { + xxx_messageInfo_HeadSyncResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_HeadSyncResponse proto.InternalMessageInfo + +func (m *HeadSyncResponse) GetResults() []*HeadSyncResult { + if m != nil { + return m.Results + } + return nil +} + func init() { - proto.RegisterType((*Space)(nil), "anytype.Space") - proto.RegisterType((*Space_Content)(nil), "anytype.Space.Content") - proto.RegisterType((*DiffRange)(nil), "anytype.DiffRange") - proto.RegisterType((*DiffRange_Request)(nil), "anytype.DiffRange.Request") - proto.RegisterType((*DiffRange_Request_Range)(nil), "anytype.DiffRange.Request.Range") - proto.RegisterType((*DiffRange_Response)(nil), "anytype.DiffRange.Response") - proto.RegisterType((*DiffRange_Response_Result)(nil), "anytype.DiffRange.Response.Result") - proto.RegisterType((*DiffRange_Response_Result_Element)(nil), "anytype.DiffRange.Response.Result.Element") + proto.RegisterEnum("anySpace.ErrCodes", ErrCodes_name, ErrCodes_value) + proto.RegisterType((*HeadSyncRange)(nil), "anySpace.HeadSyncRange") + proto.RegisterType((*HeadSyncResult)(nil), "anySpace.HeadSyncResult") + proto.RegisterType((*HeadSyncResultElement)(nil), "anySpace.HeadSyncResultElement") + proto.RegisterType((*HeadSyncRequest)(nil), "anySpace.HeadSyncRequest") + proto.RegisterType((*HeadSyncResponse)(nil), "anySpace.HeadSyncResponse") } func init() { @@ -475,37 +331,34 @@ func init() { } var fileDescriptor_11d78c2fb7c80384 = []byte{ - // 428 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xbf, 0x8e, 0xd4, 0x30, - 0x10, 0xc6, 0xd7, 0xd9, 0x3f, 0xde, 0xcc, 0x02, 0x85, 0x85, 0x20, 0x0a, 0x52, 0x14, 0x6d, 0x15, - 0x21, 0xe1, 0x83, 0x80, 0x04, 0x05, 0x0d, 0x07, 0x9c, 0xa0, 0x35, 0x1d, 0x5d, 0xd8, 0x78, 0xef, - 0x22, 0x25, 0x76, 0x88, 0x9d, 0x93, 0xf6, 0x05, 0xa8, 0xe9, 0x79, 0x02, 0xde, 0x84, 0xf2, 0x4a, - 0x4a, 0xb4, 0xfb, 0x0a, 0x54, 0x54, 0x28, 0x93, 0x38, 0x57, 0xc0, 0x42, 0x13, 0xcd, 0x8c, 0x7f, - 0xdf, 0x97, 0x6f, 0x2c, 0x03, 0x37, 0xb2, 0xb9, 0x2c, 0x36, 0xf2, 0xc4, 0xd4, 0x99, 0xfb, 0x9a, - 0x9d, 0xda, 0x9c, 0xd4, 0x8d, 0xb6, 0xda, 0x5c, 0x0f, 0x38, 0x0e, 0x18, 0xcd, 0xd4, 0xce, 0xee, - 0x6a, 0xb9, 0xfe, 0x42, 0x60, 0xfe, 0xae, 0x3b, 0x64, 0x01, 0x50, 0xa4, 0xde, 0xe6, 0x01, 0x89, - 0x49, 0xe2, 0x0b, 0xd7, 0xb2, 0x87, 0x40, 0x2b, 0x69, 0x4c, 0x76, 0x2e, 0x03, 0x2f, 0x26, 0xc9, - 0x2a, 0xbd, 0xc3, 0x07, 0x39, 0x47, 0x29, 0x7f, 0xa9, 0x95, 0x95, 0xca, 0x0a, 0x87, 0x85, 0x67, - 0x40, 0x87, 0x19, 0x4b, 0xc1, 0xcf, 0x8b, 0xed, 0x56, 0x64, 0xea, 0x5c, 0xa2, 0xf1, 0x2a, 0x65, - 0xa3, 0xfc, 0x95, 0x3b, 0x79, 0x33, 0x11, 0xd7, 0xd8, 0x29, 0x85, 0xf9, 0x65, 0x56, 0xb6, 0x72, - 0xfd, 0x6b, 0x0a, 0xfe, 0xc8, 0xb0, 0x27, 0x40, 0x1b, 0xf9, 0xb1, 0x95, 0xc6, 0x0e, 0x46, 0xe1, - 0x9f, 0x46, 0x5c, 0xf4, 0x84, 0x70, 0x28, 0x7b, 0x0a, 0xcb, 0x46, 0x9a, 0x5a, 0x2b, 0xe3, 0xe2, - 0xdf, 0xfb, 0xab, 0xac, 0x47, 0xc4, 0x08, 0x87, 0x9f, 0x08, 0xd0, 0xc1, 0x8d, 0x3d, 0x83, 0x45, - 0xd3, 0x71, 0x26, 0x20, 0xf1, 0x34, 0x59, 0xa5, 0xf1, 0xf1, 0x3f, 0x73, 0xec, 0xc4, 0xc0, 0x87, - 0x2f, 0x60, 0xde, 0xa7, 0x67, 0x30, 0xdb, 0x36, 0xba, 0xc2, 0xe8, 0x33, 0x81, 0x35, 0xbb, 0x05, - 0x9e, 0xd5, 0x98, 0x6a, 0x26, 0x3c, 0xab, 0xd9, 0x6d, 0x98, 0x97, 0x45, 0x55, 0xd8, 0x60, 0x1a, - 0x93, 0xe4, 0xa6, 0xe8, 0x9b, 0xf0, 0x27, 0x81, 0xa5, 0xcb, 0xc7, 0x9e, 0x77, 0x97, 0x60, 0xda, - 0xd2, 0xba, 0x28, 0xeb, 0x7f, 0x6c, 0xd3, 0x15, 0x6d, 0x89, 0x97, 0x81, 0x92, 0xf0, 0x2b, 0x81, - 0x45, 0x3f, 0xeb, 0xf2, 0x5c, 0x64, 0xe6, 0x02, 0xf3, 0xdc, 0x10, 0x58, 0xb3, 0x33, 0x58, 0xca, - 0x52, 0x56, 0x52, 0x59, 0x13, 0x78, 0xe8, 0x7e, 0xff, 0xff, 0xee, 0xfc, 0x75, 0x2f, 0x11, 0xa3, - 0xb6, 0xdb, 0x63, 0xa3, 0x5b, 0x35, 0xee, 0x81, 0x4d, 0xf8, 0x00, 0xe8, 0x80, 0x76, 0x8b, 0x17, - 0xee, 0x9d, 0x79, 0x45, 0x8e, 0x61, 0x64, 0x96, 0xe3, 0x55, 0xf8, 0x02, 0xeb, 0xd3, 0x47, 0xdf, - 0xf6, 0x11, 0xb9, 0xda, 0x47, 0xe4, 0xc7, 0x3e, 0x22, 0x9f, 0x0f, 0xd1, 0xe4, 0xea, 0x10, 0x4d, - 0xbe, 0x1f, 0xa2, 0xc9, 0xfb, 0xbb, 0x47, 0x5e, 0xfb, 0x87, 0x05, 0xbe, 0xee, 0xc7, 0xbf, 0x03, - 0x00, 0x00, 0xff, 0xff, 0x12, 0x5a, 0x4f, 0xd6, 0x0f, 0x03, 0x00, 0x00, + // 369 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xbf, 0x6e, 0xe2, 0x40, + 0x10, 0xc6, 0x6d, 0xf3, 0xcf, 0xcc, 0x1d, 0x1c, 0x5a, 0xdd, 0x09, 0x1f, 0x85, 0x0f, 0xb9, 0x42, + 0x57, 0x18, 0x85, 0x94, 0x54, 0x49, 0x44, 0x14, 0x52, 0x2e, 0x4a, 0x13, 0xa5, 0x71, 0xec, 0x49, + 0xb0, 0x04, 0xbb, 0x8e, 0x77, 0x49, 0xc2, 0x5b, 0xe4, 0xb1, 0x52, 0x52, 0xa6, 0x8c, 0xe0, 0x45, + 0x22, 0x0f, 0x31, 0x24, 0x92, 0x69, 0xac, 0x99, 0xf1, 0x7c, 0xdf, 0xfc, 0x76, 0x34, 0xe0, 0x2b, + 0x4c, 0x1f, 0xe3, 0x10, 0xfb, 0x2a, 0x09, 0xf2, 0xaf, 0x5a, 0x8a, 0xb0, 0x9f, 0xa4, 0x52, 0x4b, + 0xb5, 0x2f, 0xf8, 0x54, 0x60, 0x76, 0x20, 0x96, 0x93, 0xac, 0xe6, 0x8d, 0xa1, 0x71, 0x81, 0x41, + 0x34, 0x59, 0x8a, 0x90, 0x07, 0xe2, 0x1e, 0x19, 0x83, 0xf2, 0x5d, 0x2a, 0xe7, 0x8e, 0xd9, 0x35, + 0x7b, 0x65, 0x4e, 0x31, 0x6b, 0x82, 0xa5, 0xa5, 0x63, 0x51, 0xc5, 0xd2, 0x92, 0xfd, 0x86, 0xca, + 0x2c, 0x9e, 0xc7, 0xda, 0x29, 0x75, 0xcd, 0x5e, 0x83, 0x6f, 0x13, 0xef, 0x09, 0x9a, 0x3b, 0x2b, + 0x54, 0x8b, 0x99, 0xce, 0xbc, 0xa6, 0x81, 0x9a, 0x92, 0xd7, 0x4f, 0x4e, 0x31, 0x1b, 0x82, 0x8d, + 0x33, 0x9c, 0xa3, 0xd0, 0xca, 0xb1, 0xba, 0xa5, 0xde, 0x8f, 0xc1, 0x3f, 0x3f, 0xa7, 0xf1, 0xbf, + 0xeb, 0x47, 0xdb, 0x3e, 0xbe, 0x13, 0x64, 0x83, 0x43, 0xb9, 0x10, 0xbb, 0xc1, 0x94, 0x78, 0x43, + 0xf8, 0x53, 0x28, 0xcc, 0xb8, 0xe3, 0x88, 0xa6, 0xd7, 0xb9, 0x15, 0x47, 0xc4, 0x83, 0x41, 0x44, + 0x2f, 0xa9, 0x73, 0x8a, 0xbd, 0x1b, 0xf8, 0xb5, 0x17, 0x3f, 0x2c, 0x50, 0x69, 0xe6, 0x40, 0x8d, + 0x16, 0x36, 0xce, 0xb5, 0x79, 0xca, 0xfa, 0x50, 0x4d, 0xb3, 0x2d, 0xe5, 0xe8, 0xed, 0x02, 0xf4, + 0xec, 0x3f, 0xff, 0x6c, 0xf3, 0xce, 0xa1, 0xf5, 0x05, 0x2d, 0x91, 0x42, 0x21, 0x1b, 0x40, 0x2d, + 0x25, 0x4c, 0xe5, 0x98, 0xe4, 0xe2, 0x1c, 0x5a, 0x00, 0xcf, 0x1b, 0xff, 0x77, 0xc0, 0x1e, 0xa5, + 0xe9, 0x99, 0x8c, 0x50, 0xb1, 0x26, 0xc0, 0x95, 0xc0, 0xe7, 0x04, 0x43, 0x8d, 0x51, 0xcb, 0x18, + 0x5c, 0x42, 0x85, 0xc4, 0xec, 0x04, 0xec, 0x5c, 0xcf, 0xfe, 0x16, 0x79, 0xd2, 0xf3, 0x3a, 0x9d, + 0xc2, 0x71, 0xc4, 0x76, 0x7a, 0xf4, 0xba, 0x76, 0xcd, 0xd5, 0xda, 0x35, 0xdf, 0xd7, 0xae, 0xf9, + 0xb2, 0x71, 0x8d, 0xd5, 0xc6, 0x35, 0xde, 0x36, 0xae, 0x71, 0xdd, 0x3e, 0x70, 0x62, 0xb7, 0x55, + 0x3a, 0xa9, 0xe3, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x09, 0x7e, 0xc8, 0x77, 0x84, 0x02, 0x00, + 0x00, } -func (m *Space) Marshal() (dAtA []byte, err error) { +func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -515,191 +368,12 @@ func (m *Space) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Space) MarshalTo(dAtA []byte) (int, error) { +func (m *HeadSyncRange) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Space) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Message != nil { - { - size, err := m.Message.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.SpaceId) > 0 { - i -= len(m.SpaceId) - copy(dAtA[i:], m.SpaceId) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SpaceId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Space_Content) 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 *Space_Content) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Space_Content) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Value != nil { - { - size := m.Value.Size() - i -= size - if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *Space_Content_DiffRange) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Space_Content_DiffRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.DiffRange != nil { - { - size, err := m.DiffRange.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} -func (m *DiffRange) 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 *DiffRange) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DiffRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Response != nil { - { - size, err := m.Response.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.Request != nil { - { - size, err := m.Request.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *DiffRange_Request) 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 *DiffRange_Request) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DiffRange_Request) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Ranges) > 0 { - for iNdEx := len(m.Ranges) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Ranges[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *DiffRange_Request_Range) 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 *DiffRange_Request_Range) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DiffRange_Request_Range) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *HeadSyncRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -722,7 +396,7 @@ func (m *DiffRange_Request_Range) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *DiffRange_Response) Marshal() (dAtA []byte, err error) { +func (m *HeadSyncResult) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -732,49 +406,12 @@ func (m *DiffRange_Response) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DiffRange_Response) MarshalTo(dAtA []byte) (int, error) { +func (m *HeadSyncResult) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DiffRange_Response) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Results) > 0 { - for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Results[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *DiffRange_Response_Result) 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 *DiffRange_Response_Result) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DiffRange_Response_Result) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *HeadSyncResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -808,7 +445,7 @@ func (m *DiffRange_Response_Result) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *DiffRange_Response_Result_Element) Marshal() (dAtA []byte, err error) { +func (m *HeadSyncResultElement) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -818,12 +455,12 @@ func (m *DiffRange_Response_Result_Element) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DiffRange_Response_Result_Element) MarshalTo(dAtA []byte) (int, error) { +func (m *HeadSyncResultElement) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DiffRange_Response_Result_Element) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *HeadSyncResultElement) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -845,6 +482,87 @@ func (m *DiffRange_Response_Result_Element) MarshalToSizedBuffer(dAtA []byte) (i return len(dAtA) - i, nil } +func (m *HeadSyncRequest) 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 *HeadSyncRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *HeadSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Ranges) > 0 { + for iNdEx := len(m.Ranges) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Ranges[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *HeadSyncResponse) 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 *HeadSyncResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *HeadSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Results) > 0 { + for iNdEx := len(m.Results) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Results[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintSpacesync(dAtA []byte, offset int, v uint64) int { offset -= sovSpacesync(v) base := offset @@ -856,80 +574,7 @@ func encodeVarintSpacesync(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *Space) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.SpaceId) - if l > 0 { - n += 1 + l + sovSpacesync(uint64(l)) - } - if m.Message != nil { - l = m.Message.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - return n -} - -func (m *Space_Content) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != nil { - n += m.Value.Size() - } - return n -} - -func (m *Space_Content_DiffRange) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.DiffRange != nil { - l = m.DiffRange.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - return n -} -func (m *DiffRange) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Request != nil { - l = m.Request.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - if m.Response != nil { - l = m.Response.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - return n -} - -func (m *DiffRange_Request) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Ranges) > 0 { - for _, e := range m.Ranges { - l = e.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - } - return n -} - -func (m *DiffRange_Request_Range) Size() (n int) { +func (m *HeadSyncRange) Size() (n int) { if m == nil { return 0 } @@ -947,22 +592,7 @@ func (m *DiffRange_Request_Range) Size() (n int) { return n } -func (m *DiffRange_Response) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Results) > 0 { - for _, e := range m.Results { - l = e.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - } - return n -} - -func (m *DiffRange_Response_Result) Size() (n int) { +func (m *HeadSyncResult) Size() (n int) { if m == nil { return 0 } @@ -984,7 +614,7 @@ func (m *DiffRange_Response_Result) Size() (n int) { return n } -func (m *DiffRange_Response_Result_Element) Size() (n int) { +func (m *HeadSyncResultElement) Size() (n int) { if m == nil { return 0 } @@ -1001,13 +631,47 @@ func (m *DiffRange_Response_Result_Element) Size() (n int) { return n } +func (m *HeadSyncRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + if len(m.Ranges) > 0 { + for _, e := range m.Ranges { + l = e.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + } + return n +} + +func (m *HeadSyncResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Results) > 0 { + for _, e := range m.Results { + l = e.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + } + return n +} + func sovSpacesync(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } func sozSpacesync(x uint64) (n int) { return sovSpacesync(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *Space) Unmarshal(dAtA []byte) error { +func (m *HeadSyncRange) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1030,419 +694,10 @@ func (m *Space) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Space: wiretype end group for non-group") + return fmt.Errorf("proto: HeadSyncRange: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Space: 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 ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - 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 Message", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Message == nil { - m.Message = &Space_Content{} - } - if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSpacesync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSpacesync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Space_Content) 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 ErrIntOverflowSpacesync - } - 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: Content: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Content: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DiffRange", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &DiffRange{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &Space_Content_DiffRange{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSpacesync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSpacesync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DiffRange) 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 ErrIntOverflowSpacesync - } - 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: DiffRange: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DiffRange: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Request == nil { - m.Request = &DiffRange_Request{} - } - if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Response", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Response == nil { - m.Response = &DiffRange_Response{} - } - if err := m.Response.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSpacesync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSpacesync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DiffRange_Request) 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 ErrIntOverflowSpacesync - } - 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: Request: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Ranges", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Ranges = append(m.Ranges, &DiffRange_Request_Range{}) - if err := m.Ranges[len(m.Ranges)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSpacesync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSpacesync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DiffRange_Request_Range) 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 ErrIntOverflowSpacesync - } - 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: Range: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Range: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: HeadSyncRange: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -1523,7 +778,7 @@ func (m *DiffRange_Request_Range) Unmarshal(dAtA []byte) error { } return nil } -func (m *DiffRange_Response) Unmarshal(dAtA []byte) error { +func (m *HeadSyncResult) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1546,94 +801,10 @@ func (m *DiffRange_Response) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Response: wiretype end group for non-group") + return fmt.Errorf("proto: HeadSyncResult: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Results = append(m.Results, &DiffRange_Response_Result{}) - if err := m.Results[len(m.Results)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSpacesync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSpacesync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DiffRange_Response_Result) 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 ErrIntOverflowSpacesync - } - 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: Result: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Result: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: HeadSyncResult: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -1699,7 +870,7 @@ func (m *DiffRange_Response_Result) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Elements = append(m.Elements, &DiffRange_Response_Result_Element{}) + m.Elements = append(m.Elements, &HeadSyncResultElement{}) if err := m.Elements[len(m.Elements)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -1744,7 +915,7 @@ func (m *DiffRange_Response_Result) Unmarshal(dAtA []byte) error { } return nil } -func (m *DiffRange_Response_Result_Element) Unmarshal(dAtA []byte) error { +func (m *HeadSyncResultElement) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1767,10 +938,10 @@ func (m *DiffRange_Response_Result_Element) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Element: wiretype end group for non-group") + return fmt.Errorf("proto: HeadSyncResultElement: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Element: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: HeadSyncResultElement: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -1858,6 +1029,206 @@ func (m *DiffRange_Response_Result_Element) Unmarshal(dAtA []byte) error { } return nil } +func (m *HeadSyncRequest) 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 ErrIntOverflowSpacesync + } + 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: HeadSyncRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HeadSyncRequest: 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 ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + 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 Ranges", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ranges = append(m.Ranges, &HeadSyncRange{}) + if err := m.Ranges[len(m.Ranges)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HeadSyncResponse) 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 ErrIntOverflowSpacesync + } + 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: HeadSyncResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HeadSyncResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Results = append(m.Results, &HeadSyncResult{}) + if err := m.Results[len(m.Results)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipSpacesync(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/service/space/spacesync/spacesync_drpc.pb.go b/service/space/spacesync/spacesync_drpc.pb.go new file mode 100644 index 00000000..a083c7e3 --- /dev/null +++ b/service/space/spacesync/spacesync_drpc.pb.go @@ -0,0 +1,113 @@ +// Code generated by protoc-gen-go-drpc. DO NOT EDIT. +// protoc-gen-go-drpc version: v0.0.32 +// source: service/space/spacesync/protos/spacesync.proto + +package spacesync + +import ( + bytes "bytes" + context "context" + errors "errors" + jsonpb "github.com/gogo/protobuf/jsonpb" + proto "github.com/gogo/protobuf/proto" + drpc "storj.io/drpc" + drpcerr "storj.io/drpc/drpcerr" +) + +type drpcEncoding_File_service_space_spacesync_protos_spacesync_proto struct{} + +func (drpcEncoding_File_service_space_spacesync_protos_spacesync_proto) Marshal(msg drpc.Message) ([]byte, error) { + return proto.Marshal(msg.(proto.Message)) +} + +func (drpcEncoding_File_service_space_spacesync_protos_spacesync_proto) Unmarshal(buf []byte, msg drpc.Message) error { + return proto.Unmarshal(buf, msg.(proto.Message)) +} + +func (drpcEncoding_File_service_space_spacesync_protos_spacesync_proto) JSONMarshal(msg drpc.Message) ([]byte, error) { + var buf bytes.Buffer + err := new(jsonpb.Marshaler).Marshal(&buf, msg.(proto.Message)) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func (drpcEncoding_File_service_space_spacesync_protos_spacesync_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error { + return jsonpb.Unmarshal(bytes.NewReader(buf), msg.(proto.Message)) +} + +type DRPCSpaceClient interface { + DRPCConn() drpc.Conn + + HeadSync(ctx context.Context, in *HeadSyncRequest) (*HeadSyncResponse, error) +} + +type drpcSpaceClient struct { + cc drpc.Conn +} + +func NewDRPCSpaceClient(cc drpc.Conn) DRPCSpaceClient { + return &drpcSpaceClient{cc} +} + +func (c *drpcSpaceClient) DRPCConn() drpc.Conn { return c.cc } + +func (c *drpcSpaceClient) HeadSync(ctx context.Context, in *HeadSyncRequest) (*HeadSyncResponse, error) { + out := new(HeadSyncResponse) + err := c.cc.Invoke(ctx, "/anySpace.Space/HeadSync", drpcEncoding_File_service_space_spacesync_protos_spacesync_proto{}, in, out) + if err != nil { + return nil, err + } + return out, nil +} + +type DRPCSpaceServer interface { + HeadSync(context.Context, *HeadSyncRequest) (*HeadSyncResponse, error) +} + +type DRPCSpaceUnimplementedServer struct{} + +func (s *DRPCSpaceUnimplementedServer) HeadSync(context.Context, *HeadSyncRequest) (*HeadSyncResponse, error) { + return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) +} + +type DRPCSpaceDescription struct{} + +func (DRPCSpaceDescription) NumMethods() int { return 1 } + +func (DRPCSpaceDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { + switch n { + case 0: + return "/anySpace.Space/HeadSync", drpcEncoding_File_service_space_spacesync_protos_spacesync_proto{}, + func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { + return srv.(DRPCSpaceServer). + HeadSync( + ctx, + in1.(*HeadSyncRequest), + ) + }, DRPCSpaceServer.HeadSync, true + default: + return "", nil, nil, nil, false + } +} + +func DRPCRegisterSpace(mux drpc.Mux, impl DRPCSpaceServer) error { + return mux.Register(impl, DRPCSpaceDescription{}) +} + +type DRPCSpace_HeadSyncStream interface { + drpc.Stream + SendAndClose(*HeadSyncResponse) error +} + +type drpcSpace_HeadSyncStream struct { + drpc.Stream +} + +func (x *drpcSpace_HeadSyncStream) SendAndClose(m *HeadSyncResponse) error { + if err := x.MsgSend(m, drpcEncoding_File_service_space_spacesync_protos_spacesync_proto{}); err != nil { + return err + } + return x.CloseSend() +} diff --git a/syncproto/sync.pb.go b/syncproto/sync.pb.go index e8df4661..8fe415ab 100644 --- a/syncproto/sync.pb.go +++ b/syncproto/sync.pb.go @@ -503,10 +503,10 @@ func (m *Sync) GetMessage() *Sync_ContentValue { type Sync_ContentValue struct { // Types that are valid to be assigned to Value: - // *Sync_Content_Value_HeadUpdate - // *Sync_Content_Value_FullSyncRequest - // *Sync_Content_Value_FullSyncResponse - Value isSync_Content_Value_Value `protobuf_oneof:"value"` + // *Sync_ContentValue_HeadUpdate + // *Sync_ContentValue_FullSyncRequest + // *Sync_ContentValue_FullSyncResponse + Value isSync_ContentValue_Value `protobuf_oneof:"value"` } func (m *Sync_ContentValue) Reset() { *m = Sync_ContentValue{} } @@ -542,27 +542,27 @@ func (m *Sync_ContentValue) XXX_DiscardUnknown() { var xxx_messageInfo_Sync_ContentValue proto.InternalMessageInfo -type isSync_Content_Value_Value interface { - isSync_Content_Value_Value() +type isSync_ContentValue_Value interface { + isSync_ContentValue_Value() MarshalTo([]byte) (int, error) Size() int } -type Sync_Content_Value_HeadUpdate struct { +type Sync_ContentValue_HeadUpdate struct { HeadUpdate *Sync_HeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` } -type Sync_Content_Value_FullSyncRequest struct { +type Sync_ContentValue_FullSyncRequest struct { FullSyncRequest *Sync_Full_Request `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` } -type Sync_Content_Value_FullSyncResponse struct { +type Sync_ContentValue_FullSyncResponse struct { FullSyncResponse *Sync_Full_Response `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` } -func (*Sync_Content_Value_HeadUpdate) isSync_Content_Value_Value() {} -func (*Sync_Content_Value_FullSyncRequest) isSync_Content_Value_Value() {} -func (*Sync_Content_Value_FullSyncResponse) isSync_Content_Value_Value() {} +func (*Sync_ContentValue_HeadUpdate) isSync_ContentValue_Value() {} +func (*Sync_ContentValue_FullSyncRequest) isSync_ContentValue_Value() {} +func (*Sync_ContentValue_FullSyncResponse) isSync_ContentValue_Value() {} -func (m *Sync_ContentValue) GetValue() isSync_Content_Value_Value { +func (m *Sync_ContentValue) GetValue() isSync_ContentValue_Value { if m != nil { return m.Value } @@ -570,21 +570,21 @@ func (m *Sync_ContentValue) GetValue() isSync_Content_Value_Value { } func (m *Sync_ContentValue) GetHeadUpdate() *Sync_HeadUpdate { - if x, ok := m.GetValue().(*Sync_Content_Value_HeadUpdate); ok { + if x, ok := m.GetValue().(*Sync_ContentValue_HeadUpdate); ok { return x.HeadUpdate } return nil } func (m *Sync_ContentValue) GetFullSyncRequest() *Sync_Full_Request { - if x, ok := m.GetValue().(*Sync_Content_Value_FullSyncRequest); ok { + if x, ok := m.GetValue().(*Sync_ContentValue_FullSyncRequest); ok { return x.FullSyncRequest } return nil } func (m *Sync_ContentValue) GetFullSyncResponse() *Sync_Full_Response { - if x, ok := m.GetValue().(*Sync_Content_Value_FullSyncResponse); ok { + if x, ok := m.GetValue().(*Sync_ContentValue_FullSyncResponse); ok { return x.FullSyncResponse } return nil @@ -593,9 +593,9 @@ func (m *Sync_ContentValue) GetFullSyncResponse() *Sync_Full_Response { // XXX_OneofWrappers is for the internal use of the proto package. func (*Sync_ContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*Sync_Content_Value_HeadUpdate)(nil), - (*Sync_Content_Value_FullSyncRequest)(nil), - (*Sync_Content_Value_FullSyncResponse)(nil), + (*Sync_ContentValue_HeadUpdate)(nil), + (*Sync_ContentValue_FullSyncRequest)(nil), + (*Sync_ContentValue_FullSyncResponse)(nil), } } @@ -1293,12 +1293,12 @@ func (m *Sync_ContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Sync_Content_Value_HeadUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *Sync_ContentValue_HeadUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Sync_Content_Value_HeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Sync_ContentValue_HeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.HeadUpdate != nil { { @@ -1314,12 +1314,12 @@ func (m *Sync_Content_Value_HeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, } return len(dAtA) - i, nil } -func (m *Sync_Content_Value_FullSyncRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Sync_ContentValue_FullSyncRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Sync_Content_Value_FullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Sync_ContentValue_FullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.FullSyncRequest != nil { { @@ -1335,12 +1335,12 @@ func (m *Sync_Content_Value_FullSyncRequest) MarshalToSizedBuffer(dAtA []byte) ( } return len(dAtA) - i, nil } -func (m *Sync_Content_Value_FullSyncResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *Sync_ContentValue_FullSyncResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Sync_Content_Value_FullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Sync_ContentValue_FullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.FullSyncResponse != nil { { @@ -1759,7 +1759,7 @@ func (m *Sync_ContentValue) Size() (n int) { return n } -func (m *Sync_Content_Value_HeadUpdate) Size() (n int) { +func (m *Sync_ContentValue_HeadUpdate) Size() (n int) { if m == nil { return 0 } @@ -1771,7 +1771,7 @@ func (m *Sync_Content_Value_HeadUpdate) Size() (n int) { } return n } -func (m *Sync_Content_Value_FullSyncRequest) Size() (n int) { +func (m *Sync_ContentValue_FullSyncRequest) Size() (n int) { if m == nil { return 0 } @@ -1783,7 +1783,7 @@ func (m *Sync_Content_Value_FullSyncRequest) Size() (n int) { } return n } -func (m *Sync_Content_Value_FullSyncResponse) Size() (n int) { +func (m *Sync_ContentValue_FullSyncResponse) Size() (n int) { if m == nil { return 0 } @@ -2884,7 +2884,7 @@ func (m *Sync_ContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Sync_Content_Value_HeadUpdate{v} + m.Value = &Sync_ContentValue_HeadUpdate{v} iNdEx = postIndex case 2: if wireType != 2 { @@ -2919,7 +2919,7 @@ func (m *Sync_ContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Sync_Content_Value_FullSyncRequest{v} + m.Value = &Sync_ContentValue_FullSyncRequest{v} iNdEx = postIndex case 3: if wireType != 2 { @@ -2954,7 +2954,7 @@ func (m *Sync_ContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &Sync_Content_Value_FullSyncResponse{v} + m.Value = &Sync_ContentValue_FullSyncResponse{v} iNdEx = postIndex default: iNdEx = preIndex From 20f462e603ac2cefcadef762aab559868a7dcda4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 7 Sep 2022 23:23:59 +0200 Subject: [PATCH 050/219] Add load from database tests and fixes --- pkg/acl/tree/objecttree_test.go | 65 +++++++++++++++++++++++---------- pkg/acl/tree/rawloader.go | 61 ++++++++++++++++--------------- pkg/acl/tree/util.go | 2 + 3 files changed, 80 insertions(+), 48 deletions(-) diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index 463dca31..a27c9cc1 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -346,7 +346,7 @@ func TestObjectTree(t *testing.T) { }) }) - t.Run("changes after common snapshot simple", func(t *testing.T) { + t.Run("changes after common snapshot db complex", func(t *testing.T) { ctx := prepareTreeContext(t, aclList) changeCreator := ctx.changeCreator objTree := ctx.objTree @@ -355,29 +355,18 @@ func TestObjectTree(t *testing.T) { changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), + changeCreator.createRaw("4", aclList.Head().Id, "0", false, "2"), + changeCreator.createRaw("5", aclList.Head().Id, "0", false, "1"), + // main difference from tree example + changeCreator.createRaw("6", aclList.Head().Id, "0", true, "3", "4", "5"), } _, err := objTree.AddRawChanges(context.Background(), rawChanges...) require.NoError(t, err, "adding changes should be without error") - require.Equal(t, "3", objTree.Root().Id) + require.Equal(t, "6", objTree.Root().Id) - t.Run("changes from db", func(t *testing.T) { - changes, err := objTree.ChangesAfterCommonSnapshot([]string{"0"}, []string{}) - require.NoError(t, err, "changes after common snapshot should be without error") - - changeIds := make(map[string]struct{}) - for _, ch := range changes { - changeIds[ch.Id] = struct{}{} - } - - for _, raw := range rawChanges { - _, ok := changeIds[raw.Id] - assert.Equal(t, true, ok) - } - }) - - t.Run("changes from db with empty path", func(t *testing.T) { - changes, err := objTree.ChangesAfterCommonSnapshot([]string{}, []string{}) + t.Run("all changes from db", func(t *testing.T) { + changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{}) require.NoError(t, err, "changes after common snapshot should be without error") changeIds := make(map[string]struct{}) @@ -392,6 +381,44 @@ func TestObjectTree(t *testing.T) { _, ok := changeIds["0"] assert.Equal(t, true, ok) }) + + t.Run("changes from tree db 1", func(t *testing.T) { + changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{"1"}) + require.NoError(t, err, "changes after common snapshot should be without error") + + changeIds := make(map[string]struct{}) + for _, ch := range changes { + changeIds[ch.Id] = struct{}{} + } + + for _, id := range []string{"2", "3", "4", "5", "6"} { + _, ok := changeIds[id] + assert.Equal(t, true, ok) + } + for _, id := range []string{"0", "1"} { + _, ok := changeIds[id] + assert.Equal(t, false, ok) + } + }) + + t.Run("changes from tree db 5", func(t *testing.T) { + changes, err := objTree.ChangesAfterCommonSnapshot([]string{"3", "0"}, []string{"5"}) + require.NoError(t, err, "changes after common snapshot should be without error") + + changeIds := make(map[string]struct{}) + for _, ch := range changes { + changeIds[ch.Id] = struct{}{} + } + + for _, id := range []string{"2", "3", "4", "6"} { + _, ok := changeIds[id] + assert.Equal(t, true, ok) + } + for _, id := range []string{"0", "1", "5"} { + _, ok := changeIds[id] + assert.Equal(t, false, ok) + } + }) }) t.Run("add new changes related to previous snapshot", func(t *testing.T) { diff --git a/pkg/acl/tree/rawloader.go b/pkg/acl/tree/rawloader.go index 0c1956a9..43854a29 100644 --- a/pkg/acl/tree/rawloader.go +++ b/pkg/acl/tree/rawloader.go @@ -19,6 +19,7 @@ type rawChangeLoader struct { type rawCacheEntry struct { change *Change rawChange *aclpb.RawChange + position int } func newRawChangeLoader(treeStorage storage.TreeStorage, changeBuilder ChangeBuilder) *rawChangeLoader { @@ -107,50 +108,56 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi r.cache = nil }() - // updating map - bufPosMap := make(map[string]int) - for _, breakpoint := range breakpoints { - bufPosMap[breakpoint] = -1 + existingBreakpoints := make([]string, 0, len(breakpoints)) + for _, b := range breakpoints { + entry, err := r.loadEntry(b) + if err != nil { + continue + } + entry.position = -1 + r.cache[b] = entry + existingBreakpoints = append(existingBreakpoints, b) } - bufPosMap[commonSnapshot] = -1 + r.cache[commonSnapshot] = rawCacheEntry{position: -1} dfs := func( commonSnapshot string, heads []string, startCounter int, shouldVisit func(counter int, mapExists bool) bool, - visit func(prevCounter int, entry rawCacheEntry) int) bool { + visit func(entry rawCacheEntry) rawCacheEntry) bool { // resetting stack r.idStack = r.idStack[:0] r.idStack = append(r.idStack, heads...) commonSnapshotVisited := false + var err error for len(r.idStack) > 0 { id := r.idStack[len(r.idStack)-1] r.idStack = r.idStack[:len(r.idStack)-1] - cnt, exists := bufPosMap[id] - if !shouldVisit(cnt, exists) { + entry, exists := r.cache[id] + if !shouldVisit(entry.position, exists) { continue } - - // TODO: add proper error handling, we must ignore errors on missing breakpoints though - entry, err := r.loadEntry(id) - if err != nil { - continue + if !exists { + entry, err = r.loadEntry(id) + if err != nil { + continue + } } // setting the counter when we visit - bufPosMap[id] = visit(cnt, entry) + r.cache[id] = visit(entry) for _, prev := range entry.change.PreviousIds { if prev == commonSnapshot { commonSnapshotVisited = true break } - cnt, exists = bufPosMap[prev] - if !shouldVisit(cnt, exists) { + entry, exists = r.cache[prev] + if !shouldVisit(entry.position, exists) { continue } r.idStack = append(r.idStack, prev) @@ -167,9 +174,10 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi func(counter int, mapExists bool) bool { return !mapExists }, - func(_ int, entry rawCacheEntry) int { + func(entry rawCacheEntry) rawCacheEntry { buffer = append(buffer, entry.rawChange) - return len(buffer) - 1 + entry.position = len(buffer) - 1 + return entry }) // checking if we stopped at breakpoints @@ -188,15 +196,16 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi } // marking all visited as nil - dfs(commonSnapshot, breakpoints, len(buffer), + dfs(commonSnapshot, existingBreakpoints, len(buffer), func(counter int, mapExists bool) bool { return !mapExists || counter < len(buffer) }, - func(discardedPosition int, entry rawCacheEntry) int { - if discardedPosition != -1 { - buffer[discardedPosition] = nil + func(entry rawCacheEntry) rawCacheEntry { + if entry.position != -1 { + buffer[entry.position] = nil } - return len(buffer) + 1 + entry.position = len(buffer) + 1 + return entry }) // discarding visited @@ -208,11 +217,6 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi } func (r *rawChangeLoader) loadEntry(id string) (entry rawCacheEntry, err error) { - var ok bool - if entry, ok = r.cache[id]; ok { - return - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) defer cancel() @@ -229,7 +233,6 @@ func (r *rawChangeLoader) loadEntry(id string) (entry rawCacheEntry, err error) change: change, rawChange: rawChange, } - r.cache[id] = entry return } diff --git a/pkg/acl/tree/util.go b/pkg/acl/tree/util.go index 37a08d31..0e6cc7cd 100644 --- a/pkg/acl/tree/util.go +++ b/pkg/acl/tree/util.go @@ -21,6 +21,8 @@ OuterLoop: if ourPath[i] == theirPath[j] { i-- j-- + } else { + break } } return ourPath[i+1], nil From 698acad3bd6d3929e1da66fc28f2bfbc92532844 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 8 Sep 2022 00:24:19 +0300 Subject: [PATCH 051/219] remotediff test --- service/space/remotediff/remotediff.go | 81 +++++++-------------- service/space/remotediff/remotediff_test.go | 41 +++++++++++ 2 files changed, 68 insertions(+), 54 deletions(-) create mode 100644 service/space/remotediff/remotediff_test.go diff --git a/service/space/remotediff/remotediff.go b/service/space/remotediff/remotediff.go index 0bab5350..df10aec6 100644 --- a/service/space/remotediff/remotediff.go +++ b/service/space/remotediff/remotediff.go @@ -2,75 +2,55 @@ package remotediff import ( "context" - "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" ) -func NewRemoteDiff(p pool.Pool, peerId, spaceId string) ldiff.Remote { +type Client interface { + HeadSync(ctx context.Context, in *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) +} + +func NewRemoteDiff(spaceId string, client Client) ldiff.Remote { return remote{ - pool: p, - peerId: peerId, spaceId: spaceId, + client: client, } } type remote struct { - pool pool.Pool - peerId string spaceId string + client Client } func (r remote) Ranges(ctx context.Context, ranges []ldiff.Range, resBuf []ldiff.RangeResult) (results []ldiff.RangeResult, err error) { results = resBuf[:0] - pbRanges := make([]*spacesync.DiffRange_Request_Range, 0, len(ranges)) + pbRanges := make([]*spacesync.HeadSyncRange, 0, len(ranges)) for _, rg := range ranges { - pbRanges = append(pbRanges, &spacesync.DiffRange_Request_Range{ + pbRanges = append(pbRanges, &spacesync.HeadSyncRange{ From: rg.From, To: rg.To, Limit: uint32(rg.Limit), }) } - req := &spacesync.Space{ + req := &spacesync.HeadSyncRequest{ SpaceId: r.spaceId, - Message: &spacesync.Space_Content{ - Value: &spacesync.Space_Content_DiffRange{ - DiffRange: &spacesync.DiffRange{ - Request: &spacesync.DiffRange_Request{ - Ranges: pbRanges, - }, - }, - }, - }, + Ranges: pbRanges, } - msg, err := req.Marshal() + resp, err := r.client.HeadSync(ctx, req) if err != nil { return } - resp, err := r.pool.SendAndWaitResponse(ctx, r.peerId, &syncproto.Message{ - Header: &syncproto.Header{ - Type: syncproto.MessageType_MessageTypeSpace, - }, - Data: msg, - }) - if err != nil { - return - } - var spaceResp = &spacesync.Space{} - if err = resp.UnmarshalData(spaceResp); err != nil { - return - } - rangeResp := spaceResp.GetMessage().GetDiffRange().GetResponse() - if rangeResp != nil { - return nil, fmt.Errorf("got nil response") - } - for _, rr := range rangeResp.Results { + for _, rr := range resp.Results { var elms []ldiff.Element if len(rr.Elements) > 0 { elms = make([]ldiff.Element, 0, len(rr.Elements)) } + for _, e := range rr.Elements { + elms = append(elms, ldiff.Element{ + Id: e.Id, + Head: e.Head, + }) + } results = append(results, ldiff.RangeResult{ Hash: rr.Hash, Elements: elms, @@ -80,12 +60,7 @@ func (r remote) Ranges(ctx context.Context, ranges []ldiff.Range, resBuf []ldiff return } -func HandlerRangeRequest(ctx context.Context, d ldiff.Diff, diffRange *spacesync.DiffRange) (resp *spacesync.DiffRange, err error) { - req := diffRange.GetRequest() - if req != nil { - return nil, fmt.Errorf("received nil request") - } - +func HandlerRangeRequest(ctx context.Context, d ldiff.Diff, req *spacesync.HeadSyncRequest) (resp *spacesync.HeadSyncResponse, err error) { ranges := make([]ldiff.Range, 0, len(req.Ranges)) for _, reqRange := range req.Ranges { ranges = append(ranges, ldiff.Range{ @@ -99,27 +74,25 @@ func HandlerRangeRequest(ctx context.Context, d ldiff.Diff, diffRange *spacesync return } - var rangeResp = &spacesync.DiffRange_Response{ - Results: make([]*spacesync.DiffRange_Response_Result, len(res)), + var rangeResp = &spacesync.HeadSyncResponse{ + Results: make([]*spacesync.HeadSyncResult, 0, len(res)), } for _, rangeRes := range res { - var elements []*spacesync.DiffRange_Response_Result_Element + var elements []*spacesync.HeadSyncResultElement if len(rangeRes.Elements) > 0 { - elements = make([]*spacesync.DiffRange_Response_Result_Element, 0, len(rangeRes.Elements)) + elements = make([]*spacesync.HeadSyncResultElement, 0, len(rangeRes.Elements)) for _, el := range rangeRes.Elements { - elements = append(elements, &spacesync.DiffRange_Response_Result_Element{ + elements = append(elements, &spacesync.HeadSyncResultElement{ Id: el.Id, Head: el.Head, }) } } - rangeResp.Results = append(rangeResp.Results, &spacesync.DiffRange_Response_Result{ + rangeResp.Results = append(rangeResp.Results, &spacesync.HeadSyncResult{ Hash: rangeRes.Hash, Elements: elements, Count: uint32(rangeRes.Count), }) } - return &spacesync.DiffRange{ - Response: rangeResp, - }, nil + return rangeResp, nil } diff --git a/service/space/remotediff/remotediff_test.go b/service/space/remotediff/remotediff_test.go new file mode 100644 index 00000000..e1cf96ed --- /dev/null +++ b/service/space/remotediff/remotediff_test.go @@ -0,0 +1,41 @@ +package remotediff + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" +) + +func TestRemote(t *testing.T) { + ldLocal := ldiff.New(8, 8) + ldRemote := ldiff.New(8, 8) + for i := 0; i < 100; i++ { + el := ldiff.Element{ + Id: fmt.Sprint(i), + Head: fmt.Sprint(i), + } + ldRemote.Set(el) + if i%10 != 0 { + ldLocal.Set(el) + } + } + + rd := NewRemoteDiff("1", &mockClient{l: ldRemote}) + newIds, changedIds, removedIds, err := ldLocal.Diff(context.Background(), rd) + require.NoError(t, err) + assert.Len(t, newIds, 10) + assert.Len(t, changedIds, 0) + assert.Len(t, removedIds, 0) +} + +type mockClient struct { + l ldiff.Diff +} + +func (m *mockClient) HeadSync(ctx context.Context, in *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) { + return HandlerRangeRequest(ctx, m.l, in) +} From 3f284889ac7b9925b832f9523b0faa1b4600855d Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 8 Sep 2022 07:50:52 +0200 Subject: [PATCH 052/219] Make stuff compile --- service/document/service.go | 2 +- service/sync/requesthandler/requesthandler.go | 7 ++-- service/treecache/service.go | 34 ++++++------------- 3 files changed, 16 insertions(+), 27 deletions(-) diff --git a/service/document/service.go b/service/document/service.go index 96084d48..2ae8e239 100644 --- a/service/document/service.go +++ b/service/document/service.go @@ -103,7 +103,7 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err Identity: s.account.Account().Identity, IsSnapshot: false, } - ch, err = docTree.AddContent(ctx, aclTree, signable) + ch, err = docTree.AddContent(ctx, signable) if err != nil { return err } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 0b50d156..eeeb0d52 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -268,9 +268,11 @@ func (r *requestHandler) createTree( return r.treeCache.Add( ctx, treeId, - treecache.TreePayload{ + storage.TreeStorageCreatePayload{ + TreeId: treeId, Header: header, Changes: response.Changes, + Heads: response.Heads, }) } @@ -283,7 +285,8 @@ func (r *requestHandler) createACLList( return r.treeCache.Add( ctx, treeId, - treecache.ACLListPayload{ + storage.ACLListStorageCreatePayload{ + ListId: treeId, Header: header, Records: req.Records, }) diff --git a/service/treecache/service.go b/service/treecache/service.go index 8b02a120..8a440107 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -21,19 +21,9 @@ type ObjFunc = func(obj interface{}) error var log = logger.NewNamed("treecache") -type TreePayload struct { - Header *aclpb.Header - Changes []*aclpb.RawChange -} - -type ACLListPayload struct { - Header *aclpb.Header - Records []*aclpb.RawRecord -} - type Service interface { Do(ctx context.Context, id string, f ObjFunc) error - Add(ctx context.Context, id string, payload interface{}) error + Add(ctx context.Context, id string, payload any) error } type service struct { @@ -59,23 +49,23 @@ func (s *service) Do(ctx context.Context, treeId string, f ObjFunc) error { return f(t) } -func (s *service) Add(ctx context.Context, treeId string, payload interface{}) error { +func (s *service) Add(ctx context.Context, treeId string, payload any) error { switch pl := payload.(type) { - case TreePayload: + case aclstorage.TreeStorageCreatePayload: log. With(zap.String("treeId", treeId), zap.Int("len(changes)", len(pl.Changes))). Debug("adding Tree with changes") - _, err := s.storage.CreateTreeStorage(treeId, pl.Header, pl.Changes) + _, err := s.storage.CreateTreeStorage(payload.(aclstorage.TreeStorageCreatePayload)) if err != nil { return err } - case ACLListPayload: + case aclstorage.ACLListStorageCreatePayload: log. With(zap.String("treeId", treeId), zap.Int("len(changes)", len(pl.Records))). Debug("adding ACLList with records") - _, err := s.storage.CreateACLListStorage(treeId, pl.Header, pl.Records) + _, err := s.storage.CreateACLListStorage(payload.(aclstorage.ACLListStorageCreatePayload)) if err != nil { return err } @@ -123,19 +113,15 @@ func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error return nil, fmt.Errorf("incorrect type") } log.Info("got header", zap.String("header", header.String())) - var docTree tree.ObjectTree - // TODO: it is a question if we need to use ACLList on the first tree build, because we can think that the tree is already validated + var objTree tree.ObjectTree err = s.Do(ctx, header.AclListId, func(obj interface{}) error { - aclTree := obj.(list.ACLList) - aclTree.RLock() - defer aclTree.RUnlock() - - docTree, err = tree.BuildDocTreeWithIdentity(t.(aclstorage.TreeStorage), s.account.Account(), nil, aclTree) + aclList := obj.(list.ACLList) + objTree, err = tree.BuildObjectTree(t.(aclstorage.TreeStorage), nil, aclList) if err != nil { return err } return nil }) - return docTree, err + return objTree, err } From 88bf93a2cc6a46b072330020ddad73a66ef624cc Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 8 Sep 2022 08:08:33 +0200 Subject: [PATCH 053/219] Fix tests --- pkg/acl/testutils/acllistbuilder/ymlentities_test.go | 12 ------------ service/space/service.go | 3 ++- 2 files changed, 2 insertions(+), 13 deletions(-) delete mode 100644 pkg/acl/testutils/acllistbuilder/ymlentities_test.go diff --git a/pkg/acl/testutils/acllistbuilder/ymlentities_test.go b/pkg/acl/testutils/acllistbuilder/ymlentities_test.go deleted file mode 100644 index 29d86d31..00000000 --- a/pkg/acl/testutils/acllistbuilder/ymlentities_test.go +++ /dev/null @@ -1,12 +0,0 @@ -package acllistbuilder - -import ( - "fmt" - "testing" -) - -func Test_YamlParse(t *testing.T) { - tb, _ := NewListStorageWithTestName("userjoinexampleupdate.yml") - gr, _ := tb.Graph() - fmt.Println(gr) -} diff --git a/service/space/service.go b/service/space/service.go index 364ce91d..7b826607 100644 --- a/service/space/service.go +++ b/service/space/service.go @@ -78,7 +78,8 @@ func (s *service) Handle(ctx context.Context, data []byte) (resp proto.Marshaler return } if spaceReq.SpaceId != "" { - sp, err := s.get(ctx, spaceReq.SpaceId) + var sp Space + sp, err = s.get(ctx, spaceReq.SpaceId) if err != nil { return } From bee067ad7667d25214f2b148325d0634b05f92ef Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 8 Sep 2022 12:05:30 +0300 Subject: [PATCH 054/219] space service periodic sync --- cmd/node/node.go | 22 ++++---- config/config.go | 2 +- config/space.go | 4 +- etc/config.yml | 3 ++ ...K2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml | 3 ++ ...zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml | 3 ++ pkg/ocache/ocache.go | 4 +- service/net/pool/pool.go | 3 +- service/net/rpc/server/drpcserver.go | 5 +- service/space/remotediff/remotediff.go | 6 +-- service/space/rpc.go | 18 +++++++ service/space/service.go | 16 +++--- service/space/space.go | 50 +++++++++++-------- 13 files changed, 84 insertions(+), 55 deletions(-) create mode 100644 service/space/rpc.go diff --git a/cmd/node/node.go b/cmd/node/node.go index d6ded226..c73a164c 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -8,17 +8,13 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/api" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/configuration" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space" "go.uber.org/zap" "net/http" _ "net/http/pprof" @@ -94,14 +90,16 @@ func main() { func Bootstrap(a *app.App) { a.Register(account.New()). Register(node.New()). + Register(configuration.New()). Register(secure.New()). - Register(server.New()). Register(dialer.New()). Register(pool.New()). - Register(configuration.New()). - Register(document.New()). - Register(message.New()). - Register(requesthandler.New()). - Register(treecache.New()). - Register(api.New()) + Register(space.New()). + Register(server.New()) + + //Register(document.New()). + //Register(message.New()). + //Register(requesthandler.New()). + //Register(treecache.New()). + //Register(api.New()) } diff --git a/config/config.go b/config/config.go index 4c1e8aa9..4f5ed612 100644 --- a/config/config.go +++ b/config/config.go @@ -33,7 +33,7 @@ type Config struct { } func (c *Config) Init(ctx context.Context, a *app.App) (err error) { - logger.NewNamed("config").Info(fmt.Sprint(*c)) + logger.NewNamed("config").Info(fmt.Sprint(c.Space)) return } diff --git a/config/space.go b/config/space.go index 4de7cde0..5b603715 100644 --- a/config/space.go +++ b/config/space.go @@ -1,6 +1,6 @@ package config type Space struct { - GCTTL int `json:"gcTTL"` - SyncPeriod int `json:"syncPeriod"` + GCTTL int `yaml:"gcTTL"` + SyncPeriod int `yaml:"syncPeriod"` } diff --git a/etc/config.yml b/etc/config.yml index 79754d42..09b13d54 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -11,6 +11,9 @@ account: encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd apiServer: port: "8080" +space: + gcTTL: 60 + syncPeriod: 10 nodes: - peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 address: 127.0.0.1:4430 diff --git a/etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml b/etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml index 2e552e35..dcea6558 100755 --- a/etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml +++ b/etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml @@ -11,6 +11,9 @@ account: encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd apiServer: port: "8080" +space: + gcTTL: 60 + syncPeriod: 10 nodes: - peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 address: 127.0.0.1:4430 diff --git a/etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml b/etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml index 10a49044..eb88a19b 100755 --- a/etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml +++ b/etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml @@ -11,6 +11,9 @@ account: encryptionKey: JgG4CcCbae1qEpe7mKXzp7m5hNc56SSyZd9DwUaEStKJrq7RToAC2Vgd3i6hKRwa58zCWeN6Wjc3o6qrdKPEPRvcyEPysamajVo5mdQiUgWAmr97pGEsyjuRjQoC2GY2LvLiEQxEgwFgJxKGMHMiaWMtDfxCDUaDEm4bu5RdMhqRZekAWho6c3WoEeruSr14iX1TrocFNfBkBY7CjEw8kcywXCTNgtvhb2Qiwgj5AxEF4wyw4bzaNA9ctXb1hoHPFVMu6C51pkFY7jUD9zwyH3ukgnAewkGAcPNbKmaTAtMosKRVaAN97mAwXh2VRt1hWmRvVk7r76EjnVKhD4vbsKZc56RVcHTVWRVdhU7FGyPsiE5rSQAz1JQGYzxnZpX7EG77CyrmUGyfueVfRHhwY2oq8A4uQCRaQxSaJHYLowjXSxh8DQ2V6MTqyzti32C27utBYdHzLVCJSGkmdzGwrFcHqsq7nLDxmvJVErPvyReixEe8kFmqopJ3e6LLm8WdYw9K6JYBjXnEfwPzm7Von9sf3dcaGDUHYfttMyeke7fAXJkvPRje69hYVyzdQGAauuojzGkkvQWCSMK1KCMNMznRaPDCNvofrQhYrub24WhmwpKhorufdfW8Cb4T6reBDCtaWVsbuinjtL6F6Sui5aYHJFLJ6e4pPewr1P4EuZYRbMBZwN5KvDLhTGLBuBnaTqUUdF6bj2U22NoRYMogiHiftqKqiexKNDXX1Zg9RQEvxgjuVo6SBW42mVEA8agrLhruRqCmiduJxVrfqLNGeYXHXrcmMEgW7uosJbPXvTcfRvdFWS1ov7oSALvj6vhDQ28Yi9D2ETNdNsfVWAFQuwvPpW7CHQGXTitprVbqH8JYxNZuGygcLmr5efbB22Vzu4ntd1HoraQpG12qeDEUA7tXYUpoYyuSdWwKPjSAMtaQcCSfVrhKQHQuKJargrVrez8vjWuwLfvSucV7ZHe7gjqvYgULdE1ubRCRSd7DuLjEN2Vd6obzV2c3MRet7ZSf4Sp88WM5AuTyW7BjArBc4S3gUQ8rYaiZ8Tu7NCxkEzbFwWRaemZkwfvcsX3XxqjyF37tFSGkEqE5kuBvpZW72675LkDffj7kH1zA8yE6dVujJjWsNYVFJWndUtz5Vy2KCdZAbBgq19q4AtsxWPodU2N3yZXzFAFAzTrxS6V4P7Scpdau1avgRvHLcBQPunA37xaYMy8YMifJwtmRY25mnAQwZAk3eANk7tXwZd58SDnciLNvARJvwKzTQBXcshkwyy52SX8XmXDJsPnRLaHmiYBJ63Yzr5XpZuuAtxb9qrWG2NHCNxfomHokWacV1hjZPPd6ZxT1FuRozB6Qt2NLcyqY7bnTcQJb1jPUaTAGXXCR8WVmmmYo2fDQe8CdBmgyPvbzNTEJUyScBz4RdycB5PZap4SurJCWtHbuMyQbQUB6jJgURDstfXS5Akfe4oruNq9rnYcNtnsDJPtrhXHBqzDizmf1BDxR5FB2RCxzCgeAfg8WQ1Ug9PVAGTzob6ZqCrGXzWXEUniZnf1vjr7QhGKBYXEX9SWDoSMUpP4FreVDTnx15ijRZTV3p8xG5fE9e36TnugRVvTyq7XzmyPBjW2r66f1bior apiServer: port: "8081" +space: + gcTTL: 60 + syncPeriod: 10 nodes: - peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 address: 127.0.0.1:4430 diff --git a/pkg/ocache/ocache.go b/pkg/ocache/ocache.go index 5e10508a..4f0cf0ba 100644 --- a/pkg/ocache/ocache.go +++ b/pkg/ocache/ocache.go @@ -27,9 +27,9 @@ type LoadFunc func(ctx context.Context, id string) (value Object, err error) type Option func(*oCache) -var WithLogServiceName = func(name string) Option { +var WithLogger = func(l *zap.SugaredLogger) Option { return func(cache *oCache) { - cache.log = cache.log.With("service_name", name) + cache.log = l } } diff --git a/service/net/pool/pool.go b/service/net/pool/pool.go index cbd0973a..6b7cfa67 100644 --- a/service/net/pool/pool.go +++ b/service/net/pool/pool.go @@ -9,6 +9,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" "math/rand" + "time" ) const ( @@ -43,7 +44,7 @@ func (p *pool) Init(ctx context.Context, a *app.App) (err error) { dialer := a.MustComponent(dialer.CName).(dialer.Dialer) p.cache = ocache.New(func(ctx context.Context, id string) (value ocache.Object, err error) { return dialer.Dial(ctx, id) - }) + }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), ocache.WithTTL(time.Minute*5)) return nil } diff --git a/service/net/rpc/server/drpcserver.go b/service/net/rpc/server/drpcserver.go index 1af9af7b..975c270f 100644 --- a/service/net/rpc/server/drpcserver.go +++ b/service/net/rpc/server/drpcserver.go @@ -7,12 +7,13 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" + "github.com/zeebo/errs" "go.uber.org/zap" + "io" "net" "storj.io/drpc" "storj.io/drpc/drpcmux" "storj.io/drpc/drpcserver" - "strings" "time" ) @@ -103,7 +104,7 @@ func (s *drpcServer) serveConn(ctx context.Context, conn net.Conn) { l := log.With(zap.String("remoteAddr", conn.RemoteAddr().String())).With(zap.String("localAddr", conn.LocalAddr().String())) l.Debug("connection opened") if err := s.drpcServer.ServeOne(ctx, conn); err != nil { - if err == context.Canceled || strings.Contains(err.Error(), "EOF") { + if errs.Is(err, context.Canceled) || errs.Is(err, io.EOF) { l.Debug("connection closed") } else { l.Warn("serve connection error", zap.Error(err)) diff --git a/service/space/remotediff/remotediff.go b/service/space/remotediff/remotediff.go index df10aec6..2ba6769a 100644 --- a/service/space/remotediff/remotediff.go +++ b/service/space/remotediff/remotediff.go @@ -74,7 +74,7 @@ func HandlerRangeRequest(ctx context.Context, d ldiff.Diff, req *spacesync.HeadS return } - var rangeResp = &spacesync.HeadSyncResponse{ + resp = &spacesync.HeadSyncResponse{ Results: make([]*spacesync.HeadSyncResult, 0, len(res)), } for _, rangeRes := range res { @@ -88,11 +88,11 @@ func HandlerRangeRequest(ctx context.Context, d ldiff.Diff, req *spacesync.HeadS }) } } - rangeResp.Results = append(rangeResp.Results, &spacesync.HeadSyncResult{ + resp.Results = append(resp.Results, &spacesync.HeadSyncResult{ Hash: rangeRes.Hash, Elements: elements, Count: uint32(rangeRes.Count), }) } - return rangeResp, nil + return } diff --git a/service/space/rpc.go b/service/space/rpc.go new file mode 100644 index 00000000..db056079 --- /dev/null +++ b/service/space/rpc.go @@ -0,0 +1,18 @@ +package space + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" +) + +type rpcServer struct { + s *service +} + +func (r rpcServer) HeadSync(ctx context.Context, request *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) { + sp, err := r.s.get(ctx, request.SpaceId) + if err != nil { + return nil, err + } + return sp.HeadSync(ctx, request) +} diff --git a/service/space/service.go b/service/space/service.go index 183b5425..ae9be5a4 100644 --- a/service/space/service.go +++ b/service/space/service.go @@ -2,7 +2,6 @@ package space import ( "context" - "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" @@ -11,7 +10,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" - "storj.io/drpc/drpcerr" "time" ) @@ -24,7 +22,6 @@ func New() Service { } type Service interface { - spacesync.DRPCSpaceServer app.ComponentRunnable } @@ -40,9 +37,8 @@ func (s *service) Init(ctx context.Context, a *app.App) (err error) { s.pool = a.MustComponent(pool.CName).(pool.Pool) s.confService = a.MustComponent(configuration.CName).(configuration.Service) ttlSec := time.Second * time.Duration(s.conf.GCTTL) - s.cache = ocache.New(s.loadSpace, ocache.WithTTL(ttlSec), ocache.WithGCPeriod(time.Minute)) - spacesync.DRPCRegisterSpace(a.MustComponent(server.CName).(server.DRPCServer), s) - + s.cache = ocache.New(s.loadSpace, ocache.WithTTL(ttlSec), ocache.WithGCPeriod(time.Minute), ocache.WithLogger(log.Sugar())) + spacesync.DRPCRegisterSpace(a.MustComponent(server.CName).(server.DRPCServer), rpcServer{s}) return nil } @@ -51,6 +47,10 @@ func (s *service) Name() (name string) { } func (s *service) Run(ctx context.Context) (err error) { + go func() { + time.Sleep(time.Second * 10) + s.get(ctx, "testSpace") + }() return } @@ -71,10 +71,6 @@ func (s *service) get(ctx context.Context, id string) (Space, error) { return obj.(Space), nil } -func (s *service) HeadSync(ctx context.Context, request *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) { - return nil, drpcerr.WithCode(fmt.Errorf("check"), 42) -} - func (s *service) Close(ctx context.Context) (err error) { return s.cache.Close() } diff --git a/service/space/space.go b/service/space/space.go index 169fd408..7be85ef4 100644 --- a/service/space/space.go +++ b/service/space/space.go @@ -5,7 +5,9 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/configuration" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/remotediff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" "go.uber.org/zap" "math/rand" "sync" @@ -14,6 +16,9 @@ import ( type Space interface { Id() string + + HeadSync(ctx context.Context, req *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) + Close() error } @@ -44,21 +49,26 @@ func (s *space) Run(ctx context.Context) error { return nil } +func (s *space) HeadSync(ctx context.Context, req *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) { + return remotediff.HandlerRangeRequest(ctx, s.diff, req) +} + func (s *space) testFill() { var n = 1000 var els = make([]ldiff.Element, 0, n) rand.Seed(time.Now().UnixNano()) for i := 0; i < n; i++ { if rand.Intn(n) > 2 { - id := fmt.Sprintf("%s.%d", s.id, n) + id := fmt.Sprintf("%s.%d", s.id, i) head := "head." + id - if rand.Intn(n) > 2 { + if rand.Intn(n) > n-100 { head += ".modified" } - els = append(els, ldiff.Element{ + el := ldiff.Element{ Id: id, Head: head, - }) + } + els = append(els, el) } } s.diff.Set(els...) @@ -80,6 +90,7 @@ func (s *space) syncLoop() { for { select { case <-s.syncCtx.Done(): + return case <-ticker.C: doSync() } @@ -88,45 +99,40 @@ func (s *space) syncLoop() { } func (s *space) sync(ctx context.Context) error { - peerIds, err := s.peerIds(ctx) + peers, err := s.getPeers(ctx) if err != nil { return err } - for _, peerId := range peerIds { - if err := s.syncWithPeer(ctx, peerId); err != nil { - log.Error("can't sync with peer", zap.String("peer", peerId), zap.Error(err)) + for _, p := range peers { + if err := s.syncWithPeer(ctx, p); err != nil { + log.Error("can't sync with peer", zap.String("peer", p.Id()), zap.Error(err)) } } return nil } -func (s *space) syncWithPeer(ctx context.Context, peerId string) (err error) { - rdiff := remotediff.NewRemoteDiff(s.s.pool, peerId, s.id) +func (s *space) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { + cl := spacesync.NewDRPCSpaceClient(p) + rdiff := remotediff.NewRemoteDiff(s.id, cl) newIds, changedIds, removedIds, err := s.diff.Diff(ctx, rdiff) if err != nil { return nil } - log.Info("sync done:", zap.Strings("newIds", newIds), zap.Strings("changedIds", changedIds), zap.Strings("removedIds", removedIds)) + log.Info("sync done:", zap.Int("newIds", len(newIds)), zap.Int("changedIds", len(changedIds)), zap.Int("removedIds", len(removedIds))) return } -func (s *space) peerIds(ctx context.Context) (peerIds []string, err error) { +func (s *space) getPeers(ctx context.Context) (peers []peer.Peer, err error) { if s.conf.IsResponsible(s.id) { - peers, err := s.conf.AllPeers(ctx, s.id) - if err != nil { - return nil, err - } - for _, p := range peers { - peerIds = append(peerIds, p.Id()) - } + return s.conf.AllPeers(ctx, s.id) } else { - peer, err := s.conf.OnePeer(ctx, s.id) + var p peer.Peer + p, err = s.conf.OnePeer(ctx, s.id) if err != nil { return nil, err } - peerIds = append(peerIds, peer.Id()) + return []peer.Peer{p}, nil } - return } func (s *space) Close() error { From feff4ad8906d4b385d4239b0f9caea967b9bb00d Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 8 Sep 2022 12:15:54 +0300 Subject: [PATCH 055/219] rename protos-go -> protos --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8d0d2cb3..c7282f4f 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ endif export PATH=$(GOPATH)/bin:$(shell echo $$PATH) # TODO: folders were changed, so we should update Makefile and protos generation -protos-go: +protos: @echo 'Generating protobuf packages (Go)...' # Uncomment if needed @$(eval ROOT_PKG := pkg) From caa725dc209262ba7307d2a55850c7ada6516b84 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 8 Sep 2022 21:56:32 +0300 Subject: [PATCH 056/219] package moving + commonaspace and nidespace services --- Makefile | 2 +- app/app.go | 4 +- app/app_test.go | 2 +- cmd/node/node.go | 20 +- {service => common}/account/service.go | 3 +- common/commonspace/periodicsync.go | 58 +++++ .../commonspace}/remotediff/remotediff.go | 24 +- .../remotediff/remotediff_test.go | 4 +- common/commonspace/rpchandler.go | 25 ++ common/commonspace/service.go | 49 ++++ common/commonspace/space.go | 115 +++++++++ .../spacesyncproto}/protos/spacesync.proto | 10 +- .../spacesyncproto}/spacesync.pb.go | 242 +++++++++++++++--- .../spacesyncproto/spacesync_drpc.pb.go | 188 ++++++++++++++ {service => common}/net/dialer/dialer.go | 6 +- {service => common}/net/peer/peer.go | 0 {service => common}/net/pool/pool.go | 18 +- {service => common}/net/pool/pool_test.go | 6 +- .../net/rpc/server/drpcserver.go | 16 +- {service => common}/net/rpc/server/util.go | 0 .../net/rpc/server/util_windows.go | 0 {service => common}/net/secure/context.go | 0 {service => common}/net/secure/listener.go | 0 {service => common}/net/secure/service.go | 2 +- .../nodeconf}/configuration.go | 8 +- .../nodeconf}/service.go | 9 +- config/config.go | 3 +- node/nodespace/rpchandler.go | 30 +++ node/nodespace/service.go | 71 +++++ pkg/ocache/ocache.go | 31 ++- service/api/service.go | 2 +- service/node/service.go | 2 +- service/space/rpc.go | 18 -- service/space/service.go | 76 ------ service/space/space.go | 142 ---------- service/space/spacesync/spacesync_drpc.pb.go | 113 -------- service/sync/document/service.go | 4 +- service/sync/message/service.go | 7 +- service/sync/requesthandler/requesthandler.go | 4 +- service/treecache/service.go | 4 +- 40 files changed, 850 insertions(+), 468 deletions(-) rename {service => common}/account/service.go (95%) create mode 100644 common/commonspace/periodicsync.go rename {service/space => common/commonspace}/remotediff/remotediff.go (66%) rename {service/space => common/commonspace}/remotediff/remotediff_test.go (84%) create mode 100644 common/commonspace/rpchandler.go create mode 100644 common/commonspace/service.go create mode 100644 common/commonspace/space.go rename {service/space/spacesync => common/commonspace/spacesyncproto}/protos/spacesync.proto (83%) rename {service/space/spacesync => common/commonspace/spacesyncproto}/spacesync.pb.go (81%) create mode 100644 common/commonspace/spacesyncproto/spacesync_drpc.pb.go rename {service => common}/net/dialer/dialer.go (90%) rename {service => common}/net/peer/peer.go (100%) rename {service => common}/net/pool/pool.go (81%) rename {service => common}/net/pool/pool_test.go (95%) rename {service => common}/net/rpc/server/drpcserver.go (84%) rename {service => common}/net/rpc/server/util.go (100%) rename {service => common}/net/rpc/server/util_windows.go (100%) rename {service => common}/net/secure/context.go (100%) rename {service => common}/net/secure/listener.go (100%) rename {service => common}/net/secure/service.go (96%) rename {service/configuration => common/nodeconf}/configuration.go (88%) rename {service/configuration => common/nodeconf}/service.go (87%) create mode 100644 node/nodespace/rpchandler.go create mode 100644 node/nodespace/service.go delete mode 100644 service/space/rpc.go delete mode 100644 service/space/service.go delete mode 100644 service/space/space.go delete mode 100644 service/space/spacesync/spacesync_drpc.pb.go diff --git a/Makefile b/Makefile index c7282f4f..2480115f 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ protos: $(GOGO_START) protoc --gogofaster_out=:. $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.proto; mv $(P_PLAINTEXT_CHANGES_PATH_PB)/protos/*.go $(P_PLAINTEXT_CHANGES_PATH_PB) $(eval PKGMAP := $$(P_ACL_CHANGES),$$(P_TREE_CHANGES)) $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. $(P_SYNC_CHANGES_PATH_PB)/proto/*.proto - $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. --go-drpc_out=protolib=github.com/gogo/protobuf:. service/space/spacesync/protos/*.proto + protoc --gogofaster_out=$(PKGMAP):. --go-drpc_out=protolib=github.com/gogo/protobuf:. common/commonspace/spacesyncproto/protos/*.proto build: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) diff --git a/app/app.go b/app/app.go index ef0d46bd..718b24b6 100644 --- a/app/app.go +++ b/app/app.go @@ -27,7 +27,7 @@ var ( type Component interface { // Init will be called first // When returned error is not nil - app start will be aborted - Init(ctx context.Context, a *App) (err error) + Init(a *App) (err error) // Name must return unique service name Name() (name string) } @@ -157,7 +157,7 @@ func (app *App) Start(ctx context.Context) (err error) { } for i, s := range app.components { - if err = s.Init(ctx, app); err != nil { + if err = s.Init(app); err != nil { closeServices(i) return fmt.Errorf("can't init service '%s': %v", s.Name(), err) } diff --git a/app/app_test.go b/app/app_test.go index b4a93007..cdc52445 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -131,7 +131,7 @@ type testComponent struct { ids testIds } -func (t *testComponent) Init(ctx context.Context, a *App) error { +func (t *testComponent) Init(a *App) error { t.ids.initId = t.seq.New() return t.err } diff --git a/cmd/node/node.go b/cmd/node/node.go index c73a164c..6f4cdf88 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -6,15 +6,16 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/configuration" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc/server" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" + "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space" "go.uber.org/zap" "net/http" _ "net/http/pprof" @@ -90,11 +91,12 @@ func main() { func Bootstrap(a *app.App) { a.Register(account.New()). Register(node.New()). - Register(configuration.New()). + Register(nodeconf.New()). Register(secure.New()). Register(dialer.New()). Register(pool.New()). - Register(space.New()). + Register(nodespace.New()). + Register(commonspace.New()). Register(server.New()) //Register(document.New()). diff --git a/service/account/service.go b/common/account/service.go similarity index 95% rename from service/account/service.go rename to common/account/service.go index ed66fe1e..06749842 100644 --- a/service/account/service.go +++ b/common/account/service.go @@ -1,7 +1,6 @@ package account import ( - "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" @@ -33,7 +32,7 @@ func New() app.Component { return &service{} } -func (s *service) Init(ctx context.Context, a *app.App) (err error) { +func (s *service) Init(a *app.App) (err error) { cfg := a.MustComponent(config.CName).(*config.Config) // decoding our keys diff --git a/common/commonspace/periodicsync.go b/common/commonspace/periodicsync.go new file mode 100644 index 00000000..219f953e --- /dev/null +++ b/common/commonspace/periodicsync.go @@ -0,0 +1,58 @@ +package commonspace + +import ( + "context" + "go.uber.org/zap" + "time" +) + +func newPeriodicSync(periodSeconds int, sync func(ctx context.Context) error, l *zap.Logger) *periodicSync { + ctx, cancel := context.WithCancel(context.Background()) + ps := &periodicSync{ + log: l, + sync: sync, + syncCtx: ctx, + syncCancel: cancel, + syncLoopDone: make(chan struct{}), + } + go ps.syncLoop(periodSeconds) + return ps +} + +type periodicSync struct { + log *zap.Logger + sync func(ctx context.Context) error + syncCtx context.Context + syncCancel context.CancelFunc + syncLoopDone chan struct{} +} + +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() + if err := p.sync(ctx); err != nil { + p.log.Warn("periodic sync error", zap.Error(err)) + } + } + doSync() + if period > 0 { + ticker := time.NewTicker(period) + defer ticker.Stop() + for { + select { + case <-p.syncCtx.Done(): + return + case <-ticker.C: + doSync() + } + } + } +} + +func (p *periodicSync) Close() { + p.syncCancel() + <-p.syncLoopDone +} diff --git a/service/space/remotediff/remotediff.go b/common/commonspace/remotediff/remotediff.go similarity index 66% rename from service/space/remotediff/remotediff.go rename to common/commonspace/remotediff/remotediff.go index 2ba6769a..1a01814c 100644 --- a/service/space/remotediff/remotediff.go +++ b/common/commonspace/remotediff/remotediff.go @@ -2,12 +2,12 @@ package remotediff import ( "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" ) type Client interface { - HeadSync(ctx context.Context, in *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) + HeadSync(ctx context.Context, in *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) } func NewRemoteDiff(spaceId string, client Client) ldiff.Remote { @@ -24,15 +24,15 @@ type remote struct { func (r remote) Ranges(ctx context.Context, ranges []ldiff.Range, resBuf []ldiff.RangeResult) (results []ldiff.RangeResult, err error) { results = resBuf[:0] - pbRanges := make([]*spacesync.HeadSyncRange, 0, len(ranges)) + pbRanges := make([]*spacesyncproto.HeadSyncRange, 0, len(ranges)) for _, rg := range ranges { - pbRanges = append(pbRanges, &spacesync.HeadSyncRange{ + pbRanges = append(pbRanges, &spacesyncproto.HeadSyncRange{ From: rg.From, To: rg.To, Limit: uint32(rg.Limit), }) } - req := &spacesync.HeadSyncRequest{ + req := &spacesyncproto.HeadSyncRequest{ SpaceId: r.spaceId, Ranges: pbRanges, } @@ -60,7 +60,7 @@ func (r remote) Ranges(ctx context.Context, ranges []ldiff.Range, resBuf []ldiff return } -func HandlerRangeRequest(ctx context.Context, d ldiff.Diff, req *spacesync.HeadSyncRequest) (resp *spacesync.HeadSyncResponse, err error) { +func HandlerRangeRequest(ctx context.Context, d ldiff.Diff, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) { ranges := make([]ldiff.Range, 0, len(req.Ranges)) for _, reqRange := range req.Ranges { ranges = append(ranges, ldiff.Range{ @@ -74,21 +74,21 @@ func HandlerRangeRequest(ctx context.Context, d ldiff.Diff, req *spacesync.HeadS return } - resp = &spacesync.HeadSyncResponse{ - Results: make([]*spacesync.HeadSyncResult, 0, len(res)), + resp = &spacesyncproto.HeadSyncResponse{ + Results: make([]*spacesyncproto.HeadSyncResult, 0, len(res)), } for _, rangeRes := range res { - var elements []*spacesync.HeadSyncResultElement + var elements []*spacesyncproto.HeadSyncResultElement if len(rangeRes.Elements) > 0 { - elements = make([]*spacesync.HeadSyncResultElement, 0, len(rangeRes.Elements)) + elements = make([]*spacesyncproto.HeadSyncResultElement, 0, len(rangeRes.Elements)) for _, el := range rangeRes.Elements { - elements = append(elements, &spacesync.HeadSyncResultElement{ + elements = append(elements, &spacesyncproto.HeadSyncResultElement{ Id: el.Id, Head: el.Head, }) } } - resp.Results = append(resp.Results, &spacesync.HeadSyncResult{ + resp.Results = append(resp.Results, &spacesyncproto.HeadSyncResult{ Hash: rangeRes.Hash, Elements: elements, Count: uint32(rangeRes.Count), diff --git a/service/space/remotediff/remotediff_test.go b/common/commonspace/remotediff/remotediff_test.go similarity index 84% rename from service/space/remotediff/remotediff_test.go rename to common/commonspace/remotediff/remotediff_test.go index e1cf96ed..d209b753 100644 --- a/service/space/remotediff/remotediff_test.go +++ b/common/commonspace/remotediff/remotediff_test.go @@ -3,8 +3,8 @@ package remotediff import ( "context" "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" @@ -36,6 +36,6 @@ type mockClient struct { l ldiff.Diff } -func (m *mockClient) HeadSync(ctx context.Context, in *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) { +func (m *mockClient) HeadSync(ctx context.Context, in *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) { return HandlerRangeRequest(ctx, m.l, in) } diff --git a/common/commonspace/rpchandler.go b/common/commonspace/rpchandler.go new file mode 100644 index 00000000..3ce71e1a --- /dev/null +++ b/common/commonspace/rpchandler.go @@ -0,0 +1,25 @@ +package commonspace + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" +) + +type RpcHandler interface { + HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) + Stream(stream spacesyncproto.DRPCSpace_StreamStream) error +} + +type rpcHandler struct { + s *space +} + +func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) { + return remotediff.HandlerRangeRequest(ctx, r.s.diff, req) +} + +func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) error { + return fmt.Errorf("not implemented") +} diff --git a/common/commonspace/service.go b/common/commonspace/service.go new file mode 100644 index 00000000..85dd8ae9 --- /dev/null +++ b/common/commonspace/service.go @@ -0,0 +1,49 @@ +package commonspace + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" +) + +const CName = "common.commonspace" + +var log = logger.NewNamed(CName) + +func New() Service { + return &service{} +} + +type Service interface { + CreateSpace(ctx context.Context, id string) (sp Space, err error) + app.Component +} + +type service struct { + config config.Space + configurationService nodeconf.Service +} + +func (s *service) Init(a *app.App) (err error) { + s.config = a.MustComponent(config.CName).(*config.Config).Space + s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) + return nil +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) CreateSpace(ctx context.Context, id string) (Space, error) { + sp := &space{ + id: id, + nconf: s.configurationService.GetLast(), + conf: s.config, + } + if err := sp.Init(ctx); err != nil { + return nil, err + } + return sp, nil +} diff --git a/common/commonspace/space.go b/common/commonspace/space.go new file mode 100644 index 00000000..4f83dd97 --- /dev/null +++ b/common/commonspace/space.go @@ -0,0 +1,115 @@ +package commonspace + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" + "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/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" + "go.uber.org/zap" + "math/rand" + "sync" + "time" +) + +type Space interface { + Id() string + + SpaceSyncRpc() RpcHandler + + Close() error +} + +type space struct { + id string + nconf nodeconf.Configuration + conf config.Space + diff ldiff.Diff + rpc *rpcHandler + periodicSync *periodicSync + mu sync.RWMutex +} + +func (s *space) Id() string { + return s.id +} + +func (s *space) Init(ctx context.Context) error { + s.diff = ldiff.New(16, 16) + s.periodicSync = newPeriodicSync(s.conf.SyncPeriod, s.sync, log.With(zap.String("spaceId", s.id))) + s.rpc = &rpcHandler{s: s} + s.testFill() + return nil +} + +func (s *space) SpaceSyncRpc() RpcHandler { + return s.rpc +} + +func (s *space) testFill() { + var n = 1000 + var els = make([]ldiff.Element, 0, n) + rand.Seed(time.Now().UnixNano()) + for i := 0; i < n; i++ { + if rand.Intn(n) > 2 { + id := fmt.Sprintf("%s.%d", s.id, i) + head := "head." + id + if rand.Intn(n) > n-10 { + head += ".modified" + } + el := ldiff.Element{ + Id: id, + Head: head, + } + els = append(els, el) + } + } + s.diff.Set(els...) +} + +func (s *space) sync(ctx context.Context) error { + st := time.Now() + peers, err := s.getPeers(ctx) + if err != nil { + return err + } + for _, p := range peers { + if err := s.syncWithPeer(ctx, p); err != nil { + log.Error("can't sync with peer", zap.String("peer", p.Id()), zap.Error(err)) + } + } + log.Info("synced", zap.String("spaceId", s.id), zap.Duration("dur", time.Since(st))) + return nil +} + +func (s *space) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { + cl := spacesyncproto.NewDRPCSpaceClient(p) + rdiff := remotediff.NewRemoteDiff(s.id, cl) + newIds, changedIds, removedIds, err := s.diff.Diff(ctx, rdiff) + if err != nil { + return nil + } + log.Info("sync done:", zap.Int("newIds", len(newIds)), zap.Int("changedIds", len(changedIds)), zap.Int("removedIds", len(removedIds))) + return +} + +func (s *space) getPeers(ctx context.Context) (peers []peer.Peer, err error) { + if s.nconf.IsResponsible(s.id) { + return s.nconf.AllPeers(ctx, s.id) + } else { + var p peer.Peer + p, err = s.nconf.OnePeer(ctx, s.id) + if err != nil { + return nil, err + } + return []peer.Peer{p}, nil + } +} + +func (s *space) Close() error { + s.periodicSync.Close() + return nil +} diff --git a/service/space/spacesync/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto similarity index 83% rename from service/space/spacesync/protos/spacesync.proto rename to common/commonspace/spacesyncproto/protos/spacesync.proto index f0b68b11..0a1e434d 100644 --- a/service/space/spacesync/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -1,16 +1,24 @@ syntax = "proto3"; package anySpace; -option go_package = "service/space/spacesync"; +option go_package = "common/commonspace/spacesyncproto"; enum ErrCodes { Unexpected = 0; } + service Space { // HeadSync compares all objects and their hashes in a space rpc HeadSync(HeadSyncRequest) returns (HeadSyncResponse); + rpc Stream( stream Msg) returns (stream Msg); } +// TODO: temporary mock message +message Msg { + string spaceId = 1; +} + + // HeadSyncRange presenting a request for one range message HeadSyncRange { diff --git a/service/space/spacesync/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go similarity index 81% rename from service/space/spacesync/spacesync.pb.go rename to common/commonspace/spacesyncproto/spacesync.pb.go index 92772dc4..9db560cb 100644 --- a/service/space/spacesync/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: service/space/spacesync/protos/spacesync.proto +// source: common/commonspace/spacesyncproto/protos/spacesync.proto -package spacesync +package spacesyncproto import ( fmt "fmt" @@ -41,7 +41,52 @@ func (x ErrCodes) String() string { } func (ErrCodes) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{0} + return fileDescriptor_5855f4ef9cf24cdb, []int{0} +} + +// TODO: temporary mock message +type Msg struct { + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` +} + +func (m *Msg) Reset() { *m = Msg{} } +func (m *Msg) String() string { return proto.CompactTextString(m) } +func (*Msg) ProtoMessage() {} +func (*Msg) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{0} +} +func (m *Msg) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Msg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Msg.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 *Msg) XXX_Merge(src proto.Message) { + xxx_messageInfo_Msg.Merge(m, src) +} +func (m *Msg) XXX_Size() int { + return m.Size() +} +func (m *Msg) XXX_DiscardUnknown() { + xxx_messageInfo_Msg.DiscardUnknown(m) +} + +var xxx_messageInfo_Msg proto.InternalMessageInfo + +func (m *Msg) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" } // HeadSyncRange presenting a request for one range @@ -55,7 +100,7 @@ func (m *HeadSyncRange) Reset() { *m = HeadSyncRange{} } func (m *HeadSyncRange) String() string { return proto.CompactTextString(m) } func (*HeadSyncRange) ProtoMessage() {} func (*HeadSyncRange) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{0} + return fileDescriptor_5855f4ef9cf24cdb, []int{1} } func (m *HeadSyncRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -116,7 +161,7 @@ func (m *HeadSyncResult) Reset() { *m = HeadSyncResult{} } func (m *HeadSyncResult) String() string { return proto.CompactTextString(m) } func (*HeadSyncResult) ProtoMessage() {} func (*HeadSyncResult) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{1} + return fileDescriptor_5855f4ef9cf24cdb, []int{2} } func (m *HeadSyncResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -176,7 +221,7 @@ func (m *HeadSyncResultElement) Reset() { *m = HeadSyncResultElement{} } func (m *HeadSyncResultElement) String() string { return proto.CompactTextString(m) } func (*HeadSyncResultElement) ProtoMessage() {} func (*HeadSyncResultElement) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{2} + return fileDescriptor_5855f4ef9cf24cdb, []int{3} } func (m *HeadSyncResultElement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -229,7 +274,7 @@ func (m *HeadSyncRequest) Reset() { *m = HeadSyncRequest{} } func (m *HeadSyncRequest) String() string { return proto.CompactTextString(m) } func (*HeadSyncRequest) ProtoMessage() {} func (*HeadSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{3} + return fileDescriptor_5855f4ef9cf24cdb, []int{4} } func (m *HeadSyncRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -281,7 +326,7 @@ func (m *HeadSyncResponse) Reset() { *m = HeadSyncResponse{} } func (m *HeadSyncResponse) String() string { return proto.CompactTextString(m) } func (*HeadSyncResponse) ProtoMessage() {} func (*HeadSyncResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_11d78c2fb7c80384, []int{4} + return fileDescriptor_5855f4ef9cf24cdb, []int{5} } func (m *HeadSyncResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -319,6 +364,7 @@ func (m *HeadSyncResponse) GetResults() []*HeadSyncResult { func init() { proto.RegisterEnum("anySpace.ErrCodes", ErrCodes_name, ErrCodes_value) + proto.RegisterType((*Msg)(nil), "anySpace.Msg") proto.RegisterType((*HeadSyncRange)(nil), "anySpace.HeadSyncRange") proto.RegisterType((*HeadSyncResult)(nil), "anySpace.HeadSyncResult") proto.RegisterType((*HeadSyncResultElement)(nil), "anySpace.HeadSyncResultElement") @@ -327,35 +373,66 @@ func init() { } func init() { - proto.RegisterFile("service/space/spacesync/protos/spacesync.proto", fileDescriptor_11d78c2fb7c80384) + proto.RegisterFile("common/commonspace/spacesyncproto/protos/spacesync.proto", fileDescriptor_5855f4ef9cf24cdb) } -var fileDescriptor_11d78c2fb7c80384 = []byte{ - // 369 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xbf, 0x6e, 0xe2, 0x40, - 0x10, 0xc6, 0x6d, 0xf3, 0xcf, 0xcc, 0x1d, 0x1c, 0x5a, 0xdd, 0x09, 0x1f, 0x85, 0x0f, 0xb9, 0x42, - 0x57, 0x18, 0x85, 0x94, 0x54, 0x49, 0x44, 0x14, 0x52, 0x2e, 0x4a, 0x13, 0xa5, 0x71, 0xec, 0x49, - 0xb0, 0x04, 0xbb, 0x8e, 0x77, 0x49, 0xc2, 0x5b, 0xe4, 0xb1, 0x52, 0x52, 0xa6, 0x8c, 0xe0, 0x45, - 0x22, 0x0f, 0x31, 0x24, 0x92, 0x69, 0xac, 0x99, 0xf1, 0x7c, 0xdf, 0xfc, 0x76, 0x34, 0xe0, 0x2b, - 0x4c, 0x1f, 0xe3, 0x10, 0xfb, 0x2a, 0x09, 0xf2, 0xaf, 0x5a, 0x8a, 0xb0, 0x9f, 0xa4, 0x52, 0x4b, - 0xb5, 0x2f, 0xf8, 0x54, 0x60, 0x76, 0x20, 0x96, 0x93, 0xac, 0xe6, 0x8d, 0xa1, 0x71, 0x81, 0x41, - 0x34, 0x59, 0x8a, 0x90, 0x07, 0xe2, 0x1e, 0x19, 0x83, 0xf2, 0x5d, 0x2a, 0xe7, 0x8e, 0xd9, 0x35, - 0x7b, 0x65, 0x4e, 0x31, 0x6b, 0x82, 0xa5, 0xa5, 0x63, 0x51, 0xc5, 0xd2, 0x92, 0xfd, 0x86, 0xca, - 0x2c, 0x9e, 0xc7, 0xda, 0x29, 0x75, 0xcd, 0x5e, 0x83, 0x6f, 0x13, 0xef, 0x09, 0x9a, 0x3b, 0x2b, - 0x54, 0x8b, 0x99, 0xce, 0xbc, 0xa6, 0x81, 0x9a, 0x92, 0xd7, 0x4f, 0x4e, 0x31, 0x1b, 0x82, 0x8d, - 0x33, 0x9c, 0xa3, 0xd0, 0xca, 0xb1, 0xba, 0xa5, 0xde, 0x8f, 0xc1, 0x3f, 0x3f, 0xa7, 0xf1, 0xbf, - 0xeb, 0x47, 0xdb, 0x3e, 0xbe, 0x13, 0x64, 0x83, 0x43, 0xb9, 0x10, 0xbb, 0xc1, 0x94, 0x78, 0x43, - 0xf8, 0x53, 0x28, 0xcc, 0xb8, 0xe3, 0x88, 0xa6, 0xd7, 0xb9, 0x15, 0x47, 0xc4, 0x83, 0x41, 0x44, - 0x2f, 0xa9, 0x73, 0x8a, 0xbd, 0x1b, 0xf8, 0xb5, 0x17, 0x3f, 0x2c, 0x50, 0x69, 0xe6, 0x40, 0x8d, - 0x16, 0x36, 0xce, 0xb5, 0x79, 0xca, 0xfa, 0x50, 0x4d, 0xb3, 0x2d, 0xe5, 0xe8, 0xed, 0x02, 0xf4, - 0xec, 0x3f, 0xff, 0x6c, 0xf3, 0xce, 0xa1, 0xf5, 0x05, 0x2d, 0x91, 0x42, 0x21, 0x1b, 0x40, 0x2d, - 0x25, 0x4c, 0xe5, 0x98, 0xe4, 0xe2, 0x1c, 0x5a, 0x00, 0xcf, 0x1b, 0xff, 0x77, 0xc0, 0x1e, 0xa5, - 0xe9, 0x99, 0x8c, 0x50, 0xb1, 0x26, 0xc0, 0x95, 0xc0, 0xe7, 0x04, 0x43, 0x8d, 0x51, 0xcb, 0x18, - 0x5c, 0x42, 0x85, 0xc4, 0xec, 0x04, 0xec, 0x5c, 0xcf, 0xfe, 0x16, 0x79, 0xd2, 0xf3, 0x3a, 0x9d, - 0xc2, 0x71, 0xc4, 0x76, 0x7a, 0xf4, 0xba, 0x76, 0xcd, 0xd5, 0xda, 0x35, 0xdf, 0xd7, 0xae, 0xf9, - 0xb2, 0x71, 0x8d, 0xd5, 0xc6, 0x35, 0xde, 0x36, 0xae, 0x71, 0xdd, 0x3e, 0x70, 0x62, 0xb7, 0x55, - 0x3a, 0xa9, 0xe3, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x09, 0x7e, 0xc8, 0x77, 0x84, 0x02, 0x00, - 0x00, +var fileDescriptor_5855f4ef9cf24cdb = []byte{ + // 400 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcd, 0xce, 0xd2, 0x40, + 0x14, 0xed, 0x94, 0xbf, 0x72, 0x15, 0x24, 0x13, 0x8d, 0xb5, 0x8b, 0x82, 0x5d, 0x35, 0x2c, 0xa8, + 0xc1, 0x8d, 0x09, 0x2b, 0x35, 0x18, 0x59, 0xb0, 0x19, 0xe2, 0xc6, 0xb8, 0xa9, 0xed, 0x08, 0x4d, + 0xe8, 0x4c, 0xed, 0x0c, 0x2a, 0x6f, 0xe1, 0x63, 0xb9, 0x64, 0xe9, 0xd2, 0xc0, 0x8b, 0x98, 0xde, + 0x7e, 0x85, 0x8f, 0xa4, 0xe4, 0xdb, 0xcc, 0xfd, 0xe9, 0x39, 0xe7, 0x9e, 0x7b, 0x53, 0x78, 0x13, + 0xc9, 0x34, 0x95, 0x22, 0x28, 0x83, 0xca, 0xc2, 0x88, 0x07, 0xf8, 0xaa, 0xbd, 0x88, 0xb2, 0x5c, + 0x6a, 0x19, 0xe0, 0xab, 0x2e, 0xdd, 0x09, 0x36, 0xa8, 0x15, 0x8a, 0xfd, 0xaa, 0xe8, 0x79, 0x43, + 0x68, 0x2c, 0xd5, 0x9a, 0xda, 0xd0, 0x41, 0xcc, 0x22, 0xb6, 0xc9, 0x88, 0xf8, 0x5d, 0x56, 0x95, + 0xde, 0x02, 0x7a, 0x1f, 0x79, 0x18, 0xaf, 0xf6, 0x22, 0x62, 0xa1, 0x58, 0x73, 0x4a, 0xa1, 0xf9, + 0x2d, 0x97, 0x29, 0xe2, 0x9a, 0x0c, 0x73, 0xda, 0x07, 0x53, 0x4b, 0xdb, 0xc4, 0x8e, 0xa9, 0x25, + 0x7d, 0x0a, 0xad, 0x6d, 0x92, 0x26, 0xda, 0x6e, 0x8c, 0x88, 0xdf, 0x63, 0x65, 0xe1, 0xfd, 0x84, + 0xfe, 0x59, 0x8a, 0xab, 0xdd, 0x56, 0x17, 0x5a, 0x9b, 0x50, 0x6d, 0x50, 0xeb, 0x31, 0xc3, 0x9c, + 0xce, 0xc0, 0xe2, 0x5b, 0x9e, 0x72, 0xa1, 0x95, 0x6d, 0x8e, 0x1a, 0xfe, 0xa3, 0xe9, 0x70, 0x52, + 0xd9, 0x9d, 0x5c, 0xf3, 0xe7, 0x25, 0x8e, 0x9d, 0x09, 0xc5, 0xe0, 0x48, 0xee, 0xc4, 0x79, 0x30, + 0x16, 0xde, 0x0c, 0x9e, 0xd5, 0x12, 0x0b, 0xdf, 0x49, 0xb5, 0xb1, 0x99, 0xc4, 0xe8, 0x87, 0x87, + 0x31, 0x6e, 0xd2, 0x65, 0x98, 0x7b, 0x5f, 0xe0, 0xc9, 0x85, 0xfc, 0x7d, 0xc7, 0x95, 0xbe, 0x7d, + 0x2d, 0x1a, 0x40, 0x3b, 0x2f, 0xae, 0x54, 0x59, 0x7f, 0x5e, 0x63, 0xbd, 0xf8, 0xce, 0xee, 0x60, + 0xde, 0x07, 0x18, 0xdc, 0xb3, 0x96, 0x49, 0xa1, 0x38, 0x9d, 0x42, 0x27, 0x47, 0x9b, 0xca, 0x26, + 0xa8, 0x62, 0xdf, 0x3a, 0x00, 0xab, 0x80, 0x63, 0x07, 0xac, 0x79, 0x9e, 0xbf, 0x97, 0x31, 0x57, + 0xb4, 0x0f, 0xf0, 0x49, 0xf0, 0x5f, 0x19, 0x8f, 0x34, 0x8f, 0x07, 0xc6, 0xf4, 0x07, 0xb4, 0x90, + 0x4c, 0xdf, 0x82, 0x55, 0xf1, 0xe9, 0x8b, 0x3a, 0x4d, 0x5c, 0xcf, 0x71, 0x6a, 0xc7, 0x95, 0xde, + 0xc6, 0xd0, 0x5e, 0xe9, 0x9c, 0x87, 0x29, 0xed, 0x5d, 0x50, 0x4b, 0xb5, 0x76, 0xae, 0x4b, 0x9f, + 0xbc, 0x22, 0xef, 0x66, 0x7f, 0x8e, 0x2e, 0x39, 0x1c, 0x5d, 0xf2, 0xef, 0xe8, 0x92, 0xdf, 0x27, + 0xd7, 0x38, 0x9c, 0x5c, 0xe3, 0xef, 0xc9, 0x35, 0x3e, 0xbf, 0x7c, 0xf0, 0xcf, 0xfd, 0xda, 0xc6, + 0xf0, 0xfa, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xf6, 0x94, 0x21, 0xe5, 0x02, 0x00, 0x00, +} + +func (m *Msg) 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 *Msg) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Msg) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { @@ -574,6 +651,19 @@ func encodeVarintSpacesync(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *Msg) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} + func (m *HeadSyncRange) Size() (n int) { if m == nil { return 0 @@ -671,6 +761,88 @@ func sovSpacesync(x uint64) (n int) { func sozSpacesync(x uint64) (n int) { return sovSpacesync(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (m *Msg) 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 ErrIntOverflowSpacesync + } + 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: Msg: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Msg: 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 ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *HeadSyncRange) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/common/commonspace/spacesyncproto/spacesync_drpc.pb.go b/common/commonspace/spacesyncproto/spacesync_drpc.pb.go new file mode 100644 index 00000000..b17dc589 --- /dev/null +++ b/common/commonspace/spacesyncproto/spacesync_drpc.pb.go @@ -0,0 +1,188 @@ +// Code generated by protoc-gen-go-drpc. DO NOT EDIT. +// protoc-gen-go-drpc version: v0.0.32 +// source: common/commonspace/spacesyncproto/protos/spacesync.proto + +package spacesyncproto + +import ( + bytes "bytes" + context "context" + errors "errors" + jsonpb "github.com/gogo/protobuf/jsonpb" + proto "github.com/gogo/protobuf/proto" + drpc "storj.io/drpc" + drpcerr "storj.io/drpc/drpcerr" +) + +type drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto struct{} + +func (drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto) Marshal(msg drpc.Message) ([]byte, error) { + return proto.Marshal(msg.(proto.Message)) +} + +func (drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto) Unmarshal(buf []byte, msg drpc.Message) error { + return proto.Unmarshal(buf, msg.(proto.Message)) +} + +func (drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto) JSONMarshal(msg drpc.Message) ([]byte, error) { + var buf bytes.Buffer + err := new(jsonpb.Marshaler).Marshal(&buf, msg.(proto.Message)) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func (drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error { + return jsonpb.Unmarshal(bytes.NewReader(buf), msg.(proto.Message)) +} + +type DRPCSpaceClient interface { + DRPCConn() drpc.Conn + + HeadSync(ctx context.Context, in *HeadSyncRequest) (*HeadSyncResponse, error) + Stream(ctx context.Context) (DRPCSpace_StreamClient, error) +} + +type drpcSpaceClient struct { + cc drpc.Conn +} + +func NewDRPCSpaceClient(cc drpc.Conn) DRPCSpaceClient { + return &drpcSpaceClient{cc} +} + +func (c *drpcSpaceClient) DRPCConn() drpc.Conn { return c.cc } + +func (c *drpcSpaceClient) HeadSync(ctx context.Context, in *HeadSyncRequest) (*HeadSyncResponse, error) { + out := new(HeadSyncResponse) + err := c.cc.Invoke(ctx, "/anySpace.Space/HeadSync", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}, in, out) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *drpcSpaceClient) Stream(ctx context.Context) (DRPCSpace_StreamClient, error) { + stream, err := c.cc.NewStream(ctx, "/anySpace.Space/Stream", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) + if err != nil { + return nil, err + } + x := &drpcSpace_StreamClient{stream} + return x, nil +} + +type DRPCSpace_StreamClient interface { + drpc.Stream + Send(*Msg) error + Recv() (*Msg, error) +} + +type drpcSpace_StreamClient struct { + drpc.Stream +} + +func (x *drpcSpace_StreamClient) Send(m *Msg) error { + return x.MsgSend(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) +} + +func (x *drpcSpace_StreamClient) Recv() (*Msg, error) { + m := new(Msg) + if err := x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { + return nil, err + } + return m, nil +} + +func (x *drpcSpace_StreamClient) RecvMsg(m *Msg) error { + return x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) +} + +type DRPCSpaceServer interface { + HeadSync(context.Context, *HeadSyncRequest) (*HeadSyncResponse, error) + Stream(DRPCSpace_StreamStream) error +} + +type DRPCSpaceUnimplementedServer struct{} + +func (s *DRPCSpaceUnimplementedServer) HeadSync(context.Context, *HeadSyncRequest) (*HeadSyncResponse, error) { + return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) +} + +func (s *DRPCSpaceUnimplementedServer) Stream(DRPCSpace_StreamStream) error { + return drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) +} + +type DRPCSpaceDescription struct{} + +func (DRPCSpaceDescription) NumMethods() int { return 2 } + +func (DRPCSpaceDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { + switch n { + case 0: + return "/anySpace.Space/HeadSync", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}, + func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { + return srv.(DRPCSpaceServer). + HeadSync( + ctx, + in1.(*HeadSyncRequest), + ) + }, DRPCSpaceServer.HeadSync, true + case 1: + return "/anySpace.Space/Stream", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}, + func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { + return nil, srv.(DRPCSpaceServer). + Stream( + &drpcSpace_StreamStream{in1.(drpc.Stream)}, + ) + }, DRPCSpaceServer.Stream, true + default: + return "", nil, nil, nil, false + } +} + +func DRPCRegisterSpace(mux drpc.Mux, impl DRPCSpaceServer) error { + return mux.Register(impl, DRPCSpaceDescription{}) +} + +type DRPCSpace_HeadSyncStream interface { + drpc.Stream + SendAndClose(*HeadSyncResponse) error +} + +type drpcSpace_HeadSyncStream struct { + drpc.Stream +} + +func (x *drpcSpace_HeadSyncStream) SendAndClose(m *HeadSyncResponse) error { + if err := x.MsgSend(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { + return err + } + return x.CloseSend() +} + +type DRPCSpace_StreamStream interface { + drpc.Stream + Send(*Msg) error + Recv() (*Msg, error) +} + +type drpcSpace_StreamStream struct { + drpc.Stream +} + +func (x *drpcSpace_StreamStream) Send(m *Msg) error { + return x.MsgSend(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) +} + +func (x *drpcSpace_StreamStream) Recv() (*Msg, error) { + m := new(Msg) + if err := x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { + return nil, err + } + return m, nil +} + +func (x *drpcSpace_StreamStream) RecvMsg(m *Msg) error { + return x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) +} diff --git a/service/net/dialer/dialer.go b/common/net/dialer/dialer.go similarity index 90% rename from service/net/dialer/dialer.go rename to common/net/dialer/dialer.go index ade01444..80d0d6f2 100644 --- a/service/net/dialer/dialer.go +++ b/common/net/dialer/dialer.go @@ -5,9 +5,9 @@ import ( "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "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/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" "github.com/libp2p/go-libp2p-core/sec" "go.uber.org/zap" "net" @@ -39,7 +39,7 @@ type dialer struct { mu sync.RWMutex } -func (d *dialer) Init(ctx context.Context, a *app.App) (err error) { +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.peerAddrs = map[string][]string{} diff --git a/service/net/peer/peer.go b/common/net/peer/peer.go similarity index 100% rename from service/net/peer/peer.go rename to common/net/peer/peer.go diff --git a/service/net/pool/pool.go b/common/net/pool/pool.go similarity index 81% rename from service/net/pool/pool.go rename to common/net/pool/pool.go index 6b7cfa67..d4e21bf4 100644 --- a/service/net/pool/pool.go +++ b/common/net/pool/pool.go @@ -5,9 +5,9 @@ import ( "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" "math/rand" "time" ) @@ -40,11 +40,17 @@ type pool struct { cache ocache.OCache } -func (p *pool) Init(ctx context.Context, a *app.App) (err error) { +func (p *pool) Init(a *app.App) (err error) { dialer := a.MustComponent(dialer.CName).(dialer.Dialer) - p.cache = ocache.New(func(ctx context.Context, id string) (value ocache.Object, err error) { - return dialer.Dial(ctx, id) - }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), ocache.WithTTL(time.Minute*5)) + p.cache = ocache.New( + func(ctx context.Context, id string) (value ocache.Object, err error) { + return dialer.Dial(ctx, id) + }, + ocache.WithLogger(log.Sugar()), + ocache.WithGCPeriod(time.Minute), + ocache.WithTTL(time.Minute*5), + ocache.WithRefCounter(false), + ) return nil } diff --git a/service/net/pool/pool_test.go b/common/net/pool/pool_test.go similarity index 95% rename from service/net/pool/pool_test.go rename to common/net/pool/pool_test.go index efc51d38..a7f4a528 100644 --- a/service/net/pool/pool_test.go +++ b/common/net/pool/pool_test.go @@ -5,8 +5,8 @@ import ( "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "storj.io/drpc" @@ -160,7 +160,7 @@ func (d *dialerMock) UpdateAddrs(addrs map[string][]string) { return } -func (d *dialerMock) Init(ctx context.Context, a *app.App) (err error) { +func (d *dialerMock) Init(a *app.App) (err error) { return } diff --git a/service/net/rpc/server/drpcserver.go b/common/net/rpc/server/drpcserver.go similarity index 84% rename from service/net/rpc/server/drpcserver.go rename to common/net/rpc/server/drpcserver.go index 975c270f..5e6078ff 100644 --- a/service/net/rpc/server/drpcserver.go +++ b/common/net/rpc/server/drpcserver.go @@ -4,9 +4,9 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" + secure2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure" "github.com/zeebo/errs" "go.uber.org/zap" "io" @@ -33,16 +33,16 @@ type DRPCServer interface { type drpcServer struct { config config.GrpcServer drpcServer *drpcserver.Server - transport secure.Service - listeners []secure.ContextListener + transport secure2.Service + listeners []secure2.ContextListener pool pool.Pool cancel func() *drpcmux.Mux } -func (s *drpcServer) Init(ctx context.Context, a *app.App) (err error) { +func (s *drpcServer) Init(a *app.App) (err error) { s.config = a.MustComponent(config.CName).(*config.Config).GrpcServer - s.transport = a.MustComponent(secure.CName).(secure.Service) + s.transport = a.MustComponent(secure2.CName).(secure2.Service) s.pool = a.MustComponent(pool.CName).(pool.Pool) return nil } @@ -65,7 +65,7 @@ func (s *drpcServer) Run(ctx context.Context) (err error) { return } -func (s *drpcServer) serve(ctx context.Context, lis secure.ContextListener) { +func (s *drpcServer) serve(ctx context.Context, lis secure2.ContextListener) { l := log.With(zap.String("localAddr", lis.Addr().String())) l.Info("drpc listener started") defer func() { @@ -89,7 +89,7 @@ func (s *drpcServer) serve(ctx context.Context, lis secure.ContextListener) { } continue } - if _, ok := err.(secure.HandshakeError); ok { + if _, ok := err.(secure2.HandshakeError); ok { l.Warn("listener handshake error", zap.Error(err)) continue } diff --git a/service/net/rpc/server/util.go b/common/net/rpc/server/util.go similarity index 100% rename from service/net/rpc/server/util.go rename to common/net/rpc/server/util.go diff --git a/service/net/rpc/server/util_windows.go b/common/net/rpc/server/util_windows.go similarity index 100% rename from service/net/rpc/server/util_windows.go rename to common/net/rpc/server/util_windows.go diff --git a/service/net/secure/context.go b/common/net/secure/context.go similarity index 100% rename from service/net/secure/context.go rename to common/net/secure/context.go diff --git a/service/net/secure/listener.go b/common/net/secure/listener.go similarity index 100% rename from service/net/secure/listener.go rename to common/net/secure/listener.go diff --git a/service/net/secure/service.go b/common/net/secure/service.go similarity index 96% rename from service/net/secure/service.go rename to common/net/secure/service.go index 5c93862b..40a30f8c 100644 --- a/service/net/secure/service.go +++ b/common/net/secure/service.go @@ -35,7 +35,7 @@ type service struct { key crypto.PrivKey } -func (s *service) Init(ctx context.Context, a *app.App) (err error) { +func (s *service) Init(a *app.App) (err error) { account := a.MustComponent(config.CName).(*config.Config).Account decoder := signingkey.NewEDPrivKeyDecoder() pkb, err := decoder.DecodeFromStringIntoBytes(account.SigningKey) diff --git a/service/configuration/configuration.go b/common/nodeconf/configuration.go similarity index 88% rename from service/configuration/configuration.go rename to common/nodeconf/configuration.go index c242d79d..5c055bbb 100644 --- a/service/configuration/configuration.go +++ b/common/nodeconf/configuration.go @@ -1,10 +1,10 @@ -package configuration +package nodeconf import ( "context" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-chash" ) @@ -13,7 +13,7 @@ func New() Service { } type Configuration interface { - // Id returns current configuration id + // Id returns current nodeconf id Id() string // AllPeers returns all peers by spaceId except current account AllPeers(ctx context.Context, spaceId string) (peers []peer.Peer, err error) diff --git a/service/configuration/service.go b/common/nodeconf/service.go similarity index 87% rename from service/configuration/service.go rename to common/nodeconf/service.go index 9cd920f7..870223cb 100644 --- a/service/configuration/service.go +++ b/common/nodeconf/service.go @@ -1,16 +1,15 @@ -package configuration +package nodeconf import ( - "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" "github.com/anytypeio/go-chash" ) -const CName = "configuration" +const CName = "common.nodeconf" const ( partitionCount = 3000 @@ -32,7 +31,7 @@ type service struct { last Configuration } -func (s *service) Init(ctx context.Context, a *app.App) (err error) { +func (s *service) Init(a *app.App) (err error) { conf := a.MustComponent(config.CName).(*config.Config) s.accountId = conf.Account.PeerId s.pool = a.MustComponent(pool.CName).(pool.Pool) diff --git a/config/config.go b/config/config.go index 4f5ed612..b8a84e34 100644 --- a/config/config.go +++ b/config/config.go @@ -1,7 +1,6 @@ package config import ( - "context" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" @@ -32,7 +31,7 @@ type Config struct { Space Space `yaml:"space"` } -func (c *Config) Init(ctx context.Context, a *app.App) (err error) { +func (c *Config) Init(a *app.App) (err error) { logger.NewNamed("config").Info(fmt.Sprint(c.Space)) return } diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go new file mode 100644 index 00000000..082e7b90 --- /dev/null +++ b/node/nodespace/rpchandler.go @@ -0,0 +1,30 @@ +package nodespace + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" +) + +type rpcHandler struct { + s *service +} + +func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) { + sp, err := r.s.GetSpace(ctx, req.SpaceId) + if err != nil { + return nil, err + } + return sp.SpaceSyncRpc().HeadSync(ctx, req) +} + +func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) error { + msg, err := stream.Recv() + if err != nil { + return err + } + sp, err := r.s.GetSpace(stream.Context(), msg.SpaceId) + if err != nil { + return err + } + return sp.SpaceSyncRpc().Stream(stream) +} diff --git a/node/nodespace/service.go b/node/nodespace/service.go new file mode 100644 index 00000000..27226bc2 --- /dev/null +++ b/node/nodespace/service.go @@ -0,0 +1,71 @@ +package nodespace + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "time" +) + +const CName = "node.nodespace" + +var log = logger.NewNamed(CName) + +func New() Service { + return &service{} +} + +type Service interface { + GetSpace(ctx context.Context, id string) (commonspace.Space, error) + app.ComponentRunnable +} + +type service struct { + conf config.Space + cache ocache.OCache + commonSpace commonspace.Service +} + +func (s *service) Init(a *app.App) (err error) { + s.conf = a.MustComponent(config.CName).(*config.Config).Space + s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service) + s.cache = ocache.New( + func(ctx context.Context, id string) (value ocache.Object, err error) { + return s.commonSpace.CreateSpace(ctx, id) + }, + ocache.WithLogger(log.Sugar()), + ocache.WithGCPeriod(time.Minute), + ocache.WithTTL(time.Duration(s.conf.GCTTL)*time.Second), + ocache.WithRefCounter(false), + ) + return spacesyncproto.DRPCRegisterSpace(a.MustComponent(server.CName).(server.DRPCServer), &rpcHandler{s}) +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + go func() { + time.Sleep(time.Second * 5) + _, _ = s.GetSpace(ctx, "testDSpace") + }() + return +} + +func (s *service) GetSpace(ctx context.Context, id string) (commonspace.Space, error) { + v, err := s.cache.Get(ctx, id) + if err != nil { + return nil, err + } + return v.(commonspace.Space), nil +} + +func (s *service) Close(ctx context.Context) (err error) { + return s.cache.Close() +} diff --git a/pkg/ocache/ocache.go b/pkg/ocache/ocache.go index 4f0cf0ba..44dc9d42 100644 --- a/pkg/ocache/ocache.go +++ b/pkg/ocache/ocache.go @@ -45,6 +45,12 @@ var WithGCPeriod = func(gcPeriod time.Duration) Option { } } +var WithRefCounter = func(enable bool) Option { + return func(cache *oCache) { + cache.noRefCounter = !enable + } +} + func New(loadFunc LoadFunc, opts ...Option) OCache { c := &oCache{ data: make(map[string]*entry), @@ -124,15 +130,16 @@ type OCache interface { } type oCache struct { - mu sync.Mutex - data map[string]*entry - loadFunc LoadFunc - timeNow func() time.Time - ttl time.Duration - gc time.Duration - closed bool - closeCh chan struct{} - log *zap.SugaredLogger + mu sync.Mutex + data map[string]*entry + loadFunc LoadFunc + timeNow func() time.Time + ttl time.Duration + gc time.Duration + closed bool + closeCh chan struct{} + log *zap.SugaredLogger + noRefCounter bool } func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) { @@ -155,7 +162,9 @@ func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) { c.data[id] = e } e.lastUsage = c.timeNow() - e.refCount++ + if !c.noRefCounter { + e.refCount++ + } c.mu.Unlock() if load { @@ -206,7 +215,7 @@ func (c *oCache) Release(id string) bool { return false } if e, ok := c.data[id]; ok { - if e.refCount > 0 { + if !c.noRefCounter && e.refCount > 0 { e.refCount-- return true } diff --git a/service/api/service.go b/service/api/service.go index 8ab7eb26..e1b60b04 100644 --- a/service/api/service.go +++ b/service/api/service.go @@ -30,7 +30,7 @@ type service struct { cfg *config.Config } -func (s *service) Init(ctx context.Context, a *app.App) (err error) { +func (s *service) Init(a *app.App) (err error) { s.treeCache = a.MustComponent(treecache.CName).(treecache.Service) s.documentService = a.MustComponent(document.CName).(document.Service) s.cfg = a.MustComponent(config.CName).(*config.Config) diff --git a/service/node/service.go b/service/node/service.go index 877c8860..8b86fa9f 100644 --- a/service/node/service.go +++ b/service/node/service.go @@ -44,7 +44,7 @@ type service struct { nodes []*Node } -func (s *service) Init(ctx context.Context, a *app.App) (err error) { +func (s *service) Init(a *app.App) (err error) { cfg := a.MustComponent(config.CName).(*config.Config) signDecoder := signingkey.NewEDPrivKeyDecoder() rsaDecoder := encryptionkey.NewRSAPrivKeyDecoder() diff --git a/service/space/rpc.go b/service/space/rpc.go deleted file mode 100644 index db056079..00000000 --- a/service/space/rpc.go +++ /dev/null @@ -1,18 +0,0 @@ -package space - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" -) - -type rpcServer struct { - s *service -} - -func (r rpcServer) HeadSync(ctx context.Context, request *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) { - sp, err := r.s.get(ctx, request.SpaceId) - if err != nil { - return nil, err - } - return sp.HeadSync(ctx, request) -} diff --git a/service/space/service.go b/service/space/service.go deleted file mode 100644 index ae9be5a4..00000000 --- a/service/space/service.go +++ /dev/null @@ -1,76 +0,0 @@ -package space - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/configuration" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc/server" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" - "time" -) - -const CName = "space" - -var log = logger.NewNamed(CName) - -func New() Service { - return new(service) -} - -type Service interface { - app.ComponentRunnable -} - -type service struct { - conf config.Space - cache ocache.OCache - pool pool.Pool - confService configuration.Service -} - -func (s *service) Init(ctx context.Context, a *app.App) (err error) { - s.conf = a.MustComponent(config.CName).(*config.Config).Space - s.pool = a.MustComponent(pool.CName).(pool.Pool) - s.confService = a.MustComponent(configuration.CName).(configuration.Service) - ttlSec := time.Second * time.Duration(s.conf.GCTTL) - s.cache = ocache.New(s.loadSpace, ocache.WithTTL(ttlSec), ocache.WithGCPeriod(time.Minute), ocache.WithLogger(log.Sugar())) - spacesync.DRPCRegisterSpace(a.MustComponent(server.CName).(server.DRPCServer), rpcServer{s}) - return nil -} - -func (s *service) Name() (name string) { - return CName -} - -func (s *service) Run(ctx context.Context) (err error) { - go func() { - time.Sleep(time.Second * 10) - s.get(ctx, "testSpace") - }() - return -} - -func (s *service) loadSpace(ctx context.Context, id string) (value ocache.Object, err error) { - // TODO: load from database here - sp := &space{s: s, id: id, conf: s.confService.GetLast()} - if err = sp.Run(ctx); err != nil { - return nil, err - } - return sp, nil -} - -func (s *service) get(ctx context.Context, id string) (Space, error) { - obj, err := s.cache.Get(ctx, id) - if err != nil { - return nil, err - } - return obj.(Space), nil -} - -func (s *service) Close(ctx context.Context) (err error) { - return s.cache.Close() -} diff --git a/service/space/space.go b/service/space/space.go deleted file mode 100644 index 7be85ef4..00000000 --- a/service/space/space.go +++ /dev/null @@ -1,142 +0,0 @@ -package space - -import ( - "context" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/configuration" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/remotediff" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/space/spacesync" - "go.uber.org/zap" - "math/rand" - "sync" - "time" -) - -type Space interface { - Id() string - - HeadSync(ctx context.Context, req *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) - - Close() error -} - -// - -type space struct { - id string - conf configuration.Configuration - diff ldiff.Diff - diffHandler func() - syncCtx context.Context - syncCancel func() - syncLoopDone chan struct{} - s *service - mu sync.RWMutex -} - -func (s *space) Id() string { - return s.id -} - -func (s *space) Run(ctx context.Context) error { - s.diff = ldiff.New(16, 16) - s.syncCtx, s.syncCancel = context.WithCancel(context.Background()) - s.syncLoopDone = make(chan struct{}) - s.testFill() - go s.syncLoop() - return nil -} - -func (s *space) HeadSync(ctx context.Context, req *spacesync.HeadSyncRequest) (*spacesync.HeadSyncResponse, error) { - return remotediff.HandlerRangeRequest(ctx, s.diff, req) -} - -func (s *space) testFill() { - var n = 1000 - var els = make([]ldiff.Element, 0, n) - rand.Seed(time.Now().UnixNano()) - for i := 0; i < n; i++ { - if rand.Intn(n) > 2 { - id := fmt.Sprintf("%s.%d", s.id, i) - head := "head." + id - if rand.Intn(n) > n-100 { - head += ".modified" - } - el := ldiff.Element{ - Id: id, - Head: head, - } - els = append(els, el) - } - } - s.diff.Set(els...) -} - -func (s *space) syncLoop() { - defer close(s.syncLoopDone) - doSync := func() { - ctx, cancel := context.WithTimeout(s.syncCtx, time.Minute) - defer cancel() - if err := s.sync(ctx); err != nil { - log.Error("periodic sync error", zap.Error(err), zap.String("spaceId", s.id)) - } - } - doSync() - if s.s.conf.SyncPeriod > 0 { - ticker := time.NewTicker(time.Second * time.Duration(s.s.conf.SyncPeriod)) - defer ticker.Stop() - for { - select { - case <-s.syncCtx.Done(): - return - case <-ticker.C: - doSync() - } - } - } -} - -func (s *space) sync(ctx context.Context) error { - peers, err := s.getPeers(ctx) - if err != nil { - return err - } - for _, p := range peers { - if err := s.syncWithPeer(ctx, p); err != nil { - log.Error("can't sync with peer", zap.String("peer", p.Id()), zap.Error(err)) - } - } - return nil -} - -func (s *space) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { - cl := spacesync.NewDRPCSpaceClient(p) - rdiff := remotediff.NewRemoteDiff(s.id, cl) - newIds, changedIds, removedIds, err := s.diff.Diff(ctx, rdiff) - if err != nil { - return nil - } - log.Info("sync done:", zap.Int("newIds", len(newIds)), zap.Int("changedIds", len(changedIds)), zap.Int("removedIds", len(removedIds))) - return -} - -func (s *space) getPeers(ctx context.Context) (peers []peer.Peer, err error) { - if s.conf.IsResponsible(s.id) { - return s.conf.AllPeers(ctx, s.id) - } else { - var p peer.Peer - p, err = s.conf.OnePeer(ctx, s.id) - if err != nil { - return nil, err - } - return []peer.Peer{p}, nil - } -} - -func (s *space) Close() error { - s.syncCancel() - <-s.syncLoopDone - return nil -} diff --git a/service/space/spacesync/spacesync_drpc.pb.go b/service/space/spacesync/spacesync_drpc.pb.go deleted file mode 100644 index a083c7e3..00000000 --- a/service/space/spacesync/spacesync_drpc.pb.go +++ /dev/null @@ -1,113 +0,0 @@ -// Code generated by protoc-gen-go-drpc. DO NOT EDIT. -// protoc-gen-go-drpc version: v0.0.32 -// source: service/space/spacesync/protos/spacesync.proto - -package spacesync - -import ( - bytes "bytes" - context "context" - errors "errors" - jsonpb "github.com/gogo/protobuf/jsonpb" - proto "github.com/gogo/protobuf/proto" - drpc "storj.io/drpc" - drpcerr "storj.io/drpc/drpcerr" -) - -type drpcEncoding_File_service_space_spacesync_protos_spacesync_proto struct{} - -func (drpcEncoding_File_service_space_spacesync_protos_spacesync_proto) Marshal(msg drpc.Message) ([]byte, error) { - return proto.Marshal(msg.(proto.Message)) -} - -func (drpcEncoding_File_service_space_spacesync_protos_spacesync_proto) Unmarshal(buf []byte, msg drpc.Message) error { - return proto.Unmarshal(buf, msg.(proto.Message)) -} - -func (drpcEncoding_File_service_space_spacesync_protos_spacesync_proto) JSONMarshal(msg drpc.Message) ([]byte, error) { - var buf bytes.Buffer - err := new(jsonpb.Marshaler).Marshal(&buf, msg.(proto.Message)) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -func (drpcEncoding_File_service_space_spacesync_protos_spacesync_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error { - return jsonpb.Unmarshal(bytes.NewReader(buf), msg.(proto.Message)) -} - -type DRPCSpaceClient interface { - DRPCConn() drpc.Conn - - HeadSync(ctx context.Context, in *HeadSyncRequest) (*HeadSyncResponse, error) -} - -type drpcSpaceClient struct { - cc drpc.Conn -} - -func NewDRPCSpaceClient(cc drpc.Conn) DRPCSpaceClient { - return &drpcSpaceClient{cc} -} - -func (c *drpcSpaceClient) DRPCConn() drpc.Conn { return c.cc } - -func (c *drpcSpaceClient) HeadSync(ctx context.Context, in *HeadSyncRequest) (*HeadSyncResponse, error) { - out := new(HeadSyncResponse) - err := c.cc.Invoke(ctx, "/anySpace.Space/HeadSync", drpcEncoding_File_service_space_spacesync_protos_spacesync_proto{}, in, out) - if err != nil { - return nil, err - } - return out, nil -} - -type DRPCSpaceServer interface { - HeadSync(context.Context, *HeadSyncRequest) (*HeadSyncResponse, error) -} - -type DRPCSpaceUnimplementedServer struct{} - -func (s *DRPCSpaceUnimplementedServer) HeadSync(context.Context, *HeadSyncRequest) (*HeadSyncResponse, error) { - return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) -} - -type DRPCSpaceDescription struct{} - -func (DRPCSpaceDescription) NumMethods() int { return 1 } - -func (DRPCSpaceDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { - switch n { - case 0: - return "/anySpace.Space/HeadSync", drpcEncoding_File_service_space_spacesync_protos_spacesync_proto{}, - func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { - return srv.(DRPCSpaceServer). - HeadSync( - ctx, - in1.(*HeadSyncRequest), - ) - }, DRPCSpaceServer.HeadSync, true - default: - return "", nil, nil, nil, false - } -} - -func DRPCRegisterSpace(mux drpc.Mux, impl DRPCSpaceServer) error { - return mux.Register(impl, DRPCSpaceDescription{}) -} - -type DRPCSpace_HeadSyncStream interface { - drpc.Stream - SendAndClose(*HeadSyncResponse) error -} - -type drpcSpace_HeadSyncStream struct { - drpc.Stream -} - -func (x *drpcSpace_HeadSyncStream) SendAndClose(m *HeadSyncResponse) error { - if err := x.MsgSend(m, drpcEncoding_File_service_space_spacesync_protos_spacesync_proto{}); err != nil { - return err - } - return x.CloseSend() -} diff --git a/service/sync/document/service.go b/service/sync/document/service.go index 03799c09..b1856b5f 100644 --- a/service/sync/document/service.go +++ b/service/sync/document/service.go @@ -4,11 +4,11 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" @@ -38,7 +38,7 @@ func New() app.Component { return &service{} } -func (s *service) Init(ctx context.Context, a *app.App) (err error) { +func (s *service) Init(a *app.App) (err error) { s.account = a.MustComponent(account.CName).(account.Service) s.messageService = a.MustComponent(message.CName).(message.Service) s.treeCache = a.MustComponent(treecache.CName).(treecache.Service) diff --git a/service/sync/message/service.go b/service/sync/message/service.go index 7207a302..b402a1c4 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -4,6 +4,7 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + pool2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" @@ -20,7 +21,7 @@ const CName = "MessageService" type service struct { nodes []*node.Node requestHandler requesthandler.RequestHandler - pool pool.Pool + pool pool2.Pool sync.RWMutex } @@ -33,10 +34,10 @@ type Service interface { SendToSpaceAsync(spaceId string, msg *syncproto.Sync) error } -func (s *service) Init(ctx context.Context, a *app.App) (err error) { +func (s *service) Init(a *app.App) (err error) { s.requestHandler = a.MustComponent(requesthandler.CName).(requesthandler.RequestHandler) s.nodes = a.MustComponent(node.CName).(node.Service).Nodes() - s.pool = a.MustComponent(pool.CName).(pool.Pool) + s.pool = a.MustComponent(pool2.CName).(pool2.Pool) s.pool.AddHandler(syncproto.MessageType_MessageTypeSync, s.HandleMessage) return nil } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index 2a960104..f7d992e0 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -4,11 +4,11 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" @@ -38,7 +38,7 @@ type MessageSender interface { const CName = "SyncRequestHandler" -func (r *requestHandler) Init(ctx context.Context, a *app.App) (err error) { +func (r *requestHandler) Init(a *app.App) (err error) { r.treeCache = a.MustComponent(treecache.CName).(treecache.Service) r.account = a.MustComponent(account.CName).(account.Service) r.messageService = a.MustComponent("MessageService").(MessageSender) diff --git a/service/treecache/service.go b/service/treecache/service.go index 687300f0..0a422049 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -4,12 +4,12 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/account" "go.uber.org/zap" ) @@ -80,7 +80,7 @@ func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHea return s.Do(ctx, treeId, f) } -func (s *service) Init(ctx context.Context, a *app.App) (err error) { +func (s *service) Init(a *app.App) (err error) { s.cache = ocache.New(s.loadTree) s.account = a.MustComponent(account.CName).(account.Service) s.treeProvider = treestorage.NewInMemoryTreeStorageProvider() From 235c179d6092ec7df83f91417d21a3e7b149cd20 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 8 Sep 2022 23:20:11 +0200 Subject: [PATCH 057/219] Refactor ACLState a little bit --- pkg/acl/{tree => common}/keychain.go | 10 +- pkg/acl/list/aclstate.go | 135 ++++++--------------------- pkg/acl/list/changebuilder.go | 2 +- pkg/acl/list/list.go | 63 ++++++++++--- pkg/acl/list/record.go | 8 +- pkg/acl/tree/change.go | 36 ------- pkg/acl/tree/changebuilder.go | 7 +- pkg/acl/tree/objecttree.go | 3 +- pkg/acl/tree/rawloader.go | 18 ---- pkg/acl/tree/util.go | 18 ++++ 10 files changed, 115 insertions(+), 185 deletions(-) rename pkg/acl/{tree => common}/keychain.go (79%) diff --git a/pkg/acl/tree/keychain.go b/pkg/acl/common/keychain.go similarity index 79% rename from pkg/acl/tree/keychain.go rename to pkg/acl/common/keychain.go index 582a8102..2842ae5e 100644 --- a/pkg/acl/tree/keychain.go +++ b/pkg/acl/common/keychain.go @@ -1,23 +1,23 @@ -package tree +package common import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" ) -type keychain struct { +type Keychain struct { decoder keys.Decoder keys map[string]signingkey.PubKey } -func newKeychain() *keychain { - return &keychain{ +func NewKeychain() *Keychain { + return &Keychain{ decoder: signingkey.NewEDPubKeyDecoder(), keys: make(map[string]signingkey.PubKey), } } -func (k *keychain) getOrAdd(identity string) (signingkey.PubKey, error) { +func (k *Keychain) GetOrAdd(identity string) (signingkey.PubKey, error) { if key, exists := k.keys[identity]; exists { return key, nil } diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index c34e73e8..6765ee99 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -1,11 +1,11 @@ package list import ( - "bytes" "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" @@ -25,6 +25,7 @@ var ErrUserAlreadyExists = errors.New("user already exists") var ErrNoSuchRecord = errors.New("no such record") var ErrInsufficientPermissions = errors.New("insufficient permissions") var ErrNoReadKey = errors.New("acl state doesn't have a read key") +var ErrInvalidSignature = errors.New("signature is invalid") type UserPermissionPair struct { Identity string @@ -32,14 +33,18 @@ type UserPermissionPair struct { } type ACLState struct { - currentReadKeyHash uint64 - userReadKeys map[uint64]*symmetric.Key - userStates map[string]*aclpb.ACLChangeUserState - userInvites map[string]*aclpb.ACLChangeUserInvite + currentReadKeyHash uint64 + userReadKeys map[uint64]*symmetric.Key + userStates map[string]*aclpb.ACLChangeUserState + userInvites map[string]*aclpb.ACLChangeUserInvite + signingPubKeyDecoder keys.Decoder encryptionKey encryptionkey.PrivKey - identity string - permissionsAtRecord map[string][]UserPermissionPair + + identity string + permissionsAtRecord map[string][]UserPermissionPair + + keychain *common.Keychain } func newACLStateWithIdentity( @@ -54,6 +59,7 @@ func newACLStateWithIdentity( userInvites: make(map[string]*aclpb.ACLChangeUserInvite), signingPubKeyDecoder: decoder, permissionsAtRecord: make(map[string][]UserPermissionPair), + keychain: common.NewKeychain(), } } @@ -64,6 +70,7 @@ func newACLState(decoder keys.Decoder) *ACLState { userStates: make(map[string]*aclpb.ACLChangeUserState), userInvites: make(map[string]*aclpb.ACLChangeUserInvite), permissionsAtRecord: make(map[string][]UserPermissionPair), + keychain: common.NewKeychain(), } } @@ -99,7 +106,6 @@ func (st *ACLState) PermissionsAtRecord(id string, identity string) (UserPermiss } func (st *ACLState) applyRecord(record *aclpb.Record) (err error) { - // TODO: this should be probably changed aclData := &aclpb.ACLChangeACLData{} err = proto.Unmarshal(record.Data, aclData) @@ -107,35 +113,37 @@ func (st *ACLState) applyRecord(record *aclpb.Record) (err error) { return } - defer func() { - if err != nil { - return - } - st.currentReadKeyHash = record.CurrentReadKeyHash - }() + err = st.applyChangeData(aclData, record.CurrentReadKeyHash, record.Identity) + if err != nil { + return + } - return st.applyChangeData(aclData, record.CurrentReadKeyHash, record.Identity) + st.currentReadKeyHash = record.CurrentReadKeyHash + return } func (st *ACLState) applyChangeAndUpdate(recordWrapper *Record) (err error) { - change := recordWrapper.Content - aclData := &aclpb.ACLChangeACLData{} + var ( + change = recordWrapper.Content + aclData = &aclpb.ACLChangeACLData{} + ) - if recordWrapper.ParsedModel != nil { - aclData = recordWrapper.ParsedModel.(*aclpb.ACLChangeACLData) + if recordWrapper.Model != nil { + aclData = recordWrapper.Model.(*aclpb.ACLChangeACLData) } else { err = proto.Unmarshal(change.Data, aclData) if err != nil { return } - recordWrapper.ParsedModel = aclData + recordWrapper.Model = aclData } err = st.applyChangeData(aclData, recordWrapper.Content.CurrentReadKeyHash, recordWrapper.Content.Identity) if err != nil { - return err + return } + // getting all permissions for users at record var permissions []UserPermissionPair for _, state := range st.userStates { permission := UserPermissionPair{ @@ -144,8 +152,8 @@ func (st *ACLState) applyChangeAndUpdate(recordWrapper *Record) (err error) { } permissions = append(permissions, permission) } + st.permissionsAtRecord[recordWrapper.Id] = permissions - log.Infof("adding permissions at record %s", recordWrapper.Id) return nil } @@ -243,7 +251,7 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLChangeUserJoin) error { return fmt.Errorf("verification returned error: %w", err) } if !res { - return fmt.Errorf("signature is invalid") + return ErrInvalidSignature } // if ourselves -> we need to decrypt the read keys @@ -374,87 +382,6 @@ func (st *ACLState) isUserAdd(data *aclpb.ACLChangeACLData, identity string) boo return data.GetAclContent() != nil && userAdd != nil && userAdd.GetIdentity() == identity } -func (st *ACLState) getPermissionDecreasedUsers(ch *aclpb.ACLChange) (identities []*aclpb.ACLChangeUserPermissionChange) { - // this should be called after general checks are completed - if ch.GetAclData().GetAclContent() == nil { - return nil - } - - contents := ch.GetAclData().GetAclContent() - for _, c := range contents { - if c.GetUserPermissionChange() != nil { - content := c.GetUserPermissionChange() - - currentState := st.userStates[content.Identity] - // the comparison works in different direction :-) - if content.Permissions > currentState.Permissions { - identities = append(identities, &aclpb.ACLChangeUserPermissionChange{ - Identity: content.Identity, - Permissions: content.Permissions, - }) - } - } - if c.GetUserRemove() != nil { - content := c.GetUserRemove() - identities = append(identities, &aclpb.ACLChangeUserPermissionChange{ - Identity: content.Identity, - Permissions: aclpb.ACLChange_Removed, - }) - } - } - - return identities -} - -func (st *ACLState) equal(other *ACLState) bool { - if st == nil && other == nil { - return true - } - - if st == nil || other == nil { - return false - } - - if st.currentReadKeyHash != other.currentReadKeyHash { - return false - } - - if st.identity != other.identity { - return false - } - - if len(st.userStates) != len(other.userStates) { - return false - } - - for _, st := range st.userStates { - otherSt, exists := other.userStates[st.Identity] - if !exists { - return false - } - - if st.Permissions != otherSt.Permissions { - return false - } - - if bytes.Compare(st.EncryptionKey, otherSt.EncryptionKey) != 0 { - return false - } - } - - if len(st.userInvites) != len(other.userInvites) { - return false - } - - // TODO: add detailed user invites comparison + compare other stuff - return true -} - func (st *ACLState) GetUserStates() map[string]*aclpb.ACLChangeUserState { - // TODO: we should provide better API that would not allow to change this map from the outside return st.userStates } - -func (st *ACLState) isNodeIdentity() bool { - return st.identity == "" -} diff --git a/pkg/acl/list/changebuilder.go b/pkg/acl/list/changebuilder.go index bcdabe62..f5d2fa17 100644 --- a/pkg/acl/list/changebuilder.go +++ b/pkg/acl/list/changebuilder.go @@ -124,7 +124,7 @@ func (c *aclChangeBuilder) BuildAndApply() (*Record, []byte, error) { return nil, nil, err } ch := NewRecord(id, aclRecord) - ch.ParsedModel = c.aclData + ch.Model = c.aclData ch.Sign = signature return ch, fullMarshalledChange, nil diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index acd2b131..ad924714 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -2,17 +2,21 @@ package list import ( "context" + "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" - "go.uber.org/zap" "sync" ) type IterFunc = func(record *Record) (IsContinue bool) +var ErrIncorrectCID = errors.New("incorrect CID") + type RWLocker interface { sync.Locker RLock() @@ -41,6 +45,7 @@ type aclList struct { builder *aclStateBuilder aclState *ACLState + keychain *common.Keychain sync.RWMutex } @@ -54,36 +59,46 @@ func BuildACLList(decoder keys.Decoder, storage storage.ListStorage) (ACLList, e return buildWithACLStateBuilder(newACLStateBuilder(decoder), storage) } -func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStorage) (ACLList, error) { +func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStorage) (list ACLList, err error) { header, err := storage.Header() if err != nil { - return nil, err + return } id, err := storage.ID() if err != nil { - return nil, err + return } rawRecord, err := storage.Head() if err != nil { - return nil, err + return } + keychain := common.NewKeychain() record, err := NewFromRawRecord(rawRecord) if err != nil { - return nil, err + return + } + err = verifyRecord(keychain, rawRecord, record) + if err != nil { + return } records := []*Record{record} for record.Content.PrevId != "" { rawRecord, err = storage.GetRawRecord(context.Background(), record.Content.PrevId) if err != nil { - return nil, err + return } + record, err = NewFromRawRecord(rawRecord) if err != nil { - return nil, err + return + } + err = verifyRecord(keychain, rawRecord, record) + if err != nil { + return } records = append(records, record) } @@ -99,14 +114,12 @@ func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStor indexes[records[len(records)/2].Id] = len(records) / 2 } - log.With(zap.String("head id", records[len(records)-1].Id), zap.String("list id", id)). - Info("building acl tree") state, err := builder.Build(records) if err != nil { - return nil, err + return } - return &aclList{ + list = &aclList{ header: header, records: records, indexes: indexes, @@ -114,7 +127,8 @@ func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStor aclState: state, id: id, RWMutex: sync.RWMutex{}, - }, nil + } + return } func (a *aclList) Records() []*Record { @@ -177,3 +191,26 @@ func (a *aclList) IterateFrom(startId string, iterFunc IterFunc) { func (a *aclList) Close() (err error) { return nil } + +func verifyRecord(keychain *common.Keychain, rawRecord *aclpb.RawRecord, record *Record) (err error) { + identityKey, err := keychain.GetOrAdd(record.Content.Identity) + if err != nil { + return + } + + // verifying signature + res, err := identityKey.Verify(rawRecord.Payload, rawRecord.Signature) + if err != nil { + return + } + if !res { + err = ErrInvalidSignature + return + } + + // verifying ID + if !cid.VerifyCID(rawRecord.Payload, rawRecord.Id) { + err = ErrIncorrectCID + } + return +} diff --git a/pkg/acl/list/record.go b/pkg/acl/list/record.go index 3227db27..724bd94e 100644 --- a/pkg/acl/list/record.go +++ b/pkg/acl/list/record.go @@ -6,10 +6,10 @@ import ( ) type Record struct { - Id string - Content *aclpb.Record - ParsedModel interface{} - Sign []byte + Id string + Content *aclpb.Record + Model interface{} + Sign []byte } func NewRecord(id string, aclRecord *aclpb.Record) *Record { diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index e89cbae6..514cf862 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -56,42 +56,6 @@ func (ch *Change) DecryptContents(key *symmetric.Key) error { return nil } -func NewChangeFromRaw(rawChange *aclpb.RawChange) (*Change, error) { - unmarshalled := &aclpb.Change{} - err := proto.Unmarshal(rawChange.Payload, unmarshalled) - if err != nil { - return nil, err - } - - ch := NewChange(rawChange.Id, unmarshalled, rawChange.Signature) - return ch, nil -} - -func newVerifiedChangeFromRaw( - rawChange *aclpb.RawChange, - kch *keychain) (*Change, error) { - unmarshalled := &aclpb.Change{} - ch, err := NewChangeFromRaw(rawChange) - if err != nil { - return nil, err - } - - identityKey, err := kch.getOrAdd(unmarshalled.Identity) - if err != nil { - return nil, err - } - - res, err := identityKey.Verify(rawChange.Payload, rawChange.Signature) - if err != nil { - return nil, err - } - if !res { - return nil, ErrIncorrectSignature - } - - return ch, nil -} - func NewChange(id string, ch *aclpb.Change, signature []byte) *Change { return &Change{ Next: nil, diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index bdba5382..17c509a4 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -2,6 +2,7 @@ package tree import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" @@ -30,10 +31,10 @@ type ChangeBuilder interface { } type changeBuilder struct { - keys *keychain + keys *common.Keychain } -func newChangeBuilder(keys *keychain) *changeBuilder { +func newChangeBuilder(keys *common.Keychain) *changeBuilder { return &changeBuilder{keys: keys} } @@ -55,7 +56,7 @@ func (c *changeBuilder) ConvertFromRawAndVerify(rawChange *aclpb.RawChange) (ch return nil, err } - identityKey, err := c.keys.getOrAdd(unmarshalled.Identity) + identityKey, err := c.keys.GetOrAdd(unmarshalled.Identity) if err != nil { return } diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 2fc0eaa5..d7da4961 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -4,6 +4,7 @@ import ( "context" "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" @@ -112,7 +113,7 @@ func defaultObjectTreeDeps( listener ObjectTreeUpdateListener, aclList list.ACLList) objectTreeDeps { - keychain := newKeychain() + keychain := common.NewKeychain() changeBuilder := newChangeBuilder(keychain) treeBuilder := newTreeBuilder(treeStorage, changeBuilder) return objectTreeDeps{ diff --git a/pkg/acl/tree/rawloader.go b/pkg/acl/tree/rawloader.go index 43854a29..9a78f13e 100644 --- a/pkg/acl/tree/rawloader.go +++ b/pkg/acl/tree/rawloader.go @@ -235,21 +235,3 @@ func (r *rawChangeLoader) loadEntry(id string) (entry rawCacheEntry, err error) } return } - -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/pkg/acl/tree/util.go b/pkg/acl/tree/util.go index 0e6cc7cd..baf7be14 100644 --- a/pkg/acl/tree/util.go +++ b/pkg/acl/tree/util.go @@ -27,3 +27,21 @@ 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 +} From 0685f401f3d94a6853b4de035a48c80b75fbf181 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 9 Sep 2022 09:01:50 +0200 Subject: [PATCH 058/219] Change tree Rebuild checks --- pkg/acl/tree/tree.go | 67 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go index 549d7f84..04dc8009 100644 --- a/pkg/acl/tree/tree.go +++ b/pkg/acl/tree/tree.go @@ -82,9 +82,11 @@ func (t *Tree) AddMergedHead(c *Change) error { } func (t *Tree) Add(changes ...*Change) (mode Mode) { - var beforeHeadIds = t.headIds - var attached bool - var empty = t.Len() == 0 + var ( + beforeHeadIds = t.headIds + attached bool + empty = t.Len() == 0 + ) for _, c := range changes { // ignore existing if _, ok := t.attached[c.Id]; ok { @@ -103,16 +105,28 @@ func (t *Tree) Add(changes ...*Change) (mode Mode) { if empty { return Rebuild } - for _, hid := range beforeHeadIds { - for _, newCh := range changes { - if _, ok := t.attached[newCh.Id]; ok { - if !t.after(newCh.Id, hid) { - return Rebuild + + stack := make([]*Change, len(beforeHeadIds), len(beforeHeadIds)) + for i, hid := range beforeHeadIds { + stack[i] = t.attached[hid] + } + + mode = Append + t.dfsNext(stack, + func(_ *Change) (isContinue bool) { + return true + }, + func(_ []*Change) { + // checking if some new changes were not visited + for _, ch := range changes { + if !ch.visited { + mode = Rebuild + break } } - } - } - return Append + }) + + return mode } // RemoveInvalidChange removes all the changes that are descendants of id @@ -311,6 +325,37 @@ func (t *Tree) dfsPrev(stack []*Change, breakpoints []string, visit func(ch *Cha } } +func (t *Tree) dfsNext(stack []*Change, visit func(ch *Change) (isContinue bool), afterVisit func([]*Change)) { + t.visitedBuf = t.visitedBuf[:0] + + defer func() { + afterVisit(t.visitedBuf) + for _, ch := range t.visitedBuf { + ch.visited = false + } + }() + + for len(stack) > 0 { + ch := stack[len(stack)-1] + stack = stack[:len(stack)-1] + if ch.visited { + continue + } + + ch.visited = true + t.visitedBuf = append(t.visitedBuf, ch) + + for _, next := range ch.Next { + if !next.visited { + stack = append(stack, next) + } + } + if !visit(ch) { + return + } + } +} + func (t *Tree) updateHeads() { var newHeadIds []string t.iterate(t.root, func(c *Change) (isContinue bool) { From 74ebcc5616aae68aacfd6d0c4c75acfcf24dd8ef Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 9 Sep 2022 09:45:25 +0200 Subject: [PATCH 059/219] Few more changes and tree fixes --- pkg/acl/tree/tree.go | 32 ++++++++++++++++++++++++-------- pkg/acl/tree/treeiterator.go | 8 ++++---- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go index 04dc8009..902a9c16 100644 --- a/pkg/acl/tree/tree.go +++ b/pkg/acl/tree/tree.go @@ -106,11 +106,14 @@ func (t *Tree) Add(changes ...*Change) (mode Mode) { return Rebuild } + // beforeHeadsIds is definitely not empty, because the tree is not empty stack := make([]*Change, len(beforeHeadIds), len(beforeHeadIds)) for i, hid := range beforeHeadIds { stack[i] = t.attached[hid] } + // mode is Append for cases when we can safely start iterating + // from old heads to append the state mode = Append t.dfsNext(stack, func(_ *Change) (isContinue bool) { @@ -119,6 +122,12 @@ func (t *Tree) Add(changes ...*Change) (mode Mode) { func(_ []*Change) { // checking if some new changes were not visited for _, ch := range changes { + // if the change was not added, then skipping + if _, ok := t.attached[ch.Id]; !ok { + continue + } + // if some new change was not visited, + // then we can't start from old heads, we need to start from root, so Rebuild if !ch.visited { mode = Rebuild break @@ -297,7 +306,9 @@ func (t *Tree) dfsPrev(stack []*Change, breakpoints []string, visit func(ch *Cha } defer func() { - afterVisit(t.visitedBuf) + if afterVisit != nil { + afterVisit(t.visitedBuf) + } for _, ch := range t.visitedBuf { ch.visited = false } @@ -329,7 +340,9 @@ func (t *Tree) dfsNext(stack []*Change, visit func(ch *Change) (isContinue bool) t.visitedBuf = t.visitedBuf[:0] defer func() { - afterVisit(t.visitedBuf) + if afterVisit != nil { + afterVisit(t.visitedBuf) + } for _, ch := range t.visitedBuf { ch.visited = false } @@ -358,12 +371,15 @@ func (t *Tree) dfsNext(stack []*Change, visit func(ch *Change) (isContinue bool) func (t *Tree) updateHeads() { var newHeadIds []string - t.iterate(t.root, func(c *Change) (isContinue bool) { - if len(c.Next) == 0 { - newHeadIds = append(newHeadIds, c.Id) - } - return true - }) + t.dfsNext( + []*Change{t.root}, + func(ch *Change) (isContinue bool) { + if len(ch.Next) == 0 { + newHeadIds = append(newHeadIds, ch.Id) + } + return true + }, + nil) t.headIds = newHeadIds sort.Strings(t.headIds) } diff --git a/pkg/acl/tree/treeiterator.go b/pkg/acl/tree/treeiterator.go index eb42f7b4..cee20c7e 100644 --- a/pkg/acl/tree/treeiterator.go +++ b/pkg/acl/tree/treeiterator.go @@ -46,20 +46,20 @@ func (i *iterator) topSort(start *Change) { ch := stack[len(stack)-1] stack = stack[:len(stack)-1] - // this looks a bit clumsy, but the idea is that we will go through the change again as soon as we finished - // going through its branches + // here we visit the change second time to add it to results + // all next changes at this point were visited if ch.branchesFinished { i.resBuf = append(i.resBuf, ch) ch.branchesFinished = false continue } - // in theory, it may be the case that we add the change two times - // but probably due to the way how we build the tree, we won't need it if ch.visited { continue } + // put the change again into stack, so we can add it to results + // after all the next changes stack = append(stack, ch) ch.visited = true ch.branchesFinished = true From 639cc302d2c5cbeb1234c507ea5c2ef5b49ee0b0 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 11 Sep 2022 18:45:47 +0200 Subject: [PATCH 060/219] Fix tree append logic, validtate only new changes and check unattached changes which were added at this round --- pkg/acl/tree/changebuilder.go | 18 +++++- pkg/acl/tree/changevalidator.go | 77 +++++++++++++---------- pkg/acl/tree/objecttree.go | 106 ++++++++++++++++++++++---------- pkg/acl/tree/objecttree_test.go | 39 +++++++----- pkg/acl/tree/rawloader.go | 10 +-- pkg/acl/tree/tree.go | 85 ++++++++++++++----------- pkg/acl/tree/tree_test.go | 26 +++++--- pkg/acl/tree/treereduce.go | 2 +- 8 files changed, 225 insertions(+), 138 deletions(-) diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index 17c509a4..edaa93a2 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -28,13 +28,14 @@ type ChangeBuilder interface { ConvertFromRaw(rawChange *aclpb.RawChange) (ch *Change, err error) ConvertFromRawAndVerify(rawChange *aclpb.RawChange) (ch *Change, err error) BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawChange, err error) + BuildRaw(ch *Change) (*aclpb.RawChange, error) } type changeBuilder struct { keys *common.Keychain } -func newChangeBuilder(keys *common.Keychain) *changeBuilder { +func newChangeBuilder(keys *common.Keychain) ChangeBuilder { return &changeBuilder{keys: keys} } @@ -125,3 +126,18 @@ func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, raw *a } return } + +func (c *changeBuilder) BuildRaw(ch *Change) (raw *aclpb.RawChange, err error) { + var marshalled []byte + marshalled, err = ch.Content.Marshal() + if err != nil { + return + } + + raw = &aclpb.RawChange{ + Payload: marshalled, + Signature: ch.Signature(), + Id: ch.Id, + } + return +} diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index f0dfbdc7..2f582c33 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -7,8 +7,10 @@ import ( ) type ObjectTreeValidator interface { - // ValidateTree should always be entered while holding a read lock on ACLList - ValidateTree(tree *Tree, aclList list.ACLList) error + // ValidateFullTree should always be entered while holding a read lock on ACLList + ValidateFullTree(tree *Tree, aclList list.ACLList) error + // ValidateNewChanges should always be entered while holding a read lock on ACLList + ValidateNewChanges(tree *Tree, aclList list.ACLList, newChanges []*Change) error } type objectTreeValidator struct{} @@ -17,42 +19,55 @@ func newTreeValidator() ObjectTreeValidator { return &objectTreeValidator{} } -func (v *objectTreeValidator) ValidateTree(tree *Tree, aclList list.ACLList) (err error) { +func (v *objectTreeValidator) ValidateFullTree(tree *Tree, aclList list.ACLList) (err error) { + tree.Iterate(tree.RootId(), func(c *Change) (isContinue bool) { + err = v.validateChange(tree, aclList, c) + return err == nil + }) + return err +} +func (v *objectTreeValidator) ValidateNewChanges(tree *Tree, aclList list.ACLList, newChanges []*Change) (err error) { + for _, c := range newChanges { + err = v.validateChange(tree, aclList, c) + if err != nil { + return + } + } + return +} + +func (v *objectTreeValidator) validateChange(tree *Tree, aclList list.ACLList, c *Change) (err error) { var ( perm list.UserPermissionPair state = aclList.ACLState() ) + // checking if the user could write + perm, err = state.PermissionsAtRecord(c.Content.AclHeadId, c.Content.Identity) + if err != nil { + return + } - tree.Iterate(tree.RootId(), func(c *Change) (isContinue bool) { - // checking if the user could write - perm, err = state.PermissionsAtRecord(c.Content.AclHeadId, c.Content.Identity) + if perm.Permission != aclpb.ACLChange_Writer && perm.Permission != aclpb.ACLChange_Admin { + err = list.ErrInsufficientPermissions + return + } + + // checking if the change refers to later acl heads than its previous ids + for _, id := range c.PreviousIds { + prevChange := tree.attached[id] + if prevChange.Content.AclHeadId == c.Content.AclHeadId { + continue + } + var after bool + after, err = aclList.IsAfter(c.Content.AclHeadId, prevChange.Content.AclHeadId) if err != nil { - return false + return } - - if perm.Permission != aclpb.ACLChange_Writer && perm.Permission != aclpb.ACLChange_Admin { - err = list.ErrInsufficientPermissions - return false + if !after { + err = fmt.Errorf("current acl head id (%s) should be after each of the previous ones (%s)", c.Content.AclHeadId, prevChange.Content.AclHeadId) + return } - - // checking if the change refers to later acl heads than its previous ids - for _, id := range c.PreviousIds { - prevChange := tree.attached[id] - if prevChange.Content.AclHeadId == c.Content.AclHeadId { - continue - } - var after bool - after, err = aclList.IsAfter(c.Content.AclHeadId, prevChange.Content.AclHeadId) - if err != nil { - return false - } - if !after { - err = fmt.Errorf("current acl head id (%s) should be after each of the previous ones (%s)", c.Content.AclHeadId, prevChange.Content.AclHeadId) - return false - } - } - return true - }) - return err + } + return } diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index d7da4961..114e61ba 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -31,18 +31,12 @@ var ( type AddResultSummary int -const ( - AddResultSummaryNothing AddResultSummary = iota - AddResultSummaryAppend - AddResultSummaryRebuild -) - type AddResult struct { OldHeads []string Heads []string Added []*aclpb.RawChange - Summary AddResultSummary + Mode Mode } type ChangeIterateFunc = func(change *Change) bool @@ -198,7 +192,9 @@ func (ot *objectTree) rebuildFromStorage(newChanges []*Change) (err error) { // but obviously they are not roots, because of the way how we construct the tree ot.tree.clearPossibleRoots() - return ot.validateTree() + // it is a good question whether we need to validate everything + // because maybe we can trust the stuff that is already in the storage + return ot.validateTree(nil) } func (ot *objectTree) ID() string { @@ -324,7 +320,11 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra // filtering changes, verifying and unmarshalling them for idx, ch := range rawChanges { - if ot.HasChange(ch.Id) { + // not unmarshalling the changes if they were already added either as unattached or attached + if _, exists := ot.tree.attached[ch.Id]; exists { + continue + } + if _, exists := ot.tree.unAttached[ch.Id]; exists { continue } @@ -346,29 +346,54 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra addResult = AddResult{ OldHeads: prevHeadsCopy, Heads: prevHeadsCopy, - Summary: AddResultSummaryNothing, + Mode: Nothing, } return } - // returns changes that we added to the tree - getAddedChanges := func() []*aclpb.RawChange { - var added []*aclpb.RawChange + // returns changes that we added to the tree as attached this round + // they can include not only the changes that were added now, + // but also the changes that were previously in the tree + getAddedChanges := func(toConvert []*Change) (added []*aclpb.RawChange, err error) { + alreadyConverted := make(map[*Change]struct{}) + + // first we see if we have already unmarshalled those changes for _, idx := range ot.notSeenIdxBuf { rawChange := rawChanges[idx] - if _, exists := ot.tree.attached[rawChange.Id]; exists { + if ch, exists := ot.tree.attached[rawChange.Id]; exists { + if len(toConvert) != 0 { + alreadyConverted[ch] = struct{}{} + } added = append(added, rawChange) } } - return added + // this will happen in case we called rebuild from storage + // or if all the changes that we added were contained in current add request + // (this what would happen in most cases) + if len(toConvert) == 0 || len(added) == len(toConvert) { + return + } + + // but in some cases it may happen that the changes that were added this round + // were contained in unattached from previous requests + for _, ch := range toConvert { + // if we got some changes that we need to convert to raw + if _, exists := alreadyConverted[ch]; !exists { + var raw *aclpb.RawChange + raw, err = ot.changeBuilder.BuildRaw(ch) + if err != nil { + return + } + added = append(added, raw) + } + } + return } - rollback := func() { - for _, ch := range ot.tmpChangesBuf { + rollback := func(changes []*Change) { + for _, ch := range changes { if _, exists := ot.tree.attached[ch.Id]; exists { delete(ot.tree.attached, ch.Id) - } else if _, exists := ot.tree.unAttached[ch.Id]; exists { - delete(ot.tree.unAttached, ch.Id) } } } @@ -396,43 +421,56 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra ot.rebuildFromStorage(nil) return } + var added []*aclpb.RawChange + added, err = getAddedChanges(nil) + // we shouldn't get any error in this case + if err != nil { + panic(err) + } addResult = AddResult{ OldHeads: prevHeadsCopy, Heads: headsCopy(), - Added: getAddedChanges(), - Summary: AddResultSummaryRebuild, + Added: added, + Mode: Rebuild, } return } } // normal mode of operation, where we don't need to rebuild from database - mode = ot.tree.Add(ot.tmpChangesBuf...) + mode, treeChangesAdded := ot.tree.Add(ot.tmpChangesBuf...) switch mode { case Nothing: addResult = AddResult{ OldHeads: prevHeadsCopy, Heads: prevHeadsCopy, - Summary: AddResultSummaryNothing, + Mode: mode, } return default: - // just rebuilding the state from start without reloading everything from tree storage - // as an optimization we could've started from current heads, but I didn't implement that - err = ot.validateTree() + // we need to validate only newly added changes + err = ot.validateTree(treeChangesAdded) if err != nil { - rollback() + rollback(treeChangesAdded) err = ErrHasInvalidChanges return } + var added []*aclpb.RawChange + added, err = getAddedChanges(treeChangesAdded) + 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) + return + } addResult = AddResult{ OldHeads: prevHeadsCopy, Heads: headsCopy(), - Added: getAddedChanges(), - Summary: AddResultSummaryAppend, + Added: added, + Mode: mode, } } return @@ -478,8 +516,7 @@ func (ot *objectTree) IterateFrom(id string, convert ChangeConvertFunc, iterate func (ot *objectTree) HasChange(s string) bool { _, attachedExists := ot.tree.attached[s] - _, unattachedExists := ot.tree.unAttached[s] - return attachedExists || unattachedExists + return attachedExists } func (ot *objectTree) Heads() []string { @@ -552,7 +589,7 @@ func (ot *objectTree) snapshotPathIsActual() bool { return len(ot.snapshotPath) != 0 && ot.snapshotPath[0] == ot.tree.RootId() } -func (ot *objectTree) validateTree() error { +func (ot *objectTree) validateTree(newChanges []*Change) error { ot.aclList.RLock() defer ot.aclList.RUnlock() state := ot.aclList.ACLState() @@ -563,8 +600,11 @@ func (ot *objectTree) validateTree() error { ot.keys[key] = value } } + if len(newChanges) == 0 { + return ot.validator.ValidateFullTree(ot.tree, ot.aclList) + } - return ot.validator.ValidateTree(ot.tree, ot.aclList) + return ot.validator.ValidateNewChanges(ot.tree, ot.aclList, newChanges) } func (ot *objectTree) DebugDump() (string, error) { diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index a27c9cc1..991eddd7 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -7,7 +7,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" @@ -43,29 +42,33 @@ func (c *mockChangeCreator) createNewTreeStorage(treeId, aclListId, aclHeadId, f return treeStorage } -type mockChangeBuilder struct{} +type mockChangeBuilder struct { + originalBuilder ChangeBuilder +} func (c *mockChangeBuilder) ConvertFromRaw(rawChange *aclpb.RawChange) (ch *Change, err error) { - unmarshalled := &aclpb.Change{} - err = proto.Unmarshal(rawChange.Payload, unmarshalled) - if err != nil { - return nil, err - } - - ch = NewChange(rawChange.Id, unmarshalled, rawChange.Signature) - return + return c.originalBuilder.ConvertFromRaw(rawChange) } + func (c *mockChangeBuilder) ConvertFromRawAndVerify(rawChange *aclpb.RawChange) (ch *Change, err error) { - return c.ConvertFromRaw(rawChange) + return c.originalBuilder.ConvertFromRaw(rawChange) } func (c *mockChangeBuilder) BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawChange, err error) { panic("implement me") } +func (c *mockChangeBuilder) BuildRaw(ch *Change) (raw *aclpb.RawChange, err error) { + return c.originalBuilder.BuildRaw(ch) +} + type mockChangeValidator struct{} -func (m *mockChangeValidator) ValidateTree(tree *Tree, aclList list.ACLList) error { +func (m *mockChangeValidator) ValidateNewChanges(tree *Tree, aclList list.ACLList, newChanges []*Change) error { + return nil +} + +func (m *mockChangeValidator) ValidateFullTree(tree *Tree, aclList list.ACLList) error { return nil } @@ -90,7 +93,9 @@ func prepareACLList(t *testing.T) list.ACLList { func prepareTreeContext(t *testing.T, aclList list.ACLList) testTreeContext { changeCreator := &mockChangeCreator{} treeStorage := changeCreator.createNewTreeStorage("treeId", aclList.ID(), aclList.Head().Id, "0") - changeBuilder := &mockChangeBuilder{} + changeBuilder := &mockChangeBuilder{ + originalBuilder: newChangeBuilder(nil), + } deps := objectTreeDeps{ changeBuilder: changeBuilder, treeBuilder: newTreeBuilder(treeStorage, changeBuilder), @@ -142,7 +147,7 @@ func TestObjectTree(t *testing.T) { assert.Equal(t, []string{"0"}, res.OldHeads) assert.Equal(t, []string{"2"}, res.Heads) assert.Equal(t, len(rawChanges), len(res.Added)) - assert.Equal(t, AddResultSummaryAppend, res.Summary) + assert.Equal(t, Append, res.Mode) // check tree heads assert.Equal(t, []string{"2"}, objTree.Heads()) @@ -202,7 +207,7 @@ func TestObjectTree(t *testing.T) { assert.Equal(t, []string{"0"}, res.OldHeads) assert.Equal(t, []string{"0"}, res.Heads) assert.Equal(t, 0, len(res.Added)) - assert.Equal(t, AddResultSummaryNothing, res.Summary) + assert.Equal(t, Nothing, res.Mode) // check tree heads assert.Equal(t, []string{"0"}, objTree.Heads()) @@ -227,7 +232,7 @@ func TestObjectTree(t *testing.T) { assert.Equal(t, []string{"0"}, res.OldHeads) assert.Equal(t, []string{"4"}, res.Heads) assert.Equal(t, len(rawChanges), len(res.Added)) - assert.Equal(t, AddResultSummaryAppend, res.Summary) + assert.Equal(t, Append, res.Mode) // check tree heads assert.Equal(t, []string{"4"}, objTree.Heads()) @@ -448,7 +453,7 @@ func TestObjectTree(t *testing.T) { assert.Equal(t, []string{"3"}, res.OldHeads) assert.Equal(t, []string{"6"}, res.Heads) assert.Equal(t, len(rawChanges), len(res.Added)) - assert.Equal(t, AddResultSummaryRebuild, res.Summary) + assert.Equal(t, Rebuild, res.Mode) // check tree heads assert.Equal(t, []string{"6"}, objTree.Heads()) diff --git a/pkg/acl/tree/rawloader.go b/pkg/acl/tree/rawloader.go index 9a78f13e..424fa2c2 100644 --- a/pkg/acl/tree/rawloader.go +++ b/pkg/acl/tree/rawloader.go @@ -37,17 +37,11 @@ func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb. convert := func(chs []*Change) (rawChanges []*aclpb.RawChange, err error) { for _, ch := range chs { - var marshalled []byte - marshalled, err = ch.Content.Marshal() + var raw *aclpb.RawChange + raw, err = r.changeBuilder.BuildRaw(ch) if err != nil { return } - - raw := &aclpb.RawChange{ - Payload: marshalled, - Signature: ch.Signature(), - Id: ch.Id, - } rawChanges = append(rawChanges, raw) } return diff --git a/pkg/acl/tree/tree.go b/pkg/acl/tree/tree.go index 902a9c16..80bbb78c 100644 --- a/pkg/acl/tree/tree.go +++ b/pkg/acl/tree/tree.go @@ -16,11 +16,12 @@ const ( ) type Tree struct { - root *Change - headIds []string - metaHeadIds []string - attached map[string]*Change - unAttached map[string]*Change + root *Change + headIds []string + lastIteratedHeadId string + metaHeadIds []string + attached map[string]*Change + unAttached map[string]*Change // missed id -> list of dependency ids waitList map[string][]string invalidChanges map[string]struct{} @@ -29,6 +30,7 @@ type Tree struct { // bufs visitedBuf []*Change stackBuf []*Change + addedBuf []*Change duplicateEvents int } @@ -44,7 +46,8 @@ func (t *Tree) Root() *Change { return t.root } -func (t *Tree) AddFast(changes ...*Change) { +func (t *Tree) AddFast(changes ...*Change) []*Change { + t.addedBuf = t.addedBuf[:0] for _, c := range changes { // ignore existing if _, ok := t.attached[c.Id]; ok { @@ -55,6 +58,7 @@ func (t *Tree) AddFast(changes ...*Change) { t.add(c) } t.updateHeads() + return t.addedBuf } func (t *Tree) AddMergedHead(c *Change) error { @@ -81,11 +85,12 @@ func (t *Tree) AddMergedHead(c *Change) error { return nil } -func (t *Tree) Add(changes ...*Change) (mode Mode) { +func (t *Tree) Add(changes ...*Change) (mode Mode, added []*Change) { + t.addedBuf = t.addedBuf[:0] var ( - beforeHeadIds = t.headIds - attached bool - empty = t.Len() == 0 + // this is previous head id which should have been iterated last + lastIteratedHeadId = t.lastIteratedHeadId + empty = t.Len() == 0 ) for _, c := range changes { // ignore existing @@ -94,40 +99,43 @@ func (t *Tree) Add(changes ...*Change) (mode Mode) { } else if _, ok := t.unAttached[c.Id]; ok { continue } - if t.add(c) { - attached = true - } + t.add(c) } - if !attached { - return Nothing + if len(t.addedBuf) == 0 { + mode = Nothing + return } t.updateHeads() + added = t.addedBuf + if empty { - return Rebuild + mode = Rebuild + return } - // beforeHeadsIds is definitely not empty, because the tree is not empty - stack := make([]*Change, len(beforeHeadIds), len(beforeHeadIds)) - for i, hid := range beforeHeadIds { - stack[i] = t.attached[hid] - } - - // mode is Append for cases when we can safely start iterating - // from old heads to append the state + // mode is Append for cases when we can safely start iterating from lastIteratedHeadId to build state + // the idea here is that if all new changes have lastIteratedHeadId as previous, + // then according to topological sorting order they will be looked at later than lastIteratedHeadId + // + // one important consideration is that if some unattached changes were added to the tree + // as a result of adding new changes, then each of these unattached changes + // will also have at least one of new changes as ancestor + // and that means they will also be iterated later than lastIteratedHeadId mode = Append - t.dfsNext(stack, + t.dfsNext([]*Change{t.attached[lastIteratedHeadId]}, func(_ *Change) (isContinue bool) { return true }, func(_ []*Change) { // checking if some new changes were not visited for _, ch := range changes { - // if the change was not added, then skipping + // if the change was not added to the tree, then skipping if _, ok := t.attached[ch.Id]; !ok { continue } // if some new change was not visited, - // then we can't start from old heads, we need to start from root, so Rebuild + // then we can't start from lastIteratedHeadId, + // we need to start from root, so Rebuild if !ch.visited { mode = Rebuild break @@ -135,7 +143,7 @@ func (t *Tree) Add(changes ...*Change) (mode Mode) { } }) - return mode + return } // RemoveInvalidChange removes all the changes that are descendants of id @@ -190,6 +198,7 @@ func (t *Tree) add(c *Change) (attached bool) { if t.root == nil { // first element t.root = c + t.lastIteratedHeadId = t.root.Id t.attached = map[string]*Change{ c.Id: c, } @@ -197,6 +206,7 @@ func (t *Tree) add(c *Change) (attached bool) { t.waitList = make(map[string][]string) t.invalidChanges = make(map[string]struct{}) t.possibleRoots = make([]*Change, 0, 10) + t.addedBuf = append(t.addedBuf, c) return true } if len(c.PreviousIds) > 1 { @@ -238,6 +248,7 @@ func (t *Tree) canAttach(c *Change) (attach bool) { func (t *Tree) attach(c *Change, newEl bool) { t.attached[c.Id] = c + t.addedBuf = append(t.addedBuf, c) if !newEl { delete(t.unAttached, c.Id) } @@ -371,16 +382,16 @@ func (t *Tree) dfsNext(stack []*Change, visit func(ch *Change) (isContinue bool) func (t *Tree) updateHeads() { var newHeadIds []string - t.dfsNext( - []*Change{t.root}, - func(ch *Change) (isContinue bool) { - if len(ch.Next) == 0 { - newHeadIds = append(newHeadIds, ch.Id) - } - return true - }, - nil) + t.iterate(t.root, func(c *Change) (isContinue bool) { + if len(c.Next) == 0 { + newHeadIds = append(newHeadIds, c.Id) + } + return true + }) t.headIds = newHeadIds + // the lastIteratedHeadId is the id of the head which was iterated last according to the order + t.lastIteratedHeadId = newHeadIds[len(newHeadIds)-1] + // TODO: check why do we need sorting here sort.Strings(t.headIds) } diff --git a/pkg/acl/tree/tree_test.go b/pkg/acl/tree/tree_test.go index ff228e43..4c7f5ae7 100644 --- a/pkg/acl/tree/tree_test.go +++ b/pkg/acl/tree/tree_test.go @@ -29,19 +29,22 @@ func newSnapshot(id, snapshotId string, prevIds ...string) *Change { func TestTree_Add(t *testing.T) { t.Run("add first el", func(t *testing.T) { tr := new(Tree) - assert.Equal(t, Rebuild, tr.Add(newSnapshot("root", ""))) + res, _ := tr.Add(newSnapshot("root", "")) + assert.Equal(t, Rebuild, res) assert.Equal(t, tr.root.Id, "root") assert.Equal(t, []string{"root"}, tr.Heads()) }) t.Run("linear add", func(t *testing.T) { tr := new(Tree) - assert.Equal(t, Rebuild, tr.Add( + res, _ := tr.Add( newSnapshot("root", ""), newChange("one", "root", "root"), newChange("two", "root", "one"), - )) + ) + assert.Equal(t, Rebuild, res) assert.Equal(t, []string{"two"}, tr.Heads()) - assert.Equal(t, Append, tr.Add(newChange("three", "root", "two"))) + res, _ = tr.Add(newChange("three", "root", "two")) + assert.Equal(t, Append, res) el := tr.root var ids []string for el != nil { @@ -57,17 +60,19 @@ func TestTree_Add(t *testing.T) { }) t.Run("branch", func(t *testing.T) { tr := new(Tree) - assert.Equal(t, Rebuild, tr.Add( + res, _ := tr.Add( newSnapshot("root", ""), newChange("1", "root", "root"), newChange("2", "root", "1"), - )) + ) + assert.Equal(t, Rebuild, res) assert.Equal(t, []string{"2"}, tr.Heads()) - assert.Equal(t, Rebuild, tr.Add( + res, _ = tr.Add( newChange("1.2", "root", "1.1"), newChange("1.3", "root", "1.2"), newChange("1.1", "root", "1"), - )) + ) + assert.Equal(t, Rebuild, res) assert.Len(t, tr.attached["1"].Next, 2) assert.Len(t, tr.unAttached, 0) assert.Len(t, tr.attached, 6) @@ -75,7 +80,7 @@ func TestTree_Add(t *testing.T) { }) t.Run("branch union", func(t *testing.T) { tr := new(Tree) - assert.Equal(t, Rebuild, tr.Add( + res, _ := tr.Add( newSnapshot("root", ""), newChange("1", "root", "root"), newChange("2", "root", "1"), @@ -84,7 +89,8 @@ func TestTree_Add(t *testing.T) { newChange("1.1", "root", "1"), newChange("3", "root", "2", "1.3"), newChange("4", "root", "3"), - )) + ) + assert.Equal(t, Rebuild, res) assert.Len(t, tr.unAttached, 0) assert.Len(t, tr.attached, 8) assert.Equal(t, []string{"4"}, tr.Heads()) diff --git a/pkg/acl/tree/treereduce.go b/pkg/acl/tree/treereduce.go index 98532339..0cd201d9 100644 --- a/pkg/acl/tree/treereduce.go +++ b/pkg/acl/tree/treereduce.go @@ -51,7 +51,7 @@ func (t *Tree) makeRootAndRemove(start *Change) { }, func(changes []*Change) { for _, ch := range changes { - delete(t.unAttached, ch.Id) + delete(t.attached, ch.Id) } }, ) From 9976a84d42280b653e27ee1a24d08f8353c90a17 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 12 Sep 2022 21:06:20 +0200 Subject: [PATCH 061/219] WIP proto refactoring --- Makefile | 2 +- .../spacesyncproto/protos/spacesync.proto | 44 +- .../spacesyncproto/spacesync.pb.go | 1625 ++++++- pkg/acl/account/accountdata.go | 2 +- pkg/acl/aclchanges/aclpb/aclchanges.pb.go | 3857 ++++++++--------- .../aclchanges/aclpb/protos/aclchanges.proto | 249 +- pkg/acl/list/aclstate.go | 104 +- pkg/acl/list/aclstatebuilder.go | 4 +- pkg/acl/list/changebuilder.go | 20 +- pkg/acl/list/list.go | 28 +- pkg/acl/list/list_test.go | 8 +- pkg/acl/list/record.go | 33 +- pkg/acl/storage/inmemory.go | 32 +- pkg/acl/storage/liststorage.go | 6 +- pkg/acl/storage/provider.go | 8 +- pkg/acl/storage/treestorage.go | 4 +- .../acllistbuilder/liststoragebuilder.go | 40 +- .../liststoragebuildergraph_nix.go | 4 +- .../testutils/testchanges/proto/test.pb.go | 210 +- pkg/acl/tree/change.go | 10 +- pkg/acl/tree/changebuilder.go | 142 +- pkg/acl/tree/changevalidator.go | 2 +- pkg/acl/tree/objecttree.go | 101 +- pkg/acl/tree/objecttree_test.go | 21 +- pkg/acl/tree/objecttreefactory.go | 161 + pkg/acl/tree/rawloader.go | 16 +- pkg/acl/tree/signablecontent.go | 5 +- pkg/acl/tree/tests/benches_test.go | 91 + pkg/acl/tree/treebuilder.go | 2 +- pkg/acl/tree/treestorage.go | 91 - service/storage/service.go | 2 +- syncproto/proto/sync.proto | 41 - syncproto/sync.pb.go | 2300 +--------- 33 files changed, 4328 insertions(+), 4937 deletions(-) create mode 100644 pkg/acl/tree/objecttreefactory.go create mode 100644 pkg/acl/tree/tests/benches_test.go delete mode 100644 pkg/acl/tree/treestorage.go diff --git a/Makefile b/Makefile index f7c161d1..b004f35e 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ proto: $(GOGO_START) protoc --gogofaster_out=:. $(P_TEST_CHANGES_PATH_PB)/proto/*.proto $(eval PKGMAP := $$(P_ACL_CHANGES)) $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. $(P_SYNC_CHANGES_PATH_PB)/proto/*.proto - $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. service/space/spacesync/protos/*.proto + $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. common/commonspace/spacesyncproto/protos/*.proto build: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index 0a1e434d..16fbdd14 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -1,16 +1,17 @@ syntax = "proto3"; package anySpace; + option go_package = "common/commonspace/spacesyncproto"; +import "pkg/acl/aclchanges/aclpb/protos/aclchanges.proto"; enum ErrCodes { Unexpected = 0; } - service Space { // HeadSync compares all objects and their hashes in a space rpc HeadSync(HeadSyncRequest) returns (HeadSyncResponse); - rpc Stream( stream Msg) returns (stream Msg); + rpc Stream(stream ObjectSyncMessage) returns (stream ObjectSyncMessage); } // TODO: temporary mock message @@ -18,8 +19,6 @@ message Msg { string spaceId = 1; } - - // HeadSyncRange presenting a request for one range message HeadSyncRange { uint64 from = 1; @@ -50,3 +49,40 @@ message HeadSyncRequest { message HeadSyncResponse { repeated HeadSyncResult results = 1; } + +// ObjectSyncMessage is a message sent on object sync +message ObjectSyncMessage { + string spaceId = 1; + ObjectSyncContentValue content = 2; + acl.TreeHeader treeHeader = 3; + string treeId = 4; +} + +// ObjectSyncContentValue provides different types for object sync +message ObjectSyncContentValue { + oneof value { + ObjectHeadUpdate headUpdate = 1; + ObjectFullSyncRequest fullSyncRequest = 2; + ObjectFullSyncResponse fullSyncResponse = 3; + } +} + +// ObjectHeadUpdate is a message sent on document head update +message ObjectHeadUpdate { + repeated string heads = 1; + repeated acl.RawTreeChangeWithId changes = 2; + repeated string snapshotPath = 3; +} + +// ObjectHeadUpdate is a message sent when document needs full sync +message ObjectFullSyncRequest { + repeated string heads = 1; + repeated string snapshotPath = 2; +} + +// ObjectFullSyncResponse is a message sent as a response for a specific full sync +message ObjectFullSyncResponse { + repeated string heads = 1; + repeated acl.RawTreeChangeWithId changes = 2; + repeated string snapshotPath = 3; +} diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 9db560cb..a3299fee 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -5,6 +5,7 @@ package spacesyncproto import ( fmt "fmt" + aclpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -362,6 +363,349 @@ func (m *HeadSyncResponse) GetResults() []*HeadSyncResult { return nil } +// ObjectSyncMessage is a message sent on object sync +type ObjectSyncMessage struct { + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Content *ObjectSyncContentValue `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + TreeHeader *aclpb.TreeHeader `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` + TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` +} + +func (m *ObjectSyncMessage) Reset() { *m = ObjectSyncMessage{} } +func (m *ObjectSyncMessage) String() string { return proto.CompactTextString(m) } +func (*ObjectSyncMessage) ProtoMessage() {} +func (*ObjectSyncMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{6} +} +func (m *ObjectSyncMessage) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ObjectSyncMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ObjectSyncMessage.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 *ObjectSyncMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_ObjectSyncMessage.Merge(m, src) +} +func (m *ObjectSyncMessage) XXX_Size() int { + return m.Size() +} +func (m *ObjectSyncMessage) XXX_DiscardUnknown() { + xxx_messageInfo_ObjectSyncMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_ObjectSyncMessage proto.InternalMessageInfo + +func (m *ObjectSyncMessage) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +func (m *ObjectSyncMessage) GetContent() *ObjectSyncContentValue { + if m != nil { + return m.Content + } + return nil +} + +func (m *ObjectSyncMessage) GetTreeHeader() *aclpb.TreeHeader { + if m != nil { + return m.TreeHeader + } + return nil +} + +func (m *ObjectSyncMessage) GetTreeId() string { + if m != nil { + return m.TreeId + } + return "" +} + +// ObjectSyncContentValue provides different types for object sync +type ObjectSyncContentValue struct { + // Types that are valid to be assigned to Value: + // *ObjectSyncContentValue_HeadUpdate + // *ObjectSyncContentValue_FullSyncRequest + // *ObjectSyncContentValue_FullSyncResponse + Value isObjectSyncContentValue_Value `protobuf_oneof:"value"` +} + +func (m *ObjectSyncContentValue) Reset() { *m = ObjectSyncContentValue{} } +func (m *ObjectSyncContentValue) String() string { return proto.CompactTextString(m) } +func (*ObjectSyncContentValue) ProtoMessage() {} +func (*ObjectSyncContentValue) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{7} +} +func (m *ObjectSyncContentValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ObjectSyncContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ObjectSyncContentValue.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 *ObjectSyncContentValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_ObjectSyncContentValue.Merge(m, src) +} +func (m *ObjectSyncContentValue) XXX_Size() int { + return m.Size() +} +func (m *ObjectSyncContentValue) XXX_DiscardUnknown() { + xxx_messageInfo_ObjectSyncContentValue.DiscardUnknown(m) +} + +var xxx_messageInfo_ObjectSyncContentValue proto.InternalMessageInfo + +type isObjectSyncContentValue_Value interface { + isObjectSyncContentValue_Value() + MarshalTo([]byte) (int, error) + Size() int +} + +type ObjectSyncContentValue_HeadUpdate struct { + HeadUpdate *ObjectHeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` +} +type ObjectSyncContentValue_FullSyncRequest struct { + FullSyncRequest *ObjectFullSyncRequest `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` +} +type ObjectSyncContentValue_FullSyncResponse struct { + FullSyncResponse *ObjectFullSyncResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` +} + +func (*ObjectSyncContentValue_HeadUpdate) isObjectSyncContentValue_Value() {} +func (*ObjectSyncContentValue_FullSyncRequest) isObjectSyncContentValue_Value() {} +func (*ObjectSyncContentValue_FullSyncResponse) isObjectSyncContentValue_Value() {} + +func (m *ObjectSyncContentValue) GetValue() isObjectSyncContentValue_Value { + if m != nil { + return m.Value + } + return nil +} + +func (m *ObjectSyncContentValue) GetHeadUpdate() *ObjectHeadUpdate { + if x, ok := m.GetValue().(*ObjectSyncContentValue_HeadUpdate); ok { + return x.HeadUpdate + } + return nil +} + +func (m *ObjectSyncContentValue) GetFullSyncRequest() *ObjectFullSyncRequest { + if x, ok := m.GetValue().(*ObjectSyncContentValue_FullSyncRequest); ok { + return x.FullSyncRequest + } + return nil +} + +func (m *ObjectSyncContentValue) GetFullSyncResponse() *ObjectFullSyncResponse { + if x, ok := m.GetValue().(*ObjectSyncContentValue_FullSyncResponse); ok { + return x.FullSyncResponse + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*ObjectSyncContentValue) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*ObjectSyncContentValue_HeadUpdate)(nil), + (*ObjectSyncContentValue_FullSyncRequest)(nil), + (*ObjectSyncContentValue_FullSyncResponse)(nil), + } +} + +// ObjectHeadUpdate is a message sent on document head update +type ObjectHeadUpdate struct { + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` +} + +func (m *ObjectHeadUpdate) Reset() { *m = ObjectHeadUpdate{} } +func (m *ObjectHeadUpdate) String() string { return proto.CompactTextString(m) } +func (*ObjectHeadUpdate) ProtoMessage() {} +func (*ObjectHeadUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{8} +} +func (m *ObjectHeadUpdate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ObjectHeadUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ObjectHeadUpdate.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 *ObjectHeadUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_ObjectHeadUpdate.Merge(m, src) +} +func (m *ObjectHeadUpdate) XXX_Size() int { + return m.Size() +} +func (m *ObjectHeadUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_ObjectHeadUpdate.DiscardUnknown(m) +} + +var xxx_messageInfo_ObjectHeadUpdate proto.InternalMessageInfo + +func (m *ObjectHeadUpdate) GetHeads() []string { + if m != nil { + return m.Heads + } + return nil +} + +func (m *ObjectHeadUpdate) GetChanges() []*aclpb.RawTreeChangeWithId { + if m != nil { + return m.Changes + } + return nil +} + +func (m *ObjectHeadUpdate) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + +// ObjectHeadUpdate is a message sent when document needs full sync +type ObjectFullSyncRequest struct { + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + SnapshotPath []string `protobuf:"bytes,2,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` +} + +func (m *ObjectFullSyncRequest) Reset() { *m = ObjectFullSyncRequest{} } +func (m *ObjectFullSyncRequest) String() string { return proto.CompactTextString(m) } +func (*ObjectFullSyncRequest) ProtoMessage() {} +func (*ObjectFullSyncRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{9} +} +func (m *ObjectFullSyncRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ObjectFullSyncRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ObjectFullSyncRequest.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 *ObjectFullSyncRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ObjectFullSyncRequest.Merge(m, src) +} +func (m *ObjectFullSyncRequest) XXX_Size() int { + return m.Size() +} +func (m *ObjectFullSyncRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ObjectFullSyncRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ObjectFullSyncRequest proto.InternalMessageInfo + +func (m *ObjectFullSyncRequest) GetHeads() []string { + if m != nil { + return m.Heads + } + return nil +} + +func (m *ObjectFullSyncRequest) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + +// ObjectFullSyncResponse is a message sent as a response for a specific full sync +type ObjectFullSyncResponse struct { + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` +} + +func (m *ObjectFullSyncResponse) Reset() { *m = ObjectFullSyncResponse{} } +func (m *ObjectFullSyncResponse) String() string { return proto.CompactTextString(m) } +func (*ObjectFullSyncResponse) ProtoMessage() {} +func (*ObjectFullSyncResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{10} +} +func (m *ObjectFullSyncResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ObjectFullSyncResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ObjectFullSyncResponse.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 *ObjectFullSyncResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ObjectFullSyncResponse.Merge(m, src) +} +func (m *ObjectFullSyncResponse) XXX_Size() int { + return m.Size() +} +func (m *ObjectFullSyncResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ObjectFullSyncResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ObjectFullSyncResponse proto.InternalMessageInfo + +func (m *ObjectFullSyncResponse) GetHeads() []string { + if m != nil { + return m.Heads + } + return nil +} + +func (m *ObjectFullSyncResponse) GetChanges() []*aclpb.RawTreeChangeWithId { + if m != nil { + return m.Changes + } + return nil +} + +func (m *ObjectFullSyncResponse) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + func init() { proto.RegisterEnum("anySpace.ErrCodes", ErrCodes_name, ErrCodes_value) proto.RegisterType((*Msg)(nil), "anySpace.Msg") @@ -370,6 +714,11 @@ func init() { proto.RegisterType((*HeadSyncResultElement)(nil), "anySpace.HeadSyncResultElement") proto.RegisterType((*HeadSyncRequest)(nil), "anySpace.HeadSyncRequest") proto.RegisterType((*HeadSyncResponse)(nil), "anySpace.HeadSyncResponse") + proto.RegisterType((*ObjectSyncMessage)(nil), "anySpace.ObjectSyncMessage") + proto.RegisterType((*ObjectSyncContentValue)(nil), "anySpace.ObjectSyncContentValue") + proto.RegisterType((*ObjectHeadUpdate)(nil), "anySpace.ObjectHeadUpdate") + proto.RegisterType((*ObjectFullSyncRequest)(nil), "anySpace.ObjectFullSyncRequest") + proto.RegisterType((*ObjectFullSyncResponse)(nil), "anySpace.ObjectFullSyncResponse") } func init() { @@ -377,32 +726,50 @@ func init() { } var fileDescriptor_5855f4ef9cf24cdb = []byte{ - // 400 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0xcd, 0xce, 0xd2, 0x40, - 0x14, 0xed, 0x94, 0xbf, 0x72, 0x15, 0x24, 0x13, 0x8d, 0xb5, 0x8b, 0x82, 0x5d, 0x35, 0x2c, 0xa8, - 0xc1, 0x8d, 0x09, 0x2b, 0x35, 0x18, 0x59, 0xb0, 0x19, 0xe2, 0xc6, 0xb8, 0xa9, 0xed, 0x08, 0x4d, - 0xe8, 0x4c, 0xed, 0x0c, 0x2a, 0x6f, 0xe1, 0x63, 0xb9, 0x64, 0xe9, 0xd2, 0xc0, 0x8b, 0x98, 0xde, - 0x7e, 0x85, 0x8f, 0xa4, 0xe4, 0xdb, 0xcc, 0xfd, 0xe9, 0x39, 0xe7, 0x9e, 0x7b, 0x53, 0x78, 0x13, - 0xc9, 0x34, 0x95, 0x22, 0x28, 0x83, 0xca, 0xc2, 0x88, 0x07, 0xf8, 0xaa, 0xbd, 0x88, 0xb2, 0x5c, - 0x6a, 0x19, 0xe0, 0xab, 0x2e, 0xdd, 0x09, 0x36, 0xa8, 0x15, 0x8a, 0xfd, 0xaa, 0xe8, 0x79, 0x43, - 0x68, 0x2c, 0xd5, 0x9a, 0xda, 0xd0, 0x41, 0xcc, 0x22, 0xb6, 0xc9, 0x88, 0xf8, 0x5d, 0x56, 0x95, - 0xde, 0x02, 0x7a, 0x1f, 0x79, 0x18, 0xaf, 0xf6, 0x22, 0x62, 0xa1, 0x58, 0x73, 0x4a, 0xa1, 0xf9, - 0x2d, 0x97, 0x29, 0xe2, 0x9a, 0x0c, 0x73, 0xda, 0x07, 0x53, 0x4b, 0xdb, 0xc4, 0x8e, 0xa9, 0x25, - 0x7d, 0x0a, 0xad, 0x6d, 0x92, 0x26, 0xda, 0x6e, 0x8c, 0x88, 0xdf, 0x63, 0x65, 0xe1, 0xfd, 0x84, - 0xfe, 0x59, 0x8a, 0xab, 0xdd, 0x56, 0x17, 0x5a, 0x9b, 0x50, 0x6d, 0x50, 0xeb, 0x31, 0xc3, 0x9c, - 0xce, 0xc0, 0xe2, 0x5b, 0x9e, 0x72, 0xa1, 0x95, 0x6d, 0x8e, 0x1a, 0xfe, 0xa3, 0xe9, 0x70, 0x52, - 0xd9, 0x9d, 0x5c, 0xf3, 0xe7, 0x25, 0x8e, 0x9d, 0x09, 0xc5, 0xe0, 0x48, 0xee, 0xc4, 0x79, 0x30, - 0x16, 0xde, 0x0c, 0x9e, 0xd5, 0x12, 0x0b, 0xdf, 0x49, 0xb5, 0xb1, 0x99, 0xc4, 0xe8, 0x87, 0x87, - 0x31, 0x6e, 0xd2, 0x65, 0x98, 0x7b, 0x5f, 0xe0, 0xc9, 0x85, 0xfc, 0x7d, 0xc7, 0x95, 0xbe, 0x7d, - 0x2d, 0x1a, 0x40, 0x3b, 0x2f, 0xae, 0x54, 0x59, 0x7f, 0x5e, 0x63, 0xbd, 0xf8, 0xce, 0xee, 0x60, - 0xde, 0x07, 0x18, 0xdc, 0xb3, 0x96, 0x49, 0xa1, 0x38, 0x9d, 0x42, 0x27, 0x47, 0x9b, 0xca, 0x26, - 0xa8, 0x62, 0xdf, 0x3a, 0x00, 0xab, 0x80, 0x63, 0x07, 0xac, 0x79, 0x9e, 0xbf, 0x97, 0x31, 0x57, - 0xb4, 0x0f, 0xf0, 0x49, 0xf0, 0x5f, 0x19, 0x8f, 0x34, 0x8f, 0x07, 0xc6, 0xf4, 0x07, 0xb4, 0x90, - 0x4c, 0xdf, 0x82, 0x55, 0xf1, 0xe9, 0x8b, 0x3a, 0x4d, 0x5c, 0xcf, 0x71, 0x6a, 0xc7, 0x95, 0xde, - 0xc6, 0xd0, 0x5e, 0xe9, 0x9c, 0x87, 0x29, 0xed, 0x5d, 0x50, 0x4b, 0xb5, 0x76, 0xae, 0x4b, 0x9f, - 0xbc, 0x22, 0xef, 0x66, 0x7f, 0x8e, 0x2e, 0x39, 0x1c, 0x5d, 0xf2, 0xef, 0xe8, 0x92, 0xdf, 0x27, - 0xd7, 0x38, 0x9c, 0x5c, 0xe3, 0xef, 0xc9, 0x35, 0x3e, 0xbf, 0x7c, 0xf0, 0xcf, 0xfd, 0xda, 0xc6, - 0xf0, 0xfa, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xf6, 0x94, 0x21, 0xe5, 0x02, 0x00, 0x00, + // 674 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x4d, 0x6f, 0xd3, 0x40, + 0x10, 0xf5, 0x26, 0x6d, 0x92, 0x4e, 0xfa, 0x11, 0x56, 0xb4, 0x98, 0x20, 0xa5, 0xc1, 0xa7, 0x88, + 0x43, 0x52, 0x85, 0x0b, 0xa2, 0x5c, 0x68, 0xd5, 0x2a, 0x11, 0x2a, 0x1f, 0x5b, 0x0a, 0x12, 0xe2, + 0xb2, 0xb5, 0xb7, 0x49, 0xc0, 0xf1, 0x1a, 0xef, 0x86, 0xd2, 0x1b, 0x27, 0xce, 0x88, 0x9f, 0xc2, + 0xaf, 0xe0, 0xd8, 0x23, 0x47, 0xd4, 0xfe, 0x0d, 0x0e, 0x68, 0xc7, 0x76, 0x92, 0x06, 0xa7, 0xdc, + 0x38, 0xc4, 0xde, 0x99, 0x7d, 0xf3, 0xf6, 0xbd, 0x59, 0x8f, 0x02, 0x0f, 0x5c, 0x39, 0x1c, 0xca, + 0xa0, 0x15, 0xbf, 0x54, 0xc8, 0x5d, 0xd1, 0xc2, 0xa7, 0x3a, 0x0b, 0xdc, 0x30, 0x92, 0x5a, 0xb6, + 0xf0, 0xa9, 0x26, 0xd9, 0x26, 0x26, 0x68, 0x89, 0x07, 0x67, 0x87, 0x26, 0x57, 0xdd, 0x0a, 0xdf, + 0xf7, 0x5a, 0xdc, 0xf5, 0xcd, 0xcf, 0xed, 0xf3, 0xa0, 0x27, 0x94, 0x59, 0x86, 0xc7, 0x69, 0xe9, + 0x24, 0x1f, 0xd7, 0x3a, 0x9b, 0x90, 0x3f, 0x50, 0x3d, 0x6a, 0x43, 0x11, 0x59, 0xbb, 0x9e, 0x4d, + 0xea, 0xa4, 0xb1, 0xc4, 0xd2, 0xd0, 0xe9, 0xc2, 0x4a, 0x47, 0x70, 0xef, 0xf0, 0x2c, 0x70, 0x99, + 0x29, 0xa4, 0x14, 0x16, 0x4e, 0x22, 0x39, 0x44, 0xdc, 0x02, 0xc3, 0x35, 0x5d, 0x85, 0x9c, 0x96, + 0x76, 0x0e, 0x33, 0x39, 0x2d, 0xe9, 0x4d, 0x58, 0xf4, 0x07, 0xc3, 0x81, 0xb6, 0xf3, 0x75, 0xd2, + 0x58, 0x61, 0x71, 0xe0, 0x9c, 0xc2, 0xea, 0x98, 0x4a, 0xa8, 0x91, 0xaf, 0x0d, 0x57, 0x9f, 0xab, + 0x3e, 0x72, 0x2d, 0x33, 0x5c, 0xd3, 0x6d, 0x28, 0x09, 0x5f, 0x0c, 0x45, 0xa0, 0x95, 0x9d, 0xab, + 0xe7, 0x1b, 0xe5, 0xf6, 0x66, 0x33, 0x35, 0xd8, 0xbc, 0x5a, 0xbf, 0x17, 0xe3, 0xd8, 0xb8, 0xc0, + 0x1c, 0xec, 0xca, 0x51, 0x30, 0x3e, 0x18, 0x03, 0x67, 0x1b, 0xd6, 0x33, 0x0b, 0x8d, 0xee, 0x41, + 0xea, 0x38, 0x37, 0xf0, 0x50, 0x8f, 0xe0, 0x1e, 0x3a, 0x59, 0x62, 0xb8, 0x76, 0xde, 0xc2, 0xda, + 0xa4, 0xf8, 0xc3, 0x48, 0x28, 0x3d, 0xbf, 0x5b, 0xb4, 0x05, 0x85, 0x08, 0xdb, 0x9b, 0x48, 0xbf, + 0x95, 0x21, 0xdd, 0xec, 0xb3, 0x04, 0xe6, 0xec, 0x43, 0x65, 0x4a, 0x5a, 0x28, 0x03, 0x25, 0x68, + 0x1b, 0x8a, 0x11, 0xca, 0x54, 0x36, 0x41, 0x16, 0x7b, 0x5e, 0x03, 0x58, 0x0a, 0x74, 0xbe, 0x13, + 0xb8, 0xf1, 0xec, 0xf8, 0x9d, 0x70, 0xb5, 0xd9, 0x3d, 0x10, 0x4a, 0xf1, 0x9e, 0xb8, 0x46, 0xe8, + 0x43, 0x28, 0xba, 0x32, 0xd0, 0x22, 0xd0, 0x68, 0xb6, 0xdc, 0xae, 0x4f, 0xce, 0x98, 0xf0, 0xec, + 0xc6, 0x90, 0x57, 0xdc, 0x1f, 0x09, 0x96, 0x16, 0xd0, 0x16, 0x80, 0x8e, 0x84, 0x30, 0x52, 0x44, + 0x84, 0x9d, 0x2e, 0xb7, 0xd7, 0x9a, 0xdc, 0xf5, 0x9b, 0x2f, 0xc7, 0x69, 0x36, 0x05, 0xa1, 0x1b, + 0x50, 0x30, 0x51, 0xd7, 0xb3, 0x17, 0x50, 0x45, 0x12, 0x39, 0xbf, 0x09, 0x6c, 0x64, 0x1f, 0x46, + 0x1f, 0x01, 0x98, 0xee, 0x1f, 0x85, 0x1e, 0xd7, 0x02, 0xc5, 0x97, 0xdb, 0xd5, 0x59, 0x89, 0x9d, + 0x31, 0xa2, 0x63, 0xb1, 0x29, 0x3c, 0x7d, 0x02, 0x6b, 0x27, 0x23, 0xdf, 0x9f, 0xba, 0xb3, 0xc4, + 0xe5, 0xe6, 0x2c, 0xc5, 0xfe, 0x55, 0x58, 0xc7, 0x62, 0xb3, 0x95, 0xf4, 0x29, 0x54, 0x26, 0xa9, + 0xf8, 0x8a, 0x12, 0xd3, 0xf5, 0xf9, 0x6c, 0x31, 0xae, 0x63, 0xb1, 0xbf, 0x6a, 0x77, 0x8a, 0xb0, + 0xf8, 0xd1, 0x78, 0x74, 0x3e, 0x13, 0xa8, 0xcc, 0x1a, 0x31, 0x5f, 0xb0, 0x31, 0x12, 0x5f, 0xfd, + 0x12, 0x8b, 0x03, 0xf3, 0x49, 0x24, 0x73, 0x9b, 0x7c, 0x58, 0x36, 0xf6, 0x9b, 0xf1, 0x53, 0xd3, + 0xf2, 0x5d, 0xdc, 0x7a, 0x3d, 0xd0, 0xfd, 0xae, 0xc7, 0x52, 0x20, 0x75, 0x60, 0x59, 0x05, 0x3c, + 0x54, 0x7d, 0xa9, 0x9f, 0x73, 0xdd, 0xb7, 0xf3, 0x48, 0x78, 0x25, 0xe7, 0xbc, 0x80, 0xf5, 0xcc, + 0x3e, 0xcc, 0x91, 0x31, 0x4b, 0x99, 0xcb, 0xa0, 0xfc, 0x32, 0xbe, 0xd4, 0xd9, 0x6e, 0xfc, 0x5f, + 0x6f, 0xf7, 0xaa, 0x50, 0xda, 0x8b, 0xa2, 0x5d, 0xe9, 0x09, 0x45, 0x57, 0x01, 0x8e, 0x02, 0xf1, + 0x29, 0x14, 0xae, 0x16, 0x5e, 0xc5, 0x6a, 0x7f, 0x23, 0xb0, 0x88, 0x17, 0x47, 0x1f, 0x43, 0x29, + 0x9d, 0x29, 0x7a, 0x3b, 0x6b, 0xce, 0xb0, 0x1f, 0xd5, 0x6a, 0xe6, 0x08, 0xc6, 0xb6, 0xf6, 0xa1, + 0x70, 0xa8, 0x23, 0xc1, 0x87, 0xf4, 0x4e, 0xd6, 0x10, 0x25, 0xc3, 0x58, 0xbd, 0x6e, 0xb3, 0x41, + 0xb6, 0xc8, 0xce, 0xf6, 0x8f, 0x8b, 0x1a, 0x39, 0xbf, 0xa8, 0x91, 0x5f, 0x17, 0x35, 0xf2, 0xf5, + 0xb2, 0x66, 0x9d, 0x5f, 0xd6, 0xac, 0x9f, 0x97, 0x35, 0xeb, 0xcd, 0xdd, 0x7f, 0xfe, 0x37, 0x1c, + 0x17, 0xf0, 0x75, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd7, 0x51, 0x60, 0x63, 0x47, 0x06, + 0x00, 0x00, } func (m *Msg) Marshal() (dAtA []byte, err error) { @@ -640,6 +1007,313 @@ func (m *HeadSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ObjectSyncMessage) 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 *ObjectSyncMessage) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ObjectSyncMessage) 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 = encodeVarintSpacesync(dAtA, i, uint64(len(m.TreeId))) + i-- + dAtA[i] = 0x22 + } + if m.TreeHeader != nil { + { + size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Content != nil { + { + size, err := m.Content.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ObjectSyncContentValue) 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 *ObjectSyncContentValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ObjectSyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Value != nil { + { + size := m.Value.Size() + i -= size + if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *ObjectSyncContentValue_HeadUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ObjectSyncContentValue_HeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.HeadUpdate != nil { + { + size, err := m.HeadUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *ObjectSyncContentValue_FullSyncRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ObjectSyncContentValue_FullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.FullSyncRequest != nil { + { + size, err := m.FullSyncRequest.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *ObjectSyncContentValue_FullSyncResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ObjectSyncContentValue_FullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.FullSyncResponse != nil { + { + size, err := m.FullSyncResponse.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *ObjectHeadUpdate) 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 *ObjectHeadUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ObjectHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Heads[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ObjectFullSyncRequest) 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 *ObjectFullSyncRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ObjectFullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Heads[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ObjectFullSyncResponse) 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 *ObjectFullSyncResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ObjectFullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Heads[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintSpacesync(dAtA []byte, offset int, v uint64) int { offset -= sovSpacesync(v) base := offset @@ -755,6 +1429,154 @@ func (m *HeadSyncResponse) Size() (n int) { return n } +func (m *ObjectSyncMessage) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + if m.Content != nil { + l = m.Content.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + if m.TreeHeader != nil { + l = m.TreeHeader.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + l = len(m.TreeId) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} + +func (m *ObjectSyncContentValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != nil { + n += m.Value.Size() + } + return n +} + +func (m *ObjectSyncContentValue_HeadUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.HeadUpdate != nil { + l = m.HeadUpdate.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} +func (m *ObjectSyncContentValue_FullSyncRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.FullSyncRequest != nil { + l = m.FullSyncRequest.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} +func (m *ObjectSyncContentValue_FullSyncResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.FullSyncResponse != nil { + l = m.FullSyncResponse.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} +func (m *ObjectHeadUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, s := range m.Heads { + l = len(s) + n += 1 + l + sovSpacesync(uint64(l)) + } + } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovSpacesync(uint64(l)) + } + } + return n +} + +func (m *ObjectFullSyncRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, s := range m.Heads { + l = len(s) + n += 1 + l + sovSpacesync(uint64(l)) + } + } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovSpacesync(uint64(l)) + } + } + return n +} + +func (m *ObjectFullSyncResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, s := range m.Heads { + l = len(s) + n += 1 + l + sovSpacesync(uint64(l)) + } + } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovSpacesync(uint64(l)) + } + } + return n +} + func sovSpacesync(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1401,6 +2223,757 @@ func (m *HeadSyncResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *ObjectSyncMessage) 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 ErrIntOverflowSpacesync + } + 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: ObjectSyncMessage: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ObjectSyncMessage: 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 ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + 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 Content", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Content == nil { + m.Content = &ObjectSyncContentValue{} + } + if err := m.Content.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TreeHeader == nil { + m.TreeHeader = &aclpb.TreeHeader{} + } + if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + 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 ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TreeId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ObjectSyncContentValue) 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 ErrIntOverflowSpacesync + } + 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: ObjectSyncContentValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ObjectSyncContentValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HeadUpdate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ObjectHeadUpdate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &ObjectSyncContentValue_HeadUpdate{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FullSyncRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ObjectFullSyncRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &ObjectSyncContentValue_FullSyncRequest{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FullSyncResponse", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ObjectFullSyncResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &ObjectSyncContentValue_FullSyncResponse{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ObjectHeadUpdate) 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 ErrIntOverflowSpacesync + } + 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: ObjectHeadUpdate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ObjectHeadUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &aclpb.RawTreeChangeWithId{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ObjectFullSyncRequest) 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 ErrIntOverflowSpacesync + } + 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: ObjectFullSyncRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ObjectFullSyncRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ObjectFullSyncResponse) 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 ErrIntOverflowSpacesync + } + 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: ObjectFullSyncResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ObjectFullSyncResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &aclpb.RawTreeChangeWithId{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipSpacesync(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/pkg/acl/account/accountdata.go b/pkg/acl/account/accountdata.go index 07530083..bc775854 100644 --- a/pkg/acl/account/accountdata.go +++ b/pkg/acl/account/accountdata.go @@ -7,7 +7,7 @@ import ( ) type AccountData struct { // TODO: create a convenient constructor for this - Identity string // TODO: this is essentially the same as sign key + Identity []byte // TODO: this is essentially the same as sign key SignKey signingkey.PrivKey EncKey encryptionkey.PrivKey Decoder keys.Decoder diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go index c026319c..ecd124b1 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go @@ -22,140 +22,80 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -type ACLChangeUserPermissions int32 +type ACLUserPermissions int32 const ( - ACLChange_Admin ACLChangeUserPermissions = 0 - ACLChange_Writer ACLChangeUserPermissions = 1 - ACLChange_Reader ACLChangeUserPermissions = 2 - ACLChange_Removed ACLChangeUserPermissions = 3 + ACLUserPermissions_Admin ACLUserPermissions = 0 + ACLUserPermissions_Writer ACLUserPermissions = 1 + ACLUserPermissions_Reader ACLUserPermissions = 2 + ACLUserPermissions_Removed ACLUserPermissions = 3 ) -var ACLChangeUserPermissions_name = map[int32]string{ +var ACLUserPermissions_name = map[int32]string{ 0: "Admin", 1: "Writer", 2: "Reader", 3: "Removed", } -var ACLChangeUserPermissions_value = map[string]int32{ +var ACLUserPermissions_value = map[string]int32{ "Admin": 0, "Writer": 1, "Reader": 2, "Removed": 3, } -func (x ACLChangeUserPermissions) String() string { - return proto.EnumName(ACLChangeUserPermissions_name, int32(x)) +func (x ACLUserPermissions) String() string { + return proto.EnumName(ACLUserPermissions_name, int32(x)) } -func (ACLChangeUserPermissions) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 0} -} - -type HeaderDocType int32 - -const ( - Header_ACL HeaderDocType = 0 - Header_DocTree HeaderDocType = 1 -) - -var HeaderDocType_name = map[int32]string{ - 0: "ACL", - 1: "DocTree", -} - -var HeaderDocType_value = map[string]int32{ - "ACL": 0, - "DocTree": 1, -} - -func (x HeaderDocType) String() string { - return proto.EnumName(HeaderDocType_name, int32(x)) -} - -func (HeaderDocType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{5, 0} -} - -type RawChange struct { - Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` -} - -func (m *RawChange) Reset() { *m = RawChange{} } -func (m *RawChange) String() string { return proto.CompactTextString(m) } -func (*RawChange) ProtoMessage() {} -func (*RawChange) Descriptor() ([]byte, []int) { +func (ACLUserPermissions) EnumDescriptor() ([]byte, []int) { return fileDescriptor_37a022c841a51877, []int{0} } -func (m *RawChange) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RawChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RawChange.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 *RawChange) XXX_Merge(src proto.Message) { - xxx_messageInfo_RawChange.Merge(m, src) -} -func (m *RawChange) XXX_Size() int { - return m.Size() -} -func (m *RawChange) XXX_DiscardUnknown() { - xxx_messageInfo_RawChange.DiscardUnknown(m) + +type TreeHeaderType int32 + +const ( + TreeHeaderType_Object TreeHeaderType = 0 + TreeHeaderType_Space TreeHeaderType = 1 +) + +var TreeHeaderType_name = map[int32]string{ + 0: "Object", + 1: "Space", } -var xxx_messageInfo_RawChange proto.InternalMessageInfo - -func (m *RawChange) GetPayload() []byte { - if m != nil { - return m.Payload - } - return nil +var TreeHeaderType_value = map[string]int32{ + "Object": 0, + "Space": 1, } -func (m *RawChange) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil +func (x TreeHeaderType) String() string { + return proto.EnumName(TreeHeaderType_name, int32(x)) } -func (m *RawChange) GetId() string { - if m != nil { - return m.Id - } - return "" +func (TreeHeaderType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{1} } -type RawRecord struct { +type RawACLRecord struct { Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` } -func (m *RawRecord) Reset() { *m = RawRecord{} } -func (m *RawRecord) String() string { return proto.CompactTextString(m) } -func (*RawRecord) ProtoMessage() {} -func (*RawRecord) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1} +func (m *RawACLRecord) Reset() { *m = RawACLRecord{} } +func (m *RawACLRecord) String() string { return proto.CompactTextString(m) } +func (*RawACLRecord) ProtoMessage() {} +func (*RawACLRecord) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{0} } -func (m *RawRecord) XXX_Unmarshal(b []byte) error { +func (m *RawACLRecord) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RawRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RawACLRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RawRecord.Marshal(b, m, deterministic) + return xxx_messageInfo_RawACLRecord.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -165,164 +105,62 @@ func (m *RawRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *RawRecord) XXX_Merge(src proto.Message) { - xxx_messageInfo_RawRecord.Merge(m, src) +func (m *RawACLRecord) XXX_Merge(src proto.Message) { + xxx_messageInfo_RawACLRecord.Merge(m, src) } -func (m *RawRecord) XXX_Size() int { +func (m *RawACLRecord) XXX_Size() int { return m.Size() } -func (m *RawRecord) XXX_DiscardUnknown() { - xxx_messageInfo_RawRecord.DiscardUnknown(m) +func (m *RawACLRecord) XXX_DiscardUnknown() { + xxx_messageInfo_RawACLRecord.DiscardUnknown(m) } -var xxx_messageInfo_RawRecord proto.InternalMessageInfo +var xxx_messageInfo_RawACLRecord proto.InternalMessageInfo -func (m *RawRecord) GetPayload() []byte { +func (m *RawACLRecord) GetPayload() []byte { if m != nil { return m.Payload } return nil } -func (m *RawRecord) GetSignature() []byte { +func (m *RawACLRecord) GetSignature() []byte { if m != nil { return m.Signature } return nil } -func (m *RawRecord) GetId() string { +func (m *RawACLRecord) GetId() string { if m != nil { return m.Id } return "" } -// the element of change tree used to store and internal apply smartBlock history -type ACLChange struct { - TreeHeadIds []string `protobuf:"bytes,1,rep,name=treeHeadIds,proto3" json:"treeHeadIds,omitempty"` - AclHeadIds []string `protobuf:"bytes,2,rep,name=aclHeadIds,proto3" json:"aclHeadIds,omitempty"` - SnapshotBaseId string `protobuf:"bytes,3,opt,name=snapshotBaseId,proto3" json:"snapshotBaseId,omitempty"` - AclData *ACLChangeACLData `protobuf:"bytes,4,opt,name=aclData,proto3" json:"aclData,omitempty"` - // the data is encoded with read key and should be read in ChangesData format - ChangesData []byte `protobuf:"bytes,5,opt,name=changesData,proto3" json:"changesData,omitempty"` - CurrentReadKeyHash uint64 `protobuf:"varint,6,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` - Timestamp int64 `protobuf:"varint,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Identity string `protobuf:"bytes,8,opt,name=identity,proto3" json:"identity,omitempty"` -} - -func (m *ACLChange) Reset() { *m = ACLChange{} } -func (m *ACLChange) String() string { return proto.CompactTextString(m) } -func (*ACLChange) ProtoMessage() {} -func (*ACLChange) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2} -} -func (m *ACLChange) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ACLChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ACLChange.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 *ACLChange) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChange.Merge(m, src) -} -func (m *ACLChange) XXX_Size() int { - return m.Size() -} -func (m *ACLChange) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChange.DiscardUnknown(m) -} - -var xxx_messageInfo_ACLChange proto.InternalMessageInfo - -func (m *ACLChange) GetTreeHeadIds() []string { - if m != nil { - return m.TreeHeadIds - } - return nil -} - -func (m *ACLChange) GetAclHeadIds() []string { - if m != nil { - return m.AclHeadIds - } - return nil -} - -func (m *ACLChange) GetSnapshotBaseId() string { - if m != nil { - return m.SnapshotBaseId - } - return "" -} - -func (m *ACLChange) GetAclData() *ACLChangeACLData { - if m != nil { - return m.AclData - } - return nil -} - -func (m *ACLChange) GetChangesData() []byte { - if m != nil { - return m.ChangesData - } - return nil -} - -func (m *ACLChange) GetCurrentReadKeyHash() uint64 { - if m != nil { - return m.CurrentReadKeyHash - } - return 0 -} - -func (m *ACLChange) GetTimestamp() int64 { - if m != nil { - return m.Timestamp - } - return 0 -} - -func (m *ACLChange) GetIdentity() string { - if m != nil { - return m.Identity - } - return "" -} - -type ACLChangeACLContentValue struct { +type ACLContentValue struct { // Types that are valid to be assigned to Value: - // *ACLChangeACLContentValueValueOfUserAdd - // *ACLChangeACLContentValueValueOfUserRemove - // *ACLChangeACLContentValueValueOfUserPermissionChange - // *ACLChangeACLContentValueValueOfUserInvite - // *ACLChangeACLContentValueValueOfUserJoin - // *ACLChangeACLContentValueValueOfUserConfirm - Value IsACLChangeACLContentValueValue `protobuf_oneof:"value"` + // *ACLContentValue_UserAdd + // *ACLContentValue_UserRemove + // *ACLContentValue_UserPermissionChange + // *ACLContentValue_UserInvite + // *ACLContentValue_UserJoin + // *ACLContentValue_UserConfirm + Value isACLContentValue_Value `protobuf_oneof:"value"` } -func (m *ACLChangeACLContentValue) Reset() { *m = ACLChangeACLContentValue{} } -func (m *ACLChangeACLContentValue) String() string { return proto.CompactTextString(m) } -func (*ACLChangeACLContentValue) ProtoMessage() {} -func (*ACLChangeACLContentValue) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 0} +func (m *ACLContentValue) Reset() { *m = ACLContentValue{} } +func (m *ACLContentValue) String() string { return proto.CompactTextString(m) } +func (*ACLContentValue) ProtoMessage() {} +func (*ACLContentValue) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{1} } -func (m *ACLChangeACLContentValue) XXX_Unmarshal(b []byte) error { +func (m *ACLContentValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeACLContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeACLContentValue.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLContentValue.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -332,128 +170,127 @@ func (m *ACLChangeACLContentValue) XXX_Marshal(b []byte, deterministic bool) ([] return b[:n], nil } } -func (m *ACLChangeACLContentValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeACLContentValue.Merge(m, src) +func (m *ACLContentValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLContentValue.Merge(m, src) } -func (m *ACLChangeACLContentValue) XXX_Size() int { +func (m *ACLContentValue) XXX_Size() int { return m.Size() } -func (m *ACLChangeACLContentValue) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeACLContentValue.DiscardUnknown(m) +func (m *ACLContentValue) XXX_DiscardUnknown() { + xxx_messageInfo_ACLContentValue.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeACLContentValue proto.InternalMessageInfo +var xxx_messageInfo_ACLContentValue proto.InternalMessageInfo -type IsACLChangeACLContentValueValue interface { - IsACLChangeACLContentValueValue() +type isACLContentValue_Value interface { + isACLContentValue_Value() MarshalTo([]byte) (int, error) Size() int } -type ACLChangeACLContentValueValueOfUserAdd struct { - UserAdd *ACLChangeUserAdd `protobuf:"bytes,1,opt,name=userAdd,proto3,oneof" json:"userAdd,omitempty"` +type ACLContentValue_UserAdd struct { + UserAdd *ACLUserAdd `protobuf:"bytes,1,opt,name=userAdd,proto3,oneof" json:"userAdd,omitempty"` } -type ACLChangeACLContentValueValueOfUserRemove struct { - UserRemove *ACLChangeUserRemove `protobuf:"bytes,2,opt,name=userRemove,proto3,oneof" json:"userRemove,omitempty"` +type ACLContentValue_UserRemove struct { + UserRemove *ACLUserRemove `protobuf:"bytes,2,opt,name=userRemove,proto3,oneof" json:"userRemove,omitempty"` } -type ACLChangeACLContentValueValueOfUserPermissionChange struct { - UserPermissionChange *ACLChangeUserPermissionChange `protobuf:"bytes,3,opt,name=userPermissionChange,proto3,oneof" json:"userPermissionChange,omitempty"` +type ACLContentValue_UserPermissionChange struct { + UserPermissionChange *ACLUserPermissionChange `protobuf:"bytes,3,opt,name=userPermissionChange,proto3,oneof" json:"userPermissionChange,omitempty"` } -type ACLChangeACLContentValueValueOfUserInvite struct { - UserInvite *ACLChangeUserInvite `protobuf:"bytes,4,opt,name=userInvite,proto3,oneof" json:"userInvite,omitempty"` +type ACLContentValue_UserInvite struct { + UserInvite *ACLUserInvite `protobuf:"bytes,4,opt,name=userInvite,proto3,oneof" json:"userInvite,omitempty"` } -type ACLChangeACLContentValueValueOfUserJoin struct { - UserJoin *ACLChangeUserJoin `protobuf:"bytes,5,opt,name=userJoin,proto3,oneof" json:"userJoin,omitempty"` +type ACLContentValue_UserJoin struct { + UserJoin *ACLUserJoin `protobuf:"bytes,5,opt,name=userJoin,proto3,oneof" json:"userJoin,omitempty"` } -type ACLChangeACLContentValueValueOfUserConfirm struct { - UserConfirm *ACLChangeUserConfirm `protobuf:"bytes,6,opt,name=userConfirm,proto3,oneof" json:"userConfirm,omitempty"` +type ACLContentValue_UserConfirm struct { + UserConfirm *ACLUserConfirm `protobuf:"bytes,6,opt,name=userConfirm,proto3,oneof" json:"userConfirm,omitempty"` } -func (*ACLChangeACLContentValueValueOfUserAdd) IsACLChangeACLContentValueValue() {} -func (*ACLChangeACLContentValueValueOfUserRemove) IsACLChangeACLContentValueValue() {} -func (*ACLChangeACLContentValueValueOfUserPermissionChange) IsACLChangeACLContentValueValue() {} -func (*ACLChangeACLContentValueValueOfUserInvite) IsACLChangeACLContentValueValue() {} -func (*ACLChangeACLContentValueValueOfUserJoin) IsACLChangeACLContentValueValue() {} -func (*ACLChangeACLContentValueValueOfUserConfirm) IsACLChangeACLContentValueValue() {} +func (*ACLContentValue_UserAdd) isACLContentValue_Value() {} +func (*ACLContentValue_UserRemove) isACLContentValue_Value() {} +func (*ACLContentValue_UserPermissionChange) isACLContentValue_Value() {} +func (*ACLContentValue_UserInvite) isACLContentValue_Value() {} +func (*ACLContentValue_UserJoin) isACLContentValue_Value() {} +func (*ACLContentValue_UserConfirm) isACLContentValue_Value() {} -func (m *ACLChangeACLContentValue) GetValue() IsACLChangeACLContentValueValue { +func (m *ACLContentValue) GetValue() isACLContentValue_Value { if m != nil { return m.Value } return nil } -func (m *ACLChangeACLContentValue) GetUserAdd() *ACLChangeUserAdd { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserAdd); ok { +func (m *ACLContentValue) GetUserAdd() *ACLUserAdd { + if x, ok := m.GetValue().(*ACLContentValue_UserAdd); ok { return x.UserAdd } return nil } -func (m *ACLChangeACLContentValue) GetUserRemove() *ACLChangeUserRemove { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserRemove); ok { +func (m *ACLContentValue) GetUserRemove() *ACLUserRemove { + if x, ok := m.GetValue().(*ACLContentValue_UserRemove); ok { return x.UserRemove } return nil } -func (m *ACLChangeACLContentValue) GetUserPermissionChange() *ACLChangeUserPermissionChange { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserPermissionChange); ok { +func (m *ACLContentValue) GetUserPermissionChange() *ACLUserPermissionChange { + if x, ok := m.GetValue().(*ACLContentValue_UserPermissionChange); ok { return x.UserPermissionChange } return nil } -func (m *ACLChangeACLContentValue) GetUserInvite() *ACLChangeUserInvite { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserInvite); ok { +func (m *ACLContentValue) GetUserInvite() *ACLUserInvite { + if x, ok := m.GetValue().(*ACLContentValue_UserInvite); ok { return x.UserInvite } return nil } -func (m *ACLChangeACLContentValue) GetUserJoin() *ACLChangeUserJoin { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserJoin); ok { +func (m *ACLContentValue) GetUserJoin() *ACLUserJoin { + if x, ok := m.GetValue().(*ACLContentValue_UserJoin); ok { return x.UserJoin } return nil } -func (m *ACLChangeACLContentValue) GetUserConfirm() *ACLChangeUserConfirm { - if x, ok := m.GetValue().(*ACLChangeACLContentValueValueOfUserConfirm); ok { +func (m *ACLContentValue) GetUserConfirm() *ACLUserConfirm { + if x, ok := m.GetValue().(*ACLContentValue_UserConfirm); ok { return x.UserConfirm } return nil } // XXX_OneofWrappers is for the internal use of the proto package. -func (*ACLChangeACLContentValue) XXX_OneofWrappers() []interface{} { +func (*ACLContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*ACLChangeACLContentValueValueOfUserAdd)(nil), - (*ACLChangeACLContentValueValueOfUserRemove)(nil), - (*ACLChangeACLContentValueValueOfUserPermissionChange)(nil), - (*ACLChangeACLContentValueValueOfUserInvite)(nil), - (*ACLChangeACLContentValueValueOfUserJoin)(nil), - (*ACLChangeACLContentValueValueOfUserConfirm)(nil), + (*ACLContentValue_UserAdd)(nil), + (*ACLContentValue_UserRemove)(nil), + (*ACLContentValue_UserPermissionChange)(nil), + (*ACLContentValue_UserInvite)(nil), + (*ACLContentValue_UserJoin)(nil), + (*ACLContentValue_UserConfirm)(nil), } } -type ACLChangeACLData struct { - AclSnapshot *ACLChangeACLSnapshot `protobuf:"bytes,1,opt,name=aclSnapshot,proto3" json:"aclSnapshot,omitempty"` - AclContent []*ACLChangeACLContentValue `protobuf:"bytes,2,rep,name=aclContent,proto3" json:"aclContent,omitempty"` +type ACLData struct { + AclContent []*ACLContentValue `protobuf:"bytes,1,rep,name=aclContent,proto3" json:"aclContent,omitempty"` } -func (m *ACLChangeACLData) Reset() { *m = ACLChangeACLData{} } -func (m *ACLChangeACLData) String() string { return proto.CompactTextString(m) } -func (*ACLChangeACLData) ProtoMessage() {} -func (*ACLChangeACLData) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 1} +func (m *ACLData) Reset() { *m = ACLData{} } +func (m *ACLData) String() string { return proto.CompactTextString(m) } +func (*ACLData) ProtoMessage() {} +func (*ACLData) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{2} } -func (m *ACLChangeACLData) XXX_Unmarshal(b []byte) error { +func (m *ACLData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeACLData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeACLData.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLData.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -463,49 +300,43 @@ func (m *ACLChangeACLData) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *ACLChangeACLData) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeACLData.Merge(m, src) +func (m *ACLData) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLData.Merge(m, src) } -func (m *ACLChangeACLData) XXX_Size() int { +func (m *ACLData) XXX_Size() int { return m.Size() } -func (m *ACLChangeACLData) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeACLData.DiscardUnknown(m) +func (m *ACLData) XXX_DiscardUnknown() { + xxx_messageInfo_ACLData.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeACLData proto.InternalMessageInfo +var xxx_messageInfo_ACLData proto.InternalMessageInfo -func (m *ACLChangeACLData) GetAclSnapshot() *ACLChangeACLSnapshot { - if m != nil { - return m.AclSnapshot - } - return nil -} - -func (m *ACLChangeACLData) GetAclContent() []*ACLChangeACLContentValue { +func (m *ACLData) GetAclContent() []*ACLContentValue { if m != nil { return m.AclContent } return nil } -type ACLChangeACLSnapshot struct { - // We don't need ACLState as a separate message now, because we simplified the snapshot model - AclState *ACLChangeACLState `protobuf:"bytes,1,opt,name=aclState,proto3" json:"aclState,omitempty"` +type ACLState struct { + ReadKeyHashes []uint64 `protobuf:"varint,1,rep,packed,name=readKeyHashes,proto3" json:"readKeyHashes,omitempty"` + UserStates []*ACLUserState `protobuf:"bytes,2,rep,name=userStates,proto3" json:"userStates,omitempty"` + Invites map[string]*ACLUserInvite `protobuf:"bytes,3,rep,name=invites,proto3" json:"invites,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *ACLChangeACLSnapshot) Reset() { *m = ACLChangeACLSnapshot{} } -func (m *ACLChangeACLSnapshot) String() string { return proto.CompactTextString(m) } -func (*ACLChangeACLSnapshot) ProtoMessage() {} -func (*ACLChangeACLSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 2} +func (m *ACLState) Reset() { *m = ACLState{} } +func (m *ACLState) String() string { return proto.CompactTextString(m) } +func (*ACLState) ProtoMessage() {} +func (*ACLState) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{3} } -func (m *ACLChangeACLSnapshot) XXX_Unmarshal(b []byte) error { +func (m *ACLState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeACLSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeACLSnapshot.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLState.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -515,105 +346,59 @@ func (m *ACLChangeACLSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *ACLChangeACLSnapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeACLSnapshot.Merge(m, src) +func (m *ACLState) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLState.Merge(m, src) } -func (m *ACLChangeACLSnapshot) XXX_Size() int { +func (m *ACLState) XXX_Size() int { return m.Size() } -func (m *ACLChangeACLSnapshot) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeACLSnapshot.DiscardUnknown(m) +func (m *ACLState) XXX_DiscardUnknown() { + xxx_messageInfo_ACLState.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeACLSnapshot proto.InternalMessageInfo +var xxx_messageInfo_ACLState proto.InternalMessageInfo -func (m *ACLChangeACLSnapshot) GetAclState() *ACLChangeACLState { - if m != nil { - return m.AclState - } - return nil -} - -type ACLChangeACLState struct { - ReadKeyHashes []uint64 `protobuf:"varint,1,rep,packed,name=readKeyHashes,proto3" json:"readKeyHashes,omitempty"` - UserStates []*ACLChangeUserState `protobuf:"bytes,2,rep,name=userStates,proto3" json:"userStates,omitempty"` - Invites map[string]*ACLChangeUserInvite `protobuf:"bytes,3,rep,name=invites,proto3" json:"invites,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (m *ACLChangeACLState) Reset() { *m = ACLChangeACLState{} } -func (m *ACLChangeACLState) String() string { return proto.CompactTextString(m) } -func (*ACLChangeACLState) ProtoMessage() {} -func (*ACLChangeACLState) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 3} -} -func (m *ACLChangeACLState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ACLChangeACLState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ACLChangeACLState.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 *ACLChangeACLState) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeACLState.Merge(m, src) -} -func (m *ACLChangeACLState) XXX_Size() int { - return m.Size() -} -func (m *ACLChangeACLState) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeACLState.DiscardUnknown(m) -} - -var xxx_messageInfo_ACLChangeACLState proto.InternalMessageInfo - -func (m *ACLChangeACLState) GetReadKeyHashes() []uint64 { +func (m *ACLState) GetReadKeyHashes() []uint64 { if m != nil { return m.ReadKeyHashes } return nil } -func (m *ACLChangeACLState) GetUserStates() []*ACLChangeUserState { +func (m *ACLState) GetUserStates() []*ACLUserState { if m != nil { return m.UserStates } return nil } -func (m *ACLChangeACLState) GetInvites() map[string]*ACLChangeUserInvite { +func (m *ACLState) GetInvites() map[string]*ACLUserInvite { if m != nil { return m.Invites } return nil } -type ACLChangeUserState struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` - EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` - IsConfirmed bool `protobuf:"varint,5,opt,name=IsConfirmed,proto3" json:"IsConfirmed,omitempty"` +type ACLUserState struct { + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` + EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` + Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` + IsConfirmed bool `protobuf:"varint,5,opt,name=isConfirmed,proto3" json:"isConfirmed,omitempty"` } -func (m *ACLChangeUserState) Reset() { *m = ACLChangeUserState{} } -func (m *ACLChangeUserState) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserState) ProtoMessage() {} -func (*ACLChangeUserState) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 4} +func (m *ACLUserState) Reset() { *m = ACLUserState{} } +func (m *ACLUserState) String() string { return proto.CompactTextString(m) } +func (*ACLUserState) ProtoMessage() {} +func (*ACLUserState) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{4} } -func (m *ACLChangeUserState) XXX_Unmarshal(b []byte) error { +func (m *ACLUserState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLUserState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserState.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLUserState.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -623,47 +408,47 @@ func (m *ACLChangeUserState) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *ACLChangeUserState) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserState.Merge(m, src) +func (m *ACLUserState) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLUserState.Merge(m, src) } -func (m *ACLChangeUserState) XXX_Size() int { +func (m *ACLUserState) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserState) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserState.DiscardUnknown(m) +func (m *ACLUserState) XXX_DiscardUnknown() { + xxx_messageInfo_ACLUserState.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserState proto.InternalMessageInfo +var xxx_messageInfo_ACLUserState proto.InternalMessageInfo -func (m *ACLChangeUserState) GetIdentity() string { +func (m *ACLUserState) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } -func (m *ACLChangeUserState) GetEncryptionKey() []byte { +func (m *ACLUserState) GetEncryptionKey() []byte { if m != nil { return m.EncryptionKey } return nil } -func (m *ACLChangeUserState) GetEncryptedReadKeys() [][]byte { +func (m *ACLUserState) GetEncryptedReadKeys() [][]byte { if m != nil { return m.EncryptedReadKeys } return nil } -func (m *ACLChangeUserState) GetPermissions() ACLChangeUserPermissions { +func (m *ACLUserState) GetPermissions() ACLUserPermissions { if m != nil { return m.Permissions } - return ACLChange_Admin + return ACLUserPermissions_Admin } -func (m *ACLChangeUserState) GetIsConfirmed() bool { +func (m *ACLUserState) GetIsConfirmed() bool { if m != nil { return m.IsConfirmed } @@ -671,25 +456,25 @@ func (m *ACLChangeUserState) GetIsConfirmed() bool { } // we already know identity and encryptionKey -type ACLChangeUserAdd struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` - EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` +type ACLUserAdd struct { + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` + EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` + Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` } -func (m *ACLChangeUserAdd) Reset() { *m = ACLChangeUserAdd{} } -func (m *ACLChangeUserAdd) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserAdd) ProtoMessage() {} -func (*ACLChangeUserAdd) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 5} +func (m *ACLUserAdd) Reset() { *m = ACLUserAdd{} } +func (m *ACLUserAdd) String() string { return proto.CompactTextString(m) } +func (*ACLUserAdd) ProtoMessage() {} +func (*ACLUserAdd) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{5} } -func (m *ACLChangeUserAdd) XXX_Unmarshal(b []byte) error { +func (m *ACLUserAdd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserAdd) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLUserAdd) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserAdd.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLUserAdd.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -699,64 +484,64 @@ func (m *ACLChangeUserAdd) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *ACLChangeUserAdd) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserAdd.Merge(m, src) +func (m *ACLUserAdd) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLUserAdd.Merge(m, src) } -func (m *ACLChangeUserAdd) XXX_Size() int { +func (m *ACLUserAdd) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserAdd) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserAdd.DiscardUnknown(m) +func (m *ACLUserAdd) XXX_DiscardUnknown() { + xxx_messageInfo_ACLUserAdd.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserAdd proto.InternalMessageInfo +var xxx_messageInfo_ACLUserAdd proto.InternalMessageInfo -func (m *ACLChangeUserAdd) GetIdentity() string { +func (m *ACLUserAdd) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } -func (m *ACLChangeUserAdd) GetEncryptionKey() []byte { +func (m *ACLUserAdd) GetEncryptionKey() []byte { if m != nil { return m.EncryptionKey } return nil } -func (m *ACLChangeUserAdd) GetEncryptedReadKeys() [][]byte { +func (m *ACLUserAdd) GetEncryptedReadKeys() [][]byte { if m != nil { return m.EncryptedReadKeys } return nil } -func (m *ACLChangeUserAdd) GetPermissions() ACLChangeUserPermissions { +func (m *ACLUserAdd) GetPermissions() ACLUserPermissions { if m != nil { return m.Permissions } - return ACLChange_Admin + return ACLUserPermissions_Admin } // TODO: this is not used as of now -type ACLChangeUserConfirm struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` +type ACLUserConfirm struct { + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` UserAddId string `protobuf:"bytes,2,opt,name=userAddId,proto3" json:"userAddId,omitempty"` } -func (m *ACLChangeUserConfirm) Reset() { *m = ACLChangeUserConfirm{} } -func (m *ACLChangeUserConfirm) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserConfirm) ProtoMessage() {} -func (*ACLChangeUserConfirm) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 6} +func (m *ACLUserConfirm) Reset() { *m = ACLUserConfirm{} } +func (m *ACLUserConfirm) String() string { return proto.CompactTextString(m) } +func (*ACLUserConfirm) ProtoMessage() {} +func (*ACLUserConfirm) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{6} } -func (m *ACLChangeUserConfirm) XXX_Unmarshal(b []byte) error { +func (m *ACLUserConfirm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserConfirm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLUserConfirm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserConfirm.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLUserConfirm.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -766,52 +551,52 @@ func (m *ACLChangeUserConfirm) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *ACLChangeUserConfirm) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserConfirm.Merge(m, src) +func (m *ACLUserConfirm) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLUserConfirm.Merge(m, src) } -func (m *ACLChangeUserConfirm) XXX_Size() int { +func (m *ACLUserConfirm) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserConfirm) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserConfirm.DiscardUnknown(m) +func (m *ACLUserConfirm) XXX_DiscardUnknown() { + xxx_messageInfo_ACLUserConfirm.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserConfirm proto.InternalMessageInfo +var xxx_messageInfo_ACLUserConfirm proto.InternalMessageInfo -func (m *ACLChangeUserConfirm) GetIdentity() string { +func (m *ACLUserConfirm) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } -func (m *ACLChangeUserConfirm) GetUserAddId() string { +func (m *ACLUserConfirm) GetUserAddId() string { if m != nil { return m.UserAddId } return "" } -type ACLChangeUserInvite struct { - AcceptPublicKey []byte `protobuf:"bytes,1,opt,name=acceptPublicKey,proto3" json:"acceptPublicKey,omitempty"` - EncryptPublicKey []byte `protobuf:"bytes,2,opt,name=encryptPublicKey,proto3" json:"encryptPublicKey,omitempty"` - EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` - InviteId string `protobuf:"bytes,5,opt,name=InviteId,proto3" json:"InviteId,omitempty"` +type ACLUserInvite struct { + AcceptPublicKey []byte `protobuf:"bytes,1,opt,name=acceptPublicKey,proto3" json:"acceptPublicKey,omitempty"` + EncryptPublicKey []byte `protobuf:"bytes,2,opt,name=encryptPublicKey,proto3" json:"encryptPublicKey,omitempty"` + EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` + Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` + InviteId string `protobuf:"bytes,5,opt,name=inviteId,proto3" json:"inviteId,omitempty"` } -func (m *ACLChangeUserInvite) Reset() { *m = ACLChangeUserInvite{} } -func (m *ACLChangeUserInvite) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserInvite) ProtoMessage() {} -func (*ACLChangeUserInvite) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 7} +func (m *ACLUserInvite) Reset() { *m = ACLUserInvite{} } +func (m *ACLUserInvite) String() string { return proto.CompactTextString(m) } +func (*ACLUserInvite) ProtoMessage() {} +func (*ACLUserInvite) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{7} } -func (m *ACLChangeUserInvite) XXX_Unmarshal(b []byte) error { +func (m *ACLUserInvite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserInvite) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLUserInvite) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserInvite.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLUserInvite.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -821,73 +606,73 @@ func (m *ACLChangeUserInvite) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *ACLChangeUserInvite) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserInvite.Merge(m, src) +func (m *ACLUserInvite) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLUserInvite.Merge(m, src) } -func (m *ACLChangeUserInvite) XXX_Size() int { +func (m *ACLUserInvite) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserInvite) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserInvite.DiscardUnknown(m) +func (m *ACLUserInvite) XXX_DiscardUnknown() { + xxx_messageInfo_ACLUserInvite.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserInvite proto.InternalMessageInfo +var xxx_messageInfo_ACLUserInvite proto.InternalMessageInfo -func (m *ACLChangeUserInvite) GetAcceptPublicKey() []byte { +func (m *ACLUserInvite) GetAcceptPublicKey() []byte { if m != nil { return m.AcceptPublicKey } return nil } -func (m *ACLChangeUserInvite) GetEncryptPublicKey() []byte { +func (m *ACLUserInvite) GetEncryptPublicKey() []byte { if m != nil { return m.EncryptPublicKey } return nil } -func (m *ACLChangeUserInvite) GetEncryptedReadKeys() [][]byte { +func (m *ACLUserInvite) GetEncryptedReadKeys() [][]byte { if m != nil { return m.EncryptedReadKeys } return nil } -func (m *ACLChangeUserInvite) GetPermissions() ACLChangeUserPermissions { +func (m *ACLUserInvite) GetPermissions() ACLUserPermissions { if m != nil { return m.Permissions } - return ACLChange_Admin + return ACLUserPermissions_Admin } -func (m *ACLChangeUserInvite) GetInviteId() string { +func (m *ACLUserInvite) GetInviteId() string { if m != nil { return m.InviteId } return "" } -type ACLChangeUserJoin struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` +type ACLUserJoin struct { + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` AcceptSignature []byte `protobuf:"bytes,3,opt,name=acceptSignature,proto3" json:"acceptSignature,omitempty"` UserInviteId string `protobuf:"bytes,4,opt,name=userInviteId,proto3" json:"userInviteId,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,5,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` } -func (m *ACLChangeUserJoin) Reset() { *m = ACLChangeUserJoin{} } -func (m *ACLChangeUserJoin) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserJoin) ProtoMessage() {} -func (*ACLChangeUserJoin) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 8} +func (m *ACLUserJoin) Reset() { *m = ACLUserJoin{} } +func (m *ACLUserJoin) String() string { return proto.CompactTextString(m) } +func (*ACLUserJoin) ProtoMessage() {} +func (*ACLUserJoin) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{8} } -func (m *ACLChangeUserJoin) XXX_Unmarshal(b []byte) error { +func (m *ACLUserJoin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserJoin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLUserJoin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserJoin.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLUserJoin.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -897,70 +682,70 @@ func (m *ACLChangeUserJoin) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *ACLChangeUserJoin) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserJoin.Merge(m, src) +func (m *ACLUserJoin) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLUserJoin.Merge(m, src) } -func (m *ACLChangeUserJoin) XXX_Size() int { +func (m *ACLUserJoin) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserJoin) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserJoin.DiscardUnknown(m) +func (m *ACLUserJoin) XXX_DiscardUnknown() { + xxx_messageInfo_ACLUserJoin.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserJoin proto.InternalMessageInfo +var xxx_messageInfo_ACLUserJoin proto.InternalMessageInfo -func (m *ACLChangeUserJoin) GetIdentity() string { +func (m *ACLUserJoin) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } -func (m *ACLChangeUserJoin) GetEncryptionKey() []byte { +func (m *ACLUserJoin) GetEncryptionKey() []byte { if m != nil { return m.EncryptionKey } return nil } -func (m *ACLChangeUserJoin) GetAcceptSignature() []byte { +func (m *ACLUserJoin) GetAcceptSignature() []byte { if m != nil { return m.AcceptSignature } return nil } -func (m *ACLChangeUserJoin) GetUserInviteId() string { +func (m *ACLUserJoin) GetUserInviteId() string { if m != nil { return m.UserInviteId } return "" } -func (m *ACLChangeUserJoin) GetEncryptedReadKeys() [][]byte { +func (m *ACLUserJoin) GetEncryptedReadKeys() [][]byte { if m != nil { return m.EncryptedReadKeys } return nil } -type ACLChangeUserRemove struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - ReadKeyReplaces []*ACLChangeReadKeyReplace `protobuf:"bytes,3,rep,name=readKeyReplaces,proto3" json:"readKeyReplaces,omitempty"` +type ACLUserRemove struct { + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + ReadKeyReplaces []*ACLReadKeyReplace `protobuf:"bytes,3,rep,name=readKeyReplaces,proto3" json:"readKeyReplaces,omitempty"` } -func (m *ACLChangeUserRemove) Reset() { *m = ACLChangeUserRemove{} } -func (m *ACLChangeUserRemove) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserRemove) ProtoMessage() {} -func (*ACLChangeUserRemove) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 9} +func (m *ACLUserRemove) Reset() { *m = ACLUserRemove{} } +func (m *ACLUserRemove) String() string { return proto.CompactTextString(m) } +func (*ACLUserRemove) ProtoMessage() {} +func (*ACLUserRemove) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{9} } -func (m *ACLChangeUserRemove) XXX_Unmarshal(b []byte) error { +func (m *ACLUserRemove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserRemove) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLUserRemove) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserRemove.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLUserRemove.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -970,50 +755,50 @@ func (m *ACLChangeUserRemove) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *ACLChangeUserRemove) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserRemove.Merge(m, src) +func (m *ACLUserRemove) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLUserRemove.Merge(m, src) } -func (m *ACLChangeUserRemove) XXX_Size() int { +func (m *ACLUserRemove) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserRemove) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserRemove.DiscardUnknown(m) +func (m *ACLUserRemove) XXX_DiscardUnknown() { + xxx_messageInfo_ACLUserRemove.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserRemove proto.InternalMessageInfo +var xxx_messageInfo_ACLUserRemove proto.InternalMessageInfo -func (m *ACLChangeUserRemove) GetIdentity() string { +func (m *ACLUserRemove) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } -func (m *ACLChangeUserRemove) GetReadKeyReplaces() []*ACLChangeReadKeyReplace { +func (m *ACLUserRemove) GetReadKeyReplaces() []*ACLReadKeyReplace { if m != nil { return m.ReadKeyReplaces } return nil } -type ACLChangeReadKeyReplace struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` +type ACLReadKeyReplace struct { + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKey []byte `protobuf:"bytes,3,opt,name=encryptedReadKey,proto3" json:"encryptedReadKey,omitempty"` } -func (m *ACLChangeReadKeyReplace) Reset() { *m = ACLChangeReadKeyReplace{} } -func (m *ACLChangeReadKeyReplace) String() string { return proto.CompactTextString(m) } -func (*ACLChangeReadKeyReplace) ProtoMessage() {} -func (*ACLChangeReadKeyReplace) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 10} +func (m *ACLReadKeyReplace) Reset() { *m = ACLReadKeyReplace{} } +func (m *ACLReadKeyReplace) String() string { return proto.CompactTextString(m) } +func (*ACLReadKeyReplace) ProtoMessage() {} +func (*ACLReadKeyReplace) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{10} } -func (m *ACLChangeReadKeyReplace) XXX_Unmarshal(b []byte) error { +func (m *ACLReadKeyReplace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeReadKeyReplace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLReadKeyReplace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeReadKeyReplace.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLReadKeyReplace.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1023,56 +808,56 @@ func (m *ACLChangeReadKeyReplace) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *ACLChangeReadKeyReplace) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeReadKeyReplace.Merge(m, src) +func (m *ACLReadKeyReplace) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLReadKeyReplace.Merge(m, src) } -func (m *ACLChangeReadKeyReplace) XXX_Size() int { +func (m *ACLReadKeyReplace) XXX_Size() int { return m.Size() } -func (m *ACLChangeReadKeyReplace) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeReadKeyReplace.DiscardUnknown(m) +func (m *ACLReadKeyReplace) XXX_DiscardUnknown() { + xxx_messageInfo_ACLReadKeyReplace.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeReadKeyReplace proto.InternalMessageInfo +var xxx_messageInfo_ACLReadKeyReplace proto.InternalMessageInfo -func (m *ACLChangeReadKeyReplace) GetIdentity() string { +func (m *ACLReadKeyReplace) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } -func (m *ACLChangeReadKeyReplace) GetEncryptionKey() []byte { +func (m *ACLReadKeyReplace) GetEncryptionKey() []byte { if m != nil { return m.EncryptionKey } return nil } -func (m *ACLChangeReadKeyReplace) GetEncryptedReadKey() []byte { +func (m *ACLReadKeyReplace) GetEncryptedReadKey() []byte { if m != nil { return m.EncryptedReadKey } return nil } -type ACLChangeUserPermissionChange struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - Permissions ACLChangeUserPermissions `protobuf:"varint,2,opt,name=permissions,proto3,enum=acl.ACLChangeUserPermissions" json:"permissions,omitempty"` +type ACLUserPermissionChange struct { + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Permissions ACLUserPermissions `protobuf:"varint,2,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` } -func (m *ACLChangeUserPermissionChange) Reset() { *m = ACLChangeUserPermissionChange{} } -func (m *ACLChangeUserPermissionChange) String() string { return proto.CompactTextString(m) } -func (*ACLChangeUserPermissionChange) ProtoMessage() {} -func (*ACLChangeUserPermissionChange) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2, 11} +func (m *ACLUserPermissionChange) Reset() { *m = ACLUserPermissionChange{} } +func (m *ACLUserPermissionChange) String() string { return proto.CompactTextString(m) } +func (*ACLUserPermissionChange) ProtoMessage() {} +func (*ACLUserPermissionChange) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{11} } -func (m *ACLChangeUserPermissionChange) XXX_Unmarshal(b []byte) error { +func (m *ACLUserPermissionChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ACLChangeUserPermissionChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLUserPermissionChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ACLChangeUserPermissionChange.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLUserPermissionChange.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1082,152 +867,52 @@ func (m *ACLChangeUserPermissionChange) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } -func (m *ACLChangeUserPermissionChange) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLChangeUserPermissionChange.Merge(m, src) +func (m *ACLUserPermissionChange) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLUserPermissionChange.Merge(m, src) } -func (m *ACLChangeUserPermissionChange) XXX_Size() int { +func (m *ACLUserPermissionChange) XXX_Size() int { return m.Size() } -func (m *ACLChangeUserPermissionChange) XXX_DiscardUnknown() { - xxx_messageInfo_ACLChangeUserPermissionChange.DiscardUnknown(m) +func (m *ACLUserPermissionChange) XXX_DiscardUnknown() { + xxx_messageInfo_ACLUserPermissionChange.DiscardUnknown(m) } -var xxx_messageInfo_ACLChangeUserPermissionChange proto.InternalMessageInfo +var xxx_messageInfo_ACLUserPermissionChange proto.InternalMessageInfo -func (m *ACLChangeUserPermissionChange) GetIdentity() string { +func (m *ACLUserPermissionChange) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } -func (m *ACLChangeUserPermissionChange) GetPermissions() ACLChangeUserPermissions { +func (m *ACLUserPermissionChange) GetPermissions() ACLUserPermissions { if m != nil { return m.Permissions } - return ACLChange_Admin + return ACLUserPermissions_Admin } -type Change struct { - TreeHeadIds []string `protobuf:"bytes,1,rep,name=treeHeadIds,proto3" json:"treeHeadIds,omitempty"` - AclHeadId string `protobuf:"bytes,2,opt,name=aclHeadId,proto3" json:"aclHeadId,omitempty"` - SnapshotBaseId string `protobuf:"bytes,3,opt,name=snapshotBaseId,proto3" json:"snapshotBaseId,omitempty"` - ChangesData []byte `protobuf:"bytes,4,opt,name=changesData,proto3" json:"changesData,omitempty"` - CurrentReadKeyHash uint64 `protobuf:"varint,5,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` - Timestamp int64 `protobuf:"varint,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Identity string `protobuf:"bytes,7,opt,name=identity,proto3" json:"identity,omitempty"` - IsSnapshot bool `protobuf:"varint,8,opt,name=isSnapshot,proto3" json:"isSnapshot,omitempty"` -} - -func (m *Change) Reset() { *m = Change{} } -func (m *Change) String() string { return proto.CompactTextString(m) } -func (*Change) ProtoMessage() {} -func (*Change) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{3} -} -func (m *Change) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Change) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Change.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 *Change) XXX_Merge(src proto.Message) { - xxx_messageInfo_Change.Merge(m, src) -} -func (m *Change) XXX_Size() int { - return m.Size() -} -func (m *Change) XXX_DiscardUnknown() { - xxx_messageInfo_Change.DiscardUnknown(m) -} - -var xxx_messageInfo_Change proto.InternalMessageInfo - -func (m *Change) GetTreeHeadIds() []string { - if m != nil { - return m.TreeHeadIds - } - return nil -} - -func (m *Change) GetAclHeadId() string { - if m != nil { - return m.AclHeadId - } - return "" -} - -func (m *Change) GetSnapshotBaseId() string { - if m != nil { - return m.SnapshotBaseId - } - return "" -} - -func (m *Change) GetChangesData() []byte { - if m != nil { - return m.ChangesData - } - return nil -} - -func (m *Change) GetCurrentReadKeyHash() uint64 { - if m != nil { - return m.CurrentReadKeyHash - } - return 0 -} - -func (m *Change) GetTimestamp() int64 { - if m != nil { - return m.Timestamp - } - return 0 -} - -func (m *Change) GetIdentity() string { - if m != nil { - return m.Identity - } - return "" -} - -func (m *Change) GetIsSnapshot() bool { - if m != nil { - return m.IsSnapshot - } - return false -} - -type Record struct { +type ACLRecord struct { PrevId string `protobuf:"bytes,1,opt,name=prevId,proto3" json:"prevId,omitempty"` - Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` CurrentReadKeyHash uint64 `protobuf:"varint,4,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` Timestamp int64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } -func (m *Record) Reset() { *m = Record{} } -func (m *Record) String() string { return proto.CompactTextString(m) } -func (*Record) ProtoMessage() {} -func (*Record) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{4} +func (m *ACLRecord) Reset() { *m = ACLRecord{} } +func (m *ACLRecord) String() string { return proto.CompactTextString(m) } +func (*ACLRecord) ProtoMessage() {} +func (*ACLRecord) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{12} } -func (m *Record) XXX_Unmarshal(b []byte) error { +func (m *ACLRecord) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Record) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Record.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLRecord.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1237,72 +922,70 @@ func (m *Record) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Record) XXX_Merge(src proto.Message) { - xxx_messageInfo_Record.Merge(m, src) +func (m *ACLRecord) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLRecord.Merge(m, src) } -func (m *Record) XXX_Size() int { +func (m *ACLRecord) XXX_Size() int { return m.Size() } -func (m *Record) XXX_DiscardUnknown() { - xxx_messageInfo_Record.DiscardUnknown(m) +func (m *ACLRecord) XXX_DiscardUnknown() { + xxx_messageInfo_ACLRecord.DiscardUnknown(m) } -var xxx_messageInfo_Record proto.InternalMessageInfo +var xxx_messageInfo_ACLRecord proto.InternalMessageInfo -func (m *Record) GetPrevId() string { +func (m *ACLRecord) GetPrevId() string { if m != nil { return m.PrevId } return "" } -func (m *Record) GetIdentity() string { +func (m *ACLRecord) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } -func (m *Record) GetData() []byte { +func (m *ACLRecord) GetData() []byte { if m != nil { return m.Data } return nil } -func (m *Record) GetCurrentReadKeyHash() uint64 { +func (m *ACLRecord) GetCurrentReadKeyHash() uint64 { if m != nil { return m.CurrentReadKeyHash } return 0 } -func (m *Record) GetTimestamp() int64 { +func (m *ACLRecord) GetTimestamp() int64 { if m != nil { return m.Timestamp } return 0 } -type Header struct { - FirstId string `protobuf:"bytes,1,opt,name=firstId,proto3" json:"firstId,omitempty"` - AclListId string `protobuf:"bytes,2,opt,name=aclListId,proto3" json:"aclListId,omitempty"` - WorkspaceId string `protobuf:"bytes,3,opt,name=workspaceId,proto3" json:"workspaceId,omitempty"` - DocType HeaderDocType `protobuf:"varint,4,opt,name=docType,proto3,enum=acl.HeaderDocType" json:"docType,omitempty"` +type ACLHeader struct { + FirstId string `protobuf:"bytes,1,opt,name=firstId,proto3" json:"firstId,omitempty"` + Identity []byte `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` } -func (m *Header) Reset() { *m = Header{} } -func (m *Header) String() string { return proto.CompactTextString(m) } -func (*Header) ProtoMessage() {} -func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{5} +func (m *ACLHeader) Reset() { *m = ACLHeader{} } +func (m *ACLHeader) String() string { return proto.CompactTextString(m) } +func (*ACLHeader) ProtoMessage() {} +func (*ACLHeader) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{13} } -func (m *Header) XXX_Unmarshal(b []byte) error { +func (m *ACLHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ACLHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Header.Marshal(b, m, deterministic) + return xxx_messageInfo_ACLHeader.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1312,68 +995,334 @@ func (m *Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Header) XXX_Merge(src proto.Message) { - xxx_messageInfo_Header.Merge(m, src) +func (m *ACLHeader) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLHeader.Merge(m, src) } -func (m *Header) XXX_Size() int { +func (m *ACLHeader) XXX_Size() int { return m.Size() } -func (m *Header) XXX_DiscardUnknown() { - xxx_messageInfo_Header.DiscardUnknown(m) +func (m *ACLHeader) XXX_DiscardUnknown() { + xxx_messageInfo_ACLHeader.DiscardUnknown(m) } -var xxx_messageInfo_Header proto.InternalMessageInfo +var xxx_messageInfo_ACLHeader proto.InternalMessageInfo -func (m *Header) GetFirstId() string { +func (m *ACLHeader) GetFirstId() string { if m != nil { return m.FirstId } return "" } -func (m *Header) GetAclListId() string { +func (m *ACLHeader) GetIdentity() []byte { if m != nil { - return m.AclListId + return m.Identity + } + return nil +} + +type RawTreeChange struct { + Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` +} + +func (m *RawTreeChange) Reset() { *m = RawTreeChange{} } +func (m *RawTreeChange) String() string { return proto.CompactTextString(m) } +func (*RawTreeChange) ProtoMessage() {} +func (*RawTreeChange) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{14} +} +func (m *RawTreeChange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RawTreeChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RawTreeChange.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 *RawTreeChange) XXX_Merge(src proto.Message) { + xxx_messageInfo_RawTreeChange.Merge(m, src) +} +func (m *RawTreeChange) XXX_Size() int { + return m.Size() +} +func (m *RawTreeChange) XXX_DiscardUnknown() { + xxx_messageInfo_RawTreeChange.DiscardUnknown(m) +} + +var xxx_messageInfo_RawTreeChange proto.InternalMessageInfo + +func (m *RawTreeChange) GetPayload() []byte { + if m != nil { + return m.Payload + } + return nil +} + +func (m *RawTreeChange) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +type RawTreeChangeWithId struct { + RawChange []byte `protobuf:"bytes,1,opt,name=rawChange,proto3" json:"rawChange,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *RawTreeChangeWithId) Reset() { *m = RawTreeChangeWithId{} } +func (m *RawTreeChangeWithId) String() string { return proto.CompactTextString(m) } +func (*RawTreeChangeWithId) ProtoMessage() {} +func (*RawTreeChangeWithId) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{15} +} +func (m *RawTreeChangeWithId) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RawTreeChangeWithId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RawTreeChangeWithId.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 *RawTreeChangeWithId) XXX_Merge(src proto.Message) { + xxx_messageInfo_RawTreeChangeWithId.Merge(m, src) +} +func (m *RawTreeChangeWithId) XXX_Size() int { + return m.Size() +} +func (m *RawTreeChangeWithId) XXX_DiscardUnknown() { + xxx_messageInfo_RawTreeChangeWithId.DiscardUnknown(m) +} + +var xxx_messageInfo_RawTreeChangeWithId proto.InternalMessageInfo + +func (m *RawTreeChangeWithId) GetRawChange() []byte { + if m != nil { + return m.RawChange + } + return nil +} + +func (m *RawTreeChangeWithId) GetId() string { + if m != nil { + return m.Id } return "" } -func (m *Header) GetWorkspaceId() string { +type TreeChange struct { + TreeHeadIds []string `protobuf:"bytes,1,rep,name=treeHeadIds,proto3" json:"treeHeadIds,omitempty"` + AclHeadId string `protobuf:"bytes,2,opt,name=aclHeadId,proto3" json:"aclHeadId,omitempty"` + SnapshotBaseId string `protobuf:"bytes,3,opt,name=snapshotBaseId,proto3" json:"snapshotBaseId,omitempty"` + ChangesData []byte `protobuf:"bytes,4,opt,name=changesData,proto3" json:"changesData,omitempty"` + CurrentReadKeyHash uint64 `protobuf:"varint,5,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` + Timestamp int64 `protobuf:"varint,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Identity []byte `protobuf:"bytes,7,opt,name=identity,proto3" json:"identity,omitempty"` + IsSnapshot bool `protobuf:"varint,8,opt,name=isSnapshot,proto3" json:"isSnapshot,omitempty"` +} + +func (m *TreeChange) Reset() { *m = TreeChange{} } +func (m *TreeChange) String() string { return proto.CompactTextString(m) } +func (*TreeChange) ProtoMessage() {} +func (*TreeChange) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{16} +} +func (m *TreeChange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TreeChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TreeChange.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 *TreeChange) XXX_Merge(src proto.Message) { + xxx_messageInfo_TreeChange.Merge(m, src) +} +func (m *TreeChange) XXX_Size() int { + return m.Size() +} +func (m *TreeChange) XXX_DiscardUnknown() { + xxx_messageInfo_TreeChange.DiscardUnknown(m) +} + +var xxx_messageInfo_TreeChange proto.InternalMessageInfo + +func (m *TreeChange) GetTreeHeadIds() []string { if m != nil { - return m.WorkspaceId + return m.TreeHeadIds + } + return nil +} + +func (m *TreeChange) GetAclHeadId() string { + if m != nil { + return m.AclHeadId } return "" } -func (m *Header) GetDocType() HeaderDocType { +func (m *TreeChange) GetSnapshotBaseId() string { if m != nil { - return m.DocType + return m.SnapshotBaseId } - return Header_ACL + return "" +} + +func (m *TreeChange) GetChangesData() []byte { + if m != nil { + return m.ChangesData + } + return nil +} + +func (m *TreeChange) GetCurrentReadKeyHash() uint64 { + if m != nil { + return m.CurrentReadKeyHash + } + return 0 +} + +func (m *TreeChange) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *TreeChange) GetIdentity() []byte { + if m != nil { + return m.Identity + } + return nil +} + +func (m *TreeChange) GetIsSnapshot() bool { + if m != nil { + return m.IsSnapshot + } + return false +} + +type TreeHeader struct { + FirstId string `protobuf:"bytes,1,opt,name=firstId,proto3" json:"firstId,omitempty"` + AclId string `protobuf:"bytes,2,opt,name=aclId,proto3" json:"aclId,omitempty"` + TreeHeaderType TreeHeaderType `protobuf:"varint,3,opt,name=treeHeaderType,proto3,enum=acl.TreeHeaderType" json:"treeHeaderType,omitempty"` + Identity []byte `protobuf:"bytes,4,opt,name=identity,proto3" json:"identity,omitempty"` + Data []byte `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *TreeHeader) Reset() { *m = TreeHeader{} } +func (m *TreeHeader) String() string { return proto.CompactTextString(m) } +func (*TreeHeader) ProtoMessage() {} +func (*TreeHeader) Descriptor() ([]byte, []int) { + return fileDescriptor_37a022c841a51877, []int{17} +} +func (m *TreeHeader) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TreeHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TreeHeader.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 *TreeHeader) XXX_Merge(src proto.Message) { + xxx_messageInfo_TreeHeader.Merge(m, src) +} +func (m *TreeHeader) XXX_Size() int { + return m.Size() +} +func (m *TreeHeader) XXX_DiscardUnknown() { + xxx_messageInfo_TreeHeader.DiscardUnknown(m) +} + +var xxx_messageInfo_TreeHeader proto.InternalMessageInfo + +func (m *TreeHeader) GetFirstId() string { + if m != nil { + return m.FirstId + } + return "" +} + +func (m *TreeHeader) GetAclId() string { + if m != nil { + return m.AclId + } + return "" +} + +func (m *TreeHeader) GetTreeHeaderType() TreeHeaderType { + if m != nil { + return m.TreeHeaderType + } + return TreeHeaderType_Object +} + +func (m *TreeHeader) GetIdentity() []byte { + if m != nil { + return m.Identity + } + return nil +} + +func (m *TreeHeader) GetData() []byte { + if m != nil { + return m.Data + } + return nil } func init() { - proto.RegisterEnum("acl.ACLChangeUserPermissions", ACLChangeUserPermissions_name, ACLChangeUserPermissions_value) - proto.RegisterEnum("acl.HeaderDocType", HeaderDocType_name, HeaderDocType_value) - proto.RegisterType((*RawChange)(nil), "acl.RawChange") - proto.RegisterType((*RawRecord)(nil), "acl.RawRecord") - proto.RegisterType((*ACLChange)(nil), "acl.ACLChange") - proto.RegisterType((*ACLChangeACLContentValue)(nil), "acl.ACLChange.ACLContentValue") - proto.RegisterType((*ACLChangeACLData)(nil), "acl.ACLChange.ACLData") - proto.RegisterType((*ACLChangeACLSnapshot)(nil), "acl.ACLChange.ACLSnapshot") - proto.RegisterType((*ACLChangeACLState)(nil), "acl.ACLChange.ACLState") - proto.RegisterMapType((map[string]*ACLChangeUserInvite)(nil), "acl.ACLChange.ACLState.InvitesEntry") - proto.RegisterType((*ACLChangeUserState)(nil), "acl.ACLChange.UserState") - proto.RegisterType((*ACLChangeUserAdd)(nil), "acl.ACLChange.UserAdd") - proto.RegisterType((*ACLChangeUserConfirm)(nil), "acl.ACLChange.UserConfirm") - proto.RegisterType((*ACLChangeUserInvite)(nil), "acl.ACLChange.UserInvite") - proto.RegisterType((*ACLChangeUserJoin)(nil), "acl.ACLChange.UserJoin") - proto.RegisterType((*ACLChangeUserRemove)(nil), "acl.ACLChange.UserRemove") - proto.RegisterType((*ACLChangeReadKeyReplace)(nil), "acl.ACLChange.ReadKeyReplace") - proto.RegisterType((*ACLChangeUserPermissionChange)(nil), "acl.ACLChange.UserPermissionChange") - proto.RegisterType((*Change)(nil), "acl.Change") - proto.RegisterType((*Record)(nil), "acl.Record") - proto.RegisterType((*Header)(nil), "acl.Header") + proto.RegisterEnum("acl.ACLUserPermissions", ACLUserPermissions_name, ACLUserPermissions_value) + proto.RegisterEnum("acl.TreeHeaderType", TreeHeaderType_name, TreeHeaderType_value) + proto.RegisterType((*RawACLRecord)(nil), "acl.RawACLRecord") + proto.RegisterType((*ACLContentValue)(nil), "acl.ACLContentValue") + proto.RegisterType((*ACLData)(nil), "acl.ACLData") + proto.RegisterType((*ACLState)(nil), "acl.ACLState") + proto.RegisterMapType((map[string]*ACLUserInvite)(nil), "acl.ACLState.InvitesEntry") + proto.RegisterType((*ACLUserState)(nil), "acl.ACLUserState") + proto.RegisterType((*ACLUserAdd)(nil), "acl.ACLUserAdd") + proto.RegisterType((*ACLUserConfirm)(nil), "acl.ACLUserConfirm") + proto.RegisterType((*ACLUserInvite)(nil), "acl.ACLUserInvite") + proto.RegisterType((*ACLUserJoin)(nil), "acl.ACLUserJoin") + proto.RegisterType((*ACLUserRemove)(nil), "acl.ACLUserRemove") + proto.RegisterType((*ACLReadKeyReplace)(nil), "acl.ACLReadKeyReplace") + proto.RegisterType((*ACLUserPermissionChange)(nil), "acl.ACLUserPermissionChange") + proto.RegisterType((*ACLRecord)(nil), "acl.ACLRecord") + proto.RegisterType((*ACLHeader)(nil), "acl.ACLHeader") + proto.RegisterType((*RawTreeChange)(nil), "acl.RawTreeChange") + proto.RegisterType((*RawTreeChangeWithId)(nil), "acl.RawTreeChangeWithId") + proto.RegisterType((*TreeChange)(nil), "acl.TreeChange") + proto.RegisterType((*TreeHeader)(nil), "acl.TreeHeader") } func init() { @@ -1381,81 +1330,78 @@ func init() { } var fileDescriptor_37a022c841a51877 = []byte{ - // 1131 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x57, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xf7, 0xf8, 0xdf, 0x7a, 0xdf, 0x86, 0xc4, 0x4c, 0xab, 0xd6, 0xac, 0x8a, 0x6b, 0x99, 0x0a, - 0x59, 0x08, 0x9c, 0xca, 0x15, 0x52, 0x05, 0x28, 0x22, 0x49, 0x51, 0x6d, 0x92, 0x43, 0x35, 0xa1, - 0x20, 0xb8, 0x4d, 0x76, 0xa7, 0xc9, 0x2a, 0xf6, 0xee, 0xb2, 0x33, 0x49, 0xe5, 0x0b, 0x12, 0x27, - 0xae, 0x9c, 0x11, 0xe2, 0x43, 0x70, 0xe5, 0x0b, 0xf4, 0xd8, 0x23, 0x37, 0x50, 0x72, 0xe7, 0xc2, - 0x17, 0x40, 0xf3, 0x67, 0xd7, 0xeb, 0xf5, 0x26, 0x0a, 0x52, 0x84, 0xc4, 0x21, 0xd2, 0xcc, 0xef, - 0xfd, 0xde, 0xf8, 0xbd, 0xf7, 0x7b, 0xf3, 0x32, 0x0b, 0x0f, 0xe3, 0x93, 0xa3, 0x4d, 0xea, 0x4d, - 0xe5, 0x9f, 0x77, 0x4c, 0xc3, 0x23, 0xc6, 0xe5, 0x32, 0x3e, 0xdc, 0x8c, 0x93, 0x48, 0x44, 0x3c, - 0x87, 0x0f, 0x15, 0x82, 0x6b, 0xd4, 0x9b, 0xf6, 0x0f, 0xc0, 0x26, 0xf4, 0xe5, 0xae, 0x32, 0xe0, - 0x0e, 0x58, 0x31, 0x9d, 0x4f, 0x23, 0xea, 0x77, 0x50, 0x0f, 0x0d, 0xd6, 0x48, 0xba, 0xc5, 0xf7, - 0xc0, 0xe6, 0xc1, 0x51, 0x48, 0xc5, 0x69, 0xc2, 0x3a, 0x55, 0x65, 0x5b, 0x00, 0x78, 0x1d, 0xaa, - 0x81, 0xdf, 0xa9, 0xf5, 0xd0, 0xc0, 0x26, 0xd5, 0xc0, 0x37, 0x87, 0x12, 0xe6, 0x45, 0x89, 0x7f, - 0x63, 0x87, 0xfe, 0x7d, 0x0b, 0xec, 0xed, 0xdd, 0x7d, 0x13, 0x6a, 0x0f, 0x1c, 0x91, 0x30, 0x36, - 0x66, 0xd4, 0x9f, 0xf8, 0xbc, 0x83, 0x7a, 0xb5, 0x81, 0x4d, 0xf2, 0x10, 0xee, 0x02, 0x50, 0x6f, - 0x9a, 0x12, 0xaa, 0x8a, 0x90, 0x43, 0xf0, 0xbb, 0xb0, 0xce, 0x43, 0x1a, 0xf3, 0xe3, 0x48, 0xec, - 0x50, 0xce, 0x26, 0xe9, 0x6f, 0x15, 0x50, 0xfc, 0x10, 0x2c, 0xea, 0x4d, 0x9f, 0x50, 0x41, 0x3b, - 0xf5, 0x1e, 0x1a, 0x38, 0xa3, 0x3b, 0x43, 0xea, 0x4d, 0x87, 0x59, 0x28, 0x72, 0x25, 0xad, 0x24, - 0xa5, 0xc9, 0xd8, 0x4c, 0xa5, 0x95, 0x57, 0x43, 0x65, 0x96, 0x87, 0xf0, 0x10, 0xb0, 0x77, 0x9a, - 0x24, 0x2c, 0x14, 0x84, 0x51, 0x7f, 0x8f, 0xcd, 0xc7, 0x94, 0x1f, 0x77, 0x9a, 0x3d, 0x34, 0xa8, - 0x93, 0x12, 0x8b, 0xac, 0x94, 0x08, 0x66, 0x8c, 0x0b, 0x3a, 0x8b, 0x3b, 0x56, 0x0f, 0x0d, 0x6a, - 0x64, 0x01, 0x60, 0x17, 0x5a, 0x81, 0xcf, 0x42, 0x11, 0x88, 0x79, 0xa7, 0xa5, 0x72, 0xc8, 0xf6, - 0xee, 0x4f, 0x35, 0xd8, 0x90, 0xa1, 0x46, 0xa1, 0x60, 0xa1, 0xf8, 0x92, 0x4e, 0x4f, 0x19, 0x1e, - 0x81, 0x75, 0xca, 0x59, 0xb2, 0xed, 0x6b, 0x45, 0x56, 0x33, 0x7a, 0xae, 0xad, 0xe3, 0x0a, 0x49, - 0x89, 0xf8, 0x63, 0x00, 0xb9, 0x24, 0x6c, 0x16, 0x9d, 0x69, 0xb1, 0x9c, 0xd1, 0x5b, 0x25, 0x6e, - 0x9a, 0x30, 0xae, 0x90, 0x1c, 0x1d, 0x7f, 0x0d, 0xb7, 0xe5, 0xee, 0x19, 0x4b, 0x66, 0x01, 0xe7, - 0x41, 0x14, 0x6a, 0x07, 0x55, 0x70, 0x67, 0xf4, 0x4e, 0xc9, 0x31, 0x45, 0xea, 0xb8, 0x42, 0x4a, - 0x8f, 0x48, 0xe3, 0x9a, 0x84, 0x67, 0x81, 0x60, 0x46, 0xa0, 0xb2, 0xb8, 0x34, 0x21, 0x8d, 0x4b, - 0xef, 0xf0, 0x87, 0xd0, 0x92, 0xbb, 0xcf, 0xa3, 0x20, 0x54, 0x2a, 0x39, 0xa3, 0xbb, 0x25, 0xae, - 0xd2, 0x3c, 0xae, 0x90, 0x8c, 0x8a, 0xb7, 0xc0, 0x91, 0xeb, 0xdd, 0x28, 0x7c, 0x11, 0x24, 0x33, - 0x25, 0x9b, 0x33, 0x72, 0x4b, 0x3c, 0x0d, 0x63, 0x5c, 0x21, 0x79, 0x87, 0x1d, 0x0b, 0x1a, 0x67, - 0x52, 0x08, 0xf7, 0x07, 0x04, 0x96, 0xe9, 0x1e, 0xfc, 0x09, 0x38, 0xd4, 0x9b, 0x1e, 0x98, 0xde, - 0x33, 0xc2, 0xb8, 0xab, 0xad, 0x96, 0x32, 0x48, 0x9e, 0x8e, 0xb7, 0x54, 0xb3, 0x1b, 0x95, 0x55, - 0xb3, 0x3b, 0xa3, 0xee, 0xaa, 0x73, 0xbe, 0x0d, 0x48, 0xce, 0xc3, 0xdd, 0x01, 0x27, 0x77, 0x36, - 0x7e, 0x04, 0x2d, 0x79, 0xba, 0xa0, 0x82, 0x99, 0x48, 0xee, 0x96, 0x44, 0x22, 0xcd, 0x24, 0x23, - 0xba, 0xdf, 0x57, 0xa1, 0x95, 0xc2, 0xf8, 0x01, 0xbc, 0x91, 0x2c, 0x1a, 0x98, 0xe9, 0x1b, 0x5a, - 0x27, 0xcb, 0x20, 0x7e, 0xac, 0xd5, 0x53, 0x2e, 0xdc, 0x84, 0xdd, 0x29, 0x29, 0xa4, 0xfe, 0xa9, - 0x1c, 0x17, 0x6f, 0x81, 0x15, 0x28, 0x11, 0x79, 0xa7, 0xa6, 0xdc, 0x1e, 0x5c, 0x12, 0xe0, 0x50, - 0x6b, 0xcd, 0x3f, 0x0b, 0x45, 0x32, 0x27, 0xa9, 0x93, 0xfb, 0x1c, 0xd6, 0xf2, 0x06, 0xdc, 0x86, - 0xda, 0x09, 0x9b, 0xab, 0x64, 0x6d, 0x22, 0x97, 0x78, 0xd3, 0xa8, 0x74, 0x45, 0xb3, 0xeb, 0x13, - 0x88, 0xe6, 0x7d, 0x54, 0x7d, 0x8c, 0xdc, 0x3f, 0x10, 0xd8, 0x59, 0xc0, 0x4b, 0x17, 0x13, 0x2d, - 0x5f, 0x4c, 0x59, 0x20, 0x16, 0x7a, 0xc9, 0x3c, 0x16, 0x41, 0x14, 0xee, 0xb1, 0xb9, 0x19, 0x80, - 0xcb, 0x20, 0x7e, 0x1f, 0xde, 0x34, 0x00, 0xf3, 0xcd, 0x40, 0xd0, 0x09, 0xaf, 0x91, 0x55, 0x03, - 0xfe, 0x14, 0x9c, 0x38, 0xbb, 0x20, 0x5c, 0xdd, 0x86, 0xf5, 0x95, 0x36, 0x58, 0xbe, 0x5e, 0x9c, - 0xe4, 0x5d, 0xe4, 0xe8, 0x9a, 0x70, 0xd3, 0xa7, 0xcc, 0x57, 0x97, 0xa2, 0x45, 0xf2, 0x90, 0xfb, - 0x1b, 0x02, 0xcb, 0xcc, 0x87, 0xff, 0x5f, 0x7e, 0xee, 0x53, 0x70, 0x72, 0x17, 0xf3, 0xca, 0x04, - 0xee, 0x81, 0x6d, 0x86, 0xdf, 0xc4, 0x57, 0xc1, 0xdb, 0x64, 0x01, 0xb8, 0x7f, 0x21, 0x80, 0x45, - 0x0b, 0xe0, 0x01, 0x6c, 0x50, 0xcf, 0x63, 0xb1, 0x78, 0x76, 0x7a, 0x38, 0x0d, 0xbc, 0x3d, 0xd3, - 0x4a, 0x6b, 0xa4, 0x08, 0xe3, 0xf7, 0xa0, 0x6d, 0x12, 0x5b, 0x50, 0x75, 0x69, 0x56, 0xf0, 0xff, - 0x5c, 0x7d, 0x17, 0x5a, 0x3a, 0x9f, 0x89, 0x96, 0xde, 0x26, 0xd9, 0xde, 0x7d, 0x85, 0xa0, 0x95, - 0x4e, 0xc3, 0x1b, 0x10, 0x3e, 0x2b, 0xd8, 0x41, 0xf6, 0x02, 0xa8, 0xe5, 0x0b, 0x96, 0xc1, 0xb8, - 0x0f, 0x6b, 0x8b, 0x91, 0x3d, 0xf1, 0x55, 0x5e, 0x36, 0x59, 0xc2, 0xca, 0x0b, 0xd5, 0xb8, 0xa4, - 0x50, 0xee, 0xb7, 0x5a, 0x3a, 0xf3, 0xcf, 0xe9, 0xaa, 0x5c, 0x9e, 0xc2, 0x86, 0x19, 0x58, 0x84, - 0xc5, 0x53, 0xea, 0x65, 0xd3, 0xe6, 0xed, 0x42, 0x59, 0xc9, 0x12, 0x8b, 0x14, 0xbd, 0xdc, 0xef, - 0x60, 0x7d, 0x99, 0x72, 0x03, 0x25, 0x5c, 0x74, 0x52, 0x96, 0x9b, 0xa9, 0xe1, 0x0a, 0xee, 0x0a, - 0xb8, 0x5d, 0xf6, 0x6f, 0xf5, 0xca, 0x28, 0x0a, 0xfd, 0x54, 0xfd, 0xd7, 0xfd, 0xd4, 0xdf, 0x86, - 0x8d, 0x82, 0x1d, 0xdb, 0xd0, 0xd8, 0xf6, 0x67, 0x41, 0xd8, 0xae, 0x60, 0x80, 0xe6, 0x57, 0x49, - 0x20, 0x58, 0xd2, 0x46, 0x72, 0x2d, 0x43, 0x65, 0x49, 0xbb, 0x8a, 0x1d, 0xb0, 0xb4, 0x34, 0x7e, - 0xbb, 0xd6, 0xff, 0xb9, 0x0a, 0xcd, 0x6b, 0x3f, 0xf9, 0xee, 0x81, 0x9d, 0x3d, 0xf0, 0xd2, 0x2b, - 0x9b, 0x01, 0xd7, 0x7e, 0xf0, 0x15, 0x9e, 0x6f, 0xf5, 0xeb, 0x3e, 0xdf, 0x1a, 0xd7, 0x7b, 0xbe, - 0x35, 0xaf, 0x7a, 0xbe, 0x59, 0x05, 0x0d, 0xba, 0x00, 0x01, 0xcf, 0x1e, 0x05, 0x2d, 0x35, 0x8e, - 0x73, 0x48, 0xff, 0x17, 0x24, 0x0b, 0xa7, 0xde, 0xd9, 0x77, 0xa0, 0x19, 0x27, 0xec, 0x6c, 0xe2, - 0x1b, 0x21, 0xcd, 0x6e, 0xe9, 0xf8, 0x6a, 0xe1, 0x78, 0x0c, 0x75, 0x5f, 0xe6, 0xa8, 0xdb, 0x46, - 0xad, 0x2f, 0x49, 0xae, 0x7e, 0xbd, 0xe4, 0x1a, 0x85, 0xe4, 0xfa, 0xbf, 0x22, 0x68, 0x8e, 0x95, - 0xb2, 0xf2, 0x43, 0xe0, 0x45, 0x90, 0x70, 0x91, 0x45, 0x98, 0x6e, 0x8d, 0x6e, 0xfb, 0x81, 0xb2, - 0x2d, 0x74, 0xd3, 0x80, 0xd4, 0xe3, 0x65, 0x94, 0x9c, 0xf0, 0x98, 0x7a, 0x0b, 0xd1, 0xf2, 0x10, - 0xfe, 0x00, 0x2c, 0x3f, 0xf2, 0xbe, 0x98, 0xc7, 0xcc, 0x4c, 0xbd, 0x5b, 0xaa, 0x4b, 0xf5, 0xef, - 0x0e, 0x9f, 0x68, 0x13, 0x49, 0x39, 0xfd, 0xfb, 0x60, 0x19, 0x0c, 0x5b, 0x50, 0xdb, 0xde, 0xdd, - 0x6f, 0x57, 0x64, 0xd3, 0x49, 0x2c, 0x61, 0xac, 0x8d, 0x76, 0xee, 0xbf, 0x3a, 0xef, 0xa2, 0xd7, - 0xe7, 0x5d, 0xf4, 0xe7, 0x79, 0x17, 0xfd, 0x78, 0xd1, 0xad, 0xbc, 0xbe, 0xe8, 0x56, 0x7e, 0xbf, - 0xe8, 0x56, 0xbe, 0x69, 0xa8, 0x4f, 0xaa, 0xc3, 0xa6, 0xfa, 0x82, 0x7a, 0xf4, 0x4f, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x14, 0x6d, 0xee, 0xf8, 0x75, 0x0d, 0x00, 0x00, + // 1078 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0xcd, 0x6e, 0x23, 0x45, + 0x10, 0xf6, 0x8c, 0xe3, 0x38, 0x2e, 0x3b, 0x8e, 0xd3, 0x1b, 0xed, 0x8e, 0xa2, 0xc8, 0x44, 0x23, + 0x04, 0x51, 0x40, 0x5e, 0x08, 0x2b, 0xf1, 0x77, 0x00, 0xc7, 0x8b, 0xb0, 0x37, 0x11, 0xac, 0x3a, + 0x61, 0x57, 0xe2, 0xd6, 0x99, 0xe9, 0x4d, 0x9a, 0xb5, 0x67, 0x46, 0xd3, 0x9d, 0x44, 0x3e, 0xf2, + 0x06, 0x3c, 0x02, 0x1c, 0x79, 0x02, 0x5e, 0x01, 0x89, 0xcb, 0x1e, 0x91, 0xb8, 0xa0, 0xe4, 0x04, + 0x27, 0x1e, 0x01, 0xf5, 0xcf, 0xcc, 0xf4, 0xd8, 0x4e, 0xf8, 0xd1, 0x0a, 0x89, 0xc3, 0x48, 0xdd, + 0x5f, 0x55, 0x75, 0x57, 0x7d, 0x55, 0x53, 0x5d, 0xf0, 0x56, 0xf2, 0xfc, 0xf4, 0x3e, 0x09, 0xc6, + 0xf2, 0x0b, 0xce, 0x48, 0x74, 0x4a, 0xb9, 0x5c, 0x26, 0x27, 0xf7, 0x93, 0x34, 0x16, 0x31, 0xb7, + 0xf0, 0x9e, 0x42, 0x50, 0x95, 0x04, 0x63, 0xff, 0x09, 0xb4, 0x30, 0xb9, 0xec, 0x0f, 0x0e, 0x31, + 0x0d, 0xe2, 0x34, 0x44, 0x1e, 0xd4, 0x13, 0x32, 0x1d, 0xc7, 0x24, 0xf4, 0x9c, 0x6d, 0x67, 0xa7, + 0x85, 0xb3, 0x2d, 0xda, 0x82, 0x06, 0x67, 0xa7, 0x11, 0x11, 0xe7, 0x29, 0xf5, 0x5c, 0x25, 0x2b, + 0x00, 0xd4, 0x06, 0x97, 0x85, 0x5e, 0x75, 0xdb, 0xd9, 0x69, 0x60, 0x97, 0x85, 0xfe, 0x1f, 0x2e, + 0xac, 0xf5, 0x07, 0x87, 0x83, 0x38, 0x12, 0x34, 0x12, 0x4f, 0xc8, 0xf8, 0x9c, 0xa2, 0x37, 0xa0, + 0x7e, 0xce, 0x69, 0xda, 0x0f, 0xf5, 0xd9, 0xcd, 0xbd, 0xb5, 0x1e, 0x09, 0xc6, 0xbd, 0xfe, 0xe0, + 0xf0, 0x0b, 0x0d, 0x0f, 0x2b, 0x38, 0xd3, 0x40, 0x0f, 0x00, 0xe4, 0x12, 0xd3, 0x49, 0x7c, 0xa1, + 0xef, 0x6b, 0xee, 0x21, 0x5b, 0x5f, 0x4b, 0x86, 0x15, 0x6c, 0xe9, 0x21, 0x0c, 0x1b, 0x72, 0xf7, + 0x98, 0xa6, 0x13, 0xc6, 0x39, 0x8b, 0xa3, 0x81, 0x0a, 0x59, 0x39, 0xd6, 0xdc, 0xdb, 0xb2, 0xed, + 0x67, 0x75, 0x86, 0x15, 0xbc, 0xd0, 0x36, 0xf3, 0x64, 0x14, 0x5d, 0x30, 0x41, 0xbd, 0xa5, 0x79, + 0x4f, 0xb4, 0x24, 0xf3, 0x44, 0xef, 0x50, 0x0f, 0x56, 0xe4, 0xee, 0x51, 0xcc, 0x22, 0xaf, 0xa6, + 0x6c, 0x3a, 0xb6, 0x8d, 0xc4, 0x87, 0x15, 0x9c, 0xeb, 0xa0, 0x77, 0xa1, 0x29, 0xd7, 0x83, 0x38, + 0x7a, 0xc6, 0xd2, 0x89, 0xb7, 0xac, 0x4c, 0xee, 0xd8, 0x26, 0x46, 0x34, 0xac, 0x60, 0x5b, 0x73, + 0xbf, 0x0e, 0xb5, 0x0b, 0x49, 0xaf, 0xff, 0x11, 0xd4, 0xfb, 0x83, 0xc3, 0x87, 0x44, 0x10, 0xe9, + 0x32, 0x09, 0xc6, 0x86, 0x7c, 0xcf, 0xd9, 0xae, 0xee, 0x34, 0xf7, 0x36, 0xb2, 0xb3, 0xec, 0x9c, + 0x60, 0x4b, 0xcf, 0xff, 0xcd, 0x81, 0x95, 0xfe, 0xe0, 0xf0, 0x48, 0x10, 0x41, 0xd1, 0xab, 0xb0, + 0x9a, 0x52, 0x12, 0x1e, 0xd0, 0xe9, 0x90, 0xf0, 0x33, 0xca, 0xd5, 0x29, 0x4b, 0xb8, 0x0c, 0xa2, + 0xb7, 0x35, 0x37, 0xca, 0x84, 0x7b, 0xae, 0xba, 0x68, 0xdd, 0x76, 0x5a, 0x49, 0xb0, 0xa5, 0x84, + 0x1e, 0x40, 0x9d, 0x29, 0x8a, 0xb8, 0x57, 0x55, 0xfa, 0x9b, 0x99, 0xbe, 0x52, 0xe8, 0x69, 0xfe, + 0xf8, 0x27, 0x91, 0x48, 0xa7, 0x38, 0x53, 0xdd, 0xfc, 0x0c, 0x5a, 0xb6, 0x00, 0x75, 0xa0, 0xfa, + 0x9c, 0x4e, 0x55, 0x1d, 0x35, 0xb0, 0x5c, 0xa2, 0x1d, 0xc3, 0xc3, 0xa2, 0x5a, 0xd1, 0xa6, 0x58, + 0x2b, 0x7c, 0xe0, 0xbe, 0xe7, 0xf8, 0xbf, 0x38, 0xd0, 0xb2, 0x5d, 0x44, 0x9b, 0xb0, 0xc2, 0x42, + 0x1a, 0x09, 0x26, 0xa6, 0xa6, 0xf2, 0xf3, 0xbd, 0xe4, 0x82, 0x46, 0x41, 0x3a, 0x4d, 0x04, 0x8b, + 0xa3, 0x03, 0x3a, 0x35, 0xe5, 0x5f, 0x06, 0xd1, 0x9b, 0xb0, 0x6e, 0x00, 0x1a, 0x62, 0xcd, 0x92, + 0x0e, 0xb1, 0x85, 0xe7, 0x05, 0xe8, 0x7d, 0x68, 0x26, 0x79, 0xa5, 0x71, 0x55, 0x56, 0xed, 0xbd, + 0x7b, 0x8b, 0x0b, 0x94, 0x63, 0x5b, 0x17, 0x6d, 0x43, 0x93, 0x71, 0x93, 0x7e, 0x1a, 0xaa, 0xea, + 0x5a, 0xc1, 0x36, 0xe4, 0xff, 0xe0, 0x00, 0x14, 0xbf, 0xd5, 0xff, 0x28, 0x36, 0xff, 0x11, 0xb4, + 0xcb, 0xe5, 0x7e, 0xab, 0xf3, 0x5b, 0xd0, 0x30, 0xfd, 0x62, 0x14, 0x2a, 0xc7, 0x1b, 0xb8, 0x00, + 0xfc, 0xdf, 0x1d, 0x58, 0x2d, 0x15, 0x00, 0xda, 0x81, 0x35, 0x12, 0x04, 0x34, 0x11, 0x8f, 0xcf, + 0x4f, 0xc6, 0x2c, 0x38, 0xa0, 0xd9, 0x91, 0xb3, 0x30, 0xda, 0x85, 0x8e, 0x89, 0xab, 0x50, 0xd5, + 0xcc, 0xcc, 0xe1, 0xff, 0x5d, 0xe2, 0x25, 0x15, 0x2a, 0x90, 0x91, 0xce, 0x7a, 0x03, 0xe7, 0x7b, + 0xff, 0x27, 0x07, 0x9a, 0x56, 0x6f, 0x79, 0x09, 0x39, 0xcf, 0xc9, 0x3a, 0xca, 0xdb, 0x7e, 0xd5, + 0x26, 0x2b, 0x87, 0x91, 0x0f, 0xad, 0xa2, 0xf3, 0x8d, 0x42, 0x15, 0x53, 0x03, 0x97, 0xb0, 0xc5, + 0x24, 0xd5, 0x6e, 0x20, 0xc9, 0x9f, 0xe4, 0x99, 0x33, 0x8d, 0xfd, 0xb6, 0x70, 0x3e, 0x86, 0x35, + 0xd3, 0x95, 0x30, 0x4d, 0xc6, 0x24, 0xc8, 0x3b, 0xcb, 0xdd, 0x8c, 0x55, 0x5c, 0x12, 0xe3, 0x59, + 0x75, 0xff, 0x6b, 0x07, 0xd6, 0xe7, 0xd4, 0x5e, 0x02, 0x85, 0x45, 0x15, 0xe5, 0xb1, 0x19, 0x0e, + 0xe7, 0x70, 0x3f, 0x81, 0x7b, 0x37, 0xbc, 0x4c, 0xb7, 0x3a, 0x32, 0x53, 0x4e, 0xee, 0x3f, 0xf8, + 0xd7, 0xbe, 0x73, 0xa0, 0x51, 0xbc, 0xfc, 0x77, 0x61, 0x39, 0x49, 0xe9, 0xc5, 0x28, 0x34, 0x4d, + 0xd5, 0xec, 0x4a, 0x97, 0xbb, 0x33, 0x97, 0x23, 0x58, 0x0a, 0x89, 0x20, 0x26, 0x26, 0xb5, 0x46, + 0x3d, 0x40, 0xc1, 0x79, 0x9a, 0xd2, 0x48, 0xe0, 0xe2, 0xa9, 0x50, 0x25, 0xb1, 0x84, 0x17, 0x48, + 0xe4, 0x3f, 0x2c, 0xd8, 0x84, 0x72, 0x41, 0x26, 0x89, 0xaa, 0xea, 0x2a, 0x2e, 0x00, 0xbf, 0xaf, + 0x5c, 0x1c, 0x52, 0x12, 0xd2, 0x54, 0x0e, 0x27, 0xcf, 0x58, 0xca, 0x45, 0xee, 0x63, 0xb6, 0xbd, + 0xcd, 0x49, 0xff, 0x53, 0x58, 0xc5, 0xe4, 0xf2, 0x38, 0xa5, 0xd4, 0xd0, 0xf9, 0x2f, 0x67, 0x1c, + 0x7f, 0x00, 0x77, 0x4a, 0x07, 0x3d, 0x65, 0xe2, 0x6c, 0xa4, 0x8c, 0x52, 0x72, 0x69, 0x06, 0x0d, + 0x7d, 0x60, 0x01, 0x98, 0xc1, 0xc8, 0xcd, 0x07, 0xa3, 0x6f, 0x5d, 0x00, 0xcb, 0x97, 0x6d, 0x68, + 0x8a, 0x94, 0x52, 0x19, 0xe0, 0x28, 0xd4, 0x8f, 0x6c, 0x03, 0xdb, 0x90, 0x3c, 0x9e, 0x04, 0x63, + 0xbd, 0xcb, 0x7a, 0x5c, 0x0e, 0xa0, 0xd7, 0xa0, 0xcd, 0x23, 0x92, 0xf0, 0xb3, 0x58, 0xec, 0x13, + 0x2e, 0x7f, 0x3e, 0x3d, 0x83, 0xcd, 0xa0, 0xf2, 0x1e, 0x33, 0xfd, 0xc9, 0x01, 0x41, 0xa5, 0xa3, + 0x85, 0x6d, 0xe8, 0x86, 0xbc, 0xd5, 0xfe, 0x5e, 0xde, 0x96, 0x67, 0xf2, 0x56, 0x4a, 0x48, 0x7d, + 0xa6, 0x6a, 0xba, 0x00, 0x8c, 0x1f, 0x19, 0xff, 0xbc, 0x15, 0xf5, 0x7c, 0x59, 0x88, 0xff, 0xbd, + 0xa3, 0x29, 0xfa, 0xcb, 0xac, 0x6f, 0x40, 0x8d, 0x04, 0xe3, 0x9c, 0x16, 0xbd, 0x41, 0x1f, 0x42, + 0x5b, 0xe4, 0xd6, 0xc7, 0xd3, 0x44, 0xb7, 0xad, 0xb6, 0x19, 0xa6, 0x8e, 0x4b, 0x22, 0x3c, 0xa3, + 0x5a, 0xf2, 0x7b, 0xe9, 0x86, 0x6a, 0xaf, 0x15, 0xd5, 0xbe, 0xfb, 0x10, 0xd0, 0xfc, 0x6f, 0x86, + 0x1a, 0x50, 0xeb, 0x87, 0x13, 0x16, 0x75, 0x2a, 0x08, 0x60, 0xf9, 0x69, 0xca, 0x04, 0x4d, 0x3b, + 0x8e, 0x5c, 0x63, 0x75, 0x55, 0xc7, 0x45, 0x4d, 0xa8, 0xeb, 0xd6, 0x16, 0x76, 0xaa, 0xbb, 0xaf, + 0x43, 0xbb, 0xec, 0x97, 0x54, 0xfd, 0xfc, 0xe4, 0x2b, 0x1a, 0x88, 0x4e, 0x45, 0x9e, 0x76, 0x94, + 0x90, 0x80, 0x76, 0x9c, 0xfd, 0x57, 0x7e, 0xbc, 0xea, 0x3a, 0x2f, 0xae, 0xba, 0xce, 0xaf, 0x57, + 0x5d, 0xe7, 0x9b, 0xeb, 0x6e, 0xe5, 0xc5, 0x75, 0xb7, 0xf2, 0xf3, 0x75, 0xb7, 0xf2, 0x65, 0x4d, + 0x0d, 0xfb, 0x27, 0xcb, 0x6a, 0xb6, 0x7f, 0xe7, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x25, + 0x31, 0x18, 0x0f, 0x0c, 0x00, 0x00, } -func (m *RawChange) Marshal() (dAtA []byte, err error) { +func (m *RawACLRecord) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1465,12 +1411,12 @@ func (m *RawChange) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RawChange) MarshalTo(dAtA []byte) (int, error) { +func (m *RawACLRecord) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RawChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *RawACLRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1499,7 +1445,7 @@ func (m *RawChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *RawRecord) Marshal() (dAtA []byte, err error) { +func (m *ACLContentValue) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1509,140 +1455,12 @@ func (m *RawRecord) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RawRecord) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RawRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x1a - } - if len(m.Signature) > 0 { - i -= len(m.Signature) - copy(dAtA[i:], m.Signature) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Signature))) - i-- - dAtA[i] = 0x12 - } - if len(m.Payload) > 0 { - i -= len(m.Payload) - copy(dAtA[i:], m.Payload) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Payload))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ACLChange) 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 *ACLChange) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ACLChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Identity) > 0 { - i -= len(m.Identity) - copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) - i-- - dAtA[i] = 0x42 - } - if m.Timestamp != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.Timestamp)) - i-- - dAtA[i] = 0x38 - } - if m.CurrentReadKeyHash != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.CurrentReadKeyHash)) - i-- - dAtA[i] = 0x30 - } - if len(m.ChangesData) > 0 { - i -= len(m.ChangesData) - copy(dAtA[i:], m.ChangesData) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.ChangesData))) - i-- - dAtA[i] = 0x2a - } - if m.AclData != nil { - { - size, err := m.AclData.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if len(m.SnapshotBaseId) > 0 { - i -= len(m.SnapshotBaseId) - copy(dAtA[i:], m.SnapshotBaseId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.SnapshotBaseId))) - i-- - dAtA[i] = 0x1a - } - if len(m.AclHeadIds) > 0 { - for iNdEx := len(m.AclHeadIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.AclHeadIds[iNdEx]) - copy(dAtA[i:], m.AclHeadIds[iNdEx]) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.AclHeadIds[iNdEx]))) - i-- - dAtA[i] = 0x12 - } - } - if len(m.TreeHeadIds) > 0 { - for iNdEx := len(m.TreeHeadIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TreeHeadIds[iNdEx]) - copy(dAtA[i:], m.TreeHeadIds[iNdEx]) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.TreeHeadIds[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ACLChangeACLContentValue) 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 *ACLChangeACLContentValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ACLChangeACLContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1659,12 +1477,12 @@ func (m *ACLChangeACLContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserAdd) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserAdd) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserAdd != nil { { @@ -1680,12 +1498,12 @@ func (m *ACLChangeACLContentValueValueOfUserAdd) MarshalToSizedBuffer(dAtA []byt } return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserRemove) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserRemove) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserRemove != nil { { @@ -1701,12 +1519,12 @@ func (m *ACLChangeACLContentValueValueOfUserRemove) MarshalToSizedBuffer(dAtA [] } return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserPermissionChange) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserPermissionChange) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserPermissionChange != nil { { @@ -1722,12 +1540,12 @@ func (m *ACLChangeACLContentValueValueOfUserPermissionChange) MarshalToSizedBuff } return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserInvite) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserInvite) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserInvite != nil { { @@ -1743,12 +1561,12 @@ func (m *ACLChangeACLContentValueValueOfUserInvite) MarshalToSizedBuffer(dAtA [] } return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserJoin) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserJoin) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserJoin != nil { { @@ -1764,12 +1582,12 @@ func (m *ACLChangeACLContentValueValueOfUserJoin) MarshalToSizedBuffer(dAtA []by } return len(dAtA) - i, nil } -func (m *ACLChangeACLContentValueValueOfUserConfirm) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserConfirm) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLContentValueValueOfUserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserConfirm != nil { { @@ -1785,7 +1603,7 @@ func (m *ACLChangeACLContentValueValueOfUserConfirm) MarshalToSizedBuffer(dAtA [ } return len(dAtA) - i, nil } -func (m *ACLChangeACLData) Marshal() (dAtA []byte, err error) { +func (m *ACLData) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1795,12 +1613,12 @@ func (m *ACLChangeACLData) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeACLData) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLData) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLData) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLData) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1816,25 +1634,13 @@ func (m *ACLChangeACLData) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintAclchanges(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0xa } } - if m.AclSnapshot != nil { - { - size, err := m.AclSnapshot.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *ACLChangeACLSnapshot) Marshal() (dAtA []byte, err error) { +func (m *ACLState) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1844,47 +1650,12 @@ func (m *ACLChangeACLSnapshot) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeACLSnapshot) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLState) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeACLSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.AclState != nil { - { - size, err := m.AclState.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ACLChangeACLState) 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 *ACLChangeACLState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ACLChangeACLState) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1930,27 +1701,27 @@ func (m *ACLChangeACLState) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } if len(m.ReadKeyHashes) > 0 { - dAtA12 := make([]byte, len(m.ReadKeyHashes)*10) - var j11 int + dAtA9 := make([]byte, len(m.ReadKeyHashes)*10) + var j8 int for _, num := range m.ReadKeyHashes { for num >= 1<<7 { - dAtA12[j11] = uint8(uint64(num)&0x7f | 0x80) + dAtA9[j8] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j11++ + j8++ } - dAtA12[j11] = uint8(num) - j11++ + dAtA9[j8] = uint8(num) + j8++ } - i -= j11 - copy(dAtA[i:], dAtA12[:j11]) - i = encodeVarintAclchanges(dAtA, i, uint64(j11)) + i -= j8 + copy(dAtA[i:], dAtA9[:j8]) + i = encodeVarintAclchanges(dAtA, i, uint64(j8)) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ACLChangeUserState) Marshal() (dAtA []byte, err error) { +func (m *ACLUserState) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1960,12 +1731,12 @@ func (m *ACLChangeUserState) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserState) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLUserState) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserState) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLUserState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2011,7 +1782,7 @@ func (m *ACLChangeUserState) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeUserAdd) Marshal() (dAtA []byte, err error) { +func (m *ACLUserAdd) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2021,12 +1792,12 @@ func (m *ACLChangeUserAdd) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserAdd) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLUserAdd) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2062,7 +1833,7 @@ func (m *ACLChangeUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeUserConfirm) Marshal() (dAtA []byte, err error) { +func (m *ACLUserConfirm) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2072,12 +1843,12 @@ func (m *ACLChangeUserConfirm) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserConfirm) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLUserConfirm) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLUserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2099,7 +1870,7 @@ func (m *ACLChangeUserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeUserInvite) Marshal() (dAtA []byte, err error) { +func (m *ACLUserInvite) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2109,12 +1880,12 @@ func (m *ACLChangeUserInvite) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserInvite) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLUserInvite) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2157,7 +1928,7 @@ func (m *ACLChangeUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeUserJoin) Marshal() (dAtA []byte, err error) { +func (m *ACLUserJoin) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2167,12 +1938,12 @@ func (m *ACLChangeUserJoin) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserJoin) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLUserJoin) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLUserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2217,7 +1988,7 @@ func (m *ACLChangeUserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeUserRemove) Marshal() (dAtA []byte, err error) { +func (m *ACLUserRemove) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2227,12 +1998,12 @@ func (m *ACLChangeUserRemove) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserRemove) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLUserRemove) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2261,7 +2032,7 @@ func (m *ACLChangeUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLChangeReadKeyReplace) Marshal() (dAtA []byte, err error) { +func (m *ACLReadKeyReplace) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2271,12 +2042,12 @@ func (m *ACLChangeReadKeyReplace) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeReadKeyReplace) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLReadKeyReplace) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeReadKeyReplace) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLReadKeyReplace) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2305,7 +2076,7 @@ func (m *ACLChangeReadKeyReplace) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *ACLChangeUserPermissionChange) Marshal() (dAtA []byte, err error) { +func (m *ACLUserPermissionChange) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2315,12 +2086,12 @@ func (m *ACLChangeUserPermissionChange) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ACLChangeUserPermissionChange) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLUserPermissionChange) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLChangeUserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLUserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2340,7 +2111,7 @@ func (m *ACLChangeUserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *Change) Marshal() (dAtA []byte, err error) { +func (m *ACLRecord) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2350,12 +2121,177 @@ func (m *Change) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Change) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLRecord) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Change) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Timestamp != 0 { + i = encodeVarintAclchanges(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x28 + } + if m.CurrentReadKeyHash != 0 { + i = encodeVarintAclchanges(dAtA, i, uint64(m.CurrentReadKeyHash)) + i-- + dAtA[i] = 0x20 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x1a + } + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) + i-- + dAtA[i] = 0x12 + } + if len(m.PrevId) > 0 { + i -= len(m.PrevId) + copy(dAtA[i:], m.PrevId) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.PrevId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ACLHeader) 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 *ACLHeader) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ACLHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) + i-- + dAtA[i] = 0x12 + } + if len(m.FirstId) > 0 { + i -= len(m.FirstId) + copy(dAtA[i:], m.FirstId) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.FirstId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RawTreeChange) 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 *RawTreeChange) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RawTreeChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signature) > 0 { + i -= len(m.Signature) + copy(dAtA[i:], m.Signature) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Signature))) + i-- + dAtA[i] = 0x12 + } + if len(m.Payload) > 0 { + i -= len(m.Payload) + copy(dAtA[i:], m.Payload) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Payload))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RawTreeChangeWithId) 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 *RawTreeChangeWithId) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RawTreeChangeWithId) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.RawChange) > 0 { + i -= len(m.RawChange) + copy(dAtA[i:], m.RawChange) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.RawChange))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TreeChange) 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 *TreeChange) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -2420,7 +2356,7 @@ func (m *Change) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Record) Marshal() (dAtA []byte, err error) { +func (m *TreeHeader) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -2430,86 +2366,39 @@ func (m *Record) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Record) MarshalTo(dAtA []byte) (int, error) { +func (m *TreeHeader) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Record) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TreeHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if m.Timestamp != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.Timestamp)) - i-- - dAtA[i] = 0x28 - } - if m.CurrentReadKeyHash != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.CurrentReadKeyHash)) - i-- - dAtA[i] = 0x20 - } if len(m.Data) > 0 { i -= len(m.Data) copy(dAtA[i:], m.Data) i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Data))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x2a } if len(m.Identity) > 0 { i -= len(m.Identity) copy(dAtA[i:], m.Identity) i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x22 } - if len(m.PrevId) > 0 { - i -= len(m.PrevId) - copy(dAtA[i:], m.PrevId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.PrevId))) + if m.TreeHeaderType != 0 { + i = encodeVarintAclchanges(dAtA, i, uint64(m.TreeHeaderType)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x18 } - return len(dAtA) - i, nil -} - -func (m *Header) 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 *Header) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Header) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.DocType != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.DocType)) - i-- - dAtA[i] = 0x20 - } - if len(m.WorkspaceId) > 0 { - i -= len(m.WorkspaceId) - copy(dAtA[i:], m.WorkspaceId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.WorkspaceId))) - i-- - dAtA[i] = 0x1a - } - if len(m.AclListId) > 0 { - i -= len(m.AclListId) - copy(dAtA[i:], m.AclListId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.AclListId))) + if len(m.AclId) > 0 { + i -= len(m.AclId) + copy(dAtA[i:], m.AclId) + i = encodeVarintAclchanges(dAtA, i, uint64(len(m.AclId))) i-- dAtA[i] = 0x12 } @@ -2534,7 +2423,7 @@ func encodeVarintAclchanges(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *RawChange) Size() (n int) { +func (m *RawACLRecord) Size() (n int) { if m == nil { return 0 } @@ -2555,71 +2444,7 @@ func (m *RawChange) Size() (n int) { return n } -func (m *RawRecord) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Payload) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.Signature) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - return n -} - -func (m *ACLChange) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.TreeHeadIds) > 0 { - for _, s := range m.TreeHeadIds { - l = len(s) - n += 1 + l + sovAclchanges(uint64(l)) - } - } - if len(m.AclHeadIds) > 0 { - for _, s := range m.AclHeadIds { - l = len(s) - n += 1 + l + sovAclchanges(uint64(l)) - } - } - l = len(m.SnapshotBaseId) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - if m.AclData != nil { - l = m.AclData.Size() - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.ChangesData) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - if m.CurrentReadKeyHash != 0 { - n += 1 + sovAclchanges(uint64(m.CurrentReadKeyHash)) - } - if m.Timestamp != 0 { - n += 1 + sovAclchanges(uint64(m.Timestamp)) - } - l = len(m.Identity) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - return n -} - -func (m *ACLChangeACLContentValue) Size() (n int) { +func (m *ACLContentValue) Size() (n int) { if m == nil { return 0 } @@ -2631,7 +2456,7 @@ func (m *ACLChangeACLContentValue) Size() (n int) { return n } -func (m *ACLChangeACLContentValueValueOfUserAdd) Size() (n int) { +func (m *ACLContentValue_UserAdd) Size() (n int) { if m == nil { return 0 } @@ -2643,7 +2468,7 @@ func (m *ACLChangeACLContentValueValueOfUserAdd) Size() (n int) { } return n } -func (m *ACLChangeACLContentValueValueOfUserRemove) Size() (n int) { +func (m *ACLContentValue_UserRemove) Size() (n int) { if m == nil { return 0 } @@ -2655,7 +2480,7 @@ func (m *ACLChangeACLContentValueValueOfUserRemove) Size() (n int) { } return n } -func (m *ACLChangeACLContentValueValueOfUserPermissionChange) Size() (n int) { +func (m *ACLContentValue_UserPermissionChange) Size() (n int) { if m == nil { return 0 } @@ -2667,7 +2492,7 @@ func (m *ACLChangeACLContentValueValueOfUserPermissionChange) Size() (n int) { } return n } -func (m *ACLChangeACLContentValueValueOfUserInvite) Size() (n int) { +func (m *ACLContentValue_UserInvite) Size() (n int) { if m == nil { return 0 } @@ -2679,7 +2504,7 @@ func (m *ACLChangeACLContentValueValueOfUserInvite) Size() (n int) { } return n } -func (m *ACLChangeACLContentValueValueOfUserJoin) Size() (n int) { +func (m *ACLContentValue_UserJoin) Size() (n int) { if m == nil { return 0 } @@ -2691,7 +2516,7 @@ func (m *ACLChangeACLContentValueValueOfUserJoin) Size() (n int) { } return n } -func (m *ACLChangeACLContentValueValueOfUserConfirm) Size() (n int) { +func (m *ACLContentValue_UserConfirm) Size() (n int) { if m == nil { return 0 } @@ -2703,16 +2528,12 @@ func (m *ACLChangeACLContentValueValueOfUserConfirm) Size() (n int) { } return n } -func (m *ACLChangeACLData) Size() (n int) { +func (m *ACLData) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.AclSnapshot != nil { - l = m.AclSnapshot.Size() - n += 1 + l + sovAclchanges(uint64(l)) - } if len(m.AclContent) > 0 { for _, e := range m.AclContent { l = e.Size() @@ -2722,20 +2543,7 @@ func (m *ACLChangeACLData) Size() (n int) { return n } -func (m *ACLChangeACLSnapshot) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.AclState != nil { - l = m.AclState.Size() - n += 1 + l + sovAclchanges(uint64(l)) - } - return n -} - -func (m *ACLChangeACLState) Size() (n int) { +func (m *ACLState) Size() (n int) { if m == nil { return 0 } @@ -2770,7 +2578,7 @@ func (m *ACLChangeACLState) Size() (n int) { return n } -func (m *ACLChangeUserState) Size() (n int) { +func (m *ACLUserState) Size() (n int) { if m == nil { return 0 } @@ -2799,7 +2607,7 @@ func (m *ACLChangeUserState) Size() (n int) { return n } -func (m *ACLChangeUserAdd) Size() (n int) { +func (m *ACLUserAdd) Size() (n int) { if m == nil { return 0 } @@ -2825,7 +2633,7 @@ func (m *ACLChangeUserAdd) Size() (n int) { return n } -func (m *ACLChangeUserConfirm) Size() (n int) { +func (m *ACLUserConfirm) Size() (n int) { if m == nil { return 0 } @@ -2842,7 +2650,7 @@ func (m *ACLChangeUserConfirm) Size() (n int) { return n } -func (m *ACLChangeUserInvite) Size() (n int) { +func (m *ACLUserInvite) Size() (n int) { if m == nil { return 0 } @@ -2872,7 +2680,7 @@ func (m *ACLChangeUserInvite) Size() (n int) { return n } -func (m *ACLChangeUserJoin) Size() (n int) { +func (m *ACLUserJoin) Size() (n int) { if m == nil { return 0 } @@ -2903,7 +2711,7 @@ func (m *ACLChangeUserJoin) Size() (n int) { return n } -func (m *ACLChangeUserRemove) Size() (n int) { +func (m *ACLUserRemove) Size() (n int) { if m == nil { return 0 } @@ -2922,7 +2730,7 @@ func (m *ACLChangeUserRemove) Size() (n int) { return n } -func (m *ACLChangeReadKeyReplace) Size() (n int) { +func (m *ACLReadKeyReplace) Size() (n int) { if m == nil { return 0 } @@ -2943,7 +2751,7 @@ func (m *ACLChangeReadKeyReplace) Size() (n int) { return n } -func (m *ACLChangeUserPermissionChange) Size() (n int) { +func (m *ACLUserPermissionChange) Size() (n int) { if m == nil { return 0 } @@ -2959,7 +2767,85 @@ func (m *ACLChangeUserPermissionChange) Size() (n int) { return n } -func (m *Change) Size() (n int) { +func (m *ACLRecord) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PrevId) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.Identity) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + if m.CurrentReadKeyHash != 0 { + n += 1 + sovAclchanges(uint64(m.CurrentReadKeyHash)) + } + if m.Timestamp != 0 { + n += 1 + sovAclchanges(uint64(m.Timestamp)) + } + return n +} + +func (m *ACLHeader) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FirstId) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.Identity) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + return n +} + +func (m *RawTreeChange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Payload) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.Signature) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + return n +} + +func (m *RawTreeChangeWithId) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.RawChange) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) + } + return n +} + +func (m *TreeChange) Size() (n int) { if m == nil { return 0 } @@ -2999,34 +2885,7 @@ func (m *Change) Size() (n int) { return n } -func (m *Record) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.PrevId) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.Identity) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - if m.CurrentReadKeyHash != 0 { - n += 1 + sovAclchanges(uint64(m.CurrentReadKeyHash)) - } - if m.Timestamp != 0 { - n += 1 + sovAclchanges(uint64(m.Timestamp)) - } - return n -} - -func (m *Header) Size() (n int) { +func (m *TreeHeader) Size() (n int) { if m == nil { return 0 } @@ -3036,16 +2895,20 @@ func (m *Header) Size() (n int) { if l > 0 { n += 1 + l + sovAclchanges(uint64(l)) } - l = len(m.AclListId) + l = len(m.AclId) if l > 0 { n += 1 + l + sovAclchanges(uint64(l)) } - l = len(m.WorkspaceId) + if m.TreeHeaderType != 0 { + n += 1 + sovAclchanges(uint64(m.TreeHeaderType)) + } + l = len(m.Identity) if l > 0 { n += 1 + l + sovAclchanges(uint64(l)) } - if m.DocType != 0 { - n += 1 + sovAclchanges(uint64(m.DocType)) + l = len(m.Data) + if l > 0 { + n += 1 + l + sovAclchanges(uint64(l)) } return n } @@ -3056,7 +2919,7 @@ func sovAclchanges(x uint64) (n int) { func sozAclchanges(x uint64) (n int) { return sovAclchanges(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *RawChange) Unmarshal(dAtA []byte) error { +func (m *RawACLRecord) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3079,10 +2942,10 @@ func (m *RawChange) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RawChange: wiretype end group for non-group") + return fmt.Errorf("proto: RawACLRecord: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RawChange: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RawACLRecord: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -3206,443 +3069,7 @@ func (m *RawChange) Unmarshal(dAtA []byte) error { } return nil } -func (m *RawRecord) 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 ErrIntOverflowAclchanges - } - 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: RawRecord: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RawRecord: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) - if m.Payload == nil { - m.Payload = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) - if m.Signature == nil { - m.Signature = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLChange) 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 ErrIntOverflowAclchanges - } - 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: ACLChange: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLChange: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeHeadIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TreeHeadIds = append(m.TreeHeadIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclHeadIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AclHeadIds = append(m.AclHeadIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotBaseId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SnapshotBaseId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclData", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.AclData == nil { - m.AclData = &ACLChangeACLData{} - } - if err := m.AclData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChangesData", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ChangesData = append(m.ChangesData[:0], dAtA[iNdEx:postIndex]...) - if m.ChangesData == nil { - m.ChangesData = []byte{} - } - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentReadKeyHash", wireType) - } - m.CurrentReadKeyHash = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentReadKeyHash |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - m.Timestamp = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Timestamp |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Identity = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { +func (m *ACLContentValue) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3700,11 +3127,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserAdd{} + v := &ACLUserAdd{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserAdd{v} + m.Value = &ACLContentValue_UserAdd{v} iNdEx = postIndex case 2: if wireType != 2 { @@ -3735,11 +3162,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserRemove{} + v := &ACLUserRemove{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserRemove{v} + m.Value = &ACLContentValue_UserRemove{v} iNdEx = postIndex case 3: if wireType != 2 { @@ -3770,11 +3197,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserPermissionChange{} + v := &ACLUserPermissionChange{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserPermissionChange{v} + m.Value = &ACLContentValue_UserPermissionChange{v} iNdEx = postIndex case 4: if wireType != 2 { @@ -3805,11 +3232,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserInvite{} + v := &ACLUserInvite{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserInvite{v} + m.Value = &ACLContentValue_UserInvite{v} iNdEx = postIndex case 5: if wireType != 2 { @@ -3840,11 +3267,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserJoin{} + v := &ACLUserJoin{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserJoin{v} + m.Value = &ACLContentValue_UserJoin{v} iNdEx = postIndex case 6: if wireType != 2 { @@ -3875,11 +3302,11 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ACLChangeUserConfirm{} + v := &ACLUserConfirm{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLChangeACLContentValueValueOfUserConfirm{v} + m.Value = &ACLContentValue_UserConfirm{v} iNdEx = postIndex default: iNdEx = preIndex @@ -3902,7 +3329,7 @@ func (m *ACLChangeACLContentValue) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeACLData) Unmarshal(dAtA []byte) error { +func (m *ACLData) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3932,42 +3359,6 @@ func (m *ACLChangeACLData) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclSnapshot", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.AclSnapshot == nil { - m.AclSnapshot = &ACLChangeACLSnapshot{} - } - if err := m.AclSnapshot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field AclContent", wireType) } @@ -3996,7 +3387,7 @@ func (m *ACLChangeACLData) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AclContent = append(m.AclContent, &ACLChangeACLContentValue{}) + m.AclContent = append(m.AclContent, &ACLContentValue{}) if err := m.AclContent[len(m.AclContent)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -4022,93 +3413,7 @@ func (m *ACLChangeACLData) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeACLSnapshot) 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 ErrIntOverflowAclchanges - } - 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: ACLSnapshot: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLSnapshot: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclState", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.AclState == nil { - m.AclState = &ACLChangeACLState{} - } - if err := m.AclState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLChangeACLState) Unmarshal(dAtA []byte) error { +func (m *ACLState) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4242,7 +3547,7 @@ func (m *ACLChangeACLState) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.UserStates = append(m.UserStates, &ACLChangeUserState{}) + m.UserStates = append(m.UserStates, &ACLUserState{}) if err := m.UserStates[len(m.UserStates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -4277,10 +3582,10 @@ func (m *ACLChangeACLState) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Invites == nil { - m.Invites = make(map[string]*ACLChangeUserInvite) + m.Invites = make(map[string]*ACLUserInvite) } var mapkey string - var mapvalue *ACLChangeUserInvite + var mapvalue *ACLUserInvite for iNdEx < postIndex { entryPreIndex := iNdEx var wire uint64 @@ -4354,7 +3659,7 @@ func (m *ACLChangeACLState) Unmarshal(dAtA []byte) error { if postmsgIndex > l { return io.ErrUnexpectedEOF } - mapvalue = &ACLChangeUserInvite{} + mapvalue = &ACLUserInvite{} if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { return err } @@ -4397,7 +3702,7 @@ func (m *ACLChangeACLState) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserState) Unmarshal(dAtA []byte) error { +func (m *ACLUserState) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4420,17 +3725,17 @@ func (m *ACLChangeUserState) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserState: wiretype end group for non-group") + return fmt.Errorf("proto: ACLUserState: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserState: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ACLUserState: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4440,23 +3745,25 @@ func (m *ACLChangeUserState) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -4538,7 +3845,7 @@ func (m *ACLChangeUserState) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Permissions |= ACLChangeUserPermissions(b&0x7F) << shift + m.Permissions |= ACLUserPermissions(b&0x7F) << shift if b < 0x80 { break } @@ -4584,7 +3891,7 @@ func (m *ACLChangeUserState) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserAdd) Unmarshal(dAtA []byte) error { +func (m *ACLUserAdd) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4607,17 +3914,17 @@ func (m *ACLChangeUserAdd) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserAdd: wiretype end group for non-group") + return fmt.Errorf("proto: ACLUserAdd: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserAdd: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ACLUserAdd: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4627,23 +3934,25 @@ func (m *ACLChangeUserAdd) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -4725,7 +4034,7 @@ func (m *ACLChangeUserAdd) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Permissions |= ACLChangeUserPermissions(b&0x7F) << shift + m.Permissions |= ACLUserPermissions(b&0x7F) << shift if b < 0x80 { break } @@ -4751,7 +4060,7 @@ func (m *ACLChangeUserAdd) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserConfirm) Unmarshal(dAtA []byte) error { +func (m *ACLUserConfirm) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4774,17 +4083,17 @@ func (m *ACLChangeUserConfirm) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserConfirm: wiretype end group for non-group") + return fmt.Errorf("proto: ACLUserConfirm: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserConfirm: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ACLUserConfirm: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4794,23 +4103,25 @@ func (m *ACLChangeUserConfirm) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -4865,7 +4176,7 @@ func (m *ACLChangeUserConfirm) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserInvite) Unmarshal(dAtA []byte) error { +func (m *ACLUserInvite) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4888,10 +4199,10 @@ func (m *ACLChangeUserInvite) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserInvite: wiretype end group for non-group") + return fmt.Errorf("proto: ACLUserInvite: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserInvite: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ACLUserInvite: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -5008,7 +4319,7 @@ func (m *ACLChangeUserInvite) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Permissions |= ACLChangeUserPermissions(b&0x7F) << shift + m.Permissions |= ACLUserPermissions(b&0x7F) << shift if b < 0x80 { break } @@ -5066,7 +4377,7 @@ func (m *ACLChangeUserInvite) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserJoin) Unmarshal(dAtA []byte) error { +func (m *ACLUserJoin) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5089,17 +4400,17 @@ func (m *ACLChangeUserJoin) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserJoin: wiretype end group for non-group") + return fmt.Errorf("proto: ACLUserJoin: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserJoin: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ACLUserJoin: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5109,23 +4420,25 @@ func (m *ACLChangeUserJoin) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -5280,7 +4593,7 @@ func (m *ACLChangeUserJoin) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserRemove) Unmarshal(dAtA []byte) error { +func (m *ACLUserRemove) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5303,17 +4616,17 @@ func (m *ACLChangeUserRemove) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserRemove: wiretype end group for non-group") + return fmt.Errorf("proto: ACLUserRemove: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserRemove: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ACLUserRemove: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5323,23 +4636,25 @@ func (m *ACLChangeUserRemove) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 3: if wireType != 2 { @@ -5370,7 +4685,7 @@ func (m *ACLChangeUserRemove) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ReadKeyReplaces = append(m.ReadKeyReplaces, &ACLChangeReadKeyReplace{}) + m.ReadKeyReplaces = append(m.ReadKeyReplaces, &ACLReadKeyReplace{}) if err := m.ReadKeyReplaces[len(m.ReadKeyReplaces)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -5396,7 +4711,7 @@ func (m *ACLChangeUserRemove) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeReadKeyReplace) Unmarshal(dAtA []byte) error { +func (m *ACLReadKeyReplace) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5419,17 +4734,17 @@ func (m *ACLChangeReadKeyReplace) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ReadKeyReplace: wiretype end group for non-group") + return fmt.Errorf("proto: ACLReadKeyReplace: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ReadKeyReplace: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ACLReadKeyReplace: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5439,23 +4754,25 @@ func (m *ACLChangeReadKeyReplace) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -5546,7 +4863,7 @@ func (m *ACLChangeReadKeyReplace) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLChangeUserPermissionChange) Unmarshal(dAtA []byte) error { +func (m *ACLUserPermissionChange) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5569,16 +4886,119 @@ func (m *ACLChangeUserPermissionChange) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserPermissionChange: wiretype end group for non-group") + return fmt.Errorf("proto: ACLUserPermissionChange: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserPermissionChange: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ACLUserPermissionChange: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) + } + m.Permissions = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Permissions |= ACLUserPermissions(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipAclchanges(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclchanges + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ACLRecord) 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 ErrIntOverflowAclchanges + } + 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: ACLRecord: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLRecord: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevId", wireType) + } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { @@ -5605,13 +5025,13 @@ func (m *ACLChangeUserPermissionChange) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.PrevId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - m.Permissions = 0 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5621,7 +5041,94 @@ func (m *ACLChangeUserPermissionChange) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Permissions |= ACLChangeUserPermissions(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentReadKeyHash", wireType) + } + m.CurrentReadKeyHash = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentReadKeyHash |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift if b < 0x80 { break } @@ -5647,7 +5154,7 @@ func (m *ACLChangeUserPermissionChange) Unmarshal(dAtA []byte) error { } return nil } -func (m *Change) Unmarshal(dAtA []byte) error { +func (m *ACLHeader) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5670,10 +5177,360 @@ func (m *Change) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Change: wiretype end group for non-group") + return fmt.Errorf("proto: ACLHeader: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Change: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ACLHeader: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FirstId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FirstId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclchanges(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclchanges + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RawTreeChange) 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 ErrIntOverflowAclchanges + } + 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: RawTreeChange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RawTreeChange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) + if m.Payload == nil { + m.Payload = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) + if m.Signature == nil { + m.Signature = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclchanges(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclchanges + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RawTreeChangeWithId) 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 ErrIntOverflowAclchanges + } + 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: RawTreeChangeWithId: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RawTreeChangeWithId: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RawChange", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RawChange = append(m.RawChange[:0], dAtA[iNdEx:postIndex]...) + if m.RawChange == nil { + m.RawChange = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + 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 ErrInvalidLengthAclchanges + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclchanges(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclchanges + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TreeChange) 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 ErrIntOverflowAclchanges + } + 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: TreeChange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TreeChange: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -5848,7 +5705,7 @@ func (m *Change) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5858,23 +5715,25 @@ func (m *Change) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 8: if wireType != 0 { @@ -5917,7 +5776,7 @@ func (m *Change) Unmarshal(dAtA []byte) error { } return nil } -func (m *Record) Unmarshal(dAtA []byte) error { +func (m *TreeHeader) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5940,196 +5799,10 @@ func (m *Record) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Record: wiretype end group for non-group") + return fmt.Errorf("proto: TreeHeader: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Record: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PrevId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PrevId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Identity = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentReadKeyHash", wireType) - } - m.CurrentReadKeyHash = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentReadKeyHash |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - m.Timestamp = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Timestamp |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Header) 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 ErrIntOverflowAclchanges - } - 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: Header: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Header: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TreeHeader: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -6166,7 +5839,7 @@ func (m *Header) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclListId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AclId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -6194,13 +5867,13 @@ func (m *Header) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AclListId = string(dAtA[iNdEx:postIndex]) + m.AclId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkspaceId", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeHeaderType", wireType) } - var stringLen uint64 + m.TreeHeaderType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -6210,29 +5883,50 @@ func (m *Header) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.TreeHeaderType |= TreeHeaderType(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclchanges + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.WorkspaceId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DocType", wireType) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} } - m.DocType = 0 + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -6242,11 +5936,26 @@ func (m *Header) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.DocType |= HeaderDocType(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } + if byteLen < 0 { + return ErrInvalidLengthAclchanges + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclchanges + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAclchanges(dAtA[iNdEx:]) diff --git a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto index 76177a7c..73a3fc1f 100644 --- a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto +++ b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto @@ -2,147 +2,142 @@ syntax = "proto3"; package acl; option go_package = "aclpb"; -message RawChange { +// ACL protos + +message RawACLRecord { bytes payload = 1; bytes signature = 2; - string id = 3; + string id = 3; // this field is only used on user side for convenience, it should be empty when saving to db } -message RawRecord { - bytes payload = 1; - bytes signature = 2; - string id = 3; -} - -// the element of change tree used to store and internal apply smartBlock history -message ACLChange { - repeated string treeHeadIds = 1; - repeated string aclHeadIds = 2; - string snapshotBaseId = 3; // we will only have one base snapshot for both - ACLData aclData = 4; - // the data is encoded with read key and should be read in ChangesData format - bytes changesData = 5; - uint64 currentReadKeyHash = 6; - int64 timestamp = 7; - string identity = 8; - - message ACLContentValue { - oneof value { - UserAdd userAdd = 1; - UserRemove userRemove = 2; - UserPermissionChange userPermissionChange = 3; - UserInvite userInvite = 4; - UserJoin userJoin = 5; - UserConfirm userConfirm = 6; - } - } - - message ACLData { - ACLSnapshot aclSnapshot = 1; - repeated ACLContentValue aclContent = 2; - } - - message ACLSnapshot { - // We don't need ACLState as a separate message now, because we simplified the snapshot model - ACLState aclState = 1; - } - - message ACLState { - repeated uint64 readKeyHashes = 1; - repeated UserState userStates = 2; - map invites = 3; // TODO: later - // repeated string unconfirmedUsers = 4; // TODO: later - } - - message UserState { - string identity = 1; - bytes encryptionKey = 2; - repeated bytes encryptedReadKeys = 3; // all read keys that we know - UserPermissions permissions = 4; - bool IsConfirmed = 5; - } - - // we already know identity and encryptionKey - message UserAdd { - string identity = 1; // public signing key - bytes encryptionKey = 2; // public encryption key - repeated bytes encryptedReadKeys = 3; // all read keys that we know for the user - UserPermissions permissions = 4; - } - - // TODO: this is not used as of now - message UserConfirm { // not needed for read permissions - string identity = 1; // not needed - string userAddId = 2; - } - - message UserInvite { - bytes acceptPublicKey = 1; - bytes encryptPublicKey = 2; - repeated bytes encryptedReadKeys = 3; // all read keys that we know for the user - UserPermissions permissions = 4; - string InviteId = 5; - } - - message UserJoin { - string identity = 1; - bytes encryptionKey = 2; - bytes acceptSignature = 3; // sign acceptPublicKey - string userInviteId = 4; - repeated bytes encryptedReadKeys = 5; // the idea is that user should itself reencrypt the keys with the pub key - } - - message UserRemove { - string identity = 1; - repeated ReadKeyReplace readKeyReplaces = 3; // new read key encrypted for all users - } - - message ReadKeyReplace { - string identity = 1; - bytes encryptionKey = 2; - bytes encryptedReadKey = 3; - } - - message UserPermissionChange { - string identity = 1; - UserPermissions permissions = 2; - } - - enum UserPermissions { - Admin = 0; - Writer = 1; - Reader = 2; - Removed = 3; +message ACLContentValue { + oneof value { + ACLUserAdd userAdd = 1; + ACLUserRemove userRemove = 2; + ACLUserPermissionChange userPermissionChange = 3; + ACLUserInvite userInvite = 4; + ACLUserJoin userJoin = 5; + ACLUserConfirm userConfirm = 6; } } -message Change { - repeated string treeHeadIds = 1; - string aclHeadId = 2; - string snapshotBaseId = 3; // we will only have one base snapshot for both - bytes changesData = 4; - uint64 currentReadKeyHash = 5; - int64 timestamp = 6; - string identity = 7; - bool isSnapshot = 8; +message ACLData { + repeated ACLContentValue aclContent = 1; } -message Record { +message ACLState { + repeated uint64 readKeyHashes = 1; + repeated ACLUserState userStates = 2; + map invites = 3; // TODO: later + // repeated string unconfirmedUsers = 4; // TODO: later +} + +message ACLUserState { + bytes identity = 1; + bytes encryptionKey = 2; + repeated bytes encryptedReadKeys = 3; // all read keys that we know + ACLUserPermissions permissions = 4; + bool isConfirmed = 5; +} + +// we already know identity and encryptionKey +message ACLUserAdd { + bytes identity = 1; // public signing key + bytes encryptionKey = 2; // public encryption key + repeated bytes encryptedReadKeys = 3; // all read keys that we know for the user + ACLUserPermissions permissions = 4; +} + +// TODO: this is not used as of now +message ACLUserConfirm { // not needed for read permissions + bytes identity = 1; // not needed + string userAddId = 2; +} + +message ACLUserInvite { + bytes acceptPublicKey = 1; + bytes encryptPublicKey = 2; + repeated bytes encryptedReadKeys = 3; // all read keys that we know for the user + ACLUserPermissions permissions = 4; + string inviteId = 5; +} + +message ACLUserJoin { + bytes identity = 1; + bytes encryptionKey = 2; + bytes acceptSignature = 3; // sign acceptPublicKey + string userInviteId = 4; + repeated bytes encryptedReadKeys = 5; // the idea is that user should itself reencrypt the keys with the pub key +} + +message ACLUserRemove { + bytes identity = 1; + repeated ACLReadKeyReplace readKeyReplaces = 3; // new read key encrypted for all users +} + +message ACLReadKeyReplace { + bytes identity = 1; + bytes encryptionKey = 2; + bytes encryptedReadKey = 3; +} + +message ACLUserPermissionChange { + bytes identity = 1; + ACLUserPermissions permissions = 2; +} + +enum ACLUserPermissions { + Admin = 0; + Writer = 1; + Reader = 2; + Removed = 3; +} + +message ACLRecord { string prevId = 1; - string identity = 2; + bytes identity = 2; bytes data = 3; uint64 currentReadKeyHash = 4; int64 timestamp = 5; } -message Header { +message ACLHeader { string firstId = 1; - string aclListId = 2; - string workspaceId = 3; - DocType docType = 4; - - enum DocType { - ACL = 0; - DocTree = 1; - } + bytes identity = 2; // the identity of the creator +} + +// Tree protos + +message RawTreeChange { + bytes payload = 1; + bytes signature = 2; +} + +message RawTreeChangeWithId { + bytes rawChange = 1; + string id = 2; +} + +message TreeChange { + repeated string treeHeadIds = 1; + string aclHeadId = 2; + string snapshotBaseId = 3; + bytes changesData = 4; + uint64 currentReadKeyHash = 5; + int64 timestamp = 6; + bytes identity = 7; + bool isSnapshot = 8; +} + +enum TreeHeaderType { + Object = 0; + Space = 1; +} + +message TreeHeader { + string firstId = 1; + string aclId = 2; + TreeHeaderType treeHeaderType = 3; + bytes identity = 4; + bytes data = 5; // this should be reserved for the client to add the data it needs } diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index 6765ee99..d7a849fb 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -1,6 +1,7 @@ package list import ( + "bytes" "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" @@ -29,14 +30,14 @@ var ErrInvalidSignature = errors.New("signature is invalid") type UserPermissionPair struct { Identity string - Permission aclpb.ACLChangeUserPermissions + Permission aclpb.ACLUserPermissions } type ACLState struct { currentReadKeyHash uint64 userReadKeys map[uint64]*symmetric.Key - userStates map[string]*aclpb.ACLChangeUserState - userInvites map[string]*aclpb.ACLChangeUserInvite + userStates map[string]*aclpb.ACLUserState + userInvites map[string]*aclpb.ACLUserInvite signingPubKeyDecoder keys.Decoder encryptionKey encryptionkey.PrivKey @@ -55,8 +56,8 @@ func newACLStateWithIdentity( identity: identity, encryptionKey: encryptionKey, userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclpb.ACLChangeUserState), - userInvites: make(map[string]*aclpb.ACLChangeUserInvite), + userStates: make(map[string]*aclpb.ACLUserState), + userInvites: make(map[string]*aclpb.ACLUserInvite), signingPubKeyDecoder: decoder, permissionsAtRecord: make(map[string][]UserPermissionPair), keychain: common.NewKeychain(), @@ -67,8 +68,8 @@ func newACLState(decoder keys.Decoder) *ACLState { return &ACLState{ signingPubKeyDecoder: decoder, userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclpb.ACLChangeUserState), - userInvites: make(map[string]*aclpb.ACLChangeUserInvite), + userStates: make(map[string]*aclpb.ACLUserState), + userInvites: make(map[string]*aclpb.ACLUserInvite), permissionsAtRecord: make(map[string][]UserPermissionPair), keychain: common.NewKeychain(), } @@ -105,8 +106,8 @@ func (st *ACLState) PermissionsAtRecord(id string, identity string) (UserPermiss return UserPermissionPair{}, ErrNoSuchUser } -func (st *ACLState) applyRecord(record *aclpb.Record) (err error) { - aclData := &aclpb.ACLChangeACLData{} +func (st *ACLState) applyRecord(record *aclpb.ACLRecord) (err error) { + aclData := &aclpb.ACLData{} err = proto.Unmarshal(record.Data, aclData) if err != nil { @@ -122,14 +123,14 @@ func (st *ACLState) applyRecord(record *aclpb.Record) (err error) { return } -func (st *ACLState) applyChangeAndUpdate(recordWrapper *Record) (err error) { +func (st *ACLState) applyChangeAndUpdate(recordWrapper *ACLRecord) (err error) { var ( change = recordWrapper.Content - aclData = &aclpb.ACLChangeACLData{} + aclData = &aclpb.ACLData{} ) if recordWrapper.Model != nil { - aclData = recordWrapper.Model.(*aclpb.ACLChangeACLData) + aclData = recordWrapper.Model.(*aclpb.ACLData) } else { err = proto.Unmarshal(change.Data, aclData) if err != nil { @@ -147,7 +148,7 @@ func (st *ACLState) applyChangeAndUpdate(recordWrapper *Record) (err error) { var permissions []UserPermissionPair for _, state := range st.userStates { permission := UserPermissionPair{ - Identity: state.Identity, + Identity: string(state.Identity), Permission: state.Permissions, } permissions = append(permissions, permission) @@ -157,7 +158,7 @@ func (st *ACLState) applyChangeAndUpdate(recordWrapper *Record) (err error) { return nil } -func (st *ACLState) applyChangeData(changeData *aclpb.ACLChangeACLData, hash uint64, identity string) (err error) { +func (st *ACLState) applyChangeData(changeData *aclpb.ACLData, hash uint64, identity []byte) (err error) { defer func() { if err != nil { return @@ -170,12 +171,12 @@ func (st *ACLState) applyChangeData(changeData *aclpb.ACLChangeACLData, hash uin skipIdentityCheck := st.isUserJoin(changeData) || (st.currentReadKeyHash == 0 && st.isUserAdd(changeData, identity)) if !skipIdentityCheck { // we check signature when we add this to the Tree, so no need to do it here - if _, exists := st.userStates[identity]; !exists { + if _, exists := st.userStates[string(identity)]; !exists { err = ErrNoSuchUser return } - if !st.hasPermission(identity, aclpb.ACLChange_Admin) { + if !st.hasPermission(identity, aclpb.ACLUserPermissions_Admin) { err = fmt.Errorf("user %s must have admin permissions", identity) return } @@ -191,7 +192,7 @@ func (st *ACLState) applyChangeData(changeData *aclpb.ACLChangeACLData, hash uin return nil } -func (st *ACLState) applyChangeContent(ch *aclpb.ACLChangeACLContentValue) error { +func (st *ACLState) applyChangeContent(ch *aclpb.ACLContentValue) error { switch { case ch.GetUserPermissionChange() != nil: return st.applyUserPermissionChange(ch.GetUserPermissionChange()) @@ -210,27 +211,29 @@ func (st *ACLState) applyChangeContent(ch *aclpb.ACLChangeACLContentValue) error } } -func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLChangeUserPermissionChange) error { - if _, exists := st.userStates[ch.Identity]; !exists { +func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLUserPermissionChange) error { + chIdentity := string(ch.Identity) + if _, exists := st.userStates[chIdentity]; !exists { return ErrNoSuchUser } - st.userStates[ch.Identity].Permissions = ch.Permissions + st.userStates[chIdentity].Permissions = ch.Permissions return nil } -func (st *ACLState) applyUserInvite(ch *aclpb.ACLChangeUserInvite) error { +func (st *ACLState) applyUserInvite(ch *aclpb.ACLUserInvite) error { st.userInvites[ch.InviteId] = ch return nil } -func (st *ACLState) applyUserJoin(ch *aclpb.ACLChangeUserJoin) error { +func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { invite, exists := st.userInvites[ch.UserInviteId] if !exists { return fmt.Errorf("no such invite with id %s", ch.UserInviteId) } + chIdentity := string(ch.Identity) - if _, exists = st.userStates[ch.Identity]; exists { + if _, exists = st.userStates[chIdentity]; exists { return ErrUserAlreadyExists } @@ -241,12 +244,7 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLChangeUserJoin) error { return fmt.Errorf("public key verifying invite accepts is given in incorrect format: %v", err) } - rawSignedId, err := st.signingPubKeyDecoder.DecodeFromStringIntoBytes(ch.Identity) - if err != nil { - return fmt.Errorf("failed to decode signing identity as bytes") - } - - res, err := verificationKey.(signingkey.PubKey).Verify(rawSignedId, signature) + res, err := verificationKey.(signingkey.PubKey).Verify(ch.Identity, signature) if err != nil { return fmt.Errorf("verification returned error: %w", err) } @@ -255,7 +253,7 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLChangeUserJoin) error { } // if ourselves -> we need to decrypt the read keys - if st.identity == ch.Identity { + if st.identity == chIdentity { for _, key := range ch.EncryptedReadKeys { key, hash, err := st.decryptReadKeyAndHash(key) if err != nil { @@ -267,30 +265,31 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLChangeUserJoin) error { } // adding user to the list - userState := &aclpb.ACLChangeUserState{ + userState := &aclpb.ACLUserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, EncryptedReadKeys: ch.EncryptedReadKeys, Permissions: invite.Permissions, IsConfirmed: true, } - st.userStates[ch.Identity] = userState + st.userStates[chIdentity] = userState return nil } -func (st *ACLState) applyUserAdd(ch *aclpb.ACLChangeUserAdd) error { - if _, exists := st.userStates[ch.Identity]; exists { +func (st *ACLState) applyUserAdd(ch *aclpb.ACLUserAdd) error { + chIdentity := string(ch.Identity) + if _, exists := st.userStates[chIdentity]; exists { return ErrUserAlreadyExists } - st.userStates[ch.Identity] = &aclpb.ACLChangeUserState{ + st.userStates[chIdentity] = &aclpb.ACLUserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, Permissions: ch.Permissions, EncryptedReadKeys: ch.EncryptedReadKeys, } - if ch.Identity == st.identity { + if chIdentity == st.identity { for _, key := range ch.EncryptedReadKeys { key, hash, err := st.decryptReadKeyAndHash(key) if err != nil { @@ -304,26 +303,28 @@ func (st *ACLState) applyUserAdd(ch *aclpb.ACLChangeUserAdd) error { return nil } -func (st *ACLState) applyUserRemove(ch *aclpb.ACLChangeUserRemove) error { - if ch.Identity == st.identity { +func (st *ACLState) applyUserRemove(ch *aclpb.ACLUserRemove) error { + chIdentity := string(ch.Identity) + if chIdentity == st.identity { return ErrDocumentForbidden } - if _, exists := st.userStates[ch.Identity]; !exists { + if _, exists := st.userStates[chIdentity]; !exists { return ErrNoSuchUser } - delete(st.userStates, ch.Identity) + delete(st.userStates, chIdentity) for _, replace := range ch.ReadKeyReplaces { - userState, exists := st.userStates[replace.Identity] + repIdentity := string(replace.Identity) + userState, exists := st.userStates[repIdentity] if !exists { continue } userState.EncryptedReadKeys = append(userState.EncryptedReadKeys, replace.EncryptedReadKey) // if this is our identity then we have to decrypt the key - if replace.Identity == st.identity { + if repIdentity == st.identity { key, hash, err := st.decryptReadKeyAndHash(replace.EncryptedReadKey) if err != nil { return ErrFailedToDecrypt @@ -336,12 +337,13 @@ func (st *ACLState) applyUserRemove(ch *aclpb.ACLChangeUserRemove) error { return nil } -func (st *ACLState) applyUserConfirm(ch *aclpb.ACLChangeUserConfirm) error { - if _, exists := st.userStates[ch.Identity]; !exists { +func (st *ACLState) applyUserConfirm(ch *aclpb.ACLUserConfirm) error { + chIdentity := string(ch.Identity) + if _, exists := st.userStates[chIdentity]; !exists { return ErrNoSuchUser } - userState := st.userStates[ch.Identity] + userState := st.userStates[chIdentity] userState.IsConfirmed = true return nil } @@ -362,8 +364,8 @@ func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, e return key, hasher.Sum64(), nil } -func (st *ACLState) hasPermission(identity string, permission aclpb.ACLChangeUserPermissions) bool { - state, exists := st.userStates[identity] +func (st *ACLState) hasPermission(identity []byte, permission aclpb.ACLUserPermissions) bool { + state, exists := st.userStates[string(identity)] if !exists { return false } @@ -371,17 +373,17 @@ func (st *ACLState) hasPermission(identity string, permission aclpb.ACLChangeUse return state.Permissions == permission } -func (st *ACLState) isUserJoin(data *aclpb.ACLChangeACLData) bool { +func (st *ACLState) isUserJoin(data *aclpb.ACLData) bool { // if we have a UserJoin, then it should always be the first one applied return data.GetAclContent() != nil && data.GetAclContent()[0].GetUserJoin() != nil } -func (st *ACLState) isUserAdd(data *aclpb.ACLChangeACLData, identity string) bool { +func (st *ACLState) isUserAdd(data *aclpb.ACLData, identity []byte) bool { // if we have a UserAdd, then it should always be the first one applied userAdd := data.GetAclContent()[0].GetUserAdd() - return data.GetAclContent() != nil && userAdd != nil && userAdd.GetIdentity() == identity + return data.GetAclContent() != nil && userAdd != nil && bytes.Compare(userAdd.GetIdentity(), identity) == 0 } -func (st *ACLState) GetUserStates() map[string]*aclpb.ACLChangeUserState { +func (st *ACLState) GetUserStates() map[string]*aclpb.ACLUserState { return st.userStates } diff --git a/pkg/acl/list/aclstatebuilder.go b/pkg/acl/list/aclstatebuilder.go index f7a06f51..da79141b 100644 --- a/pkg/acl/list/aclstatebuilder.go +++ b/pkg/acl/list/aclstatebuilder.go @@ -15,7 +15,7 @@ type aclStateBuilder struct { func newACLStateBuilderWithIdentity(decoder keys.Decoder, accountData *account.AccountData) *aclStateBuilder { return &aclStateBuilder{ decoder: decoder, - identity: accountData.Identity, + identity: string(accountData.Identity), key: accountData.EncKey, } } @@ -26,7 +26,7 @@ func newACLStateBuilder(decoder keys.Decoder) *aclStateBuilder { } } -func (sb *aclStateBuilder) Build(records []*Record) (*ACLState, error) { +func (sb *aclStateBuilder) Build(records []*ACLRecord) (*ACLState, error) { var ( err error state *ACLState diff --git a/pkg/acl/list/changebuilder.go b/pkg/acl/list/changebuilder.go index f5d2fa17..c6413cb0 100644 --- a/pkg/acl/list/changebuilder.go +++ b/pkg/acl/list/changebuilder.go @@ -14,7 +14,7 @@ import ( type MarshalledChange = []byte type ACLChangeBuilder interface { - UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChangeUserPermissions) error + UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLUserPermissions) error AddId(id string) // TODO: this is only for testing } @@ -23,7 +23,7 @@ type aclChangeBuilder struct { list ACLList acc *account.AccountData - aclData *aclpb.ACLChangeACLData + aclData *aclpb.ACLData id string readKey *symmetric.Key readKeyHash uint64 @@ -38,7 +38,7 @@ func (c *aclChangeBuilder) Init(state *ACLState, list ACLList, acc *account.Acco c.list = list c.acc = acc - c.aclData = &aclpb.ACLChangeACLData{} + c.aclData = &aclpb.ACLData{} // setting read key for further encryption etc if state.currentReadKeyHash == 0 { c.readKey, _ = symmetric.NewRandom() @@ -56,7 +56,7 @@ func (c *aclChangeBuilder) AddId(id string) { c.id = id } -func (c *aclChangeBuilder) UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLChangeUserPermissions) error { +func (c *aclChangeBuilder) UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLUserPermissions) error { var allKeys []*symmetric.Key if c.aclState.currentReadKeyHash != 0 { for _, key := range c.aclState.userReadKeys { @@ -79,10 +79,10 @@ func (c *aclChangeBuilder) UserAdd(identity string, encryptionKey encryptionkey. if err != nil { return err } - ch := &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserAdd{ - UserAdd: &aclpb.ACLChangeUserAdd{ - Identity: identity, + ch := &aclpb.ACLContentValue{ + Value: &aclpb.ACLContentValue_UserAdd{ + UserAdd: &aclpb.ACLUserAdd{ + Identity: []byte(identity), EncryptionKey: rawKey, EncryptedReadKeys: encryptedKeys, Permissions: permissions, @@ -93,8 +93,8 @@ func (c *aclChangeBuilder) UserAdd(identity string, encryptionKey encryptionkey. return nil } -func (c *aclChangeBuilder) BuildAndApply() (*Record, []byte, error) { - aclRecord := &aclpb.Record{ +func (c *aclChangeBuilder) BuildAndApply() (*ACLRecord, []byte, error) { + aclRecord := &aclpb.ACLRecord{ PrevId: c.list.Head().Id, CurrentReadKeyHash: c.readKeyHash, Timestamp: int64(time.Now().Nanosecond()), diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index ad924714..3cfedd06 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -13,7 +13,7 @@ import ( "sync" ) -type IterFunc = func(record *Record) (IsContinue bool) +type IterFunc = func(record *ACLRecord) (IsContinue bool) var ErrIncorrectCID = errors.New("incorrect CID") @@ -26,20 +26,20 @@ type RWLocker interface { type ACLList interface { RWLocker ID() string - Header() *aclpb.Header - Records() []*Record + Header() *aclpb.ACLHeader + Records() []*ACLRecord ACLState() *ACLState IsAfter(first string, second string) (bool, error) - Head() *Record - Get(id string) (*Record, error) + Head() *ACLRecord + Get(id string) (*ACLRecord, error) Iterate(iterFunc IterFunc) IterateFrom(startId string, iterFunc IterFunc) Close() (err error) } type aclList struct { - header *aclpb.Header - records []*Record + header *aclpb.ACLHeader + records []*ACLRecord indexes map[string]int id string @@ -84,7 +84,7 @@ func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStor if err != nil { return } - records := []*Record{record} + records := []*ACLRecord{record} for record.Content.PrevId != "" { rawRecord, err = storage.GetRawRecord(context.Background(), record.Content.PrevId) @@ -131,7 +131,7 @@ func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStor return } -func (a *aclList) Records() []*Record { +func (a *aclList) Records() []*ACLRecord { return a.records } @@ -139,7 +139,7 @@ func (a *aclList) ID() string { return a.id } -func (a *aclList) Header() *aclpb.Header { +func (a *aclList) Header() *aclpb.ACLHeader { return a.header } @@ -156,11 +156,11 @@ func (a *aclList) IsAfter(first string, second string) (bool, error) { return firstRec >= secondRec, nil } -func (a *aclList) Head() *Record { +func (a *aclList) Head() *ACLRecord { return a.records[len(a.records)-1] } -func (a *aclList) Get(id string) (*Record, error) { +func (a *aclList) Get(id string) (*ACLRecord, error) { recIdx, ok := a.indexes[id] if !ok { return nil, fmt.Errorf("no such record") @@ -192,8 +192,8 @@ func (a *aclList) Close() (err error) { return nil } -func verifyRecord(keychain *common.Keychain, rawRecord *aclpb.RawRecord, record *Record) (err error) { - identityKey, err := keychain.GetOrAdd(record.Content.Identity) +func verifyRecord(keychain *common.Keychain, rawRecord *aclpb.RawACLRecord, record *ACLRecord) (err error) { + identityKey, err := keychain.GetOrAdd(record.Identity) if err != nil { return } diff --git a/pkg/acl/list/list_test.go b/pkg/acl/list/list_test.go index 8ca208be..acc5f570 100644 --- a/pkg/acl/list/list_test.go +++ b/pkg/acl/list/list_test.go @@ -28,8 +28,8 @@ func TestAclList_ACLState_UserInviteAndJoin(t *testing.T) { assert.Equal(t, aclpb.ACLChange_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) assert.Equal(t, aclList.Head().Content.CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) - var records []*Record - aclList.Iterate(func(record *Record) (IsContinue bool) { + var records []*ACLRecord + aclList.Iterate(func(record *ACLRecord) (IsContinue bool) { records = append(records, record) return true }) @@ -69,8 +69,8 @@ func TestAclList_ACLState_UserJoinAndRemove(t *testing.T) { _, exists := aclList.ACLState().GetUserStates()[idB] assert.Equal(t, false, exists) - var records []*Record - aclList.Iterate(func(record *Record) (IsContinue bool) { + var records []*ACLRecord + aclList.Iterate(func(record *ACLRecord) (IsContinue bool) { records = append(records, record) return true }) diff --git a/pkg/acl/list/record.go b/pkg/acl/list/record.go index 724bd94e..1cf10e59 100644 --- a/pkg/acl/list/record.go +++ b/pkg/acl/list/record.go @@ -5,30 +5,33 @@ import ( "github.com/gogo/protobuf/proto" ) -type Record struct { - Id string - Content *aclpb.Record - Model interface{} - Sign []byte +type ACLRecord struct { + Id string + Content *aclpb.ACLRecord + Identity string + Model interface{} + Sign []byte } -func NewRecord(id string, aclRecord *aclpb.Record) *Record { - return &Record{ - Id: id, - Content: aclRecord, +func NewRecord(id string, aclRecord *aclpb.ACLRecord) *ACLRecord { + return &ACLRecord{ + Id: id, + Content: aclRecord, + Identity: string(aclRecord.Identity), } } -func NewFromRawRecord(rawRec *aclpb.RawRecord) (*Record, error) { - aclRec := &aclpb.Record{} +func NewFromRawRecord(rawRec *aclpb.RawACLRecord) (*ACLRecord, error) { + aclRec := &aclpb.ACLRecord{} err := proto.Unmarshal(rawRec.Payload, aclRec) if err != nil { return nil, err } - return &Record{ - Id: rawRec.Id, - Content: aclRec, - Sign: rawRec.Signature, + return &ACLRecord{ + Id: rawRec.Id, + Content: aclRec, + Sign: rawRec.Signature, + Identity: string(aclRec.Identity), }, nil } diff --git a/pkg/acl/storage/inmemory.go b/pkg/acl/storage/inmemory.go index 16879c38..7f6af367 100644 --- a/pkg/acl/storage/inmemory.go +++ b/pkg/acl/storage/inmemory.go @@ -8,8 +8,8 @@ import ( ) type inMemoryACLListStorage struct { - header *aclpb.Header - records []*aclpb.RawRecord + header *aclpb.ACLHeader + records []*aclpb.RawACLRecord id string @@ -18,8 +18,8 @@ type inMemoryACLListStorage struct { func NewInMemoryACLListStorage( id string, - header *aclpb.Header, - records []*aclpb.RawRecord) (ListStorage, error) { + header *aclpb.ACLHeader, + records []*aclpb.RawACLRecord) (ListStorage, error) { return &inMemoryACLListStorage{ id: id, header: header, @@ -28,19 +28,19 @@ func NewInMemoryACLListStorage( }, nil } -func (i *inMemoryACLListStorage) Header() (*aclpb.Header, error) { +func (i *inMemoryACLListStorage) Header() (*aclpb.ACLHeader, error) { i.RLock() defer i.RUnlock() return i.header, nil } -func (i *inMemoryACLListStorage) Head() (*aclpb.RawRecord, error) { +func (i *inMemoryACLListStorage) Head() (*aclpb.RawACLRecord, error) { i.RLock() defer i.RUnlock() return i.records[len(i.records)-1], nil } -func (i *inMemoryACLListStorage) GetRawRecord(ctx context.Context, id string) (*aclpb.RawRecord, error) { +func (i *inMemoryACLListStorage) GetRawRecord(ctx context.Context, id string) (*aclpb.RawACLRecord, error) { i.RLock() defer i.RUnlock() for _, rec := range i.records { @@ -51,7 +51,7 @@ func (i *inMemoryACLListStorage) GetRawRecord(ctx context.Context, id string) (* return nil, fmt.Errorf("no such record") } -func (i *inMemoryACLListStorage) AddRawRecord(ctx context.Context, rec *aclpb.RawRecord) error { +func (i *inMemoryACLListStorage) AddRawRecord(ctx context.Context, rec *aclpb.RawACLRecord) error { panic("implement me") } @@ -63,19 +63,19 @@ func (i *inMemoryACLListStorage) ID() (string, error) { type inMemoryTreeStorage struct { id string - header *aclpb.Header + header *aclpb.TreeHeader heads []string - changes map[string]*aclpb.RawChange + changes map[string]*aclpb.RawTreeChangeWithId sync.RWMutex } func NewInMemoryTreeStorage( treeId string, - header *aclpb.Header, + header *aclpb.TreeHeader, heads []string, - changes []*aclpb.RawChange) (TreeStorage, error) { - allChanges := make(map[string]*aclpb.RawChange) + changes []*aclpb.RawTreeChangeWithId) (TreeStorage, error) { + allChanges := make(map[string]*aclpb.RawTreeChangeWithId) for _, ch := range changes { allChanges[ch.Id] = ch } @@ -95,7 +95,7 @@ func (t *inMemoryTreeStorage) ID() (string, error) { return t.id, nil } -func (t *inMemoryTreeStorage) Header() (*aclpb.Header, error) { +func (t *inMemoryTreeStorage) Header() (*aclpb.TreeHeader, error) { t.RLock() defer t.RUnlock() return t.header, nil @@ -118,7 +118,7 @@ func (t *inMemoryTreeStorage) SetHeads(heads []string) error { return nil } -func (t *inMemoryTreeStorage) AddRawChange(change *aclpb.RawChange) error { +func (t *inMemoryTreeStorage) AddRawChange(change *aclpb.RawTreeChangeWithId) error { t.Lock() defer t.Unlock() // TODO: better to do deep copy @@ -126,7 +126,7 @@ func (t *inMemoryTreeStorage) AddRawChange(change *aclpb.RawChange) error { return nil } -func (t *inMemoryTreeStorage) GetRawChange(ctx context.Context, changeId string) (*aclpb.RawChange, error) { +func (t *inMemoryTreeStorage) GetRawChange(ctx context.Context, changeId string) (*aclpb.RawTreeChangeWithId, error) { t.RLock() defer t.RUnlock() if res, exists := t.changes[changeId]; exists { diff --git a/pkg/acl/storage/liststorage.go b/pkg/acl/storage/liststorage.go index ff2ff426..90cb9cdc 100644 --- a/pkg/acl/storage/liststorage.go +++ b/pkg/acl/storage/liststorage.go @@ -7,8 +7,8 @@ import ( type ListStorage interface { Storage - Head() (*aclpb.RawRecord, error) + Head() (*aclpb.RawACLRecord, error) - GetRawRecord(ctx context.Context, id string) (*aclpb.RawRecord, error) - AddRawRecord(ctx context.Context, rec *aclpb.RawRecord) error + GetRawRecord(ctx context.Context, id string) (*aclpb.RawACLRecord, error) + AddRawRecord(ctx context.Context, rec *aclpb.RawACLRecord) error } diff --git a/pkg/acl/storage/provider.go b/pkg/acl/storage/provider.go index 12d47d00..984b21c4 100644 --- a/pkg/acl/storage/provider.go +++ b/pkg/acl/storage/provider.go @@ -9,15 +9,15 @@ var ErrUnknownTreeId = errors.New("tree does not exist") type TreeStorageCreatePayload struct { TreeId string - Header *aclpb.Header - Changes []*aclpb.RawChange + Header *aclpb.TreeHeader + Changes []*aclpb.RawTreeChangeWithId Heads []string } type ACLListStorageCreatePayload struct { ListId string - Header *aclpb.Header - Records []*aclpb.RawRecord + Header *aclpb.ACLHeader + Records []*aclpb.RawACLRecord } type Provider interface { diff --git a/pkg/acl/storage/treestorage.go b/pkg/acl/storage/treestorage.go index d2cf7eec..3a5d8866 100644 --- a/pkg/acl/storage/treestorage.go +++ b/pkg/acl/storage/treestorage.go @@ -10,8 +10,8 @@ type TreeStorage interface { Heads() ([]string, error) SetHeads(heads []string) error - AddRawChange(change *aclpb.RawChange) error - GetRawChange(ctx context.Context, recordID string) (*aclpb.RawChange, error) + AddRawChange(change *aclpb.RawTreeChangeWithId) error + GetRawChange(ctx context.Context, recordID string) (*aclpb.RawTreeChangeWithId, error) } type TreeStorageCreatorFunc = func(payload TreeStorageCreatePayload) (TreeStorage, error) diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index 324f8733..4dc5086e 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -19,8 +19,8 @@ import ( type ACLListStorageBuilder struct { aclList string - records []*aclpb.Record - rawRecords []*aclpb.RawRecord + records []*aclpb.ACLRecord + rawRecords []*aclpb.RawACLRecord indexes map[string]int keychain *Keychain header *aclpb.Header @@ -29,7 +29,7 @@ type ACLListStorageBuilder struct { func NewACLListStorageBuilder(keychain *Keychain) *ACLListStorageBuilder { return &ACLListStorageBuilder{ - records: make([]*aclpb.Record, 0), + records: make([]*aclpb.ACLRecord, 0), indexes: make(map[string]int), keychain: keychain, } @@ -58,7 +58,7 @@ func NewACLListStorageBuilderFromFile(file string) (*ACLListStorageBuilder, erro return tb, nil } -func (t *ACLListStorageBuilder) createRaw(rec *aclpb.Record) *aclpb.RawRecord { +func (t *ACLListStorageBuilder) createRaw(rec *aclpb.ACLRecord) *aclpb.RawACLRecord { aclMarshaled, err := proto.Marshal(rec) if err != nil { panic("should be able to marshal final acl message!") @@ -71,18 +71,18 @@ func (t *ACLListStorageBuilder) createRaw(rec *aclpb.Record) *aclpb.RawRecord { id, _ := cid.NewCIDFromBytes(aclMarshaled) - return &aclpb.RawRecord{ + return &aclpb.RawACLRecord{ Payload: aclMarshaled, Signature: signature, Id: id, } } -func (t *ACLListStorageBuilder) getRecord(idx int) *aclpb.RawRecord { +func (t *ACLListStorageBuilder) getRecord(idx int) *aclpb.RawACLRecord { return t.rawRecords[idx] } -func (t *ACLListStorageBuilder) Head() (*aclpb.RawRecord, error) { +func (t *ACLListStorageBuilder) Head() (*aclpb.RawACLRecord, error) { return t.getRecord(len(t.records) - 1), nil } @@ -90,7 +90,7 @@ func (t *ACLListStorageBuilder) Header() (*aclpb.Header, error) { return t.header, nil } -func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*aclpb.RawRecord, error) { +func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*aclpb.RawACLRecord, error) { recIdx, ok := t.indexes[id] if !ok { return nil, fmt.Errorf("no such record") @@ -98,7 +98,7 @@ func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*a return t.getRecord(recIdx), nil } -func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclpb.RawRecord) error { +func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclpb.RawACLRecord) error { panic("implement me") } @@ -106,7 +106,7 @@ func (t *ACLListStorageBuilder) ID() (string, error) { return t.id, nil } -func (t *ACLListStorageBuilder) GetRawRecords() []*aclpb.RawRecord { +func (t *ACLListStorageBuilder) GetRawRecords() []*aclpb.RawACLRecord { return t.rawRecords } @@ -132,7 +132,7 @@ func (t *ACLListStorageBuilder) Parse(tree *YMLList) { t.createHeaderAndId() } -func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclpb.Record { +func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclpb.ACLRecord { k := t.keychain.GetKey(rec.ReadKey).(*SymKey) var aclChangeContents []*aclpb.ACLChangeACLContentValue for _, ch := range rec.AclChanges { @@ -144,7 +144,7 @@ func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclpb.R } bytes, _ := data.Marshal() - return &aclpb.Record{ + return &aclpb.ACLRecord{ PrevId: prevId, Identity: t.keychain.GetIdentity(rec.Identity), Data: bytes, @@ -163,7 +163,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLChangeACLContentValue{ Value: &aclpb.ACLChangeACLContentValueValueOfUserAdd{ - UserAdd: &aclpb.ACLChangeUserAdd{ + UserAdd: &aclpb.ACLUserPermissionsAdd{ Identity: t.keychain.GetIdentity(add.Identity), EncryptionKey: rawKey, EncryptedReadKeys: t.encryptReadKeys(add.EncryptedReadKeys, encKey), @@ -187,7 +187,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLChangeACLContentValue{ Value: &aclpb.ACLChangeACLContentValueValueOfUserJoin{ - UserJoin: &aclpb.ACLChangeUserJoin{ + UserJoin: &aclpb.ACLUserPermissionsJoin{ Identity: t.keychain.GetIdentity(join.Identity), EncryptionKey: rawKey, AcceptSignature: signature, @@ -205,7 +205,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLChangeACLContentValue{ Value: &aclpb.ACLChangeACLContentValueValueOfUserInvite{ - UserInvite: &aclpb.ACLChangeUserInvite{ + UserInvite: &aclpb.ACLUserPermissionsInvite{ AcceptPublicKey: rawAcceptKey, EncryptPublicKey: rawEncKey, EncryptedReadKeys: t.encryptReadKeys(invite.EncryptedReadKeys, encKey), @@ -219,7 +219,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLChangeACLContentValue{ Value: &aclpb.ACLChangeACLContentValueValueOfUserConfirm{ - UserConfirm: &aclpb.ACLChangeUserConfirm{ + UserConfirm: &aclpb.ACLUserPermissionsConfirm{ Identity: t.keychain.GetIdentity(confirm.Identity), UserAddId: confirm.UserAddId, }, @@ -230,7 +230,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLChangeACLContentValue{ Value: &aclpb.ACLChangeACLContentValueValueOfUserPermissionChange{ - UserPermissionChange: &aclpb.ACLChangeUserPermissionChange{ + UserPermissionChange: &aclpb.ACLUserPermissionsPermissionChange{ Identity: t.keychain.GetIdentity(permissionChange.Identity), Permissions: t.convertPermission(permissionChange.Permission), }, @@ -259,7 +259,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLChangeACLContentValue{ Value: &aclpb.ACLChangeACLContentValueValueOfUserRemove{ - UserRemove: &aclpb.ACLChangeUserRemove{ + UserRemove: &aclpb.ACLUserPermissionsRemove{ Identity: t.keychain.GetIdentity(remove.RemovedIdentity), ReadKeyReplaces: replaces, }, @@ -286,7 +286,7 @@ func (t *ACLListStorageBuilder) encryptReadKeys(keys []string, encKey encryption return } -func (t *ACLListStorageBuilder) convertPermission(perm string) aclpb.ACLChangeUserPermissions { +func (t *ACLListStorageBuilder) convertPermission(perm string) aclpb.ACLUserPermissions { switch perm { case "admin": return aclpb.ACLChange_Admin @@ -299,7 +299,7 @@ func (t *ACLListStorageBuilder) convertPermission(perm string) aclpb.ACLChangeUs } } -func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclpb.Record, id string) error) (err error) { +func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclpb.ACLRecord, id string) error) (err error) { for i := len(t.records) - 1; i >= 0; i-- { err = f(t.records[i], t.rawRecords[i].Id) if err != nil { diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go b/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go index b637827f..9c7bf581 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go @@ -33,7 +33,7 @@ func (t *ACLListStorageBuilder) Graph() (string, error) { graph.SetDir(true) var nodes = make(map[string]struct{}) - var addNodes = func(r *aclpb.Record, id string) error { + var addNodes = func(r *aclpb.ACLRecord, id string) error { style := "solid" var chSymbs []string @@ -92,7 +92,7 @@ func (t *ACLListStorageBuilder) Graph() (string, error) { return nil } - var addLinks = func(r *aclpb.Record, id string) error { + var addLinks = func(r *aclpb.ACLRecord, id string) error { if r.PrevId == "" { return nil } diff --git a/pkg/acl/testutils/testchanges/proto/test.pb.go b/pkg/acl/testutils/testchanges/proto/test.pb.go index 53be5aba..e8e43c54 100644 --- a/pkg/acl/testutils/testchanges/proto/test.pb.go +++ b/pkg/acl/testutils/testchanges/proto/test.pb.go @@ -58,24 +58,24 @@ func (m *PlainTextChange) XXX_DiscardUnknown() { var xxx_messageInfo_PlainTextChange proto.InternalMessageInfo -type PlainTextChangeContent struct { +type PlainTextChange_Content struct { // Types that are valid to be assigned to Value: - // *PlainTextChangeContentValueOfTextAppend - Value IsPlainTextChangeContentValue `protobuf_oneof:"value"` + // *PlainTextChange_Content_TextAppend + Value isPlainTextChange_Content_Value `protobuf_oneof:"value"` } -func (m *PlainTextChangeContent) Reset() { *m = PlainTextChangeContent{} } -func (m *PlainTextChangeContent) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeContent) ProtoMessage() {} -func (*PlainTextChangeContent) Descriptor() ([]byte, []int) { +func (m *PlainTextChange_Content) Reset() { *m = PlainTextChange_Content{} } +func (m *PlainTextChange_Content) String() string { return proto.CompactTextString(m) } +func (*PlainTextChange_Content) ProtoMessage() {} +func (*PlainTextChange_Content) Descriptor() ([]byte, []int) { return fileDescriptor_37f33c266ada4318, []int{0, 0} } -func (m *PlainTextChangeContent) XXX_Unmarshal(b []byte) error { +func (m *PlainTextChange_Content) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChangeContent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *PlainTextChange_Content) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChangeContent.Marshal(b, m, deterministic) + return xxx_messageInfo_PlainTextChange_Content.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -85,67 +85,67 @@ func (m *PlainTextChangeContent) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } -func (m *PlainTextChangeContent) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeContent.Merge(m, src) +func (m *PlainTextChange_Content) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChange_Content.Merge(m, src) } -func (m *PlainTextChangeContent) XXX_Size() int { +func (m *PlainTextChange_Content) XXX_Size() int { return m.Size() } -func (m *PlainTextChangeContent) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeContent.DiscardUnknown(m) +func (m *PlainTextChange_Content) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChange_Content.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChangeContent proto.InternalMessageInfo +var xxx_messageInfo_PlainTextChange_Content proto.InternalMessageInfo -type IsPlainTextChangeContentValue interface { - IsPlainTextChangeContentValue() +type isPlainTextChange_Content_Value interface { + isPlainTextChange_Content_Value() MarshalTo([]byte) (int, error) Size() int } -type PlainTextChangeContentValueOfTextAppend struct { - TextAppend *PlainTextChangeTextAppend `protobuf:"bytes,1,opt,name=textAppend,proto3,oneof" json:"textAppend,omitempty"` +type PlainTextChange_Content_TextAppend struct { + TextAppend *PlainTextChange_TextAppend `protobuf:"bytes,1,opt,name=textAppend,proto3,oneof" json:"textAppend,omitempty"` } -func (*PlainTextChangeContentValueOfTextAppend) IsPlainTextChangeContentValue() {} +func (*PlainTextChange_Content_TextAppend) isPlainTextChange_Content_Value() {} -func (m *PlainTextChangeContent) GetValue() IsPlainTextChangeContentValue { +func (m *PlainTextChange_Content) GetValue() isPlainTextChange_Content_Value { if m != nil { return m.Value } return nil } -func (m *PlainTextChangeContent) GetTextAppend() *PlainTextChangeTextAppend { - if x, ok := m.GetValue().(*PlainTextChangeContentValueOfTextAppend); ok { +func (m *PlainTextChange_Content) GetTextAppend() *PlainTextChange_TextAppend { + if x, ok := m.GetValue().(*PlainTextChange_Content_TextAppend); ok { return x.TextAppend } return nil } // XXX_OneofWrappers is for the internal use of the proto package. -func (*PlainTextChangeContent) XXX_OneofWrappers() []interface{} { +func (*PlainTextChange_Content) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*PlainTextChangeContentValueOfTextAppend)(nil), + (*PlainTextChange_Content_TextAppend)(nil), } } -type PlainTextChangeTextAppend struct { +type PlainTextChange_TextAppend struct { Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` } -func (m *PlainTextChangeTextAppend) Reset() { *m = PlainTextChangeTextAppend{} } -func (m *PlainTextChangeTextAppend) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeTextAppend) ProtoMessage() {} -func (*PlainTextChangeTextAppend) Descriptor() ([]byte, []int) { +func (m *PlainTextChange_TextAppend) Reset() { *m = PlainTextChange_TextAppend{} } +func (m *PlainTextChange_TextAppend) String() string { return proto.CompactTextString(m) } +func (*PlainTextChange_TextAppend) ProtoMessage() {} +func (*PlainTextChange_TextAppend) Descriptor() ([]byte, []int) { return fileDescriptor_37f33c266ada4318, []int{0, 1} } -func (m *PlainTextChangeTextAppend) XXX_Unmarshal(b []byte) error { +func (m *PlainTextChange_TextAppend) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChangeTextAppend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *PlainTextChange_TextAppend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChangeTextAppend.Marshal(b, m, deterministic) + return xxx_messageInfo_PlainTextChange_TextAppend.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -155,41 +155,41 @@ func (m *PlainTextChangeTextAppend) XXX_Marshal(b []byte, deterministic bool) ([ return b[:n], nil } } -func (m *PlainTextChangeTextAppend) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeTextAppend.Merge(m, src) +func (m *PlainTextChange_TextAppend) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChange_TextAppend.Merge(m, src) } -func (m *PlainTextChangeTextAppend) XXX_Size() int { +func (m *PlainTextChange_TextAppend) XXX_Size() int { return m.Size() } -func (m *PlainTextChangeTextAppend) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeTextAppend.DiscardUnknown(m) +func (m *PlainTextChange_TextAppend) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChange_TextAppend.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChangeTextAppend proto.InternalMessageInfo +var xxx_messageInfo_PlainTextChange_TextAppend proto.InternalMessageInfo -func (m *PlainTextChangeTextAppend) GetText() string { +func (m *PlainTextChange_TextAppend) GetText() string { if m != nil { return m.Text } return "" } -type PlainTextChangeSnapshot struct { +type PlainTextChange_Snapshot struct { Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` } -func (m *PlainTextChangeSnapshot) Reset() { *m = PlainTextChangeSnapshot{} } -func (m *PlainTextChangeSnapshot) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeSnapshot) ProtoMessage() {} -func (*PlainTextChangeSnapshot) Descriptor() ([]byte, []int) { +func (m *PlainTextChange_Snapshot) Reset() { *m = PlainTextChange_Snapshot{} } +func (m *PlainTextChange_Snapshot) String() string { return proto.CompactTextString(m) } +func (*PlainTextChange_Snapshot) ProtoMessage() {} +func (*PlainTextChange_Snapshot) Descriptor() ([]byte, []int) { return fileDescriptor_37f33c266ada4318, []int{0, 2} } -func (m *PlainTextChangeSnapshot) XXX_Unmarshal(b []byte) error { +func (m *PlainTextChange_Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChangeSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *PlainTextChange_Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChangeSnapshot.Marshal(b, m, deterministic) + return xxx_messageInfo_PlainTextChange_Snapshot.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -199,42 +199,42 @@ func (m *PlainTextChangeSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *PlainTextChangeSnapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeSnapshot.Merge(m, src) +func (m *PlainTextChange_Snapshot) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChange_Snapshot.Merge(m, src) } -func (m *PlainTextChangeSnapshot) XXX_Size() int { +func (m *PlainTextChange_Snapshot) XXX_Size() int { return m.Size() } -func (m *PlainTextChangeSnapshot) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeSnapshot.DiscardUnknown(m) +func (m *PlainTextChange_Snapshot) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChange_Snapshot.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChangeSnapshot proto.InternalMessageInfo +var xxx_messageInfo_PlainTextChange_Snapshot proto.InternalMessageInfo -func (m *PlainTextChangeSnapshot) GetText() string { +func (m *PlainTextChange_Snapshot) GetText() string { if m != nil { return m.Text } return "" } -type PlainTextChangeData struct { - Content []*PlainTextChangeContent `protobuf:"bytes,1,rep,name=content,proto3" json:"content,omitempty"` - Snapshot *PlainTextChangeSnapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` +type PlainTextChange_Data struct { + Content []*PlainTextChange_Content `protobuf:"bytes,1,rep,name=content,proto3" json:"content,omitempty"` + Snapshot *PlainTextChange_Snapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` } -func (m *PlainTextChangeData) Reset() { *m = PlainTextChangeData{} } -func (m *PlainTextChangeData) String() string { return proto.CompactTextString(m) } -func (*PlainTextChangeData) ProtoMessage() {} -func (*PlainTextChangeData) Descriptor() ([]byte, []int) { +func (m *PlainTextChange_Data) Reset() { *m = PlainTextChange_Data{} } +func (m *PlainTextChange_Data) String() string { return proto.CompactTextString(m) } +func (*PlainTextChange_Data) ProtoMessage() {} +func (*PlainTextChange_Data) Descriptor() ([]byte, []int) { return fileDescriptor_37f33c266ada4318, []int{0, 3} } -func (m *PlainTextChangeData) XXX_Unmarshal(b []byte) error { +func (m *PlainTextChange_Data) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChangeData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *PlainTextChange_Data) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChangeData.Marshal(b, m, deterministic) + return xxx_messageInfo_PlainTextChange_Data.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -244,26 +244,26 @@ func (m *PlainTextChangeData) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *PlainTextChangeData) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChangeData.Merge(m, src) +func (m *PlainTextChange_Data) XXX_Merge(src proto.Message) { + xxx_messageInfo_PlainTextChange_Data.Merge(m, src) } -func (m *PlainTextChangeData) XXX_Size() int { +func (m *PlainTextChange_Data) XXX_Size() int { return m.Size() } -func (m *PlainTextChangeData) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChangeData.DiscardUnknown(m) +func (m *PlainTextChange_Data) XXX_DiscardUnknown() { + xxx_messageInfo_PlainTextChange_Data.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChangeData proto.InternalMessageInfo +var xxx_messageInfo_PlainTextChange_Data proto.InternalMessageInfo -func (m *PlainTextChangeData) GetContent() []*PlainTextChangeContent { +func (m *PlainTextChange_Data) GetContent() []*PlainTextChange_Content { if m != nil { return m.Content } return nil } -func (m *PlainTextChangeData) GetSnapshot() *PlainTextChangeSnapshot { +func (m *PlainTextChange_Data) GetSnapshot() *PlainTextChange_Snapshot { if m != nil { return m.Snapshot } @@ -272,10 +272,10 @@ func (m *PlainTextChangeData) GetSnapshot() *PlainTextChangeSnapshot { func init() { proto.RegisterType((*PlainTextChange)(nil), "anytype.PlainTextChange") - proto.RegisterType((*PlainTextChangeContent)(nil), "anytype.PlainTextChange.Content") - proto.RegisterType((*PlainTextChangeTextAppend)(nil), "anytype.PlainTextChange.TextAppend") - proto.RegisterType((*PlainTextChangeSnapshot)(nil), "anytype.PlainTextChange.Snapshot") - proto.RegisterType((*PlainTextChangeData)(nil), "anytype.PlainTextChange.Data") + proto.RegisterType((*PlainTextChange_Content)(nil), "anytype.PlainTextChange.Content") + proto.RegisterType((*PlainTextChange_TextAppend)(nil), "anytype.PlainTextChange.TextAppend") + proto.RegisterType((*PlainTextChange_Snapshot)(nil), "anytype.PlainTextChange.Snapshot") + proto.RegisterType((*PlainTextChange_Data)(nil), "anytype.PlainTextChange.Data") } func init() { @@ -326,7 +326,7 @@ func (m *PlainTextChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *PlainTextChangeContent) Marshal() (dAtA []byte, err error) { +func (m *PlainTextChange_Content) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -336,12 +336,12 @@ func (m *PlainTextChangeContent) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChangeContent) MarshalTo(dAtA []byte) (int, error) { +func (m *PlainTextChange_Content) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChangeContent) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PlainTextChange_Content) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -358,12 +358,12 @@ func (m *PlainTextChangeContent) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *PlainTextChangeContentValueOfTextAppend) MarshalTo(dAtA []byte) (int, error) { +func (m *PlainTextChange_Content_TextAppend) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChangeContentValueOfTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PlainTextChange_Content_TextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.TextAppend != nil { { @@ -379,7 +379,7 @@ func (m *PlainTextChangeContentValueOfTextAppend) MarshalToSizedBuffer(dAtA []by } return len(dAtA) - i, nil } -func (m *PlainTextChangeTextAppend) Marshal() (dAtA []byte, err error) { +func (m *PlainTextChange_TextAppend) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -389,12 +389,12 @@ func (m *PlainTextChangeTextAppend) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChangeTextAppend) MarshalTo(dAtA []byte) (int, error) { +func (m *PlainTextChange_TextAppend) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChangeTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PlainTextChange_TextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -409,7 +409,7 @@ func (m *PlainTextChangeTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *PlainTextChangeSnapshot) Marshal() (dAtA []byte, err error) { +func (m *PlainTextChange_Snapshot) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -419,12 +419,12 @@ func (m *PlainTextChangeSnapshot) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChangeSnapshot) MarshalTo(dAtA []byte) (int, error) { +func (m *PlainTextChange_Snapshot) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChangeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PlainTextChange_Snapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -439,7 +439,7 @@ func (m *PlainTextChangeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *PlainTextChangeData) Marshal() (dAtA []byte, err error) { +func (m *PlainTextChange_Data) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -449,12 +449,12 @@ func (m *PlainTextChangeData) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChangeData) MarshalTo(dAtA []byte) (int, error) { +func (m *PlainTextChange_Data) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChangeData) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PlainTextChange_Data) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -508,7 +508,7 @@ func (m *PlainTextChange) Size() (n int) { return n } -func (m *PlainTextChangeContent) Size() (n int) { +func (m *PlainTextChange_Content) Size() (n int) { if m == nil { return 0 } @@ -520,7 +520,7 @@ func (m *PlainTextChangeContent) Size() (n int) { return n } -func (m *PlainTextChangeContentValueOfTextAppend) Size() (n int) { +func (m *PlainTextChange_Content_TextAppend) Size() (n int) { if m == nil { return 0 } @@ -532,7 +532,7 @@ func (m *PlainTextChangeContentValueOfTextAppend) Size() (n int) { } return n } -func (m *PlainTextChangeTextAppend) Size() (n int) { +func (m *PlainTextChange_TextAppend) Size() (n int) { if m == nil { return 0 } @@ -545,7 +545,7 @@ func (m *PlainTextChangeTextAppend) Size() (n int) { return n } -func (m *PlainTextChangeSnapshot) Size() (n int) { +func (m *PlainTextChange_Snapshot) Size() (n int) { if m == nil { return 0 } @@ -558,7 +558,7 @@ func (m *PlainTextChangeSnapshot) Size() (n int) { return n } -func (m *PlainTextChangeData) Size() (n int) { +func (m *PlainTextChange_Data) Size() (n int) { if m == nil { return 0 } @@ -633,7 +633,7 @@ func (m *PlainTextChange) Unmarshal(dAtA []byte) error { } return nil } -func (m *PlainTextChangeContent) Unmarshal(dAtA []byte) error { +func (m *PlainTextChange_Content) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -691,11 +691,11 @@ func (m *PlainTextChangeContent) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &PlainTextChangeTextAppend{} + v := &PlainTextChange_TextAppend{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &PlainTextChangeContentValueOfTextAppend{v} + m.Value = &PlainTextChange_Content_TextAppend{v} iNdEx = postIndex default: iNdEx = preIndex @@ -718,7 +718,7 @@ func (m *PlainTextChangeContent) Unmarshal(dAtA []byte) error { } return nil } -func (m *PlainTextChangeTextAppend) Unmarshal(dAtA []byte) error { +func (m *PlainTextChange_TextAppend) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -800,7 +800,7 @@ func (m *PlainTextChangeTextAppend) Unmarshal(dAtA []byte) error { } return nil } -func (m *PlainTextChangeSnapshot) Unmarshal(dAtA []byte) error { +func (m *PlainTextChange_Snapshot) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -882,7 +882,7 @@ func (m *PlainTextChangeSnapshot) Unmarshal(dAtA []byte) error { } return nil } -func (m *PlainTextChangeData) Unmarshal(dAtA []byte) error { +func (m *PlainTextChange_Data) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -940,7 +940,7 @@ func (m *PlainTextChangeData) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Content = append(m.Content, &PlainTextChangeContent{}) + m.Content = append(m.Content, &PlainTextChange_Content{}) if err := m.Content[len(m.Content)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -975,7 +975,7 @@ func (m *PlainTextChangeData) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Snapshot == nil { - m.Snapshot = &PlainTextChangeSnapshot{} + m.Snapshot = &PlainTextChange_Snapshot{} } if err := m.Snapshot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index 514cf862..cefc9327 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -16,7 +16,7 @@ var ( type ChangeContent struct { ChangesData proto.Marshaler - ACLData *aclpb.ACLChangeACLData + ACLData *aclpb.ACLData Id string // TODO: this is just for testing, because id should be created automatically from content } @@ -34,8 +34,9 @@ type Change struct { visited bool branchesFinished bool - Content *aclpb.Change - Sign []byte + Content *aclpb.TreeChange + Identity string + Sign []byte } func (ch *Change) ProtoChange() proto.Marshaler { @@ -56,7 +57,7 @@ func (ch *Change) DecryptContents(key *symmetric.Key) error { return nil } -func NewChange(id string, ch *aclpb.Change, signature []byte) *Change { +func NewChange(id string, ch *aclpb.TreeChange, signature []byte) *Change { return &Change{ Next: nil, PreviousIds: ch.TreeHeadIds, @@ -64,6 +65,7 @@ func NewChange(id string, ch *aclpb.Change, signature []byte) *Change { Content: ch, SnapshotId: ch.SnapshotBaseId, IsSnapshot: ch.IsSnapshot, + Identity: string(ch.Identity), Sign: signature, } } diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index edaa93a2..3a2f0701 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -1,6 +1,7 @@ package tree import ( + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" @@ -10,25 +11,24 @@ import ( "time" ) -const componentBuilder = "tree.changebuilder" +var ErrEmptyChange = errors.New("change payload should not be empty") type BuilderContent struct { treeHeadIds []string aclHeadId string snapshotBaseId string currentReadKeyHash uint64 - identity string + identity []byte isSnapshot bool signingKey signingkey.PrivKey readKey *symmetric.Key - content proto.Marshaler + content []byte } type ChangeBuilder interface { - ConvertFromRaw(rawChange *aclpb.RawChange) (ch *Change, err error) - ConvertFromRawAndVerify(rawChange *aclpb.RawChange) (ch *Change, err error) - BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawChange, err error) - BuildRaw(ch *Change) (*aclpb.RawChange, error) + ConvertFromRaw(rawIdChange *aclpb.RawTreeChangeWithId, verify bool) (ch *Change, err error) + BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawTreeChangeWithId, err error) + BuildRaw(ch *Change) (*aclpb.RawTreeChangeWithId, error) } type changeBuilder struct { @@ -39,49 +39,55 @@ func newChangeBuilder(keys *common.Keychain) ChangeBuilder { return &changeBuilder{keys: keys} } -func (c *changeBuilder) ConvertFromRaw(rawChange *aclpb.RawChange) (ch *Change, err error) { - unmarshalled := &aclpb.Change{} - err = proto.Unmarshal(rawChange.Payload, unmarshalled) - if err != nil { - return nil, err +func (c *changeBuilder) ConvertFromRaw(rawIdChange *aclpb.RawTreeChangeWithId, verify bool) (ch *Change, err error) { + if rawIdChange.GetRawChange() == nil { + err = ErrEmptyChange + return } - ch = NewChange(rawChange.Id, unmarshalled, rawChange.Signature) + if verify { + // verifying ID + if !cid.VerifyCID(rawIdChange.RawChange, rawIdChange.Id) { + err = ErrIncorrectCID + return + } + } + + raw := &aclpb.RawTreeChange{} + err = proto.Unmarshal(rawIdChange.GetRawChange(), raw) + if err != nil { + return + } + + if verify { + identityKey, err := c.keys.GetOrAdd(ch.Identity) + if err != nil { + return + } + + // verifying signature + res, err := identityKey.Verify(raw.Payload, raw.Signature) + if err != nil { + return + } + if !res { + err = ErrIncorrectSignature + return + } + } + + unmarshalled := &aclpb.TreeChange{} + err = proto.Unmarshal(raw.Payload, unmarshalled) + if err != nil { + return + } + + ch = NewChange(rawIdChange.Id, unmarshalled, raw.Signature) return } -func (c *changeBuilder) ConvertFromRawAndVerify(rawChange *aclpb.RawChange) (ch *Change, err error) { - unmarshalled := &aclpb.Change{} - ch, err = c.ConvertFromRaw(rawChange) - if err != nil { - return nil, err - } - - identityKey, err := c.keys.GetOrAdd(unmarshalled.Identity) - if err != nil { - return - } - - // verifying signature - res, err := identityKey.Verify(rawChange.Payload, rawChange.Signature) - if err != nil { - return - } - if !res { - err = ErrIncorrectSignature - return - } - - // verifying ID - if !cid.VerifyCID(rawChange.Payload, rawChange.Id) { - err = ErrIncorrectCID - } - - return -} - -func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawChange, err error) { - aclChange := &aclpb.Change{ +func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, rawIdChange *aclpb.RawTreeChangeWithId, err error) { + change := &aclpb.TreeChange{ TreeHeadIds: payload.treeHeadIds, AclHeadId: payload.aclHeadId, SnapshotBaseId: payload.snapshotBaseId, @@ -90,53 +96,65 @@ func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, raw *a Identity: payload.identity, IsSnapshot: payload.isSnapshot, } - marshalledData, err := payload.content.Marshal() + + encrypted, err := payload.readKey.Encrypt(payload.content) + if err != nil { + return + } + change.ChangesData = encrypted + + marshalledChange, err := proto.Marshal(change) if err != nil { return } - encrypted, err := payload.readKey.Encrypt(marshalledData) - if err != nil { - return - } - aclChange.ChangesData = encrypted - - fullMarshalledChange, err := proto.Marshal(aclChange) + signature, err := payload.signingKey.Sign(marshalledChange) if err != nil { return } - signature, err := payload.signingKey.Sign(fullMarshalledChange) + raw := &aclpb.RawTreeChange{ + Payload: marshalledChange, + Signature: signature, + } + + marshalledRawChange, err := proto.Marshal(raw) if err != nil { return } - id, err := cid.NewCIDFromBytes(fullMarshalledChange) + id, err := cid.NewCIDFromBytes(marshalledRawChange) if err != nil { return } - ch = NewChange(id, aclChange, signature) + ch = NewChange(id, change, signature) ch.ParsedModel = payload.content - raw = &aclpb.RawChange{ - Payload: fullMarshalledChange, - Signature: signature, + rawIdChange = &aclpb.RawTreeChangeWithId{ + RawChange: marshalledRawChange, Id: id, } return } -func (c *changeBuilder) BuildRaw(ch *Change) (raw *aclpb.RawChange, err error) { +func (c *changeBuilder) BuildRaw(ch *Change) (raw *aclpb.RawTreeChangeWithId, err error) { var marshalled []byte marshalled, err = ch.Content.Marshal() if err != nil { return } - raw = &aclpb.RawChange{ + marshalledRawChange, err := proto.Marshal(&aclpb.RawTreeChange{ Payload: marshalled, - Signature: ch.Signature(), + Signature: ch.Sign, + }) + if err != nil { + return + } + + raw = &aclpb.RawTreeChangeWithId{ + RawChange: marshalledRawChange, Id: ch.Id, } return diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index 2f582c33..1dfac831 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -48,7 +48,7 @@ func (v *objectTreeValidator) validateChange(tree *Tree, aclList list.ACLList, c return } - if perm.Permission != aclpb.ACLChange_Writer && perm.Permission != aclpb.ACLChange_Admin { + if perm.Permission != aclpb.ACLUserPermissions_Writer && perm.Permission != aclpb.ACLUserPermissions_Admin { err = list.ErrInsufficientPermissions return } diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 114e61ba..c6ffeca7 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -8,8 +8,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" - "go.uber.org/zap" "sync" ) @@ -34,7 +32,7 @@ type AddResultSummary int type AddResult struct { OldHeads []string Heads []string - Added []*aclpb.RawChange + Added []*aclpb.RawTreeChangeWithId Mode Mode } @@ -46,7 +44,7 @@ type ObjectTree interface { RWLocker ID() string - Header() *aclpb.Header + Header() *aclpb.TreeHeader Heads() []string Root() *Change HasChange(string) bool @@ -55,13 +53,13 @@ type ObjectTree interface { IterateFrom(id string, convert ChangeConvertFunc, iterate ChangeIterateFunc) error SnapshotPath() []string - ChangesAfterCommonSnapshot(snapshotPath, heads []string) ([]*aclpb.RawChange, error) + ChangesAfterCommonSnapshot(snapshotPath, heads []string) ([]*aclpb.RawTreeChangeWithId, error) Storage() storage.TreeStorage DebugDump() (string, error) - AddContent(ctx context.Context, content SignableChangeContent) (*aclpb.RawChange, error) - AddRawChanges(ctx context.Context, changes ...*aclpb.RawChange) (AddResult, error) + AddContent(ctx context.Context, content SignableChangeContent) (*aclpb.RawTreeChangeWithId, error) + AddRawChanges(ctx context.Context, changes ...*aclpb.RawTreeChangeWithId) (AddResult, error) Close() error } @@ -76,13 +74,13 @@ type objectTree struct { aclList list.ACLList id string - header *aclpb.Header + header *aclpb.TreeHeader tree *Tree keys map[uint64]*symmetric.Key // buffers - difSnapshotBuf []*aclpb.RawChange + difSnapshotBuf []*aclpb.RawTreeChangeWithId tmpChangesBuf []*Change newSnapshotsBuf []*Change notSeenIdxBuf []int @@ -121,65 +119,6 @@ func defaultObjectTreeDeps( } } -func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { - objTree := &objectTree{ - treeStorage: deps.treeStorage, - updateListener: deps.updateListener, - treeBuilder: deps.treeBuilder, - validator: deps.validator, - aclList: deps.aclList, - changeBuilder: deps.changeBuilder, - rawChangeLoader: deps.rawChangeLoader, - tree: nil, - keys: make(map[uint64]*symmetric.Key), - tmpChangesBuf: make([]*Change, 0, 10), - difSnapshotBuf: make([]*aclpb.RawChange, 0, 10), - notSeenIdxBuf: make([]int, 0, 10), - newSnapshotsBuf: make([]*Change, 0, 10), - } - - err := objTree.rebuildFromStorage(nil) - if err != nil { - return nil, err - } - storageHeads, err := objTree.treeStorage.Heads() - if err != nil { - return nil, err - } - - // comparing rebuilt heads with heads in storage - // in theory it can happen that we didn't set heads because the process has crashed - // therefore we want to set them later - if !slice.UnsortedEquals(storageHeads, objTree.tree.Heads()) { - log.With(zap.Strings("storage", storageHeads), zap.Strings("rebuilt", objTree.tree.Heads())). - Errorf("the heads in storage and objTree are different") - err = objTree.treeStorage.SetHeads(objTree.tree.Heads()) - if err != nil { - return nil, err - } - } - - objTree.id, err = objTree.treeStorage.ID() - if err != nil { - return nil, err - } - objTree.header, err = objTree.treeStorage.Header() - if err != nil { - return nil, err - } - - if objTree.updateListener != nil { - objTree.updateListener.Rebuild(objTree) - } - - return objTree, nil -} - -func BuildObjectTree(treeStorage storage.TreeStorage, listener ObjectTreeUpdateListener, aclList list.ACLList) (ObjectTree, error) { - deps := defaultObjectTreeDeps(treeStorage, listener, aclList) - return buildObjectTree(deps) -} - func (ot *objectTree) rebuildFromStorage(newChanges []*Change) (err error) { ot.treeBuilder.Reset() @@ -201,7 +140,7 @@ func (ot *objectTree) ID() string { return ot.id } -func (ot *objectTree) Header() *aclpb.Header { +func (ot *objectTree) Header() *aclpb.TreeHeader { return ot.header } @@ -209,7 +148,7 @@ func (ot *objectTree) Storage() storage.TreeStorage { return ot.treeStorage } -func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeContent) (rawChange *aclpb.RawChange, err error) { +func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeContent) (rawChange *aclpb.RawTreeChangeWithId, err error) { defer func() { if err == nil && ot.updateListener != nil { ot.updateListener.Update(ot) @@ -258,12 +197,12 @@ func (ot *objectTree) prepareBuilderContent(content SignableChangeContent) (cnt isSnapshot: content.IsSnapshot, signingKey: content.Key, readKey: readKey, - content: content.Proto, + content: content.Data, } return } -func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (addResult AddResult, err error) { +func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawTreeChangeWithId) (addResult AddResult, err error) { var mode Mode mode, addResult, err = ot.addRawChanges(ctx, rawChanges...) if err != nil { @@ -302,7 +241,7 @@ func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra return } -func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.RawChange) (mode Mode, addResult AddResult, err error) { +func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.RawTreeChangeWithId) (mode Mode, addResult AddResult, err error) { // resetting buffers ot.tmpChangesBuf = ot.tmpChangesBuf[:0] ot.notSeenIdxBuf = ot.notSeenIdxBuf[:0] @@ -329,7 +268,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra } var change *Change - change, err = ot.changeBuilder.ConvertFromRawAndVerify(ch) + change, err = ot.changeBuilder.ConvertFromRaw(ch, true) if err != nil { return } @@ -354,7 +293,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra // returns changes that we added to the tree as attached this round // they can include not only the changes that were added now, // but also the changes that were previously in the tree - getAddedChanges := func(toConvert []*Change) (added []*aclpb.RawChange, err error) { + getAddedChanges := func(toConvert []*Change) (added []*aclpb.RawTreeChangeWithId, err error) { alreadyConverted := make(map[*Change]struct{}) // first we see if we have already unmarshalled those changes @@ -379,7 +318,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra for _, ch := range toConvert { // if we got some changes that we need to convert to raw if _, exists := alreadyConverted[ch]; !exists { - var raw *aclpb.RawChange + var raw *aclpb.RawTreeChangeWithId raw, err = ot.changeBuilder.BuildRaw(ch) if err != nil { return @@ -421,7 +360,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra ot.rebuildFromStorage(nil) return } - var added []*aclpb.RawChange + var added []*aclpb.RawTreeChangeWithId added, err = getAddedChanges(nil) // we shouldn't get any error in this case if err != nil { @@ -457,7 +396,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra err = ErrHasInvalidChanges return } - var added []*aclpb.RawChange + var added []*aclpb.RawTreeChangeWithId added, err = getAddedChanges(treeChangesAdded) if err != nil { // that means that some unattached changes were somehow corrupted in memory @@ -553,7 +492,7 @@ func (ot *objectTree) SnapshotPath() []string { return path } -func (ot *objectTree) ChangesAfterCommonSnapshot(theirPath, theirHeads []string) ([]*aclpb.RawChange, error) { +func (ot *objectTree) ChangesAfterCommonSnapshot(theirPath, theirHeads []string) ([]*aclpb.RawTreeChangeWithId, error) { var ( needFullDocument = len(theirPath) == 0 ourPath = ot.SnapshotPath() @@ -577,11 +516,11 @@ func (ot *objectTree) ChangesAfterCommonSnapshot(theirPath, theirHeads []string) } } -func (ot *objectTree) getChangesFromTree(theirHeads []string) (rawChanges []*aclpb.RawChange, err error) { +func (ot *objectTree) getChangesFromTree(theirHeads []string) (rawChanges []*aclpb.RawTreeChangeWithId, err error) { return ot.rawChangeLoader.LoadFromTree(ot.tree, theirHeads) } -func (ot *objectTree) getChangesFromDB(commonSnapshot string, theirHeads []string) (rawChanges []*aclpb.RawChange, err error) { +func (ot *objectTree) getChangesFromDB(commonSnapshot string, theirHeads []string) (rawChanges []*aclpb.RawTreeChangeWithId, err error) { return ot.rawChangeLoader.LoadFromStorage(commonSnapshot, ot.tree.headIds, theirHeads) } diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index 991eddd7..c73ce3ff 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -15,7 +15,7 @@ import ( type mockChangeCreator struct{} func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot bool, prevIds ...string) *aclpb.RawChange { - aclChange := &aclpb.Change{ + aclChange := &aclpb.TreeChange{ TreeHeadIds: prevIds, AclHeadId: aclId, SnapshotBaseId: snapshotId, @@ -23,22 +23,27 @@ func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot b IsSnapshot: isSnapshot, } res, _ := aclChange.Marshal() - return &aclpb.RawChange{ + + raw := &aclpb.RawTreeChange{ Payload: res, Signature: nil, + } + rawMarshalled, _ := raw.Marshal() + + return &aclpb.RawTreeChangeWithId{ + RawChange: rawMarshalled, Id: id, } } func (c *mockChangeCreator) createNewTreeStorage(treeId, aclListId, aclHeadId, firstChangeId string) storage.TreeStorage { firstChange := c.createRaw(firstChangeId, aclHeadId, "", true) - header := &aclpb.Header{ - FirstId: firstChangeId, - AclListId: aclListId, - WorkspaceId: "", - DocType: aclpb.Header_DocTree, + header := &aclpb.TreeHeader{ + FirstId: firstChangeId, + AclId: aclListId, + TreeHeaderType: aclpb.TreeHeaderType_Object, } - treeStorage, _ := storage.NewInMemoryTreeStorage(treeId, header, []string{firstChangeId}, []*aclpb.RawChange{firstChange}) + treeStorage, _ := storage.NewInMemoryTreeStorage(treeId, header, []string{firstChangeId}, []*aclpb.RawTreeChangeWithId{firstChange}) return treeStorage } diff --git a/pkg/acl/tree/objecttreefactory.go b/pkg/acl/tree/objecttreefactory.go new file mode 100644 index 00000000..a62c8add --- /dev/null +++ b/pkg/acl/tree/objecttreefactory.go @@ -0,0 +1,161 @@ +package tree + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" + "github.com/gogo/protobuf/proto" + "go.uber.org/zap" +) + +type ObjectTreeCreatePayload struct { + AccountData *account.AccountData + HeaderData []byte + ChangeData []byte + TreeType aclpb.TreeHeaderType +} + +func BuildObjectTree(treeStorage storage.TreeStorage, listener ObjectTreeUpdateListener, aclList list.ACLList) (ObjectTree, error) { + deps := defaultObjectTreeDeps(treeStorage, listener, aclList) + return buildObjectTree(deps) +} + +func CreateObjectTree( + payload ObjectTreeCreatePayload, + listener ObjectTreeUpdateListener, + aclList list.ACLList, + createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + aclList.RLock() + var ( + deps = defaultObjectTreeDeps(nil, listener, aclList) + state = aclList.ACLState() + aclId = aclList.ID() + aclHeadId = aclList.Head().Id + readKeyHash = state.CurrentReadKeyHash() + ) + readKey, err := state.CurrentReadKey() + aclList.RUnlock() + + if err != nil { + return + } + + // create first change + cnt := BuilderContent{ + treeHeadIds: nil, + aclHeadId: aclHeadId, + snapshotBaseId: "", + currentReadKeyHash: readKeyHash, + isSnapshot: true, + readKey: readKey, + identity: payload.AccountData.Identity, + signingKey: payload.AccountData.SignKey, + content: payload.ChangeData, + } + + _, raw, err := deps.changeBuilder.BuildContent(cnt) + if err != nil { + return + } + + // create header + header, id, err := createTreeHeaderAndId( + raw, + payload.TreeType, + aclId, + payload.AccountData.Identity, + payload.HeaderData) + if err != nil { + return + } + + // create storage + st, err := createStorage(storage.TreeStorageCreatePayload{ + TreeId: id, + Header: header, + Changes: []*aclpb.RawTreeChangeWithId{raw}, + Heads: []string{raw.Id}, + }) + if err != nil { + return + } + + deps.treeStorage = st + return buildObjectTree(deps) +} + +func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { + objTree := &objectTree{ + treeStorage: deps.treeStorage, + updateListener: deps.updateListener, + treeBuilder: deps.treeBuilder, + validator: deps.validator, + aclList: deps.aclList, + changeBuilder: deps.changeBuilder, + rawChangeLoader: deps.rawChangeLoader, + tree: nil, + keys: make(map[uint64]*symmetric.Key), + tmpChangesBuf: make([]*Change, 0, 10), + difSnapshotBuf: make([]*aclpb.RawTreeChangeWithId, 0, 10), + notSeenIdxBuf: make([]int, 0, 10), + newSnapshotsBuf: make([]*Change, 0, 10), + } + + err := objTree.rebuildFromStorage(nil) + if err != nil { + return nil, err + } + storageHeads, err := objTree.treeStorage.Heads() + if err != nil { + return nil, err + } + + // comparing rebuilt heads with heads in storage + // in theory it can happen that we didn't set heads because the process has crashed + // therefore we want to set them later + if !slice.UnsortedEquals(storageHeads, objTree.tree.Heads()) { + log.With(zap.Strings("storage", storageHeads), zap.Strings("rebuilt", objTree.tree.Heads())). + Errorf("the heads in storage and objTree are different") + err = objTree.treeStorage.SetHeads(objTree.tree.Heads()) + if err != nil { + return nil, err + } + } + + objTree.id, err = objTree.treeStorage.ID() + if err != nil { + return nil, err + } + objTree.header, err = objTree.treeStorage.Header() + if err != nil { + return nil, err + } + + return objTree, nil +} + +func createTreeHeaderAndId( + raw *aclpb.RawTreeChangeWithId, + treeType aclpb.TreeHeaderType, + aclId string, + identity []byte, + headerData []byte) (header *aclpb.TreeHeader, treeId string, err error) { + header = &aclpb.TreeHeader{ + FirstId: raw.Id, + TreeHeaderType: treeType, + AclId: aclId, + Identity: identity, + Data: headerData, + } + marshalledHeader, err := proto.Marshal(header) + if err != nil { + return + } + + treeId, err = cid.NewCIDFromBytes(marshalledHeader) + return +} diff --git a/pkg/acl/tree/rawloader.go b/pkg/acl/tree/rawloader.go index 424fa2c2..c068cdba 100644 --- a/pkg/acl/tree/rawloader.go +++ b/pkg/acl/tree/rawloader.go @@ -18,7 +18,7 @@ type rawChangeLoader struct { type rawCacheEntry struct { change *Change - rawChange *aclpb.RawChange + rawChange *aclpb.RawTreeChangeWithId position int } @@ -29,15 +29,15 @@ func newRawChangeLoader(treeStorage storage.TreeStorage, changeBuilder ChangeBui } } -func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb.RawChange, error) { +func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb.RawTreeChangeWithId, error) { var stack []*Change for _, h := range t.headIds { stack = append(stack, t.attached[h]) } - convert := func(chs []*Change) (rawChanges []*aclpb.RawChange, err error) { + convert := func(chs []*Change) (rawChanges []*aclpb.RawTreeChangeWithId, err error) { for _, ch := range chs { - var raw *aclpb.RawChange + var raw *aclpb.RawTreeChangeWithId raw, err = r.changeBuilder.BuildRaw(ch) if err != nil { return @@ -95,7 +95,7 @@ func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb. return convert(results) } -func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoints []string) ([]*aclpb.RawChange, error) { +func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoints []string) ([]*aclpb.RawTreeChangeWithId, error) { // resetting cache r.cache = make(map[string]rawCacheEntry) defer func() { @@ -162,7 +162,7 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi // preparing first pass r.idStack = append(r.idStack, heads...) - var buffer []*aclpb.RawChange + var buffer []*aclpb.RawTreeChangeWithId rootVisited := dfs(commonSnapshot, heads, 0, func(counter int, mapExists bool) bool { @@ -203,7 +203,7 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi }) // discarding visited - buffer = discardFromSlice(buffer, func(change *aclpb.RawChange) bool { + buffer = discardFromSlice(buffer, func(change *aclpb.RawTreeChangeWithId) bool { return change == nil }) @@ -219,7 +219,7 @@ func (r *rawChangeLoader) loadEntry(id string) (entry rawCacheEntry, err error) return } - change, err := r.changeBuilder.ConvertFromRaw(rawChange) + change, err := r.changeBuilder.ConvertFromRaw(rawChange, false) if err != nil { return } diff --git a/pkg/acl/tree/signablecontent.go b/pkg/acl/tree/signablecontent.go index f97ed44a..4774c2fb 100644 --- a/pkg/acl/tree/signablecontent.go +++ b/pkg/acl/tree/signablecontent.go @@ -2,12 +2,11 @@ package tree import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/gogo/protobuf/proto" ) type SignableChangeContent struct { - Proto proto.Marshaler + Data []byte Key signingkey.PrivKey - Identity string + Identity []byte IsSnapshot bool } diff --git a/pkg/acl/tree/tests/benches_test.go b/pkg/acl/tree/tests/benches_test.go new file mode 100644 index 00000000..703cb7a0 --- /dev/null +++ b/pkg/acl/tree/tests/benches_test.go @@ -0,0 +1,91 @@ +package tests + +import ( + "bytes" + "math/rand" + "testing" + "time" +) + +func BenchmarkHashes(b *testing.B) { + genRandomBytes := func() [][]byte { + var res [][]byte + s := rand.NewSource(time.Now().Unix()) + r := rand.New(s) + for i := 0; i < 10000; i++ { + var newBytes []byte + for j := 0; j < 64; j++ { + newBytes = append(newBytes, byte(r.Intn(256))) + } + res = append(res, newBytes) + } + return res + } + makeStrings := func(input [][]byte) []string { + var res []string + for _, bytes := range input { + res = append(res, string(bytes)) + } + return res + } + res := genRandomBytes() + stringRes := makeStrings(res) + stringMap := map[string]struct{}{} + b.Run("string bytes hash map write", func(b *testing.B) { + stringMap = map[string]struct{}{} + for i := 0; i < b.N; i++ { + for _, bytes := range res { + stringMap[string(bytes)] = struct{}{} + } + } + b.Run("hash map read", func(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, bytes := range res { + _, _ = stringMap[string(bytes)] + } + } + }) + }) + b.Run("compare byte slices as strings", func(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, bytes := range res { + if string(bytes) == string(bytes) { + + } + } + } + }) + b.Run("compare byte slices", func(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, bt := range res { + if bytes.Compare(bt, bt) == 0 { + + } + } + } + }) + b.Run("compare strings", func(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, st := range stringRes { + if st == st { + + } + } + } + }) + b.Run("string hash map write", func(b *testing.B) { + stringMap = map[string]struct{}{} + for i := 0; i < b.N; i++ { + for _, str := range stringRes { + stringMap[str] = struct{}{} + } + } + b.Run("hash map read", func(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, str := range stringRes { + _, _ = stringMap[str] + } + } + }) + }) +} diff --git a/pkg/acl/tree/treebuilder.go b/pkg/acl/tree/treebuilder.go index fdf69873..d7249d28 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/pkg/acl/tree/treebuilder.go @@ -129,7 +129,7 @@ func (tb *treeBuilder) loadChange(id string) (ch *Change, err error) { return nil, err } - ch, err = tb.builder.ConvertFromRawAndVerify(change) + ch, err = tb.builder.ConvertFromRaw(change, true) if err != nil { return nil, err } diff --git a/pkg/acl/tree/treestorage.go b/pkg/acl/tree/treestorage.go deleted file mode 100644 index 27fce1d5..00000000 --- a/pkg/acl/tree/treestorage.go +++ /dev/null @@ -1,91 +0,0 @@ -package tree - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" - "github.com/gogo/protobuf/proto" - "time" -) - -func CreateNewTreeStorage( - acc *account.AccountData, - aclList list.ACLList, - content proto.Marshaler, - create storage.TreeStorageCreatorFunc) (thr storage.TreeStorage, err error) { - - state := aclList.ACLState() - change := &aclpb.Change{ - AclHeadId: aclList.Head().Id, - CurrentReadKeyHash: state.CurrentReadKeyHash(), - Timestamp: int64(time.Now().Nanosecond()), - Identity: acc.Identity, - IsSnapshot: true, - } - - marshalledData, err := content.Marshal() - if err != nil { - return - } - - readKey, err := state.CurrentReadKey() - if err != nil { - return - } - - encrypted, err := readKey.Encrypt(marshalledData) - if err != nil { - return - } - - change.ChangesData = encrypted - - fullMarshalledChange, err := proto.Marshal(change) - if err != nil { - return - } - - signature, err := acc.SignKey.Sign(fullMarshalledChange) - if err != nil { - return - } - - changeId, err := cid.NewCIDFromBytes(fullMarshalledChange) - if err != nil { - return - } - - rawChange := &aclpb.RawChange{ - Payload: fullMarshalledChange, - Signature: signature, - Id: changeId, - } - header, treeId, err := createTreeHeaderAndId(rawChange, aclpb.Header_DocTree, aclList.ID()) - if err != nil { - return - } - - return create(storage.TreeStorageCreatePayload{ - TreeId: treeId, - Header: header, - Changes: []*aclpb.RawChange{rawChange}, - Heads: []string{rawChange.Id}, - }) -} - -func createTreeHeaderAndId(change *aclpb.RawChange, treeType aclpb.HeaderDocType, aclListId string) (header *aclpb.Header, treeId string, err error) { - header = &aclpb.Header{ - FirstId: change.Id, - DocType: treeType, - AclListId: aclListId, - } - marshalledHeader, err := proto.Marshal(header) - if err != nil { - return - } - - treeId, err = cid.NewCIDFromBytes(marshalledHeader) - return -} diff --git a/service/storage/service.go b/service/storage/service.go index e1a6ae6d..43fb44d5 100644 --- a/service/storage/service.go +++ b/service/storage/service.go @@ -15,7 +15,7 @@ var log = logger.NewNamed("storage").Sugar() type ImportedACLSyncData struct { Id string Header *aclpb.Header - Records []*aclpb.RawRecord + Records []*aclpb.RawACLRecord } type Service interface { diff --git a/syncproto/proto/sync.proto b/syncproto/proto/sync.proto index d6cc1ddd..80548336 100644 --- a/syncproto/proto/sync.proto +++ b/syncproto/proto/sync.proto @@ -47,44 +47,3 @@ message System { } } } - -message Sync { - string spaceId = 1; - ContentValue message = 2; - acl.Header treeHeader = 3; - string treeId = 4; - - message ContentValue { - oneof value { - HeadUpdate headUpdate = 1; - Full.Request fullSyncRequest = 2; - Full.Response fullSyncResponse = 3; - ACLList aclList = 4; - } - } - - message ACLList { - repeated acl.RawRecord records = 1; - } - - message HeadUpdate { - repeated string heads = 1; - repeated acl.RawChange changes = 2; - repeated string snapshotPath = 3; - } - - message Full { - // here with send the request with all changes we have (we already know sender's snapshot path) - message Request { - repeated string heads = 1; - repeated acl.RawChange changes = 2; - repeated string snapshotPath = 3; - } - - message Response { - repeated string heads = 1; - repeated acl.RawChange changes = 2; - repeated string snapshotPath = 3; - } - } -} diff --git a/syncproto/sync.pb.go b/syncproto/sync.pb.go index 0f8d273b..20a189a1 100644 --- a/syncproto/sync.pb.go +++ b/syncproto/sync.pb.go @@ -5,7 +5,7 @@ package syncproto import ( fmt "fmt" - aclpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + _ "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -51,28 +51,28 @@ func (MessageType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{0} } -type SystemErrorCode int32 +type System_Error_Code int32 const ( - SystemError_UNKNOWN SystemErrorCode = 0 - SystemError_UNSUPPORTED_PROTOCOL_VERSION SystemErrorCode = 10 + System_Error_UNKNOWN System_Error_Code = 0 + System_Error_UNSUPPORTED_PROTOCOL_VERSION System_Error_Code = 10 ) -var SystemErrorCode_name = map[int32]string{ +var System_Error_Code_name = map[int32]string{ 0: "UNKNOWN", 10: "UNSUPPORTED_PROTOCOL_VERSION", } -var SystemErrorCode_value = map[string]int32{ +var System_Error_Code_value = map[string]int32{ "UNKNOWN": 0, "UNSUPPORTED_PROTOCOL_VERSION": 10, } -func (x SystemErrorCode) String() string { - return proto.EnumName(SystemErrorCode_name, int32(x)) +func (x System_Error_Code) String() string { + return proto.EnumName(System_Error_Code_name, int32(x)) } -func (SystemErrorCode) EnumDescriptor() ([]byte, []int) { +func (System_Error_Code) EnumDescriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{2, 3, 0} } @@ -205,9 +205,9 @@ func (m *Header) GetDebugInfo() string { } type System struct { - Handshake *SystemHandshake `protobuf:"bytes,1,opt,name=handshake,proto3" json:"handshake,omitempty"` - Ping *SystemPing `protobuf:"bytes,2,opt,name=ping,proto3" json:"ping,omitempty"` - Ack *SystemAck `protobuf:"bytes,3,opt,name=ack,proto3" json:"ack,omitempty"` + Handshake *System_Handshake `protobuf:"bytes,1,opt,name=handshake,proto3" json:"handshake,omitempty"` + Ping *System_Ping `protobuf:"bytes,2,opt,name=ping,proto3" json:"ping,omitempty"` + Ack *System_Ack `protobuf:"bytes,3,opt,name=ack,proto3" json:"ack,omitempty"` } func (m *System) Reset() { *m = System{} } @@ -243,43 +243,43 @@ func (m *System) XXX_DiscardUnknown() { var xxx_messageInfo_System proto.InternalMessageInfo -func (m *System) GetHandshake() *SystemHandshake { +func (m *System) GetHandshake() *System_Handshake { if m != nil { return m.Handshake } return nil } -func (m *System) GetPing() *SystemPing { +func (m *System) GetPing() *System_Ping { if m != nil { return m.Ping } return nil } -func (m *System) GetAck() *SystemAck { +func (m *System) GetAck() *System_Ack { if m != nil { return m.Ack } return nil } -type SystemHandshake struct { +type System_Handshake struct { ProtocolVersion string `protobuf:"bytes,1,opt,name=protocolVersion,proto3" json:"protocolVersion,omitempty"` } -func (m *SystemHandshake) Reset() { *m = SystemHandshake{} } -func (m *SystemHandshake) String() string { return proto.CompactTextString(m) } -func (*SystemHandshake) ProtoMessage() {} -func (*SystemHandshake) Descriptor() ([]byte, []int) { +func (m *System_Handshake) Reset() { *m = System_Handshake{} } +func (m *System_Handshake) String() string { return proto.CompactTextString(m) } +func (*System_Handshake) ProtoMessage() {} +func (*System_Handshake) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{2, 0} } -func (m *SystemHandshake) XXX_Unmarshal(b []byte) error { +func (m *System_Handshake) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SystemHandshake) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *System_Handshake) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SystemHandshake.Marshal(b, m, deterministic) + return xxx_messageInfo_System_Handshake.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -289,41 +289,41 @@ func (m *SystemHandshake) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *SystemHandshake) XXX_Merge(src proto.Message) { - xxx_messageInfo_SystemHandshake.Merge(m, src) +func (m *System_Handshake) XXX_Merge(src proto.Message) { + xxx_messageInfo_System_Handshake.Merge(m, src) } -func (m *SystemHandshake) XXX_Size() int { +func (m *System_Handshake) XXX_Size() int { return m.Size() } -func (m *SystemHandshake) XXX_DiscardUnknown() { - xxx_messageInfo_SystemHandshake.DiscardUnknown(m) +func (m *System_Handshake) XXX_DiscardUnknown() { + xxx_messageInfo_System_Handshake.DiscardUnknown(m) } -var xxx_messageInfo_SystemHandshake proto.InternalMessageInfo +var xxx_messageInfo_System_Handshake proto.InternalMessageInfo -func (m *SystemHandshake) GetProtocolVersion() string { +func (m *System_Handshake) GetProtocolVersion() string { if m != nil { return m.ProtocolVersion } return "" } -type SystemPing struct { +type System_Ping struct { UnixTime uint64 `protobuf:"varint,1,opt,name=unixTime,proto3" json:"unixTime,omitempty"` } -func (m *SystemPing) Reset() { *m = SystemPing{} } -func (m *SystemPing) String() string { return proto.CompactTextString(m) } -func (*SystemPing) ProtoMessage() {} -func (*SystemPing) Descriptor() ([]byte, []int) { +func (m *System_Ping) Reset() { *m = System_Ping{} } +func (m *System_Ping) String() string { return proto.CompactTextString(m) } +func (*System_Ping) ProtoMessage() {} +func (*System_Ping) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{2, 1} } -func (m *SystemPing) XXX_Unmarshal(b []byte) error { +func (m *System_Ping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SystemPing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *System_Ping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SystemPing.Marshal(b, m, deterministic) + return xxx_messageInfo_System_Ping.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -333,41 +333,41 @@ func (m *SystemPing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *SystemPing) XXX_Merge(src proto.Message) { - xxx_messageInfo_SystemPing.Merge(m, src) +func (m *System_Ping) XXX_Merge(src proto.Message) { + xxx_messageInfo_System_Ping.Merge(m, src) } -func (m *SystemPing) XXX_Size() int { +func (m *System_Ping) XXX_Size() int { return m.Size() } -func (m *SystemPing) XXX_DiscardUnknown() { - xxx_messageInfo_SystemPing.DiscardUnknown(m) +func (m *System_Ping) XXX_DiscardUnknown() { + xxx_messageInfo_System_Ping.DiscardUnknown(m) } -var xxx_messageInfo_SystemPing proto.InternalMessageInfo +var xxx_messageInfo_System_Ping proto.InternalMessageInfo -func (m *SystemPing) GetUnixTime() uint64 { +func (m *System_Ping) GetUnixTime() uint64 { if m != nil { return m.UnixTime } return 0 } -type SystemAck struct { - Error *SystemError `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +type System_Ack struct { + Error *System_Error `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` } -func (m *SystemAck) Reset() { *m = SystemAck{} } -func (m *SystemAck) String() string { return proto.CompactTextString(m) } -func (*SystemAck) ProtoMessage() {} -func (*SystemAck) Descriptor() ([]byte, []int) { +func (m *System_Ack) Reset() { *m = System_Ack{} } +func (m *System_Ack) String() string { return proto.CompactTextString(m) } +func (*System_Ack) ProtoMessage() {} +func (*System_Ack) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{2, 2} } -func (m *SystemAck) XXX_Unmarshal(b []byte) error { +func (m *System_Ack) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SystemAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *System_Ack) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SystemAck.Marshal(b, m, deterministic) + return xxx_messageInfo_System_Ack.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -377,42 +377,42 @@ func (m *SystemAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *SystemAck) XXX_Merge(src proto.Message) { - xxx_messageInfo_SystemAck.Merge(m, src) +func (m *System_Ack) XXX_Merge(src proto.Message) { + xxx_messageInfo_System_Ack.Merge(m, src) } -func (m *SystemAck) XXX_Size() int { +func (m *System_Ack) XXX_Size() int { return m.Size() } -func (m *SystemAck) XXX_DiscardUnknown() { - xxx_messageInfo_SystemAck.DiscardUnknown(m) +func (m *System_Ack) XXX_DiscardUnknown() { + xxx_messageInfo_System_Ack.DiscardUnknown(m) } -var xxx_messageInfo_SystemAck proto.InternalMessageInfo +var xxx_messageInfo_System_Ack proto.InternalMessageInfo -func (m *SystemAck) GetError() *SystemError { +func (m *System_Ack) GetError() *System_Error { if m != nil { return m.Error } return nil } -type SystemError struct { - Code SystemErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.SystemErrorCode" json:"code,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +type System_Error struct { + Code System_Error_Code `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.System_Error_Code" json:"code,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` } -func (m *SystemError) Reset() { *m = SystemError{} } -func (m *SystemError) String() string { return proto.CompactTextString(m) } -func (*SystemError) ProtoMessage() {} -func (*SystemError) Descriptor() ([]byte, []int) { +func (m *System_Error) Reset() { *m = System_Error{} } +func (m *System_Error) String() string { return proto.CompactTextString(m) } +func (*System_Error) ProtoMessage() {} +func (*System_Error) Descriptor() ([]byte, []int) { return fileDescriptor_4b28dfdd48a89166, []int{2, 3} } -func (m *SystemError) XXX_Unmarshal(b []byte) error { +func (m *System_Error) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SystemError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *System_Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SystemError.Marshal(b, m, deterministic) + return xxx_messageInfo_System_Error.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -422,546 +422,82 @@ func (m *SystemError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *SystemError) XXX_Merge(src proto.Message) { - xxx_messageInfo_SystemError.Merge(m, src) +func (m *System_Error) XXX_Merge(src proto.Message) { + xxx_messageInfo_System_Error.Merge(m, src) } -func (m *SystemError) XXX_Size() int { +func (m *System_Error) XXX_Size() int { return m.Size() } -func (m *SystemError) XXX_DiscardUnknown() { - xxx_messageInfo_SystemError.DiscardUnknown(m) +func (m *System_Error) XXX_DiscardUnknown() { + xxx_messageInfo_System_Error.DiscardUnknown(m) } -var xxx_messageInfo_SystemError proto.InternalMessageInfo +var xxx_messageInfo_System_Error proto.InternalMessageInfo -func (m *SystemError) GetCode() SystemErrorCode { +func (m *System_Error) GetCode() System_Error_Code { if m != nil { return m.Code } - return SystemError_UNKNOWN + return System_Error_UNKNOWN } -func (m *SystemError) GetDescription() string { +func (m *System_Error) GetDescription() string { if m != nil { return m.Description } return "" } -type Sync struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - Message *SyncContentValue `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` - TreeHeader *aclpb.Header `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` - TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` -} - -func (m *Sync) Reset() { *m = Sync{} } -func (m *Sync) String() string { return proto.CompactTextString(m) } -func (*Sync) ProtoMessage() {} -func (*Sync) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{3} -} -func (m *Sync) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Sync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Sync.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 *Sync) XXX_Merge(src proto.Message) { - xxx_messageInfo_Sync.Merge(m, src) -} -func (m *Sync) XXX_Size() int { - return m.Size() -} -func (m *Sync) XXX_DiscardUnknown() { - xxx_messageInfo_Sync.DiscardUnknown(m) -} - -var xxx_messageInfo_Sync proto.InternalMessageInfo - -func (m *Sync) GetSpaceId() string { - if m != nil { - return m.SpaceId - } - return "" -} - -func (m *Sync) GetMessage() *SyncContentValue { - if m != nil { - return m.Message - } - return nil -} - -func (m *Sync) GetTreeHeader() *aclpb.Header { - if m != nil { - return m.TreeHeader - } - return nil -} - -func (m *Sync) GetTreeId() string { - if m != nil { - return m.TreeId - } - return "" -} - -type SyncContentValue struct { - // Types that are valid to be assigned to Value: - // *SyncContentValueValueOfHeadUpdate - // *SyncContentValueValueOfFullSyncRequest - // *SyncContentValueValueOfFullSyncResponse - // *SyncContentValueValueOfAclList - Value IsSyncContentValueValue `protobuf_oneof:"value"` -} - -func (m *SyncContentValue) Reset() { *m = SyncContentValue{} } -func (m *SyncContentValue) String() string { return proto.CompactTextString(m) } -func (*SyncContentValue) ProtoMessage() {} -func (*SyncContentValue) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{3, 0} -} -func (m *SyncContentValue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncContentValue.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 *SyncContentValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncContentValue.Merge(m, src) -} -func (m *SyncContentValue) XXX_Size() int { - return m.Size() -} -func (m *SyncContentValue) XXX_DiscardUnknown() { - xxx_messageInfo_SyncContentValue.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncContentValue proto.InternalMessageInfo - -type IsSyncContentValueValue interface { - IsSyncContentValueValue() - MarshalTo([]byte) (int, error) - Size() int -} - -type SyncContentValueValueOfHeadUpdate struct { - HeadUpdate *SyncHeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` -} -type SyncContentValueValueOfFullSyncRequest struct { - FullSyncRequest *SyncFullRequest `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` -} -type SyncContentValueValueOfFullSyncResponse struct { - FullSyncResponse *SyncFullResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` -} -type SyncContentValueValueOfAclList struct { - AclList *SyncACLList `protobuf:"bytes,4,opt,name=aclList,proto3,oneof" json:"aclList,omitempty"` -} - -func (*SyncContentValueValueOfHeadUpdate) IsSyncContentValueValue() {} -func (*SyncContentValueValueOfFullSyncRequest) IsSyncContentValueValue() {} -func (*SyncContentValueValueOfFullSyncResponse) IsSyncContentValueValue() {} -func (*SyncContentValueValueOfAclList) IsSyncContentValueValue() {} - -func (m *SyncContentValue) GetValue() IsSyncContentValueValue { - if m != nil { - return m.Value - } - return nil -} - -func (m *SyncContentValue) GetHeadUpdate() *SyncHeadUpdate { - if x, ok := m.GetValue().(*SyncContentValueValueOfHeadUpdate); ok { - return x.HeadUpdate - } - return nil -} - -func (m *SyncContentValue) GetFullSyncRequest() *SyncFullRequest { - if x, ok := m.GetValue().(*SyncContentValueValueOfFullSyncRequest); ok { - return x.FullSyncRequest - } - return nil -} - -func (m *SyncContentValue) GetFullSyncResponse() *SyncFullResponse { - if x, ok := m.GetValue().(*SyncContentValueValueOfFullSyncResponse); ok { - return x.FullSyncResponse - } - return nil -} - -func (m *SyncContentValue) GetAclList() *SyncACLList { - if x, ok := m.GetValue().(*SyncContentValueValueOfAclList); ok { - return x.AclList - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*SyncContentValue) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*SyncContentValueValueOfHeadUpdate)(nil), - (*SyncContentValueValueOfFullSyncRequest)(nil), - (*SyncContentValueValueOfFullSyncResponse)(nil), - (*SyncContentValueValueOfAclList)(nil), - } -} - -type SyncACLList struct { - Records []*aclpb.RawRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"` -} - -func (m *SyncACLList) Reset() { *m = SyncACLList{} } -func (m *SyncACLList) String() string { return proto.CompactTextString(m) } -func (*SyncACLList) ProtoMessage() {} -func (*SyncACLList) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{3, 1} -} -func (m *SyncACLList) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncACLList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncACLList.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 *SyncACLList) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncACLList.Merge(m, src) -} -func (m *SyncACLList) XXX_Size() int { - return m.Size() -} -func (m *SyncACLList) XXX_DiscardUnknown() { - xxx_messageInfo_SyncACLList.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncACLList proto.InternalMessageInfo - -func (m *SyncACLList) GetRecords() []*aclpb.RawRecord { - if m != nil { - return m.Records - } - return nil -} - -type SyncHeadUpdate struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` -} - -func (m *SyncHeadUpdate) Reset() { *m = SyncHeadUpdate{} } -func (m *SyncHeadUpdate) String() string { return proto.CompactTextString(m) } -func (*SyncHeadUpdate) ProtoMessage() {} -func (*SyncHeadUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{3, 2} -} -func (m *SyncHeadUpdate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncHeadUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncHeadUpdate.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 *SyncHeadUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncHeadUpdate.Merge(m, src) -} -func (m *SyncHeadUpdate) XXX_Size() int { - return m.Size() -} -func (m *SyncHeadUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_SyncHeadUpdate.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncHeadUpdate proto.InternalMessageInfo - -func (m *SyncHeadUpdate) GetHeads() []string { - if m != nil { - return m.Heads - } - return nil -} - -func (m *SyncHeadUpdate) GetChanges() []*aclpb.RawChange { - if m != nil { - return m.Changes - } - return nil -} - -func (m *SyncHeadUpdate) GetSnapshotPath() []string { - if m != nil { - return m.SnapshotPath - } - return nil -} - -type SyncFull struct { -} - -func (m *SyncFull) Reset() { *m = SyncFull{} } -func (m *SyncFull) String() string { return proto.CompactTextString(m) } -func (*SyncFull) ProtoMessage() {} -func (*SyncFull) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{3, 3} -} -func (m *SyncFull) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncFull) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncFull.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 *SyncFull) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncFull.Merge(m, src) -} -func (m *SyncFull) XXX_Size() int { - return m.Size() -} -func (m *SyncFull) XXX_DiscardUnknown() { - xxx_messageInfo_SyncFull.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncFull proto.InternalMessageInfo - -// here with send the request with all changes we have (we already know sender's snapshot path) -type SyncFullRequest struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` -} - -func (m *SyncFullRequest) Reset() { *m = SyncFullRequest{} } -func (m *SyncFullRequest) String() string { return proto.CompactTextString(m) } -func (*SyncFullRequest) ProtoMessage() {} -func (*SyncFullRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{3, 3, 0} -} -func (m *SyncFullRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncFullRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncFullRequest.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 *SyncFullRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncFullRequest.Merge(m, src) -} -func (m *SyncFullRequest) XXX_Size() int { - return m.Size() -} -func (m *SyncFullRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SyncFullRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncFullRequest proto.InternalMessageInfo - -func (m *SyncFullRequest) GetHeads() []string { - if m != nil { - return m.Heads - } - return nil -} - -func (m *SyncFullRequest) GetChanges() []*aclpb.RawChange { - if m != nil { - return m.Changes - } - return nil -} - -func (m *SyncFullRequest) GetSnapshotPath() []string { - if m != nil { - return m.SnapshotPath - } - return nil -} - -type SyncFullResponse struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawChange `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` -} - -func (m *SyncFullResponse) Reset() { *m = SyncFullResponse{} } -func (m *SyncFullResponse) String() string { return proto.CompactTextString(m) } -func (*SyncFullResponse) ProtoMessage() {} -func (*SyncFullResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{3, 3, 1} -} -func (m *SyncFullResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SyncFullResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SyncFullResponse.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 *SyncFullResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncFullResponse.Merge(m, src) -} -func (m *SyncFullResponse) XXX_Size() int { - return m.Size() -} -func (m *SyncFullResponse) XXX_DiscardUnknown() { - xxx_messageInfo_SyncFullResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_SyncFullResponse proto.InternalMessageInfo - -func (m *SyncFullResponse) GetHeads() []string { - if m != nil { - return m.Heads - } - return nil -} - -func (m *SyncFullResponse) GetChanges() []*aclpb.RawChange { - if m != nil { - return m.Changes - } - return nil -} - -func (m *SyncFullResponse) GetSnapshotPath() []string { - if m != nil { - return m.SnapshotPath - } - return nil -} - func init() { proto.RegisterEnum("anytype.MessageType", MessageType_name, MessageType_value) - proto.RegisterEnum("anytype.SystemErrorCode", SystemErrorCode_name, SystemErrorCode_value) + proto.RegisterEnum("anytype.System_Error_Code", System_Error_Code_name, System_Error_Code_value) proto.RegisterType((*Message)(nil), "anytype.Message") proto.RegisterType((*Header)(nil), "anytype.Header") proto.RegisterType((*System)(nil), "anytype.System") - proto.RegisterType((*SystemHandshake)(nil), "anytype.System.Handshake") - proto.RegisterType((*SystemPing)(nil), "anytype.System.Ping") - proto.RegisterType((*SystemAck)(nil), "anytype.System.Ack") - proto.RegisterType((*SystemError)(nil), "anytype.System.Error") - proto.RegisterType((*Sync)(nil), "anytype.Sync") - proto.RegisterType((*SyncContentValue)(nil), "anytype.Sync.ContentValue") - proto.RegisterType((*SyncACLList)(nil), "anytype.Sync.ACLList") - proto.RegisterType((*SyncHeadUpdate)(nil), "anytype.Sync.HeadUpdate") - proto.RegisterType((*SyncFull)(nil), "anytype.Sync.Full") - proto.RegisterType((*SyncFullRequest)(nil), "anytype.Sync.Full.Request") - proto.RegisterType((*SyncFullResponse)(nil), "anytype.Sync.Full.Response") + proto.RegisterType((*System_Handshake)(nil), "anytype.System.Handshake") + proto.RegisterType((*System_Ping)(nil), "anytype.System.Ping") + proto.RegisterType((*System_Ack)(nil), "anytype.System.Ack") + proto.RegisterType((*System_Error)(nil), "anytype.System.Error") } func init() { proto.RegisterFile("syncproto/proto/sync.proto", fileDescriptor_4b28dfdd48a89166) } var fileDescriptor_4b28dfdd48a89166 = []byte{ - // 812 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xc1, 0x8e, 0xe2, 0x46, - 0x10, 0xb5, 0xc1, 0xe0, 0x75, 0x79, 0x34, 0x90, 0xde, 0xd9, 0xc8, 0x71, 0x56, 0x08, 0xa1, 0x44, - 0x41, 0x59, 0xc9, 0x93, 0xb0, 0x59, 0x45, 0xca, 0x6d, 0x96, 0xcc, 0xc8, 0x28, 0x13, 0x40, 0x0d, - 0x4c, 0xa4, 0x5c, 0x56, 0x3d, 0xed, 0x5e, 0x40, 0x98, 0xb6, 0xe3, 0x36, 0x49, 0xf8, 0x8b, 0xbd, - 0xe6, 0x9a, 0x6f, 0xc8, 0x37, 0x44, 0x39, 0xee, 0x31, 0xc7, 0x68, 0x46, 0xf9, 0x8f, 0xa8, 0xdb, - 0x36, 0x18, 0x32, 0xe7, 0x39, 0x00, 0x5d, 0xaf, 0x5e, 0x55, 0xbf, 0x2a, 0x57, 0x19, 0x70, 0xc5, - 0x96, 0xd3, 0x38, 0x89, 0xd2, 0xe8, 0x3c, 0xfb, 0x96, 0xb6, 0xa7, 0x8e, 0xc8, 0x24, 0x7c, 0x9b, - 0x6e, 0x63, 0xe6, 0x7e, 0x11, 0xaf, 0xe6, 0xe7, 0x84, 0x86, 0xf2, 0x43, 0x17, 0x84, 0xcf, 0x99, - 0x90, 0xc7, 0xf8, 0x36, 0x8b, 0x11, 0x25, 0x3c, 0x0b, 0xed, 0x5c, 0x81, 0xf9, 0x3d, 0x13, 0x82, - 0xcc, 0x19, 0xfa, 0x0c, 0xea, 0x0b, 0x46, 0x02, 0x96, 0x38, 0x7a, 0x5b, 0xef, 0xda, 0xbd, 0x86, - 0x97, 0xa7, 0xf5, 0x7c, 0x05, 0xe3, 0xdc, 0x8d, 0x10, 0x18, 0x01, 0x49, 0x89, 0x53, 0x69, 0xeb, - 0xdd, 0x13, 0xac, 0xce, 0x9d, 0xdf, 0x75, 0xa8, 0x67, 0x34, 0xe4, 0x80, 0x99, 0x26, 0x84, 0xb2, - 0x41, 0xa0, 0x12, 0x9d, 0xe0, 0xc2, 0x44, 0xcf, 0xc1, 0x4a, 0xd8, 0x4f, 0x1b, 0x26, 0xd2, 0x41, - 0xa0, 0xa2, 0x0d, 0xbc, 0x07, 0x64, 0x5c, 0xc2, 0xe2, 0x70, 0x3b, 0x08, 0x9c, 0xaa, 0xf2, 0x15, - 0x26, 0xea, 0x82, 0x21, 0x75, 0x38, 0x46, 0x5b, 0xef, 0x9e, 0xf6, 0xce, 0x76, 0xba, 0x72, 0xe5, - 0xd3, 0x6d, 0xcc, 0xb0, 0x62, 0xc8, 0x1b, 0x02, 0x76, 0xbb, 0x99, 0x0f, 0xf8, 0xdb, 0xc8, 0xa9, - 0xb5, 0xf5, 0xae, 0x85, 0xf7, 0x40, 0xe7, 0x8f, 0x2a, 0xd4, 0x27, 0x5b, 0x91, 0xb2, 0x35, 0xfa, - 0x1a, 0xac, 0x05, 0xe1, 0x81, 0x58, 0x90, 0x15, 0xcb, 0xeb, 0xfd, 0x68, 0x97, 0x37, 0xe3, 0x78, - 0x7e, 0x41, 0xc0, 0x7b, 0xae, 0xd4, 0x12, 0x2f, 0xf9, 0x5c, 0xc9, 0xb7, 0x4b, 0x5a, 0xf2, 0x98, - 0xf1, 0x92, 0xcf, 0xb1, 0x62, 0xa0, 0x4f, 0xa1, 0x4a, 0xe8, 0x4a, 0xd5, 0x62, 0xf7, 0x9e, 0x1e, - 0x13, 0x2f, 0xe8, 0x0a, 0x4b, 0xbf, 0xfb, 0x0a, 0x2c, 0xbf, 0x94, 0xbd, 0xa1, 0x9e, 0x0b, 0x8d, - 0xc2, 0x1b, 0x96, 0x88, 0x65, 0xc4, 0x95, 0x38, 0x0b, 0x1f, 0xc3, 0x6e, 0x07, 0x0c, 0x79, 0x17, - 0x72, 0xe1, 0xc9, 0x86, 0x2f, 0x7f, 0x9d, 0x2e, 0xd7, 0x59, 0x1d, 0x06, 0xde, 0xd9, 0x6e, 0x0f, - 0xaa, 0x17, 0x74, 0x85, 0x5e, 0x40, 0x8d, 0x25, 0x49, 0x94, 0xe4, 0x9a, 0x9f, 0x1d, 0x4b, 0xb9, - 0x94, 0x4e, 0x9c, 0x71, 0xdc, 0x77, 0x3a, 0xd4, 0x14, 0x80, 0x3c, 0x30, 0x68, 0x14, 0x64, 0x59, - 0x4f, 0x7b, 0xee, 0x83, 0x51, 0x5e, 0x3f, 0x0a, 0x18, 0x56, 0x3c, 0xd4, 0x06, 0x3b, 0x60, 0x82, - 0x26, 0xcb, 0x38, 0x95, 0xba, 0x2b, 0x4a, 0x77, 0x19, 0xea, 0xbc, 0x02, 0x43, 0xf2, 0x91, 0x0d, - 0xe6, 0x6c, 0xf8, 0xdd, 0x70, 0xf4, 0xc3, 0xb0, 0xa9, 0xa1, 0x36, 0x3c, 0x9f, 0x0d, 0x27, 0xb3, - 0xf1, 0x78, 0x84, 0xa7, 0x97, 0xdf, 0xbe, 0x19, 0xe3, 0xd1, 0x74, 0xd4, 0x1f, 0x5d, 0xbf, 0xb9, - 0xb9, 0xc4, 0x93, 0xc1, 0x68, 0xd8, 0x84, 0xce, 0x9f, 0x75, 0x30, 0x26, 0x5b, 0x4e, 0xe5, 0x84, - 0x88, 0x78, 0x3f, 0x59, 0x16, 0x2e, 0x4c, 0xf4, 0x15, 0x98, 0xeb, 0x6c, 0x18, 0xf2, 0x22, 0xcb, - 0x72, 0x39, 0xf5, 0xfa, 0x11, 0x4f, 0x19, 0x4f, 0x6f, 0x48, 0xb8, 0x61, 0xb8, 0xa0, 0xa2, 0x17, - 0x00, 0x69, 0xc2, 0x58, 0x36, 0xb7, 0xf9, 0x83, 0xb2, 0x3d, 0x42, 0xc3, 0x62, 0xe2, 0x4b, 0x6e, - 0xf4, 0x21, 0xd4, 0xa5, 0x35, 0x08, 0xd4, 0x18, 0x5a, 0x38, 0xb7, 0xdc, 0xdf, 0x2a, 0x70, 0x52, - 0x4e, 0x8f, 0xbe, 0x01, 0x90, 0x8b, 0x32, 0x8b, 0x03, 0x92, 0x16, 0xb3, 0xe5, 0x1c, 0xca, 0xf1, - 0x77, 0x7e, 0x5f, 0xc3, 0x25, 0x36, 0xba, 0x82, 0xc6, 0xdb, 0x4d, 0x18, 0x4a, 0x12, 0xce, 0x16, - 0xe3, 0xe1, 0x7a, 0xae, 0x36, 0x61, 0xe8, 0xe5, 0x0c, 0x5f, 0xc3, 0xc7, 0x41, 0x68, 0x00, 0xcd, - 0x3d, 0x24, 0xe2, 0x88, 0x0b, 0x96, 0xd7, 0xf7, 0xf1, 0x83, 0x89, 0x32, 0x8a, 0xaf, 0xe1, 0xff, - 0x85, 0xa1, 0x2f, 0xc1, 0x24, 0x34, 0xbc, 0x5e, 0x8a, 0x54, 0x15, 0x7e, 0x38, 0x3f, 0x9c, 0x7a, - 0x17, 0xfd, 0x6b, 0xe9, 0xf4, 0x35, 0x5c, 0xf0, 0x5e, 0x9b, 0x50, 0xfb, 0x59, 0xb6, 0xc2, 0x7d, - 0x09, 0x66, 0xee, 0x46, 0x5d, 0xb9, 0xdd, 0x34, 0x4a, 0x02, 0xe1, 0xe8, 0xed, 0x6a, 0xd7, 0xee, - 0x9d, 0xaa, 0x46, 0x63, 0xf2, 0x0b, 0x56, 0x30, 0x2e, 0xdc, 0x6e, 0x0c, 0xb0, 0xef, 0x0f, 0x3a, - 0x83, 0x9a, 0xec, 0x4f, 0x16, 0x65, 0xe1, 0xcc, 0x90, 0xd9, 0xf2, 0xf7, 0x98, 0x53, 0x39, 0xcc, - 0xd6, 0x57, 0x30, 0x2e, 0xdc, 0xa8, 0x03, 0x27, 0x82, 0x93, 0x58, 0x2c, 0xa2, 0x74, 0x4c, 0xd2, - 0x85, 0x53, 0x55, 0x69, 0x0e, 0x30, 0xf7, 0x5f, 0x1d, 0x0c, 0xd9, 0x08, 0x77, 0x0d, 0x66, 0xd1, - 0xc1, 0xc7, 0xb8, 0x97, 0xc3, 0x93, 0x5d, 0x9b, 0x1f, 0xe1, 0xbe, 0xcf, 0x47, 0x60, 0x97, 0x5e, - 0x99, 0xe8, 0x19, 0x7c, 0x50, 0x32, 0xb3, 0xb5, 0x6e, 0x6a, 0xe8, 0x0c, 0x9a, 0x65, 0x58, 0x6e, - 0x58, 0x53, 0x47, 0x4f, 0xa1, 0x71, 0x40, 0xe6, 0xb4, 0x59, 0x79, 0xfd, 0xc9, 0x5f, 0x77, 0x2d, - 0xfd, 0xfd, 0x5d, 0x4b, 0xff, 0xe7, 0xae, 0xa5, 0xbf, 0xbb, 0x6f, 0x69, 0xef, 0xef, 0x5b, 0xda, - 0xdf, 0xf7, 0x2d, 0xed, 0x47, 0x38, 0xdf, 0xfd, 0x5f, 0xdd, 0xd6, 0xd5, 0xcf, 0xcb, 0xff, 0x02, - 0x00, 0x00, 0xff, 0xff, 0x6a, 0xb8, 0x16, 0xd3, 0xc3, 0x06, 0x00, 0x00, + // 536 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x93, 0xd1, 0x8a, 0xd3, 0x40, + 0x14, 0x86, 0x3b, 0xdb, 0x6c, 0x6b, 0x4f, 0x96, 0xdd, 0x38, 0xbb, 0x0b, 0x31, 0x2c, 0x21, 0x14, + 0xc5, 0xa2, 0x90, 0x4a, 0x65, 0xf1, 0x7a, 0x5d, 0x2b, 0x2d, 0x6a, 0x53, 0xa6, 0xed, 0x0a, 0xde, + 0x2c, 0xd3, 0xc9, 0x98, 0x86, 0x76, 0x93, 0x98, 0xa4, 0x60, 0xde, 0x62, 0x9f, 0xc1, 0x67, 0xf0, + 0x21, 0xbc, 0xdc, 0x4b, 0x2f, 0xa5, 0x7d, 0x11, 0x99, 0x49, 0xda, 0xc6, 0xe2, 0x45, 0x92, 0x39, + 0xff, 0xf9, 0xff, 0x33, 0xdf, 0x30, 0x04, 0x8c, 0x24, 0x0b, 0x58, 0x14, 0x87, 0x69, 0xd8, 0xce, + 0xdf, 0xa2, 0xb6, 0xe5, 0x12, 0xd7, 0x69, 0x90, 0xa5, 0x59, 0xc4, 0x8d, 0x57, 0xd1, 0xdc, 0x6b, + 0x53, 0xb6, 0x10, 0x0f, 0x9b, 0xd1, 0xc0, 0xe3, 0x89, 0x58, 0x46, 0xd3, 0x3c, 0x93, 0x94, 0xf4, + 0x3c, 0xda, 0x7c, 0x0f, 0xf5, 0x4f, 0x3c, 0x49, 0xa8, 0xc7, 0xf1, 0x73, 0xa8, 0xcd, 0x38, 0x75, + 0x79, 0xac, 0x23, 0x0b, 0xb5, 0xd4, 0xce, 0x89, 0x5d, 0x8c, 0xb5, 0x7b, 0x52, 0x26, 0x45, 0x1b, + 0x63, 0x50, 0x5c, 0x9a, 0x52, 0xfd, 0xc0, 0x42, 0xad, 0x23, 0x22, 0xd7, 0xcd, 0x1f, 0x08, 0x6a, + 0xb9, 0x0d, 0xeb, 0x50, 0x4f, 0x63, 0xca, 0x78, 0xdf, 0x95, 0x83, 0x8e, 0xc8, 0xa6, 0xc4, 0x17, + 0xd0, 0x88, 0xf9, 0xb7, 0x25, 0x4f, 0xd2, 0xbe, 0x2b, 0xd3, 0x0a, 0xd9, 0x09, 0x22, 0x17, 0xf3, + 0x68, 0x91, 0xf5, 0x5d, 0xbd, 0x2a, 0x7b, 0x9b, 0x12, 0xb7, 0x40, 0x11, 0x1c, 0xba, 0x62, 0xa1, + 0xd6, 0x71, 0xe7, 0x6c, 0xcb, 0x55, 0x90, 0x8f, 0xb3, 0x88, 0x13, 0xe9, 0x10, 0x3b, 0xb8, 0x7c, + 0xba, 0xf4, 0xfa, 0xc1, 0xd7, 0x50, 0x3f, 0xb4, 0x50, 0xab, 0x41, 0x76, 0x42, 0xf3, 0x67, 0x15, + 0x6a, 0xa3, 0x2c, 0x49, 0xf9, 0x1d, 0x7e, 0x03, 0x8d, 0x19, 0x0d, 0xdc, 0x64, 0x46, 0xe7, 0xbc, + 0x38, 0xef, 0x93, 0xed, 0xdc, 0xdc, 0x63, 0xf7, 0x36, 0x06, 0xb2, 0xf3, 0x0a, 0x96, 0xc8, 0x0f, + 0x3c, 0x89, 0xaf, 0x96, 0x58, 0x8a, 0xcc, 0xd0, 0x0f, 0x3c, 0x22, 0x1d, 0xf8, 0x19, 0x54, 0x29, + 0x9b, 0xcb, 0xb3, 0xa8, 0x9d, 0xd3, 0x7d, 0xe3, 0x15, 0x9b, 0x13, 0xd1, 0x37, 0x2e, 0xa1, 0xd1, + 0x2b, 0x4d, 0x3f, 0x91, 0xf7, 0xc2, 0xc2, 0xc5, 0x0d, 0x8f, 0x13, 0x3f, 0x0c, 0x24, 0x5c, 0x83, + 0xec, 0xcb, 0x46, 0x13, 0x14, 0xb1, 0x17, 0x36, 0xe0, 0xd1, 0x32, 0xf0, 0xbf, 0x8f, 0xfd, 0xbb, + 0xfc, 0x1c, 0x0a, 0xd9, 0xd6, 0x46, 0x07, 0xaa, 0x57, 0x6c, 0x8e, 0x5f, 0xc2, 0x21, 0x8f, 0xe3, + 0x30, 0x2e, 0x98, 0xcf, 0xf7, 0x51, 0xba, 0xa2, 0x49, 0x72, 0x8f, 0x71, 0x8f, 0xe0, 0x50, 0x0a, + 0xd8, 0x06, 0x85, 0x85, 0x6e, 0x3e, 0xf5, 0xb8, 0x63, 0xfc, 0x37, 0x65, 0x5f, 0x87, 0x2e, 0x27, + 0xd2, 0x87, 0x2d, 0x50, 0x5d, 0x9e, 0xb0, 0xd8, 0x8f, 0x52, 0xc1, 0x7d, 0x20, 0xb9, 0xcb, 0x52, + 0xf3, 0x12, 0x14, 0xe1, 0xc7, 0x2a, 0xd4, 0x27, 0x83, 0x0f, 0x03, 0xe7, 0xf3, 0x40, 0xab, 0x60, + 0x0b, 0x2e, 0x26, 0x83, 0xd1, 0x64, 0x38, 0x74, 0xc8, 0xb8, 0xfb, 0xee, 0x76, 0x48, 0x9c, 0xb1, + 0x73, 0xed, 0x7c, 0xbc, 0xbd, 0xe9, 0x92, 0x51, 0xdf, 0x19, 0x68, 0xf0, 0xc2, 0x01, 0xb5, 0x74, + 0xd3, 0xf8, 0x1c, 0x1e, 0x97, 0xca, 0x9c, 0x46, 0xab, 0xe0, 0x33, 0xd0, 0xca, 0x72, 0x44, 0x19, + 0xd7, 0x10, 0x3e, 0x85, 0x93, 0x7f, 0xcc, 0x01, 0xd3, 0x0e, 0xde, 0x3e, 0xfd, 0xb5, 0x32, 0xd1, + 0xc3, 0xca, 0x44, 0x7f, 0x56, 0x26, 0xba, 0x5f, 0x9b, 0x95, 0x87, 0xb5, 0x59, 0xf9, 0xbd, 0x36, + 0x2b, 0x5f, 0xa0, 0xbd, 0xfd, 0xcd, 0xa6, 0x35, 0xf9, 0x79, 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff, + 0x5f, 0xee, 0x92, 0xca, 0x7a, 0x03, 0x00, 0x00, } func (m *Message) Marshal() (dAtA []byte, err error) { @@ -1117,7 +653,7 @@ func (m *System) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SystemHandshake) Marshal() (dAtA []byte, err error) { +func (m *System_Handshake) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1127,12 +663,12 @@ func (m *SystemHandshake) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SystemHandshake) MarshalTo(dAtA []byte) (int, error) { +func (m *System_Handshake) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SystemHandshake) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *System_Handshake) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1147,7 +683,7 @@ func (m *SystemHandshake) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SystemPing) Marshal() (dAtA []byte, err error) { +func (m *System_Ping) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1157,12 +693,12 @@ func (m *SystemPing) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SystemPing) MarshalTo(dAtA []byte) (int, error) { +func (m *System_Ping) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SystemPing) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *System_Ping) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1175,7 +711,7 @@ func (m *SystemPing) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SystemAck) Marshal() (dAtA []byte, err error) { +func (m *System_Ack) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1185,12 +721,12 @@ func (m *SystemAck) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SystemAck) MarshalTo(dAtA []byte) (int, error) { +func (m *System_Ack) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SystemAck) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *System_Ack) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1210,7 +746,7 @@ func (m *SystemAck) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SystemError) Marshal() (dAtA []byte, err error) { +func (m *System_Error) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1220,12 +756,12 @@ func (m *SystemError) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SystemError) MarshalTo(dAtA []byte) (int, error) { +func (m *System_Error) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SystemError) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *System_Error) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1245,408 +781,6 @@ func (m *SystemError) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Sync) 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 *Sync) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Sync) 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 = encodeVarintSync(dAtA, i, uint64(len(m.TreeId))) - i-- - dAtA[i] = 0x22 - } - if m.TreeHeader != nil { - { - size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.Message != nil { - { - size, err := m.Message.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.SpaceId) > 0 { - i -= len(m.SpaceId) - copy(dAtA[i:], m.SpaceId) - i = encodeVarintSync(dAtA, i, uint64(len(m.SpaceId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SyncContentValue) 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 *SyncContentValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Value != nil { - { - size := m.Value.Size() - i -= size - if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *SyncContentValueValueOfHeadUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncContentValueValueOfHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.HeadUpdate != nil { - { - size, err := m.HeadUpdate.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} -func (m *SyncContentValueValueOfFullSyncRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncContentValueValueOfFullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.FullSyncRequest != nil { - { - size, err := m.FullSyncRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *SyncContentValueValueOfFullSyncResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncContentValueValueOfFullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.FullSyncResponse != nil { - { - size, err := m.FullSyncResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} -func (m *SyncContentValueValueOfAclList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncContentValueValueOfAclList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.AclList != nil { - { - size, err := m.AclList.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} -func (m *SyncACLList) 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 *SyncACLList) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncACLList) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Records) > 0 { - for iNdEx := len(m.Records) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Records[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *SyncHeadUpdate) 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 *SyncHeadUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.SnapshotPath) > 0 { - for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.SnapshotPath[iNdEx]) - copy(dAtA[i:], m.SnapshotPath[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - if len(m.Changes) > 0 { - for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Heads) > 0 { - for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Heads[iNdEx]) - copy(dAtA[i:], m.Heads[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *SyncFull) 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 *SyncFull) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncFull) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *SyncFullRequest) 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 *SyncFullRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncFullRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.SnapshotPath) > 0 { - for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.SnapshotPath[iNdEx]) - copy(dAtA[i:], m.SnapshotPath[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - if len(m.Changes) > 0 { - for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Heads) > 0 { - for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Heads[iNdEx]) - copy(dAtA[i:], m.Heads[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *SyncFullResponse) 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 *SyncFullResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SyncFullResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.SnapshotPath) > 0 { - for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.SnapshotPath[iNdEx]) - copy(dAtA[i:], m.SnapshotPath[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - if len(m.Changes) > 0 { - for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Heads) > 0 { - for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Heads[iNdEx]) - copy(dAtA[i:], m.Heads[iNdEx]) - i = encodeVarintSync(dAtA, i, uint64(len(m.Heads[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func encodeVarintSync(dAtA []byte, offset int, v uint64) int { offset -= sovSync(v) base := offset @@ -1722,7 +856,7 @@ func (m *System) Size() (n int) { return n } -func (m *SystemHandshake) Size() (n int) { +func (m *System_Handshake) Size() (n int) { if m == nil { return 0 } @@ -1735,7 +869,7 @@ func (m *SystemHandshake) Size() (n int) { return n } -func (m *SystemPing) Size() (n int) { +func (m *System_Ping) Size() (n int) { if m == nil { return 0 } @@ -1747,7 +881,7 @@ func (m *SystemPing) Size() (n int) { return n } -func (m *SystemAck) Size() (n int) { +func (m *System_Ack) Size() (n int) { if m == nil { return 0 } @@ -1760,7 +894,7 @@ func (m *SystemAck) Size() (n int) { return n } -func (m *SystemError) Size() (n int) { +func (m *System_Error) Size() (n int) { if m == nil { return 0 } @@ -1776,196 +910,6 @@ func (m *SystemError) Size() (n int) { return n } -func (m *Sync) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.SpaceId) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } - if m.Message != nil { - l = m.Message.Size() - n += 1 + l + sovSync(uint64(l)) - } - if m.TreeHeader != nil { - l = m.TreeHeader.Size() - n += 1 + l + sovSync(uint64(l)) - } - l = len(m.TreeId) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } - return n -} - -func (m *SyncContentValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != nil { - n += m.Value.Size() - } - return n -} - -func (m *SyncContentValueValueOfHeadUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.HeadUpdate != nil { - l = m.HeadUpdate.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} -func (m *SyncContentValueValueOfFullSyncRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.FullSyncRequest != nil { - l = m.FullSyncRequest.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} -func (m *SyncContentValueValueOfFullSyncResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.FullSyncResponse != nil { - l = m.FullSyncResponse.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} -func (m *SyncContentValueValueOfAclList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.AclList != nil { - l = m.AclList.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} -func (m *SyncACLList) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Records) > 0 { - for _, e := range m.Records { - l = e.Size() - n += 1 + l + sovSync(uint64(l)) - } - } - return n -} - -func (m *SyncHeadUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Heads) > 0 { - for _, s := range m.Heads { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - if len(m.Changes) > 0 { - for _, e := range m.Changes { - l = e.Size() - n += 1 + l + sovSync(uint64(l)) - } - } - if len(m.SnapshotPath) > 0 { - for _, s := range m.SnapshotPath { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - return n -} - -func (m *SyncFull) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *SyncFullRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Heads) > 0 { - for _, s := range m.Heads { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - if len(m.Changes) > 0 { - for _, e := range m.Changes { - l = e.Size() - n += 1 + l + sovSync(uint64(l)) - } - } - if len(m.SnapshotPath) > 0 { - for _, s := range m.SnapshotPath { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - return n -} - -func (m *SyncFullResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Heads) > 0 { - for _, s := range m.Heads { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - if len(m.Changes) > 0 { - for _, e := range m.Changes { - l = e.Size() - n += 1 + l + sovSync(uint64(l)) - } - } - if len(m.SnapshotPath) > 0 { - for _, s := range m.SnapshotPath { - l = len(s) - n += 1 + l + sovSync(uint64(l)) - } - } - return n -} - func sovSync(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2324,7 +1268,7 @@ func (m *System) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Handshake == nil { - m.Handshake = &SystemHandshake{} + m.Handshake = &System_Handshake{} } if err := m.Handshake.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2360,7 +1304,7 @@ func (m *System) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Ping == nil { - m.Ping = &SystemPing{} + m.Ping = &System_Ping{} } if err := m.Ping.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2396,7 +1340,7 @@ func (m *System) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Ack == nil { - m.Ack = &SystemAck{} + m.Ack = &System_Ack{} } if err := m.Ack.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2423,7 +1367,7 @@ func (m *System) Unmarshal(dAtA []byte) error { } return nil } -func (m *SystemHandshake) Unmarshal(dAtA []byte) error { +func (m *System_Handshake) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2505,7 +1449,7 @@ func (m *SystemHandshake) Unmarshal(dAtA []byte) error { } return nil } -func (m *SystemPing) Unmarshal(dAtA []byte) error { +func (m *System_Ping) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2574,7 +1518,7 @@ func (m *SystemPing) Unmarshal(dAtA []byte) error { } return nil } -func (m *SystemAck) Unmarshal(dAtA []byte) error { +func (m *System_Ack) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2633,7 +1577,7 @@ func (m *SystemAck) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Error == nil { - m.Error = &SystemError{} + m.Error = &System_Error{} } if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2660,7 +1604,7 @@ func (m *SystemAck) Unmarshal(dAtA []byte) error { } return nil } -func (m *SystemError) Unmarshal(dAtA []byte) error { +func (m *System_Error) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2703,7 +1647,7 @@ func (m *SystemError) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Code |= SystemErrorCode(b&0x7F) << shift + m.Code |= System_Error_Code(b&0x7F) << shift if b < 0x80 { break } @@ -2761,960 +1705,6 @@ func (m *SystemError) Unmarshal(dAtA []byte) error { } return nil } -func (m *Sync) 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 ErrIntOverflowSync - } - 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: Sync: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Sync: 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 ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - 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 Message", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Message == nil { - m.Message = &SyncContentValue{} - } - if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.TreeHeader == nil { - m.TreeHeader = &aclpb.Header{} - } - if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - 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 ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TreeId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncContentValue) 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 ErrIntOverflowSync - } - 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: ContentValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ContentValue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field HeadUpdate", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SyncHeadUpdate{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &SyncContentValueValueOfHeadUpdate{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FullSyncRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SyncFullRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &SyncContentValueValueOfFullSyncRequest{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FullSyncResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SyncFullResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &SyncContentValueValueOfFullSyncResponse{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclList", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &SyncACLList{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &SyncContentValueValueOfAclList{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncACLList) 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 ErrIntOverflowSync - } - 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: ACLList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Records", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Records = append(m.Records, &aclpb.RawRecord{}) - if err := m.Records[len(m.Records)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncHeadUpdate) 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 ErrIntOverflowSync - } - 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: HeadUpdate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: HeadUpdate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Changes = append(m.Changes, &aclpb.RawChange{}) - if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncFull) 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 ErrIntOverflowSync - } - 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: Full: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Full: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncFullRequest) 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 ErrIntOverflowSync - } - 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: Request: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Changes = append(m.Changes, &aclpb.RawChange{}) - if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SyncFullResponse) 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 ErrIntOverflowSync - } - 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: Response: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Changes = append(m.Changes, &aclpb.RawChange{}) - if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func skipSync(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From b5aa0b135f465258dc0bc8e03188460d4e75eaba Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 12 Sep 2022 21:25:20 +0200 Subject: [PATCH 062/219] Fix list package and some storage stuff --- pkg/acl/list/list_test.go | 14 +-- pkg/acl/storage/liststorage.go | 1 + pkg/acl/storage/storage.go | 3 - pkg/acl/storage/treestorage.go | 1 + pkg/acl/testutils/acllistbuilder/keychain.go | 8 +- .../acllistbuilder/liststoragebuilder.go | 79 ++++++++-------- .../liststoragebuildergraph_nix.go | 2 +- pkg/acl/tree/tests/benches_test.go | 91 ------------------- 8 files changed, 53 insertions(+), 146 deletions(-) delete mode 100644 pkg/acl/tree/tests/benches_test.go diff --git a/pkg/acl/list/list_test.go b/pkg/acl/list/list_test.go index acc5f570..fd249cfb 100644 --- a/pkg/acl/list/list_test.go +++ b/pkg/acl/list/list_test.go @@ -23,9 +23,9 @@ func TestAclList_ACLState_UserInviteAndJoin(t *testing.T) { idC := keychain.GetIdentity("C") // checking final state - assert.Equal(t, aclpb.ACLChange_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) - assert.Equal(t, aclpb.ACLChange_Writer, aclList.ACLState().GetUserStates()[idB].Permissions) - assert.Equal(t, aclpb.ACLChange_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) + assert.Equal(t, aclpb.ACLUserPermissions_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) + assert.Equal(t, aclpb.ACLUserPermissions_Writer, aclList.ACLState().GetUserStates()[idB].Permissions) + assert.Equal(t, aclpb.ACLUserPermissions_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) assert.Equal(t, aclList.Head().Content.CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) var records []*ACLRecord @@ -44,7 +44,7 @@ func TestAclList_ACLState_UserInviteAndJoin(t *testing.T) { assert.NoError(t, err, "should have no error with permissions of B in the record 2") assert.Equal(t, UserPermissionPair{ Identity: idB, - Permission: aclpb.ACLChange_Writer, + Permission: aclpb.ACLUserPermissions_Writer, }, perm) } @@ -62,8 +62,8 @@ func TestAclList_ACLState_UserJoinAndRemove(t *testing.T) { idC := keychain.GetIdentity("C") // checking final state - assert.Equal(t, aclpb.ACLChange_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) - assert.Equal(t, aclpb.ACLChange_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) + assert.Equal(t, aclpb.ACLUserPermissions_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) + assert.Equal(t, aclpb.ACLUserPermissions_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) assert.Equal(t, aclList.Head().Content.CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) _, exists := aclList.ACLState().GetUserStates()[idB] @@ -84,7 +84,7 @@ func TestAclList_ACLState_UserJoinAndRemove(t *testing.T) { assert.NoError(t, err, "should have no error with permissions of B in the record 2") assert.Equal(t, UserPermissionPair{ Identity: idB, - Permission: aclpb.ACLChange_Writer, + Permission: aclpb.ACLUserPermissions_Writer, }, perm) _, err = aclList.ACLState().PermissionsAtRecord(records[3].Id, idB) diff --git a/pkg/acl/storage/liststorage.go b/pkg/acl/storage/liststorage.go index 90cb9cdc..ccb5b5da 100644 --- a/pkg/acl/storage/liststorage.go +++ b/pkg/acl/storage/liststorage.go @@ -7,6 +7,7 @@ import ( type ListStorage interface { Storage + Header() (*aclpb.ACLHeader, error) Head() (*aclpb.RawACLRecord, error) GetRawRecord(ctx context.Context, id string) (*aclpb.RawACLRecord, error) diff --git a/pkg/acl/storage/storage.go b/pkg/acl/storage/storage.go index 7f14166c..42af1815 100644 --- a/pkg/acl/storage/storage.go +++ b/pkg/acl/storage/storage.go @@ -1,8 +1,5 @@ package storage -import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - type Storage interface { ID() (string, error) - Header() (*aclpb.Header, error) } diff --git a/pkg/acl/storage/treestorage.go b/pkg/acl/storage/treestorage.go index 3a5d8866..0e7d09a1 100644 --- a/pkg/acl/storage/treestorage.go +++ b/pkg/acl/storage/treestorage.go @@ -7,6 +7,7 @@ import ( type TreeStorage interface { Storage + Header() (*aclpb.TreeHeader, error) Heads() ([]string, error) SetHeads(heads []string) error diff --git a/pkg/acl/testutils/acllistbuilder/keychain.go b/pkg/acl/testutils/acllistbuilder/keychain.go index d968cd4c..b6112ae9 100644 --- a/pkg/acl/testutils/acllistbuilder/keychain.go +++ b/pkg/acl/testutils/acllistbuilder/keychain.go @@ -99,12 +99,14 @@ func (k *Keychain) AddSigningKey(key *Key) { } k.SigningKeys[key.Name] = newPrivKey - res, err := k.coder.EncodeToString(pubKey) + rawPubKey, err := pubKey.Raw() if err != nil { panic(err) } - k.SigningKeysByIdentity[res] = newPrivKey - k.GeneratedIdentities[key.Name] = res + encoded := string(rawPubKey) + + k.SigningKeysByIdentity[encoded] = newPrivKey + k.GeneratedIdentities[key.Name] = encoded } func (k *Keychain) AddReadKey(key *Key) { diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index 4dc5086e..c6d8703a 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -23,7 +23,7 @@ type ACLListStorageBuilder struct { rawRecords []*aclpb.RawACLRecord indexes map[string]int keychain *Keychain - header *aclpb.Header + header *aclpb.ACLHeader id string } @@ -64,7 +64,7 @@ func (t *ACLListStorageBuilder) createRaw(rec *aclpb.ACLRecord) *aclpb.RawACLRec panic("should be able to marshal final acl message!") } - signature, err := t.keychain.SigningKeysByIdentity[rec.Identity].Sign(aclMarshaled) + signature, err := t.keychain.SigningKeysByIdentity[string(rec.Identity)].Sign(aclMarshaled) if err != nil { panic("should be able to sign final acl message!") } @@ -86,7 +86,7 @@ func (t *ACLListStorageBuilder) Head() (*aclpb.RawACLRecord, error) { return t.getRecord(len(t.records) - 1), nil } -func (t *ACLListStorageBuilder) Header() (*aclpb.Header, error) { +func (t *ACLListStorageBuilder) Header() (*aclpb.ACLHeader, error) { return t.header, nil } @@ -134,26 +134,26 @@ func (t *ACLListStorageBuilder) Parse(tree *YMLList) { func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclpb.ACLRecord { k := t.keychain.GetKey(rec.ReadKey).(*SymKey) - var aclChangeContents []*aclpb.ACLChangeACLContentValue + var aclChangeContents []*aclpb.ACLContentValue for _, ch := range rec.AclChanges { aclChangeContent := t.parseACLChange(ch) aclChangeContents = append(aclChangeContents, aclChangeContent) } - data := &aclpb.ACLChangeACLData{ + data := &aclpb.ACLData{ AclContent: aclChangeContents, } bytes, _ := data.Marshal() return &aclpb.ACLRecord{ PrevId: prevId, - Identity: t.keychain.GetIdentity(rec.Identity), + Identity: []byte(t.keychain.GetIdentity(rec.Identity)), Data: bytes, CurrentReadKeyHash: k.Hash, Timestamp: time.Now().Unix(), } } -func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLChangeACLContentValue) { +func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLContentValue) { switch { case ch.UserAdd != nil: add := ch.UserAdd @@ -161,10 +161,10 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL encKey := t.keychain.GetKey(add.EncryptionKey).(encryptionkey.PrivKey) rawKey, _ := encKey.GetPublic().Raw() - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserAdd{ - UserAdd: &aclpb.ACLUserPermissionsAdd{ - Identity: t.keychain.GetIdentity(add.Identity), + convCh = &aclpb.ACLContentValue{ + Value: &aclpb.ACLContentValue_UserAdd{ + UserAdd: &aclpb.ACLUserAdd{ + Identity: []byte(t.keychain.GetIdentity(add.Identity)), EncryptionKey: rawKey, EncryptedReadKeys: t.encryptReadKeys(add.EncryptedReadKeys, encKey), Permissions: t.convertPermission(add.Permission), @@ -185,10 +185,10 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL panic(err) } - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserJoin{ - UserJoin: &aclpb.ACLUserPermissionsJoin{ - Identity: t.keychain.GetIdentity(join.Identity), + convCh = &aclpb.ACLContentValue{ + Value: &aclpb.ACLContentValue_UserJoin{ + UserJoin: &aclpb.ACLUserJoin{ + Identity: []byte(t.keychain.GetIdentity(join.Identity)), EncryptionKey: rawKey, AcceptSignature: signature, UserInviteId: join.InviteId, @@ -203,9 +203,9 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL GetKey(invite.EncryptionKey).(encryptionkey.PrivKey) rawEncKey, _ := encKey.GetPublic().Raw() - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserInvite{ - UserInvite: &aclpb.ACLUserPermissionsInvite{ + convCh = &aclpb.ACLContentValue{ + Value: &aclpb.ACLContentValue_UserInvite{ + UserInvite: &aclpb.ACLUserInvite{ AcceptPublicKey: rawAcceptKey, EncryptPublicKey: rawEncKey, EncryptedReadKeys: t.encryptReadKeys(invite.EncryptedReadKeys, encKey), @@ -217,10 +217,10 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL case ch.UserConfirm != nil: confirm := ch.UserConfirm - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserConfirm{ - UserConfirm: &aclpb.ACLUserPermissionsConfirm{ - Identity: t.keychain.GetIdentity(confirm.Identity), + convCh = &aclpb.ACLContentValue{ + Value: &aclpb.ACLContentValue_UserConfirm{ + UserConfirm: &aclpb.ACLUserConfirm{ + Identity: []byte(t.keychain.GetIdentity(confirm.Identity)), UserAddId: confirm.UserAddId, }, }, @@ -228,10 +228,10 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL case ch.UserPermissionChange != nil: permissionChange := ch.UserPermissionChange - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserPermissionChange{ - UserPermissionChange: &aclpb.ACLUserPermissionsPermissionChange{ - Identity: t.keychain.GetIdentity(permissionChange.Identity), + convCh = &aclpb.ACLContentValue{ + Value: &aclpb.ACLContentValue_UserPermissionChange{ + UserPermissionChange: &aclpb.ACLUserPermissionChange{ + Identity: []byte(t.keychain.GetIdentity(permissionChange.Identity)), Permissions: t.convertPermission(permissionChange.Permission), }, }, @@ -241,7 +241,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL newReadKey := t.keychain.GetKey(remove.NewReadKey).(*SymKey) - var replaces []*aclpb.ACLChangeReadKeyReplace + var replaces []*aclpb.ACLReadKeyReplace for _, id := range remove.IdentitiesLeft { identity := t.keychain.GetIdentity(id) encKey := t.keychain.EncryptionKeys[id] @@ -250,17 +250,17 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL if err != nil { panic(err) } - replaces = append(replaces, &aclpb.ACLChangeReadKeyReplace{ - Identity: identity, + replaces = append(replaces, &aclpb.ACLReadKeyReplace{ + Identity: []byte(identity), EncryptionKey: rawEncKey, EncryptedReadKey: encReadKey, }) } - convCh = &aclpb.ACLChangeACLContentValue{ - Value: &aclpb.ACLChangeACLContentValueValueOfUserRemove{ - UserRemove: &aclpb.ACLUserPermissionsRemove{ - Identity: t.keychain.GetIdentity(remove.RemovedIdentity), + convCh = &aclpb.ACLContentValue{ + Value: &aclpb.ACLContentValue_UserRemove{ + UserRemove: &aclpb.ACLUserRemove{ + Identity: []byte(t.keychain.GetIdentity(remove.RemovedIdentity)), ReadKeyReplaces: replaces, }, }, @@ -289,11 +289,11 @@ func (t *ACLListStorageBuilder) encryptReadKeys(keys []string, encKey encryption func (t *ACLListStorageBuilder) convertPermission(perm string) aclpb.ACLUserPermissions { switch perm { case "admin": - return aclpb.ACLChange_Admin + return aclpb.ACLUserPermissions_Admin case "writer": - return aclpb.ACLChange_Writer + return aclpb.ACLUserPermissions_Writer case "reader": - return aclpb.ACLChange_Reader + return aclpb.ACLUserPermissions_Reader default: panic(fmt.Sprintf("incorrect permission: %s", perm)) } @@ -310,11 +310,8 @@ func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclpb.ACLRecord, id } func (t *ACLListStorageBuilder) createHeaderAndId() { - t.header = &aclpb.Header{ - FirstId: t.rawRecords[0].Id, - AclListId: "", - WorkspaceId: "", - DocType: aclpb.Header_ACL, + t.header = &aclpb.ACLHeader{ + FirstId: t.rawRecords[0].Id, } bytes, _ := t.header.Marshal() id, _ := cid.NewCIDFromBytes(bytes) diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go b/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go index 9c7bf581..d7dfc85f 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go @@ -37,7 +37,7 @@ func (t *ACLListStorageBuilder) Graph() (string, error) { style := "solid" var chSymbs []string - aclData := &aclpb.ACLChangeACLData{} + aclData := &aclpb.ACLData{} err := proto.Unmarshal(r.GetData(), aclData) if err != nil { return err diff --git a/pkg/acl/tree/tests/benches_test.go b/pkg/acl/tree/tests/benches_test.go deleted file mode 100644 index 703cb7a0..00000000 --- a/pkg/acl/tree/tests/benches_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package tests - -import ( - "bytes" - "math/rand" - "testing" - "time" -) - -func BenchmarkHashes(b *testing.B) { - genRandomBytes := func() [][]byte { - var res [][]byte - s := rand.NewSource(time.Now().Unix()) - r := rand.New(s) - for i := 0; i < 10000; i++ { - var newBytes []byte - for j := 0; j < 64; j++ { - newBytes = append(newBytes, byte(r.Intn(256))) - } - res = append(res, newBytes) - } - return res - } - makeStrings := func(input [][]byte) []string { - var res []string - for _, bytes := range input { - res = append(res, string(bytes)) - } - return res - } - res := genRandomBytes() - stringRes := makeStrings(res) - stringMap := map[string]struct{}{} - b.Run("string bytes hash map write", func(b *testing.B) { - stringMap = map[string]struct{}{} - for i := 0; i < b.N; i++ { - for _, bytes := range res { - stringMap[string(bytes)] = struct{}{} - } - } - b.Run("hash map read", func(b *testing.B) { - for i := 0; i < b.N; i++ { - for _, bytes := range res { - _, _ = stringMap[string(bytes)] - } - } - }) - }) - b.Run("compare byte slices as strings", func(b *testing.B) { - for i := 0; i < b.N; i++ { - for _, bytes := range res { - if string(bytes) == string(bytes) { - - } - } - } - }) - b.Run("compare byte slices", func(b *testing.B) { - for i := 0; i < b.N; i++ { - for _, bt := range res { - if bytes.Compare(bt, bt) == 0 { - - } - } - } - }) - b.Run("compare strings", func(b *testing.B) { - for i := 0; i < b.N; i++ { - for _, st := range stringRes { - if st == st { - - } - } - } - }) - b.Run("string hash map write", func(b *testing.B) { - stringMap = map[string]struct{}{} - for i := 0; i < b.N; i++ { - for _, str := range stringRes { - stringMap[str] = struct{}{} - } - } - b.Run("hash map read", func(b *testing.B) { - for i := 0; i < b.N; i++ { - for _, str := range stringRes { - _, _ = stringMap[str] - } - } - }) - }) -} From 77bbb64febf7d82f78c39efaf87b098579c95e26 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 13 Sep 2022 09:04:47 +0200 Subject: [PATCH 063/219] Fix pkg tests --- pkg/acl/common/keychain.go | 2 +- pkg/acl/tree/changebuilder.go | 6 ++++-- pkg/acl/tree/changevalidator.go | 2 +- pkg/acl/tree/objecttree_test.go | 32 ++++++++++++++------------------ 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/pkg/acl/common/keychain.go b/pkg/acl/common/keychain.go index 2842ae5e..d90965c6 100644 --- a/pkg/acl/common/keychain.go +++ b/pkg/acl/common/keychain.go @@ -21,7 +21,7 @@ func (k *Keychain) GetOrAdd(identity string) (signingkey.PubKey, error) { if key, exists := k.keys[identity]; exists { return key, nil } - res, err := k.decoder.DecodeFromString(identity) + res, err := k.decoder.DecodeFromBytes([]byte(identity)) if err != nil { return nil, err } diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index 3a2f0701..67985c82 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -60,13 +60,15 @@ func (c *changeBuilder) ConvertFromRaw(rawIdChange *aclpb.RawTreeChangeWithId, v } if verify { - identityKey, err := c.keys.GetOrAdd(ch.Identity) + var identityKey signingkey.PubKey + identityKey, err = c.keys.GetOrAdd(ch.Identity) if err != nil { return } // verifying signature - res, err := identityKey.Verify(raw.Payload, raw.Signature) + var res bool + res, err = identityKey.Verify(raw.Payload, raw.Signature) if err != nil { return } diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index 1dfac831..bbc337cf 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -43,7 +43,7 @@ func (v *objectTreeValidator) validateChange(tree *Tree, aclList list.ACLList, c state = aclList.ACLState() ) // checking if the user could write - perm, err = state.PermissionsAtRecord(c.Content.AclHeadId, c.Content.Identity) + perm, err = state.PermissionsAtRecord(c.Content.AclHeadId, c.Identity) if err != nil { return } diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index c73ce3ff..6e43d8d3 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -14,7 +14,7 @@ import ( type mockChangeCreator struct{} -func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot bool, prevIds ...string) *aclpb.RawChange { +func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot bool, prevIds ...string) *aclpb.RawTreeChangeWithId { aclChange := &aclpb.TreeChange{ TreeHeadIds: prevIds, AclHeadId: aclId, @@ -51,19 +51,15 @@ type mockChangeBuilder struct { originalBuilder ChangeBuilder } -func (c *mockChangeBuilder) ConvertFromRaw(rawChange *aclpb.RawChange) (ch *Change, err error) { - return c.originalBuilder.ConvertFromRaw(rawChange) +func (c *mockChangeBuilder) ConvertFromRaw(rawChange *aclpb.RawTreeChangeWithId, verify bool) (ch *Change, err error) { + return c.originalBuilder.ConvertFromRaw(rawChange, false) } -func (c *mockChangeBuilder) ConvertFromRawAndVerify(rawChange *aclpb.RawChange) (ch *Change, err error) { - return c.originalBuilder.ConvertFromRaw(rawChange) -} - -func (c *mockChangeBuilder) BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawChange, err error) { +func (c *mockChangeBuilder) BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawTreeChangeWithId, err error) { panic("implement me") } -func (c *mockChangeBuilder) BuildRaw(ch *Change) (raw *aclpb.RawChange, err error) { +func (c *mockChangeBuilder) BuildRaw(ch *Change) (raw *aclpb.RawTreeChangeWithId, err error) { return c.originalBuilder.BuildRaw(ch) } @@ -141,7 +137,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawChange{ + rawChanges := []*aclpb.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), } @@ -182,7 +178,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawChange{ + rawChanges := []*aclpb.RawTreeChangeWithId{ changeCreator.createRaw("0", aclList.Head().Id, "", true, ""), } res, err := objTree.AddRawChanges(context.Background(), rawChanges...) @@ -202,7 +198,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawChange{ + rawChanges := []*aclpb.RawTreeChangeWithId{ changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), } res, err := objTree.AddRawChanges(context.Background(), rawChanges...) @@ -224,7 +220,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawChange{ + rawChanges := []*aclpb.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), @@ -268,7 +264,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawChange{ + rawChanges := []*aclpb.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), @@ -287,7 +283,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawChange{ + rawChanges := []*aclpb.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), @@ -361,7 +357,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawChange{ + rawChanges := []*aclpb.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), @@ -437,7 +433,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawChange{ + rawChanges := []*aclpb.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), @@ -446,7 +442,7 @@ func TestObjectTree(t *testing.T) { require.NoError(t, err, "adding changes should be without error") require.Equal(t, "3", objTree.Root().Id) - rawChanges = []*aclpb.RawChange{ + rawChanges = []*aclpb.RawTreeChangeWithId{ changeCreator.createRaw("4", aclList.Head().Id, "0", false, "2"), changeCreator.createRaw("5", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("6", aclList.Head().Id, "0", false, "3", "4", "5"), From a907cde3993868dbf27938fe609fd2bbc02db2b5 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 13 Sep 2022 10:44:02 +0200 Subject: [PATCH 064/219] Use string instead of bytes, to simplify code --- pkg/acl/account/accountdata.go | 3 +- pkg/acl/aclchanges/aclpb/aclchanges.pb.go | 296 ++++++++---------- .../aclchanges/aclpb/protos/aclchanges.proto | 22 +- pkg/acl/list/aclstate.go | 46 ++- pkg/acl/list/changebuilder.go | 4 +- .../acllistbuilder/liststoragebuilder.go | 14 +- pkg/acl/tree/change.go | 1 - pkg/acl/tree/changebuilder.go | 2 +- pkg/acl/tree/changevalidator.go | 2 +- pkg/acl/tree/objecttreefactory.go | 2 +- pkg/acl/tree/signablecontent.go | 2 +- 11 files changed, 185 insertions(+), 209 deletions(-) diff --git a/pkg/acl/account/accountdata.go b/pkg/acl/account/accountdata.go index bc775854..1bf30c95 100644 --- a/pkg/acl/account/accountdata.go +++ b/pkg/acl/account/accountdata.go @@ -7,7 +7,8 @@ import ( ) type AccountData struct { // TODO: create a convenient constructor for this - Identity []byte // TODO: this is essentially the same as sign key + // Identity is non utf8 encoded, but we use this type, to eliminate copying between []byte to string conversions + Identity string SignKey signingkey.PrivKey EncKey encryptionkey.PrivKey Decoder keys.Decoder diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go index ecd124b1..9c7c75b4 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go @@ -380,7 +380,7 @@ func (m *ACLState) GetInvites() map[string]*ACLUserInvite { } type ACLUserState struct { - Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` @@ -420,11 +420,11 @@ func (m *ACLUserState) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserState proto.InternalMessageInfo -func (m *ACLUserState) GetIdentity() []byte { +func (m *ACLUserState) GetIdentity() string { if m != nil { return m.Identity } - return nil + return "" } func (m *ACLUserState) GetEncryptionKey() []byte { @@ -457,7 +457,7 @@ func (m *ACLUserState) GetIsConfirmed() bool { // we already know identity and encryptionKey type ACLUserAdd struct { - Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` @@ -496,11 +496,11 @@ func (m *ACLUserAdd) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserAdd proto.InternalMessageInfo -func (m *ACLUserAdd) GetIdentity() []byte { +func (m *ACLUserAdd) GetIdentity() string { if m != nil { return m.Identity } - return nil + return "" } func (m *ACLUserAdd) GetEncryptionKey() []byte { @@ -526,7 +526,7 @@ func (m *ACLUserAdd) GetPermissions() ACLUserPermissions { // TODO: this is not used as of now type ACLUserConfirm struct { - Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` UserAddId string `protobuf:"bytes,2,opt,name=userAddId,proto3" json:"userAddId,omitempty"` } @@ -563,11 +563,11 @@ func (m *ACLUserConfirm) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserConfirm proto.InternalMessageInfo -func (m *ACLUserConfirm) GetIdentity() []byte { +func (m *ACLUserConfirm) GetIdentity() string { if m != nil { return m.Identity } - return nil + return "" } func (m *ACLUserConfirm) GetUserAddId() string { @@ -654,7 +654,7 @@ func (m *ACLUserInvite) GetInviteId() string { } type ACLUserJoin struct { - Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` AcceptSignature []byte `protobuf:"bytes,3,opt,name=acceptSignature,proto3" json:"acceptSignature,omitempty"` UserInviteId string `protobuf:"bytes,4,opt,name=userInviteId,proto3" json:"userInviteId,omitempty"` @@ -694,11 +694,11 @@ func (m *ACLUserJoin) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserJoin proto.InternalMessageInfo -func (m *ACLUserJoin) GetIdentity() []byte { +func (m *ACLUserJoin) GetIdentity() string { if m != nil { return m.Identity } - return nil + return "" } func (m *ACLUserJoin) GetEncryptionKey() []byte { @@ -730,7 +730,7 @@ func (m *ACLUserJoin) GetEncryptedReadKeys() [][]byte { } type ACLUserRemove struct { - Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` ReadKeyReplaces []*ACLReadKeyReplace `protobuf:"bytes,3,rep,name=readKeyReplaces,proto3" json:"readKeyReplaces,omitempty"` } @@ -767,11 +767,11 @@ func (m *ACLUserRemove) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserRemove proto.InternalMessageInfo -func (m *ACLUserRemove) GetIdentity() []byte { +func (m *ACLUserRemove) GetIdentity() string { if m != nil { return m.Identity } - return nil + return "" } func (m *ACLUserRemove) GetReadKeyReplaces() []*ACLReadKeyReplace { @@ -782,7 +782,7 @@ func (m *ACLUserRemove) GetReadKeyReplaces() []*ACLReadKeyReplace { } type ACLReadKeyReplace struct { - Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKey []byte `protobuf:"bytes,3,opt,name=encryptedReadKey,proto3" json:"encryptedReadKey,omitempty"` } @@ -820,11 +820,11 @@ func (m *ACLReadKeyReplace) XXX_DiscardUnknown() { var xxx_messageInfo_ACLReadKeyReplace proto.InternalMessageInfo -func (m *ACLReadKeyReplace) GetIdentity() []byte { +func (m *ACLReadKeyReplace) GetIdentity() string { if m != nil { return m.Identity } - return nil + return "" } func (m *ACLReadKeyReplace) GetEncryptionKey() []byte { @@ -842,7 +842,7 @@ func (m *ACLReadKeyReplace) GetEncryptedReadKey() []byte { } type ACLUserPermissionChange struct { - Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` Permissions ACLUserPermissions `protobuf:"varint,2,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` } @@ -879,11 +879,11 @@ func (m *ACLUserPermissionChange) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserPermissionChange proto.InternalMessageInfo -func (m *ACLUserPermissionChange) GetIdentity() []byte { +func (m *ACLUserPermissionChange) GetIdentity() string { if m != nil { return m.Identity } - return nil + return "" } func (m *ACLUserPermissionChange) GetPermissions() ACLUserPermissions { @@ -895,7 +895,7 @@ func (m *ACLUserPermissionChange) GetPermissions() ACLUserPermissions { type ACLRecord struct { PrevId string `protobuf:"bytes,1,opt,name=prevId,proto3" json:"prevId,omitempty"` - Identity []byte `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` + Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` CurrentReadKeyHash uint64 `protobuf:"varint,4,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` Timestamp int64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` @@ -941,11 +941,11 @@ func (m *ACLRecord) GetPrevId() string { return "" } -func (m *ACLRecord) GetIdentity() []byte { +func (m *ACLRecord) GetIdentity() string { if m != nil { return m.Identity } - return nil + return "" } func (m *ACLRecord) GetData() []byte { @@ -971,7 +971,7 @@ func (m *ACLRecord) GetTimestamp() int64 { type ACLHeader struct { FirstId string `protobuf:"bytes,1,opt,name=firstId,proto3" json:"firstId,omitempty"` - Identity []byte `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` + Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` } func (m *ACLHeader) Reset() { *m = ACLHeader{} } @@ -1014,11 +1014,11 @@ func (m *ACLHeader) GetFirstId() string { return "" } -func (m *ACLHeader) GetIdentity() []byte { +func (m *ACLHeader) GetIdentity() string { if m != nil { return m.Identity } - return nil + return "" } type RawTreeChange struct { @@ -1132,7 +1132,7 @@ type TreeChange struct { ChangesData []byte `protobuf:"bytes,4,opt,name=changesData,proto3" json:"changesData,omitempty"` CurrentReadKeyHash uint64 `protobuf:"varint,5,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` Timestamp int64 `protobuf:"varint,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Identity []byte `protobuf:"bytes,7,opt,name=identity,proto3" json:"identity,omitempty"` + Identity string `protobuf:"bytes,7,opt,name=identity,proto3" json:"identity,omitempty"` IsSnapshot bool `protobuf:"varint,8,opt,name=isSnapshot,proto3" json:"isSnapshot,omitempty"` } @@ -1211,11 +1211,11 @@ func (m *TreeChange) GetTimestamp() int64 { return 0 } -func (m *TreeChange) GetIdentity() []byte { +func (m *TreeChange) GetIdentity() string { if m != nil { return m.Identity } - return nil + return "" } func (m *TreeChange) GetIsSnapshot() bool { @@ -1229,7 +1229,7 @@ type TreeHeader struct { FirstId string `protobuf:"bytes,1,opt,name=firstId,proto3" json:"firstId,omitempty"` AclId string `protobuf:"bytes,2,opt,name=aclId,proto3" json:"aclId,omitempty"` TreeHeaderType TreeHeaderType `protobuf:"varint,3,opt,name=treeHeaderType,proto3,enum=acl.TreeHeaderType" json:"treeHeaderType,omitempty"` - Identity []byte `protobuf:"bytes,4,opt,name=identity,proto3" json:"identity,omitempty"` + Identity string `protobuf:"bytes,4,opt,name=identity,proto3" json:"identity,omitempty"` Data []byte `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` } @@ -1287,11 +1287,11 @@ func (m *TreeHeader) GetTreeHeaderType() TreeHeaderType { return TreeHeaderType_Object } -func (m *TreeHeader) GetIdentity() []byte { +func (m *TreeHeader) GetIdentity() string { if m != nil { return m.Identity } - return nil + return "" } func (m *TreeHeader) GetData() []byte { @@ -1361,44 +1361,44 @@ var fileDescriptor_37a022c841a51877 = []byte{ 0xf8, 0x27, 0x91, 0x48, 0xa7, 0x38, 0x53, 0xdd, 0xfc, 0x0c, 0x5a, 0xb6, 0x00, 0x75, 0xa0, 0xfa, 0x9c, 0x4e, 0x55, 0x1d, 0x35, 0xb0, 0x5c, 0xa2, 0x1d, 0xc3, 0xc3, 0xa2, 0x5a, 0xd1, 0xa6, 0x58, 0x2b, 0x7c, 0xe0, 0xbe, 0xe7, 0xf8, 0xbf, 0x38, 0xd0, 0xb2, 0x5d, 0x44, 0x9b, 0xb0, 0xc2, 0x42, - 0x1a, 0x09, 0x26, 0xa6, 0xa6, 0xf2, 0xf3, 0xbd, 0xe4, 0x82, 0x46, 0x41, 0x3a, 0x4d, 0x04, 0x8b, - 0xa3, 0x03, 0x3a, 0x35, 0xe5, 0x5f, 0x06, 0xd1, 0x9b, 0xb0, 0x6e, 0x00, 0x1a, 0x62, 0xcd, 0x92, - 0x0e, 0xb1, 0x85, 0xe7, 0x05, 0xe8, 0x7d, 0x68, 0x26, 0x79, 0xa5, 0x71, 0x55, 0x56, 0xed, 0xbd, - 0x7b, 0x8b, 0x0b, 0x94, 0x63, 0x5b, 0x17, 0x6d, 0x43, 0x93, 0x71, 0x93, 0x7e, 0x1a, 0xaa, 0xea, - 0x5a, 0xc1, 0x36, 0xe4, 0xff, 0xe0, 0x00, 0x14, 0xbf, 0xd5, 0xff, 0x28, 0x36, 0xff, 0x11, 0xb4, - 0xcb, 0xe5, 0x7e, 0xab, 0xf3, 0x5b, 0xd0, 0x30, 0xfd, 0x62, 0x14, 0x2a, 0xc7, 0x1b, 0xb8, 0x00, - 0xfc, 0xdf, 0x1d, 0x58, 0x2d, 0x15, 0x00, 0xda, 0x81, 0x35, 0x12, 0x04, 0x34, 0x11, 0x8f, 0xcf, - 0x4f, 0xc6, 0x2c, 0x38, 0xa0, 0xd9, 0x91, 0xb3, 0x30, 0xda, 0x85, 0x8e, 0x89, 0xab, 0x50, 0xd5, - 0xcc, 0xcc, 0xe1, 0xff, 0x5d, 0xe2, 0x25, 0x15, 0x2a, 0x90, 0x91, 0xce, 0x7a, 0x03, 0xe7, 0x7b, - 0xff, 0x27, 0x07, 0x9a, 0x56, 0x6f, 0x79, 0x09, 0x39, 0xcf, 0xc9, 0x3a, 0xca, 0xdb, 0x7e, 0xd5, - 0x26, 0x2b, 0x87, 0x91, 0x0f, 0xad, 0xa2, 0xf3, 0x8d, 0x42, 0x15, 0x53, 0x03, 0x97, 0xb0, 0xc5, - 0x24, 0xd5, 0x6e, 0x20, 0xc9, 0x9f, 0xe4, 0x99, 0x33, 0x8d, 0xfd, 0xb6, 0x70, 0x3e, 0x86, 0x35, - 0xd3, 0x95, 0x30, 0x4d, 0xc6, 0x24, 0xc8, 0x3b, 0xcb, 0xdd, 0x8c, 0x55, 0x5c, 0x12, 0xe3, 0x59, - 0x75, 0xff, 0x6b, 0x07, 0xd6, 0xe7, 0xd4, 0x5e, 0x02, 0x85, 0x45, 0x15, 0xe5, 0xb1, 0x19, 0x0e, - 0xe7, 0x70, 0x3f, 0x81, 0x7b, 0x37, 0xbc, 0x4c, 0xb7, 0x3a, 0x32, 0x53, 0x4e, 0xee, 0x3f, 0xf8, - 0xd7, 0xbe, 0x73, 0xa0, 0x51, 0xbc, 0xfc, 0x77, 0x61, 0x39, 0x49, 0xe9, 0xc5, 0x28, 0x34, 0x4d, - 0xd5, 0xec, 0x4a, 0x97, 0xbb, 0x33, 0x97, 0x23, 0x58, 0x0a, 0x89, 0x20, 0x26, 0x26, 0xb5, 0x46, - 0x3d, 0x40, 0xc1, 0x79, 0x9a, 0xd2, 0x48, 0xe0, 0xe2, 0xa9, 0x50, 0x25, 0xb1, 0x84, 0x17, 0x48, - 0xe4, 0x3f, 0x2c, 0xd8, 0x84, 0x72, 0x41, 0x26, 0x89, 0xaa, 0xea, 0x2a, 0x2e, 0x00, 0xbf, 0xaf, - 0x5c, 0x1c, 0x52, 0x12, 0xd2, 0x54, 0x0e, 0x27, 0xcf, 0x58, 0xca, 0x45, 0xee, 0x63, 0xb6, 0xbd, - 0xcd, 0x49, 0xff, 0x53, 0x58, 0xc5, 0xe4, 0xf2, 0x38, 0xa5, 0xd4, 0xd0, 0xf9, 0x2f, 0x67, 0x1c, - 0x7f, 0x00, 0x77, 0x4a, 0x07, 0x3d, 0x65, 0xe2, 0x6c, 0xa4, 0x8c, 0x52, 0x72, 0x69, 0x06, 0x0d, - 0x7d, 0x60, 0x01, 0x98, 0xc1, 0xc8, 0xcd, 0x07, 0xa3, 0x6f, 0x5d, 0x00, 0xcb, 0x97, 0x6d, 0x68, - 0x8a, 0x94, 0x52, 0x19, 0xe0, 0x28, 0xd4, 0x8f, 0x6c, 0x03, 0xdb, 0x90, 0x3c, 0x9e, 0x04, 0x63, - 0xbd, 0xcb, 0x7a, 0x5c, 0x0e, 0xa0, 0xd7, 0xa0, 0xcd, 0x23, 0x92, 0xf0, 0xb3, 0x58, 0xec, 0x13, - 0x2e, 0x7f, 0x3e, 0x3d, 0x83, 0xcd, 0xa0, 0xf2, 0x1e, 0x33, 0xfd, 0xc9, 0x01, 0x41, 0xa5, 0xa3, - 0x85, 0x6d, 0xe8, 0x86, 0xbc, 0xd5, 0xfe, 0x5e, 0xde, 0x96, 0x67, 0xf2, 0x56, 0x4a, 0x48, 0x7d, - 0xa6, 0x6a, 0xba, 0x00, 0x8c, 0x1f, 0x19, 0xff, 0xbc, 0x15, 0xf5, 0x7c, 0x59, 0x88, 0xff, 0xbd, - 0xa3, 0x29, 0xfa, 0xcb, 0xac, 0x6f, 0x40, 0x8d, 0x04, 0xe3, 0x9c, 0x16, 0xbd, 0x41, 0x1f, 0x42, - 0x5b, 0xe4, 0xd6, 0xc7, 0xd3, 0x44, 0xb7, 0xad, 0xb6, 0x19, 0xa6, 0x8e, 0x4b, 0x22, 0x3c, 0xa3, - 0x5a, 0xf2, 0x7b, 0xe9, 0x86, 0x6a, 0xaf, 0x15, 0xd5, 0xbe, 0xfb, 0x10, 0xd0, 0xfc, 0x6f, 0x86, - 0x1a, 0x50, 0xeb, 0x87, 0x13, 0x16, 0x75, 0x2a, 0x08, 0x60, 0xf9, 0x69, 0xca, 0x04, 0x4d, 0x3b, - 0x8e, 0x5c, 0x63, 0x75, 0x55, 0xc7, 0x45, 0x4d, 0xa8, 0xeb, 0xd6, 0x16, 0x76, 0xaa, 0xbb, 0xaf, - 0x43, 0xbb, 0xec, 0x97, 0x54, 0xfd, 0xfc, 0xe4, 0x2b, 0x1a, 0x88, 0x4e, 0x45, 0x9e, 0x76, 0x94, - 0x90, 0x80, 0x76, 0x9c, 0xfd, 0x57, 0x7e, 0xbc, 0xea, 0x3a, 0x2f, 0xae, 0xba, 0xce, 0xaf, 0x57, - 0x5d, 0xe7, 0x9b, 0xeb, 0x6e, 0xe5, 0xc5, 0x75, 0xb7, 0xf2, 0xf3, 0x75, 0xb7, 0xf2, 0x65, 0x4d, - 0x0d, 0xfb, 0x27, 0xcb, 0x6a, 0xb6, 0x7f, 0xe7, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x25, - 0x31, 0x18, 0x0f, 0x0c, 0x00, 0x00, + 0x1a, 0x09, 0x26, 0xb2, 0x53, 0xf3, 0xbd, 0xe4, 0x82, 0x46, 0x41, 0x3a, 0x4d, 0x04, 0x8b, 0xa3, + 0x03, 0x3a, 0x35, 0xe5, 0x5f, 0x06, 0xd1, 0x9b, 0xb0, 0x6e, 0x00, 0x1a, 0x62, 0xcd, 0x92, 0x0e, + 0xb1, 0x85, 0xe7, 0x05, 0xe8, 0x7d, 0x68, 0x26, 0x79, 0xa5, 0x71, 0x55, 0x56, 0xed, 0xbd, 0x7b, + 0x8b, 0x0b, 0x94, 0x63, 0x5b, 0x17, 0x6d, 0x43, 0x93, 0x71, 0x93, 0x7e, 0x1a, 0xaa, 0xea, 0x5a, + 0xc1, 0x36, 0xe4, 0xff, 0xe0, 0x00, 0x14, 0xbf, 0xd5, 0xff, 0x28, 0x36, 0xff, 0x11, 0xb4, 0xcb, + 0xe5, 0x7e, 0xab, 0xf3, 0x5b, 0xd0, 0x30, 0xfd, 0x62, 0x14, 0x2a, 0xc7, 0x1b, 0xb8, 0x00, 0xfc, + 0xdf, 0x1d, 0x58, 0x2d, 0x15, 0x00, 0xda, 0x81, 0x35, 0x12, 0x04, 0x34, 0x11, 0x8f, 0xcf, 0x4f, + 0xc6, 0x2c, 0x38, 0x30, 0x15, 0xd4, 0xc2, 0xb3, 0x30, 0xda, 0x85, 0x8e, 0x89, 0xab, 0x50, 0xd5, + 0xcc, 0xcc, 0xe1, 0xff, 0x5d, 0xe2, 0x25, 0x15, 0x2a, 0x90, 0x91, 0xce, 0xba, 0xa4, 0xc2, 0xec, + 0xfd, 0x9f, 0x1c, 0x68, 0x5a, 0xbd, 0xe5, 0x25, 0xe4, 0x3c, 0x27, 0xeb, 0x28, 0x6f, 0xfb, 0x55, + 0x9b, 0xac, 0x1c, 0x46, 0x3e, 0xb4, 0x8a, 0xce, 0x37, 0x0a, 0x55, 0x4c, 0x0d, 0x5c, 0xc2, 0x16, + 0x93, 0x54, 0xbb, 0x81, 0x24, 0x7f, 0x92, 0x67, 0xce, 0x34, 0xf6, 0xdb, 0xc2, 0xf9, 0x18, 0xd6, + 0x4c, 0x57, 0xc2, 0x34, 0x19, 0x93, 0x20, 0xef, 0x2c, 0x77, 0x33, 0x56, 0x71, 0x49, 0x8c, 0x67, + 0xd5, 0xfd, 0xaf, 0x1d, 0x58, 0x9f, 0x53, 0x7b, 0x09, 0x14, 0x16, 0x55, 0x94, 0xc7, 0x66, 0x38, + 0x9c, 0xc3, 0xfd, 0x04, 0xee, 0xdd, 0xf0, 0x32, 0xdd, 0xea, 0xc8, 0x4c, 0x39, 0xb9, 0xff, 0xe0, + 0x5f, 0xfb, 0xce, 0x81, 0x46, 0xf1, 0xf2, 0xdf, 0x85, 0xe5, 0x24, 0xa5, 0x17, 0xa3, 0xd0, 0x5c, + 0x61, 0x76, 0xa5, 0xcb, 0xdd, 0x99, 0xcb, 0x11, 0x2c, 0x85, 0x44, 0x10, 0x13, 0x93, 0x5a, 0xa3, + 0x1e, 0xa0, 0xe0, 0x3c, 0x4d, 0x69, 0x24, 0x70, 0xf1, 0x54, 0xa8, 0x92, 0x58, 0xc2, 0x0b, 0x24, + 0xf2, 0x1f, 0x16, 0x6c, 0x42, 0xb9, 0x20, 0x93, 0x44, 0x55, 0x75, 0x15, 0x17, 0x80, 0xdf, 0x57, + 0x2e, 0x0e, 0x29, 0x09, 0x69, 0x2a, 0x87, 0x93, 0x67, 0x2c, 0xe5, 0x22, 0xf7, 0x31, 0xdb, 0xde, + 0xe6, 0xa4, 0xff, 0x29, 0xac, 0x62, 0x72, 0x79, 0x9c, 0x52, 0x6a, 0xe8, 0xfc, 0x97, 0x33, 0x8e, + 0x3f, 0x80, 0x3b, 0xa5, 0x83, 0x9e, 0x32, 0x71, 0x36, 0x52, 0x46, 0x29, 0xb9, 0x34, 0x83, 0x86, + 0x3e, 0xb0, 0x00, 0xcc, 0x60, 0xe4, 0xe6, 0x83, 0xd1, 0xb7, 0x2e, 0x80, 0xe5, 0xcb, 0x36, 0x34, + 0x45, 0x4a, 0xa9, 0x0c, 0x70, 0x14, 0xea, 0x47, 0xb6, 0x81, 0x6d, 0x48, 0x1e, 0x4f, 0x82, 0xb1, + 0xde, 0x65, 0x3d, 0x2e, 0x07, 0xd0, 0x6b, 0xd0, 0xe6, 0x11, 0x49, 0xf8, 0x59, 0x2c, 0xf6, 0x09, + 0x97, 0x3f, 0x9f, 0x9e, 0xc1, 0x66, 0x50, 0x79, 0x8f, 0x99, 0xfe, 0xe4, 0x80, 0xa0, 0xd2, 0xd1, + 0xc2, 0x36, 0x74, 0x43, 0xde, 0x6a, 0x7f, 0x2f, 0x6f, 0xcb, 0x33, 0x79, 0x2b, 0x25, 0xa4, 0x3e, + 0x53, 0x35, 0x5d, 0x00, 0xc6, 0x8f, 0x8c, 0x7f, 0xde, 0x8a, 0x7a, 0xbe, 0x2c, 0xc4, 0xff, 0xde, + 0xd1, 0x14, 0xfd, 0x65, 0xd6, 0x37, 0xa0, 0x46, 0x82, 0x71, 0x4e, 0x8b, 0xde, 0xa0, 0x0f, 0xa1, + 0x2d, 0x72, 0xeb, 0xe3, 0x69, 0xa2, 0xdb, 0x56, 0xdb, 0x0c, 0x53, 0xc7, 0x25, 0x11, 0x9e, 0x51, + 0x2d, 0xf9, 0xbd, 0x74, 0x43, 0xb5, 0xd7, 0x8a, 0x6a, 0xdf, 0x7d, 0x08, 0x68, 0xfe, 0x37, 0x43, + 0x0d, 0xa8, 0xf5, 0xc3, 0x09, 0x8b, 0x3a, 0x15, 0x04, 0xb0, 0xfc, 0x34, 0x65, 0x82, 0xa6, 0x1d, + 0x47, 0xae, 0xb1, 0xba, 0xaa, 0xe3, 0xa2, 0x26, 0xd4, 0x75, 0x6b, 0x0b, 0x3b, 0xd5, 0xdd, 0xd7, + 0xa1, 0x5d, 0xf6, 0x4b, 0xaa, 0x7e, 0x7e, 0xf2, 0x15, 0x0d, 0x44, 0xa7, 0x22, 0x4f, 0x3b, 0x4a, + 0x48, 0x40, 0x3b, 0xce, 0xfe, 0x2b, 0x3f, 0x5e, 0x75, 0x9d, 0x17, 0x57, 0x5d, 0xe7, 0xd7, 0xab, + 0xae, 0xf3, 0xcd, 0x75, 0xb7, 0xf2, 0xe2, 0xba, 0x5b, 0xf9, 0xf9, 0xba, 0x5b, 0xf9, 0xb2, 0xa6, + 0x86, 0xfd, 0x93, 0x65, 0x35, 0xdb, 0xbf, 0xf3, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xb7, + 0x4f, 0x73, 0x0f, 0x0c, 0x00, 0x00, } func (m *RawACLRecord) Marshal() (dAtA []byte, err error) { @@ -3735,7 +3735,7 @@ func (m *ACLUserState) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -3745,25 +3745,23 @@ func (m *ACLUserState) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } + m.Identity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -3924,7 +3922,7 @@ func (m *ACLUserAdd) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -3934,25 +3932,23 @@ func (m *ACLUserAdd) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } + m.Identity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -4093,7 +4089,7 @@ func (m *ACLUserConfirm) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4103,25 +4099,23 @@ func (m *ACLUserConfirm) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } + m.Identity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -4410,7 +4404,7 @@ func (m *ACLUserJoin) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4420,25 +4414,23 @@ func (m *ACLUserJoin) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } + m.Identity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -4626,7 +4618,7 @@ func (m *ACLUserRemove) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4636,25 +4628,23 @@ func (m *ACLUserRemove) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } + m.Identity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { @@ -4744,7 +4734,7 @@ func (m *ACLReadKeyReplace) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4754,25 +4744,23 @@ func (m *ACLReadKeyReplace) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } + m.Identity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -4896,7 +4884,7 @@ func (m *ACLUserPermissionChange) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4906,25 +4894,23 @@ func (m *ACLUserPermissionChange) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } + m.Identity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 0 { @@ -5031,7 +5017,7 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5041,25 +5027,23 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } + m.Identity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { @@ -5219,7 +5203,7 @@ func (m *ACLHeader) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5229,25 +5213,23 @@ func (m *ACLHeader) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } + m.Identity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -5705,7 +5687,7 @@ func (m *TreeChange) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5715,25 +5697,23 @@ func (m *TreeChange) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } + m.Identity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 8: if wireType != 0 { @@ -5892,7 +5872,7 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5902,25 +5882,23 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } + m.Identity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 5: if wireType != 2 { diff --git a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto index 73a3fc1f..2ac1e5f7 100644 --- a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto +++ b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto @@ -33,7 +33,7 @@ message ACLState { } message ACLUserState { - bytes identity = 1; + string identity = 1; bytes encryptionKey = 2; repeated bytes encryptedReadKeys = 3; // all read keys that we know ACLUserPermissions permissions = 4; @@ -42,7 +42,7 @@ message ACLUserState { // we already know identity and encryptionKey message ACLUserAdd { - bytes identity = 1; // public signing key + string identity = 1; // public signing key bytes encryptionKey = 2; // public encryption key repeated bytes encryptedReadKeys = 3; // all read keys that we know for the user ACLUserPermissions permissions = 4; @@ -50,7 +50,7 @@ message ACLUserAdd { // TODO: this is not used as of now message ACLUserConfirm { // not needed for read permissions - bytes identity = 1; // not needed + string identity = 1; // not needed string userAddId = 2; } @@ -63,7 +63,7 @@ message ACLUserInvite { } message ACLUserJoin { - bytes identity = 1; + string identity = 1; bytes encryptionKey = 2; bytes acceptSignature = 3; // sign acceptPublicKey string userInviteId = 4; @@ -71,18 +71,18 @@ message ACLUserJoin { } message ACLUserRemove { - bytes identity = 1; + string identity = 1; repeated ACLReadKeyReplace readKeyReplaces = 3; // new read key encrypted for all users } message ACLReadKeyReplace { - bytes identity = 1; + string identity = 1; bytes encryptionKey = 2; bytes encryptedReadKey = 3; } message ACLUserPermissionChange { - bytes identity = 1; + string identity = 1; ACLUserPermissions permissions = 2; } @@ -95,7 +95,7 @@ enum ACLUserPermissions { message ACLRecord { string prevId = 1; - bytes identity = 2; + string identity = 2; bytes data = 3; uint64 currentReadKeyHash = 4; int64 timestamp = 5; @@ -103,7 +103,7 @@ message ACLRecord { message ACLHeader { string firstId = 1; - bytes identity = 2; // the identity of the creator + string identity = 2; // the identity of the creator } // Tree protos @@ -125,7 +125,7 @@ message TreeChange { bytes changesData = 4; uint64 currentReadKeyHash = 5; int64 timestamp = 6; - bytes identity = 7; + string identity = 7; bool isSnapshot = 8; } @@ -138,6 +138,6 @@ message TreeHeader { string firstId = 1; string aclId = 2; TreeHeaderType treeHeaderType = 3; - bytes identity = 4; + string identity = 4; bytes data = 5; // this should be reserved for the client to add the data it needs } diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index d7a849fb..fceeaadc 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -1,7 +1,6 @@ package list import ( - "bytes" "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" @@ -148,7 +147,7 @@ func (st *ACLState) applyChangeAndUpdate(recordWrapper *ACLRecord) (err error) { var permissions []UserPermissionPair for _, state := range st.userStates { permission := UserPermissionPair{ - Identity: string(state.Identity), + Identity: state.Identity, Permission: state.Permissions, } permissions = append(permissions, permission) @@ -158,7 +157,7 @@ func (st *ACLState) applyChangeAndUpdate(recordWrapper *ACLRecord) (err error) { return nil } -func (st *ACLState) applyChangeData(changeData *aclpb.ACLData, hash uint64, identity []byte) (err error) { +func (st *ACLState) applyChangeData(changeData *aclpb.ACLData, hash uint64, identity string) (err error) { defer func() { if err != nil { return @@ -171,7 +170,7 @@ func (st *ACLState) applyChangeData(changeData *aclpb.ACLData, hash uint64, iden skipIdentityCheck := st.isUserJoin(changeData) || (st.currentReadKeyHash == 0 && st.isUserAdd(changeData, identity)) if !skipIdentityCheck { // we check signature when we add this to the Tree, so no need to do it here - if _, exists := st.userStates[string(identity)]; !exists { + if _, exists := st.userStates[identity]; !exists { err = ErrNoSuchUser return } @@ -212,12 +211,11 @@ func (st *ACLState) applyChangeContent(ch *aclpb.ACLContentValue) error { } func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLUserPermissionChange) error { - chIdentity := string(ch.Identity) - if _, exists := st.userStates[chIdentity]; !exists { + if _, exists := st.userStates[ch.Identity]; !exists { return ErrNoSuchUser } - st.userStates[chIdentity].Permissions = ch.Permissions + st.userStates[ch.Identity].Permissions = ch.Permissions return nil } @@ -231,9 +229,8 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { if !exists { return fmt.Errorf("no such invite with id %s", ch.UserInviteId) } - chIdentity := string(ch.Identity) - if _, exists = st.userStates[chIdentity]; exists { + if _, exists = st.userStates[ch.Identity]; exists { return ErrUserAlreadyExists } @@ -244,7 +241,7 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { return fmt.Errorf("public key verifying invite accepts is given in incorrect format: %v", err) } - res, err := verificationKey.(signingkey.PubKey).Verify(ch.Identity, signature) + res, err := verificationKey.(signingkey.PubKey).Verify([]byte(ch.Identity), signature) if err != nil { return fmt.Errorf("verification returned error: %w", err) } @@ -253,7 +250,7 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { } // if ourselves -> we need to decrypt the read keys - if st.identity == chIdentity { + if st.identity == ch.Identity { for _, key := range ch.EncryptedReadKeys { key, hash, err := st.decryptReadKeyAndHash(key) if err != nil { @@ -272,24 +269,23 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { Permissions: invite.Permissions, IsConfirmed: true, } - st.userStates[chIdentity] = userState + st.userStates[ch.Identity] = userState return nil } func (st *ACLState) applyUserAdd(ch *aclpb.ACLUserAdd) error { - chIdentity := string(ch.Identity) - if _, exists := st.userStates[chIdentity]; exists { + if _, exists := st.userStates[ch.Identity]; exists { return ErrUserAlreadyExists } - st.userStates[chIdentity] = &aclpb.ACLUserState{ + st.userStates[ch.Identity] = &aclpb.ACLUserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, Permissions: ch.Permissions, EncryptedReadKeys: ch.EncryptedReadKeys, } - if chIdentity == st.identity { + if ch.Identity == st.identity { for _, key := range ch.EncryptedReadKeys { key, hash, err := st.decryptReadKeyAndHash(key) if err != nil { @@ -304,16 +300,15 @@ func (st *ACLState) applyUserAdd(ch *aclpb.ACLUserAdd) error { } func (st *ACLState) applyUserRemove(ch *aclpb.ACLUserRemove) error { - chIdentity := string(ch.Identity) - if chIdentity == st.identity { + if ch.Identity == st.identity { return ErrDocumentForbidden } - if _, exists := st.userStates[chIdentity]; !exists { + if _, exists := st.userStates[ch.Identity]; !exists { return ErrNoSuchUser } - delete(st.userStates, chIdentity) + delete(st.userStates, ch.Identity) for _, replace := range ch.ReadKeyReplaces { repIdentity := string(replace.Identity) @@ -364,8 +359,8 @@ func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, e return key, hasher.Sum64(), nil } -func (st *ACLState) hasPermission(identity []byte, permission aclpb.ACLUserPermissions) bool { - state, exists := st.userStates[string(identity)] +func (st *ACLState) hasPermission(identity string, permission aclpb.ACLUserPermissions) bool { + state, exists := st.userStates[identity] if !exists { return false } @@ -378,10 +373,13 @@ func (st *ACLState) isUserJoin(data *aclpb.ACLData) bool { return data.GetAclContent() != nil && data.GetAclContent()[0].GetUserJoin() != nil } -func (st *ACLState) isUserAdd(data *aclpb.ACLData, identity []byte) bool { +func (st *ACLState) isUserAdd(data *aclpb.ACLData, identity string) bool { + if len(data.GetAclContent()) == 0 { + return false + } // if we have a UserAdd, then it should always be the first one applied userAdd := data.GetAclContent()[0].GetUserAdd() - return data.GetAclContent() != nil && userAdd != nil && bytes.Compare(userAdd.GetIdentity(), identity) == 0 + return data.GetAclContent() != nil && userAdd != nil && userAdd.GetIdentity() == identity } func (st *ACLState) GetUserStates() map[string]*aclpb.ACLUserState { diff --git a/pkg/acl/list/changebuilder.go b/pkg/acl/list/changebuilder.go index c6413cb0..52a44e18 100644 --- a/pkg/acl/list/changebuilder.go +++ b/pkg/acl/list/changebuilder.go @@ -82,7 +82,7 @@ func (c *aclChangeBuilder) UserAdd(identity string, encryptionKey encryptionkey. ch := &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserAdd{ UserAdd: &aclpb.ACLUserAdd{ - Identity: []byte(identity), + Identity: identity, EncryptionKey: rawKey, EncryptedReadKeys: encryptedKeys, Permissions: permissions, @@ -98,7 +98,7 @@ func (c *aclChangeBuilder) BuildAndApply() (*ACLRecord, []byte, error) { PrevId: c.list.Head().Id, CurrentReadKeyHash: c.readKeyHash, Timestamp: int64(time.Now().Nanosecond()), - Identity: c.acc.Identity, + Identity: string(c.acc.Identity), } marshalledData, err := proto.Marshal(c.aclData) diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index c6d8703a..fb73d450 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -146,7 +146,7 @@ func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclpb.A return &aclpb.ACLRecord{ PrevId: prevId, - Identity: []byte(t.keychain.GetIdentity(rec.Identity)), + Identity: t.keychain.GetIdentity(rec.Identity), Data: bytes, CurrentReadKeyHash: k.Hash, Timestamp: time.Now().Unix(), @@ -164,7 +164,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserAdd{ UserAdd: &aclpb.ACLUserAdd{ - Identity: []byte(t.keychain.GetIdentity(add.Identity)), + Identity: t.keychain.GetIdentity(add.Identity), EncryptionKey: rawKey, EncryptedReadKeys: t.encryptReadKeys(add.EncryptedReadKeys, encKey), Permissions: t.convertPermission(add.Permission), @@ -188,7 +188,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserJoin{ UserJoin: &aclpb.ACLUserJoin{ - Identity: []byte(t.keychain.GetIdentity(join.Identity)), + Identity: t.keychain.GetIdentity(join.Identity), EncryptionKey: rawKey, AcceptSignature: signature, UserInviteId: join.InviteId, @@ -220,7 +220,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserConfirm{ UserConfirm: &aclpb.ACLUserConfirm{ - Identity: []byte(t.keychain.GetIdentity(confirm.Identity)), + Identity: t.keychain.GetIdentity(confirm.Identity), UserAddId: confirm.UserAddId, }, }, @@ -231,7 +231,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserPermissionChange{ UserPermissionChange: &aclpb.ACLUserPermissionChange{ - Identity: []byte(t.keychain.GetIdentity(permissionChange.Identity)), + Identity: t.keychain.GetIdentity(permissionChange.Identity), Permissions: t.convertPermission(permissionChange.Permission), }, }, @@ -251,7 +251,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL panic(err) } replaces = append(replaces, &aclpb.ACLReadKeyReplace{ - Identity: []byte(identity), + Identity: identity, EncryptionKey: rawEncKey, EncryptedReadKey: encReadKey, }) @@ -260,7 +260,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserRemove{ UserRemove: &aclpb.ACLUserRemove{ - Identity: []byte(t.keychain.GetIdentity(remove.RemovedIdentity)), + Identity: t.keychain.GetIdentity(remove.RemovedIdentity), ReadKeyReplaces: replaces, }, }, diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index cefc9327..930a7abc 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -65,7 +65,6 @@ func NewChange(id string, ch *aclpb.TreeChange, signature []byte) *Change { Content: ch, SnapshotId: ch.SnapshotBaseId, IsSnapshot: ch.IsSnapshot, - Identity: string(ch.Identity), Sign: signature, } } diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index 67985c82..c58cf218 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -18,7 +18,7 @@ type BuilderContent struct { aclHeadId string snapshotBaseId string currentReadKeyHash uint64 - identity []byte + identity string isSnapshot bool signingKey signingkey.PrivKey readKey *symmetric.Key diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index bbc337cf..1dfac831 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -43,7 +43,7 @@ func (v *objectTreeValidator) validateChange(tree *Tree, aclList list.ACLList, c state = aclList.ACLState() ) // checking if the user could write - perm, err = state.PermissionsAtRecord(c.Content.AclHeadId, c.Identity) + perm, err = state.PermissionsAtRecord(c.Content.AclHeadId, c.Content.Identity) if err != nil { return } diff --git a/pkg/acl/tree/objecttreefactory.go b/pkg/acl/tree/objecttreefactory.go index a62c8add..01afdc92 100644 --- a/pkg/acl/tree/objecttreefactory.go +++ b/pkg/acl/tree/objecttreefactory.go @@ -142,7 +142,7 @@ func createTreeHeaderAndId( raw *aclpb.RawTreeChangeWithId, treeType aclpb.TreeHeaderType, aclId string, - identity []byte, + identity string, headerData []byte) (header *aclpb.TreeHeader, treeId string, err error) { header = &aclpb.TreeHeader{ FirstId: raw.Id, diff --git a/pkg/acl/tree/signablecontent.go b/pkg/acl/tree/signablecontent.go index 4774c2fb..b51d1dea 100644 --- a/pkg/acl/tree/signablecontent.go +++ b/pkg/acl/tree/signablecontent.go @@ -7,6 +7,6 @@ import ( type SignableChangeContent struct { Data []byte Key signingkey.PrivKey - Identity []byte + Identity string IsSnapshot bool } From 7a62b348cd5be34d175b6573811a48161c5c0186 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 13 Sep 2022 12:26:37 +0200 Subject: [PATCH 065/219] Revert "Use string instead of bytes, to simplify code" This reverts commit a907cde3993868dbf27938fe609fd2bbc02db2b5. --- pkg/acl/account/accountdata.go | 3 +- pkg/acl/aclchanges/aclpb/aclchanges.pb.go | 296 ++++++++++-------- .../aclchanges/aclpb/protos/aclchanges.proto | 22 +- pkg/acl/list/aclstate.go | 46 +-- pkg/acl/list/changebuilder.go | 4 +- .../acllistbuilder/liststoragebuilder.go | 14 +- pkg/acl/tree/change.go | 1 + pkg/acl/tree/changebuilder.go | 2 +- pkg/acl/tree/changevalidator.go | 2 +- pkg/acl/tree/objecttreefactory.go | 2 +- pkg/acl/tree/signablecontent.go | 2 +- 11 files changed, 209 insertions(+), 185 deletions(-) diff --git a/pkg/acl/account/accountdata.go b/pkg/acl/account/accountdata.go index 1bf30c95..bc775854 100644 --- a/pkg/acl/account/accountdata.go +++ b/pkg/acl/account/accountdata.go @@ -7,8 +7,7 @@ import ( ) type AccountData struct { // TODO: create a convenient constructor for this - // Identity is non utf8 encoded, but we use this type, to eliminate copying between []byte to string conversions - Identity string + Identity []byte // TODO: this is essentially the same as sign key SignKey signingkey.PrivKey EncKey encryptionkey.PrivKey Decoder keys.Decoder diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go index 9c7c75b4..ecd124b1 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go @@ -380,7 +380,7 @@ func (m *ACLState) GetInvites() map[string]*ACLUserInvite { } type ACLUserState struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` @@ -420,11 +420,11 @@ func (m *ACLUserState) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserState proto.InternalMessageInfo -func (m *ACLUserState) GetIdentity() string { +func (m *ACLUserState) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } func (m *ACLUserState) GetEncryptionKey() []byte { @@ -457,7 +457,7 @@ func (m *ACLUserState) GetIsConfirmed() bool { // we already know identity and encryptionKey type ACLUserAdd struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` @@ -496,11 +496,11 @@ func (m *ACLUserAdd) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserAdd proto.InternalMessageInfo -func (m *ACLUserAdd) GetIdentity() string { +func (m *ACLUserAdd) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } func (m *ACLUserAdd) GetEncryptionKey() []byte { @@ -526,7 +526,7 @@ func (m *ACLUserAdd) GetPermissions() ACLUserPermissions { // TODO: this is not used as of now type ACLUserConfirm struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` UserAddId string `protobuf:"bytes,2,opt,name=userAddId,proto3" json:"userAddId,omitempty"` } @@ -563,11 +563,11 @@ func (m *ACLUserConfirm) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserConfirm proto.InternalMessageInfo -func (m *ACLUserConfirm) GetIdentity() string { +func (m *ACLUserConfirm) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } func (m *ACLUserConfirm) GetUserAddId() string { @@ -654,7 +654,7 @@ func (m *ACLUserInvite) GetInviteId() string { } type ACLUserJoin struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` AcceptSignature []byte `protobuf:"bytes,3,opt,name=acceptSignature,proto3" json:"acceptSignature,omitempty"` UserInviteId string `protobuf:"bytes,4,opt,name=userInviteId,proto3" json:"userInviteId,omitempty"` @@ -694,11 +694,11 @@ func (m *ACLUserJoin) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserJoin proto.InternalMessageInfo -func (m *ACLUserJoin) GetIdentity() string { +func (m *ACLUserJoin) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } func (m *ACLUserJoin) GetEncryptionKey() []byte { @@ -730,7 +730,7 @@ func (m *ACLUserJoin) GetEncryptedReadKeys() [][]byte { } type ACLUserRemove struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` ReadKeyReplaces []*ACLReadKeyReplace `protobuf:"bytes,3,rep,name=readKeyReplaces,proto3" json:"readKeyReplaces,omitempty"` } @@ -767,11 +767,11 @@ func (m *ACLUserRemove) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserRemove proto.InternalMessageInfo -func (m *ACLUserRemove) GetIdentity() string { +func (m *ACLUserRemove) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } func (m *ACLUserRemove) GetReadKeyReplaces() []*ACLReadKeyReplace { @@ -782,7 +782,7 @@ func (m *ACLUserRemove) GetReadKeyReplaces() []*ACLReadKeyReplace { } type ACLReadKeyReplace struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKey []byte `protobuf:"bytes,3,opt,name=encryptedReadKey,proto3" json:"encryptedReadKey,omitempty"` } @@ -820,11 +820,11 @@ func (m *ACLReadKeyReplace) XXX_DiscardUnknown() { var xxx_messageInfo_ACLReadKeyReplace proto.InternalMessageInfo -func (m *ACLReadKeyReplace) GetIdentity() string { +func (m *ACLReadKeyReplace) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } func (m *ACLReadKeyReplace) GetEncryptionKey() []byte { @@ -842,7 +842,7 @@ func (m *ACLReadKeyReplace) GetEncryptedReadKey() []byte { } type ACLUserPermissionChange struct { - Identity string `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` Permissions ACLUserPermissions `protobuf:"varint,2,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` } @@ -879,11 +879,11 @@ func (m *ACLUserPermissionChange) XXX_DiscardUnknown() { var xxx_messageInfo_ACLUserPermissionChange proto.InternalMessageInfo -func (m *ACLUserPermissionChange) GetIdentity() string { +func (m *ACLUserPermissionChange) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } func (m *ACLUserPermissionChange) GetPermissions() ACLUserPermissions { @@ -895,7 +895,7 @@ func (m *ACLUserPermissionChange) GetPermissions() ACLUserPermissions { type ACLRecord struct { PrevId string `protobuf:"bytes,1,opt,name=prevId,proto3" json:"prevId,omitempty"` - Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` CurrentReadKeyHash uint64 `protobuf:"varint,4,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` Timestamp int64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` @@ -941,11 +941,11 @@ func (m *ACLRecord) GetPrevId() string { return "" } -func (m *ACLRecord) GetIdentity() string { +func (m *ACLRecord) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } func (m *ACLRecord) GetData() []byte { @@ -971,7 +971,7 @@ func (m *ACLRecord) GetTimestamp() int64 { type ACLHeader struct { FirstId string `protobuf:"bytes,1,opt,name=firstId,proto3" json:"firstId,omitempty"` - Identity string `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` } func (m *ACLHeader) Reset() { *m = ACLHeader{} } @@ -1014,11 +1014,11 @@ func (m *ACLHeader) GetFirstId() string { return "" } -func (m *ACLHeader) GetIdentity() string { +func (m *ACLHeader) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } type RawTreeChange struct { @@ -1132,7 +1132,7 @@ type TreeChange struct { ChangesData []byte `protobuf:"bytes,4,opt,name=changesData,proto3" json:"changesData,omitempty"` CurrentReadKeyHash uint64 `protobuf:"varint,5,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` Timestamp int64 `protobuf:"varint,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Identity string `protobuf:"bytes,7,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,7,opt,name=identity,proto3" json:"identity,omitempty"` IsSnapshot bool `protobuf:"varint,8,opt,name=isSnapshot,proto3" json:"isSnapshot,omitempty"` } @@ -1211,11 +1211,11 @@ func (m *TreeChange) GetTimestamp() int64 { return 0 } -func (m *TreeChange) GetIdentity() string { +func (m *TreeChange) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } func (m *TreeChange) GetIsSnapshot() bool { @@ -1229,7 +1229,7 @@ type TreeHeader struct { FirstId string `protobuf:"bytes,1,opt,name=firstId,proto3" json:"firstId,omitempty"` AclId string `protobuf:"bytes,2,opt,name=aclId,proto3" json:"aclId,omitempty"` TreeHeaderType TreeHeaderType `protobuf:"varint,3,opt,name=treeHeaderType,proto3,enum=acl.TreeHeaderType" json:"treeHeaderType,omitempty"` - Identity string `protobuf:"bytes,4,opt,name=identity,proto3" json:"identity,omitempty"` + Identity []byte `protobuf:"bytes,4,opt,name=identity,proto3" json:"identity,omitempty"` Data []byte `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` } @@ -1287,11 +1287,11 @@ func (m *TreeHeader) GetTreeHeaderType() TreeHeaderType { return TreeHeaderType_Object } -func (m *TreeHeader) GetIdentity() string { +func (m *TreeHeader) GetIdentity() []byte { if m != nil { return m.Identity } - return "" + return nil } func (m *TreeHeader) GetData() []byte { @@ -1361,44 +1361,44 @@ var fileDescriptor_37a022c841a51877 = []byte{ 0xf8, 0x27, 0x91, 0x48, 0xa7, 0x38, 0x53, 0xdd, 0xfc, 0x0c, 0x5a, 0xb6, 0x00, 0x75, 0xa0, 0xfa, 0x9c, 0x4e, 0x55, 0x1d, 0x35, 0xb0, 0x5c, 0xa2, 0x1d, 0xc3, 0xc3, 0xa2, 0x5a, 0xd1, 0xa6, 0x58, 0x2b, 0x7c, 0xe0, 0xbe, 0xe7, 0xf8, 0xbf, 0x38, 0xd0, 0xb2, 0x5d, 0x44, 0x9b, 0xb0, 0xc2, 0x42, - 0x1a, 0x09, 0x26, 0xb2, 0x53, 0xf3, 0xbd, 0xe4, 0x82, 0x46, 0x41, 0x3a, 0x4d, 0x04, 0x8b, 0xa3, - 0x03, 0x3a, 0x35, 0xe5, 0x5f, 0x06, 0xd1, 0x9b, 0xb0, 0x6e, 0x00, 0x1a, 0x62, 0xcd, 0x92, 0x0e, - 0xb1, 0x85, 0xe7, 0x05, 0xe8, 0x7d, 0x68, 0x26, 0x79, 0xa5, 0x71, 0x55, 0x56, 0xed, 0xbd, 0x7b, - 0x8b, 0x0b, 0x94, 0x63, 0x5b, 0x17, 0x6d, 0x43, 0x93, 0x71, 0x93, 0x7e, 0x1a, 0xaa, 0xea, 0x5a, - 0xc1, 0x36, 0xe4, 0xff, 0xe0, 0x00, 0x14, 0xbf, 0xd5, 0xff, 0x28, 0x36, 0xff, 0x11, 0xb4, 0xcb, - 0xe5, 0x7e, 0xab, 0xf3, 0x5b, 0xd0, 0x30, 0xfd, 0x62, 0x14, 0x2a, 0xc7, 0x1b, 0xb8, 0x00, 0xfc, - 0xdf, 0x1d, 0x58, 0x2d, 0x15, 0x00, 0xda, 0x81, 0x35, 0x12, 0x04, 0x34, 0x11, 0x8f, 0xcf, 0x4f, - 0xc6, 0x2c, 0x38, 0x30, 0x15, 0xd4, 0xc2, 0xb3, 0x30, 0xda, 0x85, 0x8e, 0x89, 0xab, 0x50, 0xd5, - 0xcc, 0xcc, 0xe1, 0xff, 0x5d, 0xe2, 0x25, 0x15, 0x2a, 0x90, 0x91, 0xce, 0xba, 0xa4, 0xc2, 0xec, - 0xfd, 0x9f, 0x1c, 0x68, 0x5a, 0xbd, 0xe5, 0x25, 0xe4, 0x3c, 0x27, 0xeb, 0x28, 0x6f, 0xfb, 0x55, - 0x9b, 0xac, 0x1c, 0x46, 0x3e, 0xb4, 0x8a, 0xce, 0x37, 0x0a, 0x55, 0x4c, 0x0d, 0x5c, 0xc2, 0x16, - 0x93, 0x54, 0xbb, 0x81, 0x24, 0x7f, 0x92, 0x67, 0xce, 0x34, 0xf6, 0xdb, 0xc2, 0xf9, 0x18, 0xd6, - 0x4c, 0x57, 0xc2, 0x34, 0x19, 0x93, 0x20, 0xef, 0x2c, 0x77, 0x33, 0x56, 0x71, 0x49, 0x8c, 0x67, - 0xd5, 0xfd, 0xaf, 0x1d, 0x58, 0x9f, 0x53, 0x7b, 0x09, 0x14, 0x16, 0x55, 0x94, 0xc7, 0x66, 0x38, - 0x9c, 0xc3, 0xfd, 0x04, 0xee, 0xdd, 0xf0, 0x32, 0xdd, 0xea, 0xc8, 0x4c, 0x39, 0xb9, 0xff, 0xe0, - 0x5f, 0xfb, 0xce, 0x81, 0x46, 0xf1, 0xf2, 0xdf, 0x85, 0xe5, 0x24, 0xa5, 0x17, 0xa3, 0xd0, 0x5c, - 0x61, 0x76, 0xa5, 0xcb, 0xdd, 0x99, 0xcb, 0x11, 0x2c, 0x85, 0x44, 0x10, 0x13, 0x93, 0x5a, 0xa3, - 0x1e, 0xa0, 0xe0, 0x3c, 0x4d, 0x69, 0x24, 0x70, 0xf1, 0x54, 0xa8, 0x92, 0x58, 0xc2, 0x0b, 0x24, - 0xf2, 0x1f, 0x16, 0x6c, 0x42, 0xb9, 0x20, 0x93, 0x44, 0x55, 0x75, 0x15, 0x17, 0x80, 0xdf, 0x57, - 0x2e, 0x0e, 0x29, 0x09, 0x69, 0x2a, 0x87, 0x93, 0x67, 0x2c, 0xe5, 0x22, 0xf7, 0x31, 0xdb, 0xde, - 0xe6, 0xa4, 0xff, 0x29, 0xac, 0x62, 0x72, 0x79, 0x9c, 0x52, 0x6a, 0xe8, 0xfc, 0x97, 0x33, 0x8e, - 0x3f, 0x80, 0x3b, 0xa5, 0x83, 0x9e, 0x32, 0x71, 0x36, 0x52, 0x46, 0x29, 0xb9, 0x34, 0x83, 0x86, - 0x3e, 0xb0, 0x00, 0xcc, 0x60, 0xe4, 0xe6, 0x83, 0xd1, 0xb7, 0x2e, 0x80, 0xe5, 0xcb, 0x36, 0x34, - 0x45, 0x4a, 0xa9, 0x0c, 0x70, 0x14, 0xea, 0x47, 0xb6, 0x81, 0x6d, 0x48, 0x1e, 0x4f, 0x82, 0xb1, - 0xde, 0x65, 0x3d, 0x2e, 0x07, 0xd0, 0x6b, 0xd0, 0xe6, 0x11, 0x49, 0xf8, 0x59, 0x2c, 0xf6, 0x09, - 0x97, 0x3f, 0x9f, 0x9e, 0xc1, 0x66, 0x50, 0x79, 0x8f, 0x99, 0xfe, 0xe4, 0x80, 0xa0, 0xd2, 0xd1, - 0xc2, 0x36, 0x74, 0x43, 0xde, 0x6a, 0x7f, 0x2f, 0x6f, 0xcb, 0x33, 0x79, 0x2b, 0x25, 0xa4, 0x3e, - 0x53, 0x35, 0x5d, 0x00, 0xc6, 0x8f, 0x8c, 0x7f, 0xde, 0x8a, 0x7a, 0xbe, 0x2c, 0xc4, 0xff, 0xde, - 0xd1, 0x14, 0xfd, 0x65, 0xd6, 0x37, 0xa0, 0x46, 0x82, 0x71, 0x4e, 0x8b, 0xde, 0xa0, 0x0f, 0xa1, - 0x2d, 0x72, 0xeb, 0xe3, 0x69, 0xa2, 0xdb, 0x56, 0xdb, 0x0c, 0x53, 0xc7, 0x25, 0x11, 0x9e, 0x51, - 0x2d, 0xf9, 0xbd, 0x74, 0x43, 0xb5, 0xd7, 0x8a, 0x6a, 0xdf, 0x7d, 0x08, 0x68, 0xfe, 0x37, 0x43, - 0x0d, 0xa8, 0xf5, 0xc3, 0x09, 0x8b, 0x3a, 0x15, 0x04, 0xb0, 0xfc, 0x34, 0x65, 0x82, 0xa6, 0x1d, - 0x47, 0xae, 0xb1, 0xba, 0xaa, 0xe3, 0xa2, 0x26, 0xd4, 0x75, 0x6b, 0x0b, 0x3b, 0xd5, 0xdd, 0xd7, - 0xa1, 0x5d, 0xf6, 0x4b, 0xaa, 0x7e, 0x7e, 0xf2, 0x15, 0x0d, 0x44, 0xa7, 0x22, 0x4f, 0x3b, 0x4a, - 0x48, 0x40, 0x3b, 0xce, 0xfe, 0x2b, 0x3f, 0x5e, 0x75, 0x9d, 0x17, 0x57, 0x5d, 0xe7, 0xd7, 0xab, - 0xae, 0xf3, 0xcd, 0x75, 0xb7, 0xf2, 0xe2, 0xba, 0x5b, 0xf9, 0xf9, 0xba, 0x5b, 0xf9, 0xb2, 0xa6, - 0x86, 0xfd, 0x93, 0x65, 0x35, 0xdb, 0xbf, 0xf3, 0x67, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xb7, - 0x4f, 0x73, 0x0f, 0x0c, 0x00, 0x00, + 0x1a, 0x09, 0x26, 0xa6, 0xa6, 0xf2, 0xf3, 0xbd, 0xe4, 0x82, 0x46, 0x41, 0x3a, 0x4d, 0x04, 0x8b, + 0xa3, 0x03, 0x3a, 0x35, 0xe5, 0x5f, 0x06, 0xd1, 0x9b, 0xb0, 0x6e, 0x00, 0x1a, 0x62, 0xcd, 0x92, + 0x0e, 0xb1, 0x85, 0xe7, 0x05, 0xe8, 0x7d, 0x68, 0x26, 0x79, 0xa5, 0x71, 0x55, 0x56, 0xed, 0xbd, + 0x7b, 0x8b, 0x0b, 0x94, 0x63, 0x5b, 0x17, 0x6d, 0x43, 0x93, 0x71, 0x93, 0x7e, 0x1a, 0xaa, 0xea, + 0x5a, 0xc1, 0x36, 0xe4, 0xff, 0xe0, 0x00, 0x14, 0xbf, 0xd5, 0xff, 0x28, 0x36, 0xff, 0x11, 0xb4, + 0xcb, 0xe5, 0x7e, 0xab, 0xf3, 0x5b, 0xd0, 0x30, 0xfd, 0x62, 0x14, 0x2a, 0xc7, 0x1b, 0xb8, 0x00, + 0xfc, 0xdf, 0x1d, 0x58, 0x2d, 0x15, 0x00, 0xda, 0x81, 0x35, 0x12, 0x04, 0x34, 0x11, 0x8f, 0xcf, + 0x4f, 0xc6, 0x2c, 0x38, 0xa0, 0xd9, 0x91, 0xb3, 0x30, 0xda, 0x85, 0x8e, 0x89, 0xab, 0x50, 0xd5, + 0xcc, 0xcc, 0xe1, 0xff, 0x5d, 0xe2, 0x25, 0x15, 0x2a, 0x90, 0x91, 0xce, 0x7a, 0x03, 0xe7, 0x7b, + 0xff, 0x27, 0x07, 0x9a, 0x56, 0x6f, 0x79, 0x09, 0x39, 0xcf, 0xc9, 0x3a, 0xca, 0xdb, 0x7e, 0xd5, + 0x26, 0x2b, 0x87, 0x91, 0x0f, 0xad, 0xa2, 0xf3, 0x8d, 0x42, 0x15, 0x53, 0x03, 0x97, 0xb0, 0xc5, + 0x24, 0xd5, 0x6e, 0x20, 0xc9, 0x9f, 0xe4, 0x99, 0x33, 0x8d, 0xfd, 0xb6, 0x70, 0x3e, 0x86, 0x35, + 0xd3, 0x95, 0x30, 0x4d, 0xc6, 0x24, 0xc8, 0x3b, 0xcb, 0xdd, 0x8c, 0x55, 0x5c, 0x12, 0xe3, 0x59, + 0x75, 0xff, 0x6b, 0x07, 0xd6, 0xe7, 0xd4, 0x5e, 0x02, 0x85, 0x45, 0x15, 0xe5, 0xb1, 0x19, 0x0e, + 0xe7, 0x70, 0x3f, 0x81, 0x7b, 0x37, 0xbc, 0x4c, 0xb7, 0x3a, 0x32, 0x53, 0x4e, 0xee, 0x3f, 0xf8, + 0xd7, 0xbe, 0x73, 0xa0, 0x51, 0xbc, 0xfc, 0x77, 0x61, 0x39, 0x49, 0xe9, 0xc5, 0x28, 0x34, 0x4d, + 0xd5, 0xec, 0x4a, 0x97, 0xbb, 0x33, 0x97, 0x23, 0x58, 0x0a, 0x89, 0x20, 0x26, 0x26, 0xb5, 0x46, + 0x3d, 0x40, 0xc1, 0x79, 0x9a, 0xd2, 0x48, 0xe0, 0xe2, 0xa9, 0x50, 0x25, 0xb1, 0x84, 0x17, 0x48, + 0xe4, 0x3f, 0x2c, 0xd8, 0x84, 0x72, 0x41, 0x26, 0x89, 0xaa, 0xea, 0x2a, 0x2e, 0x00, 0xbf, 0xaf, + 0x5c, 0x1c, 0x52, 0x12, 0xd2, 0x54, 0x0e, 0x27, 0xcf, 0x58, 0xca, 0x45, 0xee, 0x63, 0xb6, 0xbd, + 0xcd, 0x49, 0xff, 0x53, 0x58, 0xc5, 0xe4, 0xf2, 0x38, 0xa5, 0xd4, 0xd0, 0xf9, 0x2f, 0x67, 0x1c, + 0x7f, 0x00, 0x77, 0x4a, 0x07, 0x3d, 0x65, 0xe2, 0x6c, 0xa4, 0x8c, 0x52, 0x72, 0x69, 0x06, 0x0d, + 0x7d, 0x60, 0x01, 0x98, 0xc1, 0xc8, 0xcd, 0x07, 0xa3, 0x6f, 0x5d, 0x00, 0xcb, 0x97, 0x6d, 0x68, + 0x8a, 0x94, 0x52, 0x19, 0xe0, 0x28, 0xd4, 0x8f, 0x6c, 0x03, 0xdb, 0x90, 0x3c, 0x9e, 0x04, 0x63, + 0xbd, 0xcb, 0x7a, 0x5c, 0x0e, 0xa0, 0xd7, 0xa0, 0xcd, 0x23, 0x92, 0xf0, 0xb3, 0x58, 0xec, 0x13, + 0x2e, 0x7f, 0x3e, 0x3d, 0x83, 0xcd, 0xa0, 0xf2, 0x1e, 0x33, 0xfd, 0xc9, 0x01, 0x41, 0xa5, 0xa3, + 0x85, 0x6d, 0xe8, 0x86, 0xbc, 0xd5, 0xfe, 0x5e, 0xde, 0x96, 0x67, 0xf2, 0x56, 0x4a, 0x48, 0x7d, + 0xa6, 0x6a, 0xba, 0x00, 0x8c, 0x1f, 0x19, 0xff, 0xbc, 0x15, 0xf5, 0x7c, 0x59, 0x88, 0xff, 0xbd, + 0xa3, 0x29, 0xfa, 0xcb, 0xac, 0x6f, 0x40, 0x8d, 0x04, 0xe3, 0x9c, 0x16, 0xbd, 0x41, 0x1f, 0x42, + 0x5b, 0xe4, 0xd6, 0xc7, 0xd3, 0x44, 0xb7, 0xad, 0xb6, 0x19, 0xa6, 0x8e, 0x4b, 0x22, 0x3c, 0xa3, + 0x5a, 0xf2, 0x7b, 0xe9, 0x86, 0x6a, 0xaf, 0x15, 0xd5, 0xbe, 0xfb, 0x10, 0xd0, 0xfc, 0x6f, 0x86, + 0x1a, 0x50, 0xeb, 0x87, 0x13, 0x16, 0x75, 0x2a, 0x08, 0x60, 0xf9, 0x69, 0xca, 0x04, 0x4d, 0x3b, + 0x8e, 0x5c, 0x63, 0x75, 0x55, 0xc7, 0x45, 0x4d, 0xa8, 0xeb, 0xd6, 0x16, 0x76, 0xaa, 0xbb, 0xaf, + 0x43, 0xbb, 0xec, 0x97, 0x54, 0xfd, 0xfc, 0xe4, 0x2b, 0x1a, 0x88, 0x4e, 0x45, 0x9e, 0x76, 0x94, + 0x90, 0x80, 0x76, 0x9c, 0xfd, 0x57, 0x7e, 0xbc, 0xea, 0x3a, 0x2f, 0xae, 0xba, 0xce, 0xaf, 0x57, + 0x5d, 0xe7, 0x9b, 0xeb, 0x6e, 0xe5, 0xc5, 0x75, 0xb7, 0xf2, 0xf3, 0x75, 0xb7, 0xf2, 0x65, 0x4d, + 0x0d, 0xfb, 0x27, 0xcb, 0x6a, 0xb6, 0x7f, 0xe7, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x25, + 0x31, 0x18, 0x0f, 0x0c, 0x00, 0x00, } func (m *RawACLRecord) Marshal() (dAtA []byte, err error) { @@ -3735,7 +3735,7 @@ func (m *ACLUserState) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -3745,23 +3745,25 @@ func (m *ACLUserState) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -3922,7 +3924,7 @@ func (m *ACLUserAdd) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -3932,23 +3934,25 @@ func (m *ACLUserAdd) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -4089,7 +4093,7 @@ func (m *ACLUserConfirm) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4099,23 +4103,25 @@ func (m *ACLUserConfirm) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -4404,7 +4410,7 @@ func (m *ACLUserJoin) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4414,23 +4420,25 @@ func (m *ACLUserJoin) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -4618,7 +4626,7 @@ func (m *ACLUserRemove) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4628,23 +4636,25 @@ func (m *ACLUserRemove) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 3: if wireType != 2 { @@ -4734,7 +4744,7 @@ func (m *ACLReadKeyReplace) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4744,23 +4754,25 @@ func (m *ACLReadKeyReplace) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 2: if wireType != 2 { @@ -4884,7 +4896,7 @@ func (m *ACLUserPermissionChange) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -4894,23 +4906,25 @@ func (m *ACLUserPermissionChange) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 2: if wireType != 0 { @@ -5017,7 +5031,7 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5027,23 +5041,25 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 3: if wireType != 2 { @@ -5203,7 +5219,7 @@ func (m *ACLHeader) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5213,23 +5229,25 @@ func (m *ACLHeader) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex default: iNdEx = preIndex @@ -5687,7 +5705,7 @@ func (m *TreeChange) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5697,23 +5715,25 @@ func (m *TreeChange) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 8: if wireType != 0 { @@ -5872,7 +5892,7 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclchanges @@ -5882,23 +5902,25 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclchanges } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclchanges } if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } iNdEx = postIndex case 5: if wireType != 2 { diff --git a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto index 2ac1e5f7..73a3fc1f 100644 --- a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto +++ b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto @@ -33,7 +33,7 @@ message ACLState { } message ACLUserState { - string identity = 1; + bytes identity = 1; bytes encryptionKey = 2; repeated bytes encryptedReadKeys = 3; // all read keys that we know ACLUserPermissions permissions = 4; @@ -42,7 +42,7 @@ message ACLUserState { // we already know identity and encryptionKey message ACLUserAdd { - string identity = 1; // public signing key + bytes identity = 1; // public signing key bytes encryptionKey = 2; // public encryption key repeated bytes encryptedReadKeys = 3; // all read keys that we know for the user ACLUserPermissions permissions = 4; @@ -50,7 +50,7 @@ message ACLUserAdd { // TODO: this is not used as of now message ACLUserConfirm { // not needed for read permissions - string identity = 1; // not needed + bytes identity = 1; // not needed string userAddId = 2; } @@ -63,7 +63,7 @@ message ACLUserInvite { } message ACLUserJoin { - string identity = 1; + bytes identity = 1; bytes encryptionKey = 2; bytes acceptSignature = 3; // sign acceptPublicKey string userInviteId = 4; @@ -71,18 +71,18 @@ message ACLUserJoin { } message ACLUserRemove { - string identity = 1; + bytes identity = 1; repeated ACLReadKeyReplace readKeyReplaces = 3; // new read key encrypted for all users } message ACLReadKeyReplace { - string identity = 1; + bytes identity = 1; bytes encryptionKey = 2; bytes encryptedReadKey = 3; } message ACLUserPermissionChange { - string identity = 1; + bytes identity = 1; ACLUserPermissions permissions = 2; } @@ -95,7 +95,7 @@ enum ACLUserPermissions { message ACLRecord { string prevId = 1; - string identity = 2; + bytes identity = 2; bytes data = 3; uint64 currentReadKeyHash = 4; int64 timestamp = 5; @@ -103,7 +103,7 @@ message ACLRecord { message ACLHeader { string firstId = 1; - string identity = 2; // the identity of the creator + bytes identity = 2; // the identity of the creator } // Tree protos @@ -125,7 +125,7 @@ message TreeChange { bytes changesData = 4; uint64 currentReadKeyHash = 5; int64 timestamp = 6; - string identity = 7; + bytes identity = 7; bool isSnapshot = 8; } @@ -138,6 +138,6 @@ message TreeHeader { string firstId = 1; string aclId = 2; TreeHeaderType treeHeaderType = 3; - string identity = 4; + bytes identity = 4; bytes data = 5; // this should be reserved for the client to add the data it needs } diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index fceeaadc..d7a849fb 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -1,6 +1,7 @@ package list import ( + "bytes" "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" @@ -147,7 +148,7 @@ func (st *ACLState) applyChangeAndUpdate(recordWrapper *ACLRecord) (err error) { var permissions []UserPermissionPair for _, state := range st.userStates { permission := UserPermissionPair{ - Identity: state.Identity, + Identity: string(state.Identity), Permission: state.Permissions, } permissions = append(permissions, permission) @@ -157,7 +158,7 @@ func (st *ACLState) applyChangeAndUpdate(recordWrapper *ACLRecord) (err error) { return nil } -func (st *ACLState) applyChangeData(changeData *aclpb.ACLData, hash uint64, identity string) (err error) { +func (st *ACLState) applyChangeData(changeData *aclpb.ACLData, hash uint64, identity []byte) (err error) { defer func() { if err != nil { return @@ -170,7 +171,7 @@ func (st *ACLState) applyChangeData(changeData *aclpb.ACLData, hash uint64, iden skipIdentityCheck := st.isUserJoin(changeData) || (st.currentReadKeyHash == 0 && st.isUserAdd(changeData, identity)) if !skipIdentityCheck { // we check signature when we add this to the Tree, so no need to do it here - if _, exists := st.userStates[identity]; !exists { + if _, exists := st.userStates[string(identity)]; !exists { err = ErrNoSuchUser return } @@ -211,11 +212,12 @@ func (st *ACLState) applyChangeContent(ch *aclpb.ACLContentValue) error { } func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLUserPermissionChange) error { - if _, exists := st.userStates[ch.Identity]; !exists { + chIdentity := string(ch.Identity) + if _, exists := st.userStates[chIdentity]; !exists { return ErrNoSuchUser } - st.userStates[ch.Identity].Permissions = ch.Permissions + st.userStates[chIdentity].Permissions = ch.Permissions return nil } @@ -229,8 +231,9 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { if !exists { return fmt.Errorf("no such invite with id %s", ch.UserInviteId) } + chIdentity := string(ch.Identity) - if _, exists = st.userStates[ch.Identity]; exists { + if _, exists = st.userStates[chIdentity]; exists { return ErrUserAlreadyExists } @@ -241,7 +244,7 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { return fmt.Errorf("public key verifying invite accepts is given in incorrect format: %v", err) } - res, err := verificationKey.(signingkey.PubKey).Verify([]byte(ch.Identity), signature) + res, err := verificationKey.(signingkey.PubKey).Verify(ch.Identity, signature) if err != nil { return fmt.Errorf("verification returned error: %w", err) } @@ -250,7 +253,7 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { } // if ourselves -> we need to decrypt the read keys - if st.identity == ch.Identity { + if st.identity == chIdentity { for _, key := range ch.EncryptedReadKeys { key, hash, err := st.decryptReadKeyAndHash(key) if err != nil { @@ -269,23 +272,24 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { Permissions: invite.Permissions, IsConfirmed: true, } - st.userStates[ch.Identity] = userState + st.userStates[chIdentity] = userState return nil } func (st *ACLState) applyUserAdd(ch *aclpb.ACLUserAdd) error { - if _, exists := st.userStates[ch.Identity]; exists { + chIdentity := string(ch.Identity) + if _, exists := st.userStates[chIdentity]; exists { return ErrUserAlreadyExists } - st.userStates[ch.Identity] = &aclpb.ACLUserState{ + st.userStates[chIdentity] = &aclpb.ACLUserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, Permissions: ch.Permissions, EncryptedReadKeys: ch.EncryptedReadKeys, } - if ch.Identity == st.identity { + if chIdentity == st.identity { for _, key := range ch.EncryptedReadKeys { key, hash, err := st.decryptReadKeyAndHash(key) if err != nil { @@ -300,15 +304,16 @@ func (st *ACLState) applyUserAdd(ch *aclpb.ACLUserAdd) error { } func (st *ACLState) applyUserRemove(ch *aclpb.ACLUserRemove) error { - if ch.Identity == st.identity { + chIdentity := string(ch.Identity) + if chIdentity == st.identity { return ErrDocumentForbidden } - if _, exists := st.userStates[ch.Identity]; !exists { + if _, exists := st.userStates[chIdentity]; !exists { return ErrNoSuchUser } - delete(st.userStates, ch.Identity) + delete(st.userStates, chIdentity) for _, replace := range ch.ReadKeyReplaces { repIdentity := string(replace.Identity) @@ -359,8 +364,8 @@ func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, e return key, hasher.Sum64(), nil } -func (st *ACLState) hasPermission(identity string, permission aclpb.ACLUserPermissions) bool { - state, exists := st.userStates[identity] +func (st *ACLState) hasPermission(identity []byte, permission aclpb.ACLUserPermissions) bool { + state, exists := st.userStates[string(identity)] if !exists { return false } @@ -373,13 +378,10 @@ func (st *ACLState) isUserJoin(data *aclpb.ACLData) bool { return data.GetAclContent() != nil && data.GetAclContent()[0].GetUserJoin() != nil } -func (st *ACLState) isUserAdd(data *aclpb.ACLData, identity string) bool { - if len(data.GetAclContent()) == 0 { - return false - } +func (st *ACLState) isUserAdd(data *aclpb.ACLData, identity []byte) bool { // if we have a UserAdd, then it should always be the first one applied userAdd := data.GetAclContent()[0].GetUserAdd() - return data.GetAclContent() != nil && userAdd != nil && userAdd.GetIdentity() == identity + return data.GetAclContent() != nil && userAdd != nil && bytes.Compare(userAdd.GetIdentity(), identity) == 0 } func (st *ACLState) GetUserStates() map[string]*aclpb.ACLUserState { diff --git a/pkg/acl/list/changebuilder.go b/pkg/acl/list/changebuilder.go index 52a44e18..c6413cb0 100644 --- a/pkg/acl/list/changebuilder.go +++ b/pkg/acl/list/changebuilder.go @@ -82,7 +82,7 @@ func (c *aclChangeBuilder) UserAdd(identity string, encryptionKey encryptionkey. ch := &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserAdd{ UserAdd: &aclpb.ACLUserAdd{ - Identity: identity, + Identity: []byte(identity), EncryptionKey: rawKey, EncryptedReadKeys: encryptedKeys, Permissions: permissions, @@ -98,7 +98,7 @@ func (c *aclChangeBuilder) BuildAndApply() (*ACLRecord, []byte, error) { PrevId: c.list.Head().Id, CurrentReadKeyHash: c.readKeyHash, Timestamp: int64(time.Now().Nanosecond()), - Identity: string(c.acc.Identity), + Identity: c.acc.Identity, } marshalledData, err := proto.Marshal(c.aclData) diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index fb73d450..c6d8703a 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -146,7 +146,7 @@ func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclpb.A return &aclpb.ACLRecord{ PrevId: prevId, - Identity: t.keychain.GetIdentity(rec.Identity), + Identity: []byte(t.keychain.GetIdentity(rec.Identity)), Data: bytes, CurrentReadKeyHash: k.Hash, Timestamp: time.Now().Unix(), @@ -164,7 +164,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserAdd{ UserAdd: &aclpb.ACLUserAdd{ - Identity: t.keychain.GetIdentity(add.Identity), + Identity: []byte(t.keychain.GetIdentity(add.Identity)), EncryptionKey: rawKey, EncryptedReadKeys: t.encryptReadKeys(add.EncryptedReadKeys, encKey), Permissions: t.convertPermission(add.Permission), @@ -188,7 +188,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserJoin{ UserJoin: &aclpb.ACLUserJoin{ - Identity: t.keychain.GetIdentity(join.Identity), + Identity: []byte(t.keychain.GetIdentity(join.Identity)), EncryptionKey: rawKey, AcceptSignature: signature, UserInviteId: join.InviteId, @@ -220,7 +220,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserConfirm{ UserConfirm: &aclpb.ACLUserConfirm{ - Identity: t.keychain.GetIdentity(confirm.Identity), + Identity: []byte(t.keychain.GetIdentity(confirm.Identity)), UserAddId: confirm.UserAddId, }, }, @@ -231,7 +231,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserPermissionChange{ UserPermissionChange: &aclpb.ACLUserPermissionChange{ - Identity: t.keychain.GetIdentity(permissionChange.Identity), + Identity: []byte(t.keychain.GetIdentity(permissionChange.Identity)), Permissions: t.convertPermission(permissionChange.Permission), }, }, @@ -251,7 +251,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL panic(err) } replaces = append(replaces, &aclpb.ACLReadKeyReplace{ - Identity: identity, + Identity: []byte(identity), EncryptionKey: rawEncKey, EncryptedReadKey: encReadKey, }) @@ -260,7 +260,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL convCh = &aclpb.ACLContentValue{ Value: &aclpb.ACLContentValue_UserRemove{ UserRemove: &aclpb.ACLUserRemove{ - Identity: t.keychain.GetIdentity(remove.RemovedIdentity), + Identity: []byte(t.keychain.GetIdentity(remove.RemovedIdentity)), ReadKeyReplaces: replaces, }, }, diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index 930a7abc..cefc9327 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -65,6 +65,7 @@ func NewChange(id string, ch *aclpb.TreeChange, signature []byte) *Change { Content: ch, SnapshotId: ch.SnapshotBaseId, IsSnapshot: ch.IsSnapshot, + Identity: string(ch.Identity), Sign: signature, } } diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index c58cf218..67985c82 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -18,7 +18,7 @@ type BuilderContent struct { aclHeadId string snapshotBaseId string currentReadKeyHash uint64 - identity string + identity []byte isSnapshot bool signingKey signingkey.PrivKey readKey *symmetric.Key diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index 1dfac831..bbc337cf 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -43,7 +43,7 @@ func (v *objectTreeValidator) validateChange(tree *Tree, aclList list.ACLList, c state = aclList.ACLState() ) // checking if the user could write - perm, err = state.PermissionsAtRecord(c.Content.AclHeadId, c.Content.Identity) + perm, err = state.PermissionsAtRecord(c.Content.AclHeadId, c.Identity) if err != nil { return } diff --git a/pkg/acl/tree/objecttreefactory.go b/pkg/acl/tree/objecttreefactory.go index 01afdc92..a62c8add 100644 --- a/pkg/acl/tree/objecttreefactory.go +++ b/pkg/acl/tree/objecttreefactory.go @@ -142,7 +142,7 @@ func createTreeHeaderAndId( raw *aclpb.RawTreeChangeWithId, treeType aclpb.TreeHeaderType, aclId string, - identity string, + identity []byte, headerData []byte) (header *aclpb.TreeHeader, treeId string, err error) { header = &aclpb.TreeHeader{ FirstId: raw.Id, diff --git a/pkg/acl/tree/signablecontent.go b/pkg/acl/tree/signablecontent.go index b51d1dea..4774c2fb 100644 --- a/pkg/acl/tree/signablecontent.go +++ b/pkg/acl/tree/signablecontent.go @@ -7,6 +7,6 @@ import ( type SignableChangeContent struct { Data []byte Key signingkey.PrivKey - Identity string + Identity []byte IsSnapshot bool } From 5599277bf247dd2d55ef87f4a83abf02b56e6606 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 13 Sep 2022 15:52:47 +0200 Subject: [PATCH 066/219] Generate drpc and some fixes --- Makefile | 4 +- .../spacesyncproto/protos/spacesync.proto | 5 - .../spacesyncproto/spacesync.pb.go | 278 ++++------------- .../spacesyncproto/spacesync_drpc.pb.go | 24 +- common/commonspace/syncservice/syncservice.go | 291 ++++++++++++++++++ pkg/acl/aclchanges/aclpb/aclchanges.pb.go | 132 ++++---- .../aclchanges/aclpb/protos/aclchanges.proto | 2 +- pkg/acl/list/aclstate.go | 11 +- pkg/acl/tree/changebuilder.go | 2 +- pkg/acl/tree/objecttree.go | 22 +- 10 files changed, 450 insertions(+), 321 deletions(-) create mode 100644 common/commonspace/syncservice/syncservice.go diff --git a/Makefile b/Makefile index b004f35e..b75d2d22 100644 --- a/Makefile +++ b/Makefile @@ -26,11 +26,11 @@ proto: @$(eval P_ACL_CHANGES := M$(P_ACL_CHANGES_PATH_PB)/protos/aclchanges.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_ACL_CHANGES_PATH_PB)) # use if needed $(eval PKGMAP := $$(P_TIMESTAMP),$$(P_STRUCT)) - $(GOGO_START) protoc --gogofaster_out=:. $(P_ACL_CHANGES_PATH_PB)/protos/*.proto; mv $(P_ACL_CHANGES_PATH_PB)/protos/*.go $(P_ACL_CHANGES_PATH_PB) + $(GOGO_START) protoc --gogofaster_out=:. $(P_ACL_CHANGES_PATH_PB)/protos/*.proto $(GOGO_START) protoc --gogofaster_out=:. $(P_TEST_CHANGES_PATH_PB)/proto/*.proto $(eval PKGMAP := $$(P_ACL_CHANGES)) $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. $(P_SYNC_CHANGES_PATH_PB)/proto/*.proto - $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. common/commonspace/spacesyncproto/protos/*.proto + $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. --go-drpc_out=protolib=github.com/gogo/protobuf:. common/commonspace/spacesyncproto/protos/*.proto build: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index 16fbdd14..25c5fefb 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -14,11 +14,6 @@ service Space { rpc Stream(stream ObjectSyncMessage) returns (stream ObjectSyncMessage); } -// TODO: temporary mock message -message Msg { - string spaceId = 1; -} - // HeadSyncRange presenting a request for one range message HeadSyncRange { uint64 from = 1; diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index a3299fee..b23dcf9b 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -45,51 +45,6 @@ func (ErrCodes) EnumDescriptor() ([]byte, []int) { return fileDescriptor_5855f4ef9cf24cdb, []int{0} } -// TODO: temporary mock message -type Msg struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` -} - -func (m *Msg) Reset() { *m = Msg{} } -func (m *Msg) String() string { return proto.CompactTextString(m) } -func (*Msg) ProtoMessage() {} -func (*Msg) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{0} -} -func (m *Msg) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Msg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Msg.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 *Msg) XXX_Merge(src proto.Message) { - xxx_messageInfo_Msg.Merge(m, src) -} -func (m *Msg) XXX_Size() int { - return m.Size() -} -func (m *Msg) XXX_DiscardUnknown() { - xxx_messageInfo_Msg.DiscardUnknown(m) -} - -var xxx_messageInfo_Msg proto.InternalMessageInfo - -func (m *Msg) GetSpaceId() string { - if m != nil { - return m.SpaceId - } - return "" -} - // HeadSyncRange presenting a request for one range type HeadSyncRange struct { From uint64 `protobuf:"varint,1,opt,name=from,proto3" json:"from,omitempty"` @@ -101,7 +56,7 @@ func (m *HeadSyncRange) Reset() { *m = HeadSyncRange{} } func (m *HeadSyncRange) String() string { return proto.CompactTextString(m) } func (*HeadSyncRange) ProtoMessage() {} func (*HeadSyncRange) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{1} + return fileDescriptor_5855f4ef9cf24cdb, []int{0} } func (m *HeadSyncRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -162,7 +117,7 @@ func (m *HeadSyncResult) Reset() { *m = HeadSyncResult{} } func (m *HeadSyncResult) String() string { return proto.CompactTextString(m) } func (*HeadSyncResult) ProtoMessage() {} func (*HeadSyncResult) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{2} + return fileDescriptor_5855f4ef9cf24cdb, []int{1} } func (m *HeadSyncResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -222,7 +177,7 @@ func (m *HeadSyncResultElement) Reset() { *m = HeadSyncResultElement{} } func (m *HeadSyncResultElement) String() string { return proto.CompactTextString(m) } func (*HeadSyncResultElement) ProtoMessage() {} func (*HeadSyncResultElement) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{3} + return fileDescriptor_5855f4ef9cf24cdb, []int{2} } func (m *HeadSyncResultElement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -275,7 +230,7 @@ func (m *HeadSyncRequest) Reset() { *m = HeadSyncRequest{} } func (m *HeadSyncRequest) String() string { return proto.CompactTextString(m) } func (*HeadSyncRequest) ProtoMessage() {} func (*HeadSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{4} + return fileDescriptor_5855f4ef9cf24cdb, []int{3} } func (m *HeadSyncRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -327,7 +282,7 @@ func (m *HeadSyncResponse) Reset() { *m = HeadSyncResponse{} } func (m *HeadSyncResponse) String() string { return proto.CompactTextString(m) } func (*HeadSyncResponse) ProtoMessage() {} func (*HeadSyncResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{5} + return fileDescriptor_5855f4ef9cf24cdb, []int{4} } func (m *HeadSyncResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -375,7 +330,7 @@ func (m *ObjectSyncMessage) Reset() { *m = ObjectSyncMessage{} } func (m *ObjectSyncMessage) String() string { return proto.CompactTextString(m) } func (*ObjectSyncMessage) ProtoMessage() {} func (*ObjectSyncMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{6} + return fileDescriptor_5855f4ef9cf24cdb, []int{5} } func (m *ObjectSyncMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -445,7 +400,7 @@ func (m *ObjectSyncContentValue) Reset() { *m = ObjectSyncContentValue{} func (m *ObjectSyncContentValue) String() string { return proto.CompactTextString(m) } func (*ObjectSyncContentValue) ProtoMessage() {} func (*ObjectSyncContentValue) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{7} + return fileDescriptor_5855f4ef9cf24cdb, []int{6} } func (m *ObjectSyncContentValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -542,7 +497,7 @@ func (m *ObjectHeadUpdate) Reset() { *m = ObjectHeadUpdate{} } func (m *ObjectHeadUpdate) String() string { return proto.CompactTextString(m) } func (*ObjectHeadUpdate) ProtoMessage() {} func (*ObjectHeadUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{8} + return fileDescriptor_5855f4ef9cf24cdb, []int{7} } func (m *ObjectHeadUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -602,7 +557,7 @@ func (m *ObjectFullSyncRequest) Reset() { *m = ObjectFullSyncRequest{} } func (m *ObjectFullSyncRequest) String() string { return proto.CompactTextString(m) } func (*ObjectFullSyncRequest) ProtoMessage() {} func (*ObjectFullSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{9} + return fileDescriptor_5855f4ef9cf24cdb, []int{8} } func (m *ObjectFullSyncRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -656,7 +611,7 @@ func (m *ObjectFullSyncResponse) Reset() { *m = ObjectFullSyncResponse{} func (m *ObjectFullSyncResponse) String() string { return proto.CompactTextString(m) } func (*ObjectFullSyncResponse) ProtoMessage() {} func (*ObjectFullSyncResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{10} + return fileDescriptor_5855f4ef9cf24cdb, []int{9} } func (m *ObjectFullSyncResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -708,7 +663,6 @@ func (m *ObjectFullSyncResponse) GetSnapshotPath() []string { func init() { proto.RegisterEnum("anySpace.ErrCodes", ErrCodes_name, ErrCodes_value) - proto.RegisterType((*Msg)(nil), "anySpace.Msg") proto.RegisterType((*HeadSyncRange)(nil), "anySpace.HeadSyncRange") proto.RegisterType((*HeadSyncResult)(nil), "anySpace.HeadSyncResult") proto.RegisterType((*HeadSyncResultElement)(nil), "anySpace.HeadSyncResultElement") @@ -726,80 +680,49 @@ func init() { } var fileDescriptor_5855f4ef9cf24cdb = []byte{ - // 674 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x4d, 0x6f, 0xd3, 0x40, - 0x10, 0xf5, 0x26, 0x6d, 0x92, 0x4e, 0xfa, 0x11, 0x56, 0xb4, 0x98, 0x20, 0xa5, 0xc1, 0xa7, 0x88, - 0x43, 0x52, 0x85, 0x0b, 0xa2, 0x5c, 0x68, 0xd5, 0x2a, 0x11, 0x2a, 0x1f, 0x5b, 0x0a, 0x12, 0xe2, - 0xb2, 0xb5, 0xb7, 0x49, 0xc0, 0xf1, 0x1a, 0xef, 0x86, 0xd2, 0x1b, 0x27, 0xce, 0x88, 0x9f, 0xc2, - 0xaf, 0xe0, 0xd8, 0x23, 0x47, 0xd4, 0xfe, 0x0d, 0x0e, 0x68, 0xc7, 0x76, 0x92, 0x06, 0xa7, 0xdc, - 0x38, 0xc4, 0xde, 0x99, 0x7d, 0xf3, 0xf6, 0xbd, 0x59, 0x8f, 0x02, 0x0f, 0x5c, 0x39, 0x1c, 0xca, - 0xa0, 0x15, 0xbf, 0x54, 0xc8, 0x5d, 0xd1, 0xc2, 0xa7, 0x3a, 0x0b, 0xdc, 0x30, 0x92, 0x5a, 0xb6, - 0xf0, 0xa9, 0x26, 0xd9, 0x26, 0x26, 0x68, 0x89, 0x07, 0x67, 0x87, 0x26, 0x57, 0xdd, 0x0a, 0xdf, - 0xf7, 0x5a, 0xdc, 0xf5, 0xcd, 0xcf, 0xed, 0xf3, 0xa0, 0x27, 0x94, 0x59, 0x86, 0xc7, 0x69, 0xe9, - 0x24, 0x1f, 0xd7, 0x3a, 0x9b, 0x90, 0x3f, 0x50, 0x3d, 0x6a, 0x43, 0x11, 0x59, 0xbb, 0x9e, 0x4d, - 0xea, 0xa4, 0xb1, 0xc4, 0xd2, 0xd0, 0xe9, 0xc2, 0x4a, 0x47, 0x70, 0xef, 0xf0, 0x2c, 0x70, 0x99, - 0x29, 0xa4, 0x14, 0x16, 0x4e, 0x22, 0x39, 0x44, 0xdc, 0x02, 0xc3, 0x35, 0x5d, 0x85, 0x9c, 0x96, - 0x76, 0x0e, 0x33, 0x39, 0x2d, 0xe9, 0x4d, 0x58, 0xf4, 0x07, 0xc3, 0x81, 0xb6, 0xf3, 0x75, 0xd2, - 0x58, 0x61, 0x71, 0xe0, 0x9c, 0xc2, 0xea, 0x98, 0x4a, 0xa8, 0x91, 0xaf, 0x0d, 0x57, 0x9f, 0xab, - 0x3e, 0x72, 0x2d, 0x33, 0x5c, 0xd3, 0x6d, 0x28, 0x09, 0x5f, 0x0c, 0x45, 0xa0, 0x95, 0x9d, 0xab, - 0xe7, 0x1b, 0xe5, 0xf6, 0x66, 0x33, 0x35, 0xd8, 0xbc, 0x5a, 0xbf, 0x17, 0xe3, 0xd8, 0xb8, 0xc0, - 0x1c, 0xec, 0xca, 0x51, 0x30, 0x3e, 0x18, 0x03, 0x67, 0x1b, 0xd6, 0x33, 0x0b, 0x8d, 0xee, 0x41, - 0xea, 0x38, 0x37, 0xf0, 0x50, 0x8f, 0xe0, 0x1e, 0x3a, 0x59, 0x62, 0xb8, 0x76, 0xde, 0xc2, 0xda, - 0xa4, 0xf8, 0xc3, 0x48, 0x28, 0x3d, 0xbf, 0x5b, 0xb4, 0x05, 0x85, 0x08, 0xdb, 0x9b, 0x48, 0xbf, - 0x95, 0x21, 0xdd, 0xec, 0xb3, 0x04, 0xe6, 0xec, 0x43, 0x65, 0x4a, 0x5a, 0x28, 0x03, 0x25, 0x68, - 0x1b, 0x8a, 0x11, 0xca, 0x54, 0x36, 0x41, 0x16, 0x7b, 0x5e, 0x03, 0x58, 0x0a, 0x74, 0xbe, 0x13, - 0xb8, 0xf1, 0xec, 0xf8, 0x9d, 0x70, 0xb5, 0xd9, 0x3d, 0x10, 0x4a, 0xf1, 0x9e, 0xb8, 0x46, 0xe8, - 0x43, 0x28, 0xba, 0x32, 0xd0, 0x22, 0xd0, 0x68, 0xb6, 0xdc, 0xae, 0x4f, 0xce, 0x98, 0xf0, 0xec, - 0xc6, 0x90, 0x57, 0xdc, 0x1f, 0x09, 0x96, 0x16, 0xd0, 0x16, 0x80, 0x8e, 0x84, 0x30, 0x52, 0x44, - 0x84, 0x9d, 0x2e, 0xb7, 0xd7, 0x9a, 0xdc, 0xf5, 0x9b, 0x2f, 0xc7, 0x69, 0x36, 0x05, 0xa1, 0x1b, - 0x50, 0x30, 0x51, 0xd7, 0xb3, 0x17, 0x50, 0x45, 0x12, 0x39, 0xbf, 0x09, 0x6c, 0x64, 0x1f, 0x46, - 0x1f, 0x01, 0x98, 0xee, 0x1f, 0x85, 0x1e, 0xd7, 0x02, 0xc5, 0x97, 0xdb, 0xd5, 0x59, 0x89, 0x9d, - 0x31, 0xa2, 0x63, 0xb1, 0x29, 0x3c, 0x7d, 0x02, 0x6b, 0x27, 0x23, 0xdf, 0x9f, 0xba, 0xb3, 0xc4, - 0xe5, 0xe6, 0x2c, 0xc5, 0xfe, 0x55, 0x58, 0xc7, 0x62, 0xb3, 0x95, 0xf4, 0x29, 0x54, 0x26, 0xa9, - 0xf8, 0x8a, 0x12, 0xd3, 0xf5, 0xf9, 0x6c, 0x31, 0xae, 0x63, 0xb1, 0xbf, 0x6a, 0x77, 0x8a, 0xb0, - 0xf8, 0xd1, 0x78, 0x74, 0x3e, 0x13, 0xa8, 0xcc, 0x1a, 0x31, 0x5f, 0xb0, 0x31, 0x12, 0x5f, 0xfd, - 0x12, 0x8b, 0x03, 0xf3, 0x49, 0x24, 0x73, 0x9b, 0x7c, 0x58, 0x36, 0xf6, 0x9b, 0xf1, 0x53, 0xd3, - 0xf2, 0x5d, 0xdc, 0x7a, 0x3d, 0xd0, 0xfd, 0xae, 0xc7, 0x52, 0x20, 0x75, 0x60, 0x59, 0x05, 0x3c, - 0x54, 0x7d, 0xa9, 0x9f, 0x73, 0xdd, 0xb7, 0xf3, 0x48, 0x78, 0x25, 0xe7, 0xbc, 0x80, 0xf5, 0xcc, - 0x3e, 0xcc, 0x91, 0x31, 0x4b, 0x99, 0xcb, 0xa0, 0xfc, 0x32, 0xbe, 0xd4, 0xd9, 0x6e, 0xfc, 0x5f, - 0x6f, 0xf7, 0xaa, 0x50, 0xda, 0x8b, 0xa2, 0x5d, 0xe9, 0x09, 0x45, 0x57, 0x01, 0x8e, 0x02, 0xf1, - 0x29, 0x14, 0xae, 0x16, 0x5e, 0xc5, 0x6a, 0x7f, 0x23, 0xb0, 0x88, 0x17, 0x47, 0x1f, 0x43, 0x29, - 0x9d, 0x29, 0x7a, 0x3b, 0x6b, 0xce, 0xb0, 0x1f, 0xd5, 0x6a, 0xe6, 0x08, 0xc6, 0xb6, 0xf6, 0xa1, - 0x70, 0xa8, 0x23, 0xc1, 0x87, 0xf4, 0x4e, 0xd6, 0x10, 0x25, 0xc3, 0x58, 0xbd, 0x6e, 0xb3, 0x41, - 0xb6, 0xc8, 0xce, 0xf6, 0x8f, 0x8b, 0x1a, 0x39, 0xbf, 0xa8, 0x91, 0x5f, 0x17, 0x35, 0xf2, 0xf5, - 0xb2, 0x66, 0x9d, 0x5f, 0xd6, 0xac, 0x9f, 0x97, 0x35, 0xeb, 0xcd, 0xdd, 0x7f, 0xfe, 0x37, 0x1c, - 0x17, 0xf0, 0x75, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd7, 0x51, 0x60, 0x63, 0x47, 0x06, - 0x00, 0x00, -} - -func (m *Msg) 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 *Msg) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Msg) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.SpaceId) > 0 { - i -= len(m.SpaceId) - copy(dAtA[i:], m.SpaceId) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SpaceId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil + // 666 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x54, 0x4f, 0x6f, 0xd3, 0x4e, + 0x10, 0xf5, 0xa6, 0x6d, 0x92, 0x4e, 0xfa, 0x27, 0xbf, 0xd5, 0xaf, 0xc5, 0x04, 0x29, 0x0d, 0x3e, + 0x45, 0x1c, 0x92, 0x2a, 0x5c, 0x10, 0xe5, 0x42, 0xab, 0x56, 0x89, 0x10, 0xff, 0xb6, 0x14, 0x24, + 0xc4, 0x65, 0x6b, 0x4f, 0x9b, 0x80, 0x63, 0x1b, 0xef, 0x86, 0xd2, 0x1b, 0x27, 0xce, 0x88, 0x8f, + 0xc2, 0xa7, 0xe0, 0xd8, 0x23, 0x47, 0xd4, 0x7e, 0x0d, 0x0e, 0x68, 0xc7, 0x76, 0x92, 0x06, 0xb7, + 0xdc, 0x38, 0xc4, 0xde, 0x99, 0x9d, 0xf7, 0xf6, 0xcd, 0x5b, 0x4f, 0xe0, 0x9e, 0x1b, 0x0e, 0x87, + 0x61, 0xd0, 0x4e, 0x5e, 0x2a, 0x92, 0x2e, 0xb6, 0xe9, 0xa9, 0x4e, 0x03, 0x37, 0x8a, 0x43, 0x1d, + 0xb6, 0xe9, 0xa9, 0x26, 0xd9, 0x16, 0x25, 0x78, 0x59, 0x06, 0xa7, 0xfb, 0x26, 0x57, 0xdb, 0x8c, + 0xde, 0x1d, 0xb7, 0xa5, 0xeb, 0x9b, 0x9f, 0xdb, 0x97, 0xc1, 0x31, 0x2a, 0xb3, 0x8c, 0x0e, 0x33, + 0xe8, 0x24, 0x9f, 0x60, 0x9d, 0x1e, 0x2c, 0x77, 0x51, 0x7a, 0xfb, 0xa7, 0x81, 0x2b, 0x4c, 0x9e, + 0x73, 0x98, 0x3f, 0x8a, 0xc3, 0xa1, 0xcd, 0x1a, 0xac, 0x39, 0x2f, 0x68, 0xcd, 0x57, 0xa0, 0xa0, + 0x43, 0xbb, 0x40, 0x99, 0x82, 0x0e, 0xf9, 0xff, 0xb0, 0xe0, 0x0f, 0x86, 0x03, 0x6d, 0xcf, 0x35, + 0x58, 0x73, 0x59, 0x24, 0x81, 0x73, 0x02, 0x2b, 0x63, 0x2a, 0x54, 0x23, 0x5f, 0x1b, 0xae, 0xbe, + 0x54, 0x7d, 0xe2, 0x5a, 0x12, 0xb4, 0xe6, 0x5b, 0x50, 0x46, 0x1f, 0x87, 0x18, 0x68, 0x65, 0x17, + 0x1a, 0x73, 0xcd, 0x4a, 0x67, 0xa3, 0x95, 0xe9, 0x6f, 0x5d, 0xc6, 0xef, 0x26, 0x75, 0x62, 0x0c, + 0x30, 0x07, 0xbb, 0xe1, 0x28, 0x18, 0x1f, 0x4c, 0x81, 0xb3, 0x05, 0x6b, 0xb9, 0x40, 0xa3, 0x7b, + 0xe0, 0xd1, 0xe9, 0x8b, 0xa2, 0x30, 0xf0, 0x48, 0x0f, 0x4a, 0x8f, 0x3a, 0x59, 0x14, 0xb4, 0x76, + 0xde, 0xc0, 0xea, 0x04, 0xfc, 0x7e, 0x84, 0x4a, 0x73, 0x1b, 0x4a, 0x64, 0x71, 0x2f, 0xc3, 0x66, + 0x21, 0x6f, 0x43, 0x31, 0x26, 0xf7, 0x52, 0xe9, 0x37, 0x72, 0xa4, 0x9b, 0x7d, 0x91, 0x96, 0x39, + 0x7b, 0x50, 0x9d, 0x92, 0x16, 0x85, 0x81, 0x42, 0xde, 0x81, 0x52, 0x4c, 0x32, 0x95, 0xcd, 0x88, + 0xc5, 0xbe, 0xca, 0x00, 0x91, 0x15, 0x3a, 0xdf, 0x18, 0xfc, 0xf7, 0xf4, 0xf0, 0x2d, 0xba, 0xda, + 0xec, 0x3e, 0x46, 0xa5, 0xe4, 0x31, 0x5e, 0x23, 0xf4, 0x3e, 0x94, 0xdc, 0x30, 0xd0, 0x18, 0x68, + 0x6a, 0xb6, 0xd2, 0x69, 0x4c, 0xce, 0x98, 0xf0, 0xec, 0x24, 0x25, 0x2f, 0xa5, 0x3f, 0x42, 0x91, + 0x01, 0x78, 0x1b, 0x40, 0xc7, 0x88, 0x46, 0x0a, 0xc6, 0xe4, 0x74, 0xa5, 0xb3, 0xda, 0x92, 0xae, + 0xdf, 0x7a, 0x31, 0x4e, 0x8b, 0xa9, 0x12, 0xbe, 0x0e, 0x45, 0x13, 0xf5, 0x3c, 0x7b, 0x9e, 0x54, + 0xa4, 0x91, 0xf3, 0x8b, 0xc1, 0x7a, 0xfe, 0x61, 0xfc, 0x01, 0x80, 0x71, 0xff, 0x20, 0xf2, 0xa4, + 0x46, 0x12, 0x5f, 0xe9, 0xd4, 0x66, 0x25, 0x76, 0xc7, 0x15, 0x5d, 0x4b, 0x4c, 0xd5, 0xf3, 0x47, + 0xb0, 0x7a, 0x34, 0xf2, 0xfd, 0xa9, 0x3b, 0x4b, 0xbb, 0xdc, 0x98, 0xa5, 0xd8, 0xbb, 0x5c, 0xd6, + 0xb5, 0xc4, 0x2c, 0x92, 0x3f, 0x81, 0xea, 0x24, 0x95, 0x5c, 0x51, 0xda, 0x74, 0xe3, 0x6a, 0xb6, + 0xa4, 0xae, 0x6b, 0x89, 0x3f, 0xb0, 0xdb, 0x25, 0x58, 0xf8, 0x60, 0x7a, 0x74, 0x3e, 0x31, 0xa8, + 0xce, 0x36, 0x62, 0xbe, 0x60, 0xd3, 0x48, 0x72, 0xf5, 0x8b, 0x22, 0x09, 0xcc, 0x27, 0x91, 0x8e, + 0x65, 0xfa, 0x61, 0xd9, 0xe4, 0xb7, 0x90, 0x27, 0xc6, 0xf2, 0x1d, 0xda, 0x7a, 0x35, 0xd0, 0xfd, + 0x9e, 0x27, 0xb2, 0x42, 0xee, 0xc0, 0x92, 0x0a, 0x64, 0xa4, 0xfa, 0xa1, 0x7e, 0x26, 0x75, 0xdf, + 0x9e, 0x23, 0xc2, 0x4b, 0x39, 0xe7, 0x39, 0xac, 0xe5, 0xfa, 0x70, 0x85, 0x8c, 0x59, 0xca, 0x42, + 0x0e, 0xe5, 0xe7, 0xf1, 0xa5, 0xce, 0xba, 0xf1, 0x6f, 0x7b, 0xbb, 0x53, 0x83, 0xf2, 0x6e, 0x1c, + 0xef, 0x84, 0x1e, 0x2a, 0xbe, 0x02, 0x70, 0x10, 0xe0, 0xc7, 0x08, 0x5d, 0x8d, 0x5e, 0xd5, 0xea, + 0x7c, 0x65, 0xb0, 0x40, 0x17, 0xc7, 0x1f, 0x42, 0x39, 0x9b, 0x29, 0x7e, 0x33, 0x6f, 0xce, 0xc8, + 0x8f, 0x5a, 0x2d, 0x77, 0x04, 0x93, 0xb6, 0xf6, 0xa0, 0xb8, 0xaf, 0x63, 0x94, 0x43, 0x7e, 0x2b, + 0x6f, 0x88, 0xd2, 0x61, 0xac, 0x5d, 0xb7, 0xd9, 0x64, 0x9b, 0x6c, 0x7b, 0xeb, 0xfb, 0x79, 0x9d, + 0x9d, 0x9d, 0xd7, 0xd9, 0xcf, 0xf3, 0x3a, 0xfb, 0x72, 0x51, 0xb7, 0xce, 0x2e, 0xea, 0xd6, 0x8f, + 0x8b, 0xba, 0xf5, 0xfa, 0xf6, 0x5f, 0xff, 0xfa, 0x0f, 0x8b, 0xf4, 0xba, 0xfb, 0x3b, 0x00, 0x00, + 0xff, 0xff, 0xcf, 0x4f, 0x53, 0x3d, 0x26, 0x06, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { @@ -1325,19 +1248,6 @@ func encodeVarintSpacesync(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *Msg) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.SpaceId) - if l > 0 { - n += 1 + l + sovSpacesync(uint64(l)) - } - return n -} - func (m *HeadSyncRange) Size() (n int) { if m == nil { return 0 @@ -1583,88 +1493,6 @@ func sovSpacesync(x uint64) (n int) { func sozSpacesync(x uint64) (n int) { return sovSpacesync(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *Msg) 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 ErrIntOverflowSpacesync - } - 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: Msg: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Msg: 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 ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SpaceId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSpacesync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSpacesync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *HeadSyncRange) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/common/commonspace/spacesyncproto/spacesync_drpc.pb.go b/common/commonspace/spacesyncproto/spacesync_drpc.pb.go index b17dc589..9f984b1e 100644 --- a/common/commonspace/spacesyncproto/spacesync_drpc.pb.go +++ b/common/commonspace/spacesyncproto/spacesync_drpc.pb.go @@ -74,27 +74,27 @@ func (c *drpcSpaceClient) Stream(ctx context.Context) (DRPCSpace_StreamClient, e type DRPCSpace_StreamClient interface { drpc.Stream - Send(*Msg) error - Recv() (*Msg, error) + Send(*ObjectSyncMessage) error + Recv() (*ObjectSyncMessage, error) } type drpcSpace_StreamClient struct { drpc.Stream } -func (x *drpcSpace_StreamClient) Send(m *Msg) error { +func (x *drpcSpace_StreamClient) Send(m *ObjectSyncMessage) error { return x.MsgSend(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) } -func (x *drpcSpace_StreamClient) Recv() (*Msg, error) { - m := new(Msg) +func (x *drpcSpace_StreamClient) Recv() (*ObjectSyncMessage, error) { + m := new(ObjectSyncMessage) if err := x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { return nil, err } return m, nil } -func (x *drpcSpace_StreamClient) RecvMsg(m *Msg) error { +func (x *drpcSpace_StreamClient) RecvMsg(m *ObjectSyncMessage) error { return x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) } @@ -163,26 +163,26 @@ func (x *drpcSpace_HeadSyncStream) SendAndClose(m *HeadSyncResponse) error { type DRPCSpace_StreamStream interface { drpc.Stream - Send(*Msg) error - Recv() (*Msg, error) + Send(*ObjectSyncMessage) error + Recv() (*ObjectSyncMessage, error) } type drpcSpace_StreamStream struct { drpc.Stream } -func (x *drpcSpace_StreamStream) Send(m *Msg) error { +func (x *drpcSpace_StreamStream) Send(m *ObjectSyncMessage) error { return x.MsgSend(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) } -func (x *drpcSpace_StreamStream) Recv() (*Msg, error) { - m := new(Msg) +func (x *drpcSpace_StreamStream) Recv() (*ObjectSyncMessage, error) { + m := new(ObjectSyncMessage) if err := x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { return nil, err } return m, nil } -func (x *drpcSpace_StreamStream) RecvMsg(m *Msg) error { +func (x *drpcSpace_StreamStream) RecvMsg(m *ObjectSyncMessage) error { return x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) } diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go new file mode 100644 index 00000000..0f133fd9 --- /dev/null +++ b/common/commonspace/syncservice/syncservice.go @@ -0,0 +1,291 @@ +package syncservice + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" + "go.uber.org/zap" +) + +type syncService struct { + treeCache treecache.Service + account account.Service + messageService MessageSender +} + +var log = logger.NewNamed("requesthandler") + +func New() app.Component { + return &syncService{} +} + +type SyncService interface { + HandleSyncMessage(ctx context.Context, senderId string, request *syncproto.Sync) (err error) +} + +type MessageSender interface { + SendMessageAsync(peerId string, msg *syncproto.Sync) error + SendToSpaceAsync(spaceId string, msg *syncproto.Sync) error +} + +const CName = "SyncRequestHandler" + +func (r *syncService) Init(a *app.App) (err error) { + r.treeCache = a.MustComponent(treecache.CName).(treecache.Service) + r.account = a.MustComponent(account.CName).(account.Service) + r.messageService = a.MustComponent("MessageService").(MessageSender) + return nil +} + +func (r *syncService) Name() (name string) { + return CName +} + +func (r *syncService) Run(ctx context.Context) (err error) { + return nil +} + +func (r *syncService) Close(ctx context.Context) (err error) { + return nil +} + +func (r *syncService) HandleSyncMessage(ctx context.Context, senderId string, content *syncproto.Sync) error { + msg := content.GetMessage() + switch { + case msg.GetFullSyncRequest() != nil: + return r.HandleFullSyncRequest(ctx, senderId, msg.GetFullSyncRequest(), content.GetTreeHeader(), content.GetTreeId()) + case msg.GetFullSyncResponse() != nil: + return r.HandleFullSyncResponse(ctx, senderId, msg.GetFullSyncResponse(), content.GetTreeHeader(), content.GetTreeId()) + case msg.GetHeadUpdate() != nil: + return r.HandleHeadUpdate(ctx, senderId, msg.GetHeadUpdate(), content.GetTreeHeader(), content.GetTreeId()) + case msg.GetAclList() != nil: + return r.HandleACLList(ctx, senderId, msg.GetAclList(), content.GetTreeHeader(), content.GetTreeId()) + } + return nil +} + +func (r *syncService) HandleHeadUpdate( + ctx context.Context, + senderId string, + update *syncproto.SyncHeadUpdate, + header *aclpb.Header, + treeId string) (err error) { + + var ( + fullRequest *syncproto.SyncFullRequest + snapshotPath []string + result tree.AddResult + ) + log.With(zap.String("peerId", senderId), zap.String("treeId", treeId)). + Debug("processing head update") + + err = r.treeCache.Do(ctx, treeId, func(obj any) error { + objTree := obj.(tree.ObjectTree) + objTree.Lock() + defer objTree.Unlock() + + if slice.UnsortedEquals(update.Heads, objTree.Heads()) { + return nil + } + + result, err = objTree.AddRawChanges(ctx, update.Changes...) + if err != nil { + return err + } + + // if we couldn't add all the changes + shouldFullSync := len(update.Changes) != len(result.Added) + snapshotPath = objTree.SnapshotPath() + if shouldFullSync { + fullRequest, err = r.prepareFullSyncRequest(objTree) + if err != nil { + return err + } + } + return nil + }) + + // if there are no such tree + if err == storage.ErrUnknownTreeId { + fullRequest = &syncproto.SyncFullRequest{} + } + // if we have incompatible heads, or we haven't seen the tree at all + if fullRequest != nil { + return r.messageService.SendMessageAsync(senderId, syncproto.WrapFullRequest(fullRequest, header, treeId)) + } + // if error or nothing has changed + if err != nil || len(result.Added) == 0 { + return err + } + + // otherwise sending heads update message + newUpdate := &syncproto.SyncHeadUpdate{ + Heads: result.Heads, + Changes: result.Added, + SnapshotPath: snapshotPath, + } + return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) +} + +func (r *syncService) HandleFullSyncRequest( + ctx context.Context, + senderId string, + request *syncproto.SyncFullRequest, + header *aclpb.Header, + treeId string) (err error) { + + var fullResponse *syncproto.SyncFullResponse + err = r.treeCache.Do(ctx, treeId, func(obj any) error { + objTree := obj.(tree.ObjectTree) + objTree.Lock() + defer objTree.Unlock() + + fullResponse, err = r.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Heads, objTree) + if err != nil { + return err + } + return nil + }) + + if err != nil { + return err + } + return r.messageService.SendMessageAsync(senderId, syncproto.WrapFullResponse(fullResponse, header, treeId)) +} + +func (r *syncService) HandleFullSyncResponse( + ctx context.Context, + senderId string, + response *syncproto.SyncFullResponse, + header *aclpb.Header, + treeId string) (err error) { + + var ( + snapshotPath []string + result tree.AddResult + ) + + err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { + objTree := obj.(tree.ObjectTree) + objTree.Lock() + defer objTree.Unlock() + + // if we already have the heads for whatever reason + if slice.UnsortedEquals(response.Heads, objTree.Heads()) { + return nil + } + + result, err = objTree.AddRawChanges(ctx, response.Changes...) + if err != nil { + return err + } + snapshotPath = objTree.SnapshotPath() + return nil + }) + + // if error or nothing has changed + if (err != nil || len(result.Added) == 0) && err != storage.ErrUnknownTreeId { + return err + } + // if we have a new tree + if err == storage.ErrUnknownTreeId { + err = r.createTree(ctx, response, header, treeId) + if err != nil { + return err + } + result = tree.AddResult{ + OldHeads: []string{}, + Heads: response.Heads, + Added: response.Changes, + } + } + // sending heads update message + newUpdate := &syncproto.SyncHeadUpdate{ + Heads: result.Heads, + Changes: result.Added, + SnapshotPath: snapshotPath, + } + return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) +} + +func (r *syncService) HandleACLList( + ctx context.Context, + senderId string, + req *syncproto.SyncACLList, + header *aclpb.Header, + id string) (err error) { + + err = r.treeCache.Do(ctx, id, func(obj interface{}) error { + return nil + }) + // do nothing if already added + if err == nil { + return nil + } + // if not found then add to storage + if err == storage.ErrUnknownTreeId { + return r.createACLList(ctx, req, header, id) + } + return err +} + +func (r *syncService) prepareFullSyncRequest(t tree.ObjectTree) (*syncproto.SyncFullRequest, error) { + return &syncproto.SyncFullRequest{ + Heads: t.Heads(), + SnapshotPath: t.SnapshotPath(), + }, nil +} + +func (r *syncService) prepareFullSyncResponse( + treeId string, + theirPath, theirHeads []string, + t tree.ObjectTree) (*syncproto.SyncFullResponse, error) { + ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath, theirHeads) + if err != nil { + return nil, err + } + + return &syncproto.SyncFullResponse{ + Heads: t.Heads(), + Changes: ourChanges, + SnapshotPath: t.SnapshotPath(), + }, nil +} + +func (r *syncService) createTree( + ctx context.Context, + response *syncproto.SyncFullResponse, + header *aclpb.Header, + treeId string) error { + + return r.treeCache.Add( + ctx, + treeId, + storage.TreeStorageCreatePayload{ + TreeId: treeId, + Header: header, + Changes: response.Changes, + Heads: response.Heads, + }) +} + +func (r *syncService) createACLList( + ctx context.Context, + req *syncproto.SyncACLList, + header *aclpb.Header, + treeId string) error { + + return r.treeCache.Add( + ctx, + treeId, + storage.ACLListStorageCreatePayload{ + ListId: treeId, + Header: header, + Records: req.Records, + }) +} diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go index ecd124b1..60437c7e 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclchanges/aclpb/aclchanges.pb.go @@ -1332,73 +1332,73 @@ func init() { var fileDescriptor_37a022c841a51877 = []byte{ // 1078 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0xcd, 0x6e, 0x23, 0x45, - 0x10, 0xf6, 0x8c, 0xe3, 0x38, 0x2e, 0x3b, 0x8e, 0xd3, 0x1b, 0xed, 0x8e, 0xa2, 0xc8, 0x44, 0x23, - 0x04, 0x51, 0x40, 0x5e, 0x08, 0x2b, 0xf1, 0x77, 0x00, 0xc7, 0x8b, 0xb0, 0x37, 0x11, 0xac, 0x3a, - 0x61, 0x57, 0xe2, 0xd6, 0x99, 0xe9, 0x4d, 0x9a, 0xb5, 0x67, 0x46, 0xd3, 0x9d, 0x44, 0x3e, 0xf2, - 0x06, 0x3c, 0x02, 0x1c, 0x79, 0x02, 0x5e, 0x01, 0x89, 0xcb, 0x1e, 0x91, 0xb8, 0xa0, 0xe4, 0x04, - 0x27, 0x1e, 0x01, 0xf5, 0xcf, 0xcc, 0xf4, 0xd8, 0x4e, 0xf8, 0xd1, 0x0a, 0x89, 0xc3, 0x48, 0xdd, - 0x5f, 0x55, 0x75, 0x57, 0x7d, 0x55, 0x53, 0x5d, 0xf0, 0x56, 0xf2, 0xfc, 0xf4, 0x3e, 0x09, 0xc6, - 0xf2, 0x0b, 0xce, 0x48, 0x74, 0x4a, 0xb9, 0x5c, 0x26, 0x27, 0xf7, 0x93, 0x34, 0x16, 0x31, 0xb7, - 0xf0, 0x9e, 0x42, 0x50, 0x95, 0x04, 0x63, 0xff, 0x09, 0xb4, 0x30, 0xb9, 0xec, 0x0f, 0x0e, 0x31, - 0x0d, 0xe2, 0x34, 0x44, 0x1e, 0xd4, 0x13, 0x32, 0x1d, 0xc7, 0x24, 0xf4, 0x9c, 0x6d, 0x67, 0xa7, - 0x85, 0xb3, 0x2d, 0xda, 0x82, 0x06, 0x67, 0xa7, 0x11, 0x11, 0xe7, 0x29, 0xf5, 0x5c, 0x25, 0x2b, - 0x00, 0xd4, 0x06, 0x97, 0x85, 0x5e, 0x75, 0xdb, 0xd9, 0x69, 0x60, 0x97, 0x85, 0xfe, 0x1f, 0x2e, - 0xac, 0xf5, 0x07, 0x87, 0x83, 0x38, 0x12, 0x34, 0x12, 0x4f, 0xc8, 0xf8, 0x9c, 0xa2, 0x37, 0xa0, - 0x7e, 0xce, 0x69, 0xda, 0x0f, 0xf5, 0xd9, 0xcd, 0xbd, 0xb5, 0x1e, 0x09, 0xc6, 0xbd, 0xfe, 0xe0, - 0xf0, 0x0b, 0x0d, 0x0f, 0x2b, 0x38, 0xd3, 0x40, 0x0f, 0x00, 0xe4, 0x12, 0xd3, 0x49, 0x7c, 0xa1, - 0xef, 0x6b, 0xee, 0x21, 0x5b, 0x5f, 0x4b, 0x86, 0x15, 0x6c, 0xe9, 0x21, 0x0c, 0x1b, 0x72, 0xf7, - 0x98, 0xa6, 0x13, 0xc6, 0x39, 0x8b, 0xa3, 0x81, 0x0a, 0x59, 0x39, 0xd6, 0xdc, 0xdb, 0xb2, 0xed, - 0x67, 0x75, 0x86, 0x15, 0xbc, 0xd0, 0x36, 0xf3, 0x64, 0x14, 0x5d, 0x30, 0x41, 0xbd, 0xa5, 0x79, - 0x4f, 0xb4, 0x24, 0xf3, 0x44, 0xef, 0x50, 0x0f, 0x56, 0xe4, 0xee, 0x51, 0xcc, 0x22, 0xaf, 0xa6, - 0x6c, 0x3a, 0xb6, 0x8d, 0xc4, 0x87, 0x15, 0x9c, 0xeb, 0xa0, 0x77, 0xa1, 0x29, 0xd7, 0x83, 0x38, - 0x7a, 0xc6, 0xd2, 0x89, 0xb7, 0xac, 0x4c, 0xee, 0xd8, 0x26, 0x46, 0x34, 0xac, 0x60, 0x5b, 0x73, - 0xbf, 0x0e, 0xb5, 0x0b, 0x49, 0xaf, 0xff, 0x11, 0xd4, 0xfb, 0x83, 0xc3, 0x87, 0x44, 0x10, 0xe9, - 0x32, 0x09, 0xc6, 0x86, 0x7c, 0xcf, 0xd9, 0xae, 0xee, 0x34, 0xf7, 0x36, 0xb2, 0xb3, 0xec, 0x9c, - 0x60, 0x4b, 0xcf, 0xff, 0xcd, 0x81, 0x95, 0xfe, 0xe0, 0xf0, 0x48, 0x10, 0x41, 0xd1, 0xab, 0xb0, - 0x9a, 0x52, 0x12, 0x1e, 0xd0, 0xe9, 0x90, 0xf0, 0x33, 0xca, 0xd5, 0x29, 0x4b, 0xb8, 0x0c, 0xa2, - 0xb7, 0x35, 0x37, 0xca, 0x84, 0x7b, 0xae, 0xba, 0x68, 0xdd, 0x76, 0x5a, 0x49, 0xb0, 0xa5, 0x84, + 0x10, 0xf6, 0x8c, 0xe3, 0x38, 0x2e, 0x3b, 0x8e, 0xd3, 0x1b, 0xed, 0x8e, 0xa2, 0xc8, 0x8a, 0x46, + 0x08, 0xa2, 0x80, 0xbc, 0x60, 0x56, 0xe2, 0xef, 0x00, 0x8e, 0x17, 0x61, 0x6f, 0x22, 0x58, 0x75, + 0xc2, 0xae, 0xc4, 0xad, 0x33, 0xd3, 0x9b, 0x34, 0x6b, 0xcf, 0x8c, 0xa6, 0x3b, 0x89, 0x7c, 0xe4, + 0x0d, 0x78, 0x04, 0x38, 0xf2, 0x04, 0xbc, 0x02, 0x12, 0x97, 0x3d, 0x22, 0x71, 0x41, 0xc9, 0x09, + 0x4e, 0x3c, 0x02, 0xea, 0x9f, 0x99, 0xe9, 0xb1, 0x93, 0xf0, 0xa3, 0x15, 0xd2, 0x1e, 0x46, 0xea, + 0xfe, 0xaa, 0xaa, 0xbb, 0xea, 0xab, 0x9a, 0xea, 0x82, 0xb7, 0x93, 0xe7, 0x27, 0xf7, 0x49, 0x30, + 0x91, 0x5f, 0x70, 0x4a, 0xa2, 0x13, 0xca, 0xe5, 0x32, 0x39, 0xbe, 0x9f, 0xa4, 0xb1, 0x88, 0xb9, + 0x85, 0xf7, 0x14, 0x82, 0xaa, 0x24, 0x98, 0xf8, 0x4f, 0xa0, 0x85, 0xc9, 0xc5, 0x60, 0x78, 0x80, + 0x69, 0x10, 0xa7, 0x21, 0xf2, 0xa0, 0x9e, 0x90, 0xd9, 0x24, 0x26, 0xa1, 0xe7, 0x6c, 0x3b, 0x3b, + 0x2d, 0x9c, 0x6d, 0xd1, 0x16, 0x34, 0x38, 0x3b, 0x89, 0x88, 0x38, 0x4b, 0xa9, 0xe7, 0x2a, 0x59, + 0x01, 0xa0, 0x36, 0xb8, 0x2c, 0xf4, 0xaa, 0xdb, 0xce, 0x4e, 0x03, 0xbb, 0x2c, 0xf4, 0xff, 0x74, + 0x61, 0x6d, 0x30, 0x3c, 0x18, 0xc6, 0x91, 0xa0, 0x91, 0x78, 0x42, 0x26, 0x67, 0x14, 0xbd, 0x09, + 0xf5, 0x33, 0x4e, 0xd3, 0x41, 0xa8, 0xcf, 0x6e, 0xf6, 0xd7, 0x7a, 0x24, 0x98, 0xf4, 0x06, 0xc3, + 0x83, 0x2f, 0x35, 0x3c, 0xaa, 0xe0, 0x4c, 0x03, 0x3d, 0x00, 0x90, 0x4b, 0x4c, 0xa7, 0xf1, 0xb9, + 0xbe, 0xaf, 0xd9, 0x47, 0xb6, 0xbe, 0x96, 0x8c, 0x2a, 0xd8, 0xd2, 0x43, 0x18, 0x36, 0xe4, 0xee, + 0x31, 0x4d, 0xa7, 0x8c, 0x73, 0x16, 0x47, 0x43, 0x15, 0xb2, 0x72, 0xac, 0xd9, 0xdf, 0xb2, 0xed, + 0xe7, 0x75, 0x46, 0x15, 0x7c, 0xad, 0x6d, 0xe6, 0xc9, 0x38, 0x3a, 0x67, 0x82, 0x7a, 0x4b, 0x8b, + 0x9e, 0x68, 0x49, 0xe6, 0x89, 0xde, 0xa1, 0x1e, 0xac, 0xc8, 0xdd, 0xa3, 0x98, 0x45, 0x5e, 0x4d, + 0xd9, 0x74, 0x6c, 0x1b, 0x89, 0x8f, 0x2a, 0x38, 0xd7, 0x41, 0xef, 0x41, 0x53, 0xae, 0x87, 0x71, + 0xf4, 0x8c, 0xa5, 0x53, 0x6f, 0x59, 0x99, 0xdc, 0xb1, 0x4d, 0x8c, 0x68, 0x54, 0xc1, 0xb6, 0xe6, + 0x5e, 0x1d, 0x6a, 0xe7, 0x92, 0x5e, 0xff, 0x63, 0xa8, 0x0f, 0x86, 0x07, 0x0f, 0x89, 0x20, 0xd2, + 0x65, 0x12, 0x4c, 0x0c, 0xf9, 0x9e, 0xb3, 0x5d, 0xdd, 0x69, 0xf6, 0x37, 0xb2, 0xb3, 0xec, 0x9c, + 0x60, 0x4b, 0xcf, 0xff, 0xdd, 0x81, 0x95, 0xc1, 0xf0, 0xe0, 0x50, 0x10, 0x41, 0xd1, 0x6b, 0xb0, + 0x9a, 0x52, 0x12, 0xee, 0xd3, 0xd9, 0x88, 0xf0, 0x53, 0xca, 0xd5, 0x29, 0x4b, 0xb8, 0x0c, 0xa2, + 0x77, 0x34, 0x37, 0xca, 0x84, 0x7b, 0xae, 0xba, 0x68, 0xdd, 0x76, 0x5a, 0x49, 0xb0, 0xa5, 0x84, 0x1e, 0x40, 0x9d, 0x29, 0x8a, 0xb8, 0x57, 0x55, 0xfa, 0x9b, 0x99, 0xbe, 0x52, 0xe8, 0x69, 0xfe, - 0xf8, 0x27, 0x91, 0x48, 0xa7, 0x38, 0x53, 0xdd, 0xfc, 0x0c, 0x5a, 0xb6, 0x00, 0x75, 0xa0, 0xfa, - 0x9c, 0x4e, 0x55, 0x1d, 0x35, 0xb0, 0x5c, 0xa2, 0x1d, 0xc3, 0xc3, 0xa2, 0x5a, 0xd1, 0xa6, 0x58, - 0x2b, 0x7c, 0xe0, 0xbe, 0xe7, 0xf8, 0xbf, 0x38, 0xd0, 0xb2, 0x5d, 0x44, 0x9b, 0xb0, 0xc2, 0x42, - 0x1a, 0x09, 0x26, 0xa6, 0xa6, 0xf2, 0xf3, 0xbd, 0xe4, 0x82, 0x46, 0x41, 0x3a, 0x4d, 0x04, 0x8b, - 0xa3, 0x03, 0x3a, 0x35, 0xe5, 0x5f, 0x06, 0xd1, 0x9b, 0xb0, 0x6e, 0x00, 0x1a, 0x62, 0xcd, 0x92, - 0x0e, 0xb1, 0x85, 0xe7, 0x05, 0xe8, 0x7d, 0x68, 0x26, 0x79, 0xa5, 0x71, 0x55, 0x56, 0xed, 0xbd, - 0x7b, 0x8b, 0x0b, 0x94, 0x63, 0x5b, 0x17, 0x6d, 0x43, 0x93, 0x71, 0x93, 0x7e, 0x1a, 0xaa, 0xea, - 0x5a, 0xc1, 0x36, 0xe4, 0xff, 0xe0, 0x00, 0x14, 0xbf, 0xd5, 0xff, 0x28, 0x36, 0xff, 0x11, 0xb4, - 0xcb, 0xe5, 0x7e, 0xab, 0xf3, 0x5b, 0xd0, 0x30, 0xfd, 0x62, 0x14, 0x2a, 0xc7, 0x1b, 0xb8, 0x00, - 0xfc, 0xdf, 0x1d, 0x58, 0x2d, 0x15, 0x00, 0xda, 0x81, 0x35, 0x12, 0x04, 0x34, 0x11, 0x8f, 0xcf, - 0x4f, 0xc6, 0x2c, 0x38, 0xa0, 0xd9, 0x91, 0xb3, 0x30, 0xda, 0x85, 0x8e, 0x89, 0xab, 0x50, 0xd5, - 0xcc, 0xcc, 0xe1, 0xff, 0x5d, 0xe2, 0x25, 0x15, 0x2a, 0x90, 0x91, 0xce, 0x7a, 0x03, 0xe7, 0x7b, - 0xff, 0x27, 0x07, 0x9a, 0x56, 0x6f, 0x79, 0x09, 0x39, 0xcf, 0xc9, 0x3a, 0xca, 0xdb, 0x7e, 0xd5, - 0x26, 0x2b, 0x87, 0x91, 0x0f, 0xad, 0xa2, 0xf3, 0x8d, 0x42, 0x15, 0x53, 0x03, 0x97, 0xb0, 0xc5, - 0x24, 0xd5, 0x6e, 0x20, 0xc9, 0x9f, 0xe4, 0x99, 0x33, 0x8d, 0xfd, 0xb6, 0x70, 0x3e, 0x86, 0x35, - 0xd3, 0x95, 0x30, 0x4d, 0xc6, 0x24, 0xc8, 0x3b, 0xcb, 0xdd, 0x8c, 0x55, 0x5c, 0x12, 0xe3, 0x59, - 0x75, 0xff, 0x6b, 0x07, 0xd6, 0xe7, 0xd4, 0x5e, 0x02, 0x85, 0x45, 0x15, 0xe5, 0xb1, 0x19, 0x0e, - 0xe7, 0x70, 0x3f, 0x81, 0x7b, 0x37, 0xbc, 0x4c, 0xb7, 0x3a, 0x32, 0x53, 0x4e, 0xee, 0x3f, 0xf8, - 0xd7, 0xbe, 0x73, 0xa0, 0x51, 0xbc, 0xfc, 0x77, 0x61, 0x39, 0x49, 0xe9, 0xc5, 0x28, 0x34, 0x4d, - 0xd5, 0xec, 0x4a, 0x97, 0xbb, 0x33, 0x97, 0x23, 0x58, 0x0a, 0x89, 0x20, 0x26, 0x26, 0xb5, 0x46, - 0x3d, 0x40, 0xc1, 0x79, 0x9a, 0xd2, 0x48, 0xe0, 0xe2, 0xa9, 0x50, 0x25, 0xb1, 0x84, 0x17, 0x48, - 0xe4, 0x3f, 0x2c, 0xd8, 0x84, 0x72, 0x41, 0x26, 0x89, 0xaa, 0xea, 0x2a, 0x2e, 0x00, 0xbf, 0xaf, - 0x5c, 0x1c, 0x52, 0x12, 0xd2, 0x54, 0x0e, 0x27, 0xcf, 0x58, 0xca, 0x45, 0xee, 0x63, 0xb6, 0xbd, - 0xcd, 0x49, 0xff, 0x53, 0x58, 0xc5, 0xe4, 0xf2, 0x38, 0xa5, 0xd4, 0xd0, 0xf9, 0x2f, 0x67, 0x1c, - 0x7f, 0x00, 0x77, 0x4a, 0x07, 0x3d, 0x65, 0xe2, 0x6c, 0xa4, 0x8c, 0x52, 0x72, 0x69, 0x06, 0x0d, - 0x7d, 0x60, 0x01, 0x98, 0xc1, 0xc8, 0xcd, 0x07, 0xa3, 0x6f, 0x5d, 0x00, 0xcb, 0x97, 0x6d, 0x68, - 0x8a, 0x94, 0x52, 0x19, 0xe0, 0x28, 0xd4, 0x8f, 0x6c, 0x03, 0xdb, 0x90, 0x3c, 0x9e, 0x04, 0x63, - 0xbd, 0xcb, 0x7a, 0x5c, 0x0e, 0xa0, 0xd7, 0xa0, 0xcd, 0x23, 0x92, 0xf0, 0xb3, 0x58, 0xec, 0x13, - 0x2e, 0x7f, 0x3e, 0x3d, 0x83, 0xcd, 0xa0, 0xf2, 0x1e, 0x33, 0xfd, 0xc9, 0x01, 0x41, 0xa5, 0xa3, - 0x85, 0x6d, 0xe8, 0x86, 0xbc, 0xd5, 0xfe, 0x5e, 0xde, 0x96, 0x67, 0xf2, 0x56, 0x4a, 0x48, 0x7d, - 0xa6, 0x6a, 0xba, 0x00, 0x8c, 0x1f, 0x19, 0xff, 0xbc, 0x15, 0xf5, 0x7c, 0x59, 0x88, 0xff, 0xbd, - 0xa3, 0x29, 0xfa, 0xcb, 0xac, 0x6f, 0x40, 0x8d, 0x04, 0xe3, 0x9c, 0x16, 0xbd, 0x41, 0x1f, 0x42, - 0x5b, 0xe4, 0xd6, 0xc7, 0xd3, 0x44, 0xb7, 0xad, 0xb6, 0x19, 0xa6, 0x8e, 0x4b, 0x22, 0x3c, 0xa3, - 0x5a, 0xf2, 0x7b, 0xe9, 0x86, 0x6a, 0xaf, 0x15, 0xd5, 0xbe, 0xfb, 0x10, 0xd0, 0xfc, 0x6f, 0x86, - 0x1a, 0x50, 0xeb, 0x87, 0x13, 0x16, 0x75, 0x2a, 0x08, 0x60, 0xf9, 0x69, 0xca, 0x04, 0x4d, 0x3b, - 0x8e, 0x5c, 0x63, 0x75, 0x55, 0xc7, 0x45, 0x4d, 0xa8, 0xeb, 0xd6, 0x16, 0x76, 0xaa, 0xbb, 0xaf, - 0x43, 0xbb, 0xec, 0x97, 0x54, 0xfd, 0xfc, 0xe4, 0x2b, 0x1a, 0x88, 0x4e, 0x45, 0x9e, 0x76, 0x94, - 0x90, 0x80, 0x76, 0x9c, 0xfd, 0x57, 0x7e, 0xbc, 0xea, 0x3a, 0x2f, 0xae, 0xba, 0xce, 0xaf, 0x57, - 0x5d, 0xe7, 0x9b, 0xeb, 0x6e, 0xe5, 0xc5, 0x75, 0xb7, 0xf2, 0xf3, 0x75, 0xb7, 0xf2, 0x65, 0x4d, - 0x0d, 0xfb, 0x27, 0xcb, 0x6a, 0xb6, 0x7f, 0xe7, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x25, - 0x31, 0x18, 0x0f, 0x0c, 0x00, 0x00, + 0xf8, 0xa7, 0x91, 0x48, 0x67, 0x38, 0x53, 0xdd, 0xfc, 0x1c, 0x5a, 0xb6, 0x00, 0x75, 0xa0, 0xfa, + 0x9c, 0xce, 0x54, 0x1d, 0x35, 0xb0, 0x5c, 0xa2, 0x1d, 0xc3, 0xc3, 0x75, 0xb5, 0xa2, 0x4d, 0xb1, + 0x56, 0xf8, 0xd0, 0x7d, 0xdf, 0xf1, 0x7f, 0x75, 0xa0, 0x65, 0xbb, 0x88, 0x36, 0x61, 0x85, 0x85, + 0x34, 0x12, 0x4c, 0xcc, 0x4c, 0xe5, 0xe7, 0x7b, 0xc9, 0x05, 0x8d, 0x82, 0x74, 0x96, 0x08, 0x16, + 0x47, 0xfb, 0x74, 0x66, 0xca, 0xbf, 0x0c, 0xa2, 0xb7, 0x60, 0xdd, 0x00, 0x34, 0xc4, 0x9a, 0x25, + 0x1d, 0x62, 0x0b, 0x2f, 0x0a, 0xd0, 0x07, 0xd0, 0x4c, 0xf2, 0x4a, 0xe3, 0xaa, 0xac, 0xda, 0xfd, + 0x7b, 0xd7, 0x17, 0x28, 0xc7, 0xb6, 0x2e, 0xda, 0x86, 0x26, 0xe3, 0x26, 0xfd, 0x34, 0x54, 0xd5, + 0xb5, 0x82, 0x6d, 0xc8, 0xff, 0xd1, 0x01, 0x28, 0x7e, 0xab, 0x57, 0x28, 0x36, 0xff, 0x11, 0xb4, + 0xcb, 0xe5, 0x7e, 0xab, 0xf3, 0x5b, 0xd0, 0x30, 0xfd, 0x62, 0x1c, 0x2a, 0xc7, 0x1b, 0xb8, 0x00, + 0xfc, 0x3f, 0x1c, 0x58, 0x2d, 0x15, 0x00, 0xda, 0x81, 0x35, 0x12, 0x04, 0x34, 0x11, 0x8f, 0xcf, + 0x8e, 0x27, 0x2c, 0xd8, 0xa7, 0xd9, 0x91, 0xf3, 0x30, 0xda, 0x85, 0x8e, 0x89, 0xab, 0x50, 0xd5, + 0xcc, 0x2c, 0xe0, 0xff, 0x5f, 0xe2, 0x25, 0x15, 0x2a, 0x90, 0xb1, 0xce, 0x7a, 0x03, 0xe7, 0x7b, + 0xff, 0x67, 0x07, 0x9a, 0x56, 0x6f, 0x79, 0x09, 0x39, 0xcf, 0xc9, 0x3a, 0xcc, 0xdb, 0x7e, 0xd5, + 0x26, 0x2b, 0x87, 0x91, 0x0f, 0xad, 0xa2, 0xf3, 0x8d, 0x43, 0x15, 0x53, 0x03, 0x97, 0xb0, 0xeb, + 0x49, 0xaa, 0xdd, 0x40, 0x92, 0x3f, 0xcd, 0x33, 0x67, 0x1a, 0xfb, 0x6d, 0xe1, 0x7c, 0x02, 0x6b, + 0xa6, 0x2b, 0x61, 0x9a, 0x4c, 0x48, 0x90, 0x77, 0x96, 0xbb, 0x19, 0xab, 0xb8, 0x24, 0xc6, 0xf3, + 0xea, 0xfe, 0x37, 0x0e, 0xac, 0x2f, 0xa8, 0xbd, 0x04, 0x0a, 0x8b, 0x2a, 0xca, 0x63, 0x33, 0x1c, + 0x2e, 0xe0, 0x7e, 0x02, 0xf7, 0x6e, 0x78, 0x99, 0x6e, 0x75, 0x64, 0xae, 0x9c, 0xdc, 0x7f, 0xf1, + 0xaf, 0x7d, 0xef, 0x40, 0xa3, 0x78, 0xf9, 0xef, 0xc2, 0x72, 0x92, 0xd2, 0xf3, 0x71, 0x68, 0x9a, + 0xaa, 0xd9, 0x95, 0x2e, 0x77, 0xe7, 0x2e, 0x47, 0xb0, 0x14, 0x12, 0x41, 0x4c, 0x4c, 0x6a, 0x8d, + 0x7a, 0x80, 0x82, 0xb3, 0x34, 0xa5, 0x91, 0xc0, 0xc5, 0x53, 0xa1, 0x4a, 0x62, 0x09, 0x5f, 0x23, + 0x91, 0xff, 0xb0, 0x60, 0x53, 0xca, 0x05, 0x99, 0x26, 0xaa, 0xaa, 0xab, 0xb8, 0x00, 0xfc, 0x81, + 0x72, 0x71, 0x44, 0x49, 0x48, 0x53, 0x39, 0x9c, 0x3c, 0x63, 0x29, 0x17, 0xb9, 0x8f, 0xd9, 0xf6, + 0x36, 0x27, 0xfd, 0xcf, 0x60, 0x15, 0x93, 0x8b, 0xa3, 0x94, 0x52, 0x43, 0xe7, 0x7f, 0x9c, 0x71, + 0xfc, 0x21, 0xdc, 0x29, 0x1d, 0xf4, 0x94, 0x89, 0xd3, 0xb1, 0x32, 0x4a, 0xc9, 0x85, 0x19, 0x34, + 0xf4, 0x81, 0x05, 0x60, 0x06, 0x23, 0x37, 0x1f, 0x8c, 0xbe, 0x73, 0x01, 0x2c, 0x5f, 0xb6, 0xa1, + 0x29, 0x52, 0x4a, 0x65, 0x80, 0xe3, 0x50, 0x3f, 0xb2, 0x0d, 0x6c, 0x43, 0xf2, 0x78, 0x12, 0x4c, + 0xf4, 0x2e, 0xeb, 0x71, 0x39, 0x80, 0x5e, 0x87, 0x36, 0x8f, 0x48, 0xc2, 0x4f, 0x63, 0xb1, 0x47, + 0xb8, 0xfc, 0xf9, 0xf4, 0x0c, 0x36, 0x87, 0xca, 0x7b, 0xcc, 0xf4, 0x27, 0x07, 0x04, 0x95, 0x8e, + 0x16, 0xb6, 0xa1, 0x1b, 0xf2, 0x56, 0xfb, 0x67, 0x79, 0x5b, 0x9e, 0xcb, 0x5b, 0x29, 0x21, 0xf5, + 0xb9, 0xaa, 0xe9, 0x02, 0x30, 0x7e, 0x68, 0xfc, 0xf3, 0x56, 0xd4, 0xf3, 0x65, 0x21, 0xfe, 0x0f, + 0x8e, 0xa6, 0xe8, 0x6f, 0xb3, 0xbe, 0x01, 0x35, 0x12, 0x4c, 0x72, 0x5a, 0xf4, 0x06, 0x7d, 0x04, + 0x6d, 0x91, 0x5b, 0x1f, 0xcd, 0x12, 0xdd, 0xb6, 0xda, 0x66, 0x98, 0x3a, 0x2a, 0x89, 0xf0, 0x9c, + 0x6a, 0xc9, 0xef, 0xa5, 0x1b, 0xaa, 0xbd, 0x56, 0x54, 0xfb, 0xee, 0x43, 0x40, 0x8b, 0xbf, 0x19, + 0x6a, 0x40, 0x6d, 0x10, 0x4e, 0x59, 0xd4, 0xa9, 0x20, 0x80, 0xe5, 0xa7, 0x29, 0x13, 0x34, 0xed, + 0x38, 0x72, 0x8d, 0xd5, 0x55, 0x1d, 0x17, 0x35, 0xa1, 0xae, 0x5b, 0x5b, 0xd8, 0xa9, 0xee, 0xbe, + 0x01, 0xed, 0xb2, 0x5f, 0x52, 0xf5, 0x8b, 0xe3, 0xaf, 0x69, 0x20, 0x3a, 0x15, 0x79, 0xda, 0x61, + 0x42, 0x02, 0xda, 0x71, 0xf6, 0xfa, 0x3f, 0x5d, 0x76, 0x9d, 0x17, 0x97, 0x5d, 0xe7, 0xb7, 0xcb, + 0xae, 0xf3, 0xed, 0x55, 0xb7, 0xf2, 0xe2, 0xaa, 0x5b, 0xf9, 0xe5, 0xaa, 0x5b, 0xf9, 0xca, 0xbb, + 0x69, 0xfe, 0x3f, 0x5e, 0x56, 0xe3, 0xfe, 0xbb, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x62, + 0x40, 0x97, 0x22, 0x0c, 0x00, 0x00, } func (m *RawACLRecord) Marshal() (dAtA []byte, err error) { diff --git a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto index 73a3fc1f..5d69e94f 100644 --- a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto +++ b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto @@ -1,6 +1,6 @@ syntax = "proto3"; package acl; -option go_package = "aclpb"; +option go_package = "pkg/acl/aclchanges/aclpb"; // ACL protos diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index d7a849fb..91b3bb47 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -213,11 +213,12 @@ func (st *ACLState) applyChangeContent(ch *aclpb.ACLContentValue) error { func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLUserPermissionChange) error { chIdentity := string(ch.Identity) - if _, exists := st.userStates[chIdentity]; !exists { + state, exists := st.userStates[chIdentity] + if !exists { return ErrNoSuchUser } - st.userStates[chIdentity].Permissions = ch.Permissions + state.Permissions = ch.Permissions return nil } @@ -339,12 +340,12 @@ func (st *ACLState) applyUserRemove(ch *aclpb.ACLUserRemove) error { func (st *ACLState) applyUserConfirm(ch *aclpb.ACLUserConfirm) error { chIdentity := string(ch.Identity) - if _, exists := st.userStates[chIdentity]; !exists { + state, exists := st.userStates[chIdentity] + if !exists { return ErrNoSuchUser } - userState := st.userStates[chIdentity] - userState.IsConfirmed = true + state.IsConfirmed = true return nil } diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index 67985c82..7b478fd8 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -53,7 +53,7 @@ func (c *changeBuilder) ConvertFromRaw(rawIdChange *aclpb.RawTreeChangeWithId, v } } - raw := &aclpb.RawTreeChange{} + raw := &aclpb.RawTreeChange{} // TODO: sync pool err = proto.Unmarshal(rawIdChange.GetRawChange(), raw) if err != nil { return diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index c6ffeca7..31365b87 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -58,7 +58,7 @@ type ObjectTree interface { Storage() storage.TreeStorage DebugDump() (string, error) - AddContent(ctx context.Context, content SignableChangeContent) (*aclpb.RawTreeChangeWithId, error) + AddContent(ctx context.Context, content SignableChangeContent) (AddResult, error) AddRawChanges(ctx context.Context, changes ...*aclpb.RawTreeChangeWithId) (AddResult, error) Close() error @@ -67,11 +67,11 @@ type ObjectTree interface { type objectTree struct { treeStorage storage.TreeStorage changeBuilder ChangeBuilder - updateListener ObjectTreeUpdateListener validator ObjectTreeValidator rawChangeLoader *rawChangeLoader treeBuilder *treeBuilder aclList list.ACLList + updateListener ObjectTreeUpdateListener id string header *aclpb.TreeHeader @@ -148,7 +148,7 @@ func (ot *objectTree) Storage() storage.TreeStorage { return ot.treeStorage } -func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeContent) (rawChange *aclpb.RawTreeChangeWithId, err error) { +func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeContent) (res AddResult, err error) { defer func() { if err == nil && ot.updateListener != nil { ot.updateListener.Update(ot) @@ -160,9 +160,13 @@ func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeCont return } + // saving old heads + oldHeads := make([]string, 0, len(ot.tree.Heads())) + oldHeads = append(oldHeads, ot.tree.Heads()...) + objChange, rawChange, err := ot.changeBuilder.BuildContent(payload) if content.IsSnapshot { - // clearing tree, because we already fixed everything in the last snapshot + // clearing tree, because we already saved everything in the last snapshot ot.tree = &Tree{} } err = ot.tree.AddMergedHead(objChange) @@ -176,6 +180,16 @@ func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeCont } err = ot.treeStorage.SetHeads([]string{objChange.Id}) + if err != nil { + return + } + + res = AddResult{ + OldHeads: oldHeads, + Heads: []string{objChange.Id}, + Added: []*aclpb.RawTreeChangeWithId{rawChange}, + Mode: Append, + } return } From c94a0c94f333ffa6fb45ae3af768bc36119ce5fd Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 13 Sep 2022 16:34:26 +0200 Subject: [PATCH 067/219] Add .idea to gitignore --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 66fd13c9..2bc7dc72 100644 --- a/.gitignore +++ b/.gitignore @@ -11,5 +11,12 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out +# Intelli-J files +.idea + +# MacOS file that stores custom attributes of its containing folder, +# such as folder view options, icon positions, and other visual information +.DS_Store + # Dependency directories (remove the comment below to include it) # vendor/ From 206b695e628f7036a3864b192543d60afe6da4b8 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 13 Sep 2022 22:26:51 +0200 Subject: [PATCH 068/219] Add sync handler --- common/commonspace/cache/treecache.go | 17 ++ .../commonspace/spacesyncproto/spacesync.go | 35 +++ common/commonspace/syncservice/synchandler.go | 247 ++++++++++++++++++ 3 files changed, 299 insertions(+) create mode 100644 common/commonspace/cache/treecache.go create mode 100644 common/commonspace/spacesyncproto/spacesync.go create mode 100644 common/commonspace/syncservice/synchandler.go diff --git a/common/commonspace/cache/treecache.go b/common/commonspace/cache/treecache.go new file mode 100644 index 00000000..342c9042 --- /dev/null +++ b/common/commonspace/cache/treecache.go @@ -0,0 +1,17 @@ +package cache + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" +) + +type TreeResult struct { + Release func() + Tree tree.ObjectTree +} + +type TreeCache interface { + GetTree(ctx context.Context, id string) (TreeResult, error) + AddTree(ctx context.Context, payload storage.TreeStorageCreatePayload) error +} diff --git a/common/commonspace/spacesyncproto/spacesync.go b/common/commonspace/spacesyncproto/spacesync.go new file mode 100644 index 00000000..66de459d --- /dev/null +++ b/common/commonspace/spacesyncproto/spacesync.go @@ -0,0 +1,35 @@ +package spacesyncproto + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + +type SpaceStream = DRPCSpace_StreamStream + +func WrapHeadUpdate(update *ObjectHeadUpdate, header *aclpb.TreeHeader, treeId string) *ObjectSyncMessage { + return &ObjectSyncMessage{ + Content: &ObjectSyncContentValue{ + Value: &ObjectSyncContentValue_HeadUpdate{HeadUpdate: update}, + }, + TreeHeader: header, + TreeId: treeId, + } +} + +func WrapFullRequest(request *ObjectFullSyncRequest, header *aclpb.TreeHeader, treeId string) *ObjectSyncMessage { + return &ObjectSyncMessage{ + Content: &ObjectSyncContentValue{ + Value: &ObjectSyncContentValue_FullSyncRequest{FullSyncRequest: request}, + }, + TreeHeader: header, + TreeId: treeId, + } +} + +func WrapFullResponse(response *ObjectFullSyncResponse, header *aclpb.TreeHeader, treeId string) *ObjectSyncMessage { + return &ObjectSyncMessage{ + Content: &ObjectSyncContentValue{ + Value: &ObjectSyncContentValue_FullSyncResponse{FullSyncResponse: response}, + }, + TreeHeader: header, + TreeId: treeId, + } +} diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go new file mode 100644 index 00000000..fed8f8c9 --- /dev/null +++ b/common/commonspace/syncservice/synchandler.go @@ -0,0 +1,247 @@ +package syncservice + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" +) + +type syncHandler struct { + treeCache cache.TreeCache + syncClient SyncClient +} + +type SyncHandler interface { + HandleSyncMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) +} + +type SyncClient interface { + SendSyncMessage(peerId string, msg *spacesyncproto.ObjectSyncMessage) (err error) +} + +func newSyncHandler(treeCache cache.TreeCache, syncClient SyncClient) *syncHandler { + return &syncHandler{ + treeCache: treeCache, + syncClient: syncClient, + } +} + +func (s *syncHandler) HandleSyncMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) error { + msg := message.GetContent() + switch { + case msg.GetFullSyncRequest() != nil: + return s.HandleFullSyncRequest(ctx, senderId, msg.GetFullSyncRequest(), message.GetTreeHeader(), message.GetTreeId()) + case msg.GetFullSyncResponse() != nil: + return s.HandleFullSyncResponse(ctx, senderId, msg.GetFullSyncResponse(), message.GetTreeHeader(), message.GetTreeId()) + case msg.GetHeadUpdate() != nil: + return s.HandleHeadUpdate(ctx, senderId, msg.GetHeadUpdate(), message.GetTreeHeader(), message.GetTreeId()) + } + return nil +} + +func (s *syncHandler) HandleHeadUpdate( + ctx context.Context, + senderId string, + update *spacesyncproto.ObjectHeadUpdate, + header *aclpb.TreeHeader, + treeId string) (err error) { + + var ( + fullRequest *spacesyncproto.ObjectFullSyncRequest + snapshotPath []string + result tree.AddResult + // in case update changes are empty then we want to sync the whole tree + sendChangesOnFullSync = len(update.Changes) == 0 + ) + + res, err := s.treeCache.GetTree(ctx, treeId) + if err != nil { + return + } + + err = func() error { + objTree := res.Tree + objTree.Lock() + defer res.Release() + defer objTree.Unlock() + + if slice.UnsortedEquals(update.Heads, objTree.Heads()) { + return nil + } + + result, err = objTree.AddRawChanges(ctx, update.Changes...) + if err != nil { + return err + } + + // if we couldn't add all the changes + shouldFullSync := len(update.Changes) != len(result.Added) + snapshotPath = objTree.SnapshotPath() + if shouldFullSync { + fullRequest, err = s.prepareFullSyncRequest(objTree, sendChangesOnFullSync) + if err != nil { + return err + } + } + return nil + }() + + // if there are no such tree + if err == storage.ErrUnknownTreeId { + fullRequest = &spacesyncproto.ObjectFullSyncRequest{} + } + // if we have incompatible heads, or we haven't seen the tree at all + if fullRequest != nil { + return s.syncClient.SendSyncMessage(senderId, spacesyncproto.WrapFullRequest(fullRequest, header, treeId)) + } + // if error or nothing has changed + if err != nil || len(result.Added) == 0 { + return err + } + + // otherwise sending heads update message + newUpdate := &spacesyncproto.ObjectHeadUpdate{ + Heads: result.Heads, + Changes: result.Added, + SnapshotPath: snapshotPath, + } + return s.syncClient.SendSyncMessage("", spacesyncproto.WrapHeadUpdate(newUpdate, header, treeId)) +} + +func (s *syncHandler) HandleFullSyncRequest( + ctx context.Context, + senderId string, + request *spacesyncproto.ObjectFullSyncRequest, + header *aclpb.TreeHeader, + treeId string) (err error) { + + var fullResponse *spacesyncproto.ObjectFullSyncResponse + + res, err := s.treeCache.GetTree(ctx, treeId) + if err != nil { + return + } + + // TODO: check if sync request contains changes and add them (also do head update in this case) + err = func() error { + objTree := res.Tree + objTree.Lock() + defer res.Release() + defer objTree.Unlock() + fullResponse, err = s.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Heads, objTree) + if err != nil { + return err + } + return nil + }() + + if err != nil { + return err + } + return s.syncClient.SendSyncMessage(senderId, spacesyncproto.WrapFullResponse(fullResponse, header, treeId)) +} + +func (s *syncHandler) HandleFullSyncResponse( + ctx context.Context, + senderId string, + response *spacesyncproto.ObjectFullSyncResponse, + header *aclpb.TreeHeader, + treeId string) (err error) { + + var ( + snapshotPath []string + result tree.AddResult + ) + + res, err := s.treeCache.GetTree(ctx, treeId) + if err != nil { + return + } + + err = func() error { + objTree := res.Tree + objTree.Lock() + defer res.Release() + defer objTree.Unlock() + + // if we already have the heads for whatever reason + if slice.UnsortedEquals(response.Heads, objTree.Heads()) { + return nil + } + + result, err = objTree.AddRawChanges(ctx, response.Changes...) + if err != nil { + return err + } + snapshotPath = objTree.SnapshotPath() + return nil + }() + + // if error or nothing has changed + if (err != nil || len(result.Added) == 0) && err != storage.ErrUnknownTreeId { + return err + } + // if we have a new tree + if err == storage.ErrUnknownTreeId { + err = s.addTree(ctx, response, header, treeId) + if err != nil { + return err + } + result = tree.AddResult{ + OldHeads: []string{}, + Heads: response.Heads, + Added: response.Changes, + } + } + // sending heads update message + newUpdate := &spacesyncproto.ObjectHeadUpdate{ + Heads: result.Heads, + Changes: result.Added, + SnapshotPath: snapshotPath, + } + return s.syncClient.SendSyncMessage("", spacesyncproto.WrapHeadUpdate(newUpdate, header, treeId)) +} + +func (s *syncHandler) prepareFullSyncRequest(t tree.ObjectTree, sendOwnChanges bool) (*spacesyncproto.ObjectFullSyncRequest, error) { + // TODO: add send own changes logic + return &spacesyncproto.ObjectFullSyncRequest{ + Heads: t.Heads(), + SnapshotPath: t.SnapshotPath(), + }, nil +} + +func (s *syncHandler) prepareFullSyncResponse( + treeId string, + theirPath, theirHeads []string, + t tree.ObjectTree) (*spacesyncproto.ObjectFullSyncResponse, error) { + ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath, theirHeads) + if err != nil { + return nil, err + } + + return &spacesyncproto.ObjectFullSyncResponse{ + Heads: t.Heads(), + Changes: ourChanges, + SnapshotPath: t.SnapshotPath(), + }, nil +} + +func (s *syncHandler) addTree( + ctx context.Context, + response *spacesyncproto.ObjectFullSyncResponse, + header *aclpb.TreeHeader, + treeId string) error { + + return s.treeCache.AddTree( + ctx, + storage.TreeStorageCreatePayload{ + TreeId: treeId, + Header: header, + Changes: response.Changes, + Heads: response.Heads, + }) +} From f900cbff0ba39c9b3d7c4e43c8fcfe11dbce0303 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 14 Sep 2022 18:54:10 +0200 Subject: [PATCH 069/219] WIP sync --- common/commonspace/rpchandler.go | 1 + common/commonspace/syncservice/streampool.go | 165 ++++++++++ common/commonspace/syncservice/synchandler.go | 27 +- common/commonspace/syncservice/syncservice.go | 293 +----------------- pkg/acl/account/accountdata.go | 2 +- service/sync/requesthandler/requesthandler.go | 2 - 6 files changed, 197 insertions(+), 293 deletions(-) create mode 100644 common/commonspace/syncservice/streampool.go diff --git a/common/commonspace/rpchandler.go b/common/commonspace/rpchandler.go index 3ce71e1a..9a2d6993 100644 --- a/common/commonspace/rpchandler.go +++ b/common/commonspace/rpchandler.go @@ -21,5 +21,6 @@ func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncR } func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) error { + return fmt.Errorf("not implemented") } diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go new file mode 100644 index 00000000..03cc6dcd --- /dev/null +++ b/common/commonspace/syncservice/streampool.go @@ -0,0 +1,165 @@ +package syncservice + +import ( + "errors" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/libp2p/go-libp2p-core/sec" + "storj.io/drpc" + "storj.io/drpc/drpcctx" + "sync" +) + +var ErrEmptyPeer = errors.New("don't have such a peer") +var ErrStreamClosed = errors.New("stream is already closed") + +const maxSimultaneousOperationsPerStream = 10 + +// StreamPool can be made generic to work with different streams +type StreamPool interface { + AddStream(stream spacesyncproto.SpaceStream) (err error) + SyncClient +} + +type SyncClient interface { + SendAsync(peerId string, message *spacesyncproto.ObjectSyncMessage) (err error) + BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) +} + +type MessageHandler interface { + HandleMessage(peerId string, message *spacesyncproto.ObjectSyncMessage) +} + +type streamPool struct { + sync.Mutex + peerStreams map[string]spacesyncproto.SpaceStream + messageHandler MessageHandler +} + +func newStreamPool(messageHandler MessageHandler) StreamPool { + return &streamPool{ + peerStreams: make(map[string]spacesyncproto.SpaceStream), + messageHandler: messageHandler, + } +} + +func (s *streamPool) SendAsync(peerId string, message *spacesyncproto.ObjectSyncMessage) (err error) { + stream, err := s.getStream(peerId) + if err != nil { + return + } + + return stream.Send(message) +} + +func (s *streamPool) getStream(id string) (stream spacesyncproto.SpaceStream, err error) { + s.Lock() + defer s.Unlock() + stream, exists := s.peerStreams[id] + if !exists { + err = ErrEmptyPeer + return + } + + select { + case <-stream.Context().Done(): + delete(s.peerStreams, id) + err = ErrStreamClosed + default: + } + + return +} + +func (s *streamPool) getAllStreams() (streams []spacesyncproto.SpaceStream) { + s.Lock() + defer s.Unlock() +Loop: + for id, stream := range s.peerStreams { + select { + case <-stream.Context().Done(): + delete(s.peerStreams, id) + continue Loop + default: + } + streams = append(streams, stream) + } + + return +} + +func (s *streamPool) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) { + streams := s.getAllStreams() + for _, stream := range streams { + if err = stream.Send(message); err != nil { + // TODO: add logging + } + } + + return nil +} + +func (s *streamPool) AddStream(stream spacesyncproto.SpaceStream) (err error) { + s.Lock() + defer s.Unlock() + peerId, err := getPeerIdFromStream(stream) + if err != nil { + return + } + + s.peerStreams[peerId] = stream + go s.readPeerLoop(peerId, stream) + return +} + +func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStream) (err error) { + limiter := make(chan struct{}, maxSimultaneousOperationsPerStream) + for i := 0; i < maxSimultaneousOperationsPerStream; i++ { + limiter <- struct{}{} + } + +Loop: + for { + msg, err := stream.Recv() + if err != nil { + break + } + select { + case <-limiter: + case <-stream.Context().Done(): + break Loop + } + go func() { + defer func() { + limiter <- struct{}{} + }() + + s.messageHandler.HandleMessage(peerId, msg) + }() + } + if err = s.removePeer(peerId); err != nil { + // TODO: log something + } + return +} + +func (s *streamPool) removePeer(peerId string) (err error) { + s.Lock() + defer s.Unlock() + _, ok := s.peerStreams[peerId] + if !ok { + return ErrEmptyPeer + } + delete(s.peerStreams, peerId) + return +} + +func getPeerIdFromStream(stream drpc.Stream) (string, error) { + ctx := stream.Context() + conn, ok := ctx.Value(drpcctx.TransportKey{}).(sec.SecureConn) + if !ok { + return "", fmt.Errorf("incorrect connection type in stream") + } + + return conn.RemotePeer().String(), nil +} diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index fed8f8c9..2aa2ea9b 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -19,10 +19,6 @@ type SyncHandler interface { HandleSyncMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) } -type SyncClient interface { - SendSyncMessage(peerId string, msg *spacesyncproto.ObjectSyncMessage) (err error) -} - func newSyncHandler(treeCache cache.TreeCache, syncClient SyncClient) *syncHandler { return &syncHandler{ treeCache: treeCache, @@ -96,7 +92,7 @@ func (s *syncHandler) HandleHeadUpdate( } // if we have incompatible heads, or we haven't seen the tree at all if fullRequest != nil { - return s.syncClient.SendSyncMessage(senderId, spacesyncproto.WrapFullRequest(fullRequest, header, treeId)) + return s.syncClient.SendAsync(senderId, spacesyncproto.WrapFullRequest(fullRequest, header, treeId)) } // if error or nothing has changed if err != nil || len(result.Added) == 0 { @@ -109,7 +105,7 @@ func (s *syncHandler) HandleHeadUpdate( Changes: result.Added, SnapshotPath: snapshotPath, } - return s.syncClient.SendSyncMessage("", spacesyncproto.WrapHeadUpdate(newUpdate, header, treeId)) + return s.syncClient.BroadcastAsync(spacesyncproto.WrapHeadUpdate(newUpdate, header, treeId)) } func (s *syncHandler) HandleFullSyncRequest( @@ -142,7 +138,7 @@ func (s *syncHandler) HandleFullSyncRequest( if err != nil { return err } - return s.syncClient.SendSyncMessage(senderId, spacesyncproto.WrapFullResponse(fullResponse, header, treeId)) + return s.syncClient.SendAsync(senderId, spacesyncproto.WrapFullResponse(fullResponse, header, treeId)) } func (s *syncHandler) HandleFullSyncResponse( @@ -163,21 +159,24 @@ func (s *syncHandler) HandleFullSyncResponse( } err = func() error { - objTree := res.Tree - objTree.Lock() + syncTree := res.Tree + syncTree.Lock() defer res.Release() - defer objTree.Unlock() + defer syncTree.Unlock() // if we already have the heads for whatever reason - if slice.UnsortedEquals(response.Heads, objTree.Heads()) { + if slice.UnsortedEquals(response.Heads, syncTree.Heads()) { return nil } - result, err = objTree.AddRawChanges(ctx, response.Changes...) + // syncTree -> syncService: HeadUpdate() + // AddRawChanges -> syncTree.addRawChanges(); syncService.HeadUpdate() + result, err = syncTree.AddRawChanges(ctx, response.Changes...) + if err != nil { return err } - snapshotPath = objTree.SnapshotPath() + snapshotPath = syncTree.SnapshotPath() return nil }() @@ -203,7 +202,7 @@ func (s *syncHandler) HandleFullSyncResponse( Changes: result.Added, SnapshotPath: snapshotPath, } - return s.syncClient.SendSyncMessage("", spacesyncproto.WrapHeadUpdate(newUpdate, header, treeId)) + return s.syncClient.BroadcastAsync(spacesyncproto.WrapHeadUpdate(newUpdate, header, treeId)) } func (s *syncHandler) prepareFullSyncRequest(t tree.ObjectTree, sendOwnChanges bool) (*spacesyncproto.ObjectFullSyncRequest, error) { diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 0f133fd9..c9ce956d 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -1,291 +1,32 @@ package syncservice import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" - "go.uber.org/zap" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" ) -type syncService struct { - treeCache treecache.Service - account account.Service - messageService MessageSender -} - -var log = logger.NewNamed("requesthandler") - -func New() app.Component { - return &syncService{} -} - type SyncService interface { - HandleSyncMessage(ctx context.Context, senderId string, request *syncproto.Sync) (err error) + NotifyHeadUpdate(treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) + StreamPool() StreamPool } -type MessageSender interface { - SendMessageAsync(peerId string, msg *syncproto.Sync) error - SendToSpaceAsync(spaceId string, msg *syncproto.Sync) error +type syncService struct { + syncHandler SyncHandler + streamPool StreamPool + configuration nodeconf.Configuration } -const CName = "SyncRequestHandler" - -func (r *syncService) Init(a *app.App) (err error) { - r.treeCache = a.MustComponent(treecache.CName).(treecache.Service) - r.account = a.MustComponent(account.CName).(account.Service) - r.messageService = a.MustComponent("MessageService").(MessageSender) - return nil +func (s *syncService) NotifyHeadUpdate(treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) { + msg := spacesyncproto.WrapHeadUpdate(update, header, treeId) + all + return s.streamPool.BroadcastAsync(msg) } -func (r *syncService) Name() (name string) { - return CName +func (s *syncService) StreamPool() StreamPool { + return s.streamPool } -func (r *syncService) Run(ctx context.Context) (err error) { - return nil -} - -func (r *syncService) Close(ctx context.Context) (err error) { - return nil -} - -func (r *syncService) HandleSyncMessage(ctx context.Context, senderId string, content *syncproto.Sync) error { - msg := content.GetMessage() - switch { - case msg.GetFullSyncRequest() != nil: - return r.HandleFullSyncRequest(ctx, senderId, msg.GetFullSyncRequest(), content.GetTreeHeader(), content.GetTreeId()) - case msg.GetFullSyncResponse() != nil: - return r.HandleFullSyncResponse(ctx, senderId, msg.GetFullSyncResponse(), content.GetTreeHeader(), content.GetTreeId()) - case msg.GetHeadUpdate() != nil: - return r.HandleHeadUpdate(ctx, senderId, msg.GetHeadUpdate(), content.GetTreeHeader(), content.GetTreeId()) - case msg.GetAclList() != nil: - return r.HandleACLList(ctx, senderId, msg.GetAclList(), content.GetTreeHeader(), content.GetTreeId()) - } - return nil -} - -func (r *syncService) HandleHeadUpdate( - ctx context.Context, - senderId string, - update *syncproto.SyncHeadUpdate, - header *aclpb.Header, - treeId string) (err error) { - - var ( - fullRequest *syncproto.SyncFullRequest - snapshotPath []string - result tree.AddResult - ) - log.With(zap.String("peerId", senderId), zap.String("treeId", treeId)). - Debug("processing head update") - - err = r.treeCache.Do(ctx, treeId, func(obj any) error { - objTree := obj.(tree.ObjectTree) - objTree.Lock() - defer objTree.Unlock() - - if slice.UnsortedEquals(update.Heads, objTree.Heads()) { - return nil - } - - result, err = objTree.AddRawChanges(ctx, update.Changes...) - if err != nil { - return err - } - - // if we couldn't add all the changes - shouldFullSync := len(update.Changes) != len(result.Added) - snapshotPath = objTree.SnapshotPath() - if shouldFullSync { - fullRequest, err = r.prepareFullSyncRequest(objTree) - if err != nil { - return err - } - } - return nil - }) - - // if there are no such tree - if err == storage.ErrUnknownTreeId { - fullRequest = &syncproto.SyncFullRequest{} - } - // if we have incompatible heads, or we haven't seen the tree at all - if fullRequest != nil { - return r.messageService.SendMessageAsync(senderId, syncproto.WrapFullRequest(fullRequest, header, treeId)) - } - // if error or nothing has changed - if err != nil || len(result.Added) == 0 { - return err - } - - // otherwise sending heads update message - newUpdate := &syncproto.SyncHeadUpdate{ - Heads: result.Heads, - Changes: result.Added, - SnapshotPath: snapshotPath, - } - return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) -} - -func (r *syncService) HandleFullSyncRequest( - ctx context.Context, - senderId string, - request *syncproto.SyncFullRequest, - header *aclpb.Header, - treeId string) (err error) { - - var fullResponse *syncproto.SyncFullResponse - err = r.treeCache.Do(ctx, treeId, func(obj any) error { - objTree := obj.(tree.ObjectTree) - objTree.Lock() - defer objTree.Unlock() - - fullResponse, err = r.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Heads, objTree) - if err != nil { - return err - } - return nil - }) - - if err != nil { - return err - } - return r.messageService.SendMessageAsync(senderId, syncproto.WrapFullResponse(fullResponse, header, treeId)) -} - -func (r *syncService) HandleFullSyncResponse( - ctx context.Context, - senderId string, - response *syncproto.SyncFullResponse, - header *aclpb.Header, - treeId string) (err error) { - - var ( - snapshotPath []string - result tree.AddResult - ) - - err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { - objTree := obj.(tree.ObjectTree) - objTree.Lock() - defer objTree.Unlock() - - // if we already have the heads for whatever reason - if slice.UnsortedEquals(response.Heads, objTree.Heads()) { - return nil - } - - result, err = objTree.AddRawChanges(ctx, response.Changes...) - if err != nil { - return err - } - snapshotPath = objTree.SnapshotPath() - return nil - }) - - // if error or nothing has changed - if (err != nil || len(result.Added) == 0) && err != storage.ErrUnknownTreeId { - return err - } - // if we have a new tree - if err == storage.ErrUnknownTreeId { - err = r.createTree(ctx, response, header, treeId) - if err != nil { - return err - } - result = tree.AddResult{ - OldHeads: []string{}, - Heads: response.Heads, - Added: response.Changes, - } - } - // sending heads update message - newUpdate := &syncproto.SyncHeadUpdate{ - Heads: result.Heads, - Changes: result.Added, - SnapshotPath: snapshotPath, - } - return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) -} - -func (r *syncService) HandleACLList( - ctx context.Context, - senderId string, - req *syncproto.SyncACLList, - header *aclpb.Header, - id string) (err error) { - - err = r.treeCache.Do(ctx, id, func(obj interface{}) error { - return nil - }) - // do nothing if already added - if err == nil { - return nil - } - // if not found then add to storage - if err == storage.ErrUnknownTreeId { - return r.createACLList(ctx, req, header, id) - } - return err -} - -func (r *syncService) prepareFullSyncRequest(t tree.ObjectTree) (*syncproto.SyncFullRequest, error) { - return &syncproto.SyncFullRequest{ - Heads: t.Heads(), - SnapshotPath: t.SnapshotPath(), - }, nil -} - -func (r *syncService) prepareFullSyncResponse( - treeId string, - theirPath, theirHeads []string, - t tree.ObjectTree) (*syncproto.SyncFullResponse, error) { - ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath, theirHeads) - if err != nil { - return nil, err - } - - return &syncproto.SyncFullResponse{ - Heads: t.Heads(), - Changes: ourChanges, - SnapshotPath: t.SnapshotPath(), - }, nil -} - -func (r *syncService) createTree( - ctx context.Context, - response *syncproto.SyncFullResponse, - header *aclpb.Header, - treeId string) error { - - return r.treeCache.Add( - ctx, - treeId, - storage.TreeStorageCreatePayload{ - TreeId: treeId, - Header: header, - Changes: response.Changes, - Heads: response.Heads, - }) -} - -func (r *syncService) createACLList( - ctx context.Context, - req *syncproto.SyncACLList, - header *aclpb.Header, - treeId string) error { - - return r.treeCache.Add( - ctx, - treeId, - storage.ACLListStorageCreatePayload{ - ListId: treeId, - Header: header, - Records: req.Records, - }) +func newSyncService() { + } diff --git a/pkg/acl/account/accountdata.go b/pkg/acl/account/accountdata.go index bc775854..4368a26c 100644 --- a/pkg/acl/account/accountdata.go +++ b/pkg/acl/account/accountdata.go @@ -7,7 +7,7 @@ import ( ) type AccountData struct { // TODO: create a convenient constructor for this - Identity []byte // TODO: this is essentially the same as sign key + Identity []byte // public key SignKey signingkey.PrivKey EncKey encryptionkey.PrivKey Decoder keys.Decoder diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index ca3055a3..9c17171f 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -65,8 +65,6 @@ func (r *requestHandler) HandleSyncMessage(ctx context.Context, senderId string, return r.HandleFullSyncResponse(ctx, senderId, msg.GetFullSyncResponse(), content.GetTreeHeader(), content.GetTreeId()) case msg.GetHeadUpdate() != nil: return r.HandleHeadUpdate(ctx, senderId, msg.GetHeadUpdate(), content.GetTreeHeader(), content.GetTreeId()) - case msg.GetAclList() != nil: - return r.HandleACLList(ctx, senderId, msg.GetAclList(), content.GetTreeHeader(), content.GetTreeId()) } return nil } From aecb95bc9264abe96e29c2341f6ac17ae4c3ae29 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 15 Sep 2022 11:35:16 +0200 Subject: [PATCH 070/219] Add more logic re sync service --- common/commonspace/rpchandler.go | 4 +- common/commonspace/service.go | 9 ++-- common/commonspace/space.go | 18 +++++-- common/commonspace/syncservice/streampool.go | 25 +++++----- common/commonspace/syncservice/synchandler.go | 4 +- common/commonspace/syncservice/syncservice.go | 48 +++++++++++++++++-- 6 files changed, 79 insertions(+), 29 deletions(-) diff --git a/common/commonspace/rpchandler.go b/common/commonspace/rpchandler.go index 9a2d6993..e94df0b8 100644 --- a/common/commonspace/rpchandler.go +++ b/common/commonspace/rpchandler.go @@ -2,7 +2,6 @@ package commonspace import ( "context" - "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" ) @@ -21,6 +20,5 @@ func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncR } func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) error { - - return fmt.Errorf("not implemented") + return r.s.SyncService().StreamPool().AddStream(stream) } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 85dd8ae9..daeb321d 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -4,6 +4,7 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" ) @@ -37,10 +38,12 @@ func (s *service) Name() (name string) { } func (s *service) CreateSpace(ctx context.Context, id string) (Space, error) { + syncService := syncservice.NewSyncService(id, nil, s.configurationService.GetLast()) sp := &space{ - id: id, - nconf: s.configurationService.GetLast(), - conf: s.config, + id: id, + nconf: s.configurationService.GetLast(), + conf: s.config, + syncService: syncService, } if err := sp.Init(ctx); err != nil { return nil, err diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 4f83dd97..0c223a09 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" @@ -19,18 +20,21 @@ type Space interface { Id() string SpaceSyncRpc() RpcHandler + SyncService() syncservice.SyncService Close() error } type space struct { - id string - nconf nodeconf.Configuration - conf config.Space - diff ldiff.Diff + id string + nconf nodeconf.Configuration + conf config.Space + diff ldiff.Diff + mu sync.RWMutex + rpc *rpcHandler periodicSync *periodicSync - mu sync.RWMutex + syncService syncservice.SyncService } func (s *space) Id() string { @@ -49,6 +53,10 @@ func (s *space) SpaceSyncRpc() RpcHandler { return s.rpc } +func (s *space) SyncService() syncservice.SyncService { + return s.syncService +} + func (s *space) testFill() { var n = 1000 var els = make([]ldiff.Element, 0, n) diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 03cc6dcd..47d3063c 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -1,6 +1,7 @@ package syncservice import ( + "context" "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" @@ -18,6 +19,7 @@ const maxSimultaneousOperationsPerStream = 10 // StreamPool can be made generic to work with different streams type StreamPool interface { AddStream(stream spacesyncproto.SpaceStream) (err error) + HasStream(peerId string) bool SyncClient } @@ -26,9 +28,7 @@ type SyncClient interface { BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) } -type MessageHandler interface { - HandleMessage(peerId string, message *spacesyncproto.ObjectSyncMessage) -} +type MessageHandler func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) type streamPool struct { sync.Mutex @@ -43,6 +43,11 @@ func newStreamPool(messageHandler MessageHandler) StreamPool { } } +func (s *streamPool) HasStream(peerId string) (res bool) { + _, err := s.getStream(peerId) + return err == nil +} + func (s *streamPool) SendAsync(peerId string, message *spacesyncproto.ObjectSyncMessage) (err error) { stream, err := s.getStream(peerId) if err != nil { @@ -101,15 +106,16 @@ func (s *streamPool) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) ( func (s *streamPool) AddStream(stream spacesyncproto.SpaceStream) (err error) { s.Lock() - defer s.Unlock() peerId, err := getPeerIdFromStream(stream) if err != nil { + s.Unlock() return } s.peerStreams[peerId] = stream - go s.readPeerLoop(peerId, stream) - return + s.Unlock() + + return s.readPeerLoop(peerId, stream) } func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStream) (err error) { @@ -134,13 +140,10 @@ Loop: limiter <- struct{}{} }() - s.messageHandler.HandleMessage(peerId, msg) + s.messageHandler(context.Background(), peerId, msg) }() } - if err = s.removePeer(peerId); err != nil { - // TODO: log something - } - return + return s.removePeer(peerId) } func (s *streamPool) removePeer(peerId string) (err error) { diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index 2aa2ea9b..fc04468d 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -16,7 +16,7 @@ type syncHandler struct { } type SyncHandler interface { - HandleSyncMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) + HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) } func newSyncHandler(treeCache cache.TreeCache, syncClient SyncClient) *syncHandler { @@ -26,7 +26,7 @@ func newSyncHandler(treeCache cache.TreeCache, syncClient SyncClient) *syncHandl } } -func (s *syncHandler) HandleSyncMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) error { +func (s *syncHandler) HandleMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) error { msg := message.GetContent() switch { case msg.GetFullSyncRequest() != nil: diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index c9ce956d..4570ce85 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -1,13 +1,15 @@ package syncservice import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" ) type SyncService interface { - NotifyHeadUpdate(treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) + NotifyHeadUpdate(ctx context.Context, treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) StreamPool() StreamPool } @@ -15,11 +17,29 @@ type syncService struct { syncHandler SyncHandler streamPool StreamPool configuration nodeconf.Configuration + spaceId string } -func (s *syncService) NotifyHeadUpdate(treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) { +func (s *syncService) NotifyHeadUpdate(ctx context.Context, treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) { msg := spacesyncproto.WrapHeadUpdate(update, header, treeId) - all + peers, err := s.configuration.AllPeers(context.Background(), s.spaceId) + if err != nil { + return + } + for _, peer := range peers { + if !s.streamPool.HasStream(peer.Id()) { + cl := spacesyncproto.NewDRPCSpaceClient(peer) + stream, err := cl.Stream(ctx) + if err != nil { + continue + } + + s.streamPool.AddStream(stream) + if err != nil { + continue + } + } + } return s.streamPool.BroadcastAsync(msg) } @@ -27,6 +47,24 @@ func (s *syncService) StreamPool() StreamPool { return s.streamPool } -func newSyncService() { - +func NewSyncService(spaceId string, cache cache.TreeCache, configuration nodeconf.Configuration) SyncService { + var syncHandler SyncHandler + streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { + return syncHandler.HandleMessage(ctx, senderId, message) + }) + syncHandler = newSyncHandler(cache, streamPool) + return newSyncService(spaceId, syncHandler, streamPool, configuration) +} + +func newSyncService( + spaceId string, + syncHandler SyncHandler, + streamPool StreamPool, + configuration nodeconf.Configuration) *syncService { + return &syncService{ + syncHandler: syncHandler, + streamPool: streamPool, + configuration: configuration, + spaceId: spaceId, + } } From fbdf820734943487b76970276c310f559bc6cad9 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 15 Sep 2022 12:34:28 +0200 Subject: [PATCH 071/219] Add sync tree and remove head send from sync handler --- common/commonspace/syncservice/synchandler.go | 55 ++----- common/commonspace/synctree/synctree.go | 151 ++++++++++++++++++ pkg/acl/tree/objecttree.go | 6 - 3 files changed, 162 insertions(+), 50 deletions(-) create mode 100644 common/commonspace/synctree/synctree.go diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index fc04468d..e53373b5 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -47,9 +47,8 @@ func (s *syncHandler) HandleHeadUpdate( treeId string) (err error) { var ( - fullRequest *spacesyncproto.ObjectFullSyncRequest - snapshotPath []string - result tree.AddResult + fullRequest *spacesyncproto.ObjectFullSyncRequest + result tree.AddResult // in case update changes are empty then we want to sync the whole tree sendChangesOnFullSync = len(update.Changes) == 0 ) @@ -76,7 +75,6 @@ func (s *syncHandler) HandleHeadUpdate( // if we couldn't add all the changes shouldFullSync := len(update.Changes) != len(result.Added) - snapshotPath = objTree.SnapshotPath() if shouldFullSync { fullRequest, err = s.prepareFullSyncRequest(objTree, sendChangesOnFullSync) if err != nil { @@ -94,18 +92,7 @@ func (s *syncHandler) HandleHeadUpdate( if fullRequest != nil { return s.syncClient.SendAsync(senderId, spacesyncproto.WrapFullRequest(fullRequest, header, treeId)) } - // if error or nothing has changed - if err != nil || len(result.Added) == 0 { - return err - } - - // otherwise sending heads update message - newUpdate := &spacesyncproto.ObjectHeadUpdate{ - Heads: result.Heads, - Changes: result.Added, - SnapshotPath: snapshotPath, - } - return s.syncClient.BroadcastAsync(spacesyncproto.WrapHeadUpdate(newUpdate, header, treeId)) + return } func (s *syncHandler) HandleFullSyncRequest( @@ -148,10 +135,7 @@ func (s *syncHandler) HandleFullSyncResponse( header *aclpb.TreeHeader, treeId string) (err error) { - var ( - snapshotPath []string - result tree.AddResult - ) + var result tree.AddResult res, err := s.treeCache.GetTree(ctx, treeId) if err != nil { @@ -159,24 +143,21 @@ func (s *syncHandler) HandleFullSyncResponse( } err = func() error { - syncTree := res.Tree - syncTree.Lock() + objTree := res.Tree + objTree.Lock() defer res.Release() - defer syncTree.Unlock() + defer objTree.Unlock() // if we already have the heads for whatever reason - if slice.UnsortedEquals(response.Heads, syncTree.Heads()) { + if slice.UnsortedEquals(response.Heads, objTree.Heads()) { return nil } - // syncTree -> syncService: HeadUpdate() - // AddRawChanges -> syncTree.addRawChanges(); syncService.HeadUpdate() - result, err = syncTree.AddRawChanges(ctx, response.Changes...) + result, err = objTree.AddRawChanges(ctx, response.Changes...) if err != nil { return err } - snapshotPath = syncTree.SnapshotPath() return nil }() @@ -186,23 +167,9 @@ func (s *syncHandler) HandleFullSyncResponse( } // if we have a new tree if err == storage.ErrUnknownTreeId { - err = s.addTree(ctx, response, header, treeId) - if err != nil { - return err - } - result = tree.AddResult{ - OldHeads: []string{}, - Heads: response.Heads, - Added: response.Changes, - } + return s.addTree(ctx, response, header, treeId) } - // sending heads update message - newUpdate := &spacesyncproto.ObjectHeadUpdate{ - Heads: result.Heads, - Changes: result.Added, - SnapshotPath: snapshotPath, - } - return s.syncClient.BroadcastAsync(spacesyncproto.WrapHeadUpdate(newUpdate, header, treeId)) + return } func (s *syncHandler) prepareFullSyncRequest(t tree.ObjectTree, sendOwnChanges bool) (*spacesyncproto.ObjectFullSyncRequest, error) { diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go new file mode 100644 index 00000000..8a948735 --- /dev/null +++ b/common/commonspace/synctree/synctree.go @@ -0,0 +1,151 @@ +package synctree + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" +) + +type SyncTree struct { + objTree tree.ObjectTree + syncService syncservice.SyncService +} + +func CreateSyncTree( + syncService syncservice.SyncService, + payload tree.ObjectTreeCreatePayload, + listener tree.ObjectTreeUpdateListener, + aclList list.ACLList, + createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { + t, err = tree.CreateObjectTree(payload, listener, aclList, createStorage) + if err != nil { + return + } + + // TODO: use context where it is needed + err = syncService.NotifyHeadUpdate(context.Background(), t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{ + Heads: t.Heads(), + SnapshotPath: t.SnapshotPath(), + }) + return +} + +func BuildSyncTree( + syncService syncservice.SyncService, + treeStorage storage.TreeStorage, + listener tree.ObjectTreeUpdateListener, + aclList list.ACLList) (t tree.ObjectTree, err error) { + return buildSyncTree(syncService, treeStorage, listener, aclList) +} + +func buildSyncTree( + syncService syncservice.SyncService, + treeStorage storage.TreeStorage, + listener tree.ObjectTreeUpdateListener, + aclList list.ACLList) (t tree.ObjectTree, err error) { + t, err = tree.BuildObjectTree(treeStorage, listener, aclList) + if err != nil { + return + } + + // TODO: use context where it is needed + err = syncService.NotifyHeadUpdate(context.Background(), t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{ + Heads: t.Heads(), + SnapshotPath: t.SnapshotPath(), + }) + return +} + +func (s *SyncTree) Lock() { + s.objTree.Lock() +} + +func (s *SyncTree) Unlock() { + s.objTree.Unlock() +} + +func (s *SyncTree) RLock() { + s.objTree.RLock() +} + +func (s *SyncTree) RUnlock() { + s.objTree.RUnlock() +} + +func (s *SyncTree) ID() string { + return s.objTree.ID() +} + +func (s *SyncTree) Header() *aclpb.TreeHeader { + return s.objTree.Header() +} + +func (s *SyncTree) Heads() []string { + return s.objTree.Heads() +} + +func (s *SyncTree) Root() *tree.Change { + return s.objTree.Root() +} + +func (s *SyncTree) HasChange(id string) bool { + return s.objTree.HasChange(id) +} + +func (s *SyncTree) Iterate(convert tree.ChangeConvertFunc, iterate tree.ChangeIterateFunc) error { + return s.objTree.Iterate(convert, iterate) +} + +func (s *SyncTree) IterateFrom(id string, convert tree.ChangeConvertFunc, iterate tree.ChangeIterateFunc) error { + return s.objTree.IterateFrom(id, convert, iterate) +} + +func (s *SyncTree) SnapshotPath() []string { + return s.objTree.SnapshotPath() +} + +func (s *SyncTree) ChangesAfterCommonSnapshot(snapshotPath, heads []string) ([]*aclpb.RawTreeChangeWithId, error) { + return s.objTree.ChangesAfterCommonSnapshot(snapshotPath, heads) +} + +func (s *SyncTree) Storage() storage.TreeStorage { + return s.objTree.Storage() +} + +func (s *SyncTree) DebugDump() (string, error) { + return s.objTree.DebugDump() +} + +func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeContent) (res tree.AddResult, err error) { + res, err = s.objTree.AddContent(ctx, content) + if err != nil { + return + } + err = s.syncService.NotifyHeadUpdate(ctx, s.ID(), s.Header(), &spacesyncproto.ObjectHeadUpdate{ + Heads: res.Heads, + Changes: res.Added, + SnapshotPath: s.SnapshotPath(), + }) + return +} + +func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*aclpb.RawTreeChangeWithId) (res tree.AddResult, err error) { + res, err = s.objTree.AddRawChanges(ctx, changes...) + if err != nil || res.Mode == tree.Nothing { + return + } + err = s.syncService.NotifyHeadUpdate(ctx, s.ID(), s.Header(), &spacesyncproto.ObjectHeadUpdate{ + Heads: res.Heads, + Changes: res.Added, + SnapshotPath: s.SnapshotPath(), + }) + return +} + +func (s *SyncTree) Close() error { + return s.objTree.Close() +} diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 31365b87..186db5af 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -149,12 +149,6 @@ func (ot *objectTree) Storage() storage.TreeStorage { } func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeContent) (res AddResult, err error) { - defer func() { - if err == nil && ot.updateListener != nil { - ot.updateListener.Update(ot) - } - }() - payload, err := ot.prepareBuilderContent(content) if err != nil { return From 34ef43786c88f15506124d946e67ae6d75ed3419 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 15 Sep 2022 13:42:51 +0200 Subject: [PATCH 072/219] Update tree sync logic --- common/commonspace/cache/treecache.go | 12 +++++-- common/commonspace/service.go | 8 +++++ common/commonspace/space.go | 32 +++++++++++++++++++ common/commonspace/storage/storage.go | 13 ++++++++ common/commonspace/syncservice/synchandler.go | 6 ++-- common/commonspace/synctree/synctree.go | 2 +- 6 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 common/commonspace/storage/storage.go diff --git a/common/commonspace/cache/treecache.go b/common/commonspace/cache/treecache.go index 342c9042..9d688f50 100644 --- a/common/commonspace/cache/treecache.go +++ b/common/commonspace/cache/treecache.go @@ -2,16 +2,24 @@ package cache import ( "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" ) +const CName = "commonspace.cache" + +type TreeContainer interface { + Tree() tree.ObjectTree +} + type TreeResult struct { - Release func() - Tree tree.ObjectTree + Release func() + TreeContainer TreeContainer } type TreeCache interface { + app.ComponentRunnable GetTree(ctx context.Context, id string) (TreeResult, error) AddTree(ctx context.Context, payload storage.TreeStorageCreatePayload) error } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index daeb321d..3c084562 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -4,6 +4,8 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "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/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" @@ -25,11 +27,15 @@ type Service interface { type service struct { config config.Space configurationService nodeconf.Service + storage storage.Storage + cache cache.TreeCache } func (s *service) Init(a *app.App) (err error) { s.config = a.MustComponent(config.CName).(*config.Config).Space s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) + s.storage = a.MustComponent(storage.CName).(storage.Storage) + s.cache = a.MustComponent(cache.CName).(cache.TreeCache) return nil } @@ -44,6 +50,8 @@ func (s *service) CreateSpace(ctx context.Context, id string) (Space, error) { nconf: s.configurationService.GetLast(), conf: s.config, syncService: syncService, + cache: s.cache, + storage: s.storage, } if err := sp.Init(ctx); err != nil { return nil, err diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 0c223a09..58b4391e 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -3,12 +3,17 @@ package commonspace import ( "context" "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "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/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" "go.uber.org/zap" "math/rand" @@ -22,6 +27,9 @@ type Space interface { SpaceSyncRpc() RpcHandler SyncService() syncservice.SyncService + CreateTree(payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) + BuildTree(id string, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) + Close() error } @@ -35,6 +43,21 @@ type space struct { rpc *rpcHandler periodicSync *periodicSync syncService syncservice.SyncService + storage storage.Storage + cache cache.TreeCache +} + +func (s *space) CreateTree(payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) { + return synctree.CreateSyncTree(payload, s.syncService, listener, nil, s.storage.CreateTreeStorage) +} + +func (s *space) BuildTree(id string, listener tree.ObjectTreeUpdateListener) (t tree.ObjectTree, err error) { + store, err := s.storage.Storage(id) + if err != nil { + return + } + + return synctree.BuildSyncTree(s.syncService, store.(treestorage.TreeStorage), listener, nil) } func (s *space) Id() string { @@ -100,10 +123,19 @@ func (s *space) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { if err != nil { return nil } + s.pingTreesInCache(ctx, newIds) + s.pingTreesInCache(ctx, changedIds) + log.Info("sync done:", zap.Int("newIds", len(newIds)), zap.Int("changedIds", len(changedIds)), zap.Int("removedIds", len(removedIds))) return } +func (s *space) pingTreesInCache(ctx context.Context, trees []string) { + for _, tId := range trees { + _, _ = s.cache.GetTree(ctx, tId) + } +} + func (s *space) getPeers(ctx context.Context) (peers []peer.Peer, err error) { if s.nconf.IsResponsible(s.id) { return s.nconf.AllPeers(ctx, s.id) diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go new file mode 100644 index 00000000..a9694988 --- /dev/null +++ b/common/commonspace/storage/storage.go @@ -0,0 +1,13 @@ +package storage + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" +) + +type Storage interface { + storage.Provider + app.ComponentRunnable +} + +const CName = "commonspace.storage" diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index e53373b5..87d8d445 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -59,7 +59,7 @@ func (s *syncHandler) HandleHeadUpdate( } err = func() error { - objTree := res.Tree + objTree := res.TreeContainer.Tree() objTree.Lock() defer res.Release() defer objTree.Unlock() @@ -111,7 +111,7 @@ func (s *syncHandler) HandleFullSyncRequest( // TODO: check if sync request contains changes and add them (also do head update in this case) err = func() error { - objTree := res.Tree + objTree := res.TreeContainer.Tree() objTree.Lock() defer res.Release() defer objTree.Unlock() @@ -143,7 +143,7 @@ func (s *syncHandler) HandleFullSyncResponse( } err = func() error { - objTree := res.Tree + objTree := res.TreeContainer.Tree() objTree.Lock() defer res.Release() defer objTree.Unlock() diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 8a948735..3b84ee77 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -16,8 +16,8 @@ type SyncTree struct { } func CreateSyncTree( - syncService syncservice.SyncService, payload tree.ObjectTreeCreatePayload, + syncService syncservice.SyncService, listener tree.ObjectTreeUpdateListener, aclList list.ACLList, createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { From a48e8f357afc2c772d63d570065c30f835a3f13c Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 15 Sep 2022 14:11:49 +0200 Subject: [PATCH 073/219] Update peer reading logic --- common/commonspace/rpchandler.go | 10 +++++-- common/commonspace/space.go | 2 +- common/commonspace/syncservice/streampool.go | 22 +++++++++++++--- common/commonspace/syncservice/syncservice.go | 26 ++++++++++++------- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/common/commonspace/rpchandler.go b/common/commonspace/rpchandler.go index e94df0b8..b0d0be69 100644 --- a/common/commonspace/rpchandler.go +++ b/common/commonspace/rpchandler.go @@ -19,6 +19,12 @@ func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncR return remotediff.HandlerRangeRequest(ctx, r.s.diff, req) } -func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) error { - return r.s.SyncService().StreamPool().AddStream(stream) +func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) (err error) { + err = r.s.SyncService().StreamPool().AddAndReadStream(stream) + if err != nil { + return + } + + <-stream.Context().Done() + return } diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 58b4391e..757b1f32 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -151,5 +151,5 @@ func (s *space) getPeers(ctx context.Context) (peers []peer.Peer, err error) { func (s *space) Close() error { s.periodicSync.Close() - return nil + return s.syncService.Close() } diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 47d3063c..6b402294 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -18,9 +18,10 @@ const maxSimultaneousOperationsPerStream = 10 // StreamPool can be made generic to work with different streams type StreamPool interface { - AddStream(stream spacesyncproto.SpaceStream) (err error) + AddAndReadStream(stream spacesyncproto.SpaceStream) (err error) HasStream(peerId string) bool SyncClient + Close() (err error) } type SyncClient interface { @@ -34,12 +35,14 @@ type streamPool struct { sync.Mutex peerStreams map[string]spacesyncproto.SpaceStream messageHandler MessageHandler + wg *sync.WaitGroup } func newStreamPool(messageHandler MessageHandler) StreamPool { return &streamPool{ peerStreams: make(map[string]spacesyncproto.SpaceStream), messageHandler: messageHandler, + wg: &sync.WaitGroup{}, } } @@ -104,7 +107,7 @@ func (s *streamPool) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) ( return nil } -func (s *streamPool) AddStream(stream spacesyncproto.SpaceStream) (err error) { +func (s *streamPool) AddAndReadStream(stream spacesyncproto.SpaceStream) (err error) { s.Lock() peerId, err := getPeerIdFromStream(stream) if err != nil { @@ -113,12 +116,25 @@ func (s *streamPool) AddStream(stream spacesyncproto.SpaceStream) (err error) { } s.peerStreams[peerId] = stream + s.wg.Add(1) s.Unlock() - return s.readPeerLoop(peerId, stream) + go s.readPeerLoop(peerId, stream) + return +} + +func (s *streamPool) Close() (err error) { + s.Lock() + wg := s.wg + s.Unlock() + if wg != nil { + wg.Wait() + } + return nil } func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStream) (err error) { + defer s.wg.Done() limiter := make(chan struct{}, maxSimultaneousOperationsPerStream) for i := 0; i < maxSimultaneousOperationsPerStream; i++ { limiter <- struct{}{} diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 4570ce85..c3f85101 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -11,6 +11,7 @@ import ( type SyncService interface { NotifyHeadUpdate(ctx context.Context, treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) StreamPool() StreamPool + Close() (err error) } type syncService struct { @@ -20,6 +21,10 @@ type syncService struct { spaceId string } +func (s *syncService) Close() (err error) { + return s.streamPool.Close() +} + func (s *syncService) NotifyHeadUpdate(ctx context.Context, treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) { msg := spacesyncproto.WrapHeadUpdate(update, header, treeId) peers, err := s.configuration.AllPeers(context.Background(), s.spaceId) @@ -27,17 +32,18 @@ func (s *syncService) NotifyHeadUpdate(ctx context.Context, treeId string, heade return } for _, peer := range peers { - if !s.streamPool.HasStream(peer.Id()) { - cl := spacesyncproto.NewDRPCSpaceClient(peer) - stream, err := cl.Stream(ctx) - if err != nil { - continue - } + if s.streamPool.HasStream(peer.Id()) { + continue + } + cl := spacesyncproto.NewDRPCSpaceClient(peer) + stream, err := cl.Stream(ctx) + if err != nil { + continue + } - s.streamPool.AddStream(stream) - if err != nil { - continue - } + err = s.streamPool.AddAndReadStream(stream) + if err != nil { + continue } } return s.streamPool.BroadcastAsync(msg) From 91aacdd95592594308397f498f8db59b1aae77ce Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 16 Sep 2022 00:22:22 +0200 Subject: [PATCH 074/219] Add build tree sync request --- common/commonspace/rpchandler.go | 8 +-- common/commonspace/space.go | 45 ++++++++++-- common/commonspace/syncservice/streampool.go | 73 +++++++++++++++++--- common/commonspace/synctree/synctree.go | 70 +------------------ 4 files changed, 109 insertions(+), 87 deletions(-) diff --git a/common/commonspace/rpchandler.go b/common/commonspace/rpchandler.go index b0d0be69..be83b43c 100644 --- a/common/commonspace/rpchandler.go +++ b/common/commonspace/rpchandler.go @@ -20,11 +20,5 @@ func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncR } func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) (err error) { - err = r.s.SyncService().StreamPool().AddAndReadStream(stream) - if err != nil { - return - } - - <-stream.Context().Done() - return + return r.s.SyncService().StreamPool().AddAndReadStream(stream) } diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 757b1f32..69cac657 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -27,8 +27,8 @@ type Space interface { SpaceSyncRpc() RpcHandler SyncService() syncservice.SyncService - CreateTree(payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) - BuildTree(id string, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) + CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) + BuildTree(ctx context.Context, id string, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) Close() error } @@ -47,16 +47,51 @@ type space struct { cache cache.TreeCache } -func (s *space) CreateTree(payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) { +func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) { return synctree.CreateSyncTree(payload, s.syncService, listener, nil, s.storage.CreateTreeStorage) } -func (s *space) BuildTree(id string, listener tree.ObjectTreeUpdateListener) (t tree.ObjectTree, err error) { +func (s *space) BuildTree(ctx context.Context, id string, listener tree.ObjectTreeUpdateListener) (t tree.ObjectTree, err error) { + getTreeRemote := func() (*spacesyncproto.ObjectSyncMessage, error) { + // TODO: add empty context handling (when this is not happening due to head update) + peerId, err := syncservice.GetPeerIdFromStreamContext(ctx) + if err != nil { + return nil, err + } + + return s.syncService.StreamPool().SendSync( + peerId, + spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{}, nil, id), + func(syncMessage *spacesyncproto.ObjectSyncMessage) bool { + return syncMessage.GetContent().GetFullSyncResponse() != nil + }, + ) + } + store, err := s.storage.Storage(id) - if err != nil { + if err != nil && err != treestorage.ErrUnknownTreeId { return } + if err == treestorage.ErrUnknownTreeId { + var resp *spacesyncproto.ObjectSyncMessage + resp, err = getTreeRemote() + if err != nil { + return + } + fullSyncResp := resp.GetContent().GetFullSyncResponse() + + payload := treestorage.TreeStorageCreatePayload{ + TreeId: resp.TreeId, + Header: resp.TreeHeader, + Changes: fullSyncResp.Changes, + Heads: fullSyncResp.Heads, + } + store, err = s.storage.CreateTreeStorage(payload) + if err != nil { + return + } + } return synctree.BuildSyncTree(s.syncService, store.(treestorage.TreeStorage), listener, nil) } diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 6b402294..0ccd2d6b 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -6,7 +6,6 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/libp2p/go-libp2p-core/sec" - "storj.io/drpc" "storj.io/drpc/drpcctx" "sync" ) @@ -25,17 +24,27 @@ type StreamPool interface { } type SyncClient interface { + SendSync(peerId string, + message *spacesyncproto.ObjectSyncMessage, + msgCheck func(syncMessage *spacesyncproto.ObjectSyncMessage) bool) (reply *spacesyncproto.ObjectSyncMessage, err error) SendAsync(peerId string, message *spacesyncproto.ObjectSyncMessage) (err error) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) } type MessageHandler func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) +type responseWaiter struct { + ch chan *spacesyncproto.ObjectSyncMessage + msgCheck func(message *spacesyncproto.ObjectSyncMessage) bool +} + type streamPool struct { sync.Mutex peerStreams map[string]spacesyncproto.SpaceStream messageHandler MessageHandler wg *sync.WaitGroup + waiters map[string]responseWaiter + waitersMx sync.Mutex } func newStreamPool(messageHandler MessageHandler) StreamPool { @@ -51,6 +60,41 @@ func (s *streamPool) HasStream(peerId string) (res bool) { return err == nil } +func (s *streamPool) SendSync( + peerId string, + message *spacesyncproto.ObjectSyncMessage, + msgCheck func(syncMessage *spacesyncproto.ObjectSyncMessage) bool) (reply *spacesyncproto.ObjectSyncMessage, err error) { + + sendAndWait := func(waiter responseWaiter) (err error) { + err = s.SendAsync(peerId, message) + if err != nil { + return + } + + reply = <-waiter.ch + return + } + + key := fmt.Sprintf("%s.%s", peerId, message.TreeId) + s.waitersMx.Lock() + waiter, exists := s.waiters[key] + if exists { + s.waitersMx.Unlock() + + err = sendAndWait(waiter) + return + } + + waiter = responseWaiter{ + ch: make(chan *spacesyncproto.ObjectSyncMessage), + msgCheck: msgCheck, + } + s.waiters[key] = waiter + s.waitersMx.Unlock() + err = sendAndWait(waiter) + return +} + func (s *streamPool) SendAsync(peerId string, message *spacesyncproto.ObjectSyncMessage) (err error) { stream, err := s.getStream(peerId) if err != nil { @@ -109,7 +153,7 @@ func (s *streamPool) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) ( func (s *streamPool) AddAndReadStream(stream spacesyncproto.SpaceStream) (err error) { s.Lock() - peerId, err := getPeerIdFromStream(stream) + peerId, err := GetPeerIdFromStreamContext(stream.Context()) if err != nil { s.Unlock() return @@ -119,8 +163,7 @@ func (s *streamPool) AddAndReadStream(stream spacesyncproto.SpaceStream) (err er s.wg.Add(1) s.Unlock() - go s.readPeerLoop(peerId, stream) - return + return s.readPeerLoop(peerId, stream) } func (s *streamPool) Close() (err error) { @@ -140,6 +183,22 @@ func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStre limiter <- struct{}{} } + process := func(msg *spacesyncproto.ObjectSyncMessage) { + key := fmt.Sprintf("%s.%s", peerId, msg.TreeId) + s.waitersMx.Lock() + waiter, exists := s.waiters[key] + + if !exists || !waiter.msgCheck(msg) { + s.waitersMx.Unlock() + s.messageHandler(stream.Context(), peerId, msg) + return + } + + delete(s.waiters, key) + s.waitersMx.Unlock() + waiter.ch <- msg + } + Loop: for { msg, err := stream.Recv() @@ -155,8 +214,7 @@ Loop: defer func() { limiter <- struct{}{} }() - - s.messageHandler(context.Background(), peerId, msg) + process(msg) }() } return s.removePeer(peerId) @@ -173,8 +231,7 @@ func (s *streamPool) removePeer(peerId string) (err error) { return } -func getPeerIdFromStream(stream drpc.Stream) (string, error) { - ctx := stream.Context() +func GetPeerIdFromStreamContext(ctx context.Context) (string, error) { conn, ok := ctx.Value(drpcctx.TransportKey{}).(sec.SecureConn) if !ok { return "", fmt.Errorf("incorrect connection type in stream") diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 3b84ee77..d9dcb4e4 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -11,7 +11,7 @@ import ( ) type SyncTree struct { - objTree tree.ObjectTree + tree.ObjectTree syncService syncservice.SyncService } @@ -60,68 +60,8 @@ func buildSyncTree( return } -func (s *SyncTree) Lock() { - s.objTree.Lock() -} - -func (s *SyncTree) Unlock() { - s.objTree.Unlock() -} - -func (s *SyncTree) RLock() { - s.objTree.RLock() -} - -func (s *SyncTree) RUnlock() { - s.objTree.RUnlock() -} - -func (s *SyncTree) ID() string { - return s.objTree.ID() -} - -func (s *SyncTree) Header() *aclpb.TreeHeader { - return s.objTree.Header() -} - -func (s *SyncTree) Heads() []string { - return s.objTree.Heads() -} - -func (s *SyncTree) Root() *tree.Change { - return s.objTree.Root() -} - -func (s *SyncTree) HasChange(id string) bool { - return s.objTree.HasChange(id) -} - -func (s *SyncTree) Iterate(convert tree.ChangeConvertFunc, iterate tree.ChangeIterateFunc) error { - return s.objTree.Iterate(convert, iterate) -} - -func (s *SyncTree) IterateFrom(id string, convert tree.ChangeConvertFunc, iterate tree.ChangeIterateFunc) error { - return s.objTree.IterateFrom(id, convert, iterate) -} - -func (s *SyncTree) SnapshotPath() []string { - return s.objTree.SnapshotPath() -} - -func (s *SyncTree) ChangesAfterCommonSnapshot(snapshotPath, heads []string) ([]*aclpb.RawTreeChangeWithId, error) { - return s.objTree.ChangesAfterCommonSnapshot(snapshotPath, heads) -} - -func (s *SyncTree) Storage() storage.TreeStorage { - return s.objTree.Storage() -} - -func (s *SyncTree) DebugDump() (string, error) { - return s.objTree.DebugDump() -} - func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeContent) (res tree.AddResult, err error) { - res, err = s.objTree.AddContent(ctx, content) + res, err = s.AddContent(ctx, content) if err != nil { return } @@ -134,7 +74,7 @@ func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeCo } func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*aclpb.RawTreeChangeWithId) (res tree.AddResult, err error) { - res, err = s.objTree.AddRawChanges(ctx, changes...) + res, err = s.AddRawChanges(ctx, changes...) if err != nil || res.Mode == tree.Nothing { return } @@ -145,7 +85,3 @@ func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*aclpb.RawTreeC }) return } - -func (s *SyncTree) Close() error { - return s.objTree.Close() -} From eb36eed4c03a455c308f0e6bc76407e2451253f8 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 16 Sep 2022 07:47:36 +0200 Subject: [PATCH 075/219] Add tree validation before saving --- common/commonspace/space.go | 14 ++++++++++++-- pkg/acl/tree/rawtreevalidator.go | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 pkg/acl/tree/rawtreevalidator.go diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 69cac657..bece7ca7 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -12,6 +12,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" @@ -45,6 +46,7 @@ type space struct { syncService syncservice.SyncService storage storage.Storage cache cache.TreeCache + aclList list.ACLList } func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) { @@ -63,7 +65,7 @@ func (s *space) BuildTree(ctx context.Context, id string, listener tree.ObjectTr peerId, spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{}, nil, id), func(syncMessage *spacesyncproto.ObjectSyncMessage) bool { - return syncMessage.GetContent().GetFullSyncResponse() != nil + return syncMessage.TreeId == id && syncMessage.GetContent().GetFullSyncResponse() != nil }, ) } @@ -87,12 +89,20 @@ func (s *space) BuildTree(ctx context.Context, id string, listener tree.ObjectTr Changes: fullSyncResp.Changes, Heads: fullSyncResp.Heads, } + + // basically building tree with inmemory storage and validating that it was without errors + err = tree.ValidateRawTree(payload, s.aclList) + if err != nil { + return + } + // TODO: maybe it is better to use the tree that we already built and just replace the storage + // now we are sure that we can save it to the storage store, err = s.storage.CreateTreeStorage(payload) if err != nil { return } } - return synctree.BuildSyncTree(s.syncService, store.(treestorage.TreeStorage), listener, nil) + return synctree.BuildSyncTree(s.syncService, store.(treestorage.TreeStorage), listener, s.aclList) } func (s *space) Id() string { diff --git a/pkg/acl/tree/rawtreevalidator.go b/pkg/acl/tree/rawtreevalidator.go new file mode 100644 index 00000000..86a0082f --- /dev/null +++ b/pkg/acl/tree/rawtreevalidator.go @@ -0,0 +1,17 @@ +package tree + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" +) + +func ValidateRawTree(payload storage.TreeStorageCreatePayload, aclList list.ACLList) (err error) { + provider := storage.NewInMemoryTreeStorageProvider() + treeStorage, err := provider.CreateTreeStorage(payload) + if err != nil { + return + } + + _, err = BuildObjectTree(treeStorage, nil, aclList) + return +} From 1bc9242644d14d88092832ca92ae16a71c6399e4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 16 Sep 2022 10:17:54 +0200 Subject: [PATCH 076/219] Update sync handler --- .../spacesyncproto/protos/spacesync.proto | 6 +- .../spacesyncproto/spacesync.pb.go | 264 ++++++++++++++---- common/commonspace/syncservice/synchandler.go | 77 ++--- 3 files changed, 247 insertions(+), 100 deletions(-) diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index 25c5fefb..7fd7d411 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -51,6 +51,9 @@ message ObjectSyncMessage { ObjectSyncContentValue content = 2; acl.TreeHeader treeHeader = 3; string treeId = 4; + + string identity = 5; + string peerSignature = 6; } // ObjectSyncContentValue provides different types for object sync @@ -72,7 +75,8 @@ message ObjectHeadUpdate { // ObjectHeadUpdate is a message sent when document needs full sync message ObjectFullSyncRequest { repeated string heads = 1; - repeated string snapshotPath = 2; + repeated acl.RawTreeChangeWithId changes = 2; + repeated string snapshotPath = 3; } // ObjectFullSyncResponse is a message sent as a response for a specific full sync diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index b23dcf9b..64419bb0 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -320,10 +320,12 @@ func (m *HeadSyncResponse) GetResults() []*HeadSyncResult { // ObjectSyncMessage is a message sent on object sync type ObjectSyncMessage struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - Content *ObjectSyncContentValue `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` - TreeHeader *aclpb.TreeHeader `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` - TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Content *ObjectSyncContentValue `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + TreeHeader *aclpb.TreeHeader `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` + TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` + Identity string `protobuf:"bytes,5,opt,name=identity,proto3" json:"identity,omitempty"` + PeerSignature string `protobuf:"bytes,6,opt,name=peerSignature,proto3" json:"peerSignature,omitempty"` } func (m *ObjectSyncMessage) Reset() { *m = ObjectSyncMessage{} } @@ -387,6 +389,20 @@ func (m *ObjectSyncMessage) GetTreeId() string { return "" } +func (m *ObjectSyncMessage) GetIdentity() string { + if m != nil { + return m.Identity + } + return "" +} + +func (m *ObjectSyncMessage) GetPeerSignature() string { + if m != nil { + return m.PeerSignature + } + return "" +} + // ObjectSyncContentValue provides different types for object sync type ObjectSyncContentValue struct { // Types that are valid to be assigned to Value: @@ -549,8 +565,9 @@ func (m *ObjectHeadUpdate) GetSnapshotPath() []string { // ObjectHeadUpdate is a message sent when document needs full sync type ObjectFullSyncRequest struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - SnapshotPath []string `protobuf:"bytes,2,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*aclpb.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` } func (m *ObjectFullSyncRequest) Reset() { *m = ObjectFullSyncRequest{} } @@ -593,6 +610,13 @@ func (m *ObjectFullSyncRequest) GetHeads() []string { return nil } +func (m *ObjectFullSyncRequest) GetChanges() []*aclpb.RawTreeChangeWithId { + if m != nil { + return m.Changes + } + return nil +} + func (m *ObjectFullSyncRequest) GetSnapshotPath() []string { if m != nil { return m.SnapshotPath @@ -680,49 +704,51 @@ func init() { } var fileDescriptor_5855f4ef9cf24cdb = []byte{ - // 666 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x54, 0x4f, 0x6f, 0xd3, 0x4e, - 0x10, 0xf5, 0xa6, 0x6d, 0x92, 0x4e, 0xfa, 0x27, 0xbf, 0xd5, 0xaf, 0xc5, 0x04, 0x29, 0x0d, 0x3e, - 0x45, 0x1c, 0x92, 0x2a, 0x5c, 0x10, 0xe5, 0x42, 0xab, 0x56, 0x89, 0x10, 0xff, 0xb6, 0x14, 0x24, - 0xc4, 0x65, 0x6b, 0x4f, 0x9b, 0x80, 0x63, 0x1b, 0xef, 0x86, 0xd2, 0x1b, 0x27, 0xce, 0x88, 0x8f, - 0xc2, 0xa7, 0xe0, 0xd8, 0x23, 0x47, 0xd4, 0x7e, 0x0d, 0x0e, 0x68, 0xc7, 0x76, 0x92, 0x06, 0xb7, - 0xdc, 0x38, 0xc4, 0xde, 0x99, 0x9d, 0xf7, 0xf6, 0xcd, 0x5b, 0x4f, 0xe0, 0x9e, 0x1b, 0x0e, 0x87, - 0x61, 0xd0, 0x4e, 0x5e, 0x2a, 0x92, 0x2e, 0xb6, 0xe9, 0xa9, 0x4e, 0x03, 0x37, 0x8a, 0x43, 0x1d, - 0xb6, 0xe9, 0xa9, 0x26, 0xd9, 0x16, 0x25, 0x78, 0x59, 0x06, 0xa7, 0xfb, 0x26, 0x57, 0xdb, 0x8c, - 0xde, 0x1d, 0xb7, 0xa5, 0xeb, 0x9b, 0x9f, 0xdb, 0x97, 0xc1, 0x31, 0x2a, 0xb3, 0x8c, 0x0e, 0x33, - 0xe8, 0x24, 0x9f, 0x60, 0x9d, 0x1e, 0x2c, 0x77, 0x51, 0x7a, 0xfb, 0xa7, 0x81, 0x2b, 0x4c, 0x9e, - 0x73, 0x98, 0x3f, 0x8a, 0xc3, 0xa1, 0xcd, 0x1a, 0xac, 0x39, 0x2f, 0x68, 0xcd, 0x57, 0xa0, 0xa0, - 0x43, 0xbb, 0x40, 0x99, 0x82, 0x0e, 0xf9, 0xff, 0xb0, 0xe0, 0x0f, 0x86, 0x03, 0x6d, 0xcf, 0x35, - 0x58, 0x73, 0x59, 0x24, 0x81, 0x73, 0x02, 0x2b, 0x63, 0x2a, 0x54, 0x23, 0x5f, 0x1b, 0xae, 0xbe, - 0x54, 0x7d, 0xe2, 0x5a, 0x12, 0xb4, 0xe6, 0x5b, 0x50, 0x46, 0x1f, 0x87, 0x18, 0x68, 0x65, 0x17, - 0x1a, 0x73, 0xcd, 0x4a, 0x67, 0xa3, 0x95, 0xe9, 0x6f, 0x5d, 0xc6, 0xef, 0x26, 0x75, 0x62, 0x0c, - 0x30, 0x07, 0xbb, 0xe1, 0x28, 0x18, 0x1f, 0x4c, 0x81, 0xb3, 0x05, 0x6b, 0xb9, 0x40, 0xa3, 0x7b, - 0xe0, 0xd1, 0xe9, 0x8b, 0xa2, 0x30, 0xf0, 0x48, 0x0f, 0x4a, 0x8f, 0x3a, 0x59, 0x14, 0xb4, 0x76, - 0xde, 0xc0, 0xea, 0x04, 0xfc, 0x7e, 0x84, 0x4a, 0x73, 0x1b, 0x4a, 0x64, 0x71, 0x2f, 0xc3, 0x66, - 0x21, 0x6f, 0x43, 0x31, 0x26, 0xf7, 0x52, 0xe9, 0x37, 0x72, 0xa4, 0x9b, 0x7d, 0x91, 0x96, 0x39, - 0x7b, 0x50, 0x9d, 0x92, 0x16, 0x85, 0x81, 0x42, 0xde, 0x81, 0x52, 0x4c, 0x32, 0x95, 0xcd, 0x88, - 0xc5, 0xbe, 0xca, 0x00, 0x91, 0x15, 0x3a, 0xdf, 0x18, 0xfc, 0xf7, 0xf4, 0xf0, 0x2d, 0xba, 0xda, - 0xec, 0x3e, 0x46, 0xa5, 0xe4, 0x31, 0x5e, 0x23, 0xf4, 0x3e, 0x94, 0xdc, 0x30, 0xd0, 0x18, 0x68, - 0x6a, 0xb6, 0xd2, 0x69, 0x4c, 0xce, 0x98, 0xf0, 0xec, 0x24, 0x25, 0x2f, 0xa5, 0x3f, 0x42, 0x91, - 0x01, 0x78, 0x1b, 0x40, 0xc7, 0x88, 0x46, 0x0a, 0xc6, 0xe4, 0x74, 0xa5, 0xb3, 0xda, 0x92, 0xae, - 0xdf, 0x7a, 0x31, 0x4e, 0x8b, 0xa9, 0x12, 0xbe, 0x0e, 0x45, 0x13, 0xf5, 0x3c, 0x7b, 0x9e, 0x54, - 0xa4, 0x91, 0xf3, 0x8b, 0xc1, 0x7a, 0xfe, 0x61, 0xfc, 0x01, 0x80, 0x71, 0xff, 0x20, 0xf2, 0xa4, - 0x46, 0x12, 0x5f, 0xe9, 0xd4, 0x66, 0x25, 0x76, 0xc7, 0x15, 0x5d, 0x4b, 0x4c, 0xd5, 0xf3, 0x47, - 0xb0, 0x7a, 0x34, 0xf2, 0xfd, 0xa9, 0x3b, 0x4b, 0xbb, 0xdc, 0x98, 0xa5, 0xd8, 0xbb, 0x5c, 0xd6, - 0xb5, 0xc4, 0x2c, 0x92, 0x3f, 0x81, 0xea, 0x24, 0x95, 0x5c, 0x51, 0xda, 0x74, 0xe3, 0x6a, 0xb6, - 0xa4, 0xae, 0x6b, 0x89, 0x3f, 0xb0, 0xdb, 0x25, 0x58, 0xf8, 0x60, 0x7a, 0x74, 0x3e, 0x31, 0xa8, - 0xce, 0x36, 0x62, 0xbe, 0x60, 0xd3, 0x48, 0x72, 0xf5, 0x8b, 0x22, 0x09, 0xcc, 0x27, 0x91, 0x8e, - 0x65, 0xfa, 0x61, 0xd9, 0xe4, 0xb7, 0x90, 0x27, 0xc6, 0xf2, 0x1d, 0xda, 0x7a, 0x35, 0xd0, 0xfd, - 0x9e, 0x27, 0xb2, 0x42, 0xee, 0xc0, 0x92, 0x0a, 0x64, 0xa4, 0xfa, 0xa1, 0x7e, 0x26, 0x75, 0xdf, - 0x9e, 0x23, 0xc2, 0x4b, 0x39, 0xe7, 0x39, 0xac, 0xe5, 0xfa, 0x70, 0x85, 0x8c, 0x59, 0xca, 0x42, - 0x0e, 0xe5, 0xe7, 0xf1, 0xa5, 0xce, 0xba, 0xf1, 0x6f, 0x7b, 0xbb, 0x53, 0x83, 0xf2, 0x6e, 0x1c, - 0xef, 0x84, 0x1e, 0x2a, 0xbe, 0x02, 0x70, 0x10, 0xe0, 0xc7, 0x08, 0x5d, 0x8d, 0x5e, 0xd5, 0xea, - 0x7c, 0x65, 0xb0, 0x40, 0x17, 0xc7, 0x1f, 0x42, 0x39, 0x9b, 0x29, 0x7e, 0x33, 0x6f, 0xce, 0xc8, - 0x8f, 0x5a, 0x2d, 0x77, 0x04, 0x93, 0xb6, 0xf6, 0xa0, 0xb8, 0xaf, 0x63, 0x94, 0x43, 0x7e, 0x2b, - 0x6f, 0x88, 0xd2, 0x61, 0xac, 0x5d, 0xb7, 0xd9, 0x64, 0x9b, 0x6c, 0x7b, 0xeb, 0xfb, 0x79, 0x9d, - 0x9d, 0x9d, 0xd7, 0xd9, 0xcf, 0xf3, 0x3a, 0xfb, 0x72, 0x51, 0xb7, 0xce, 0x2e, 0xea, 0xd6, 0x8f, - 0x8b, 0xba, 0xf5, 0xfa, 0xf6, 0x5f, 0xff, 0xfa, 0x0f, 0x8b, 0xf4, 0xba, 0xfb, 0x3b, 0x00, 0x00, - 0xff, 0xff, 0xcf, 0x4f, 0x53, 0x3d, 0x26, 0x06, 0x00, 0x00, + // 695 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcb, 0x6f, 0xd3, 0x4e, + 0x10, 0x8e, 0xd3, 0xe6, 0xd1, 0x49, 0x1f, 0xf9, 0xad, 0x7e, 0x2d, 0x26, 0x48, 0x69, 0xb0, 0x38, + 0x44, 0x1c, 0x92, 0x2a, 0x5c, 0x10, 0xe5, 0x42, 0xab, 0x56, 0x89, 0x10, 0x0f, 0x6d, 0x28, 0x48, + 0x88, 0xcb, 0xd6, 0x9e, 0x26, 0x06, 0xc7, 0x36, 0xde, 0x0d, 0x25, 0x37, 0x2e, 0x70, 0x46, 0xfc, + 0x55, 0x1c, 0x7b, 0xe4, 0x88, 0xda, 0x7f, 0x81, 0x23, 0x07, 0xb4, 0x63, 0x3b, 0x2f, 0xd2, 0x72, + 0xeb, 0x21, 0xf6, 0xce, 0xec, 0xf7, 0xcd, 0x7e, 0x33, 0xb3, 0x13, 0xc3, 0x7d, 0x3b, 0x18, 0x0c, + 0x02, 0xbf, 0x19, 0xbf, 0x64, 0x28, 0x6c, 0x6c, 0xd2, 0x53, 0x8e, 0x7c, 0x3b, 0x8c, 0x02, 0x15, + 0x34, 0xe9, 0x29, 0x27, 0xde, 0x06, 0x39, 0x58, 0x51, 0xf8, 0xa3, 0xae, 0xf6, 0x55, 0x76, 0xc2, + 0x77, 0xbd, 0xa6, 0xb0, 0x3d, 0xfd, 0xb3, 0xfb, 0xc2, 0xef, 0xa1, 0xd4, 0xcb, 0xf0, 0x38, 0xa5, + 0x4e, 0xfc, 0x31, 0xd7, 0xea, 0xc0, 0x5a, 0x1b, 0x85, 0xd3, 0x1d, 0xf9, 0x36, 0xd7, 0x7e, 0xc6, + 0x60, 0xf9, 0x24, 0x0a, 0x06, 0xa6, 0x51, 0x33, 0xea, 0xcb, 0x9c, 0xd6, 0x6c, 0x1d, 0xb2, 0x2a, + 0x30, 0xb3, 0xe4, 0xc9, 0xaa, 0x80, 0xfd, 0x0f, 0x39, 0xcf, 0x1d, 0xb8, 0xca, 0x5c, 0xaa, 0x19, + 0xf5, 0x35, 0x1e, 0x1b, 0xd6, 0x29, 0xac, 0x8f, 0x43, 0xa1, 0x1c, 0x7a, 0x4a, 0xc7, 0xea, 0x0b, + 0xd9, 0xa7, 0x58, 0xab, 0x9c, 0xd6, 0x6c, 0x17, 0x8a, 0xe8, 0xe1, 0x00, 0x7d, 0x25, 0xcd, 0x6c, + 0x6d, 0xa9, 0x5e, 0x6a, 0x6d, 0x37, 0x52, 0xfd, 0x8d, 0x59, 0xfe, 0x41, 0x8c, 0xe3, 0x63, 0x82, + 0x3e, 0xd8, 0x0e, 0x86, 0xfe, 0xf8, 0x60, 0x32, 0xac, 0x5d, 0xd8, 0x5c, 0x48, 0xd4, 0xba, 0x5d, + 0x87, 0x4e, 0x5f, 0xe1, 0x59, 0xd7, 0x21, 0x3d, 0x28, 0x1c, 0xca, 0x64, 0x85, 0xd3, 0xda, 0x7a, + 0x03, 0x1b, 0x13, 0xf2, 0xfb, 0x21, 0x4a, 0xc5, 0x4c, 0x28, 0x50, 0x89, 0x3b, 0x29, 0x37, 0x35, + 0x59, 0x13, 0xf2, 0x11, 0x55, 0x2f, 0x91, 0x7e, 0x63, 0x81, 0x74, 0xbd, 0xcf, 0x13, 0x98, 0x75, + 0x08, 0xe5, 0x29, 0x69, 0x61, 0xe0, 0x4b, 0x64, 0x2d, 0x28, 0x44, 0x24, 0x53, 0x9a, 0x06, 0x45, + 0x31, 0x2f, 0x2b, 0x00, 0x4f, 0x81, 0xd6, 0x2f, 0x03, 0xfe, 0x7b, 0x76, 0xfc, 0x16, 0x6d, 0xa5, + 0x77, 0x9f, 0xa0, 0x94, 0xa2, 0x87, 0x57, 0x08, 0x7d, 0x00, 0x05, 0x3b, 0xf0, 0x15, 0xfa, 0x8a, + 0x92, 0x2d, 0xb5, 0x6a, 0x93, 0x33, 0x26, 0x71, 0xf6, 0x63, 0xc8, 0x4b, 0xe1, 0x0d, 0x91, 0xa7, + 0x04, 0xd6, 0x04, 0x50, 0x11, 0xa2, 0x96, 0x82, 0x11, 0x55, 0xba, 0xd4, 0xda, 0x68, 0x08, 0xdb, + 0x6b, 0xbc, 0x18, 0xbb, 0xf9, 0x14, 0x84, 0x6d, 0x41, 0x5e, 0x5b, 0x1d, 0xc7, 0x5c, 0x26, 0x15, + 0x89, 0xc5, 0x2a, 0x50, 0x74, 0x1d, 0xf4, 0x95, 0xab, 0x46, 0x66, 0x8e, 0x76, 0xc6, 0x36, 0xbb, + 0x03, 0x6b, 0x21, 0x62, 0xd4, 0x75, 0x7b, 0xbe, 0x50, 0xc3, 0x08, 0xcd, 0x3c, 0x01, 0x66, 0x9d, + 0xd6, 0x6f, 0x03, 0xb6, 0x16, 0xcb, 0x65, 0x0f, 0x01, 0x74, 0xff, 0x8e, 0x42, 0x47, 0x28, 0xa4, + 0xf4, 0x4b, 0xad, 0xca, 0x7c, 0x92, 0xed, 0x31, 0xa2, 0x9d, 0xe1, 0x53, 0x78, 0xf6, 0x18, 0x36, + 0x4e, 0x86, 0x9e, 0x37, 0xd5, 0xf5, 0xa4, 0x4e, 0xdb, 0xf3, 0x21, 0x0e, 0x67, 0x61, 0xed, 0x0c, + 0x9f, 0x67, 0xb2, 0xa7, 0x50, 0x9e, 0xb8, 0xe2, 0x26, 0x27, 0x65, 0xab, 0x5d, 0x1e, 0x2d, 0xc6, + 0xb5, 0x33, 0xfc, 0x2f, 0xee, 0x5e, 0x01, 0x72, 0x1f, 0x74, 0x8e, 0xd6, 0x27, 0x03, 0xca, 0xf3, + 0x89, 0xe8, 0x19, 0xd0, 0x89, 0xc4, 0x97, 0x67, 0x85, 0xc7, 0x86, 0xbe, 0x54, 0xc9, 0x60, 0x27, + 0x57, 0xd3, 0xa4, 0x8e, 0x71, 0x71, 0xaa, 0x9b, 0xb6, 0x4f, 0x5b, 0xaf, 0x5c, 0xd5, 0xef, 0x38, + 0x3c, 0x05, 0x32, 0x0b, 0x56, 0xa5, 0x2f, 0x42, 0xd9, 0x0f, 0xd4, 0x73, 0xa1, 0xfa, 0xe6, 0x12, + 0x05, 0x9c, 0xf1, 0x59, 0x9f, 0x0d, 0xd8, 0x5c, 0x58, 0x88, 0x6b, 0xd6, 0xf1, 0x65, 0x7c, 0x13, + 0xe6, 0x4b, 0x78, 0xbd, 0x42, 0xee, 0x56, 0xa0, 0x78, 0x10, 0x45, 0xfb, 0x81, 0x83, 0x92, 0xad, + 0x03, 0x1c, 0xf9, 0xf8, 0x31, 0x44, 0x5b, 0xa1, 0x53, 0xce, 0xb4, 0xbe, 0x19, 0x90, 0xa3, 0x6e, + 0xb3, 0x47, 0x50, 0x4c, 0x47, 0x99, 0xdd, 0x5c, 0x34, 0xde, 0x54, 0xc3, 0x4a, 0x65, 0xe1, 0xe4, + 0xc7, 0x69, 0x1d, 0x42, 0xbe, 0xab, 0x22, 0x14, 0x03, 0x76, 0x6b, 0xd1, 0xec, 0x26, 0xff, 0x01, + 0x95, 0xab, 0x36, 0xeb, 0xc6, 0x8e, 0xb1, 0xb7, 0xfb, 0xfd, 0xbc, 0x6a, 0x9c, 0x9d, 0x57, 0x8d, + 0x9f, 0xe7, 0x55, 0xe3, 0xeb, 0x45, 0x35, 0x73, 0x76, 0x51, 0xcd, 0xfc, 0xb8, 0xa8, 0x66, 0x5e, + 0xdf, 0xfe, 0xe7, 0x17, 0xe7, 0x38, 0x4f, 0xaf, 0x7b, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x57, + 0xb9, 0x93, 0x47, 0x9d, 0x06, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { @@ -950,6 +976,20 @@ func (m *ObjectSyncMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.PeerSignature) > 0 { + i -= len(m.PeerSignature) + copy(dAtA[i:], m.PeerSignature) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.PeerSignature))) + i-- + dAtA[i] = 0x32 + } + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Identity))) + i-- + dAtA[i] = 0x2a + } if len(m.TreeId) > 0 { i -= len(m.TreeId) copy(dAtA[i:], m.TreeId) @@ -1167,6 +1207,20 @@ func (m *ObjectFullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.SnapshotPath[iNdEx]) i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) i-- + dAtA[i] = 0x1a + } + } + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- dAtA[i] = 0x12 } } @@ -1361,6 +1415,14 @@ func (m *ObjectSyncMessage) Size() (n int) { if l > 0 { n += 1 + l + sovSpacesync(uint64(l)) } + l = len(m.Identity) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + l = len(m.PeerSignature) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } return n } @@ -1451,6 +1513,12 @@ func (m *ObjectFullSyncRequest) Size() (n int) { n += 1 + l + sovSpacesync(uint64(l)) } } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + } if len(m.SnapshotPath) > 0 { for _, s := range m.SnapshotPath { l = len(s) @@ -2216,6 +2284,70 @@ func (m *ObjectSyncMessage) Unmarshal(dAtA []byte) error { } m.TreeId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PeerSignature", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PeerSignature = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSpacesync(dAtA[iNdEx:]) @@ -2602,6 +2734,40 @@ func (m *ObjectFullSyncRequest) Unmarshal(dAtA []byte) error { m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &aclpb.RawTreeChangeWithId{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) } diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index 87d8d445..9627f7a0 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -5,7 +5,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" ) @@ -49,8 +48,6 @@ func (s *syncHandler) HandleHeadUpdate( var ( fullRequest *spacesyncproto.ObjectFullSyncRequest result tree.AddResult - // in case update changes are empty then we want to sync the whole tree - sendChangesOnFullSync = len(update.Changes) == 0 ) res, err := s.treeCache.GetTree(ctx, treeId) @@ -74,9 +71,8 @@ func (s *syncHandler) HandleHeadUpdate( } // if we couldn't add all the changes - shouldFullSync := len(update.Changes) != len(result.Added) - if shouldFullSync { - fullRequest, err = s.prepareFullSyncRequest(objTree, sendChangesOnFullSync) + if len(update.Changes) != len(result.Added) { + fullRequest, err = s.prepareFullSyncRequest(objTree, update) if err != nil { return err } @@ -84,11 +80,6 @@ func (s *syncHandler) HandleHeadUpdate( return nil }() - // if there are no such tree - if err == storage.ErrUnknownTreeId { - fullRequest = &spacesyncproto.ObjectFullSyncRequest{} - } - // if we have incompatible heads, or we haven't seen the tree at all if fullRequest != nil { return s.syncClient.SendAsync(senderId, spacesyncproto.WrapFullRequest(fullRequest, header, treeId)) } @@ -109,21 +100,23 @@ func (s *syncHandler) HandleFullSyncRequest( return } - // TODO: check if sync request contains changes and add them (also do head update in this case) err = func() error { objTree := res.TreeContainer.Tree() objTree.Lock() defer res.Release() defer objTree.Unlock() - fullResponse, err = s.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Heads, objTree) + + _, err = objTree.AddRawChanges(ctx, request.Changes...) if err != nil { return err } - return nil + + fullResponse, err = s.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Heads, objTree) + return err }() if err != nil { - return err + return } return s.syncClient.SendAsync(senderId, spacesyncproto.WrapFullResponse(fullResponse, header, treeId)) } @@ -135,8 +128,6 @@ func (s *syncHandler) HandleFullSyncResponse( header *aclpb.TreeHeader, treeId string) (err error) { - var result tree.AddResult - res, err := s.treeCache.GetTree(ctx, treeId) if err != nil { return @@ -153,27 +144,28 @@ func (s *syncHandler) HandleFullSyncResponse( return nil } - result, err = objTree.AddRawChanges(ctx, response.Changes...) - - if err != nil { - return err - } - return nil + _, err = objTree.AddRawChanges(ctx, response.Changes...) + return err }() - // if error or nothing has changed - if (err != nil || len(result.Added) == 0) && err != storage.ErrUnknownTreeId { - return err - } - // if we have a new tree - if err == storage.ErrUnknownTreeId { - return s.addTree(ctx, response, header, treeId) - } return } -func (s *syncHandler) prepareFullSyncRequest(t tree.ObjectTree, sendOwnChanges bool) (*spacesyncproto.ObjectFullSyncRequest, error) { - // TODO: add send own changes logic +func (s *syncHandler) prepareFullSyncRequest( + t tree.ObjectTree, + update *spacesyncproto.ObjectHeadUpdate) (req *spacesyncproto.ObjectFullSyncRequest, err error) { + req = &spacesyncproto.ObjectFullSyncRequest{ + Heads: t.Heads(), + SnapshotPath: t.SnapshotPath(), + } + if len(update.Changes) != 0 { + var changesAfterSnapshot []*aclpb.RawTreeChangeWithId + changesAfterSnapshot, err = t.ChangesAfterCommonSnapshot(update.SnapshotPath, update.Heads) + if err != nil { + return + } + req.Changes = changesAfterSnapshot + } return &spacesyncproto.ObjectFullSyncRequest{ Heads: t.Heads(), SnapshotPath: t.SnapshotPath(), @@ -182,7 +174,8 @@ func (s *syncHandler) prepareFullSyncRequest(t tree.ObjectTree, sendOwnChanges b func (s *syncHandler) prepareFullSyncResponse( treeId string, - theirPath, theirHeads []string, + theirPath, + theirHeads []string, t tree.ObjectTree) (*spacesyncproto.ObjectFullSyncResponse, error) { ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath, theirHeads) if err != nil { @@ -195,19 +188,3 @@ func (s *syncHandler) prepareFullSyncResponse( SnapshotPath: t.SnapshotPath(), }, nil } - -func (s *syncHandler) addTree( - ctx context.Context, - response *spacesyncproto.ObjectFullSyncResponse, - header *aclpb.TreeHeader, - treeId string) error { - - return s.treeCache.AddTree( - ctx, - storage.TreeStorageCreatePayload{ - TreeId: treeId, - Header: header, - Changes: response.Changes, - Heads: response.Heads, - }) -} From f420ac144cd37464765103f7630e9e0ad701a5bf Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 16 Sep 2022 11:20:43 +0200 Subject: [PATCH 077/219] Update stream configuration and sync service --- common/commonspace/rpchandler.go | 2 +- common/commonspace/space.go | 17 +----- common/commonspace/syncservice/streampool.go | 9 ++- common/commonspace/syncservice/syncservice.go | 58 ++++++++++++------- common/nodeconf/configuration.go | 16 +++++ 5 files changed, 65 insertions(+), 37 deletions(-) diff --git a/common/commonspace/rpchandler.go b/common/commonspace/rpchandler.go index be83b43c..8d8aacac 100644 --- a/common/commonspace/rpchandler.go +++ b/common/commonspace/rpchandler.go @@ -20,5 +20,5 @@ func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncR } func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) (err error) { - return r.s.SyncService().StreamPool().AddAndReadStream(stream) + return r.s.SyncService().StreamPool().AddAndReadStreamSync(stream) } diff --git a/common/commonspace/space.go b/common/commonspace/space.go index bece7ca7..5723201b 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -148,7 +148,8 @@ func (s *space) testFill() { func (s *space) sync(ctx context.Context) error { st := time.Now() - peers, err := s.getPeers(ctx) + // diffing with responsible peers according to configuration + peers, err := s.nconf.ResponsiblePeers(ctx, s.id) if err != nil { return err } @@ -168,6 +169,7 @@ func (s *space) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { if err != nil { return nil } + s.pingTreesInCache(ctx, newIds) s.pingTreesInCache(ctx, changedIds) @@ -181,19 +183,6 @@ func (s *space) pingTreesInCache(ctx context.Context, trees []string) { } } -func (s *space) getPeers(ctx context.Context) (peers []peer.Peer, err error) { - if s.nconf.IsResponsible(s.id) { - return s.nconf.AllPeers(ctx, s.id) - } else { - var p peer.Peer - p, err = s.nconf.OnePeer(ctx, s.id) - if err != nil { - return nil, err - } - return []peer.Peer{p}, nil - } -} - func (s *space) Close() error { s.periodicSync.Close() return s.syncService.Close() diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 0ccd2d6b..cbfb7424 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -17,7 +17,8 @@ const maxSimultaneousOperationsPerStream = 10 // StreamPool can be made generic to work with different streams type StreamPool interface { - AddAndReadStream(stream spacesyncproto.SpaceStream) (err error) + AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error) + AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) HasStream(peerId string) bool SyncClient Close() (err error) @@ -151,7 +152,11 @@ func (s *streamPool) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) ( return nil } -func (s *streamPool) AddAndReadStream(stream spacesyncproto.SpaceStream) (err error) { +func (s *streamPool) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) { + go s.AddAndReadStreamSync(stream) +} + +func (s *streamPool) AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error) { s.Lock() peerId, err := GetPeerIdFromStreamContext(stream.Context()) if err != nil { diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index c3f85101..2c155fea 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -6,6 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "time" ) type SyncService interface { @@ -14,39 +15,56 @@ type SyncService interface { Close() (err error) } +const respPeersStreamCheckInterval = time.Second * 10 + type syncService struct { - syncHandler SyncHandler - streamPool StreamPool - configuration nodeconf.Configuration - spaceId string + syncHandler SyncHandler + streamPool StreamPool + configuration nodeconf.Configuration + spaceId string + streamLoopCtx context.Context + stopStreamLoop context.CancelFunc +} + +func (s *syncService) Run() { + s.streamLoopCtx, s.stopStreamLoop = context.WithCancel(context.Background()) + s.streamCheckLoop(s.streamLoopCtx) } func (s *syncService) Close() (err error) { + s.stopStreamLoop() return s.streamPool.Close() } func (s *syncService) NotifyHeadUpdate(ctx context.Context, treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) { - msg := spacesyncproto.WrapHeadUpdate(update, header, treeId) - peers, err := s.configuration.AllPeers(context.Background(), s.spaceId) - if err != nil { - return - } - for _, peer := range peers { - if s.streamPool.HasStream(peer.Id()) { - continue - } - cl := spacesyncproto.NewDRPCSpaceClient(peer) - stream, err := cl.Stream(ctx) - if err != nil { - continue - } + return s.streamPool.BroadcastAsync(spacesyncproto.WrapHeadUpdate(update, header, treeId)) +} - err = s.streamPool.AddAndReadStream(stream) +func (s *syncService) streamCheckLoop(ctx context.Context) { + for { + respPeers, err := s.configuration.ResponsiblePeers(ctx, s.spaceId) if err != nil { continue } + for _, peer := range respPeers { + if s.streamPool.HasStream(peer.Id()) { + continue + } + cl := spacesyncproto.NewDRPCSpaceClient(peer) + stream, err := cl.Stream(ctx) + if err != nil { + continue + } + + s.streamPool.AddAndReadStreamAsync(stream) + } + select { + case <-time.After(respPeersStreamCheckInterval): + break + case <-ctx.Done(): + return + } } - return s.streamPool.BroadcastAsync(msg) } func (s *syncService) StreamPool() StreamPool { diff --git a/common/nodeconf/configuration.go b/common/nodeconf/configuration.go index 5c055bbb..597d1018 100644 --- a/common/nodeconf/configuration.go +++ b/common/nodeconf/configuration.go @@ -19,6 +19,8 @@ type Configuration interface { AllPeers(ctx context.Context, spaceId string) (peers []peer.Peer, err error) // OnePeer returns one of peer for spaceId OnePeer(ctx context.Context, spaceId string) (p peer.Peer, err error) + // ResponsiblePeers returns peers for the space id that are responsible for the space + ResponsiblePeers(ctx context.Context, spaceId string) (peers []peer.Peer, err error) // NodeIds returns list of peerId for given spaceId NodeIds(spaceId string) []string // IsResponsible checks if current account responsible for given spaceId @@ -51,6 +53,20 @@ func (c *configuration) AllPeers(ctx context.Context, spaceId string) (peers []p return } +func (c *configuration) ResponsiblePeers(ctx context.Context, spaceId string) (peers []peer.Peer, err error) { + if c.IsResponsible(spaceId) { + return c.AllPeers(ctx, spaceId) + } else { + var one peer.Peer + one, err = c.OnePeer(ctx, spaceId) + if err != nil { + return + } + peers = []peer.Peer{one} + return + } +} + func (c *configuration) OnePeer(ctx context.Context, spaceId string) (p peer.Peer, err error) { nodeIds := c.NodeIds(spaceId) return c.pool.GetOneOf(ctx, nodeIds) From 70dabf70dddf39112c9ff145c0c07286075b9f7c Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 17 Sep 2022 20:54:23 +0200 Subject: [PATCH 078/219] Move diff logic to separate service, simplify send sync --- common/commonspace/diffservice/diffservice.go | 155 +++++++ .../{ => diffservice}/periodicsync.go | 2 +- common/commonspace/remotediff/remotediff.go | 2 +- .../commonspace/remotediff/remotediff_test.go | 2 +- common/commonspace/rpchandler.go | 3 +- common/commonspace/service.go | 7 +- common/commonspace/space.go | 138 ++---- .../spacesyncproto/protos/spacesync.proto | 12 +- .../commonspace/spacesyncproto/spacesync.go | 16 +- .../spacesyncproto/spacesync.pb.go | 421 +++++++++++++----- common/commonspace/syncservice/streampool.go | 68 ++- common/commonspace/syncservice/synchandler.go | 57 +-- common/commonspace/syncservice/syncservice.go | 86 ++-- 13 files changed, 652 insertions(+), 317 deletions(-) create mode 100644 common/commonspace/diffservice/diffservice.go rename common/commonspace/{ => diffservice}/periodicsync.go (98%) diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go new file mode 100644 index 00000000..b530d05f --- /dev/null +++ b/common/commonspace/diffservice/diffservice.go @@ -0,0 +1,155 @@ +package diffservice + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" + "go.uber.org/zap" + "strings" + "time" +) + +type DiffService interface { + HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) + UpdateHeads(id string, heads []string) + RemoveObject(id string) + + Init(objectIds []string) + Close() (err error) +} + +type diffService struct { + spaceId string + periodicSync *periodicSync + storage storage.Storage + nconf nodeconf.Configuration + diff ldiff.Diff + cache cache.TreeCache + log *zap.Logger + + syncPeriod int +} + +func NewDiffService( + spaceId string, + syncPeriod int, + storage storage.Storage, + nconf nodeconf.Configuration, + cache cache.TreeCache, + log *zap.Logger) DiffService { + return &diffService{ + spaceId: spaceId, + storage: storage, + nconf: nconf, + cache: cache, + log: log, + syncPeriod: syncPeriod, + } +} + +func (d *diffService) Init(objectIds []string) { + d.periodicSync = newPeriodicSync(d.syncPeriod, d.sync, d.log.With(zap.String("spaceId", d.spaceId))) + d.diff = ldiff.New(16, 16) + d.fillDiff(objectIds) +} + +func (d *diffService) HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) { + return remotediff.HandleRangeRequest(ctx, d.diff, req) +} + +func (d *diffService) UpdateHeads(id string, heads []string) { + d.diff.Set(ldiff.Element{ + Id: id, + Head: concatStrings(heads), + }) +} + +func (d *diffService) RemoveObject(id string) { + // TODO: add space document to remove ids + d.diff.RemoveId(id) +} + +func (d *diffService) Close() (err error) { + d.periodicSync.Close() + return nil +} + +func (d *diffService) sync(ctx context.Context) error { + st := time.Now() + // diffing with responsible peers according to configuration + peers, err := d.nconf.ResponsiblePeers(ctx, d.spaceId) + if err != nil { + return err + } + for _, p := range peers { + if err := d.syncWithPeer(ctx, p); err != nil { + d.log.Error("can't sync with peer", zap.String("peer", p.Id()), zap.Error(err)) + } + } + d.log.Info("synced", zap.String("spaceId", d.spaceId), zap.Duration("dur", time.Since(st))) + return nil +} + +func (d *diffService) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { + cl := spacesyncproto.NewDRPCSpaceClient(p) + rdiff := remotediff.NewRemoteDiff(d.spaceId, cl) + newIds, changedIds, removedIds, err := d.diff.Diff(ctx, rdiff) + if err != nil { + return nil + } + + d.pingTreesInCache(ctx, newIds) + d.pingTreesInCache(ctx, changedIds) + + d.log.Info("sync done:", zap.Int("newIds", len(newIds)), + zap.Int("changedIds", len(changedIds)), + zap.Int("removedIds", len(removedIds))) + return +} + +func (d *diffService) pingTreesInCache(ctx context.Context, trees []string) { + for _, tId := range trees { + _, _ = d.cache.GetTree(ctx, tId) + } +} + +func (d *diffService) fillDiff(objectIds []string) { + var els = make([]ldiff.Element, 0, len(objectIds)) + for _, id := range objectIds { + st, err := d.storage.Storage(id) + if err != nil { + continue + } + heads, err := st.(treestorage.TreeStorage).Heads() + if err != nil { + continue + } + els = append(els, ldiff.Element{ + Id: id, + Head: concatStrings(heads), + }) + } + d.diff.Set(els...) +} + +func concatStrings(strs []string) string { + var ( + b strings.Builder + totalLen int + ) + for _, s := range strs { + totalLen += len(s) + } + + b.Grow(totalLen) + for _, s := range strs { + b.WriteString(s) + } + return b.String() +} diff --git a/common/commonspace/periodicsync.go b/common/commonspace/diffservice/periodicsync.go similarity index 98% rename from common/commonspace/periodicsync.go rename to common/commonspace/diffservice/periodicsync.go index 219f953e..59616eab 100644 --- a/common/commonspace/periodicsync.go +++ b/common/commonspace/diffservice/periodicsync.go @@ -1,4 +1,4 @@ -package commonspace +package diffservice import ( "context" diff --git a/common/commonspace/remotediff/remotediff.go b/common/commonspace/remotediff/remotediff.go index 1a01814c..8121b1c1 100644 --- a/common/commonspace/remotediff/remotediff.go +++ b/common/commonspace/remotediff/remotediff.go @@ -60,7 +60,7 @@ func (r remote) Ranges(ctx context.Context, ranges []ldiff.Range, resBuf []ldiff return } -func HandlerRangeRequest(ctx context.Context, d ldiff.Diff, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) { +func HandleRangeRequest(ctx context.Context, d ldiff.Diff, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) { ranges := make([]ldiff.Range, 0, len(req.Ranges)) for _, reqRange := range req.Ranges { ranges = append(ranges, ldiff.Range{ diff --git a/common/commonspace/remotediff/remotediff_test.go b/common/commonspace/remotediff/remotediff_test.go index d209b753..f6b3e7e5 100644 --- a/common/commonspace/remotediff/remotediff_test.go +++ b/common/commonspace/remotediff/remotediff_test.go @@ -37,5 +37,5 @@ type mockClient struct { } func (m *mockClient) HeadSync(ctx context.Context, in *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) { - return HandlerRangeRequest(ctx, m.l, in) + return HandleRangeRequest(ctx, m.l, in) } diff --git a/common/commonspace/rpchandler.go b/common/commonspace/rpchandler.go index 8d8aacac..dbc5b7aa 100644 --- a/common/commonspace/rpchandler.go +++ b/common/commonspace/rpchandler.go @@ -2,7 +2,6 @@ package commonspace import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" ) @@ -16,7 +15,7 @@ type rpcHandler struct { } func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) { - return remotediff.HandlerRangeRequest(ctx, r.s.diff, req) + return r.s.DiffService().HandleRangeRequest(ctx, req) } func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) (err error) { diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 3c084562..9598d53a 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -5,6 +5,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice" "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/nodeconf" @@ -44,12 +45,14 @@ func (s *service) Name() (name string) { } func (s *service) CreateSpace(ctx context.Context, id string) (Space, error) { - syncService := syncservice.NewSyncService(id, nil, s.configurationService.GetLast()) + lastConfiguration := s.configurationService.GetLast() + diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, s.storage, lastConfiguration, s.cache, log) + syncService := syncservice.NewSyncService(id, diffService, s.cache, lastConfiguration) sp := &space{ id: id, - nconf: s.configurationService.GetLast(), conf: s.config, syncService: syncService, + diffService: diffService, cache: s.cache, storage: s.storage, } diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 5723201b..91657bb7 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -2,24 +2,17 @@ package commonspace import ( "context" - "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" + "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/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" - "go.uber.org/zap" - "math/rand" "sync" - "time" ) type Space interface { @@ -27,6 +20,7 @@ type Space interface { SpaceSyncRpc() RpcHandler SyncService() syncservice.SyncService + DiffService() diffservice.DiffService CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) BuildTree(ctx context.Context, id string, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) @@ -35,18 +29,40 @@ type Space interface { } type space struct { - id string - nconf nodeconf.Configuration - conf config.Space - diff ldiff.Diff - mu sync.RWMutex + id string + conf config.Space + mu sync.RWMutex - rpc *rpcHandler - periodicSync *periodicSync - syncService syncservice.SyncService - storage storage.Storage - cache cache.TreeCache - aclList list.ACLList + rpc *rpcHandler + + syncService syncservice.SyncService + diffService diffservice.DiffService + storage storage.Storage + cache cache.TreeCache + aclList list.ACLList +} + +func (s *space) Id() string { + return s.id +} + +func (s *space) Init(ctx context.Context) error { + s.rpc = &rpcHandler{s: s} + s.diffService.Init(s.getObjectIds()) + s.syncService.Init() + return nil +} + +func (s *space) SpaceSyncRpc() RpcHandler { + return s.rpc +} + +func (s *space) SyncService() syncservice.SyncService { + return s.syncService +} + +func (s *space) DiffService() diffservice.DiffService { + return s.diffService } func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) { @@ -63,10 +79,7 @@ func (s *space) BuildTree(ctx context.Context, id string, listener tree.ObjectTr return s.syncService.StreamPool().SendSync( peerId, - spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{}, nil, id), - func(syncMessage *spacesyncproto.ObjectSyncMessage) bool { - return syncMessage.TreeId == id && syncMessage.GetContent().GetFullSyncResponse() != nil - }, + spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{}, nil, id, ""), ) } @@ -105,85 +118,12 @@ func (s *space) BuildTree(ctx context.Context, id string, listener tree.ObjectTr return synctree.BuildSyncTree(s.syncService, store.(treestorage.TreeStorage), listener, s.aclList) } -func (s *space) Id() string { - return s.id -} - -func (s *space) Init(ctx context.Context) error { - s.diff = ldiff.New(16, 16) - s.periodicSync = newPeriodicSync(s.conf.SyncPeriod, s.sync, log.With(zap.String("spaceId", s.id))) - s.rpc = &rpcHandler{s: s} - s.testFill() +func (s *space) getObjectIds() []string { + // TODO: add space object logic return nil } -func (s *space) SpaceSyncRpc() RpcHandler { - return s.rpc -} - -func (s *space) SyncService() syncservice.SyncService { - return s.syncService -} - -func (s *space) testFill() { - var n = 1000 - var els = make([]ldiff.Element, 0, n) - rand.Seed(time.Now().UnixNano()) - for i := 0; i < n; i++ { - if rand.Intn(n) > 2 { - id := fmt.Sprintf("%s.%d", s.id, i) - head := "head." + id - if rand.Intn(n) > n-10 { - head += ".modified" - } - el := ldiff.Element{ - Id: id, - Head: head, - } - els = append(els, el) - } - } - s.diff.Set(els...) -} - -func (s *space) sync(ctx context.Context) error { - st := time.Now() - // diffing with responsible peers according to configuration - peers, err := s.nconf.ResponsiblePeers(ctx, s.id) - if err != nil { - return err - } - for _, p := range peers { - if err := s.syncWithPeer(ctx, p); err != nil { - log.Error("can't sync with peer", zap.String("peer", p.Id()), zap.Error(err)) - } - } - log.Info("synced", zap.String("spaceId", s.id), zap.Duration("dur", time.Since(st))) - return nil -} - -func (s *space) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { - cl := spacesyncproto.NewDRPCSpaceClient(p) - rdiff := remotediff.NewRemoteDiff(s.id, cl) - newIds, changedIds, removedIds, err := s.diff.Diff(ctx, rdiff) - if err != nil { - return nil - } - - s.pingTreesInCache(ctx, newIds) - s.pingTreesInCache(ctx, changedIds) - - log.Info("sync done:", zap.Int("newIds", len(newIds)), zap.Int("changedIds", len(changedIds)), zap.Int("removedIds", len(removedIds))) - return -} - -func (s *space) pingTreesInCache(ctx context.Context, trees []string) { - for _, tId := range trees { - _, _ = s.cache.GetTree(ctx, tId) - } -} - func (s *space) Close() error { - s.periodicSync.Close() + s.diffService.Close() return s.syncService.Close() } diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index 7fd7d411..22f7e82d 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -51,9 +51,10 @@ message ObjectSyncMessage { ObjectSyncContentValue content = 2; acl.TreeHeader treeHeader = 3; string treeId = 4; - - string identity = 5; - string peerSignature = 6; + string trackingId = 5; +// +// string identity = 5; +// string peerSignature = 6; } // ObjectSyncContentValue provides different types for object sync @@ -62,6 +63,7 @@ message ObjectSyncContentValue { ObjectHeadUpdate headUpdate = 1; ObjectFullSyncRequest fullSyncRequest = 2; ObjectFullSyncResponse fullSyncResponse = 3; + ObjectErrorResponse errorResponse = 4; } } @@ -85,3 +87,7 @@ message ObjectFullSyncResponse { repeated acl.RawTreeChangeWithId changes = 2; repeated string snapshotPath = 3; } + +message ObjectErrorResponse { + string error = 1; +} diff --git a/common/commonspace/spacesyncproto/spacesync.go b/common/commonspace/spacesyncproto/spacesync.go index 66de459d..25ec1ba6 100644 --- a/common/commonspace/spacesyncproto/spacesync.go +++ b/common/commonspace/spacesyncproto/spacesync.go @@ -4,7 +4,7 @@ import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclch type SpaceStream = DRPCSpace_StreamStream -func WrapHeadUpdate(update *ObjectHeadUpdate, header *aclpb.TreeHeader, treeId string) *ObjectSyncMessage { +func WrapHeadUpdate(update *ObjectHeadUpdate, header *aclpb.TreeHeader, treeId, trackingId string) *ObjectSyncMessage { return &ObjectSyncMessage{ Content: &ObjectSyncContentValue{ Value: &ObjectSyncContentValue_HeadUpdate{HeadUpdate: update}, @@ -14,7 +14,7 @@ func WrapHeadUpdate(update *ObjectHeadUpdate, header *aclpb.TreeHeader, treeId s } } -func WrapFullRequest(request *ObjectFullSyncRequest, header *aclpb.TreeHeader, treeId string) *ObjectSyncMessage { +func WrapFullRequest(request *ObjectFullSyncRequest, header *aclpb.TreeHeader, treeId, trackingId string) *ObjectSyncMessage { return &ObjectSyncMessage{ Content: &ObjectSyncContentValue{ Value: &ObjectSyncContentValue_FullSyncRequest{FullSyncRequest: request}, @@ -24,7 +24,7 @@ func WrapFullRequest(request *ObjectFullSyncRequest, header *aclpb.TreeHeader, t } } -func WrapFullResponse(response *ObjectFullSyncResponse, header *aclpb.TreeHeader, treeId string) *ObjectSyncMessage { +func WrapFullResponse(response *ObjectFullSyncResponse, header *aclpb.TreeHeader, treeId, trackingId string) *ObjectSyncMessage { return &ObjectSyncMessage{ Content: &ObjectSyncContentValue{ Value: &ObjectSyncContentValue_FullSyncResponse{FullSyncResponse: response}, @@ -33,3 +33,13 @@ func WrapFullResponse(response *ObjectFullSyncResponse, header *aclpb.TreeHeader TreeId: treeId, } } + +func WrapError(err error, header *aclpb.TreeHeader, treeId, trackingId string) *ObjectSyncMessage { + return &ObjectSyncMessage{ + Content: &ObjectSyncContentValue{ + Value: &ObjectSyncContentValue_ErrorResponse{ErrorResponse: &ObjectErrorResponse{Error: err.Error()}}, + }, + TreeHeader: header, + TreeId: treeId, + } +} diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 64419bb0..04b77518 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -320,12 +320,11 @@ func (m *HeadSyncResponse) GetResults() []*HeadSyncResult { // ObjectSyncMessage is a message sent on object sync type ObjectSyncMessage struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - Content *ObjectSyncContentValue `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` - TreeHeader *aclpb.TreeHeader `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` - TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` - Identity string `protobuf:"bytes,5,opt,name=identity,proto3" json:"identity,omitempty"` - PeerSignature string `protobuf:"bytes,6,opt,name=peerSignature,proto3" json:"peerSignature,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Content *ObjectSyncContentValue `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + TreeHeader *aclpb.TreeHeader `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` + TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` + TrackingId string `protobuf:"bytes,5,opt,name=trackingId,proto3" json:"trackingId,omitempty"` } func (m *ObjectSyncMessage) Reset() { *m = ObjectSyncMessage{} } @@ -389,16 +388,9 @@ func (m *ObjectSyncMessage) GetTreeId() string { return "" } -func (m *ObjectSyncMessage) GetIdentity() string { +func (m *ObjectSyncMessage) GetTrackingId() string { if m != nil { - return m.Identity - } - return "" -} - -func (m *ObjectSyncMessage) GetPeerSignature() string { - if m != nil { - return m.PeerSignature + return m.TrackingId } return "" } @@ -409,6 +401,7 @@ type ObjectSyncContentValue struct { // *ObjectSyncContentValue_HeadUpdate // *ObjectSyncContentValue_FullSyncRequest // *ObjectSyncContentValue_FullSyncResponse + // *ObjectSyncContentValue_ErrorResponse Value isObjectSyncContentValue_Value `protobuf_oneof:"value"` } @@ -460,10 +453,14 @@ type ObjectSyncContentValue_FullSyncRequest struct { type ObjectSyncContentValue_FullSyncResponse struct { FullSyncResponse *ObjectFullSyncResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` } +type ObjectSyncContentValue_ErrorResponse struct { + ErrorResponse *ObjectErrorResponse `protobuf:"bytes,4,opt,name=errorResponse,proto3,oneof" json:"errorResponse,omitempty"` +} func (*ObjectSyncContentValue_HeadUpdate) isObjectSyncContentValue_Value() {} func (*ObjectSyncContentValue_FullSyncRequest) isObjectSyncContentValue_Value() {} func (*ObjectSyncContentValue_FullSyncResponse) isObjectSyncContentValue_Value() {} +func (*ObjectSyncContentValue_ErrorResponse) isObjectSyncContentValue_Value() {} func (m *ObjectSyncContentValue) GetValue() isObjectSyncContentValue_Value { if m != nil { @@ -493,12 +490,20 @@ func (m *ObjectSyncContentValue) GetFullSyncResponse() *ObjectFullSyncResponse { return nil } +func (m *ObjectSyncContentValue) GetErrorResponse() *ObjectErrorResponse { + if x, ok := m.GetValue().(*ObjectSyncContentValue_ErrorResponse); ok { + return x.ErrorResponse + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*ObjectSyncContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ (*ObjectSyncContentValue_HeadUpdate)(nil), (*ObjectSyncContentValue_FullSyncRequest)(nil), (*ObjectSyncContentValue_FullSyncResponse)(nil), + (*ObjectSyncContentValue_ErrorResponse)(nil), } } @@ -685,6 +690,50 @@ func (m *ObjectFullSyncResponse) GetSnapshotPath() []string { return nil } +type ObjectErrorResponse struct { + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *ObjectErrorResponse) Reset() { *m = ObjectErrorResponse{} } +func (m *ObjectErrorResponse) String() string { return proto.CompactTextString(m) } +func (*ObjectErrorResponse) ProtoMessage() {} +func (*ObjectErrorResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{10} +} +func (m *ObjectErrorResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ObjectErrorResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ObjectErrorResponse.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 *ObjectErrorResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ObjectErrorResponse.Merge(m, src) +} +func (m *ObjectErrorResponse) XXX_Size() int { + return m.Size() +} +func (m *ObjectErrorResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ObjectErrorResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ObjectErrorResponse proto.InternalMessageInfo + +func (m *ObjectErrorResponse) GetError() string { + if m != nil { + return m.Error + } + return "" +} + func init() { proto.RegisterEnum("anySpace.ErrCodes", ErrCodes_name, ErrCodes_value) proto.RegisterType((*HeadSyncRange)(nil), "anySpace.HeadSyncRange") @@ -697,6 +746,7 @@ func init() { proto.RegisterType((*ObjectHeadUpdate)(nil), "anySpace.ObjectHeadUpdate") proto.RegisterType((*ObjectFullSyncRequest)(nil), "anySpace.ObjectFullSyncRequest") proto.RegisterType((*ObjectFullSyncResponse)(nil), "anySpace.ObjectFullSyncResponse") + proto.RegisterType((*ObjectErrorResponse)(nil), "anySpace.ObjectErrorResponse") } func init() { @@ -704,51 +754,52 @@ func init() { } var fileDescriptor_5855f4ef9cf24cdb = []byte{ - // 695 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcb, 0x6f, 0xd3, 0x4e, - 0x10, 0x8e, 0xd3, 0xe6, 0xd1, 0x49, 0x1f, 0xf9, 0xad, 0x7e, 0x2d, 0x26, 0x48, 0x69, 0xb0, 0x38, - 0x44, 0x1c, 0x92, 0x2a, 0x5c, 0x10, 0xe5, 0x42, 0xab, 0x56, 0x89, 0x10, 0x0f, 0x6d, 0x28, 0x48, - 0x88, 0xcb, 0xd6, 0x9e, 0x26, 0x06, 0xc7, 0x36, 0xde, 0x0d, 0x25, 0x37, 0x2e, 0x70, 0x46, 0xfc, - 0x55, 0x1c, 0x7b, 0xe4, 0x88, 0xda, 0x7f, 0x81, 0x23, 0x07, 0xb4, 0x63, 0x3b, 0x2f, 0xd2, 0x72, - 0xeb, 0x21, 0xf6, 0xce, 0xec, 0xf7, 0xcd, 0x7e, 0x33, 0xb3, 0x13, 0xc3, 0x7d, 0x3b, 0x18, 0x0c, - 0x02, 0xbf, 0x19, 0xbf, 0x64, 0x28, 0x6c, 0x6c, 0xd2, 0x53, 0x8e, 0x7c, 0x3b, 0x8c, 0x02, 0x15, - 0x34, 0xe9, 0x29, 0x27, 0xde, 0x06, 0x39, 0x58, 0x51, 0xf8, 0xa3, 0xae, 0xf6, 0x55, 0x76, 0xc2, - 0x77, 0xbd, 0xa6, 0xb0, 0x3d, 0xfd, 0xb3, 0xfb, 0xc2, 0xef, 0xa1, 0xd4, 0xcb, 0xf0, 0x38, 0xa5, - 0x4e, 0xfc, 0x31, 0xd7, 0xea, 0xc0, 0x5a, 0x1b, 0x85, 0xd3, 0x1d, 0xf9, 0x36, 0xd7, 0x7e, 0xc6, - 0x60, 0xf9, 0x24, 0x0a, 0x06, 0xa6, 0x51, 0x33, 0xea, 0xcb, 0x9c, 0xd6, 0x6c, 0x1d, 0xb2, 0x2a, - 0x30, 0xb3, 0xe4, 0xc9, 0xaa, 0x80, 0xfd, 0x0f, 0x39, 0xcf, 0x1d, 0xb8, 0xca, 0x5c, 0xaa, 0x19, - 0xf5, 0x35, 0x1e, 0x1b, 0xd6, 0x29, 0xac, 0x8f, 0x43, 0xa1, 0x1c, 0x7a, 0x4a, 0xc7, 0xea, 0x0b, - 0xd9, 0xa7, 0x58, 0xab, 0x9c, 0xd6, 0x6c, 0x17, 0x8a, 0xe8, 0xe1, 0x00, 0x7d, 0x25, 0xcd, 0x6c, - 0x6d, 0xa9, 0x5e, 0x6a, 0x6d, 0x37, 0x52, 0xfd, 0x8d, 0x59, 0xfe, 0x41, 0x8c, 0xe3, 0x63, 0x82, - 0x3e, 0xd8, 0x0e, 0x86, 0xfe, 0xf8, 0x60, 0x32, 0xac, 0x5d, 0xd8, 0x5c, 0x48, 0xd4, 0xba, 0x5d, - 0x87, 0x4e, 0x5f, 0xe1, 0x59, 0xd7, 0x21, 0x3d, 0x28, 0x1c, 0xca, 0x64, 0x85, 0xd3, 0xda, 0x7a, - 0x03, 0x1b, 0x13, 0xf2, 0xfb, 0x21, 0x4a, 0xc5, 0x4c, 0x28, 0x50, 0x89, 0x3b, 0x29, 0x37, 0x35, - 0x59, 0x13, 0xf2, 0x11, 0x55, 0x2f, 0x91, 0x7e, 0x63, 0x81, 0x74, 0xbd, 0xcf, 0x13, 0x98, 0x75, - 0x08, 0xe5, 0x29, 0x69, 0x61, 0xe0, 0x4b, 0x64, 0x2d, 0x28, 0x44, 0x24, 0x53, 0x9a, 0x06, 0x45, - 0x31, 0x2f, 0x2b, 0x00, 0x4f, 0x81, 0xd6, 0x2f, 0x03, 0xfe, 0x7b, 0x76, 0xfc, 0x16, 0x6d, 0xa5, - 0x77, 0x9f, 0xa0, 0x94, 0xa2, 0x87, 0x57, 0x08, 0x7d, 0x00, 0x05, 0x3b, 0xf0, 0x15, 0xfa, 0x8a, - 0x92, 0x2d, 0xb5, 0x6a, 0x93, 0x33, 0x26, 0x71, 0xf6, 0x63, 0xc8, 0x4b, 0xe1, 0x0d, 0x91, 0xa7, - 0x04, 0xd6, 0x04, 0x50, 0x11, 0xa2, 0x96, 0x82, 0x11, 0x55, 0xba, 0xd4, 0xda, 0x68, 0x08, 0xdb, - 0x6b, 0xbc, 0x18, 0xbb, 0xf9, 0x14, 0x84, 0x6d, 0x41, 0x5e, 0x5b, 0x1d, 0xc7, 0x5c, 0x26, 0x15, - 0x89, 0xc5, 0x2a, 0x50, 0x74, 0x1d, 0xf4, 0x95, 0xab, 0x46, 0x66, 0x8e, 0x76, 0xc6, 0x36, 0xbb, - 0x03, 0x6b, 0x21, 0x62, 0xd4, 0x75, 0x7b, 0xbe, 0x50, 0xc3, 0x08, 0xcd, 0x3c, 0x01, 0x66, 0x9d, - 0xd6, 0x6f, 0x03, 0xb6, 0x16, 0xcb, 0x65, 0x0f, 0x01, 0x74, 0xff, 0x8e, 0x42, 0x47, 0x28, 0xa4, - 0xf4, 0x4b, 0xad, 0xca, 0x7c, 0x92, 0xed, 0x31, 0xa2, 0x9d, 0xe1, 0x53, 0x78, 0xf6, 0x18, 0x36, - 0x4e, 0x86, 0x9e, 0x37, 0xd5, 0xf5, 0xa4, 0x4e, 0xdb, 0xf3, 0x21, 0x0e, 0x67, 0x61, 0xed, 0x0c, - 0x9f, 0x67, 0xb2, 0xa7, 0x50, 0x9e, 0xb8, 0xe2, 0x26, 0x27, 0x65, 0xab, 0x5d, 0x1e, 0x2d, 0xc6, - 0xb5, 0x33, 0xfc, 0x2f, 0xee, 0x5e, 0x01, 0x72, 0x1f, 0x74, 0x8e, 0xd6, 0x27, 0x03, 0xca, 0xf3, - 0x89, 0xe8, 0x19, 0xd0, 0x89, 0xc4, 0x97, 0x67, 0x85, 0xc7, 0x86, 0xbe, 0x54, 0xc9, 0x60, 0x27, - 0x57, 0xd3, 0xa4, 0x8e, 0x71, 0x71, 0xaa, 0x9b, 0xb6, 0x4f, 0x5b, 0xaf, 0x5c, 0xd5, 0xef, 0x38, - 0x3c, 0x05, 0x32, 0x0b, 0x56, 0xa5, 0x2f, 0x42, 0xd9, 0x0f, 0xd4, 0x73, 0xa1, 0xfa, 0xe6, 0x12, - 0x05, 0x9c, 0xf1, 0x59, 0x9f, 0x0d, 0xd8, 0x5c, 0x58, 0x88, 0x6b, 0xd6, 0xf1, 0x65, 0x7c, 0x13, - 0xe6, 0x4b, 0x78, 0xbd, 0x42, 0xee, 0x56, 0xa0, 0x78, 0x10, 0x45, 0xfb, 0x81, 0x83, 0x92, 0xad, - 0x03, 0x1c, 0xf9, 0xf8, 0x31, 0x44, 0x5b, 0xa1, 0x53, 0xce, 0xb4, 0xbe, 0x19, 0x90, 0xa3, 0x6e, - 0xb3, 0x47, 0x50, 0x4c, 0x47, 0x99, 0xdd, 0x5c, 0x34, 0xde, 0x54, 0xc3, 0x4a, 0x65, 0xe1, 0xe4, - 0xc7, 0x69, 0x1d, 0x42, 0xbe, 0xab, 0x22, 0x14, 0x03, 0x76, 0x6b, 0xd1, 0xec, 0x26, 0xff, 0x01, - 0x95, 0xab, 0x36, 0xeb, 0xc6, 0x8e, 0xb1, 0xb7, 0xfb, 0xfd, 0xbc, 0x6a, 0x9c, 0x9d, 0x57, 0x8d, - 0x9f, 0xe7, 0x55, 0xe3, 0xeb, 0x45, 0x35, 0x73, 0x76, 0x51, 0xcd, 0xfc, 0xb8, 0xa8, 0x66, 0x5e, - 0xdf, 0xfe, 0xe7, 0x17, 0xe7, 0x38, 0x4f, 0xaf, 0x7b, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x57, - 0xb9, 0x93, 0x47, 0x9d, 0x06, 0x00, 0x00, + // 712 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x4b, 0x6f, 0xd3, 0x40, + 0x10, 0xf6, 0xa6, 0x79, 0x75, 0xd2, 0x47, 0x58, 0x68, 0x31, 0x41, 0xa4, 0xc1, 0xa7, 0x08, 0xa4, + 0xa4, 0x0a, 0x17, 0x44, 0xb9, 0xd0, 0x2a, 0x55, 0x22, 0xc4, 0x43, 0x5b, 0x0a, 0x12, 0xe2, 0xb2, + 0xb5, 0xb7, 0x49, 0xa8, 0x63, 0x1b, 0xef, 0x86, 0xd2, 0x1b, 0x17, 0x38, 0x23, 0xfe, 0x12, 0x17, + 0x8e, 0x15, 0x27, 0x8e, 0xa8, 0xfd, 0x23, 0x68, 0xc7, 0x76, 0x5e, 0xb8, 0xe5, 0xd6, 0x43, 0xec, + 0x9d, 0xd9, 0xf9, 0xbe, 0xfd, 0xf6, 0x9b, 0xf5, 0x06, 0x1e, 0xda, 0xfe, 0x70, 0xe8, 0x7b, 0xcd, + 0xe8, 0x25, 0x03, 0x6e, 0x8b, 0x26, 0x3e, 0xe5, 0x89, 0x67, 0x07, 0xa1, 0xaf, 0xfc, 0x26, 0x3e, + 0xe5, 0x24, 0xdb, 0xc0, 0x04, 0x2d, 0x72, 0xef, 0x64, 0x4f, 0xe7, 0x2a, 0x9b, 0xc1, 0x51, 0xaf, + 0xc9, 0x6d, 0x57, 0xff, 0xec, 0x3e, 0xf7, 0x7a, 0x42, 0xea, 0x61, 0x70, 0x90, 0x40, 0x27, 0xf9, + 0x08, 0x6b, 0x75, 0x61, 0xb9, 0x23, 0xb8, 0xb3, 0x77, 0xe2, 0xd9, 0x4c, 0xe7, 0x29, 0x85, 0xec, + 0x61, 0xe8, 0x0f, 0x4d, 0x52, 0x23, 0xf5, 0x2c, 0xc3, 0x31, 0x5d, 0x81, 0x8c, 0xf2, 0xcd, 0x0c, + 0x66, 0x32, 0xca, 0xa7, 0x37, 0x20, 0xe7, 0x0e, 0x86, 0x03, 0x65, 0x2e, 0xd4, 0x48, 0x7d, 0x99, + 0x45, 0x81, 0x75, 0x0c, 0x2b, 0x63, 0x2a, 0x21, 0x47, 0xae, 0xd2, 0x5c, 0x7d, 0x2e, 0xfb, 0xc8, + 0xb5, 0xc4, 0x70, 0x4c, 0xb7, 0xa0, 0x28, 0x5c, 0x31, 0x14, 0x9e, 0x92, 0x66, 0xa6, 0xb6, 0x50, + 0x2f, 0xb5, 0x36, 0x1a, 0x89, 0xfe, 0xc6, 0x2c, 0xbe, 0x1d, 0xd5, 0xb1, 0x31, 0x40, 0x2f, 0x6c, + 0xfb, 0x23, 0x6f, 0xbc, 0x30, 0x06, 0xd6, 0x16, 0xac, 0xa5, 0x02, 0xb5, 0xee, 0x81, 0x83, 0xab, + 0x2f, 0xb2, 0xcc, 0xc0, 0x41, 0x3d, 0x82, 0x3b, 0xb8, 0x93, 0x45, 0x86, 0x63, 0xeb, 0x1d, 0xac, + 0x4e, 0xc0, 0x1f, 0x46, 0x42, 0x2a, 0x6a, 0x42, 0x01, 0x2d, 0xee, 0x26, 0xd8, 0x24, 0xa4, 0x4d, + 0xc8, 0x87, 0xe8, 0x5e, 0x2c, 0xfd, 0x66, 0x8a, 0x74, 0x3d, 0xcf, 0xe2, 0x32, 0x6b, 0x17, 0xca, + 0x53, 0xd2, 0x02, 0xdf, 0x93, 0x82, 0xb6, 0xa0, 0x10, 0xa2, 0x4c, 0x69, 0x12, 0x64, 0x31, 0x2f, + 0x32, 0x80, 0x25, 0x85, 0xd6, 0x2f, 0x02, 0xd7, 0x5e, 0x1c, 0xbc, 0x17, 0xb6, 0xd2, 0xb3, 0xcf, + 0x84, 0x94, 0xbc, 0x27, 0x2e, 0x11, 0xfa, 0x08, 0x0a, 0xb6, 0xef, 0x29, 0xe1, 0x29, 0xdc, 0x6c, + 0xa9, 0x55, 0x9b, 0xac, 0x31, 0xe1, 0xd9, 0x89, 0x4a, 0x5e, 0x73, 0x77, 0x24, 0x58, 0x02, 0xa0, + 0x4d, 0x00, 0x15, 0x0a, 0xa1, 0xa5, 0x88, 0x10, 0x9d, 0x2e, 0xb5, 0x56, 0x1b, 0xdc, 0x76, 0x1b, + 0xaf, 0xc6, 0x69, 0x36, 0x55, 0x42, 0xd7, 0x21, 0xaf, 0xa3, 0xae, 0x63, 0x66, 0x51, 0x45, 0x1c, + 0xd1, 0xaa, 0x26, 0xe2, 0xf6, 0xd1, 0xc0, 0xeb, 0x75, 0x1d, 0x33, 0x87, 0x73, 0x53, 0x19, 0xeb, + 0x47, 0x06, 0xd6, 0xd3, 0xc5, 0xd0, 0xc7, 0x00, 0xba, 0x3b, 0xfb, 0x81, 0xc3, 0x95, 0xc0, 0xcd, + 0x95, 0x5a, 0x95, 0xf9, 0x2d, 0x74, 0xc6, 0x15, 0x1d, 0x83, 0x4d, 0xd5, 0xd3, 0xa7, 0xb0, 0x7a, + 0x38, 0x72, 0xdd, 0xa9, 0x9e, 0xc6, 0x2e, 0x6c, 0xcc, 0x53, 0xec, 0xce, 0x96, 0x75, 0x0c, 0x36, + 0x8f, 0xa4, 0xcf, 0xa1, 0x3c, 0x49, 0x45, 0x2d, 0x8c, 0x4d, 0xa9, 0x5d, 0xcc, 0x16, 0xd5, 0x75, + 0x0c, 0xf6, 0x0f, 0x96, 0xb6, 0x61, 0x59, 0x84, 0xa1, 0x1f, 0x8e, 0xc9, 0xb2, 0x48, 0x76, 0x67, + 0x9e, 0xac, 0x3d, 0x5d, 0xd4, 0x31, 0xd8, 0x2c, 0x6a, 0xbb, 0x00, 0xb9, 0x8f, 0xda, 0x2a, 0xeb, + 0x33, 0x81, 0xf2, 0xbc, 0x1f, 0xfa, 0x43, 0xd1, 0x7e, 0x44, 0x27, 0x6c, 0x91, 0x45, 0x81, 0x3e, + 0x79, 0xf1, 0xd7, 0x1f, 0x9f, 0x5f, 0x13, 0xdb, 0xca, 0xf8, 0xb1, 0xee, 0xec, 0x0e, 0x4e, 0xbd, + 0x19, 0xa8, 0x7e, 0xd7, 0x61, 0x49, 0x21, 0xb5, 0x60, 0x49, 0x7a, 0x3c, 0x90, 0x7d, 0x5f, 0xbd, + 0xe4, 0xaa, 0x6f, 0x2e, 0x20, 0xe1, 0x4c, 0xce, 0xfa, 0x42, 0x60, 0x2d, 0xd5, 0xcf, 0x2b, 0xd6, + 0xf1, 0x95, 0x24, 0x07, 0x6a, 0xbe, 0x13, 0x57, 0x2c, 0xe4, 0x3e, 0x5c, 0x4f, 0x69, 0xa2, 0x16, + 0x81, 0x4d, 0x8c, 0xbf, 0xd6, 0x28, 0xb8, 0x57, 0x81, 0x62, 0x3b, 0x0c, 0x77, 0x7c, 0x47, 0x48, + 0xba, 0x02, 0xb0, 0xef, 0x89, 0x4f, 0x81, 0xb0, 0x95, 0x70, 0xca, 0x46, 0xeb, 0x3b, 0x81, 0x1c, + 0x1e, 0x0a, 0xfa, 0x04, 0x8a, 0xc9, 0xe5, 0x40, 0x6f, 0xa5, 0x5d, 0x18, 0x68, 0x78, 0xa5, 0x92, + 0x7a, 0x97, 0x44, 0xcb, 0xef, 0x42, 0x7e, 0x4f, 0x85, 0x82, 0x0f, 0xe9, 0xed, 0xb4, 0xdb, 0x20, + 0xbe, 0x55, 0x2a, 0x97, 0x4d, 0xd6, 0xc9, 0x26, 0xd9, 0xde, 0xfa, 0x79, 0x56, 0x25, 0xa7, 0x67, + 0x55, 0xf2, 0xe7, 0xac, 0x4a, 0xbe, 0x9d, 0x57, 0x8d, 0xd3, 0xf3, 0xaa, 0xf1, 0xfb, 0xbc, 0x6a, + 0xbc, 0xbd, 0xfb, 0xdf, 0xff, 0xb0, 0x83, 0x3c, 0xbe, 0x1e, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, + 0x93, 0x27, 0x56, 0x41, 0xef, 0x06, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { @@ -976,17 +1027,10 @@ func (m *ObjectSyncMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.PeerSignature) > 0 { - i -= len(m.PeerSignature) - copy(dAtA[i:], m.PeerSignature) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.PeerSignature))) - i-- - dAtA[i] = 0x32 - } - if len(m.Identity) > 0 { - i -= len(m.Identity) - copy(dAtA[i:], m.Identity) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Identity))) + if len(m.TrackingId) > 0 { + i -= len(m.TrackingId) + copy(dAtA[i:], m.TrackingId) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.TrackingId))) i-- dAtA[i] = 0x2a } @@ -1126,6 +1170,27 @@ func (m *ObjectSyncContentValue_FullSyncResponse) MarshalToSizedBuffer(dAtA []by } return len(dAtA) - i, nil } +func (m *ObjectSyncContentValue_ErrorResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ObjectSyncContentValue_ErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ErrorResponse != nil { + { + size, err := m.ErrorResponse.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} func (m *ObjectHeadUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1291,6 +1356,36 @@ func (m *ObjectFullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *ObjectErrorResponse) 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 *ObjectErrorResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ObjectErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintSpacesync(dAtA []byte, offset int, v uint64) int { offset -= sovSpacesync(v) base := offset @@ -1415,11 +1510,7 @@ func (m *ObjectSyncMessage) Size() (n int) { if l > 0 { n += 1 + l + sovSpacesync(uint64(l)) } - l = len(m.Identity) - if l > 0 { - n += 1 + l + sovSpacesync(uint64(l)) - } - l = len(m.PeerSignature) + l = len(m.TrackingId) if l > 0 { n += 1 + l + sovSpacesync(uint64(l)) } @@ -1474,6 +1565,18 @@ func (m *ObjectSyncContentValue_FullSyncResponse) Size() (n int) { } return n } +func (m *ObjectSyncContentValue_ErrorResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ErrorResponse != nil { + l = m.ErrorResponse.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} func (m *ObjectHeadUpdate) Size() (n int) { if m == nil { return 0 @@ -1555,6 +1658,19 @@ func (m *ObjectFullSyncResponse) Size() (n int) { return n } +func (m *ObjectErrorResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Error) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} + func sovSpacesync(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2286,7 +2402,7 @@ func (m *ObjectSyncMessage) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TrackingId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2314,39 +2430,7 @@ func (m *ObjectSyncMessage) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Identity = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PeerSignature", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PeerSignature = string(dAtA[iNdEx:postIndex]) + m.TrackingId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -2503,6 +2587,41 @@ func (m *ObjectSyncContentValue) Unmarshal(dAtA []byte) error { } m.Value = &ObjectSyncContentValue_FullSyncResponse{v} iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ErrorResponse", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ObjectErrorResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &ObjectSyncContentValue_ErrorResponse{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSpacesync(dAtA[iNdEx:]) @@ -2968,6 +3087,88 @@ func (m *ObjectFullSyncResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *ObjectErrorResponse) 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 ErrIntOverflowSpacesync + } + 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: ObjectErrorResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ObjectErrorResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipSpacesync(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index cbfb7424..65197270 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -8,6 +8,7 @@ import ( "github.com/libp2p/go-libp2p-core/sec" "storj.io/drpc/drpcctx" "sync" + "sync/atomic" ) var ErrEmptyPeer = errors.New("don't have such a peer") @@ -17,17 +18,15 @@ const maxSimultaneousOperationsPerStream = 10 // StreamPool can be made generic to work with different streams type StreamPool interface { + SyncClient AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) HasStream(peerId string) bool - SyncClient Close() (err error) } type SyncClient interface { - SendSync(peerId string, - message *spacesyncproto.ObjectSyncMessage, - msgCheck func(syncMessage *spacesyncproto.ObjectSyncMessage) bool) (reply *spacesyncproto.ObjectSyncMessage, err error) + SendSync(peerId string, message *spacesyncproto.ObjectSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error) SendAsync(peerId string, message *spacesyncproto.ObjectSyncMessage) (err error) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) } @@ -35,8 +34,7 @@ type SyncClient interface { type MessageHandler func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) type responseWaiter struct { - ch chan *spacesyncproto.ObjectSyncMessage - msgCheck func(message *spacesyncproto.ObjectSyncMessage) bool + ch chan *spacesyncproto.ObjectSyncMessage } type streamPool struct { @@ -46,6 +44,7 @@ type streamPool struct { wg *sync.WaitGroup waiters map[string]responseWaiter waitersMx sync.Mutex + counter uint64 } func newStreamPool(messageHandler MessageHandler) StreamPool { @@ -63,36 +62,23 @@ func (s *streamPool) HasStream(peerId string) (res bool) { func (s *streamPool) SendSync( peerId string, - message *spacesyncproto.ObjectSyncMessage, - msgCheck func(syncMessage *spacesyncproto.ObjectSyncMessage) bool) (reply *spacesyncproto.ObjectSyncMessage, err error) { + msg *spacesyncproto.ObjectSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error) { + newCounter := atomic.AddUint64(&s.counter, 1) + msg.TrackingId = genStreamPoolKey(peerId, msg.TreeId, newCounter) - sendAndWait := func(waiter responseWaiter) (err error) { - err = s.SendAsync(peerId, message) - if err != nil { - return - } - - reply = <-waiter.ch - return - } - - key := fmt.Sprintf("%s.%s", peerId, message.TreeId) s.waitersMx.Lock() - waiter, exists := s.waiters[key] - if exists { - s.waitersMx.Unlock() + waiter := responseWaiter{ + ch: make(chan *spacesyncproto.ObjectSyncMessage), + } + s.waiters[msg.TrackingId] = waiter + s.waitersMx.Unlock() - err = sendAndWait(waiter) + err = s.SendAsync(peerId, msg) + if err != nil { return } - waiter = responseWaiter{ - ch: make(chan *spacesyncproto.ObjectSyncMessage), - msgCheck: msgCheck, - } - s.waiters[key] = waiter - s.waitersMx.Unlock() - err = sendAndWait(waiter) + reply = <-waiter.ch return } @@ -189,17 +175,21 @@ func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStre } process := func(msg *spacesyncproto.ObjectSyncMessage) { - key := fmt.Sprintf("%s.%s", peerId, msg.TreeId) - s.waitersMx.Lock() - waiter, exists := s.waiters[key] + if msg.TrackingId == "" { + s.messageHandler(stream.Context(), peerId, msg) + return + } - if !exists || !waiter.msgCheck(msg) { + s.waitersMx.Lock() + waiter, exists := s.waiters[msg.TrackingId] + + if !exists { s.waitersMx.Unlock() s.messageHandler(stream.Context(), peerId, msg) return } - delete(s.waiters, key) + delete(s.waiters, msg.TrackingId) s.waitersMx.Unlock() waiter.ch <- msg } @@ -216,10 +206,8 @@ Loop: break Loop } go func() { - defer func() { - limiter <- struct{}{} - }() process(msg) + limiter <- struct{}{} }() } return s.removePeer(peerId) @@ -244,3 +232,7 @@ func GetPeerIdFromStreamContext(ctx context.Context) (string, error) { return conn.RemotePeer().String(), nil } + +func genStreamPoolKey(peerId, treeId string, counter uint64) string { + return fmt.Sprintf("%s.%s.%d", peerId, treeId, counter) +} diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index 9627f7a0..12798bc3 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -25,15 +25,15 @@ func newSyncHandler(treeCache cache.TreeCache, syncClient SyncClient) *syncHandl } } -func (s *syncHandler) HandleMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) error { - msg := message.GetContent() +func (s *syncHandler) HandleMessage(ctx context.Context, senderId string, msg *spacesyncproto.ObjectSyncMessage) error { + content := msg.GetContent() switch { - case msg.GetFullSyncRequest() != nil: - return s.HandleFullSyncRequest(ctx, senderId, msg.GetFullSyncRequest(), message.GetTreeHeader(), message.GetTreeId()) - case msg.GetFullSyncResponse() != nil: - return s.HandleFullSyncResponse(ctx, senderId, msg.GetFullSyncResponse(), message.GetTreeHeader(), message.GetTreeId()) - case msg.GetHeadUpdate() != nil: - return s.HandleHeadUpdate(ctx, senderId, msg.GetHeadUpdate(), message.GetTreeHeader(), message.GetTreeId()) + case content.GetFullSyncRequest() != nil: + return s.HandleFullSyncRequest(ctx, senderId, content.GetFullSyncRequest(), msg) + case content.GetFullSyncResponse() != nil: + return s.HandleFullSyncResponse(ctx, senderId, content.GetFullSyncResponse(), msg) + case content.GetHeadUpdate() != nil: + return s.HandleHeadUpdate(ctx, senderId, content.GetHeadUpdate(), msg) } return nil } @@ -42,15 +42,13 @@ func (s *syncHandler) HandleHeadUpdate( ctx context.Context, senderId string, update *spacesyncproto.ObjectHeadUpdate, - header *aclpb.TreeHeader, - treeId string) (err error) { + msg *spacesyncproto.ObjectSyncMessage) (err error) { var ( fullRequest *spacesyncproto.ObjectFullSyncRequest result tree.AddResult ) - - res, err := s.treeCache.GetTree(ctx, treeId) + res, err := s.treeCache.GetTree(ctx, msg.TreeId) if err != nil { return } @@ -81,7 +79,8 @@ func (s *syncHandler) HandleHeadUpdate( }() if fullRequest != nil { - return s.syncClient.SendAsync(senderId, spacesyncproto.WrapFullRequest(fullRequest, header, treeId)) + return s.syncClient.SendAsync(senderId, + spacesyncproto.WrapFullRequest(fullRequest, msg.TreeHeader, msg.TreeId, msg.TrackingId)) } return } @@ -90,12 +89,18 @@ func (s *syncHandler) HandleFullSyncRequest( ctx context.Context, senderId string, request *spacesyncproto.ObjectFullSyncRequest, - header *aclpb.TreeHeader, - treeId string) (err error) { + msg *spacesyncproto.ObjectSyncMessage) (err error) { + var ( + fullResponse *spacesyncproto.ObjectFullSyncResponse + header = msg.TreeHeader + ) + defer func() { + if err != nil { + s.syncClient.SendAsync(senderId, spacesyncproto.WrapError(err, header, msg.TreeId, msg.TrackingId)) + } + }() - var fullResponse *spacesyncproto.ObjectFullSyncResponse - - res, err := s.treeCache.GetTree(ctx, treeId) + res, err := s.treeCache.GetTree(ctx, msg.TreeId) if err != nil { return } @@ -106,29 +111,32 @@ func (s *syncHandler) HandleFullSyncRequest( defer res.Release() defer objTree.Unlock() + if header == nil { + header = objTree.Header() + } + _, err = objTree.AddRawChanges(ctx, request.Changes...) if err != nil { return err } - fullResponse, err = s.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Heads, objTree) + fullResponse, err = s.prepareFullSyncResponse(request.SnapshotPath, request.Heads, objTree) return err }() if err != nil { return } - return s.syncClient.SendAsync(senderId, spacesyncproto.WrapFullResponse(fullResponse, header, treeId)) + return s.syncClient.SendAsync(senderId, + spacesyncproto.WrapFullResponse(fullResponse, header, msg.TreeId, msg.TrackingId)) } func (s *syncHandler) HandleFullSyncResponse( ctx context.Context, senderId string, response *spacesyncproto.ObjectFullSyncResponse, - header *aclpb.TreeHeader, - treeId string) (err error) { - - res, err := s.treeCache.GetTree(ctx, treeId) + msg *spacesyncproto.ObjectSyncMessage) (err error) { + res, err := s.treeCache.GetTree(ctx, msg.TreeId) if err != nil { return } @@ -173,7 +181,6 @@ func (s *syncHandler) prepareFullSyncRequest( } func (s *syncHandler) prepareFullSyncResponse( - treeId string, theirPath, theirHeads []string, t tree.ObjectTree) (*spacesyncproto.ObjectFullSyncResponse, error) { diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 2c155fea..736d40b7 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -12,39 +12,77 @@ import ( type SyncService interface { NotifyHeadUpdate(ctx context.Context, treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) StreamPool() StreamPool + + Init() Close() (err error) } +type HeadNotifiable interface { + UpdateHeads(id string, heads []string) +} + const respPeersStreamCheckInterval = time.Second * 10 type syncService struct { + spaceId string + syncHandler SyncHandler streamPool StreamPool + headNotifiable HeadNotifiable configuration nodeconf.Configuration - spaceId string + streamLoopCtx context.Context stopStreamLoop context.CancelFunc + streamLoopDone chan struct{} } -func (s *syncService) Run() { +func NewSyncService(spaceId string, headNotifiable HeadNotifiable, cache cache.TreeCache, configuration nodeconf.Configuration) SyncService { + var syncHandler SyncHandler + streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { + return syncHandler.HandleMessage(ctx, senderId, message) + }) + syncHandler = newSyncHandler(cache, streamPool) + return newSyncService(spaceId, headNotifiable, syncHandler, streamPool, configuration) +} + +func newSyncService( + spaceId string, + headNotifiable HeadNotifiable, + syncHandler SyncHandler, + streamPool StreamPool, + configuration nodeconf.Configuration) *syncService { + return &syncService{ + syncHandler: syncHandler, + streamPool: streamPool, + headNotifiable: headNotifiable, + configuration: configuration, + spaceId: spaceId, + streamLoopDone: make(chan struct{}), + } +} + +func (s *syncService) Init() { s.streamLoopCtx, s.stopStreamLoop = context.WithCancel(context.Background()) - s.streamCheckLoop(s.streamLoopCtx) + go s.responsibleStreamCheckLoop(s.streamLoopCtx) } func (s *syncService) Close() (err error) { s.stopStreamLoop() + <-s.streamLoopDone return s.streamPool.Close() } func (s *syncService) NotifyHeadUpdate(ctx context.Context, treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) { - return s.streamPool.BroadcastAsync(spacesyncproto.WrapHeadUpdate(update, header, treeId)) + s.headNotifiable.UpdateHeads(treeId, update.Heads) + return s.streamPool.BroadcastAsync(spacesyncproto.WrapHeadUpdate(update, header, treeId, "")) } -func (s *syncService) streamCheckLoop(ctx context.Context) { - for { +func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { + defer close(s.streamLoopDone) + checkResponsiblePeers := func() { respPeers, err := s.configuration.ResponsiblePeers(ctx, s.spaceId) if err != nil { - continue + return } for _, peer := range respPeers { if s.streamPool.HasStream(peer.Id()) { @@ -58,11 +96,17 @@ func (s *syncService) streamCheckLoop(ctx context.Context) { s.streamPool.AddAndReadStreamAsync(stream) } + } + + checkResponsiblePeers() + ticker := time.NewTicker(respPeersStreamCheckInterval) + defer ticker.Stop() + for { select { - case <-time.After(respPeersStreamCheckInterval): - break - case <-ctx.Done(): + case <-s.streamLoopCtx.Done(): return + case <-ticker.C: + checkResponsiblePeers() } } } @@ -70,25 +114,3 @@ func (s *syncService) streamCheckLoop(ctx context.Context) { func (s *syncService) StreamPool() StreamPool { return s.streamPool } - -func NewSyncService(spaceId string, cache cache.TreeCache, configuration nodeconf.Configuration) SyncService { - var syncHandler SyncHandler - streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { - return syncHandler.HandleMessage(ctx, senderId, message) - }) - syncHandler = newSyncHandler(cache, streamPool) - return newSyncService(spaceId, syncHandler, streamPool, configuration) -} - -func newSyncService( - spaceId string, - syncHandler SyncHandler, - streamPool StreamPool, - configuration nodeconf.Configuration) *syncService { - return &syncService{ - syncHandler: syncHandler, - streamPool: streamPool, - configuration: configuration, - spaceId: spaceId, - } -} From 04184b158240aa57d9f9352cdf9ef7a93a7dc36b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 17 Sep 2022 21:39:17 +0200 Subject: [PATCH 079/219] Remove responsibility of objecttree to notify and move to synctree --- common/commonspace/cache/treecache.go | 2 - common/commonspace/space.go | 12 +- common/commonspace/syncservice/streampool.go | 1 + common/commonspace/synctree/synctree.go | 52 +++- pkg/acl/tree/objecttree.go | 30 +- pkg/acl/tree/objecttreefactory.go | 8 +- service/sync/message/service.go | 128 -------- service/sync/requesthandler/requesthandler.go | 291 ------------------ 8 files changed, 53 insertions(+), 471 deletions(-) delete mode 100644 service/sync/message/service.go delete mode 100644 service/sync/requesthandler/requesthandler.go diff --git a/common/commonspace/cache/treecache.go b/common/commonspace/cache/treecache.go index 9d688f50..6703d004 100644 --- a/common/commonspace/cache/treecache.go +++ b/common/commonspace/cache/treecache.go @@ -3,7 +3,6 @@ package cache import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" ) @@ -21,5 +20,4 @@ type TreeResult struct { type TreeCache interface { app.ComponentRunnable GetTree(ctx context.Context, id string) (TreeResult, error) - AddTree(ctx context.Context, payload storage.TreeStorageCreatePayload) error } diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 91657bb7..1d6e981f 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -22,8 +22,8 @@ type Space interface { SyncService() syncservice.SyncService DiffService() diffservice.DiffService - CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) - BuildTree(ctx context.Context, id string, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) + CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) + BuildTree(ctx context.Context, id string, listener synctree.UpdateListener) (tree.ObjectTree, error) Close() error } @@ -65,11 +65,11 @@ func (s *space) DiffService() diffservice.DiffService { return s.diffService } -func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener tree.ObjectTreeUpdateListener) (tree.ObjectTree, error) { - return synctree.CreateSyncTree(payload, s.syncService, listener, nil, s.storage.CreateTreeStorage) +func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) { + return synctree.CreateSyncTree(ctx, payload, s.syncService, listener, nil, s.storage.CreateTreeStorage) } -func (s *space) BuildTree(ctx context.Context, id string, listener tree.ObjectTreeUpdateListener) (t tree.ObjectTree, err error) { +func (s *space) BuildTree(ctx context.Context, id string, listener synctree.UpdateListener) (t tree.ObjectTree, err error) { getTreeRemote := func() (*spacesyncproto.ObjectSyncMessage, error) { // TODO: add empty context handling (when this is not happening due to head update) peerId, err := syncservice.GetPeerIdFromStreamContext(ctx) @@ -115,7 +115,7 @@ func (s *space) BuildTree(ctx context.Context, id string, listener tree.ObjectTr return } } - return synctree.BuildSyncTree(s.syncService, store.(treestorage.TreeStorage), listener, s.aclList) + return synctree.BuildSyncTree(ctx, s.syncService, store.(treestorage.TreeStorage), listener, s.aclList) } func (s *space) getObjectIds() []string { diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 65197270..0e2626e9 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -120,6 +120,7 @@ Loop: delete(s.peerStreams, id) continue Loop default: + break } streams = append(streams, stream) } diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index d9dcb4e4..e45c3ffa 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -10,24 +10,35 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" ) +type UpdateListener interface { + Update(tree tree.ObjectTree) + Rebuild(tree tree.ObjectTree) +} + type SyncTree struct { tree.ObjectTree syncService syncservice.SyncService + listener UpdateListener } func CreateSyncTree( + ctx context.Context, payload tree.ObjectTreeCreatePayload, syncService syncservice.SyncService, - listener tree.ObjectTreeUpdateListener, + listener UpdateListener, aclList list.ACLList, createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { - t, err = tree.CreateObjectTree(payload, listener, aclList, createStorage) + t, err = tree.CreateObjectTree(payload, aclList, createStorage) if err != nil { return } + t = &SyncTree{ + ObjectTree: t, + syncService: syncService, + listener: listener, + } - // TODO: use context where it is needed - err = syncService.NotifyHeadUpdate(context.Background(), t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{ + err = syncService.NotifyHeadUpdate(ctx, t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{ Heads: t.Heads(), SnapshotPath: t.SnapshotPath(), }) @@ -35,25 +46,31 @@ func CreateSyncTree( } func BuildSyncTree( + ctx context.Context, syncService syncservice.SyncService, treeStorage storage.TreeStorage, - listener tree.ObjectTreeUpdateListener, + listener UpdateListener, aclList list.ACLList) (t tree.ObjectTree, err error) { - return buildSyncTree(syncService, treeStorage, listener, aclList) + return buildSyncTree(ctx, syncService, treeStorage, listener, aclList) } func buildSyncTree( + ctx context.Context, syncService syncservice.SyncService, treeStorage storage.TreeStorage, - listener tree.ObjectTreeUpdateListener, + listener UpdateListener, aclList list.ACLList) (t tree.ObjectTree, err error) { - t, err = tree.BuildObjectTree(treeStorage, listener, aclList) + t, err = tree.BuildObjectTree(treeStorage, aclList) if err != nil { return } + t = &SyncTree{ + ObjectTree: t, + syncService: syncService, + listener: listener, + } - // TODO: use context where it is needed - err = syncService.NotifyHeadUpdate(context.Background(), t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{ + err = syncService.NotifyHeadUpdate(ctx, t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{ Heads: t.Heads(), SnapshotPath: t.SnapshotPath(), }) @@ -75,9 +92,18 @@ func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeCo func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*aclpb.RawTreeChangeWithId) (res tree.AddResult, err error) { res, err = s.AddRawChanges(ctx, changes...) - if err != nil || res.Mode == tree.Nothing { + if err != nil { return } + switch res.Mode { + case tree.Nothing: + return + case tree.Append: + s.listener.Update(s) + case tree.Rebuild: + s.listener.Rebuild(s) + } + err = s.syncService.NotifyHeadUpdate(ctx, s.ID(), s.Header(), &spacesyncproto.ObjectHeadUpdate{ Heads: res.Heads, Changes: res.Added, @@ -85,3 +111,7 @@ func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*aclpb.RawTreeC }) return } + +func (s *SyncTree) Tree() tree.ObjectTree { + return s +} diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 186db5af..c2b3e0b9 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -11,11 +11,6 @@ import ( "sync" ) -type ObjectTreeUpdateListener interface { - Update(tree ObjectTree) - Rebuild(tree ObjectTree) -} - type RWLocker interface { sync.Locker RLock() @@ -71,7 +66,6 @@ type objectTree struct { rawChangeLoader *rawChangeLoader treeBuilder *treeBuilder aclList list.ACLList - updateListener ObjectTreeUpdateListener id string header *aclpb.TreeHeader @@ -94,7 +88,6 @@ type objectTreeDeps struct { changeBuilder ChangeBuilder treeBuilder *treeBuilder treeStorage storage.TreeStorage - updateListener ObjectTreeUpdateListener validator ObjectTreeValidator rawChangeLoader *rawChangeLoader aclList list.ACLList @@ -102,7 +95,6 @@ type objectTreeDeps struct { func defaultObjectTreeDeps( treeStorage storage.TreeStorage, - listener ObjectTreeUpdateListener, aclList list.ACLList) objectTreeDeps { keychain := common.NewKeychain() @@ -112,7 +104,6 @@ func defaultObjectTreeDeps( changeBuilder: changeBuilder, treeBuilder: treeBuilder, treeStorage: treeStorage, - updateListener: listener, validator: newTreeValidator(), rawChangeLoader: newRawChangeLoader(treeStorage, changeBuilder), aclList: aclList, @@ -211,8 +202,7 @@ func (ot *objectTree) prepareBuilderContent(content SignableChangeContent) (cnt } func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawTreeChangeWithId) (addResult AddResult, err error) { - var mode Mode - mode, addResult, err = ot.addRawChanges(ctx, rawChanges...) + addResult, err = ot.addRawChanges(ctx, rawChanges...) if err != nil { return } @@ -230,26 +220,10 @@ func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra // setting heads err = ot.treeStorage.SetHeads(ot.tree.Heads()) - if err != nil { - return - } - - if ot.updateListener == nil { - return - } - - switch mode { - case Append: - ot.updateListener.Update(ot) - case Rebuild: - ot.updateListener.Rebuild(ot) - default: - break - } return } -func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.RawTreeChangeWithId) (mode Mode, addResult AddResult, err error) { +func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.RawTreeChangeWithId) (addResult AddResult, err error) { // resetting buffers ot.tmpChangesBuf = ot.tmpChangesBuf[:0] ot.notSeenIdxBuf = ot.notSeenIdxBuf[:0] diff --git a/pkg/acl/tree/objecttreefactory.go b/pkg/acl/tree/objecttreefactory.go index a62c8add..44dc1fb5 100644 --- a/pkg/acl/tree/objecttreefactory.go +++ b/pkg/acl/tree/objecttreefactory.go @@ -19,19 +19,18 @@ type ObjectTreeCreatePayload struct { TreeType aclpb.TreeHeaderType } -func BuildObjectTree(treeStorage storage.TreeStorage, listener ObjectTreeUpdateListener, aclList list.ACLList) (ObjectTree, error) { - deps := defaultObjectTreeDeps(treeStorage, listener, aclList) +func BuildObjectTree(treeStorage storage.TreeStorage, aclList list.ACLList) (ObjectTree, error) { + deps := defaultObjectTreeDeps(treeStorage, aclList) return buildObjectTree(deps) } func CreateObjectTree( payload ObjectTreeCreatePayload, - listener ObjectTreeUpdateListener, aclList list.ACLList, createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { aclList.RLock() var ( - deps = defaultObjectTreeDeps(nil, listener, aclList) + deps = defaultObjectTreeDeps(nil, aclList) state = aclList.ACLState() aclId = aclList.ID() aclHeadId = aclList.Head().Id @@ -91,7 +90,6 @@ func CreateObjectTree( func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { objTree := &objectTree{ treeStorage: deps.treeStorage, - updateListener: deps.updateListener, treeBuilder: deps.treeBuilder, validator: deps.validator, aclList: deps.aclList, diff --git a/service/sync/message/service.go b/service/sync/message/service.go deleted file mode 100644 index 6abf9b82..00000000 --- a/service/sync/message/service.go +++ /dev/null @@ -1,128 +0,0 @@ -package message - -import "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - -//import ( -// "context" -// "fmt" -// "github.com/anytypeio/go-anytype-infrastructure-experiments/app" -// "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" -// pool2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" -// "github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool" -// "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" -// "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler" -// "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" -// "github.com/gogo/protobuf/proto" -// "sync" -// "time" -//) - -var log = logger.NewNamed("messageservice") - -const CName = "MessageService" - -// -//type service struct { -// nodes []*node.Node -// requestHandler requesthandler.RequestHandler -// pool pool2.Pool -// sync.RWMutex -//} -// -//func New() app.Component { -// return &service{} -//} -// -//type Service interface { -// SendMessageAsync(peerId string, msg *syncproto.Sync) error -// SendToSpaceAsync(spaceId string, msg *syncproto.Sync) error -//} -// -//func (s *service) Init(a *app.App) (err error) { -// s.requestHandler = a.MustComponent(requesthandler.CName).(requesthandler.RequestHandler) -// s.nodes = a.MustComponent(node.CName).(node.Service).Nodes() -// s.pool = a.MustComponent(pool2.CName).(pool2.Pool) -// s.pool.AddHandler(syncproto.MessageType_MessageTypeSync, s.HandleMessage) -// return nil -//} -// -//func (s *service) Name() (name string) { -// return CName -//} -// -//func (s *service) Run(ctx context.Context) (err error) { -// return nil -//} -// -//func (s *service) Close(ctx context.Context) (err error) { -// return nil -//} -// -//func (s *service) HandleMessage(ctx context.Context, msg *pool.Message) (err error) { -// defer func() { -// if err != nil { -// msg.AckError(syncproto.System_Error_UNKNOWN, err.Error()) -// } else { -// msg.Ack() -// } -// }() -// -// syncMsg := &syncproto.Sync{} -// err = proto.Unmarshal(msg.Data, syncMsg) -// if err != nil { -// return -// } -// -// timeoutCtx, cancel := context.WithTimeout(ctx, time.Second*30) -// defer cancel() -// err = s.requestHandler.HandleSyncMessage(timeoutCtx, msg.Peer().Id(), syncMsg) -// return -//} -// -//func (s *service) SendMessageAsync(peerId string, msg *syncproto.Sync) (err error) { -// _, err = s.pool.DialAndAddPeer(context.Background(), peerId) -// if err != nil { -// return -// } -// -// marshalled, err := proto.Marshal(msg) -// if err != nil { -// return -// } -// -// go s.sendAsync(peerId, msgInfo(msg), marshalled) -// return -//} -// -//func (s *service) SendToSpaceAsync(spaceId string, msg *syncproto.Sync) error { -// for _, rp := range s.nodes { -// s.SendMessageAsync(rp.PeerId, msg) -// } -// return nil -//} -// -//func (s *service) sendAsync(peerId string, msgTypeStr string, marshalled []byte) error { -// ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) -// defer cancel() -// return s.pool.SendAndWait(ctx, peerId, &syncproto.Message{ -// Header: &syncproto.Header{ -// Type: syncproto.MessageType_MessageTypeSync, -// DebugInfo: msgTypeStr, -// }, -// Data: marshalled, -// }) -//} -// -//func msgInfo(content *syncproto.Sync) (syncMethod string) { -// msg := content.GetMessage() -// switch { -// case msg.GetFullSyncRequest() != nil: -// syncMethod = "FullSyncRequest" -// case msg.GetFullSyncResponse() != nil: -// syncMethod = "FullSyncResponse" -// case msg.GetHeadUpdate() != nil: -// syncMethod = "HeadUpdate" -// } -// syncMethod = fmt.Sprintf("method: %s, treeType: %s", syncMethod, content.TreeHeader.DocType.String()) -// return -//} diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go deleted file mode 100644 index 9c17171f..00000000 --- a/service/sync/requesthandler/requesthandler.go +++ /dev/null @@ -1,291 +0,0 @@ -package requesthandler - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" - "go.uber.org/zap" -) - -type requestHandler struct { - treeCache treecache.Service - account account.Service - messageService MessageSender -} - -var log = logger.NewNamed("requesthandler") - -func New() app.Component { - return &requestHandler{} -} - -type RequestHandler interface { - HandleSyncMessage(ctx context.Context, senderId string, request *syncproto.Sync) (err error) -} - -type MessageSender interface { - SendMessageAsync(peerId string, msg *syncproto.Sync) error - SendToSpaceAsync(spaceId string, msg *syncproto.Sync) error -} - -const CName = "SyncRequestHandler" - -func (r *requestHandler) Init(a *app.App) (err error) { - r.treeCache = a.MustComponent(treecache.CName).(treecache.Service) - r.account = a.MustComponent(account.CName).(account.Service) - r.messageService = a.MustComponent("MessageService").(MessageSender) - return nil -} - -func (r *requestHandler) Name() (name string) { - return CName -} - -func (r *requestHandler) Run(ctx context.Context) (err error) { - return nil -} - -func (r *requestHandler) Close(ctx context.Context) (err error) { - return nil -} - -func (r *requestHandler) HandleSyncMessage(ctx context.Context, senderId string, content *syncproto.Sync) error { - msg := content.GetMessage() - switch { - case msg.GetFullSyncRequest() != nil: - return r.HandleFullSyncRequest(ctx, senderId, msg.GetFullSyncRequest(), content.GetTreeHeader(), content.GetTreeId()) - case msg.GetFullSyncResponse() != nil: - return r.HandleFullSyncResponse(ctx, senderId, msg.GetFullSyncResponse(), content.GetTreeHeader(), content.GetTreeId()) - case msg.GetHeadUpdate() != nil: - return r.HandleHeadUpdate(ctx, senderId, msg.GetHeadUpdate(), content.GetTreeHeader(), content.GetTreeId()) - } - return nil -} - -func (r *requestHandler) HandleHeadUpdate( - ctx context.Context, - senderId string, - update *syncproto.SyncHeadUpdate, - header *aclpb.Header, - treeId string) (err error) { - - var ( - fullRequest *syncproto.SyncFullRequest - snapshotPath []string - result tree.AddResult - ) - log.With(zap.String("peerId", senderId), zap.String("treeId", treeId)). - Debug("processing head update") - - err = r.treeCache.Do(ctx, treeId, func(obj any) error { - objTree := obj.(tree.ObjectTree) - objTree.Lock() - defer objTree.Unlock() - - if slice.UnsortedEquals(update.Heads, objTree.Heads()) { - return nil - } - - result, err = objTree.AddRawChanges(ctx, update.Changes...) - if err != nil { - return err - } - - // if we couldn't add all the changes - shouldFullSync := len(update.Changes) != len(result.Added) - snapshotPath = objTree.SnapshotPath() - if shouldFullSync { - fullRequest, err = r.prepareFullSyncRequest(objTree) - if err != nil { - return err - } - } - return nil - }) - - // if there are no such tree - if err == storage.ErrUnknownTreeId { - fullRequest = &syncproto.SyncFullRequest{} - } - // if we have incompatible heads, or we haven't seen the tree at all - if fullRequest != nil { - return r.messageService.SendMessageAsync(senderId, syncproto.WrapFullRequest(fullRequest, header, treeId)) - } - // if error or nothing has changed - if err != nil || len(result.Added) == 0 { - return err - } - - // otherwise sending heads update message - newUpdate := &syncproto.SyncHeadUpdate{ - Heads: result.Heads, - Changes: result.Added, - SnapshotPath: snapshotPath, - } - return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) -} - -func (r *requestHandler) HandleFullSyncRequest( - ctx context.Context, - senderId string, - request *syncproto.SyncFullRequest, - header *aclpb.Header, - treeId string) (err error) { - - var fullResponse *syncproto.SyncFullResponse - err = r.treeCache.Do(ctx, treeId, func(obj any) error { - objTree := obj.(tree.ObjectTree) - objTree.Lock() - defer objTree.Unlock() - - fullResponse, err = r.prepareFullSyncResponse(treeId, request.SnapshotPath, request.Heads, objTree) - if err != nil { - return err - } - return nil - }) - - if err != nil { - return err - } - return r.messageService.SendMessageAsync(senderId, syncproto.WrapFullResponse(fullResponse, header, treeId)) -} - -func (r *requestHandler) HandleFullSyncResponse( - ctx context.Context, - senderId string, - response *syncproto.SyncFullResponse, - header *aclpb.Header, - treeId string) (err error) { - - var ( - snapshotPath []string - result tree.AddResult - ) - - err = r.treeCache.Do(ctx, treeId, func(obj interface{}) error { - objTree := obj.(tree.ObjectTree) - objTree.Lock() - defer objTree.Unlock() - - // if we already have the heads for whatever reason - if slice.UnsortedEquals(response.Heads, objTree.Heads()) { - return nil - } - - result, err = objTree.AddRawChanges(ctx, response.Changes...) - if err != nil { - return err - } - snapshotPath = objTree.SnapshotPath() - return nil - }) - - // if error or nothing has changed - if (err != nil || len(result.Added) == 0) && err != storage.ErrUnknownTreeId { - return err - } - // if we have a new tree - if err == storage.ErrUnknownTreeId { - err = r.createTree(ctx, response, header, treeId) - if err != nil { - return err - } - result = tree.AddResult{ - OldHeads: []string{}, - Heads: response.Heads, - Added: response.Changes, - } - } - // sending heads update message - newUpdate := &syncproto.SyncHeadUpdate{ - Heads: result.Heads, - Changes: result.Added, - SnapshotPath: snapshotPath, - } - return r.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(newUpdate, header, treeId)) -} - -func (r *requestHandler) HandleACLList( - ctx context.Context, - senderId string, - req *syncproto.SyncACLList, - header *aclpb.Header, - id string) (err error) { - - err = r.treeCache.Do(ctx, id, func(obj interface{}) error { - return nil - }) - // do nothing if already added - if err == nil { - return nil - } - // if not found then add to storage - if err == storage.ErrUnknownTreeId { - return r.createACLList(ctx, req, header, id) - } - return err -} - -func (r *requestHandler) prepareFullSyncRequest(t tree.ObjectTree) (*syncproto.SyncFullRequest, error) { - return &syncproto.SyncFullRequest{ - Heads: t.Heads(), - SnapshotPath: t.SnapshotPath(), - }, nil -} - -func (r *requestHandler) prepareFullSyncResponse( - treeId string, - theirPath, theirHeads []string, - t tree.ObjectTree) (*syncproto.SyncFullResponse, error) { - ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath, theirHeads) - if err != nil { - return nil, err - } - - return &syncproto.SyncFullResponse{ - Heads: t.Heads(), - Changes: ourChanges, - SnapshotPath: t.SnapshotPath(), - }, nil -} - -func (r *requestHandler) createTree( - ctx context.Context, - response *syncproto.SyncFullResponse, - header *aclpb.Header, - treeId string) error { - - return r.treeCache.Add( - ctx, - treeId, - storage.TreeStorageCreatePayload{ - TreeId: treeId, - Header: header, - Changes: response.Changes, - Heads: response.Heads, - }) -} - -func (r *requestHandler) createACLList( - ctx context.Context, - req *syncproto.SyncACLList, - header *aclpb.Header, - treeId string) error { - - return r.treeCache.Add( - ctx, - treeId, - storage.ACLListStorageCreatePayload{ - ListId: treeId, - Header: header, - Records: req.Records, - }) -} From 832d0d5bfa1ecd3f01b9d84d7c06283c82127421 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 17 Sep 2022 22:18:11 +0200 Subject: [PATCH 080/219] Add treecache to node --- common/commonspace/cache/treecache.go | 8 +++- common/commonspace/service.go | 21 ++++++----- common/commonspace/space.go | 2 + common/commonspace/storage/storage.go | 2 - node/nodespace/nodecache/treecache.go | 54 +++++++++++++++++++++++++++ node/nodespace/service.go | 16 +++++--- 6 files changed, 84 insertions(+), 19 deletions(-) create mode 100644 node/nodespace/nodecache/treecache.go diff --git a/common/commonspace/cache/treecache.go b/common/commonspace/cache/treecache.go index 6703d004..1a6305b7 100644 --- a/common/commonspace/cache/treecache.go +++ b/common/commonspace/cache/treecache.go @@ -2,7 +2,7 @@ package cache import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" ) @@ -17,7 +17,11 @@ type TreeResult struct { TreeContainer TreeContainer } +type BuildFunc = func(ctx context.Context, id string, listener synctree.UpdateListener) (tree.ObjectTree, error) + type TreeCache interface { - app.ComponentRunnable GetTree(ctx context.Context, id string) (TreeResult, error) + SetBuildFunc(f BuildFunc) + + Close() error } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 9598d53a..1ddf8dd0 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -21,22 +21,23 @@ func New() Service { } type Service interface { - CreateSpace(ctx context.Context, id string) (sp Space, err error) + CreateSpace(ctx context.Context, id string, deps SpaceDeps) (sp Space, err error) app.Component } type service struct { config config.Space configurationService nodeconf.Service - storage storage.Storage - cache cache.TreeCache +} + +type SpaceDeps struct { + Cache cache.TreeCache + Storage storage.Storage } func (s *service) Init(a *app.App) (err error) { s.config = a.MustComponent(config.CName).(*config.Config).Space s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) - s.storage = a.MustComponent(storage.CName).(storage.Storage) - s.cache = a.MustComponent(cache.CName).(cache.TreeCache) return nil } @@ -44,17 +45,17 @@ func (s *service) Name() (name string) { return CName } -func (s *service) CreateSpace(ctx context.Context, id string) (Space, error) { +func (s *service) CreateSpace(ctx context.Context, id string, deps SpaceDeps) (Space, error) { lastConfiguration := s.configurationService.GetLast() - diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, s.storage, lastConfiguration, s.cache, log) - syncService := syncservice.NewSyncService(id, diffService, s.cache, lastConfiguration) + diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, deps.Storage, lastConfiguration, deps.Cache, log) + syncService := syncservice.NewSyncService(id, diffService, deps.Cache, lastConfiguration) sp := &space{ id: id, conf: s.config, syncService: syncService, diffService: diffService, - cache: s.cache, - storage: s.storage, + cache: deps.Cache, + storage: deps.Storage, } if err := sp.Init(ctx); err != nil { return nil, err diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 1d6e981f..3d181f52 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -50,6 +50,7 @@ func (s *space) Init(ctx context.Context) error { s.rpc = &rpcHandler{s: s} s.diffService.Init(s.getObjectIds()) s.syncService.Init() + s.cache.SetBuildFunc(s.BuildTree) return nil } @@ -125,5 +126,6 @@ func (s *space) getObjectIds() []string { func (s *space) Close() error { s.diffService.Close() + s.cache.Close() return s.syncService.Close() } diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index a9694988..b58d06d1 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -1,13 +1,11 @@ package storage import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" ) type Storage interface { storage.Provider - app.ComponentRunnable } const CName = "commonspace.storage" diff --git a/node/nodespace/nodecache/treecache.go b/node/nodespace/nodecache/treecache.go new file mode 100644 index 00000000..af195df9 --- /dev/null +++ b/node/nodespace/nodecache/treecache.go @@ -0,0 +1,54 @@ +package nodecache + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "time" +) + +var log = logger.NewNamed("treecache") + +type treeCache struct { + gcttl int + cache ocache.OCache +} + +func NewNodeCache(ttl int) cache.TreeCache { + return &treeCache{ + gcttl: ttl, + } +} + +func (c *treeCache) SetBuildFunc(buildFunc cache.BuildFunc) { + c.cache = ocache.New( + func(ctx context.Context, id string) (value ocache.Object, err error) { + return buildFunc(ctx, id, nil) + }, + ocache.WithLogger(log.Sugar()), + ocache.WithGCPeriod(time.Minute), + ocache.WithTTL(time.Duration(c.gcttl)*time.Second), + ocache.WithRefCounter(false), + ) +} + +func (c *treeCache) Close() (err error) { + return c.cache.Close() +} + +func (c *treeCache) GetTree(ctx context.Context, id string) (res cache.TreeResult, err error) { + var cacheRes ocache.Object + cacheRes, err = c.cache.Get(ctx, id) + if err != nil { + return cache.TreeResult{}, err + } + + res = cache.TreeResult{ + Release: func() { + c.cache.Release(id) + }, + TreeContainer: cacheRes.(cache.TreeContainer), + } + return +} diff --git a/node/nodespace/service.go b/node/nodespace/service.go index 27226bc2..9602a18b 100644 --- a/node/nodespace/service.go +++ b/node/nodespace/service.go @@ -8,6 +8,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace/nodecache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "time" ) @@ -27,16 +29,20 @@ type Service interface { type service struct { conf config.Space - cache ocache.OCache + spaceCache ocache.OCache commonSpace commonspace.Service } func (s *service) Init(a *app.App) (err error) { s.conf = a.MustComponent(config.CName).(*config.Config).Space s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service) - s.cache = ocache.New( + s.spaceCache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { - return s.commonSpace.CreateSpace(ctx, id) + deps := commonspace.SpaceDeps{ + Cache: nodecache.NewNodeCache(s.conf.GCTTL), + Storage: storage.NewInMemoryTreeStorageProvider(), + } + return s.commonSpace.CreateSpace(ctx, id, deps) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), @@ -59,7 +65,7 @@ func (s *service) Run(ctx context.Context) (err error) { } func (s *service) GetSpace(ctx context.Context, id string) (commonspace.Space, error) { - v, err := s.cache.Get(ctx, id) + v, err := s.spaceCache.Get(ctx, id) if err != nil { return nil, err } @@ -67,5 +73,5 @@ func (s *service) GetSpace(ctx context.Context, id string) (commonspace.Space, e } func (s *service) Close(ctx context.Context) (err error) { - return s.cache.Close() + return s.spaceCache.Close() } From dc69e93064afe8611fd0edcfa19cd0b831d57160 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 18 Sep 2022 11:23:01 +0200 Subject: [PATCH 081/219] Some renamings and fixes --- common/commonspace/space.go | 4 ++-- common/commonspace/spacetree/spacetree.go | 1 + common/commonspace/syncservice/streampool.go | 10 +++++----- common/commonspace/syncservice/syncservice.go | 2 +- common/commonspace/synctree/synctree.go | 1 + pkg/acl/tree/objecttree.go | 2 +- pkg/acl/tree/rawtreevalidator.go | 2 +- 7 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 common/commonspace/spacetree/spacetree.go diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 3d181f52..5fbc675b 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -50,6 +50,7 @@ func (s *space) Init(ctx context.Context) error { s.rpc = &rpcHandler{s: s} s.diffService.Init(s.getObjectIds()) s.syncService.Init() + // basically this provides access for the external cache to use space's tree building functions s.cache.SetBuildFunc(s.BuildTree) return nil } @@ -67,7 +68,7 @@ func (s *space) DiffService() diffservice.DiffService { } func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) { - return synctree.CreateSyncTree(ctx, payload, s.syncService, listener, nil, s.storage.CreateTreeStorage) + return synctree.CreateSyncTree(ctx, payload, s.syncService, listener, s.aclList, s.storage.CreateTreeStorage) } func (s *space) BuildTree(ctx context.Context, id string, listener synctree.UpdateListener) (t tree.ObjectTree, err error) { @@ -109,7 +110,6 @@ func (s *space) BuildTree(ctx context.Context, id string, listener synctree.Upda if err != nil { return } - // TODO: maybe it is better to use the tree that we already built and just replace the storage // now we are sure that we can save it to the storage store, err = s.storage.CreateTreeStorage(payload) if err != nil { diff --git a/common/commonspace/spacetree/spacetree.go b/common/commonspace/spacetree/spacetree.go new file mode 100644 index 00000000..9cb4ff16 --- /dev/null +++ b/common/commonspace/spacetree/spacetree.go @@ -0,0 +1 @@ +package spacetree diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 0e2626e9..5eb97170 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -21,7 +21,7 @@ type StreamPool interface { SyncClient AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) - HasStream(peerId string) bool + HasActiveStream(peerId string) bool Close() (err error) } @@ -55,8 +55,8 @@ func newStreamPool(messageHandler MessageHandler) StreamPool { } } -func (s *streamPool) HasStream(peerId string) (res bool) { - _, err := s.getStream(peerId) +func (s *streamPool) HasActiveStream(peerId string) (res bool) { + _, err := s.getOrDeleteStream(peerId) return err == nil } @@ -83,7 +83,7 @@ func (s *streamPool) SendSync( } func (s *streamPool) SendAsync(peerId string, message *spacesyncproto.ObjectSyncMessage) (err error) { - stream, err := s.getStream(peerId) + stream, err := s.getOrDeleteStream(peerId) if err != nil { return } @@ -91,7 +91,7 @@ func (s *streamPool) SendAsync(peerId string, message *spacesyncproto.ObjectSync return stream.Send(message) } -func (s *streamPool) getStream(id string) (stream spacesyncproto.SpaceStream, err error) { +func (s *streamPool) getOrDeleteStream(id string) (stream spacesyncproto.SpaceStream, err error) { s.Lock() defer s.Unlock() stream, exists := s.peerStreams[id] diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 736d40b7..ed88f8ab 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -85,7 +85,7 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { return } for _, peer := range respPeers { - if s.streamPool.HasStream(peer.Id()) { + if s.streamPool.HasActiveStream(peer.Id()) { continue } cl := spacesyncproto.NewDRPCSpaceClient(peer) diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index e45c3ffa..7e4341e2 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -15,6 +15,7 @@ type UpdateListener interface { Rebuild(tree tree.ObjectTree) } +// SyncTree sends head updates to sync service and also sends new changes to update listener type SyncTree struct { tree.ObjectTree syncService syncservice.SyncService diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index c2b3e0b9..7c1df882 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -43,6 +43,7 @@ type ObjectTree interface { Heads() []string Root() *Change HasChange(string) bool + DebugDump() (string, error) Iterate(convert ChangeConvertFunc, iterate ChangeIterateFunc) error IterateFrom(id string, convert ChangeConvertFunc, iterate ChangeIterateFunc) error @@ -51,7 +52,6 @@ type ObjectTree interface { ChangesAfterCommonSnapshot(snapshotPath, heads []string) ([]*aclpb.RawTreeChangeWithId, error) Storage() storage.TreeStorage - DebugDump() (string, error) AddContent(ctx context.Context, content SignableChangeContent) (AddResult, error) AddRawChanges(ctx context.Context, changes ...*aclpb.RawTreeChangeWithId) (AddResult, error) diff --git a/pkg/acl/tree/rawtreevalidator.go b/pkg/acl/tree/rawtreevalidator.go index 86a0082f..01cb1105 100644 --- a/pkg/acl/tree/rawtreevalidator.go +++ b/pkg/acl/tree/rawtreevalidator.go @@ -12,6 +12,6 @@ func ValidateRawTree(payload storage.TreeStorageCreatePayload, aclList list.ACLL return } - _, err = BuildObjectTree(treeStorage, nil, aclList) + _, err = BuildObjectTree(treeStorage, aclList) return } From e768e835072ae0483016aca72971b7a2d16ddcd0 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 21 Sep 2022 09:26:33 +0200 Subject: [PATCH 082/219] Update gitignore to include vendor --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 2bc7dc72..97927dad 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out +# Golang vendor folder +vendor + # Intelli-J files .idea From 58812a568fa10ac847bee16f6daee397cb41a27a Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 25 Sep 2022 13:50:35 +0200 Subject: [PATCH 083/219] WIP root change refactoring --- Makefile | 17 +- .../spacesyncproto/protos/spacesync.proto | 18 +- .../commonspace/spacesyncproto/spacesync.go | 2 +- .../spacesyncproto/spacesync.pb.go | 489 +- common/commonspace/syncservice/synchandler.go | 2 +- common/commonspace/syncservice/syncservice.go | 2 +- common/commonspace/synctree/synctree.go | 2 +- go.mod | 6 +- go.sum | 10 - .../aclchanges/aclpb/protos/aclchanges.proto | 143 - pkg/acl/aclchanges/change.go | 12 - .../aclrecord.pb.go} | 6053 +++++++---------- pkg/acl/aclrecordproto/protos/aclrecord.proto | 102 + pkg/acl/list/aclstate.go | 54 +- pkg/acl/list/changebuilder.go | 2 +- pkg/acl/list/list.go | 4 +- pkg/acl/list/list_test.go | 2 +- pkg/acl/list/record.go | 48 +- pkg/acl/storage/inmemory.go | 48 +- pkg/acl/storage/liststorage.go | 10 +- pkg/acl/storage/provider.go | 15 +- pkg/acl/storage/treestorage.go | 8 +- pkg/acl/tree/change.go | 76 +- pkg/acl/tree/changebuilder.go | 165 +- pkg/acl/tree/changevalidator.go | 12 +- pkg/acl/tree/objecttree.go | 75 +- pkg/acl/tree/objecttree_test.go | 97 +- pkg/acl/tree/objecttreefactory.go | 108 +- pkg/acl/tree/rawloader.go | 16 +- pkg/acl/tree/treegraph_nix.go | 2 +- .../treechangeproto/protos/treechange.proto | 55 + pkg/acl/treechangeproto/treechange.pb.go | 1537 +++++ service/document/service.go | 2 +- service/storage/service.go | 2 +- service/treecache/service.go | 2 +- syncproto/proto/sync.proto | 2 +- 36 files changed, 4935 insertions(+), 4265 deletions(-) delete mode 100644 pkg/acl/aclchanges/aclpb/protos/aclchanges.proto delete mode 100644 pkg/acl/aclchanges/change.go rename pkg/acl/{aclchanges/aclpb/aclchanges.pb.go => aclrecordproto/aclrecord.pb.go} (60%) create mode 100644 pkg/acl/aclrecordproto/protos/aclrecord.proto create mode 100644 pkg/acl/treechangeproto/protos/treechange.proto create mode 100644 pkg/acl/treechangeproto/treechange.pb.go diff --git a/Makefile b/Makefile index b75d2d22..e9143f01 100644 --- a/Makefile +++ b/Makefile @@ -12,26 +12,25 @@ endif export PATH=$(GOPATH)/bin:$(shell echo $$PATH) -# TODO: folders were changed, so we should update Makefile and protos generation proto: @echo 'Generating protobuf packages (Go)...' # Uncomment if needed @$(eval ROOT_PKG := pkg) @$(eval GOGO_START := GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1) - @$(eval P_ACL_CHANGES_PATH_PB := $(ROOT_PKG)/acl/aclchanges/aclpb) + @$(eval P_ACL_RECORDS_PATH_PB := $(ROOT_PKG)/acl/aclrecordproto) + @$(eval P_TREE_CHANGES_PATH_PB := $(ROOT_PKG)/acl/treechangeproto) @$(eval P_SYNC_CHANGES_PATH_PB := syncproto) @$(eval P_TEST_CHANGES_PATH_PB := $(ROOT_PKG)/acl/testutils/testchanges) - @$(eval P_TIMESTAMP := Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types) - @$(eval P_STRUCT := Mgoogle/protobuf/struct.proto=github.com/gogo/protobuf/types) - @$(eval P_ACL_CHANGES := M$(P_ACL_CHANGES_PATH_PB)/protos/aclchanges.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_ACL_CHANGES_PATH_PB)) + @$(eval P_ACL_RECORDS := M$(P_ACL_RECORDS_PATH_PB)/protos/aclrecord.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_ACL_RECORDS_PATH_PB)) + @$(eval P_TREE_CHANGES := M$(P_TREE_CHANGES_PATH_PB)/protos/treechange.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_TREE_CHANGES_PATH_PB)) - # use if needed $(eval PKGMAP := $$(P_TIMESTAMP),$$(P_STRUCT)) - $(GOGO_START) protoc --gogofaster_out=:. $(P_ACL_CHANGES_PATH_PB)/protos/*.proto + $(GOGO_START) protoc --gogofaster_out=:. $(P_ACL_RECORDS_PATH_PB)/protos/*.proto + $(GOGO_START) protoc --gogofaster_out=:. $(P_TREE_CHANGES_PATH_PB)/protos/*.proto $(GOGO_START) protoc --gogofaster_out=:. $(P_TEST_CHANGES_PATH_PB)/proto/*.proto - $(eval PKGMAP := $$(P_ACL_CHANGES)) - $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. $(P_SYNC_CHANGES_PATH_PB)/proto/*.proto + $(eval PKGMAP := $$(P_TREE_CHANGES)) $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. --go-drpc_out=protolib=github.com/gogo/protobuf:. common/commonspace/spacesyncproto/protos/*.proto + build: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) go build -v -o bin/anytype-node -ldflags "$(FLAGS)" cmd/node/node.go \ No newline at end of file diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index 22f7e82d..a4bb3171 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package anySpace; option go_package = "common/commonspace/spacesyncproto"; -import "pkg/acl/aclchanges/aclpb/protos/aclchanges.proto"; +import "pkg/acl/treechangeproto/protos/treechange.proto"; enum ErrCodes { Unexpected = 0; @@ -49,7 +49,7 @@ message HeadSyncResponse { message ObjectSyncMessage { string spaceId = 1; ObjectSyncContentValue content = 2; - acl.TreeHeader treeHeader = 3; + treechange.RootChange treeHeader = 3; string treeId = 4; string trackingId = 5; // @@ -70,24 +70,32 @@ message ObjectSyncContentValue { // ObjectHeadUpdate is a message sent on document head update message ObjectHeadUpdate { repeated string heads = 1; - repeated acl.RawTreeChangeWithId changes = 2; + repeated treechange.RawTreeChangeWithId changes = 2; repeated string snapshotPath = 3; } // ObjectHeadUpdate is a message sent when document needs full sync message ObjectFullSyncRequest { repeated string heads = 1; - repeated acl.RawTreeChangeWithId changes = 2; + repeated treechange.RawTreeChangeWithId changes = 2; repeated string snapshotPath = 3; } // ObjectFullSyncResponse is a message sent as a response for a specific full sync message ObjectFullSyncResponse { repeated string heads = 1; - repeated acl.RawTreeChangeWithId changes = 2; + repeated treechange.RawTreeChangeWithId changes = 2; repeated string snapshotPath = 3; } message ObjectErrorResponse { string error = 1; } + +message SpaceHeader { + bytes identity = 1; + int64 timestamp = 2; + string spaceType = 3; + uint64 replicationKey = 4; + bytes seed = 5; +} diff --git a/common/commonspace/spacesyncproto/spacesync.go b/common/commonspace/spacesyncproto/spacesync.go index 25ec1ba6..6ac07962 100644 --- a/common/commonspace/spacesyncproto/spacesync.go +++ b/common/commonspace/spacesyncproto/spacesync.go @@ -1,6 +1,6 @@ package spacesyncproto -import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" +import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" type SpaceStream = DRPCSpace_StreamStream diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 04b77518..a0e6bf89 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -5,7 +5,7 @@ package spacesyncproto import ( fmt "fmt" - aclpb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -320,11 +320,11 @@ func (m *HeadSyncResponse) GetResults() []*HeadSyncResult { // ObjectSyncMessage is a message sent on object sync type ObjectSyncMessage struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - Content *ObjectSyncContentValue `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` - TreeHeader *aclpb.TreeHeader `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` - TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` - TrackingId string `protobuf:"bytes,5,opt,name=trackingId,proto3" json:"trackingId,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Content *ObjectSyncContentValue `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + TreeHeader *treechangeproto.RootChange `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` + TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` + TrackingId string `protobuf:"bytes,5,opt,name=trackingId,proto3" json:"trackingId,omitempty"` } func (m *ObjectSyncMessage) Reset() { *m = ObjectSyncMessage{} } @@ -374,7 +374,7 @@ func (m *ObjectSyncMessage) GetContent() *ObjectSyncContentValue { return nil } -func (m *ObjectSyncMessage) GetTreeHeader() *aclpb.TreeHeader { +func (m *ObjectSyncMessage) GetTreeHeader() *treechangeproto.RootChange { if m != nil { return m.TreeHeader } @@ -509,9 +509,9 @@ func (*ObjectSyncContentValue) XXX_OneofWrappers() []interface{} { // ObjectHeadUpdate is a message sent on document head update type ObjectHeadUpdate struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*treechangeproto.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` } func (m *ObjectHeadUpdate) Reset() { *m = ObjectHeadUpdate{} } @@ -554,7 +554,7 @@ func (m *ObjectHeadUpdate) GetHeads() []string { return nil } -func (m *ObjectHeadUpdate) GetChanges() []*aclpb.RawTreeChangeWithId { +func (m *ObjectHeadUpdate) GetChanges() []*treechangeproto.RawTreeChangeWithId { if m != nil { return m.Changes } @@ -570,9 +570,9 @@ func (m *ObjectHeadUpdate) GetSnapshotPath() []string { // ObjectHeadUpdate is a message sent when document needs full sync type ObjectFullSyncRequest struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*treechangeproto.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` } func (m *ObjectFullSyncRequest) Reset() { *m = ObjectFullSyncRequest{} } @@ -615,7 +615,7 @@ func (m *ObjectFullSyncRequest) GetHeads() []string { return nil } -func (m *ObjectFullSyncRequest) GetChanges() []*aclpb.RawTreeChangeWithId { +func (m *ObjectFullSyncRequest) GetChanges() []*treechangeproto.RawTreeChangeWithId { if m != nil { return m.Changes } @@ -631,9 +631,9 @@ func (m *ObjectFullSyncRequest) GetSnapshotPath() []string { // ObjectFullSyncResponse is a message sent as a response for a specific full sync type ObjectFullSyncResponse struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*aclpb.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*treechangeproto.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` } func (m *ObjectFullSyncResponse) Reset() { *m = ObjectFullSyncResponse{} } @@ -676,7 +676,7 @@ func (m *ObjectFullSyncResponse) GetHeads() []string { return nil } -func (m *ObjectFullSyncResponse) GetChanges() []*aclpb.RawTreeChangeWithId { +func (m *ObjectFullSyncResponse) GetChanges() []*treechangeproto.RawTreeChangeWithId { if m != nil { return m.Changes } @@ -734,6 +734,82 @@ func (m *ObjectErrorResponse) GetError() string { return "" } +type SpaceHeader struct { + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + SpaceType string `protobuf:"bytes,3,opt,name=spaceType,proto3" json:"spaceType,omitempty"` + ReplicationKey uint64 `protobuf:"varint,4,opt,name=replicationKey,proto3" json:"replicationKey,omitempty"` + Seed []byte `protobuf:"bytes,5,opt,name=seed,proto3" json:"seed,omitempty"` +} + +func (m *SpaceHeader) Reset() { *m = SpaceHeader{} } +func (m *SpaceHeader) String() string { return proto.CompactTextString(m) } +func (*SpaceHeader) ProtoMessage() {} +func (*SpaceHeader) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{11} +} +func (m *SpaceHeader) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SpaceHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SpaceHeader.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 *SpaceHeader) XXX_Merge(src proto.Message) { + xxx_messageInfo_SpaceHeader.Merge(m, src) +} +func (m *SpaceHeader) XXX_Size() int { + return m.Size() +} +func (m *SpaceHeader) XXX_DiscardUnknown() { + xxx_messageInfo_SpaceHeader.DiscardUnknown(m) +} + +var xxx_messageInfo_SpaceHeader proto.InternalMessageInfo + +func (m *SpaceHeader) GetIdentity() []byte { + if m != nil { + return m.Identity + } + return nil +} + +func (m *SpaceHeader) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *SpaceHeader) GetSpaceType() string { + if m != nil { + return m.SpaceType + } + return "" +} + +func (m *SpaceHeader) GetReplicationKey() uint64 { + if m != nil { + return m.ReplicationKey + } + return 0 +} + +func (m *SpaceHeader) GetSeed() []byte { + if m != nil { + return m.Seed + } + return nil +} + func init() { proto.RegisterEnum("anySpace.ErrCodes", ErrCodes_name, ErrCodes_value) proto.RegisterType((*HeadSyncRange)(nil), "anySpace.HeadSyncRange") @@ -747,6 +823,7 @@ func init() { proto.RegisterType((*ObjectFullSyncRequest)(nil), "anySpace.ObjectFullSyncRequest") proto.RegisterType((*ObjectFullSyncResponse)(nil), "anySpace.ObjectFullSyncResponse") proto.RegisterType((*ObjectErrorResponse)(nil), "anySpace.ObjectErrorResponse") + proto.RegisterType((*SpaceHeader)(nil), "anySpace.SpaceHeader") } func init() { @@ -754,52 +831,57 @@ func init() { } var fileDescriptor_5855f4ef9cf24cdb = []byte{ - // 712 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x4b, 0x6f, 0xd3, 0x40, - 0x10, 0xf6, 0xa6, 0x79, 0x75, 0xd2, 0x47, 0x58, 0x68, 0x31, 0x41, 0xa4, 0xc1, 0xa7, 0x08, 0xa4, - 0xa4, 0x0a, 0x17, 0x44, 0xb9, 0xd0, 0x2a, 0x55, 0x22, 0xc4, 0x43, 0x5b, 0x0a, 0x12, 0xe2, 0xb2, - 0xb5, 0xb7, 0x49, 0xa8, 0x63, 0x1b, 0xef, 0x86, 0xd2, 0x1b, 0x17, 0x38, 0x23, 0xfe, 0x12, 0x17, - 0x8e, 0x15, 0x27, 0x8e, 0xa8, 0xfd, 0x23, 0x68, 0xc7, 0x76, 0x5e, 0xb8, 0xe5, 0xd6, 0x43, 0xec, - 0x9d, 0xd9, 0xf9, 0xbe, 0xfd, 0xf6, 0x9b, 0xf5, 0x06, 0x1e, 0xda, 0xfe, 0x70, 0xe8, 0x7b, 0xcd, - 0xe8, 0x25, 0x03, 0x6e, 0x8b, 0x26, 0x3e, 0xe5, 0x89, 0x67, 0x07, 0xa1, 0xaf, 0xfc, 0x26, 0x3e, - 0xe5, 0x24, 0xdb, 0xc0, 0x04, 0x2d, 0x72, 0xef, 0x64, 0x4f, 0xe7, 0x2a, 0x9b, 0xc1, 0x51, 0xaf, - 0xc9, 0x6d, 0x57, 0xff, 0xec, 0x3e, 0xf7, 0x7a, 0x42, 0xea, 0x61, 0x70, 0x90, 0x40, 0x27, 0xf9, - 0x08, 0x6b, 0x75, 0x61, 0xb9, 0x23, 0xb8, 0xb3, 0x77, 0xe2, 0xd9, 0x4c, 0xe7, 0x29, 0x85, 0xec, - 0x61, 0xe8, 0x0f, 0x4d, 0x52, 0x23, 0xf5, 0x2c, 0xc3, 0x31, 0x5d, 0x81, 0x8c, 0xf2, 0xcd, 0x0c, - 0x66, 0x32, 0xca, 0xa7, 0x37, 0x20, 0xe7, 0x0e, 0x86, 0x03, 0x65, 0x2e, 0xd4, 0x48, 0x7d, 0x99, - 0x45, 0x81, 0x75, 0x0c, 0x2b, 0x63, 0x2a, 0x21, 0x47, 0xae, 0xd2, 0x5c, 0x7d, 0x2e, 0xfb, 0xc8, - 0xb5, 0xc4, 0x70, 0x4c, 0xb7, 0xa0, 0x28, 0x5c, 0x31, 0x14, 0x9e, 0x92, 0x66, 0xa6, 0xb6, 0x50, - 0x2f, 0xb5, 0x36, 0x1a, 0x89, 0xfe, 0xc6, 0x2c, 0xbe, 0x1d, 0xd5, 0xb1, 0x31, 0x40, 0x2f, 0x6c, - 0xfb, 0x23, 0x6f, 0xbc, 0x30, 0x06, 0xd6, 0x16, 0xac, 0xa5, 0x02, 0xb5, 0xee, 0x81, 0x83, 0xab, - 0x2f, 0xb2, 0xcc, 0xc0, 0x41, 0x3d, 0x82, 0x3b, 0xb8, 0x93, 0x45, 0x86, 0x63, 0xeb, 0x1d, 0xac, - 0x4e, 0xc0, 0x1f, 0x46, 0x42, 0x2a, 0x6a, 0x42, 0x01, 0x2d, 0xee, 0x26, 0xd8, 0x24, 0xa4, 0x4d, - 0xc8, 0x87, 0xe8, 0x5e, 0x2c, 0xfd, 0x66, 0x8a, 0x74, 0x3d, 0xcf, 0xe2, 0x32, 0x6b, 0x17, 0xca, - 0x53, 0xd2, 0x02, 0xdf, 0x93, 0x82, 0xb6, 0xa0, 0x10, 0xa2, 0x4c, 0x69, 0x12, 0x64, 0x31, 0x2f, - 0x32, 0x80, 0x25, 0x85, 0xd6, 0x2f, 0x02, 0xd7, 0x5e, 0x1c, 0xbc, 0x17, 0xb6, 0xd2, 0xb3, 0xcf, - 0x84, 0x94, 0xbc, 0x27, 0x2e, 0x11, 0xfa, 0x08, 0x0a, 0xb6, 0xef, 0x29, 0xe1, 0x29, 0xdc, 0x6c, - 0xa9, 0x55, 0x9b, 0xac, 0x31, 0xe1, 0xd9, 0x89, 0x4a, 0x5e, 0x73, 0x77, 0x24, 0x58, 0x02, 0xa0, - 0x4d, 0x00, 0x15, 0x0a, 0xa1, 0xa5, 0x88, 0x10, 0x9d, 0x2e, 0xb5, 0x56, 0x1b, 0xdc, 0x76, 0x1b, - 0xaf, 0xc6, 0x69, 0x36, 0x55, 0x42, 0xd7, 0x21, 0xaf, 0xa3, 0xae, 0x63, 0x66, 0x51, 0x45, 0x1c, - 0xd1, 0xaa, 0x26, 0xe2, 0xf6, 0xd1, 0xc0, 0xeb, 0x75, 0x1d, 0x33, 0x87, 0x73, 0x53, 0x19, 0xeb, - 0x47, 0x06, 0xd6, 0xd3, 0xc5, 0xd0, 0xc7, 0x00, 0xba, 0x3b, 0xfb, 0x81, 0xc3, 0x95, 0xc0, 0xcd, - 0x95, 0x5a, 0x95, 0xf9, 0x2d, 0x74, 0xc6, 0x15, 0x1d, 0x83, 0x4d, 0xd5, 0xd3, 0xa7, 0xb0, 0x7a, - 0x38, 0x72, 0xdd, 0xa9, 0x9e, 0xc6, 0x2e, 0x6c, 0xcc, 0x53, 0xec, 0xce, 0x96, 0x75, 0x0c, 0x36, - 0x8f, 0xa4, 0xcf, 0xa1, 0x3c, 0x49, 0x45, 0x2d, 0x8c, 0x4d, 0xa9, 0x5d, 0xcc, 0x16, 0xd5, 0x75, - 0x0c, 0xf6, 0x0f, 0x96, 0xb6, 0x61, 0x59, 0x84, 0xa1, 0x1f, 0x8e, 0xc9, 0xb2, 0x48, 0x76, 0x67, - 0x9e, 0xac, 0x3d, 0x5d, 0xd4, 0x31, 0xd8, 0x2c, 0x6a, 0xbb, 0x00, 0xb9, 0x8f, 0xda, 0x2a, 0xeb, - 0x33, 0x81, 0xf2, 0xbc, 0x1f, 0xfa, 0x43, 0xd1, 0x7e, 0x44, 0x27, 0x6c, 0x91, 0x45, 0x81, 0x3e, - 0x79, 0xf1, 0xd7, 0x1f, 0x9f, 0x5f, 0x13, 0xdb, 0xca, 0xf8, 0xb1, 0xee, 0xec, 0x0e, 0x4e, 0xbd, - 0x19, 0xa8, 0x7e, 0xd7, 0x61, 0x49, 0x21, 0xb5, 0x60, 0x49, 0x7a, 0x3c, 0x90, 0x7d, 0x5f, 0xbd, - 0xe4, 0xaa, 0x6f, 0x2e, 0x20, 0xe1, 0x4c, 0xce, 0xfa, 0x42, 0x60, 0x2d, 0xd5, 0xcf, 0x2b, 0xd6, - 0xf1, 0x95, 0x24, 0x07, 0x6a, 0xbe, 0x13, 0x57, 0x2c, 0xe4, 0x3e, 0x5c, 0x4f, 0x69, 0xa2, 0x16, - 0x81, 0x4d, 0x8c, 0xbf, 0xd6, 0x28, 0xb8, 0x57, 0x81, 0x62, 0x3b, 0x0c, 0x77, 0x7c, 0x47, 0x48, - 0xba, 0x02, 0xb0, 0xef, 0x89, 0x4f, 0x81, 0xb0, 0x95, 0x70, 0xca, 0x46, 0xeb, 0x3b, 0x81, 0x1c, - 0x1e, 0x0a, 0xfa, 0x04, 0x8a, 0xc9, 0xe5, 0x40, 0x6f, 0xa5, 0x5d, 0x18, 0x68, 0x78, 0xa5, 0x92, - 0x7a, 0x97, 0x44, 0xcb, 0xef, 0x42, 0x7e, 0x4f, 0x85, 0x82, 0x0f, 0xe9, 0xed, 0xb4, 0xdb, 0x20, - 0xbe, 0x55, 0x2a, 0x97, 0x4d, 0xd6, 0xc9, 0x26, 0xd9, 0xde, 0xfa, 0x79, 0x56, 0x25, 0xa7, 0x67, - 0x55, 0xf2, 0xe7, 0xac, 0x4a, 0xbe, 0x9d, 0x57, 0x8d, 0xd3, 0xf3, 0xaa, 0xf1, 0xfb, 0xbc, 0x6a, - 0xbc, 0xbd, 0xfb, 0xdf, 0xff, 0xb0, 0x83, 0x3c, 0xbe, 0x1e, 0xfc, 0x0d, 0x00, 0x00, 0xff, 0xff, - 0x93, 0x27, 0x56, 0x41, 0xef, 0x06, 0x00, 0x00, + // 797 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x55, 0xcd, 0x8e, 0xe3, 0x44, + 0x10, 0xb6, 0x33, 0x99, 0x49, 0x52, 0x99, 0x99, 0x0d, 0x0d, 0x3b, 0x98, 0x00, 0xd9, 0xe0, 0x03, + 0x8a, 0x40, 0x4a, 0x50, 0x90, 0x10, 0x30, 0x5c, 0xd8, 0x51, 0x46, 0x89, 0x56, 0xfc, 0xa8, 0x67, + 0x17, 0x24, 0xc4, 0xa5, 0xd7, 0xae, 0x4d, 0xcc, 0xda, 0x6e, 0xe3, 0xee, 0xb0, 0xe4, 0x09, 0xb8, + 0x80, 0x84, 0x78, 0x03, 0x9e, 0x85, 0x0b, 0xc7, 0x3d, 0xc2, 0x0d, 0xcd, 0xbc, 0x08, 0xea, 0xb2, + 0x1d, 0x3b, 0xc1, 0xbb, 0x1c, 0xf7, 0x12, 0x77, 0x7d, 0x5d, 0xf5, 0xf5, 0xd7, 0x55, 0xd5, 0x15, + 0xf8, 0xd0, 0x93, 0x51, 0x24, 0xe3, 0x49, 0xf6, 0x51, 0x89, 0xf0, 0x70, 0x42, 0xbf, 0x6a, 0x13, + 0x7b, 0x49, 0x2a, 0xb5, 0x9c, 0xd0, 0xaf, 0x2a, 0xd1, 0x31, 0x01, 0xac, 0x2d, 0xe2, 0xcd, 0x95, + 0xc1, 0xfa, 0x93, 0xe4, 0xf1, 0x72, 0x22, 0xbc, 0x70, 0xa2, 0x53, 0x44, 0x6f, 0x25, 0xe2, 0x25, + 0xee, 0x44, 0x96, 0x70, 0x16, 0xea, 0x2e, 0xe0, 0x64, 0x8e, 0xc2, 0xbf, 0xda, 0xc4, 0x1e, 0x37, + 0x30, 0x63, 0xd0, 0x7c, 0x94, 0xca, 0xc8, 0xb1, 0x87, 0xf6, 0xa8, 0xc9, 0x69, 0xcd, 0x4e, 0xa1, + 0xa1, 0xa5, 0xd3, 0x20, 0xa4, 0xa1, 0x25, 0x7b, 0x05, 0x0e, 0xc3, 0x20, 0x0a, 0xb4, 0x73, 0x30, + 0xb4, 0x47, 0x27, 0x3c, 0x33, 0xdc, 0x27, 0x70, 0xba, 0xa5, 0x42, 0xb5, 0x0e, 0xb5, 0xe1, 0x5a, + 0x09, 0xb5, 0x22, 0xae, 0x63, 0x4e, 0x6b, 0x76, 0x0e, 0x6d, 0x0c, 0x31, 0xc2, 0x58, 0x2b, 0xa7, + 0x31, 0x3c, 0x18, 0x75, 0xa7, 0x77, 0xc6, 0x85, 0xfc, 0xf1, 0x6e, 0xfc, 0x2c, 0xf3, 0xe3, 0xdb, + 0x00, 0x73, 0xb0, 0x27, 0xd7, 0xf1, 0xf6, 0x60, 0x32, 0xdc, 0x73, 0xb8, 0x5d, 0x1b, 0x68, 0x74, + 0x07, 0x3e, 0x9d, 0xde, 0xe1, 0x8d, 0xc0, 0x27, 0x3d, 0x28, 0x7c, 0xba, 0x49, 0x87, 0xd3, 0xda, + 0xfd, 0x16, 0x6e, 0x95, 0xc1, 0xdf, 0xaf, 0x51, 0x69, 0xe6, 0x40, 0x8b, 0x32, 0xbc, 0x28, 0x62, + 0x0b, 0x93, 0x4d, 0xe0, 0x28, 0x35, 0x59, 0x2a, 0xa4, 0xbf, 0x5a, 0x23, 0xdd, 0xec, 0xf3, 0xdc, + 0xcd, 0xbd, 0x84, 0x5e, 0x45, 0x5a, 0x22, 0x63, 0x85, 0x6c, 0x0a, 0xad, 0x94, 0x64, 0x2a, 0xc7, + 0x26, 0x16, 0xe7, 0x59, 0x09, 0xe0, 0x85, 0xa3, 0xfb, 0xb7, 0x0d, 0x2f, 0x7d, 0xf1, 0xf0, 0x3b, + 0xf4, 0xb4, 0xd9, 0xfd, 0x0c, 0x95, 0x12, 0x4b, 0x7c, 0x8e, 0xd0, 0x8f, 0xa1, 0xe5, 0xc9, 0x58, + 0x63, 0xac, 0xe9, 0xb2, 0xdd, 0xe9, 0xb0, 0x3c, 0xa3, 0xe4, 0xb9, 0xc8, 0x5c, 0xbe, 0x12, 0xe1, + 0x1a, 0x79, 0x11, 0xc0, 0x3e, 0x00, 0x30, 0x6d, 0x62, 0xa4, 0x60, 0x4a, 0x99, 0xee, 0x4e, 0xcf, + 0xc6, 0x95, 0xce, 0xe1, 0x52, 0xea, 0x0b, 0x5a, 0xf2, 0x8a, 0x27, 0x3b, 0x83, 0x23, 0x63, 0x2d, + 0x7c, 0xa7, 0x49, 0x62, 0x72, 0x8b, 0x0d, 0x0c, 0x9f, 0xf0, 0x1e, 0x07, 0xf1, 0x72, 0xe1, 0x3b, + 0x87, 0xb4, 0x57, 0x41, 0xdc, 0x3f, 0x1a, 0x70, 0x56, 0xaf, 0x89, 0x7d, 0x02, 0x60, 0x8a, 0xf4, + 0x20, 0xf1, 0x85, 0x46, 0xba, 0x63, 0x77, 0xda, 0xdf, 0xbf, 0xc9, 0x7c, 0xeb, 0x31, 0xb7, 0x78, + 0xc5, 0x9f, 0xdd, 0x83, 0x5b, 0x8f, 0xd6, 0x61, 0x58, 0x29, 0x6d, 0x9e, 0x8c, 0x3b, 0xfb, 0x14, + 0x97, 0xbb, 0x6e, 0x73, 0x8b, 0xef, 0x47, 0xb2, 0xcf, 0xa1, 0x57, 0x42, 0x59, 0x25, 0xf3, 0xdc, + 0x0c, 0x9f, 0xcd, 0x96, 0xf9, 0xcd, 0x2d, 0xfe, 0x9f, 0x58, 0x36, 0x83, 0x13, 0x4c, 0x53, 0x99, + 0x6e, 0xc9, 0x9a, 0x44, 0xf6, 0xe6, 0x3e, 0xd9, 0xac, 0xea, 0x34, 0xb7, 0xf8, 0x6e, 0xd4, 0xdd, + 0x16, 0x1c, 0xfe, 0x60, 0x52, 0xe5, 0xfe, 0x64, 0x43, 0x6f, 0x3f, 0x1f, 0xe6, 0xbd, 0x98, 0x7c, + 0x64, 0x8d, 0xd6, 0xe1, 0x99, 0xc1, 0x3e, 0x82, 0x56, 0x56, 0xc9, 0xf2, 0x05, 0x56, 0xab, 0x2b, + 0x9e, 0xdc, 0x4f, 0x11, 0xb3, 0x02, 0x7f, 0x1d, 0xe8, 0xd5, 0xc2, 0xe7, 0x85, 0x3f, 0x73, 0xe1, + 0x58, 0xc5, 0x22, 0x51, 0x2b, 0xa9, 0xbf, 0x14, 0x7a, 0xe5, 0x1c, 0x10, 0xef, 0x0e, 0xe6, 0xfe, + 0x6c, 0xc3, 0xed, 0xda, 0xb4, 0xbe, 0x18, 0x39, 0xbf, 0xd8, 0x45, 0x7b, 0xed, 0xd7, 0xe5, 0xc5, + 0xe8, 0x79, 0x17, 0x5e, 0xae, 0xa9, 0xac, 0xd1, 0x42, 0x95, 0xcd, 0x5f, 0x72, 0x66, 0xb8, 0xbf, + 0xdb, 0xd0, 0xa5, 0x6e, 0xc8, 0xdf, 0x58, 0x1f, 0xda, 0x81, 0x8f, 0xb1, 0x0e, 0xf4, 0x26, 0x9f, + 0xaa, 0x5b, 0x9b, 0xbd, 0x01, 0x1d, 0x1d, 0x44, 0xa8, 0xb4, 0x88, 0x12, 0x6a, 0xf4, 0x03, 0x5e, + 0x02, 0x66, 0x97, 0x86, 0xc3, 0xfd, 0x4d, 0x92, 0x35, 0x6e, 0x87, 0x97, 0x00, 0x7b, 0x1b, 0x4e, + 0x53, 0x4c, 0xc2, 0xc0, 0x13, 0x3a, 0x90, 0xf1, 0x3d, 0xdc, 0x50, 0x3b, 0x36, 0xf9, 0x1e, 0x6a, + 0x26, 0xa8, 0x42, 0xcc, 0x5e, 0xf1, 0x31, 0xa7, 0xf5, 0x3b, 0x7d, 0x68, 0xcf, 0xd2, 0xf4, 0x42, + 0xfa, 0xa8, 0xd8, 0x29, 0xc0, 0x83, 0x18, 0x7f, 0x4c, 0xd0, 0xd3, 0xe8, 0xf7, 0xac, 0xe9, 0x6f, + 0x36, 0x1c, 0x92, 0x7e, 0xf6, 0x29, 0xb4, 0x8b, 0xe1, 0xc6, 0x5e, 0xab, 0x1b, 0x78, 0xd4, 0x22, + 0xfd, 0x7e, 0xed, 0x2c, 0xcc, 0x52, 0x74, 0x09, 0x47, 0x57, 0x3a, 0x45, 0x11, 0xb1, 0xd7, 0xeb, + 0xa6, 0x59, 0x3e, 0x15, 0xfb, 0xcf, 0xdb, 0x1c, 0xd9, 0xef, 0xd9, 0x77, 0xcf, 0xff, 0xbc, 0x1e, + 0xd8, 0x4f, 0xaf, 0x07, 0xf6, 0x3f, 0xd7, 0x03, 0xfb, 0xd7, 0x9b, 0x81, 0xf5, 0xf4, 0x66, 0x60, + 0xfd, 0x75, 0x33, 0xb0, 0xbe, 0x79, 0xeb, 0x7f, 0xff, 0x82, 0x1f, 0x1e, 0xd1, 0xe7, 0xfd, 0x7f, + 0x03, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x1f, 0x02, 0x55, 0xae, 0x07, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { @@ -1386,6 +1468,60 @@ func (m *ObjectErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SpaceHeader) 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 *SpaceHeader) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SpaceHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Seed) > 0 { + i -= len(m.Seed) + copy(dAtA[i:], m.Seed) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Seed))) + i-- + dAtA[i] = 0x2a + } + if m.ReplicationKey != 0 { + i = encodeVarintSpacesync(dAtA, i, uint64(m.ReplicationKey)) + i-- + dAtA[i] = 0x20 + } + if len(m.SpaceType) > 0 { + i -= len(m.SpaceType) + copy(dAtA[i:], m.SpaceType) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SpaceType))) + i-- + dAtA[i] = 0x1a + } + if m.Timestamp != 0 { + i = encodeVarintSpacesync(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x10 + } + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Identity))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintSpacesync(dAtA []byte, offset int, v uint64) int { offset -= sovSpacesync(v) base := offset @@ -1671,6 +1807,33 @@ func (m *ObjectErrorResponse) Size() (n int) { return n } +func (m *SpaceHeader) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Identity) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + if m.Timestamp != 0 { + n += 1 + sovSpacesync(uint64(m.Timestamp)) + } + l = len(m.SpaceType) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + if m.ReplicationKey != 0 { + n += 1 + sovSpacesync(uint64(m.ReplicationKey)) + } + l = len(m.Seed) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} + func sovSpacesync(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2362,7 +2525,7 @@ func (m *ObjectSyncMessage) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.TreeHeader == nil { - m.TreeHeader = &aclpb.TreeHeader{} + m.TreeHeader = &treechangeproto.RootChange{} } if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -2733,7 +2896,7 @@ func (m *ObjectHeadUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Changes = append(m.Changes, &aclpb.RawTreeChangeWithId{}) + m.Changes = append(m.Changes, &treechangeproto.RawTreeChangeWithId{}) if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -2881,7 +3044,7 @@ func (m *ObjectFullSyncRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Changes = append(m.Changes, &aclpb.RawTreeChangeWithId{}) + m.Changes = append(m.Changes, &treechangeproto.RawTreeChangeWithId{}) if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -3029,7 +3192,7 @@ func (m *ObjectFullSyncResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Changes = append(m.Changes, &aclpb.RawTreeChangeWithId{}) + m.Changes = append(m.Changes, &treechangeproto.RawTreeChangeWithId{}) if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -3169,6 +3332,194 @@ func (m *ObjectErrorResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *SpaceHeader) 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 ErrIntOverflowSpacesync + } + 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: SpaceHeader: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SpaceHeader: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReplicationKey", wireType) + } + m.ReplicationKey = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ReplicationKey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Seed", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Seed = append(m.Seed[:0], dAtA[iNdEx:postIndex]...) + if m.Seed == nil { + m.Seed = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipSpacesync(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index 12798bc3..0d3be042 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -4,7 +4,7 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" ) diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index ed88f8ab..c7039a73 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -5,7 +5,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" "time" ) diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 7e4341e2..149c7c9b 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -4,7 +4,7 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" diff --git a/go.mod b/go.mod index 47537c53..9c60aa54 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments go 1.18 require ( + github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab github.com/cespare/xxhash v1.1.0 github.com/goccy/go-graphviz v0.0.9 @@ -16,6 +17,7 @@ require ( github.com/multiformats/go-multihash v0.1.0 github.com/stretchr/testify v1.8.0 github.com/zeebo/blake3 v0.2.3 + github.com/zeebo/errs v1.3.0 go.uber.org/zap v1.21.0 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 gopkg.in/yaml.v3 v3.0.1 @@ -24,7 +26,6 @@ require ( require ( github.com/OneOfOne/xxhash v1.2.8 // indirect - github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 // indirect github.com/btcsuite/btcd v0.22.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.1.3 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect @@ -32,7 +33,6 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/golang/protobuf v1.5.2 // indirect github.com/klauspost/cpuid/v2 v2.0.12 // indirect github.com/libp2p/go-buffer-pool v0.0.2 // indirect github.com/libp2p/go-openssl v0.0.7 // indirect @@ -47,13 +47,11 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/zeebo/errs v1.3.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect - google.golang.org/protobuf v1.28.1 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.1.6 // indirect diff --git a/go.sum b/go.sum index ba61ef8a..34c05834 100644 --- a/go.sum +++ b/go.sum @@ -32,10 +32,6 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -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/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= @@ -117,8 +113,6 @@ github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= -github.com/zeebo/errs v1.2.2 h1:5NFypMTuSdoySVTqlNs1dEoU21QVamMQJxW/Fii5O7g= -github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= @@ -184,10 +178,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T 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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -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/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= diff --git a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto b/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto deleted file mode 100644 index 5d69e94f..00000000 --- a/pkg/acl/aclchanges/aclpb/protos/aclchanges.proto +++ /dev/null @@ -1,143 +0,0 @@ -syntax = "proto3"; -package acl; -option go_package = "pkg/acl/aclchanges/aclpb"; - -// ACL protos - -message RawACLRecord { - bytes payload = 1; - bytes signature = 2; - string id = 3; // this field is only used on user side for convenience, it should be empty when saving to db -} - -message ACLContentValue { - oneof value { - ACLUserAdd userAdd = 1; - ACLUserRemove userRemove = 2; - ACLUserPermissionChange userPermissionChange = 3; - ACLUserInvite userInvite = 4; - ACLUserJoin userJoin = 5; - ACLUserConfirm userConfirm = 6; - } -} - -message ACLData { - repeated ACLContentValue aclContent = 1; -} - -message ACLState { - repeated uint64 readKeyHashes = 1; - repeated ACLUserState userStates = 2; - map invites = 3; // TODO: later - // repeated string unconfirmedUsers = 4; // TODO: later -} - -message ACLUserState { - bytes identity = 1; - bytes encryptionKey = 2; - repeated bytes encryptedReadKeys = 3; // all read keys that we know - ACLUserPermissions permissions = 4; - bool isConfirmed = 5; -} - -// we already know identity and encryptionKey -message ACLUserAdd { - bytes identity = 1; // public signing key - bytes encryptionKey = 2; // public encryption key - repeated bytes encryptedReadKeys = 3; // all read keys that we know for the user - ACLUserPermissions permissions = 4; -} - -// TODO: this is not used as of now -message ACLUserConfirm { // not needed for read permissions - bytes identity = 1; // not needed - string userAddId = 2; -} - -message ACLUserInvite { - bytes acceptPublicKey = 1; - bytes encryptPublicKey = 2; - repeated bytes encryptedReadKeys = 3; // all read keys that we know for the user - ACLUserPermissions permissions = 4; - string inviteId = 5; -} - -message ACLUserJoin { - bytes identity = 1; - bytes encryptionKey = 2; - bytes acceptSignature = 3; // sign acceptPublicKey - string userInviteId = 4; - repeated bytes encryptedReadKeys = 5; // the idea is that user should itself reencrypt the keys with the pub key -} - -message ACLUserRemove { - bytes identity = 1; - repeated ACLReadKeyReplace readKeyReplaces = 3; // new read key encrypted for all users -} - -message ACLReadKeyReplace { - bytes identity = 1; - bytes encryptionKey = 2; - bytes encryptedReadKey = 3; -} - -message ACLUserPermissionChange { - bytes identity = 1; - ACLUserPermissions permissions = 2; -} - -enum ACLUserPermissions { - Admin = 0; - Writer = 1; - Reader = 2; - Removed = 3; -} - -message ACLRecord { - string prevId = 1; - bytes identity = 2; - bytes data = 3; - uint64 currentReadKeyHash = 4; - int64 timestamp = 5; -} - -message ACLHeader { - string firstId = 1; - bytes identity = 2; // the identity of the creator -} - -// Tree protos - -message RawTreeChange { - bytes payload = 1; - bytes signature = 2; -} - -message RawTreeChangeWithId { - bytes rawChange = 1; - string id = 2; -} - -message TreeChange { - repeated string treeHeadIds = 1; - string aclHeadId = 2; - string snapshotBaseId = 3; - bytes changesData = 4; - uint64 currentReadKeyHash = 5; - int64 timestamp = 6; - bytes identity = 7; - bool isSnapshot = 8; -} - -enum TreeHeaderType { - Object = 0; - Space = 1; -} - -message TreeHeader { - string firstId = 1; - string aclId = 2; - TreeHeaderType treeHeaderType = 3; - bytes identity = 4; - bytes data = 5; // this should be reserved for the client to add the data it needs -} diff --git a/pkg/acl/aclchanges/change.go b/pkg/acl/aclchanges/change.go deleted file mode 100644 index 3d3b4376..00000000 --- a/pkg/acl/aclchanges/change.go +++ /dev/null @@ -1,12 +0,0 @@ -package aclchanges - -import ( - "github.com/gogo/protobuf/proto" -) - -type Change interface { - ProtoChange() proto.Marshaler - DecryptedChangeContent() []byte - Signature() []byte - CID() string -} diff --git a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go b/pkg/acl/aclrecordproto/aclrecord.pb.go similarity index 60% rename from pkg/acl/aclchanges/aclpb/aclchanges.pb.go rename to pkg/acl/aclrecordproto/aclrecord.pb.go index 60437c7e..69035b70 100644 --- a/pkg/acl/aclchanges/aclpb/aclchanges.pb.go +++ b/pkg/acl/aclrecordproto/aclrecord.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: pkg/acl/aclchanges/aclpb/protos/aclchanges.proto +// source: pkg/acl/aclrecordproto/protos/aclrecord.proto -package aclpb +package aclrecordproto import ( fmt "fmt" @@ -25,24 +25,21 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type ACLUserPermissions int32 const ( - ACLUserPermissions_Admin ACLUserPermissions = 0 - ACLUserPermissions_Writer ACLUserPermissions = 1 - ACLUserPermissions_Reader ACLUserPermissions = 2 - ACLUserPermissions_Removed ACLUserPermissions = 3 + ACLUserPermissions_Admin ACLUserPermissions = 0 + ACLUserPermissions_Writer ACLUserPermissions = 1 + ACLUserPermissions_Reader ACLUserPermissions = 2 ) var ACLUserPermissions_name = map[int32]string{ 0: "Admin", 1: "Writer", 2: "Reader", - 3: "Removed", } var ACLUserPermissions_value = map[string]int32{ - "Admin": 0, - "Writer": 1, - "Reader": 2, - "Removed": 3, + "Admin": 0, + "Writer": 1, + "Reader": 2, } func (x ACLUserPermissions) String() string { @@ -50,45 +47,19 @@ func (x ACLUserPermissions) String() string { } func (ACLUserPermissions) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0} -} - -type TreeHeaderType int32 - -const ( - TreeHeaderType_Object TreeHeaderType = 0 - TreeHeaderType_Space TreeHeaderType = 1 -) - -var TreeHeaderType_name = map[int32]string{ - 0: "Object", - 1: "Space", -} - -var TreeHeaderType_value = map[string]int32{ - "Object": 0, - "Space": 1, -} - -func (x TreeHeaderType) String() string { - return proto.EnumName(TreeHeaderType_name, int32(x)) -} - -func (TreeHeaderType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1} + return fileDescriptor_14abe0d1b4206d54, []int{0} } type RawACLRecord struct { Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` } func (m *RawACLRecord) Reset() { *m = RawACLRecord{} } func (m *RawACLRecord) String() string { return proto.CompactTextString(m) } func (*RawACLRecord) ProtoMessage() {} func (*RawACLRecord) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{0} + return fileDescriptor_14abe0d1b4206d54, []int{0} } func (m *RawACLRecord) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -131,13 +102,210 @@ func (m *RawACLRecord) GetSignature() []byte { return nil } -func (m *RawACLRecord) GetId() string { +type RawACLRecordWithId struct { + Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *RawACLRecordWithId) Reset() { *m = RawACLRecordWithId{} } +func (m *RawACLRecordWithId) String() string { return proto.CompactTextString(m) } +func (*RawACLRecordWithId) ProtoMessage() {} +func (*RawACLRecordWithId) Descriptor() ([]byte, []int) { + return fileDescriptor_14abe0d1b4206d54, []int{1} +} +func (m *RawACLRecordWithId) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RawACLRecordWithId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RawACLRecordWithId.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 *RawACLRecordWithId) XXX_Merge(src proto.Message) { + xxx_messageInfo_RawACLRecordWithId.Merge(m, src) +} +func (m *RawACLRecordWithId) XXX_Size() int { + return m.Size() +} +func (m *RawACLRecordWithId) XXX_DiscardUnknown() { + xxx_messageInfo_RawACLRecordWithId.DiscardUnknown(m) +} + +var xxx_messageInfo_RawACLRecordWithId proto.InternalMessageInfo + +func (m *RawACLRecordWithId) GetPayload() []byte { + if m != nil { + return m.Payload + } + return nil +} + +func (m *RawACLRecordWithId) GetId() string { if m != nil { return m.Id } return "" } +type ACLRecord struct { + PrevId string `protobuf:"bytes,1,opt,name=prevId,proto3" json:"prevId,omitempty"` + Identity []byte `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` + CurrentReadKeyHash uint64 `protobuf:"varint,4,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` + Timestamp int64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +} + +func (m *ACLRecord) Reset() { *m = ACLRecord{} } +func (m *ACLRecord) String() string { return proto.CompactTextString(m) } +func (*ACLRecord) ProtoMessage() {} +func (*ACLRecord) Descriptor() ([]byte, []int) { + return fileDescriptor_14abe0d1b4206d54, []int{2} +} +func (m *ACLRecord) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ACLRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ACLRecord.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 *ACLRecord) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLRecord.Merge(m, src) +} +func (m *ACLRecord) XXX_Size() int { + return m.Size() +} +func (m *ACLRecord) XXX_DiscardUnknown() { + xxx_messageInfo_ACLRecord.DiscardUnknown(m) +} + +var xxx_messageInfo_ACLRecord proto.InternalMessageInfo + +func (m *ACLRecord) GetPrevId() string { + if m != nil { + return m.PrevId + } + return "" +} + +func (m *ACLRecord) GetIdentity() []byte { + if m != nil { + return m.Identity + } + return nil +} + +func (m *ACLRecord) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +func (m *ACLRecord) GetCurrentReadKeyHash() uint64 { + if m != nil { + return m.CurrentReadKeyHash + } + return 0 +} + +func (m *ACLRecord) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +type ACLRoot struct { + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` + SpaceId string `protobuf:"bytes,3,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + EncryptedReadKey []byte `protobuf:"bytes,4,opt,name=encryptedReadKey,proto3" json:"encryptedReadKey,omitempty"` + DerivationScheme string `protobuf:"bytes,5,opt,name=derivationScheme,proto3" json:"derivationScheme,omitempty"` +} + +func (m *ACLRoot) Reset() { *m = ACLRoot{} } +func (m *ACLRoot) String() string { return proto.CompactTextString(m) } +func (*ACLRoot) ProtoMessage() {} +func (*ACLRoot) Descriptor() ([]byte, []int) { + return fileDescriptor_14abe0d1b4206d54, []int{3} +} +func (m *ACLRoot) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ACLRoot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ACLRoot.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 *ACLRoot) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLRoot.Merge(m, src) +} +func (m *ACLRoot) XXX_Size() int { + return m.Size() +} +func (m *ACLRoot) XXX_DiscardUnknown() { + xxx_messageInfo_ACLRoot.DiscardUnknown(m) +} + +var xxx_messageInfo_ACLRoot proto.InternalMessageInfo + +func (m *ACLRoot) GetIdentity() []byte { + if m != nil { + return m.Identity + } + return nil +} + +func (m *ACLRoot) GetEncryptionKey() []byte { + if m != nil { + return m.EncryptionKey + } + return nil +} + +func (m *ACLRoot) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +func (m *ACLRoot) GetEncryptedReadKey() []byte { + if m != nil { + return m.EncryptedReadKey + } + return nil +} + +func (m *ACLRoot) GetDerivationScheme() string { + if m != nil { + return m.DerivationScheme + } + return "" +} + type ACLContentValue struct { // Types that are valid to be assigned to Value: // *ACLContentValue_UserAdd @@ -145,7 +313,6 @@ type ACLContentValue struct { // *ACLContentValue_UserPermissionChange // *ACLContentValue_UserInvite // *ACLContentValue_UserJoin - // *ACLContentValue_UserConfirm Value isACLContentValue_Value `protobuf_oneof:"value"` } @@ -153,7 +320,7 @@ func (m *ACLContentValue) Reset() { *m = ACLContentValue{} } func (m *ACLContentValue) String() string { return proto.CompactTextString(m) } func (*ACLContentValue) ProtoMessage() {} func (*ACLContentValue) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{1} + return fileDescriptor_14abe0d1b4206d54, []int{4} } func (m *ACLContentValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -203,16 +370,12 @@ type ACLContentValue_UserInvite struct { type ACLContentValue_UserJoin struct { UserJoin *ACLUserJoin `protobuf:"bytes,5,opt,name=userJoin,proto3,oneof" json:"userJoin,omitempty"` } -type ACLContentValue_UserConfirm struct { - UserConfirm *ACLUserConfirm `protobuf:"bytes,6,opt,name=userConfirm,proto3,oneof" json:"userConfirm,omitempty"` -} func (*ACLContentValue_UserAdd) isACLContentValue_Value() {} func (*ACLContentValue_UserRemove) isACLContentValue_Value() {} func (*ACLContentValue_UserPermissionChange) isACLContentValue_Value() {} func (*ACLContentValue_UserInvite) isACLContentValue_Value() {} func (*ACLContentValue_UserJoin) isACLContentValue_Value() {} -func (*ACLContentValue_UserConfirm) isACLContentValue_Value() {} func (m *ACLContentValue) GetValue() isACLContentValue_Value { if m != nil { @@ -256,13 +419,6 @@ func (m *ACLContentValue) GetUserJoin() *ACLUserJoin { return nil } -func (m *ACLContentValue) GetUserConfirm() *ACLUserConfirm { - if x, ok := m.GetValue().(*ACLContentValue_UserConfirm); ok { - return x.UserConfirm - } - return nil -} - // XXX_OneofWrappers is for the internal use of the proto package. func (*ACLContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -271,7 +427,6 @@ func (*ACLContentValue) XXX_OneofWrappers() []interface{} { (*ACLContentValue_UserPermissionChange)(nil), (*ACLContentValue_UserInvite)(nil), (*ACLContentValue_UserJoin)(nil), - (*ACLContentValue_UserConfirm)(nil), } } @@ -283,7 +438,7 @@ func (m *ACLData) Reset() { *m = ACLData{} } func (m *ACLData) String() string { return proto.CompactTextString(m) } func (*ACLData) ProtoMessage() {} func (*ACLData) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{2} + return fileDescriptor_14abe0d1b4206d54, []int{5} } func (m *ACLData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -329,7 +484,7 @@ func (m *ACLState) Reset() { *m = ACLState{} } func (m *ACLState) String() string { return proto.CompactTextString(m) } func (*ACLState) ProtoMessage() {} func (*ACLState) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{3} + return fileDescriptor_14abe0d1b4206d54, []int{6} } func (m *ACLState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -383,7 +538,7 @@ type ACLUserState struct { Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` + Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=aclrecord.ACLUserPermissions" json:"permissions,omitempty"` IsConfirmed bool `protobuf:"varint,5,opt,name=isConfirmed,proto3" json:"isConfirmed,omitempty"` } @@ -391,7 +546,7 @@ func (m *ACLUserState) Reset() { *m = ACLUserState{} } func (m *ACLUserState) String() string { return proto.CompactTextString(m) } func (*ACLUserState) ProtoMessage() {} func (*ACLUserState) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{4} + return fileDescriptor_14abe0d1b4206d54, []int{7} } func (m *ACLUserState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -455,19 +610,18 @@ func (m *ACLUserState) GetIsConfirmed() bool { return false } -// we already know identity and encryptionKey type ACLUserAdd struct { Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` + Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=aclrecord.ACLUserPermissions" json:"permissions,omitempty"` } func (m *ACLUserAdd) Reset() { *m = ACLUserAdd{} } func (m *ACLUserAdd) String() string { return proto.CompactTextString(m) } func (*ACLUserAdd) ProtoMessage() {} func (*ACLUserAdd) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{5} + return fileDescriptor_14abe0d1b4206d54, []int{8} } func (m *ACLUserAdd) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -524,64 +678,11 @@ func (m *ACLUserAdd) GetPermissions() ACLUserPermissions { return ACLUserPermissions_Admin } -// TODO: this is not used as of now -type ACLUserConfirm struct { - Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - UserAddId string `protobuf:"bytes,2,opt,name=userAddId,proto3" json:"userAddId,omitempty"` -} - -func (m *ACLUserConfirm) Reset() { *m = ACLUserConfirm{} } -func (m *ACLUserConfirm) String() string { return proto.CompactTextString(m) } -func (*ACLUserConfirm) ProtoMessage() {} -func (*ACLUserConfirm) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{6} -} -func (m *ACLUserConfirm) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ACLUserConfirm) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ACLUserConfirm.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 *ACLUserConfirm) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLUserConfirm.Merge(m, src) -} -func (m *ACLUserConfirm) XXX_Size() int { - return m.Size() -} -func (m *ACLUserConfirm) XXX_DiscardUnknown() { - xxx_messageInfo_ACLUserConfirm.DiscardUnknown(m) -} - -var xxx_messageInfo_ACLUserConfirm proto.InternalMessageInfo - -func (m *ACLUserConfirm) GetIdentity() []byte { - if m != nil { - return m.Identity - } - return nil -} - -func (m *ACLUserConfirm) GetUserAddId() string { - if m != nil { - return m.UserAddId - } - return "" -} - type ACLUserInvite struct { AcceptPublicKey []byte `protobuf:"bytes,1,opt,name=acceptPublicKey,proto3" json:"acceptPublicKey,omitempty"` EncryptPublicKey []byte `protobuf:"bytes,2,opt,name=encryptPublicKey,proto3" json:"encryptPublicKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` + Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=aclrecord.ACLUserPermissions" json:"permissions,omitempty"` InviteId string `protobuf:"bytes,5,opt,name=inviteId,proto3" json:"inviteId,omitempty"` } @@ -589,7 +690,7 @@ func (m *ACLUserInvite) Reset() { *m = ACLUserInvite{} } func (m *ACLUserInvite) String() string { return proto.CompactTextString(m) } func (*ACLUserInvite) ProtoMessage() {} func (*ACLUserInvite) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{7} + return fileDescriptor_14abe0d1b4206d54, []int{9} } func (m *ACLUserInvite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -657,7 +758,7 @@ type ACLUserJoin struct { Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` AcceptSignature []byte `protobuf:"bytes,3,opt,name=acceptSignature,proto3" json:"acceptSignature,omitempty"` - UserInviteId string `protobuf:"bytes,4,opt,name=userInviteId,proto3" json:"userInviteId,omitempty"` + InviteId string `protobuf:"bytes,4,opt,name=inviteId,proto3" json:"inviteId,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,5,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` } @@ -665,7 +766,7 @@ func (m *ACLUserJoin) Reset() { *m = ACLUserJoin{} } func (m *ACLUserJoin) String() string { return proto.CompactTextString(m) } func (*ACLUserJoin) ProtoMessage() {} func (*ACLUserJoin) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{8} + return fileDescriptor_14abe0d1b4206d54, []int{10} } func (m *ACLUserJoin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -715,9 +816,9 @@ func (m *ACLUserJoin) GetAcceptSignature() []byte { return nil } -func (m *ACLUserJoin) GetUserInviteId() string { +func (m *ACLUserJoin) GetInviteId() string { if m != nil { - return m.UserInviteId + return m.InviteId } return "" } @@ -738,7 +839,7 @@ func (m *ACLUserRemove) Reset() { *m = ACLUserRemove{} } func (m *ACLUserRemove) String() string { return proto.CompactTextString(m) } func (*ACLUserRemove) ProtoMessage() {} func (*ACLUserRemove) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{9} + return fileDescriptor_14abe0d1b4206d54, []int{11} } func (m *ACLUserRemove) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -791,7 +892,7 @@ func (m *ACLReadKeyReplace) Reset() { *m = ACLReadKeyReplace{} } func (m *ACLReadKeyReplace) String() string { return proto.CompactTextString(m) } func (*ACLReadKeyReplace) ProtoMessage() {} func (*ACLReadKeyReplace) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{10} + return fileDescriptor_14abe0d1b4206d54, []int{12} } func (m *ACLReadKeyReplace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -843,14 +944,14 @@ func (m *ACLReadKeyReplace) GetEncryptedReadKey() []byte { type ACLUserPermissionChange struct { Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - Permissions ACLUserPermissions `protobuf:"varint,2,opt,name=permissions,proto3,enum=acl.ACLUserPermissions" json:"permissions,omitempty"` + Permissions ACLUserPermissions `protobuf:"varint,2,opt,name=permissions,proto3,enum=aclrecord.ACLUserPermissions" json:"permissions,omitempty"` } func (m *ACLUserPermissionChange) Reset() { *m = ACLUserPermissionChange{} } func (m *ACLUserPermissionChange) String() string { return proto.CompactTextString(m) } func (*ACLUserPermissionChange) ProtoMessage() {} func (*ACLUserPermissionChange) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{11} + return fileDescriptor_14abe0d1b4206d54, []int{13} } func (m *ACLUserPermissionChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -893,512 +994,85 @@ func (m *ACLUserPermissionChange) GetPermissions() ACLUserPermissions { return ACLUserPermissions_Admin } -type ACLRecord struct { - PrevId string `protobuf:"bytes,1,opt,name=prevId,proto3" json:"prevId,omitempty"` - Identity []byte `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` - Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` - CurrentReadKeyHash uint64 `protobuf:"varint,4,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` - Timestamp int64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` -} - -func (m *ACLRecord) Reset() { *m = ACLRecord{} } -func (m *ACLRecord) String() string { return proto.CompactTextString(m) } -func (*ACLRecord) ProtoMessage() {} -func (*ACLRecord) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{12} -} -func (m *ACLRecord) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ACLRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ACLRecord.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 *ACLRecord) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLRecord.Merge(m, src) -} -func (m *ACLRecord) XXX_Size() int { - return m.Size() -} -func (m *ACLRecord) XXX_DiscardUnknown() { - xxx_messageInfo_ACLRecord.DiscardUnknown(m) -} - -var xxx_messageInfo_ACLRecord proto.InternalMessageInfo - -func (m *ACLRecord) GetPrevId() string { - if m != nil { - return m.PrevId - } - return "" -} - -func (m *ACLRecord) GetIdentity() []byte { - if m != nil { - return m.Identity - } - return nil -} - -func (m *ACLRecord) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -func (m *ACLRecord) GetCurrentReadKeyHash() uint64 { - if m != nil { - return m.CurrentReadKeyHash - } - return 0 -} - -func (m *ACLRecord) GetTimestamp() int64 { - if m != nil { - return m.Timestamp - } - return 0 -} - -type ACLHeader struct { - FirstId string `protobuf:"bytes,1,opt,name=firstId,proto3" json:"firstId,omitempty"` - Identity []byte `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` -} - -func (m *ACLHeader) Reset() { *m = ACLHeader{} } -func (m *ACLHeader) String() string { return proto.CompactTextString(m) } -func (*ACLHeader) ProtoMessage() {} -func (*ACLHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{13} -} -func (m *ACLHeader) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ACLHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ACLHeader.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 *ACLHeader) XXX_Merge(src proto.Message) { - xxx_messageInfo_ACLHeader.Merge(m, src) -} -func (m *ACLHeader) XXX_Size() int { - return m.Size() -} -func (m *ACLHeader) XXX_DiscardUnknown() { - xxx_messageInfo_ACLHeader.DiscardUnknown(m) -} - -var xxx_messageInfo_ACLHeader proto.InternalMessageInfo - -func (m *ACLHeader) GetFirstId() string { - if m != nil { - return m.FirstId - } - return "" -} - -func (m *ACLHeader) GetIdentity() []byte { - if m != nil { - return m.Identity - } - return nil -} - -type RawTreeChange struct { - Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` -} - -func (m *RawTreeChange) Reset() { *m = RawTreeChange{} } -func (m *RawTreeChange) String() string { return proto.CompactTextString(m) } -func (*RawTreeChange) ProtoMessage() {} -func (*RawTreeChange) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{14} -} -func (m *RawTreeChange) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RawTreeChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RawTreeChange.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 *RawTreeChange) XXX_Merge(src proto.Message) { - xxx_messageInfo_RawTreeChange.Merge(m, src) -} -func (m *RawTreeChange) XXX_Size() int { - return m.Size() -} -func (m *RawTreeChange) XXX_DiscardUnknown() { - xxx_messageInfo_RawTreeChange.DiscardUnknown(m) -} - -var xxx_messageInfo_RawTreeChange proto.InternalMessageInfo - -func (m *RawTreeChange) GetPayload() []byte { - if m != nil { - return m.Payload - } - return nil -} - -func (m *RawTreeChange) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -type RawTreeChangeWithId struct { - RawChange []byte `protobuf:"bytes,1,opt,name=rawChange,proto3" json:"rawChange,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` -} - -func (m *RawTreeChangeWithId) Reset() { *m = RawTreeChangeWithId{} } -func (m *RawTreeChangeWithId) String() string { return proto.CompactTextString(m) } -func (*RawTreeChangeWithId) ProtoMessage() {} -func (*RawTreeChangeWithId) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{15} -} -func (m *RawTreeChangeWithId) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RawTreeChangeWithId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RawTreeChangeWithId.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 *RawTreeChangeWithId) XXX_Merge(src proto.Message) { - xxx_messageInfo_RawTreeChangeWithId.Merge(m, src) -} -func (m *RawTreeChangeWithId) XXX_Size() int { - return m.Size() -} -func (m *RawTreeChangeWithId) XXX_DiscardUnknown() { - xxx_messageInfo_RawTreeChangeWithId.DiscardUnknown(m) -} - -var xxx_messageInfo_RawTreeChangeWithId proto.InternalMessageInfo - -func (m *RawTreeChangeWithId) GetRawChange() []byte { - if m != nil { - return m.RawChange - } - return nil -} - -func (m *RawTreeChangeWithId) GetId() string { - if m != nil { - return m.Id - } - return "" -} - -type TreeChange struct { - TreeHeadIds []string `protobuf:"bytes,1,rep,name=treeHeadIds,proto3" json:"treeHeadIds,omitempty"` - AclHeadId string `protobuf:"bytes,2,opt,name=aclHeadId,proto3" json:"aclHeadId,omitempty"` - SnapshotBaseId string `protobuf:"bytes,3,opt,name=snapshotBaseId,proto3" json:"snapshotBaseId,omitempty"` - ChangesData []byte `protobuf:"bytes,4,opt,name=changesData,proto3" json:"changesData,omitempty"` - CurrentReadKeyHash uint64 `protobuf:"varint,5,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` - Timestamp int64 `protobuf:"varint,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Identity []byte `protobuf:"bytes,7,opt,name=identity,proto3" json:"identity,omitempty"` - IsSnapshot bool `protobuf:"varint,8,opt,name=isSnapshot,proto3" json:"isSnapshot,omitempty"` -} - -func (m *TreeChange) Reset() { *m = TreeChange{} } -func (m *TreeChange) String() string { return proto.CompactTextString(m) } -func (*TreeChange) ProtoMessage() {} -func (*TreeChange) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{16} -} -func (m *TreeChange) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TreeChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TreeChange.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 *TreeChange) XXX_Merge(src proto.Message) { - xxx_messageInfo_TreeChange.Merge(m, src) -} -func (m *TreeChange) XXX_Size() int { - return m.Size() -} -func (m *TreeChange) XXX_DiscardUnknown() { - xxx_messageInfo_TreeChange.DiscardUnknown(m) -} - -var xxx_messageInfo_TreeChange proto.InternalMessageInfo - -func (m *TreeChange) GetTreeHeadIds() []string { - if m != nil { - return m.TreeHeadIds - } - return nil -} - -func (m *TreeChange) GetAclHeadId() string { - if m != nil { - return m.AclHeadId - } - return "" -} - -func (m *TreeChange) GetSnapshotBaseId() string { - if m != nil { - return m.SnapshotBaseId - } - return "" -} - -func (m *TreeChange) GetChangesData() []byte { - if m != nil { - return m.ChangesData - } - return nil -} - -func (m *TreeChange) GetCurrentReadKeyHash() uint64 { - if m != nil { - return m.CurrentReadKeyHash - } - return 0 -} - -func (m *TreeChange) GetTimestamp() int64 { - if m != nil { - return m.Timestamp - } - return 0 -} - -func (m *TreeChange) GetIdentity() []byte { - if m != nil { - return m.Identity - } - return nil -} - -func (m *TreeChange) GetIsSnapshot() bool { - if m != nil { - return m.IsSnapshot - } - return false -} - -type TreeHeader struct { - FirstId string `protobuf:"bytes,1,opt,name=firstId,proto3" json:"firstId,omitempty"` - AclId string `protobuf:"bytes,2,opt,name=aclId,proto3" json:"aclId,omitempty"` - TreeHeaderType TreeHeaderType `protobuf:"varint,3,opt,name=treeHeaderType,proto3,enum=acl.TreeHeaderType" json:"treeHeaderType,omitempty"` - Identity []byte `protobuf:"bytes,4,opt,name=identity,proto3" json:"identity,omitempty"` - Data []byte `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` -} - -func (m *TreeHeader) Reset() { *m = TreeHeader{} } -func (m *TreeHeader) String() string { return proto.CompactTextString(m) } -func (*TreeHeader) ProtoMessage() {} -func (*TreeHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_37a022c841a51877, []int{17} -} -func (m *TreeHeader) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TreeHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TreeHeader.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 *TreeHeader) XXX_Merge(src proto.Message) { - xxx_messageInfo_TreeHeader.Merge(m, src) -} -func (m *TreeHeader) XXX_Size() int { - return m.Size() -} -func (m *TreeHeader) XXX_DiscardUnknown() { - xxx_messageInfo_TreeHeader.DiscardUnknown(m) -} - -var xxx_messageInfo_TreeHeader proto.InternalMessageInfo - -func (m *TreeHeader) GetFirstId() string { - if m != nil { - return m.FirstId - } - return "" -} - -func (m *TreeHeader) GetAclId() string { - if m != nil { - return m.AclId - } - return "" -} - -func (m *TreeHeader) GetTreeHeaderType() TreeHeaderType { - if m != nil { - return m.TreeHeaderType - } - return TreeHeaderType_Object -} - -func (m *TreeHeader) GetIdentity() []byte { - if m != nil { - return m.Identity - } - return nil -} - -func (m *TreeHeader) GetData() []byte { - if m != nil { - return m.Data - } - return nil +func init() { + proto.RegisterEnum("aclrecord.ACLUserPermissions", ACLUserPermissions_name, ACLUserPermissions_value) + proto.RegisterType((*RawACLRecord)(nil), "aclrecord.RawACLRecord") + proto.RegisterType((*RawACLRecordWithId)(nil), "aclrecord.RawACLRecordWithId") + proto.RegisterType((*ACLRecord)(nil), "aclrecord.ACLRecord") + proto.RegisterType((*ACLRoot)(nil), "aclrecord.ACLRoot") + proto.RegisterType((*ACLContentValue)(nil), "aclrecord.ACLContentValue") + proto.RegisterType((*ACLData)(nil), "aclrecord.ACLData") + proto.RegisterType((*ACLState)(nil), "aclrecord.ACLState") + proto.RegisterMapType((map[string]*ACLUserInvite)(nil), "aclrecord.ACLState.InvitesEntry") + proto.RegisterType((*ACLUserState)(nil), "aclrecord.ACLUserState") + proto.RegisterType((*ACLUserAdd)(nil), "aclrecord.ACLUserAdd") + proto.RegisterType((*ACLUserInvite)(nil), "aclrecord.ACLUserInvite") + proto.RegisterType((*ACLUserJoin)(nil), "aclrecord.ACLUserJoin") + proto.RegisterType((*ACLUserRemove)(nil), "aclrecord.ACLUserRemove") + proto.RegisterType((*ACLReadKeyReplace)(nil), "aclrecord.ACLReadKeyReplace") + proto.RegisterType((*ACLUserPermissionChange)(nil), "aclrecord.ACLUserPermissionChange") } func init() { - proto.RegisterEnum("acl.ACLUserPermissions", ACLUserPermissions_name, ACLUserPermissions_value) - proto.RegisterEnum("acl.TreeHeaderType", TreeHeaderType_name, TreeHeaderType_value) - proto.RegisterType((*RawACLRecord)(nil), "acl.RawACLRecord") - proto.RegisterType((*ACLContentValue)(nil), "acl.ACLContentValue") - proto.RegisterType((*ACLData)(nil), "acl.ACLData") - proto.RegisterType((*ACLState)(nil), "acl.ACLState") - proto.RegisterMapType((map[string]*ACLUserInvite)(nil), "acl.ACLState.InvitesEntry") - proto.RegisterType((*ACLUserState)(nil), "acl.ACLUserState") - proto.RegisterType((*ACLUserAdd)(nil), "acl.ACLUserAdd") - proto.RegisterType((*ACLUserConfirm)(nil), "acl.ACLUserConfirm") - proto.RegisterType((*ACLUserInvite)(nil), "acl.ACLUserInvite") - proto.RegisterType((*ACLUserJoin)(nil), "acl.ACLUserJoin") - proto.RegisterType((*ACLUserRemove)(nil), "acl.ACLUserRemove") - proto.RegisterType((*ACLReadKeyReplace)(nil), "acl.ACLReadKeyReplace") - proto.RegisterType((*ACLUserPermissionChange)(nil), "acl.ACLUserPermissionChange") - proto.RegisterType((*ACLRecord)(nil), "acl.ACLRecord") - proto.RegisterType((*ACLHeader)(nil), "acl.ACLHeader") - proto.RegisterType((*RawTreeChange)(nil), "acl.RawTreeChange") - proto.RegisterType((*RawTreeChangeWithId)(nil), "acl.RawTreeChangeWithId") - proto.RegisterType((*TreeChange)(nil), "acl.TreeChange") - proto.RegisterType((*TreeHeader)(nil), "acl.TreeHeader") + proto.RegisterFile("pkg/acl/aclrecordproto/protos/aclrecord.proto", fileDescriptor_14abe0d1b4206d54) } -func init() { - proto.RegisterFile("pkg/acl/aclchanges/aclpb/protos/aclchanges.proto", fileDescriptor_37a022c841a51877) -} - -var fileDescriptor_37a022c841a51877 = []byte{ - // 1078 bytes of a gzipped FileDescriptorProto +var fileDescriptor_14abe0d1b4206d54 = []byte{ + // 862 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0xcd, 0x6e, 0x23, 0x45, - 0x10, 0xf6, 0x8c, 0xe3, 0x38, 0x2e, 0x3b, 0x8e, 0xd3, 0x1b, 0xed, 0x8e, 0xa2, 0xc8, 0x8a, 0x46, - 0x08, 0xa2, 0x80, 0xbc, 0x60, 0x56, 0xe2, 0xef, 0x00, 0x8e, 0x17, 0x61, 0x6f, 0x22, 0x58, 0x75, - 0xc2, 0xae, 0xc4, 0xad, 0x33, 0xd3, 0x9b, 0x34, 0x6b, 0xcf, 0x8c, 0xa6, 0x3b, 0x89, 0x7c, 0xe4, - 0x0d, 0x78, 0x04, 0x38, 0xf2, 0x04, 0xbc, 0x02, 0x12, 0x97, 0x3d, 0x22, 0x71, 0x41, 0xc9, 0x09, - 0x4e, 0x3c, 0x02, 0xea, 0x9f, 0x99, 0xe9, 0xb1, 0x93, 0xf0, 0xa3, 0x15, 0xd2, 0x1e, 0x46, 0xea, - 0xfe, 0xaa, 0xaa, 0xbb, 0xea, 0xab, 0x9a, 0xea, 0x82, 0xb7, 0x93, 0xe7, 0x27, 0xf7, 0x49, 0x30, - 0x91, 0x5f, 0x70, 0x4a, 0xa2, 0x13, 0xca, 0xe5, 0x32, 0x39, 0xbe, 0x9f, 0xa4, 0xb1, 0x88, 0xb9, - 0x85, 0xf7, 0x14, 0x82, 0xaa, 0x24, 0x98, 0xf8, 0x4f, 0xa0, 0x85, 0xc9, 0xc5, 0x60, 0x78, 0x80, - 0x69, 0x10, 0xa7, 0x21, 0xf2, 0xa0, 0x9e, 0x90, 0xd9, 0x24, 0x26, 0xa1, 0xe7, 0x6c, 0x3b, 0x3b, - 0x2d, 0x9c, 0x6d, 0xd1, 0x16, 0x34, 0x38, 0x3b, 0x89, 0x88, 0x38, 0x4b, 0xa9, 0xe7, 0x2a, 0x59, - 0x01, 0xa0, 0x36, 0xb8, 0x2c, 0xf4, 0xaa, 0xdb, 0xce, 0x4e, 0x03, 0xbb, 0x2c, 0xf4, 0xff, 0x74, - 0x61, 0x6d, 0x30, 0x3c, 0x18, 0xc6, 0x91, 0xa0, 0x91, 0x78, 0x42, 0x26, 0x67, 0x14, 0xbd, 0x09, - 0xf5, 0x33, 0x4e, 0xd3, 0x41, 0xa8, 0xcf, 0x6e, 0xf6, 0xd7, 0x7a, 0x24, 0x98, 0xf4, 0x06, 0xc3, - 0x83, 0x2f, 0x35, 0x3c, 0xaa, 0xe0, 0x4c, 0x03, 0x3d, 0x00, 0x90, 0x4b, 0x4c, 0xa7, 0xf1, 0xb9, - 0xbe, 0xaf, 0xd9, 0x47, 0xb6, 0xbe, 0x96, 0x8c, 0x2a, 0xd8, 0xd2, 0x43, 0x18, 0x36, 0xe4, 0xee, - 0x31, 0x4d, 0xa7, 0x8c, 0x73, 0x16, 0x47, 0x43, 0x15, 0xb2, 0x72, 0xac, 0xd9, 0xdf, 0xb2, 0xed, - 0xe7, 0x75, 0x46, 0x15, 0x7c, 0xad, 0x6d, 0xe6, 0xc9, 0x38, 0x3a, 0x67, 0x82, 0x7a, 0x4b, 0x8b, - 0x9e, 0x68, 0x49, 0xe6, 0x89, 0xde, 0xa1, 0x1e, 0xac, 0xc8, 0xdd, 0xa3, 0x98, 0x45, 0x5e, 0x4d, - 0xd9, 0x74, 0x6c, 0x1b, 0x89, 0x8f, 0x2a, 0x38, 0xd7, 0x41, 0xef, 0x41, 0x53, 0xae, 0x87, 0x71, - 0xf4, 0x8c, 0xa5, 0x53, 0x6f, 0x59, 0x99, 0xdc, 0xb1, 0x4d, 0x8c, 0x68, 0x54, 0xc1, 0xb6, 0xe6, - 0x5e, 0x1d, 0x6a, 0xe7, 0x92, 0x5e, 0xff, 0x63, 0xa8, 0x0f, 0x86, 0x07, 0x0f, 0x89, 0x20, 0xd2, - 0x65, 0x12, 0x4c, 0x0c, 0xf9, 0x9e, 0xb3, 0x5d, 0xdd, 0x69, 0xf6, 0x37, 0xb2, 0xb3, 0xec, 0x9c, - 0x60, 0x4b, 0xcf, 0xff, 0xdd, 0x81, 0x95, 0xc1, 0xf0, 0xe0, 0x50, 0x10, 0x41, 0xd1, 0x6b, 0xb0, - 0x9a, 0x52, 0x12, 0xee, 0xd3, 0xd9, 0x88, 0xf0, 0x53, 0xca, 0xd5, 0x29, 0x4b, 0xb8, 0x0c, 0xa2, - 0x77, 0x34, 0x37, 0xca, 0x84, 0x7b, 0xae, 0xba, 0x68, 0xdd, 0x76, 0x5a, 0x49, 0xb0, 0xa5, 0x84, - 0x1e, 0x40, 0x9d, 0x29, 0x8a, 0xb8, 0x57, 0x55, 0xfa, 0x9b, 0x99, 0xbe, 0x52, 0xe8, 0x69, 0xfe, - 0xf8, 0xa7, 0x91, 0x48, 0x67, 0x38, 0x53, 0xdd, 0xfc, 0x1c, 0x5a, 0xb6, 0x00, 0x75, 0xa0, 0xfa, - 0x9c, 0xce, 0x54, 0x1d, 0x35, 0xb0, 0x5c, 0xa2, 0x1d, 0xc3, 0xc3, 0x75, 0xb5, 0xa2, 0x4d, 0xb1, - 0x56, 0xf8, 0xd0, 0x7d, 0xdf, 0xf1, 0x7f, 0x75, 0xa0, 0x65, 0xbb, 0x88, 0x36, 0x61, 0x85, 0x85, - 0x34, 0x12, 0x4c, 0xcc, 0x4c, 0xe5, 0xe7, 0x7b, 0xc9, 0x05, 0x8d, 0x82, 0x74, 0x96, 0x08, 0x16, - 0x47, 0xfb, 0x74, 0x66, 0xca, 0xbf, 0x0c, 0xa2, 0xb7, 0x60, 0xdd, 0x00, 0x34, 0xc4, 0x9a, 0x25, - 0x1d, 0x62, 0x0b, 0x2f, 0x0a, 0xd0, 0x07, 0xd0, 0x4c, 0xf2, 0x4a, 0xe3, 0xaa, 0xac, 0xda, 0xfd, - 0x7b, 0xd7, 0x17, 0x28, 0xc7, 0xb6, 0x2e, 0xda, 0x86, 0x26, 0xe3, 0x26, 0xfd, 0x34, 0x54, 0xd5, - 0xb5, 0x82, 0x6d, 0xc8, 0xff, 0xd1, 0x01, 0x28, 0x7e, 0xab, 0x57, 0x28, 0x36, 0xff, 0x11, 0xb4, - 0xcb, 0xe5, 0x7e, 0xab, 0xf3, 0x5b, 0xd0, 0x30, 0xfd, 0x62, 0x1c, 0x2a, 0xc7, 0x1b, 0xb8, 0x00, - 0xfc, 0x3f, 0x1c, 0x58, 0x2d, 0x15, 0x00, 0xda, 0x81, 0x35, 0x12, 0x04, 0x34, 0x11, 0x8f, 0xcf, - 0x8e, 0x27, 0x2c, 0xd8, 0xa7, 0xd9, 0x91, 0xf3, 0x30, 0xda, 0x85, 0x8e, 0x89, 0xab, 0x50, 0xd5, - 0xcc, 0x2c, 0xe0, 0xff, 0x5f, 0xe2, 0x25, 0x15, 0x2a, 0x90, 0xb1, 0xce, 0x7a, 0x03, 0xe7, 0x7b, - 0xff, 0x67, 0x07, 0x9a, 0x56, 0x6f, 0x79, 0x09, 0x39, 0xcf, 0xc9, 0x3a, 0xcc, 0xdb, 0x7e, 0xd5, - 0x26, 0x2b, 0x87, 0x91, 0x0f, 0xad, 0xa2, 0xf3, 0x8d, 0x43, 0x15, 0x53, 0x03, 0x97, 0xb0, 0xeb, - 0x49, 0xaa, 0xdd, 0x40, 0x92, 0x3f, 0xcd, 0x33, 0x67, 0x1a, 0xfb, 0x6d, 0xe1, 0x7c, 0x02, 0x6b, - 0xa6, 0x2b, 0x61, 0x9a, 0x4c, 0x48, 0x90, 0x77, 0x96, 0xbb, 0x19, 0xab, 0xb8, 0x24, 0xc6, 0xf3, - 0xea, 0xfe, 0x37, 0x0e, 0xac, 0x2f, 0xa8, 0xbd, 0x04, 0x0a, 0x8b, 0x2a, 0xca, 0x63, 0x33, 0x1c, - 0x2e, 0xe0, 0x7e, 0x02, 0xf7, 0x6e, 0x78, 0x99, 0x6e, 0x75, 0x64, 0xae, 0x9c, 0xdc, 0x7f, 0xf1, - 0xaf, 0x7d, 0xef, 0x40, 0xa3, 0x78, 0xf9, 0xef, 0xc2, 0x72, 0x92, 0xd2, 0xf3, 0x71, 0x68, 0x9a, - 0xaa, 0xd9, 0x95, 0x2e, 0x77, 0xe7, 0x2e, 0x47, 0xb0, 0x14, 0x12, 0x41, 0x4c, 0x4c, 0x6a, 0x8d, - 0x7a, 0x80, 0x82, 0xb3, 0x34, 0xa5, 0x91, 0xc0, 0xc5, 0x53, 0xa1, 0x4a, 0x62, 0x09, 0x5f, 0x23, - 0x91, 0xff, 0xb0, 0x60, 0x53, 0xca, 0x05, 0x99, 0x26, 0xaa, 0xaa, 0xab, 0xb8, 0x00, 0xfc, 0x81, - 0x72, 0x71, 0x44, 0x49, 0x48, 0x53, 0x39, 0x9c, 0x3c, 0x63, 0x29, 0x17, 0xb9, 0x8f, 0xd9, 0xf6, - 0x36, 0x27, 0xfd, 0xcf, 0x60, 0x15, 0x93, 0x8b, 0xa3, 0x94, 0x52, 0x43, 0xe7, 0x7f, 0x9c, 0x71, - 0xfc, 0x21, 0xdc, 0x29, 0x1d, 0xf4, 0x94, 0x89, 0xd3, 0xb1, 0x32, 0x4a, 0xc9, 0x85, 0x19, 0x34, - 0xf4, 0x81, 0x05, 0x60, 0x06, 0x23, 0x37, 0x1f, 0x8c, 0xbe, 0x73, 0x01, 0x2c, 0x5f, 0xb6, 0xa1, - 0x29, 0x52, 0x4a, 0x65, 0x80, 0xe3, 0x50, 0x3f, 0xb2, 0x0d, 0x6c, 0x43, 0xf2, 0x78, 0x12, 0x4c, - 0xf4, 0x2e, 0xeb, 0x71, 0x39, 0x80, 0x5e, 0x87, 0x36, 0x8f, 0x48, 0xc2, 0x4f, 0x63, 0xb1, 0x47, - 0xb8, 0xfc, 0xf9, 0xf4, 0x0c, 0x36, 0x87, 0xca, 0x7b, 0xcc, 0xf4, 0x27, 0x07, 0x04, 0x95, 0x8e, - 0x16, 0xb6, 0xa1, 0x1b, 0xf2, 0x56, 0xfb, 0x67, 0x79, 0x5b, 0x9e, 0xcb, 0x5b, 0x29, 0x21, 0xf5, - 0xb9, 0xaa, 0xe9, 0x02, 0x30, 0x7e, 0x68, 0xfc, 0xf3, 0x56, 0xd4, 0xf3, 0x65, 0x21, 0xfe, 0x0f, - 0x8e, 0xa6, 0xe8, 0x6f, 0xb3, 0xbe, 0x01, 0x35, 0x12, 0x4c, 0x72, 0x5a, 0xf4, 0x06, 0x7d, 0x04, - 0x6d, 0x91, 0x5b, 0x1f, 0xcd, 0x12, 0xdd, 0xb6, 0xda, 0x66, 0x98, 0x3a, 0x2a, 0x89, 0xf0, 0x9c, - 0x6a, 0xc9, 0xef, 0xa5, 0x1b, 0xaa, 0xbd, 0x56, 0x54, 0xfb, 0xee, 0x43, 0x40, 0x8b, 0xbf, 0x19, - 0x6a, 0x40, 0x6d, 0x10, 0x4e, 0x59, 0xd4, 0xa9, 0x20, 0x80, 0xe5, 0xa7, 0x29, 0x13, 0x34, 0xed, - 0x38, 0x72, 0x8d, 0xd5, 0x55, 0x1d, 0x17, 0x35, 0xa1, 0xae, 0x5b, 0x5b, 0xd8, 0xa9, 0xee, 0xbe, - 0x01, 0xed, 0xb2, 0x5f, 0x52, 0xf5, 0x8b, 0xe3, 0xaf, 0x69, 0x20, 0x3a, 0x15, 0x79, 0xda, 0x61, - 0x42, 0x02, 0xda, 0x71, 0xf6, 0xfa, 0x3f, 0x5d, 0x76, 0x9d, 0x17, 0x97, 0x5d, 0xe7, 0xb7, 0xcb, - 0xae, 0xf3, 0xed, 0x55, 0xb7, 0xf2, 0xe2, 0xaa, 0x5b, 0xf9, 0xe5, 0xaa, 0x5b, 0xf9, 0xca, 0xbb, - 0x69, 0xfe, 0x3f, 0x5e, 0x56, 0xe3, 0xfe, 0xbb, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x62, - 0x40, 0x97, 0x22, 0x0c, 0x00, 0x00, + 0x10, 0x76, 0x8f, 0x9d, 0x38, 0x53, 0xe3, 0xdd, 0x78, 0x5b, 0x90, 0x1d, 0x45, 0x8b, 0x65, 0x8d, + 0x38, 0x58, 0x2b, 0xf0, 0x82, 0x41, 0x5a, 0x94, 0x03, 0xc8, 0x6b, 0x76, 0x65, 0x93, 0x1c, 0x56, + 0x1d, 0x60, 0x11, 0xb7, 0xde, 0x99, 0x26, 0x69, 0xad, 0x3d, 0x33, 0xea, 0x6e, 0x1b, 0xf9, 0xc8, + 0x1b, 0xf0, 0x0a, 0x3c, 0x08, 0x27, 0x2e, 0x1c, 0x73, 0x41, 0xe2, 0x08, 0xc9, 0x0b, 0x70, 0xe7, + 0x82, 0xba, 0xe7, 0xdf, 0xe3, 0x58, 0x42, 0x8a, 0x90, 0x38, 0x24, 0x9e, 0xaa, 0xfa, 0xaa, 0xfc, + 0xd5, 0xd7, 0x35, 0xd5, 0x86, 0xf7, 0xe3, 0x37, 0x17, 0x4f, 0xa8, 0x3f, 0xd7, 0x7f, 0x82, 0xf9, + 0x91, 0x08, 0x62, 0x11, 0xa9, 0xe8, 0x89, 0xf9, 0x2f, 0x0b, 0xef, 0xd0, 0x38, 0xb0, 0x9d, 0x3b, + 0xbc, 0x17, 0xd0, 0x21, 0xf4, 0xfb, 0xf1, 0xe4, 0x8c, 0x18, 0x1b, 0xbb, 0xd0, 0x8e, 0xe9, 0x7a, + 0x1e, 0xd1, 0xc0, 0x45, 0x7d, 0x34, 0xe8, 0x90, 0xcc, 0xc4, 0x8f, 0xc0, 0x96, 0xfc, 0x22, 0xa4, + 0x6a, 0x29, 0x98, 0x6b, 0x99, 0x58, 0xe1, 0xf0, 0x3e, 0x05, 0x5c, 0xae, 0xf3, 0x8a, 0xab, 0xcb, + 0xd9, 0xae, 0x6a, 0xf7, 0xc1, 0xe2, 0x81, 0x29, 0x63, 0x13, 0x8b, 0x07, 0xde, 0x4f, 0x08, 0xec, + 0x82, 0xc5, 0x11, 0xec, 0xc7, 0x82, 0xad, 0x66, 0x49, 0x9a, 0x4d, 0x52, 0x0b, 0x1f, 0xc3, 0x01, + 0x0f, 0x58, 0xa8, 0xb8, 0x5a, 0xa7, 0x14, 0x72, 0x1b, 0x63, 0x68, 0x05, 0x54, 0x51, 0xb7, 0x69, + 0xfc, 0xe6, 0x19, 0x0f, 0x01, 0xfb, 0x4b, 0x21, 0x58, 0xa8, 0x08, 0xa3, 0xc1, 0x29, 0x5b, 0x4f, + 0xa9, 0xbc, 0x74, 0x5b, 0x7d, 0x34, 0x68, 0x91, 0x2d, 0x11, 0xdd, 0xa3, 0xe2, 0x0b, 0x26, 0x15, + 0x5d, 0xc4, 0xee, 0x5e, 0x1f, 0x0d, 0x9a, 0xa4, 0x70, 0x78, 0x3f, 0x23, 0x68, 0x6b, 0x8e, 0x51, + 0xa4, 0x2a, 0x4c, 0xd0, 0x06, 0x93, 0x77, 0xe1, 0x1e, 0x0b, 0x7d, 0xb1, 0x8e, 0x15, 0x8f, 0xc2, + 0x53, 0x96, 0x51, 0xad, 0x3a, 0xb5, 0x36, 0x32, 0xa6, 0x3e, 0x9b, 0x05, 0x86, 0xb2, 0x4d, 0x32, + 0x13, 0x3f, 0x86, 0x6e, 0x0a, 0x65, 0x41, 0xca, 0xce, 0x70, 0xee, 0x90, 0x9a, 0x5f, 0x63, 0x03, + 0x26, 0xf8, 0x8a, 0xea, 0xb2, 0xe7, 0xfe, 0x25, 0x5b, 0x30, 0x43, 0xdc, 0x26, 0x35, 0xbf, 0xf7, + 0x9b, 0x05, 0x87, 0xe3, 0xc9, 0xd9, 0x24, 0x0a, 0x15, 0x0b, 0xd5, 0xd7, 0x74, 0xbe, 0x64, 0xf8, + 0x43, 0x68, 0x2f, 0x25, 0x13, 0xe3, 0x20, 0x91, 0xda, 0x19, 0xbd, 0x3d, 0x2c, 0xa6, 0x65, 0x3c, + 0x39, 0xfb, 0x2a, 0x09, 0x4e, 0x1b, 0x24, 0xc3, 0xe1, 0x13, 0x00, 0xfd, 0x48, 0xd8, 0x22, 0x5a, + 0x25, 0x93, 0xe0, 0x8c, 0xdc, 0x7a, 0x56, 0x12, 0x9f, 0x36, 0x48, 0x09, 0x8d, 0xbf, 0x81, 0xb7, + 0xb4, 0xf5, 0x92, 0x89, 0x05, 0x97, 0x92, 0x47, 0xe1, 0xe4, 0x92, 0x86, 0x17, 0xcc, 0x28, 0xe0, + 0x8c, 0xbc, 0x7a, 0x95, 0x4d, 0xe4, 0xb4, 0x41, 0xb6, 0x56, 0xc8, 0x58, 0xcd, 0xc2, 0x15, 0x57, + 0xcc, 0xc8, 0xb5, 0x95, 0x55, 0x12, 0xcf, 0x58, 0x25, 0x16, 0xfe, 0x18, 0x0e, 0xb4, 0xf5, 0x45, + 0xc4, 0x43, 0x23, 0x9e, 0x33, 0x3a, 0xaa, 0x67, 0xea, 0xe8, 0xb4, 0x41, 0x72, 0xe4, 0xb3, 0x36, + 0xec, 0xad, 0xb4, 0x86, 0xde, 0x73, 0x33, 0x16, 0x9f, 0xeb, 0x81, 0x3b, 0x01, 0xa0, 0xfe, 0x3c, + 0x55, 0xd8, 0x45, 0xfd, 0xe6, 0xc0, 0x19, 0x1d, 0x57, 0x6b, 0x95, 0xe5, 0x27, 0x25, 0xb4, 0xf7, + 0x37, 0x82, 0x83, 0xf1, 0xe4, 0xec, 0x5c, 0x51, 0xc5, 0xf4, 0x0c, 0x89, 0x62, 0x30, 0x99, 0x34, + 0xb5, 0x5a, 0xa4, 0xea, 0xc4, 0x4f, 0x93, 0xa6, 0x4d, 0x8a, 0x74, 0x2d, 0xf3, 0x75, 0x0f, 0xeb, + 0xd4, 0x4d, 0x9c, 0x94, 0xa0, 0xf8, 0x04, 0xda, 0xdc, 0xf4, 0x2e, 0xdd, 0xa6, 0xc9, 0xea, 0x57, + 0xb3, 0x0c, 0x6c, 0x98, 0xc8, 0x23, 0x9f, 0x87, 0x4a, 0xac, 0x49, 0x96, 0x70, 0xfc, 0x25, 0x74, + 0xca, 0x01, 0xdc, 0x85, 0xe6, 0x1b, 0xb6, 0x4e, 0xdf, 0x54, 0xfd, 0x88, 0x87, 0xa9, 0x32, 0xb7, + 0x0f, 0x47, 0x52, 0x80, 0x24, 0xb0, 0x13, 0xeb, 0x13, 0xe4, 0xfd, 0x89, 0xa0, 0x53, 0xa6, 0x7b, + 0x07, 0x6f, 0xd8, 0x7b, 0xf0, 0x60, 0xf3, 0x7d, 0x49, 0xda, 0xed, 0x90, 0x7a, 0x00, 0x7f, 0x06, + 0x4e, 0x9c, 0x0f, 0x95, 0x34, 0x13, 0x74, 0x7f, 0xf4, 0xce, 0xae, 0x89, 0x94, 0xa4, 0x9c, 0x81, + 0xfb, 0xe0, 0x70, 0x39, 0x89, 0xc2, 0xef, 0xb8, 0x58, 0xb0, 0xc0, 0x0c, 0xd2, 0x01, 0x29, 0xbb, + 0xf4, 0x02, 0x81, 0xe2, 0x9d, 0xfa, 0xdf, 0x75, 0xe8, 0xfd, 0x85, 0xe0, 0x5e, 0xe5, 0x00, 0xf1, + 0x00, 0x0e, 0xa9, 0xef, 0xb3, 0x58, 0xbd, 0x5c, 0xbe, 0x9e, 0x73, 0xff, 0x94, 0x65, 0x9d, 0x6c, + 0xba, 0x4b, 0x4b, 0xad, 0x80, 0x5a, 0x95, 0xa5, 0x56, 0x60, 0xff, 0xe3, 0x83, 0xd3, 0xe7, 0x60, + 0xda, 0x99, 0x05, 0xe9, 0xee, 0xcc, 0x6d, 0xef, 0x17, 0x04, 0x4e, 0x69, 0x01, 0xdc, 0xc1, 0x99, + 0xe5, 0x92, 0x9d, 0xe7, 0xb7, 0x69, 0xb3, 0x2c, 0x59, 0xee, 0xae, 0xf0, 0x6a, 0x55, 0x79, 0x6d, + 0x97, 0x68, 0xef, 0x16, 0x89, 0x3c, 0x99, 0x9f, 0x5b, 0xba, 0x87, 0x77, 0xb5, 0xf1, 0x02, 0x0e, + 0xd3, 0x2d, 0x43, 0x58, 0x3c, 0xa7, 0x7e, 0xbe, 0x23, 0x1e, 0x55, 0x35, 0x25, 0x15, 0x10, 0xd9, + 0x4c, 0xf2, 0x7e, 0x40, 0xf0, 0xa0, 0x06, 0xbb, 0x03, 0x01, 0xb7, 0x5d, 0x8f, 0xcd, 0xed, 0xd7, + 0xa3, 0xb7, 0x82, 0x87, 0xb7, 0x5c, 0x24, 0x3b, 0x89, 0x6c, 0x8c, 0x94, 0xf5, 0x6f, 0x47, 0xea, + 0xf1, 0x53, 0xc0, 0x75, 0x08, 0xb6, 0x61, 0x6f, 0x1c, 0x2c, 0x78, 0xd8, 0x6d, 0x60, 0x80, 0xfd, + 0x57, 0x82, 0x2b, 0x26, 0xba, 0x48, 0x3f, 0x6b, 0xbe, 0x4c, 0x74, 0xad, 0x67, 0x1f, 0xfc, 0x7a, + 0xdd, 0x43, 0x57, 0xd7, 0x3d, 0xf4, 0xc7, 0x75, 0x0f, 0xfd, 0x78, 0xd3, 0x6b, 0x5c, 0xdd, 0xf4, + 0x1a, 0xbf, 0xdf, 0xf4, 0x1a, 0xdf, 0x1e, 0x6d, 0xff, 0x8d, 0xf7, 0x7a, 0xdf, 0x7c, 0x7c, 0xf4, + 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x93, 0x89, 0xed, 0xeb, 0x04, 0x0a, 0x00, 0x00, } func (m *RawACLRecord) Marshal() (dAtA []byte, err error) { @@ -1421,24 +1095,166 @@ func (m *RawACLRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x1a - } if len(m.Signature) > 0 { i -= len(m.Signature) copy(dAtA[i:], m.Signature) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Signature))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Signature))) i-- dAtA[i] = 0x12 } if len(m.Payload) > 0 { i -= len(m.Payload) copy(dAtA[i:], m.Payload) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Payload))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Payload))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RawACLRecordWithId) 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 *RawACLRecordWithId) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RawACLRecordWithId) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.Payload) > 0 { + i -= len(m.Payload) + copy(dAtA[i:], m.Payload) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Payload))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ACLRecord) 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 *ACLRecord) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ACLRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Timestamp != 0 { + i = encodeVarintAclrecord(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x28 + } + if m.CurrentReadKeyHash != 0 { + i = encodeVarintAclrecord(dAtA, i, uint64(m.CurrentReadKeyHash)) + i-- + dAtA[i] = 0x20 + } + if len(m.Data) > 0 { + i -= len(m.Data) + copy(dAtA[i:], m.Data) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Data))) + i-- + dAtA[i] = 0x1a + } + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Identity))) + i-- + dAtA[i] = 0x12 + } + if len(m.PrevId) > 0 { + i -= len(m.PrevId) + copy(dAtA[i:], m.PrevId) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.PrevId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ACLRoot) 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 *ACLRoot) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ACLRoot) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.DerivationScheme) > 0 { + i -= len(m.DerivationScheme) + copy(dAtA[i:], m.DerivationScheme) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.DerivationScheme))) + i-- + dAtA[i] = 0x2a + } + if len(m.EncryptedReadKey) > 0 { + i -= len(m.EncryptedReadKey) + copy(dAtA[i:], m.EncryptedReadKey) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptedReadKey))) + i-- + dAtA[i] = 0x22 + } + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0x1a + } + if len(m.EncryptionKey) > 0 { + i -= len(m.EncryptionKey) + copy(dAtA[i:], m.EncryptionKey) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptionKey))) + i-- + dAtA[i] = 0x12 + } + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Identity))) i-- dAtA[i] = 0xa } @@ -1491,7 +1307,7 @@ func (m *ACLContentValue_UserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) return 0, err } i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) + i = encodeVarintAclrecord(dAtA, i, uint64(size)) } i-- dAtA[i] = 0xa @@ -1512,7 +1328,7 @@ func (m *ACLContentValue_UserRemove) MarshalToSizedBuffer(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) + i = encodeVarintAclrecord(dAtA, i, uint64(size)) } i-- dAtA[i] = 0x12 @@ -1533,7 +1349,7 @@ func (m *ACLContentValue_UserPermissionChange) MarshalToSizedBuffer(dAtA []byte) return 0, err } i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) + i = encodeVarintAclrecord(dAtA, i, uint64(size)) } i-- dAtA[i] = 0x1a @@ -1554,7 +1370,7 @@ func (m *ACLContentValue_UserInvite) MarshalToSizedBuffer(dAtA []byte) (int, err return 0, err } i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) + i = encodeVarintAclrecord(dAtA, i, uint64(size)) } i-- dAtA[i] = 0x22 @@ -1575,34 +1391,13 @@ func (m *ACLContentValue_UserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error return 0, err } i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) + i = encodeVarintAclrecord(dAtA, i, uint64(size)) } i-- dAtA[i] = 0x2a } return len(dAtA) - i, nil } -func (m *ACLContentValue_UserConfirm) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ACLContentValue_UserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.UserConfirm != nil { - { - size, err := m.UserConfirm.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - return len(dAtA) - i, nil -} func (m *ACLData) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1631,7 +1426,7 @@ func (m *ACLData) MarshalToSizedBuffer(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) + i = encodeVarintAclrecord(dAtA, i, uint64(size)) } i-- dAtA[i] = 0xa @@ -1671,17 +1466,17 @@ func (m *ACLState) MarshalToSizedBuffer(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) + i = encodeVarintAclrecord(dAtA, i, uint64(size)) } i-- dAtA[i] = 0x12 } i -= len(k) copy(dAtA[i:], k) - i = encodeVarintAclchanges(dAtA, i, uint64(len(k))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa - i = encodeVarintAclchanges(dAtA, i, uint64(baseI-i)) + i = encodeVarintAclrecord(dAtA, i, uint64(baseI-i)) i-- dAtA[i] = 0x1a } @@ -1694,27 +1489,27 @@ func (m *ACLState) MarshalToSizedBuffer(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) + i = encodeVarintAclrecord(dAtA, i, uint64(size)) } i-- dAtA[i] = 0x12 } } if len(m.ReadKeyHashes) > 0 { - dAtA9 := make([]byte, len(m.ReadKeyHashes)*10) - var j8 int + dAtA8 := make([]byte, len(m.ReadKeyHashes)*10) + var j7 int for _, num := range m.ReadKeyHashes { for num >= 1<<7 { - dAtA9[j8] = uint8(uint64(num)&0x7f | 0x80) + dAtA8[j7] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j8++ + j7++ } - dAtA9[j8] = uint8(num) - j8++ + dAtA8[j7] = uint8(num) + j7++ } - i -= j8 - copy(dAtA[i:], dAtA9[:j8]) - i = encodeVarintAclchanges(dAtA, i, uint64(j8)) + i -= j7 + copy(dAtA[i:], dAtA8[:j7]) + i = encodeVarintAclrecord(dAtA, i, uint64(j7)) i-- dAtA[i] = 0xa } @@ -1752,7 +1547,7 @@ func (m *ACLUserState) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x28 } if m.Permissions != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.Permissions)) + i = encodeVarintAclrecord(dAtA, i, uint64(m.Permissions)) i-- dAtA[i] = 0x20 } @@ -1760,7 +1555,7 @@ func (m *ACLUserState) MarshalToSizedBuffer(dAtA []byte) (int, error) { for iNdEx := len(m.EncryptedReadKeys) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.EncryptedReadKeys[iNdEx]) copy(dAtA[i:], m.EncryptedReadKeys[iNdEx]) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.EncryptedReadKeys[iNdEx]))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptedReadKeys[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -1768,14 +1563,14 @@ func (m *ACLUserState) MarshalToSizedBuffer(dAtA []byte) (int, error) { if len(m.EncryptionKey) > 0 { i -= len(m.EncryptionKey) copy(dAtA[i:], m.EncryptionKey) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.EncryptionKey))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptionKey))) i-- dAtA[i] = 0x12 } if len(m.Identity) > 0 { i -= len(m.Identity) copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Identity))) i-- dAtA[i] = 0xa } @@ -1803,7 +1598,7 @@ func (m *ACLUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if m.Permissions != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.Permissions)) + i = encodeVarintAclrecord(dAtA, i, uint64(m.Permissions)) i-- dAtA[i] = 0x20 } @@ -1811,7 +1606,7 @@ func (m *ACLUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { for iNdEx := len(m.EncryptedReadKeys) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.EncryptedReadKeys[iNdEx]) copy(dAtA[i:], m.EncryptedReadKeys[iNdEx]) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.EncryptedReadKeys[iNdEx]))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptedReadKeys[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -1819,51 +1614,14 @@ func (m *ACLUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { if len(m.EncryptionKey) > 0 { i -= len(m.EncryptionKey) copy(dAtA[i:], m.EncryptionKey) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.EncryptionKey))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptionKey))) i-- dAtA[i] = 0x12 } if len(m.Identity) > 0 { i -= len(m.Identity) copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ACLUserConfirm) 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 *ACLUserConfirm) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ACLUserConfirm) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.UserAddId) > 0 { - i -= len(m.UserAddId) - copy(dAtA[i:], m.UserAddId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.UserAddId))) - i-- - dAtA[i] = 0x12 - } - if len(m.Identity) > 0 { - i -= len(m.Identity) - copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Identity))) i-- dAtA[i] = 0xa } @@ -1893,12 +1651,12 @@ func (m *ACLUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { if len(m.InviteId) > 0 { i -= len(m.InviteId) copy(dAtA[i:], m.InviteId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.InviteId))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.InviteId))) i-- dAtA[i] = 0x2a } if m.Permissions != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.Permissions)) + i = encodeVarintAclrecord(dAtA, i, uint64(m.Permissions)) i-- dAtA[i] = 0x20 } @@ -1906,7 +1664,7 @@ func (m *ACLUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { for iNdEx := len(m.EncryptedReadKeys) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.EncryptedReadKeys[iNdEx]) copy(dAtA[i:], m.EncryptedReadKeys[iNdEx]) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.EncryptedReadKeys[iNdEx]))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptedReadKeys[iNdEx]))) i-- dAtA[i] = 0x1a } @@ -1914,14 +1672,14 @@ func (m *ACLUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { if len(m.EncryptPublicKey) > 0 { i -= len(m.EncryptPublicKey) copy(dAtA[i:], m.EncryptPublicKey) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.EncryptPublicKey))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptPublicKey))) i-- dAtA[i] = 0x12 } if len(m.AcceptPublicKey) > 0 { i -= len(m.AcceptPublicKey) copy(dAtA[i:], m.AcceptPublicKey) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.AcceptPublicKey))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.AcceptPublicKey))) i-- dAtA[i] = 0xa } @@ -1952,36 +1710,36 @@ func (m *ACLUserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { for iNdEx := len(m.EncryptedReadKeys) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.EncryptedReadKeys[iNdEx]) copy(dAtA[i:], m.EncryptedReadKeys[iNdEx]) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.EncryptedReadKeys[iNdEx]))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptedReadKeys[iNdEx]))) i-- dAtA[i] = 0x2a } } - if len(m.UserInviteId) > 0 { - i -= len(m.UserInviteId) - copy(dAtA[i:], m.UserInviteId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.UserInviteId))) + if len(m.InviteId) > 0 { + i -= len(m.InviteId) + copy(dAtA[i:], m.InviteId) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.InviteId))) i-- dAtA[i] = 0x22 } if len(m.AcceptSignature) > 0 { i -= len(m.AcceptSignature) copy(dAtA[i:], m.AcceptSignature) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.AcceptSignature))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.AcceptSignature))) i-- dAtA[i] = 0x1a } if len(m.EncryptionKey) > 0 { i -= len(m.EncryptionKey) copy(dAtA[i:], m.EncryptionKey) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.EncryptionKey))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptionKey))) i-- dAtA[i] = 0x12 } if len(m.Identity) > 0 { i -= len(m.Identity) copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Identity))) i-- dAtA[i] = 0xa } @@ -2016,7 +1774,7 @@ func (m *ACLUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { return 0, err } i -= size - i = encodeVarintAclchanges(dAtA, i, uint64(size)) + i = encodeVarintAclrecord(dAtA, i, uint64(size)) } i-- dAtA[i] = 0x1a @@ -2025,7 +1783,7 @@ func (m *ACLUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { if len(m.Identity) > 0 { i -= len(m.Identity) copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Identity))) i-- dAtA[i] = 0xa } @@ -2055,21 +1813,21 @@ func (m *ACLReadKeyReplace) MarshalToSizedBuffer(dAtA []byte) (int, error) { if len(m.EncryptedReadKey) > 0 { i -= len(m.EncryptedReadKey) copy(dAtA[i:], m.EncryptedReadKey) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.EncryptedReadKey))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptedReadKey))) i-- dAtA[i] = 0x1a } if len(m.EncryptionKey) > 0 { i -= len(m.EncryptionKey) copy(dAtA[i:], m.EncryptionKey) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.EncryptionKey))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptionKey))) i-- dAtA[i] = 0x12 } if len(m.Identity) > 0 { i -= len(m.Identity) copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Identity))) i-- dAtA[i] = 0xa } @@ -2097,323 +1855,22 @@ func (m *ACLUserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) var l int _ = l if m.Permissions != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.Permissions)) + i = encodeVarintAclrecord(dAtA, i, uint64(m.Permissions)) i-- dAtA[i] = 0x10 } if len(m.Identity) > 0 { i -= len(m.Identity) copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.Identity))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ACLRecord) 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 *ACLRecord) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ACLRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Timestamp != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.Timestamp)) - i-- - dAtA[i] = 0x28 - } - if m.CurrentReadKeyHash != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.CurrentReadKeyHash)) - i-- - dAtA[i] = 0x20 - } - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x1a - } - if len(m.Identity) > 0 { - i -= len(m.Identity) - copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) - i-- - dAtA[i] = 0x12 - } - if len(m.PrevId) > 0 { - i -= len(m.PrevId) - copy(dAtA[i:], m.PrevId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.PrevId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ACLHeader) 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 *ACLHeader) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ACLHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Identity) > 0 { - i -= len(m.Identity) - copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) - i-- - dAtA[i] = 0x12 - } - if len(m.FirstId) > 0 { - i -= len(m.FirstId) - copy(dAtA[i:], m.FirstId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.FirstId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RawTreeChange) 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 *RawTreeChange) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RawTreeChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signature) > 0 { - i -= len(m.Signature) - copy(dAtA[i:], m.Signature) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Signature))) - i-- - dAtA[i] = 0x12 - } - if len(m.Payload) > 0 { - i -= len(m.Payload) - copy(dAtA[i:], m.Payload) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Payload))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RawTreeChangeWithId) 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 *RawTreeChangeWithId) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RawTreeChangeWithId) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x12 - } - if len(m.RawChange) > 0 { - i -= len(m.RawChange) - copy(dAtA[i:], m.RawChange) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.RawChange))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TreeChange) 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 *TreeChange) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TreeChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.IsSnapshot { - i-- - if m.IsSnapshot { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x40 - } - if len(m.Identity) > 0 { - i -= len(m.Identity) - copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) - i-- - dAtA[i] = 0x3a - } - if m.Timestamp != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.Timestamp)) - i-- - dAtA[i] = 0x30 - } - if m.CurrentReadKeyHash != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.CurrentReadKeyHash)) - i-- - dAtA[i] = 0x28 - } - if len(m.ChangesData) > 0 { - i -= len(m.ChangesData) - copy(dAtA[i:], m.ChangesData) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.ChangesData))) - i-- - dAtA[i] = 0x22 - } - if len(m.SnapshotBaseId) > 0 { - i -= len(m.SnapshotBaseId) - copy(dAtA[i:], m.SnapshotBaseId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.SnapshotBaseId))) - i-- - dAtA[i] = 0x1a - } - if len(m.AclHeadId) > 0 { - i -= len(m.AclHeadId) - copy(dAtA[i:], m.AclHeadId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.AclHeadId))) - i-- - dAtA[i] = 0x12 - } - if len(m.TreeHeadIds) > 0 { - for iNdEx := len(m.TreeHeadIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TreeHeadIds[iNdEx]) - copy(dAtA[i:], m.TreeHeadIds[iNdEx]) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.TreeHeadIds[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *TreeHeader) 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 *TreeHeader) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TreeHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x2a - } - if len(m.Identity) > 0 { - i -= len(m.Identity) - copy(dAtA[i:], m.Identity) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.Identity))) - i-- - dAtA[i] = 0x22 - } - if m.TreeHeaderType != 0 { - i = encodeVarintAclchanges(dAtA, i, uint64(m.TreeHeaderType)) - i-- - dAtA[i] = 0x18 - } - if len(m.AclId) > 0 { - i -= len(m.AclId) - copy(dAtA[i:], m.AclId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.AclId))) - i-- - dAtA[i] = 0x12 - } - if len(m.FirstId) > 0 { - i -= len(m.FirstId) - copy(dAtA[i:], m.FirstId) - i = encodeVarintAclchanges(dAtA, i, uint64(len(m.FirstId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintAclchanges(dAtA []byte, offset int, v uint64) int { - offset -= sovAclchanges(v) +func encodeVarintAclrecord(dAtA []byte, offset int, v uint64) int { + offset -= sovAclrecord(v) base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -2431,15 +1888,84 @@ func (m *RawACLRecord) Size() (n int) { _ = l l = len(m.Payload) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } l = len(m.Signature) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) + } + return n +} + +func (m *RawACLRecordWithId) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Payload) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) } l = len(m.Id) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) + } + return n +} + +func (m *ACLRecord) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PrevId) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) + } + l = len(m.Identity) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) + } + l = len(m.Data) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) + } + if m.CurrentReadKeyHash != 0 { + n += 1 + sovAclrecord(uint64(m.CurrentReadKeyHash)) + } + if m.Timestamp != 0 { + n += 1 + sovAclrecord(uint64(m.Timestamp)) + } + return n +} + +func (m *ACLRoot) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Identity) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) + } + l = len(m.EncryptionKey) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) + } + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) + } + l = len(m.EncryptedReadKey) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) + } + l = len(m.DerivationScheme) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) } return n } @@ -2464,7 +1990,7 @@ func (m *ACLContentValue_UserAdd) Size() (n int) { _ = l if m.UserAdd != nil { l = m.UserAdd.Size() - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } return n } @@ -2476,7 +2002,7 @@ func (m *ACLContentValue_UserRemove) Size() (n int) { _ = l if m.UserRemove != nil { l = m.UserRemove.Size() - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } return n } @@ -2488,7 +2014,7 @@ func (m *ACLContentValue_UserPermissionChange) Size() (n int) { _ = l if m.UserPermissionChange != nil { l = m.UserPermissionChange.Size() - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } return n } @@ -2500,7 +2026,7 @@ func (m *ACLContentValue_UserInvite) Size() (n int) { _ = l if m.UserInvite != nil { l = m.UserInvite.Size() - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } return n } @@ -2512,19 +2038,7 @@ func (m *ACLContentValue_UserJoin) Size() (n int) { _ = l if m.UserJoin != nil { l = m.UserJoin.Size() - n += 1 + l + sovAclchanges(uint64(l)) - } - return n -} -func (m *ACLContentValue_UserConfirm) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.UserConfirm != nil { - l = m.UserConfirm.Size() - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } return n } @@ -2537,7 +2051,7 @@ func (m *ACLData) Size() (n int) { if len(m.AclContent) > 0 { for _, e := range m.AclContent { l = e.Size() - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } } return n @@ -2552,14 +2066,14 @@ func (m *ACLState) Size() (n int) { if len(m.ReadKeyHashes) > 0 { l = 0 for _, e := range m.ReadKeyHashes { - l += sovAclchanges(uint64(e)) + l += sovAclrecord(uint64(e)) } - n += 1 + sovAclchanges(uint64(l)) + l + n += 1 + sovAclrecord(uint64(l)) + l } if len(m.UserStates) > 0 { for _, e := range m.UserStates { l = e.Size() - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } } if len(m.Invites) > 0 { @@ -2569,10 +2083,10 @@ func (m *ACLState) Size() (n int) { l = 0 if v != nil { l = v.Size() - l += 1 + sovAclchanges(uint64(l)) + l += 1 + sovAclrecord(uint64(l)) } - mapEntrySize := 1 + len(k) + sovAclchanges(uint64(len(k))) + l - n += mapEntrySize + 1 + sovAclchanges(uint64(mapEntrySize)) + mapEntrySize := 1 + len(k) + sovAclrecord(uint64(len(k))) + l + n += mapEntrySize + 1 + sovAclrecord(uint64(mapEntrySize)) } } return n @@ -2586,20 +2100,20 @@ func (m *ACLUserState) Size() (n int) { _ = l l = len(m.Identity) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } l = len(m.EncryptionKey) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } if len(m.EncryptedReadKeys) > 0 { for _, b := range m.EncryptedReadKeys { l = len(b) - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } } if m.Permissions != 0 { - n += 1 + sovAclchanges(uint64(m.Permissions)) + n += 1 + sovAclrecord(uint64(m.Permissions)) } if m.IsConfirmed { n += 2 @@ -2615,37 +2129,20 @@ func (m *ACLUserAdd) Size() (n int) { _ = l l = len(m.Identity) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } l = len(m.EncryptionKey) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } if len(m.EncryptedReadKeys) > 0 { for _, b := range m.EncryptedReadKeys { l = len(b) - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } } if m.Permissions != 0 { - n += 1 + sovAclchanges(uint64(m.Permissions)) - } - return n -} - -func (m *ACLUserConfirm) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Identity) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.UserAddId) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + sovAclrecord(uint64(m.Permissions)) } return n } @@ -2658,24 +2155,24 @@ func (m *ACLUserInvite) Size() (n int) { _ = l l = len(m.AcceptPublicKey) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } l = len(m.EncryptPublicKey) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } if len(m.EncryptedReadKeys) > 0 { for _, b := range m.EncryptedReadKeys { l = len(b) - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } } if m.Permissions != 0 { - n += 1 + sovAclchanges(uint64(m.Permissions)) + n += 1 + sovAclrecord(uint64(m.Permissions)) } l = len(m.InviteId) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } return n } @@ -2688,24 +2185,24 @@ func (m *ACLUserJoin) Size() (n int) { _ = l l = len(m.Identity) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } l = len(m.EncryptionKey) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } l = len(m.AcceptSignature) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } - l = len(m.UserInviteId) + l = len(m.InviteId) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } if len(m.EncryptedReadKeys) > 0 { for _, b := range m.EncryptedReadKeys { l = len(b) - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } } return n @@ -2719,12 +2216,12 @@ func (m *ACLUserRemove) Size() (n int) { _ = l l = len(m.Identity) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } if len(m.ReadKeyReplaces) > 0 { for _, e := range m.ReadKeyReplaces { l = e.Size() - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } } return n @@ -2738,15 +2235,15 @@ func (m *ACLReadKeyReplace) Size() (n int) { _ = l l = len(m.Identity) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } l = len(m.EncryptionKey) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } l = len(m.EncryptedReadKey) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } return n } @@ -2759,165 +2256,19 @@ func (m *ACLUserPermissionChange) Size() (n int) { _ = l l = len(m.Identity) if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) + n += 1 + l + sovAclrecord(uint64(l)) } if m.Permissions != 0 { - n += 1 + sovAclchanges(uint64(m.Permissions)) + n += 1 + sovAclrecord(uint64(m.Permissions)) } return n } -func (m *ACLRecord) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.PrevId) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.Identity) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - if m.CurrentReadKeyHash != 0 { - n += 1 + sovAclchanges(uint64(m.CurrentReadKeyHash)) - } - if m.Timestamp != 0 { - n += 1 + sovAclchanges(uint64(m.Timestamp)) - } - return n -} - -func (m *ACLHeader) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FirstId) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.Identity) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - return n -} - -func (m *RawTreeChange) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Payload) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.Signature) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - return n -} - -func (m *RawTreeChangeWithId) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.RawChange) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - return n -} - -func (m *TreeChange) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.TreeHeadIds) > 0 { - for _, s := range m.TreeHeadIds { - l = len(s) - n += 1 + l + sovAclchanges(uint64(l)) - } - } - l = len(m.AclHeadId) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.SnapshotBaseId) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.ChangesData) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - if m.CurrentReadKeyHash != 0 { - n += 1 + sovAclchanges(uint64(m.CurrentReadKeyHash)) - } - if m.Timestamp != 0 { - n += 1 + sovAclchanges(uint64(m.Timestamp)) - } - l = len(m.Identity) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - if m.IsSnapshot { - n += 2 - } - return n -} - -func (m *TreeHeader) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FirstId) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.AclId) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - if m.TreeHeaderType != 0 { - n += 1 + sovAclchanges(uint64(m.TreeHeaderType)) - } - l = len(m.Identity) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovAclchanges(uint64(l)) - } - return n -} - -func sovAclchanges(x uint64) (n int) { +func sovAclrecord(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } -func sozAclchanges(x uint64) (n int) { - return sovAclchanges(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +func sozAclrecord(x uint64) (n int) { + return sovAclrecord(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } func (m *RawACLRecord) Unmarshal(dAtA []byte) error { l := len(dAtA) @@ -2927,7 +2278,7 @@ func (m *RawACLRecord) Unmarshal(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2955,7 +2306,7 @@ func (m *RawACLRecord) Unmarshal(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -2968,11 +2319,11 @@ func (m *RawACLRecord) Unmarshal(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF @@ -2989,7 +2340,7 @@ func (m *RawACLRecord) Unmarshal(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3002,11 +2353,11 @@ func (m *RawACLRecord) Unmarshal(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF @@ -3016,14 +2367,98 @@ func (m *RawACLRecord) Unmarshal(dAtA []byte) error { m.Signature = []byte{} } iNdEx = postIndex - case 3: + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RawACLRecordWithId) 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 ErrIntOverflowAclrecord + } + 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: RawACLRecordWithId: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RawACLRecordWithId: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) + if m.Payload == nil { + m.Payload = []byte{} + } + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -3037,11 +2472,11 @@ func (m *RawACLRecord) Unmarshal(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF @@ -3050,1909 +2485,12 @@ func (m *RawACLRecord) Unmarshal(dAtA []byte) error { iNdEx = postIndex default: iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) + skippy, err := skipAclrecord(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLContentValue) 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 ErrIntOverflowAclchanges - } - 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: ACLContentValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLContentValue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserAdd", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ACLUserAdd{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &ACLContentValue_UserAdd{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserRemove", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ACLUserRemove{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &ACLContentValue_UserRemove{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserPermissionChange", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ACLUserPermissionChange{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &ACLContentValue_UserPermissionChange{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserInvite", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ACLUserInvite{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &ACLContentValue_UserInvite{v} - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserJoin", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ACLUserJoin{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &ACLContentValue_UserJoin{v} - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserConfirm", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ACLUserConfirm{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &ACLContentValue_UserConfirm{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLData) 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 ErrIntOverflowAclchanges - } - 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: ACLData: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLData: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclContent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AclContent = append(m.AclContent, &ACLContentValue{}) - if err := m.AclContent[len(m.AclContent)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLState) 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 ErrIntOverflowAclchanges - } - 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: ACLState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType == 0 { - var v uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ReadKeyHashes = append(m.ReadKeyHashes, v) - } else if wireType == 2 { - var packedLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - packedLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if packedLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + packedLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var elementCount int - var count int - for _, integer := range dAtA[iNdEx:postIndex] { - if integer < 128 { - count++ - } - } - elementCount = count - if elementCount != 0 && len(m.ReadKeyHashes) == 0 { - m.ReadKeyHashes = make([]uint64, 0, elementCount) - } - for iNdEx < postIndex { - var v uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ReadKeyHashes = append(m.ReadKeyHashes, v) - } - } else { - return fmt.Errorf("proto: wrong wireType = %d for field ReadKeyHashes", wireType) - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserStates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.UserStates = append(m.UserStates, &ACLUserState{}) - if err := m.UserStates[len(m.UserStates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Invites", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Invites == nil { - m.Invites = make(map[string]*ACLUserInvite) - } - var mapkey string - var mapvalue *ACLUserInvite - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthAclchanges - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthAclchanges - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return ErrInvalidLengthAclchanges - } - postmsgIndex := iNdEx + mapmsglen - if postmsgIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue = &ACLUserInvite{} - if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - } else { - iNdEx = entryPreIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Invites[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLUserState) 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 ErrIntOverflowAclchanges - } - 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: ACLUserState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLUserState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKey", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptionKey = append(m.EncryptionKey[:0], dAtA[iNdEx:postIndex]...) - if m.EncryptionKey == nil { - m.EncryptionKey = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKeys", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptedReadKeys = append(m.EncryptedReadKeys, make([]byte, postIndex-iNdEx)) - copy(m.EncryptedReadKeys[len(m.EncryptedReadKeys)-1], dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) - } - m.Permissions = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Permissions |= ACLUserPermissions(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsConfirmed", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IsConfirmed = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLUserAdd) 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 ErrIntOverflowAclchanges - } - 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: ACLUserAdd: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLUserAdd: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKey", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptionKey = append(m.EncryptionKey[:0], dAtA[iNdEx:postIndex]...) - if m.EncryptionKey == nil { - m.EncryptionKey = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKeys", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptedReadKeys = append(m.EncryptedReadKeys, make([]byte, postIndex-iNdEx)) - copy(m.EncryptedReadKeys[len(m.EncryptedReadKeys)-1], dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) - } - m.Permissions = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Permissions |= ACLUserPermissions(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLUserConfirm) 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 ErrIntOverflowAclchanges - } - 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: ACLUserConfirm: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLUserConfirm: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserAddId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.UserAddId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLUserInvite) 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 ErrIntOverflowAclchanges - } - 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: ACLUserInvite: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLUserInvite: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AcceptPublicKey", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AcceptPublicKey = append(m.AcceptPublicKey[:0], dAtA[iNdEx:postIndex]...) - if m.AcceptPublicKey == nil { - m.AcceptPublicKey = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptPublicKey", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptPublicKey = append(m.EncryptPublicKey[:0], dAtA[iNdEx:postIndex]...) - if m.EncryptPublicKey == nil { - m.EncryptPublicKey = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKeys", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptedReadKeys = append(m.EncryptedReadKeys, make([]byte, postIndex-iNdEx)) - copy(m.EncryptedReadKeys[len(m.EncryptedReadKeys)-1], dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) - } - m.Permissions = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Permissions |= ACLUserPermissions(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InviteId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.InviteId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLUserJoin) 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 ErrIntOverflowAclchanges - } - 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: ACLUserJoin: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLUserJoin: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKey", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptionKey = append(m.EncryptionKey[:0], dAtA[iNdEx:postIndex]...) - if m.EncryptionKey == nil { - m.EncryptionKey = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AcceptSignature", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AcceptSignature = append(m.AcceptSignature[:0], dAtA[iNdEx:postIndex]...) - if m.AcceptSignature == nil { - m.AcceptSignature = []byte{} - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserInviteId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.UserInviteId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKeys", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptedReadKeys = append(m.EncryptedReadKeys, make([]byte, postIndex-iNdEx)) - copy(m.EncryptedReadKeys[len(m.EncryptedReadKeys)-1], dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLUserRemove) 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 ErrIntOverflowAclchanges - } - 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: ACLUserRemove: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLUserRemove: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ReadKeyReplaces", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ReadKeyReplaces = append(m.ReadKeyReplaces, &ACLReadKeyReplace{}) - if err := m.ReadKeyReplaces[len(m.ReadKeyReplaces)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLReadKeyReplace) 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 ErrIntOverflowAclchanges - } - 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: ACLReadKeyReplace: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLReadKeyReplace: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKey", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptionKey = append(m.EncryptionKey[:0], dAtA[iNdEx:postIndex]...) - if m.EncryptionKey == nil { - m.EncryptionKey = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKey", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptedReadKey = append(m.EncryptedReadKey[:0], dAtA[iNdEx:postIndex]...) - if m.EncryptedReadKey == nil { - m.EncryptedReadKey = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ACLUserPermissionChange) 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 ErrIntOverflowAclchanges - } - 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: ACLUserPermissionChange: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ACLUserPermissionChange: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) - if m.Identity == nil { - m.Identity = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) - } - m.Permissions = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Permissions |= ACLUserPermissions(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -4974,7 +2512,7 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5002,7 +2540,7 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5016,11 +2554,11 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF @@ -5034,7 +2572,7 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5047,11 +2585,11 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF @@ -5068,7 +2606,7 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5081,11 +2619,11 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF @@ -5102,7 +2640,7 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { m.CurrentReadKeyHash = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5121,7 +2659,7 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { m.Timestamp = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5135,12 +2673,12 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { } default: iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) + skippy, err := skipAclrecord(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5154,7 +2692,7 @@ func (m *ACLRecord) Unmarshal(dAtA []byte) error { } return nil } -func (m *ACLHeader) Unmarshal(dAtA []byte) error { +func (m *ACLRoot) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5162,7 +2700,7 @@ func (m *ACLHeader) Unmarshal(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5177,52 +2715,20 @@ func (m *ACLHeader) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ACLHeader: wiretype end group for non-group") + return fmt.Errorf("proto: ACLRoot: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ACLHeader: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ACLRoot: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FirstId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FirstId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5235,11 +2741,11 @@ func (m *ACLHeader) Unmarshal(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF @@ -5249,64 +2755,14 @@ func (m *ACLHeader) Unmarshal(dAtA []byte) error { m.Identity = []byte{} } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RawTreeChange) 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 ErrIntOverflowAclchanges - } - 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: RawTreeChange: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RawTreeChange: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKey", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5319,292 +2775,28 @@ func (m *RawTreeChange) Unmarshal(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF } - m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) - if m.Payload == nil { - m.Payload = []byte{} + m.EncryptionKey = append(m.EncryptionKey[:0], dAtA[iNdEx:postIndex]...) + if m.EncryptionKey == nil { + m.EncryptionKey = []byte{} } iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) - if m.Signature == nil { - m.Signature = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RawTreeChangeWithId) 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 ErrIntOverflowAclchanges - } - 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: RawTreeChangeWithId: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RawTreeChangeWithId: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RawChange", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclchanges - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RawChange = append(m.RawChange[:0], dAtA[iNdEx:postIndex]...) - if m.RawChange == nil { - m.RawChange = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TreeChange) 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 ErrIntOverflowAclchanges - } - 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: TreeChange: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TreeChange: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeHeadIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TreeHeadIds = append(m.TreeHeadIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclHeadId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AclHeadId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotBaseId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SpaceId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5618,25 +2810,25 @@ func (m *TreeChange) Unmarshal(dAtA []byte) error { } intStringLen := int(stringLen) if intStringLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + intStringLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF } - m.SnapshotBaseId = string(dAtA[iNdEx:postIndex]) + m.SpaceId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChangesData", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKey", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5649,66 +2841,708 @@ func (m *TreeChange) Unmarshal(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF } - m.ChangesData = append(m.ChangesData[:0], dAtA[iNdEx:postIndex]...) - if m.ChangesData == nil { - m.ChangesData = []byte{} + m.EncryptedReadKey = append(m.EncryptedReadKey[:0], dAtA[iNdEx:postIndex]...) + if m.EncryptedReadKey == nil { + m.EncryptedReadKey = []byte{} } iNdEx = postIndex case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentReadKeyHash", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DerivationScheme", wireType) } - m.CurrentReadKeyHash = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - m.CurrentReadKeyHash |= uint64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAclrecord } - m.Timestamp = 0 + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DerivationScheme = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ACLContentValue) 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 ErrIntOverflowAclrecord + } + 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: ACLContentValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLContentValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserAdd", wireType) + } + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ - m.Timestamp |= int64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 7: + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ACLUserAdd{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &ACLContentValue_UserAdd{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserRemove", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ACLUserRemove{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &ACLContentValue_UserRemove{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserPermissionChange", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ACLUserPermissionChange{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &ACLContentValue_UserPermissionChange{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserInvite", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ACLUserInvite{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &ACLContentValue_UserInvite{v} + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserJoin", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ACLUserJoin{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &ACLContentValue_UserJoin{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ACLData) 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 ErrIntOverflowAclrecord + } + 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: ACLData: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLData: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AclContent", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AclContent = append(m.AclContent, &ACLContentValue{}) + if err := m.AclContent[len(m.AclContent)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ACLState) 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 ErrIntOverflowAclrecord + } + 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: ACLState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ReadKeyHashes = append(m.ReadKeyHashes, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.ReadKeyHashes) == 0 { + m.ReadKeyHashes = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ReadKeyHashes = append(m.ReadKeyHashes, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field ReadKeyHashes", wireType) + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserStates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UserStates = append(m.UserStates, &ACLUserState{}) + if err := m.UserStates[len(m.UserStates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Invites", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Invites == nil { + m.Invites = make(map[string]*ACLUserInvite) + } + var mapkey string + var mapvalue *ACLUserInvite + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthAclrecord + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthAclrecord + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthAclrecord + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &ACLUserInvite{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Invites[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ACLUserState) 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 ErrIntOverflowAclrecord + } + 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: ACLUserState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLUserState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5721,11 +3555,11 @@ func (m *TreeChange) Unmarshal(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF @@ -5735,14 +3569,99 @@ func (m *TreeChange) Unmarshal(dAtA []byte) error { m.Identity = []byte{} } iNdEx = postIndex - case 8: + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncryptionKey = append(m.EncryptionKey[:0], dAtA[iNdEx:postIndex]...) + if m.EncryptionKey == nil { + m.EncryptionKey = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKeys", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncryptedReadKeys = append(m.EncryptedReadKeys, make([]byte, postIndex-iNdEx)) + copy(m.EncryptedReadKeys[len(m.EncryptedReadKeys)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsSnapshot", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) + } + m.Permissions = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Permissions |= ACLUserPermissions(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsConfirmed", wireType) } var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5754,15 +3673,15 @@ func (m *TreeChange) Unmarshal(dAtA []byte) error { break } } - m.IsSnapshot = bool(v != 0) + m.IsConfirmed = bool(v != 0) default: iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) + skippy, err := skipAclrecord(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5776,7 +3695,7 @@ func (m *TreeChange) Unmarshal(dAtA []byte) error { } return nil } -func (m *TreeHeader) Unmarshal(dAtA []byte) error { +func (m *ACLUserAdd) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5784,7 +3703,7 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5799,103 +3718,20 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TreeHeader: wiretype end group for non-group") + return fmt.Errorf("proto: ACLUserAdd: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TreeHeader: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ACLUserAdd: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FirstId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FirstId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - 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 ErrInvalidLengthAclchanges - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclchanges - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AclId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeHeaderType", wireType) - } - m.TreeHeaderType = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclchanges - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TreeHeaderType |= TreeHeaderType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5908,11 +3744,11 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF @@ -5922,14 +3758,14 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { m.Identity = []byte{} } iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKey", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return ErrIntOverflowAclchanges + return ErrIntOverflowAclrecord } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -5942,28 +3778,79 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { } } if byteLen < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } postIndex := iNdEx + byteLen if postIndex < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} + m.EncryptionKey = append(m.EncryptionKey[:0], dAtA[iNdEx:postIndex]...) + if m.EncryptionKey == nil { + m.EncryptionKey = []byte{} } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKeys", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncryptedReadKeys = append(m.EncryptedReadKeys, make([]byte, postIndex-iNdEx)) + copy(m.EncryptedReadKeys[len(m.EncryptedReadKeys)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) + } + m.Permissions = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Permissions |= ACLUserPermissions(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex - skippy, err := skipAclchanges(dAtA[iNdEx:]) + skippy, err := skipAclrecord(dAtA[iNdEx:]) if err != nil { return err } if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAclchanges + return ErrInvalidLengthAclrecord } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF @@ -5977,7 +3864,797 @@ func (m *TreeHeader) Unmarshal(dAtA []byte) error { } return nil } -func skipAclchanges(dAtA []byte) (n int, err error) { +func (m *ACLUserInvite) 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 ErrIntOverflowAclrecord + } + 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: ACLUserInvite: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLUserInvite: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AcceptPublicKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AcceptPublicKey = append(m.AcceptPublicKey[:0], dAtA[iNdEx:postIndex]...) + if m.AcceptPublicKey == nil { + m.AcceptPublicKey = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptPublicKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncryptPublicKey = append(m.EncryptPublicKey[:0], dAtA[iNdEx:postIndex]...) + if m.EncryptPublicKey == nil { + m.EncryptPublicKey = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKeys", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncryptedReadKeys = append(m.EncryptedReadKeys, make([]byte, postIndex-iNdEx)) + copy(m.EncryptedReadKeys[len(m.EncryptedReadKeys)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) + } + m.Permissions = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Permissions |= ACLUserPermissions(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InviteId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + 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 ErrInvalidLengthAclrecord + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InviteId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ACLUserJoin) 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 ErrIntOverflowAclrecord + } + 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: ACLUserJoin: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLUserJoin: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncryptionKey = append(m.EncryptionKey[:0], dAtA[iNdEx:postIndex]...) + if m.EncryptionKey == nil { + m.EncryptionKey = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AcceptSignature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AcceptSignature = append(m.AcceptSignature[:0], dAtA[iNdEx:postIndex]...) + if m.AcceptSignature == nil { + m.AcceptSignature = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InviteId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + 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 ErrInvalidLengthAclrecord + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InviteId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKeys", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncryptedReadKeys = append(m.EncryptedReadKeys, make([]byte, postIndex-iNdEx)) + copy(m.EncryptedReadKeys[len(m.EncryptedReadKeys)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ACLUserRemove) 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 ErrIntOverflowAclrecord + } + 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: ACLUserRemove: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLUserRemove: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadKeyReplaces", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ReadKeyReplaces = append(m.ReadKeyReplaces, &ACLReadKeyReplace{}) + if err := m.ReadKeyReplaces[len(m.ReadKeyReplaces)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ACLReadKeyReplace) 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 ErrIntOverflowAclrecord + } + 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: ACLReadKeyReplace: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLReadKeyReplace: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptionKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncryptionKey = append(m.EncryptionKey[:0], dAtA[iNdEx:postIndex]...) + if m.EncryptionKey == nil { + m.EncryptionKey = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EncryptedReadKey = append(m.EncryptedReadKey[:0], dAtA[iNdEx:postIndex]...) + if m.EncryptedReadKey == nil { + m.EncryptedReadKey = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ACLUserPermissionChange) 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 ErrIntOverflowAclrecord + } + 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: ACLUserPermissionChange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLUserPermissionChange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) + } + m.Permissions = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Permissions |= ACLUserPermissions(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipAclrecord(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 depth := 0 @@ -5985,7 +4662,7 @@ func skipAclchanges(dAtA []byte) (n int, err error) { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { - return 0, ErrIntOverflowAclchanges + return 0, ErrIntOverflowAclrecord } if iNdEx >= l { return 0, io.ErrUnexpectedEOF @@ -6002,7 +4679,7 @@ func skipAclchanges(dAtA []byte) (n int, err error) { case 0: for shift := uint(0); ; shift += 7 { if shift >= 64 { - return 0, ErrIntOverflowAclchanges + return 0, ErrIntOverflowAclrecord } if iNdEx >= l { return 0, io.ErrUnexpectedEOF @@ -6018,7 +4695,7 @@ func skipAclchanges(dAtA []byte) (n int, err error) { var length int for shift := uint(0); ; shift += 7 { if shift >= 64 { - return 0, ErrIntOverflowAclchanges + return 0, ErrIntOverflowAclrecord } if iNdEx >= l { return 0, io.ErrUnexpectedEOF @@ -6031,14 +4708,14 @@ func skipAclchanges(dAtA []byte) (n int, err error) { } } if length < 0 { - return 0, ErrInvalidLengthAclchanges + return 0, ErrInvalidLengthAclrecord } iNdEx += length case 3: depth++ case 4: if depth == 0 { - return 0, ErrUnexpectedEndOfGroupAclchanges + return 0, ErrUnexpectedEndOfGroupAclrecord } depth-- case 5: @@ -6047,7 +4724,7 @@ func skipAclchanges(dAtA []byte) (n int, err error) { return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } if iNdEx < 0 { - return 0, ErrInvalidLengthAclchanges + return 0, ErrInvalidLengthAclrecord } if depth == 0 { return iNdEx, nil @@ -6057,7 +4734,7 @@ func skipAclchanges(dAtA []byte) (n int, err error) { } var ( - ErrInvalidLengthAclchanges = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowAclchanges = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupAclchanges = fmt.Errorf("proto: unexpected end of group") + ErrInvalidLengthAclrecord = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowAclrecord = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupAclrecord = fmt.Errorf("proto: unexpected end of group") ) diff --git a/pkg/acl/aclrecordproto/protos/aclrecord.proto b/pkg/acl/aclrecordproto/protos/aclrecord.proto new file mode 100644 index 00000000..01b5aa6f --- /dev/null +++ b/pkg/acl/aclrecordproto/protos/aclrecord.proto @@ -0,0 +1,102 @@ +syntax = "proto3"; +package aclrecord; +option go_package = "pkg/acl/aclrecordproto"; + +message RawACLRecord { + bytes payload = 1; + bytes signature = 2; +} + +message RawACLRecordWithId { + bytes payload = 1; + string id = 2; +} + +message ACLRecord { + string prevId = 1; + bytes identity = 2; + bytes data = 3; + uint64 currentReadKeyHash = 4; + int64 timestamp = 5; +} + +message ACLRoot { + bytes identity = 1; + bytes encryptionKey = 2; + string spaceId = 3; + bytes encryptedReadKey = 4; + string derivationScheme = 5; +} + +message ACLContentValue { + oneof value { + ACLUserAdd userAdd = 1; + ACLUserRemove userRemove = 2; + ACLUserPermissionChange userPermissionChange = 3; + ACLUserInvite userInvite = 4; + ACLUserJoin userJoin = 5; + } +} + +message ACLData { + repeated ACLContentValue aclContent = 1; +} + +message ACLState { + repeated uint64 readKeyHashes = 1; + repeated ACLUserState userStates = 2; + map invites = 3; +} + +message ACLUserState { + bytes identity = 1; + bytes encryptionKey = 2; + repeated bytes encryptedReadKeys = 3; + ACLUserPermissions permissions = 4; + bool isConfirmed = 5; +} + +message ACLUserAdd { + bytes identity = 1; + bytes encryptionKey = 2; + repeated bytes encryptedReadKeys = 3; + ACLUserPermissions permissions = 4; +} + +message ACLUserInvite { + bytes acceptPublicKey = 1; + bytes encryptPublicKey = 2; + repeated bytes encryptedReadKeys = 3; + ACLUserPermissions permissions = 4; + string inviteId = 5; +} + +message ACLUserJoin { + bytes identity = 1; + bytes encryptionKey = 2; + bytes acceptSignature = 3; + string inviteId = 4; + repeated bytes encryptedReadKeys = 5; +} + +message ACLUserRemove { + bytes identity = 1; + repeated ACLReadKeyReplace readKeyReplaces = 3; +} + +message ACLReadKeyReplace { + bytes identity = 1; + bytes encryptionKey = 2; + bytes encryptedReadKey = 3; +} + +message ACLUserPermissionChange { + bytes identity = 1; + ACLUserPermissions permissions = 2; +} + +enum ACLUserPermissions { + Admin = 0; + Writer = 1; + Reader = 2; +} diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index 91b3bb47..27416972 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" @@ -30,14 +30,14 @@ var ErrInvalidSignature = errors.New("signature is invalid") type UserPermissionPair struct { Identity string - Permission aclpb.ACLUserPermissions + Permission aclrecordproto.ACLUserPermissions } type ACLState struct { currentReadKeyHash uint64 userReadKeys map[uint64]*symmetric.Key - userStates map[string]*aclpb.ACLUserState - userInvites map[string]*aclpb.ACLUserInvite + userStates map[string]*aclrecordproto.ACLUserState + userInvites map[string]*aclrecordproto.ACLUserInvite signingPubKeyDecoder keys.Decoder encryptionKey encryptionkey.PrivKey @@ -56,8 +56,8 @@ func newACLStateWithIdentity( identity: identity, encryptionKey: encryptionKey, userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclpb.ACLUserState), - userInvites: make(map[string]*aclpb.ACLUserInvite), + userStates: make(map[string]*aclrecordproto.ACLUserState), + userInvites: make(map[string]*aclrecordproto.ACLUserInvite), signingPubKeyDecoder: decoder, permissionsAtRecord: make(map[string][]UserPermissionPair), keychain: common.NewKeychain(), @@ -68,8 +68,8 @@ func newACLState(decoder keys.Decoder) *ACLState { return &ACLState{ signingPubKeyDecoder: decoder, userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclpb.ACLUserState), - userInvites: make(map[string]*aclpb.ACLUserInvite), + userStates: make(map[string]*aclrecordproto.ACLUserState), + userInvites: make(map[string]*aclrecordproto.ACLUserInvite), permissionsAtRecord: make(map[string][]UserPermissionPair), keychain: common.NewKeychain(), } @@ -106,8 +106,8 @@ func (st *ACLState) PermissionsAtRecord(id string, identity string) (UserPermiss return UserPermissionPair{}, ErrNoSuchUser } -func (st *ACLState) applyRecord(record *aclpb.ACLRecord) (err error) { - aclData := &aclpb.ACLData{} +func (st *ACLState) applyRecord(record *aclrecordproto.ACLRecord) (err error) { + aclData := &aclrecordproto.ACLData{} err = proto.Unmarshal(record.Data, aclData) if err != nil { @@ -126,11 +126,11 @@ func (st *ACLState) applyRecord(record *aclpb.ACLRecord) (err error) { func (st *ACLState) applyChangeAndUpdate(recordWrapper *ACLRecord) (err error) { var ( change = recordWrapper.Content - aclData = &aclpb.ACLData{} + aclData = &aclrecordproto.ACLData{} ) if recordWrapper.Model != nil { - aclData = recordWrapper.Model.(*aclpb.ACLData) + aclData = recordWrapper.Model.(*aclrecordproto.ACLData) } else { err = proto.Unmarshal(change.Data, aclData) if err != nil { @@ -158,7 +158,7 @@ func (st *ACLState) applyChangeAndUpdate(recordWrapper *ACLRecord) (err error) { return nil } -func (st *ACLState) applyChangeData(changeData *aclpb.ACLData, hash uint64, identity []byte) (err error) { +func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uint64, identity []byte) (err error) { defer func() { if err != nil { return @@ -176,7 +176,7 @@ func (st *ACLState) applyChangeData(changeData *aclpb.ACLData, hash uint64, iden return } - if !st.hasPermission(identity, aclpb.ACLUserPermissions_Admin) { + if !st.hasPermission(identity, aclrecordproto.ACLUserPermissions_Admin) { err = fmt.Errorf("user %s must have admin permissions", identity) return } @@ -192,7 +192,7 @@ func (st *ACLState) applyChangeData(changeData *aclpb.ACLData, hash uint64, iden return nil } -func (st *ACLState) applyChangeContent(ch *aclpb.ACLContentValue) error { +func (st *ACLState) applyChangeContent(ch *aclrecordproto.ACLContentValue) error { switch { case ch.GetUserPermissionChange() != nil: return st.applyUserPermissionChange(ch.GetUserPermissionChange()) @@ -211,7 +211,7 @@ func (st *ACLState) applyChangeContent(ch *aclpb.ACLContentValue) error { } } -func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLUserPermissionChange) error { +func (st *ACLState) applyUserPermissionChange(ch *aclrecordproto.ACLUserPermissionChange) error { chIdentity := string(ch.Identity) state, exists := st.userStates[chIdentity] if !exists { @@ -222,12 +222,12 @@ func (st *ACLState) applyUserPermissionChange(ch *aclpb.ACLUserPermissionChange) return nil } -func (st *ACLState) applyUserInvite(ch *aclpb.ACLUserInvite) error { +func (st *ACLState) applyUserInvite(ch *aclrecordproto.ACLUserInvite) error { st.userInvites[ch.InviteId] = ch return nil } -func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { +func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error { invite, exists := st.userInvites[ch.UserInviteId] if !exists { return fmt.Errorf("no such invite with id %s", ch.UserInviteId) @@ -266,7 +266,7 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { } // adding user to the list - userState := &aclpb.ACLUserState{ + userState := &aclrecordproto.ACLUserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, EncryptedReadKeys: ch.EncryptedReadKeys, @@ -277,13 +277,13 @@ func (st *ACLState) applyUserJoin(ch *aclpb.ACLUserJoin) error { return nil } -func (st *ACLState) applyUserAdd(ch *aclpb.ACLUserAdd) error { +func (st *ACLState) applyUserAdd(ch *aclrecordproto.ACLUserAdd) error { chIdentity := string(ch.Identity) if _, exists := st.userStates[chIdentity]; exists { return ErrUserAlreadyExists } - st.userStates[chIdentity] = &aclpb.ACLUserState{ + st.userStates[chIdentity] = &aclrecordproto.ACLUserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, Permissions: ch.Permissions, @@ -304,7 +304,7 @@ func (st *ACLState) applyUserAdd(ch *aclpb.ACLUserAdd) error { return nil } -func (st *ACLState) applyUserRemove(ch *aclpb.ACLUserRemove) error { +func (st *ACLState) applyUserRemove(ch *aclrecordproto.ACLUserRemove) error { chIdentity := string(ch.Identity) if chIdentity == st.identity { return ErrDocumentForbidden @@ -338,7 +338,7 @@ func (st *ACLState) applyUserRemove(ch *aclpb.ACLUserRemove) error { return nil } -func (st *ACLState) applyUserConfirm(ch *aclpb.ACLUserConfirm) error { +func (st *ACLState) applyUserConfirm(ch *aclrecordproto.ACLUserConfirm) error { chIdentity := string(ch.Identity) state, exists := st.userStates[chIdentity] if !exists { @@ -365,7 +365,7 @@ func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, e return key, hasher.Sum64(), nil } -func (st *ACLState) hasPermission(identity []byte, permission aclpb.ACLUserPermissions) bool { +func (st *ACLState) hasPermission(identity []byte, permission aclrecordproto.ACLUserPermissions) bool { state, exists := st.userStates[string(identity)] if !exists { return false @@ -374,17 +374,17 @@ func (st *ACLState) hasPermission(identity []byte, permission aclpb.ACLUserPermi return state.Permissions == permission } -func (st *ACLState) isUserJoin(data *aclpb.ACLData) bool { +func (st *ACLState) isUserJoin(data *aclrecordproto.ACLData) bool { // if we have a UserJoin, then it should always be the first one applied return data.GetAclContent() != nil && data.GetAclContent()[0].GetUserJoin() != nil } -func (st *ACLState) isUserAdd(data *aclpb.ACLData, identity []byte) bool { +func (st *ACLState) isUserAdd(data *aclrecordproto.ACLData, identity []byte) bool { // if we have a UserAdd, then it should always be the first one applied userAdd := data.GetAclContent()[0].GetUserAdd() return data.GetAclContent() != nil && userAdd != nil && bytes.Compare(userAdd.GetIdentity(), identity) == 0 } -func (st *ACLState) GetUserStates() map[string]*aclpb.ACLUserState { +func (st *ACLState) GetUserStates() map[string]*aclrecordproto.ACLUserState { return st.userStates } diff --git a/pkg/acl/list/changebuilder.go b/pkg/acl/list/changebuilder.go index c6413cb0..f56e5259 100644 --- a/pkg/acl/list/changebuilder.go +++ b/pkg/acl/list/changebuilder.go @@ -2,7 +2,7 @@ package list import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index 3cfedd06..d20d5b69 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" @@ -60,7 +60,7 @@ func BuildACLList(decoder keys.Decoder, storage storage.ListStorage) (ACLList, e } func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStorage) (list ACLList, err error) { - header, err := storage.Header() + header, err := storage.Root() if err != nil { return } diff --git a/pkg/acl/list/list_test.go b/pkg/acl/list/list_test.go index fd249cfb..d36cd373 100644 --- a/pkg/acl/list/list_test.go +++ b/pkg/acl/list/list_test.go @@ -1,7 +1,7 @@ package list import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/stretchr/testify/assert" diff --git a/pkg/acl/list/record.go b/pkg/acl/list/record.go index 1cf10e59..04f4abbf 100644 --- a/pkg/acl/list/record.go +++ b/pkg/acl/list/record.go @@ -1,19 +1,19 @@ package list import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/gogo/protobuf/proto" ) type ACLRecord struct { Id string - Content *aclpb.ACLRecord + Content *aclrecordproto.ACLRecord Identity string Model interface{} Sign []byte } -func NewRecord(id string, aclRecord *aclpb.ACLRecord) *ACLRecord { +func NewRecord(id string, aclRecord *aclrecordproto.ACLRecord) *ACLRecord { return &ACLRecord{ Id: id, Content: aclRecord, @@ -21,17 +21,45 @@ func NewRecord(id string, aclRecord *aclpb.ACLRecord) *ACLRecord { } } -func NewFromRawRecord(rawRec *aclpb.RawACLRecord) (*ACLRecord, error) { - aclRec := &aclpb.ACLRecord{} - err := proto.Unmarshal(rawRec.Payload, aclRec) +func NewFromRawRecord(rawRecWithId *aclrecordproto.RawACLRecordWithId) (aclRec *ACLRecord, err error) { + rawRec := &aclrecordproto.RawACLRecord{} + err = proto.Unmarshal(rawRecWithId.Payload, rawRec) if err != nil { - return nil, err + return + } + + protoAclRec := &aclrecordproto.ACLRecord{} + err = proto.Unmarshal(rawRec.Payload, protoAclRec) + if err != nil { + return } return &ACLRecord{ - Id: rawRec.Id, - Content: aclRec, + Id: rawRecWithId.Id, + Content: protoAclRec, Sign: rawRec.Signature, - Identity: string(aclRec.Identity), + Identity: string(protoAclRec.Identity), }, nil } + +func NewFromRawRoot(rawRecWithId *aclrecordproto.RawACLRecordWithId) (aclRec *ACLRecord, err error) { + rawRec := &aclrecordproto.RawACLRecord{} + err = proto.Unmarshal(rawRecWithId.Payload, rawRec) + if err != nil { + return + } + + protoAclRec := &aclrecordproto.ACLRecord{} + err = proto.Unmarshal(rawRec.Payload, protoAclRec) + if err != nil { + return + } + + return &ACLRecord{ + Id: rawRecWithId.Id, + Content: protoAclRec, + Sign: rawRec.Signature, + Identity: string(protoAclRec.Identity), + }, nil +} + diff --git a/pkg/acl/storage/inmemory.go b/pkg/acl/storage/inmemory.go index 7f6af367..1e200e68 100644 --- a/pkg/acl/storage/inmemory.go +++ b/pkg/acl/storage/inmemory.go @@ -3,44 +3,41 @@ package storage import ( "context" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" "sync" ) type inMemoryACLListStorage struct { - header *aclpb.ACLHeader - records []*aclpb.RawACLRecord - - id string + records []*aclrecordproto.RawACLRecordWithId + id string sync.RWMutex } func NewInMemoryACLListStorage( id string, - header *aclpb.ACLHeader, - records []*aclpb.RawACLRecord) (ListStorage, error) { + records []*aclrecordproto.RawACLRecordWithId) (ListStorage, error) { return &inMemoryACLListStorage{ id: id, - header: header, records: records, RWMutex: sync.RWMutex{}, }, nil } -func (i *inMemoryACLListStorage) Header() (*aclpb.ACLHeader, error) { +func (i *inMemoryACLListStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { i.RLock() defer i.RUnlock() - return i.header, nil + return i.records[0], nil } -func (i *inMemoryACLListStorage) Head() (*aclpb.RawACLRecord, error) { +func (i *inMemoryACLListStorage) Head() (*aclrecordproto.RawACLRecordWithId, error) { i.RLock() defer i.RUnlock() return i.records[len(i.records)-1], nil } -func (i *inMemoryACLListStorage) GetRawRecord(ctx context.Context, id string) (*aclpb.RawACLRecord, error) { +func (i *inMemoryACLListStorage) GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error) { i.RLock() defer i.RUnlock() for _, rec := range i.records { @@ -51,7 +48,7 @@ func (i *inMemoryACLListStorage) GetRawRecord(ctx context.Context, id string) (* return nil, fmt.Errorf("no such record") } -func (i *inMemoryACLListStorage) AddRawRecord(ctx context.Context, rec *aclpb.RawACLRecord) error { +func (i *inMemoryACLListStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { panic("implement me") } @@ -63,26 +60,27 @@ func (i *inMemoryACLListStorage) ID() (string, error) { type inMemoryTreeStorage struct { id string - header *aclpb.TreeHeader + root *treechangeproto.RawTreeChangeWithId heads []string - changes map[string]*aclpb.RawTreeChangeWithId + changes map[string]*treechangeproto.RawTreeChangeWithId sync.RWMutex } func NewInMemoryTreeStorage( treeId string, - header *aclpb.TreeHeader, + root *treechangeproto.RawTreeChangeWithId, heads []string, - changes []*aclpb.RawTreeChangeWithId) (TreeStorage, error) { - allChanges := make(map[string]*aclpb.RawTreeChangeWithId) + changes []*treechangeproto.RawTreeChangeWithId) (TreeStorage, error) { + allChanges := make(map[string]*treechangeproto.RawTreeChangeWithId) for _, ch := range changes { allChanges[ch.Id] = ch } + allChanges[treeId] = root return &inMemoryTreeStorage{ id: treeId, - header: header, + root: root, heads: heads, changes: allChanges, RWMutex: sync.RWMutex{}, @@ -95,10 +93,10 @@ func (t *inMemoryTreeStorage) ID() (string, error) { return t.id, nil } -func (t *inMemoryTreeStorage) Header() (*aclpb.TreeHeader, error) { +func (t *inMemoryTreeStorage) Root() (*treechangeproto.RawTreeChangeWithId, error) { t.RLock() defer t.RUnlock() - return t.header, nil + return t.root, nil } func (t *inMemoryTreeStorage) Heads() ([]string, error) { @@ -118,7 +116,7 @@ func (t *inMemoryTreeStorage) SetHeads(heads []string) error { return nil } -func (t *inMemoryTreeStorage) AddRawChange(change *aclpb.RawTreeChangeWithId) error { +func (t *inMemoryTreeStorage) AddRawChange(change *treechangeproto.RawTreeChangeWithId) error { t.Lock() defer t.Unlock() // TODO: better to do deep copy @@ -126,7 +124,7 @@ func (t *inMemoryTreeStorage) AddRawChange(change *aclpb.RawTreeChangeWithId) er return nil } -func (t *inMemoryTreeStorage) GetRawChange(ctx context.Context, changeId string) (*aclpb.RawTreeChangeWithId, error) { +func (t *inMemoryTreeStorage) GetRawChange(ctx context.Context, changeId string) (*treechangeproto.RawTreeChangeWithId, error) { t.RLock() defer t.RUnlock() if res, exists := t.changes[changeId]; exists { @@ -163,7 +161,7 @@ func (i *inMemoryStorageProvider) Storage(id string) (Storage, error) { func (i *inMemoryStorageProvider) CreateTreeStorage(payload TreeStorageCreatePayload) (TreeStorage, error) { i.Lock() defer i.Unlock() - res, err := NewInMemoryTreeStorage(payload.TreeId, payload.Header, payload.Heads, payload.Changes) + res, err := NewInMemoryTreeStorage(payload.TreeId, payload.RootRawChange, payload.Heads, payload.Changes) if err != nil { return nil, err } @@ -175,7 +173,7 @@ func (i *inMemoryStorageProvider) CreateTreeStorage(payload TreeStorageCreatePay func (i *inMemoryStorageProvider) CreateACLListStorage(payload ACLListStorageCreatePayload) (ListStorage, error) { i.Lock() defer i.Unlock() - res, err := NewInMemoryACLListStorage(payload.ListId, payload.Header, payload.Records) + res, err := NewInMemoryACLListStorage(payload.ListId, payload.Records) if err != nil { return nil, err } diff --git a/pkg/acl/storage/liststorage.go b/pkg/acl/storage/liststorage.go index ccb5b5da..c4fe7d6e 100644 --- a/pkg/acl/storage/liststorage.go +++ b/pkg/acl/storage/liststorage.go @@ -2,14 +2,14 @@ package storage import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" ) type ListStorage interface { Storage - Header() (*aclpb.ACLHeader, error) - Head() (*aclpb.RawACLRecord, error) + Root() (*aclrecordproto.RawACLRecordWithId, error) + Head() (*aclrecordproto.RawACLRecordWithId, error) - GetRawRecord(ctx context.Context, id string) (*aclpb.RawACLRecord, error) - AddRawRecord(ctx context.Context, rec *aclpb.RawACLRecord) error + GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error) + AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error } diff --git a/pkg/acl/storage/provider.go b/pkg/acl/storage/provider.go index 984b21c4..3c2c7d91 100644 --- a/pkg/acl/storage/provider.go +++ b/pkg/acl/storage/provider.go @@ -2,27 +2,26 @@ package storage import ( "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" ) var ErrUnknownTreeId = errors.New("tree does not exist") type TreeStorageCreatePayload struct { - TreeId string - Header *aclpb.TreeHeader - Changes []*aclpb.RawTreeChangeWithId - Heads []string + TreeId string + RootRawChange *treechangeproto.RawTreeChangeWithId + Changes []*treechangeproto.RawTreeChangeWithId + Heads []string } type ACLListStorageCreatePayload struct { ListId string - Header *aclpb.ACLHeader - Records []*aclpb.RawACLRecord + Records []*aclrecordproto.RawACLRecordWithId } type Provider interface { Storage(id string) (Storage, error) - AddStorage(id string, st Storage) error CreateTreeStorage(payload TreeStorageCreatePayload) (TreeStorage, error) CreateACLListStorage(payload ACLListStorageCreatePayload) (ListStorage, error) } diff --git a/pkg/acl/storage/treestorage.go b/pkg/acl/storage/treestorage.go index 0e7d09a1..a9c98f1d 100644 --- a/pkg/acl/storage/treestorage.go +++ b/pkg/acl/storage/treestorage.go @@ -2,17 +2,17 @@ package storage import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" ) type TreeStorage interface { Storage - Header() (*aclpb.TreeHeader, error) + Root() (*treechangeproto.RawTreeChangeWithId, error) Heads() ([]string, error) SetHeads(heads []string) error - AddRawChange(change *aclpb.RawTreeChangeWithId) error - GetRawChange(ctx context.Context, recordID string) (*aclpb.RawTreeChangeWithId, error) + AddRawChange(change *treechangeproto.RawTreeChangeWithId) error + GetRawChange(ctx context.Context, id string) (*treechangeproto.RawTreeChangeWithId, error) } type TreeStorageCreatorFunc = func(payload TreeStorageCreatePayload) (TreeStorage, error) diff --git a/pkg/acl/tree/change.go b/pkg/acl/tree/change.go index cefc9327..43e9f654 100644 --- a/pkg/acl/tree/change.go +++ b/pkg/acl/tree/change.go @@ -2,11 +2,7 @@ package tree import ( "errors" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - "github.com/gogo/protobuf/proto" - - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" ) var ( @@ -14,68 +10,52 @@ var ( ErrIncorrectCID = errors.New("change has incorrect CID") ) -type ChangeContent struct { - ChangesData proto.Marshaler - ACLData *aclpb.ACLData - Id string // TODO: this is just for testing, because id should be created automatically from content -} - // Change is an abstract type for all types of changes type Change struct { - Next []*Change - PreviousIds []string - Id string - SnapshotId string - IsSnapshot bool - DecryptedChange []byte // TODO: check if we need it - ParsedModel interface{} // TODO: check if we need it + Next []*Change + PreviousIds []string + AclHeadId string + Id string + SnapshotId string + IsSnapshot bool + Timestamp int64 + ReadKeyHash uint64 + Identity string + Data []byte + Model interface{} // iterator helpers visited bool branchesFinished bool - Content *aclpb.TreeChange - Identity string - Sign []byte + Signature []byte } -func (ch *Change) ProtoChange() proto.Marshaler { - return ch.Content -} - -func (ch *Change) DecryptContents(key *symmetric.Key) error { - // if the document is already decrypted - if ch.Content.CurrentReadKeyHash == 0 { - return nil - } - decrypted, err := key.Decrypt(ch.Content.ChangesData) - if err != nil { - return fmt.Errorf("failed to decrypt changes data: %w", err) - } - - ch.DecryptedChange = decrypted - return nil -} - -func NewChange(id string, ch *aclpb.TreeChange, signature []byte) *Change { +func NewChange(id string, ch *treechangeproto.TreeChange, signature []byte) *Change { return &Change{ Next: nil, PreviousIds: ch.TreeHeadIds, + AclHeadId: ch.AclHeadId, + Timestamp: ch.Timestamp, + ReadKeyHash: ch.CurrentReadKeyHash, Id: id, - Content: ch, + Data: ch.ChangesData, SnapshotId: ch.SnapshotBaseId, IsSnapshot: ch.IsSnapshot, Identity: string(ch.Identity), - Sign: signature, + Signature: signature, } } -func (ch *Change) DecryptedChangeContent() []byte { - return ch.DecryptedChange -} - -func (ch *Change) Signature() []byte { - return ch.Sign +func NewChangeFromRoot(id string, ch *treechangeproto.RootChange, signature []byte) *Change { + return &Change{ + Next: nil, + AclHeadId: ch.AclHeadId, + Id: id, + IsSnapshot: true, + Identity: string(ch.Identity), + Signature: signature, + } } func (ch *Change) CID() string { diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index 7b478fd8..1a2e207b 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -2,8 +2,8 @@ package tree import ( "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" @@ -14,32 +14,44 @@ import ( var ErrEmptyChange = errors.New("change payload should not be empty") type BuilderContent struct { - treeHeadIds []string - aclHeadId string - snapshotBaseId string - currentReadKeyHash uint64 - identity []byte - isSnapshot bool - signingKey signingkey.PrivKey - readKey *symmetric.Key - content []byte + TreeHeadIds []string + AclHeadId string + SnapshotBaseId string + CurrentReadKeyHash uint64 + Identity []byte + IsSnapshot bool + SigningKey signingkey.PrivKey + ReadKey *symmetric.Key + Content []byte +} + +type InitialContent struct { + AclHeadId string + Identity []byte + SigningKey signingkey.PrivKey + SpaceId string + Seed []byte + ChangeType string } type ChangeBuilder interface { - ConvertFromRaw(rawIdChange *aclpb.RawTreeChangeWithId, verify bool) (ch *Change, err error) - BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawTreeChangeWithId, err error) - BuildRaw(ch *Change) (*aclpb.RawTreeChangeWithId, error) + ConvertFromRaw(rawIdChange *treechangeproto.RawTreeChangeWithId, verify bool) (ch *Change, err error) + BuildContent(payload BuilderContent) (ch *Change, raw *treechangeproto.RawTreeChangeWithId, err error) + BuildInitialContent(payload InitialContent) (ch *Change, raw *treechangeproto.RawTreeChangeWithId, err error) + BuildRaw(ch *Change) (*treechangeproto.RawTreeChangeWithId, error) + SetRootRawChange(rawIdChange *treechangeproto.RawTreeChangeWithId) } type changeBuilder struct { - keys *common.Keychain + rootChange *treechangeproto.RawTreeChangeWithId + keys *common.Keychain } -func newChangeBuilder(keys *common.Keychain) ChangeBuilder { - return &changeBuilder{keys: keys} +func newChangeBuilder(keys *common.Keychain, rootChange *treechangeproto.RawTreeChangeWithId) ChangeBuilder { + return &changeBuilder{keys: keys, rootChange: rootChange} } -func (c *changeBuilder) ConvertFromRaw(rawIdChange *aclpb.RawTreeChangeWithId, verify bool) (ch *Change, err error) { +func (c *changeBuilder) ConvertFromRaw(rawIdChange *treechangeproto.RawTreeChangeWithId, verify bool) (ch *Change, err error) { if rawIdChange.GetRawChange() == nil { err = ErrEmptyChange return @@ -53,7 +65,7 @@ func (c *changeBuilder) ConvertFromRaw(rawIdChange *aclpb.RawTreeChangeWithId, v } } - raw := &aclpb.RawTreeChange{} // TODO: sync pool + raw := &treechangeproto.RawTreeChange{} // TODO: sync pool err = proto.Unmarshal(rawIdChange.GetRawChange(), raw) if err != nil { return @@ -78,28 +90,69 @@ func (c *changeBuilder) ConvertFromRaw(rawIdChange *aclpb.RawTreeChangeWithId, v } } - unmarshalled := &aclpb.TreeChange{} - err = proto.Unmarshal(raw.Payload, unmarshalled) + return c.unmarshallRawChange(raw, rawIdChange.Id) +} + +func (c *changeBuilder) SetRootRawChange(rawIdChange *treechangeproto.RawTreeChangeWithId) { + c.rootChange = rawIdChange +} + +func (c *changeBuilder) BuildInitialContent(payload InitialContent) (ch *Change, rawIdChange *treechangeproto.RawTreeChangeWithId, err error) { + change := &treechangeproto.RootChange{ + AclHeadId: payload.AclHeadId, + Timestamp: int64(time.Now().Nanosecond()), + Identity: payload.Identity, + ChangeType: payload.ChangeType, + SpaceId: payload.SpaceId, + Seed: payload.Seed, + } + + marshalledChange, err := proto.Marshal(change) if err != nil { return } - ch = NewChange(rawIdChange.Id, unmarshalled, raw.Signature) + signature, err := payload.SigningKey.Sign(marshalledChange) + if err != nil { + return + } + + raw := &treechangeproto.RawTreeChange{ + Payload: marshalledChange, + Signature: signature, + } + + marshalledRawChange, err := proto.Marshal(raw) + if err != nil { + return + } + + id, err := cid.NewCIDFromBytes(marshalledRawChange) + if err != nil { + return + } + + ch = NewChangeFromRoot(id, change, signature) + + rawIdChange = &treechangeproto.RawTreeChangeWithId{ + RawChange: marshalledRawChange, + Id: id, + } return } -func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, rawIdChange *aclpb.RawTreeChangeWithId, err error) { - change := &aclpb.TreeChange{ - TreeHeadIds: payload.treeHeadIds, - AclHeadId: payload.aclHeadId, - SnapshotBaseId: payload.snapshotBaseId, - CurrentReadKeyHash: payload.currentReadKeyHash, +func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, rawIdChange *treechangeproto.RawTreeChangeWithId, err error) { + change := &treechangeproto.TreeChange{ + TreeHeadIds: payload.TreeHeadIds, + AclHeadId: payload.AclHeadId, + SnapshotBaseId: payload.SnapshotBaseId, + CurrentReadKeyHash: payload.CurrentReadKeyHash, Timestamp: int64(time.Now().Nanosecond()), - Identity: payload.identity, - IsSnapshot: payload.isSnapshot, + Identity: payload.Identity, + IsSnapshot: payload.IsSnapshot, } - encrypted, err := payload.readKey.Encrypt(payload.content) + encrypted, err := payload.ReadKey.Encrypt(payload.Content) if err != nil { return } @@ -110,12 +163,12 @@ func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, rawIdC return } - signature, err := payload.signingKey.Sign(marshalledChange) + signature, err := payload.SigningKey.Sign(marshalledChange) if err != nil { return } - raw := &aclpb.RawTreeChange{ + raw := &treechangeproto.RawTreeChange{ Payload: marshalledChange, Signature: signature, } @@ -131,33 +184,67 @@ func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, rawIdC } ch = NewChange(id, change, signature) - ch.ParsedModel = payload.content + ch.Model = payload.Content - rawIdChange = &aclpb.RawTreeChangeWithId{ + rawIdChange = &treechangeproto.RawTreeChangeWithId{ RawChange: marshalledRawChange, Id: id, } return } -func (c *changeBuilder) BuildRaw(ch *Change) (raw *aclpb.RawTreeChangeWithId, err error) { +func (c *changeBuilder) BuildRaw(ch *Change) (raw *treechangeproto.RawTreeChangeWithId, err error) { + if ch.Id == c.rootChange.Id { + return c.rootChange, nil + } + treeChange := &treechangeproto.TreeChange{ + TreeHeadIds: ch.PreviousIds, + AclHeadId: ch.AclHeadId, + SnapshotBaseId: ch.SnapshotId, + ChangesData: ch.Data, + CurrentReadKeyHash: ch.ReadKeyHash, + Timestamp: ch.Timestamp, + Identity: []byte(ch.Identity), + IsSnapshot: ch.IsSnapshot, + } var marshalled []byte - marshalled, err = ch.Content.Marshal() + marshalled, err = treeChange.Marshal() if err != nil { return } - marshalledRawChange, err := proto.Marshal(&aclpb.RawTreeChange{ + marshalledRawChange, err := proto.Marshal(&treechangeproto.RawTreeChange{ Payload: marshalled, - Signature: ch.Sign, + Signature: ch.Signature, }) if err != nil { return } - raw = &aclpb.RawTreeChangeWithId{ + raw = &treechangeproto.RawTreeChangeWithId{ RawChange: marshalledRawChange, Id: ch.Id, } return } + +func (c *changeBuilder) unmarshallRawChange(raw *treechangeproto.RawTreeChange, id string) (ch *Change, err error) { + if c.rootChange.Id == id { + unmarshalled := &treechangeproto.RootChange{} + err = proto.Unmarshal(raw.Payload, unmarshalled) + if err != nil { + return + } + ch = NewChangeFromRoot(id, unmarshalled, raw.Signature) + return + } + + unmarshalled := &treechangeproto.TreeChange{} + err = proto.Unmarshal(raw.Payload, unmarshalled) + if err != nil { + return + } + + ch = NewChange(id, unmarshalled, raw.Signature) + return +} diff --git a/pkg/acl/tree/changevalidator.go b/pkg/acl/tree/changevalidator.go index bbc337cf..220eccb3 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/pkg/acl/tree/changevalidator.go @@ -2,7 +2,7 @@ package tree import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" ) @@ -43,12 +43,12 @@ func (v *objectTreeValidator) validateChange(tree *Tree, aclList list.ACLList, c state = aclList.ACLState() ) // checking if the user could write - perm, err = state.PermissionsAtRecord(c.Content.AclHeadId, c.Identity) + perm, err = state.PermissionsAtRecord(c.AclHeadId, c.Identity) if err != nil { return } - if perm.Permission != aclpb.ACLUserPermissions_Writer && perm.Permission != aclpb.ACLUserPermissions_Admin { + if perm.Permission != aclrecordproto.ACLUserPermissions_Writer && perm.Permission != aclrecordproto.ACLUserPermissions_Admin { err = list.ErrInsufficientPermissions return } @@ -56,16 +56,16 @@ func (v *objectTreeValidator) validateChange(tree *Tree, aclList list.ACLList, c // checking if the change refers to later acl heads than its previous ids for _, id := range c.PreviousIds { prevChange := tree.attached[id] - if prevChange.Content.AclHeadId == c.Content.AclHeadId { + if prevChange.AclHeadId == c.AclHeadId { continue } var after bool - after, err = aclList.IsAfter(c.Content.AclHeadId, prevChange.Content.AclHeadId) + after, err = aclList.IsAfter(c.AclHeadId, prevChange.AclHeadId) if err != nil { return } if !after { - err = fmt.Errorf("current acl head id (%s) should be after each of the previous ones (%s)", c.Content.AclHeadId, prevChange.Content.AclHeadId) + err = fmt.Errorf("current acl head id (%s) should be after each of the previous ones (%s)", c.AclHeadId, prevChange.AclHeadId) return } } diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 7c1df882..115ce87e 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -3,10 +3,10 @@ package tree import ( "context" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" "sync" ) @@ -27,7 +27,7 @@ type AddResultSummary int type AddResult struct { OldHeads []string Heads []string - Added []*aclpb.RawTreeChangeWithId + Added []*treechangeproto.RawTreeChangeWithId Mode Mode } @@ -39,7 +39,7 @@ type ObjectTree interface { RWLocker ID() string - Header() *aclpb.TreeHeader + Header() *treechangeproto.RootChange Heads() []string Root() *Change HasChange(string) bool @@ -49,12 +49,12 @@ type ObjectTree interface { IterateFrom(id string, convert ChangeConvertFunc, iterate ChangeIterateFunc) error SnapshotPath() []string - ChangesAfterCommonSnapshot(snapshotPath, heads []string) ([]*aclpb.RawTreeChangeWithId, error) + ChangesAfterCommonSnapshot(snapshotPath, heads []string) ([]*treechangeproto.RawTreeChangeWithId, error) Storage() storage.TreeStorage AddContent(ctx context.Context, content SignableChangeContent) (AddResult, error) - AddRawChanges(ctx context.Context, changes ...*aclpb.RawTreeChangeWithId) (AddResult, error) + AddRawChanges(ctx context.Context, changes ...*treechangeproto.RawTreeChangeWithId) (AddResult, error) Close() error } @@ -67,14 +67,14 @@ type objectTree struct { treeBuilder *treeBuilder aclList list.ACLList - id string - header *aclpb.TreeHeader - tree *Tree + id string + root *treechangeproto.RootChange + tree *Tree keys map[uint64]*symmetric.Key // buffers - difSnapshotBuf []*aclpb.RawTreeChangeWithId + difSnapshotBuf []*treechangeproto.RawTreeChangeWithId tmpChangesBuf []*Change newSnapshotsBuf []*Change notSeenIdxBuf []int @@ -94,11 +94,12 @@ type objectTreeDeps struct { } func defaultObjectTreeDeps( + rootChange *treechangeproto.RawTreeChangeWithId, treeStorage storage.TreeStorage, aclList list.ACLList) objectTreeDeps { keychain := common.NewKeychain() - changeBuilder := newChangeBuilder(keychain) + changeBuilder := newChangeBuilder(keychain, rootChange) treeBuilder := newTreeBuilder(treeStorage, changeBuilder) return objectTreeDeps{ changeBuilder: changeBuilder, @@ -131,8 +132,8 @@ func (ot *objectTree) ID() string { return ot.id } -func (ot *objectTree) Header() *aclpb.TreeHeader { - return ot.header +func (ot *objectTree) Header() *treechangeproto.RootChange { + return ot.root } func (ot *objectTree) Storage() storage.TreeStorage { @@ -172,7 +173,7 @@ func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeCont res = AddResult{ OldHeads: oldHeads, Heads: []string{objChange.Id}, - Added: []*aclpb.RawTreeChangeWithId{rawChange}, + Added: []*treechangeproto.RawTreeChangeWithId{rawChange}, Mode: Append, } return @@ -188,20 +189,20 @@ func (ot *objectTree) prepareBuilderContent(content SignableChangeContent) (cnt return } cnt = BuilderContent{ - treeHeadIds: ot.tree.Heads(), - aclHeadId: ot.aclList.Head().Id, - snapshotBaseId: ot.tree.RootId(), - currentReadKeyHash: state.CurrentReadKeyHash(), - identity: content.Identity, - isSnapshot: content.IsSnapshot, - signingKey: content.Key, - readKey: readKey, - content: content.Data, + TreeHeadIds: ot.tree.Heads(), + AclHeadId: ot.aclList.Head().Id, + SnapshotBaseId: ot.tree.RootId(), + CurrentReadKeyHash: state.CurrentReadKeyHash(), + Identity: content.Identity, + IsSnapshot: content.IsSnapshot, + SigningKey: content.Key, + ReadKey: readKey, + Content: content.Data, } return } -func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawTreeChangeWithId) (addResult AddResult, err error) { +func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*treechangeproto.RawTreeChangeWithId) (addResult AddResult, err error) { addResult, err = ot.addRawChanges(ctx, rawChanges...) if err != nil { return @@ -223,7 +224,7 @@ func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra return } -func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.RawTreeChangeWithId) (addResult AddResult, err error) { +func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechangeproto.RawTreeChangeWithId) (addResult AddResult, err error) { // resetting buffers ot.tmpChangesBuf = ot.tmpChangesBuf[:0] ot.notSeenIdxBuf = ot.notSeenIdxBuf[:0] @@ -275,7 +276,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra // returns changes that we added to the tree as attached this round // they can include not only the changes that were added now, // but also the changes that were previously in the tree - getAddedChanges := func(toConvert []*Change) (added []*aclpb.RawTreeChangeWithId, err error) { + getAddedChanges := func(toConvert []*Change) (added []*treechangeproto.RawTreeChangeWithId, err error) { alreadyConverted := make(map[*Change]struct{}) // first we see if we have already unmarshalled those changes @@ -300,7 +301,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra for _, ch := range toConvert { // if we got some changes that we need to convert to raw if _, exists := alreadyConverted[ch]; !exists { - var raw *aclpb.RawTreeChangeWithId + var raw *treechangeproto.RawTreeChangeWithId raw, err = ot.changeBuilder.BuildRaw(ch) if err != nil { return @@ -342,7 +343,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra ot.rebuildFromStorage(nil) return } - var added []*aclpb.RawTreeChangeWithId + var added []*treechangeproto.RawTreeChangeWithId added, err = getAddedChanges(nil) // we shouldn't get any error in this case if err != nil { @@ -378,7 +379,7 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*aclpb.Ra err = ErrHasInvalidChanges return } - var added []*aclpb.RawTreeChangeWithId + var added []*treechangeproto.RawTreeChangeWithId added, err = getAddedChanges(treeChangesAdded) if err != nil { // that means that some unattached changes were somehow corrupted in memory @@ -409,17 +410,21 @@ func (ot *objectTree) IterateFrom(id string, convert ChangeConvertFunc, iterate ot.tree.Iterate(ot.tree.RootId(), func(c *Change) (isContinue bool) { var model any - if c.ParsedModel != nil { + if c.Model != nil { return iterate(c) } - readKey, exists := ot.keys[c.Content.CurrentReadKeyHash] + // if this is a root change + if c.Id == ot.id { + return iterate(c) + } + readKey, exists := ot.keys[c.ReadKeyHash] if !exists { err = list.ErrNoReadKey return false } var decrypted []byte - decrypted, err = readKey.Decrypt(c.Content.GetChangesData()) + decrypted, err = readKey.Decrypt(c.Data) if err != nil { return false } @@ -429,7 +434,7 @@ func (ot *objectTree) IterateFrom(id string, convert ChangeConvertFunc, iterate return false } - c.ParsedModel = model + c.Model = model return iterate(c) }) return @@ -474,7 +479,7 @@ func (ot *objectTree) SnapshotPath() []string { return path } -func (ot *objectTree) ChangesAfterCommonSnapshot(theirPath, theirHeads []string) ([]*aclpb.RawTreeChangeWithId, error) { +func (ot *objectTree) ChangesAfterCommonSnapshot(theirPath, theirHeads []string) ([]*treechangeproto.RawTreeChangeWithId, error) { var ( needFullDocument = len(theirPath) == 0 ourPath = ot.SnapshotPath() @@ -498,11 +503,11 @@ func (ot *objectTree) ChangesAfterCommonSnapshot(theirPath, theirHeads []string) } } -func (ot *objectTree) getChangesFromTree(theirHeads []string) (rawChanges []*aclpb.RawTreeChangeWithId, err error) { +func (ot *objectTree) getChangesFromTree(theirHeads []string) (rawChanges []*treechangeproto.RawTreeChangeWithId, err error) { return ot.rawChangeLoader.LoadFromTree(ot.tree, theirHeads) } -func (ot *objectTree) getChangesFromDB(commonSnapshot string, theirHeads []string) (rawChanges []*aclpb.RawTreeChangeWithId, err error) { +func (ot *objectTree) getChangesFromDB(commonSnapshot string, theirHeads []string) (rawChanges []*treechangeproto.RawTreeChangeWithId, err error) { return ot.rawChangeLoader.LoadFromStorage(commonSnapshot, ot.tree.headIds, theirHeads) } diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index 6e43d8d3..832c15fa 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -2,10 +2,12 @@ package tree import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "crypto/rand" + "encoding/hex" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -14,8 +16,26 @@ import ( type mockChangeCreator struct{} -func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot bool, prevIds ...string) *aclpb.RawTreeChangeWithId { - aclChange := &aclpb.TreeChange{ +func (c *mockChangeCreator) createRoot(id, aclId string) *treechangeproto.RawTreeChangeWithId { + aclChange := &treechangeproto.RootChange{ + AclHeadId: aclId, + } + res, _ := aclChange.Marshal() + + raw := &treechangeproto.RawTreeChange{ + Payload: res, + Signature: nil, + } + rawMarshalled, _ := raw.Marshal() + + return &treechangeproto.RawTreeChangeWithId{ + RawChange: rawMarshalled, + Id: id, + } +} + +func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot bool, prevIds ...string) *treechangeproto.RawTreeChangeWithId { + aclChange := &treechangeproto.TreeChange{ TreeHeadIds: prevIds, AclHeadId: aclId, SnapshotBaseId: snapshotId, @@ -24,26 +44,21 @@ func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot b } res, _ := aclChange.Marshal() - raw := &aclpb.RawTreeChange{ + raw := &treechangeproto.RawTreeChange{ Payload: res, Signature: nil, } rawMarshalled, _ := raw.Marshal() - return &aclpb.RawTreeChangeWithId{ + return &treechangeproto.RawTreeChangeWithId{ RawChange: rawMarshalled, Id: id, } } -func (c *mockChangeCreator) createNewTreeStorage(treeId, aclListId, aclHeadId, firstChangeId string) storage.TreeStorage { - firstChange := c.createRaw(firstChangeId, aclHeadId, "", true) - header := &aclpb.TreeHeader{ - FirstId: firstChangeId, - AclId: aclListId, - TreeHeaderType: aclpb.TreeHeaderType_Object, - } - treeStorage, _ := storage.NewInMemoryTreeStorage(treeId, header, []string{firstChangeId}, []*aclpb.RawTreeChangeWithId{firstChange}) +func (c *mockChangeCreator) createNewTreeStorage(treeId, aclHeadId string) storage.TreeStorage { + root := c.createRoot(treeId, aclHeadId) + treeStorage, _ := storage.NewInMemoryTreeStorage(treeId, root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root}) return treeStorage } @@ -51,15 +66,23 @@ type mockChangeBuilder struct { originalBuilder ChangeBuilder } -func (c *mockChangeBuilder) ConvertFromRaw(rawChange *aclpb.RawTreeChangeWithId, verify bool) (ch *Change, err error) { - return c.originalBuilder.ConvertFromRaw(rawChange, false) -} - -func (c *mockChangeBuilder) BuildContent(payload BuilderContent) (ch *Change, raw *aclpb.RawTreeChangeWithId, err error) { +func (c *mockChangeBuilder) BuildInitialContent(payload InitialContent) (ch *Change, raw *treechangeproto.RawTreeChangeWithId, err error) { panic("implement me") } -func (c *mockChangeBuilder) BuildRaw(ch *Change) (raw *aclpb.RawTreeChangeWithId, err error) { +func (c *mockChangeBuilder) SetRootRawChange(rawIdChange *treechangeproto.RawTreeChangeWithId) { + c.originalBuilder.SetRootRawChange(rawIdChange) +} + +func (c *mockChangeBuilder) ConvertFromRaw(rawChange *treechangeproto.RawTreeChangeWithId, verify bool) (ch *Change, err error) { + return c.originalBuilder.ConvertFromRaw(rawChange, false) +} + +func (c *mockChangeBuilder) BuildContent(payload BuilderContent) (ch *Change, raw *treechangeproto.RawTreeChangeWithId, err error) { + panic("implement me") +} + +func (c *mockChangeBuilder) BuildRaw(ch *Change) (raw *treechangeproto.RawTreeChangeWithId, err error) { return c.originalBuilder.BuildRaw(ch) } @@ -93,15 +116,15 @@ func prepareACLList(t *testing.T) list.ACLList { func prepareTreeContext(t *testing.T, aclList list.ACLList) testTreeContext { changeCreator := &mockChangeCreator{} - treeStorage := changeCreator.createNewTreeStorage("treeId", aclList.ID(), aclList.Head().Id, "0") + treeStorage := changeCreator.createNewTreeStorage("0", aclList.Head().Id) + root, _ := treeStorage.Root() changeBuilder := &mockChangeBuilder{ - originalBuilder: newChangeBuilder(nil), + originalBuilder: newChangeBuilder(nil, root), } deps := objectTreeDeps{ changeBuilder: changeBuilder, treeBuilder: newTreeBuilder(treeStorage, changeBuilder), treeStorage: treeStorage, - updateListener: nil, rawChangeLoader: newRawChangeLoader(treeStorage, changeBuilder), validator: &mockChangeValidator{}, aclList: aclList, @@ -128,6 +151,18 @@ func prepareTreeContext(t *testing.T, aclList list.ACLList) testTreeContext { } } +func TestSameSignature(t *testing.T) { + privKey, _, err := signingkey.GenerateEd25519Key(rand.Reader) + require.NoError(t, err) + bytes := []byte("asefhiosahjfoiesjgioesajgihs") + for i := 0; i < 5; i++ { + signed, err := privKey.Sign(bytes) + require.NoError(t, err) + t.Log(hex.EncodeToString(signed)) + } + // kitten step voyage hand cover funny timber auction differ mushroom update pulp +} + func TestObjectTree(t *testing.T) { aclList := prepareACLList(t) @@ -137,7 +172,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawTreeChangeWithId{ + rawChanges := []*treechangeproto.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), } @@ -178,7 +213,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawTreeChangeWithId{ + rawChanges := []*treechangeproto.RawTreeChangeWithId{ changeCreator.createRaw("0", aclList.Head().Id, "", true, ""), } res, err := objTree.AddRawChanges(context.Background(), rawChanges...) @@ -198,7 +233,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawTreeChangeWithId{ + rawChanges := []*treechangeproto.RawTreeChangeWithId{ changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), } res, err := objTree.AddRawChanges(context.Background(), rawChanges...) @@ -220,7 +255,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawTreeChangeWithId{ + rawChanges := []*treechangeproto.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), @@ -264,7 +299,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawTreeChangeWithId{ + rawChanges := []*treechangeproto.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), @@ -283,7 +318,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawTreeChangeWithId{ + rawChanges := []*treechangeproto.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), @@ -357,7 +392,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawTreeChangeWithId{ + rawChanges := []*treechangeproto.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), @@ -433,7 +468,7 @@ func TestObjectTree(t *testing.T) { changeCreator := ctx.changeCreator objTree := ctx.objTree - rawChanges := []*aclpb.RawTreeChangeWithId{ + rawChanges := []*treechangeproto.RawTreeChangeWithId{ changeCreator.createRaw("1", aclList.Head().Id, "0", false, "0"), changeCreator.createRaw("2", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("3", aclList.Head().Id, "0", true, "2"), @@ -442,7 +477,7 @@ func TestObjectTree(t *testing.T) { require.NoError(t, err, "adding changes should be without error") require.Equal(t, "3", objTree.Root().Id) - rawChanges = []*aclpb.RawTreeChangeWithId{ + rawChanges = []*treechangeproto.RawTreeChangeWithId{ changeCreator.createRaw("4", aclList.Head().Id, "0", false, "2"), changeCreator.createRaw("5", aclList.Head().Id, "0", false, "1"), changeCreator.createRaw("6", aclList.Head().Id, "0", false, "3", "4", "5"), diff --git a/pkg/acl/tree/objecttreefactory.go b/pkg/acl/tree/objecttreefactory.go index 44dc1fb5..f6ab5f77 100644 --- a/pkg/acl/tree/objecttreefactory.go +++ b/pkg/acl/tree/objecttreefactory.go @@ -1,11 +1,10 @@ package tree import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "github.com/gogo/protobuf/proto" @@ -13,14 +12,19 @@ import ( ) type ObjectTreeCreatePayload struct { - AccountData *account.AccountData - HeaderData []byte - ChangeData []byte - TreeType aclpb.TreeHeaderType + SignKey signingkey.PrivKey + ChangeType string + Seed []byte + SpaceId string + Identity []byte } func BuildObjectTree(treeStorage storage.TreeStorage, aclList list.ACLList) (ObjectTree, error) { - deps := defaultObjectTreeDeps(treeStorage, aclList) + rootChange, err := treeStorage.Root() + if err != nil { + return nil, err + } + deps := defaultObjectTreeDeps(rootChange, treeStorage, aclList) return buildObjectTree(deps) } @@ -30,54 +34,35 @@ func CreateObjectTree( createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { aclList.RLock() var ( - deps = defaultObjectTreeDeps(nil, aclList) - state = aclList.ACLState() - aclId = aclList.ID() - aclHeadId = aclList.Head().Id - readKeyHash = state.CurrentReadKeyHash() + deps = defaultObjectTreeDeps(nil, nil, aclList) + aclHeadId = aclList.Head().Id ) - readKey, err := state.CurrentReadKey() aclList.RUnlock() if err != nil { return } - - // create first change - cnt := BuilderContent{ - treeHeadIds: nil, - aclHeadId: aclHeadId, - snapshotBaseId: "", - currentReadKeyHash: readKeyHash, - isSnapshot: true, - readKey: readKey, - identity: payload.AccountData.Identity, - signingKey: payload.AccountData.SignKey, - content: payload.ChangeData, + cnt := InitialContent{ + AclHeadId: aclHeadId, + Identity: payload.Identity, + SigningKey: payload.SignKey, + SpaceId: payload.SpaceId, + Seed: payload.Seed, + ChangeType: payload.ChangeType, } - _, raw, err := deps.changeBuilder.BuildContent(cnt) - if err != nil { - return - } - - // create header - header, id, err := createTreeHeaderAndId( - raw, - payload.TreeType, - aclId, - payload.AccountData.Identity, - payload.HeaderData) + _, raw, err := deps.changeBuilder.BuildInitialContent(cnt) if err != nil { return } + deps.changeBuilder.SetRootRawChange(raw) // create storage st, err := createStorage(storage.TreeStorageCreatePayload{ - TreeId: id, - Header: header, - Changes: []*aclpb.RawTreeChangeWithId{raw}, - Heads: []string{raw.Id}, + TreeId: raw.Id, + RootRawChange: raw, + Changes: []*treechangeproto.RawTreeChangeWithId{raw}, + Heads: []string{raw.Id}, }) if err != nil { return @@ -98,7 +83,7 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { tree: nil, keys: make(map[uint64]*symmetric.Key), tmpChangesBuf: make([]*Change, 0, 10), - difSnapshotBuf: make([]*aclpb.RawTreeChangeWithId, 0, 10), + difSnapshotBuf: make([]*treechangeproto.RawTreeChangeWithId, 0, 10), notSeenIdxBuf: make([]int, 0, 10), newSnapshotsBuf: make([]*Change, 0, 10), } @@ -128,32 +113,23 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { if err != nil { return nil, err } - objTree.header, err = objTree.treeStorage.Header() + + rawRootWithId, err := objTree.treeStorage.Root() + if err != nil { + return nil, err + } + + rawRoot := &treechangeproto.RawTreeChange{} + err = proto.Unmarshal(rawRootWithId.RawChange, rawRoot) + if err != nil { + return nil, err + } + + objTree.root = &treechangeproto.RootChange{} + err = proto.Unmarshal(rawRoot.Payload, objTree.root) if err != nil { return nil, err } return objTree, nil } - -func createTreeHeaderAndId( - raw *aclpb.RawTreeChangeWithId, - treeType aclpb.TreeHeaderType, - aclId string, - identity []byte, - headerData []byte) (header *aclpb.TreeHeader, treeId string, err error) { - header = &aclpb.TreeHeader{ - FirstId: raw.Id, - TreeHeaderType: treeType, - AclId: aclId, - Identity: identity, - Data: headerData, - } - marshalledHeader, err := proto.Marshal(header) - if err != nil { - return - } - - treeId, err = cid.NewCIDFromBytes(marshalledHeader) - return -} diff --git a/pkg/acl/tree/rawloader.go b/pkg/acl/tree/rawloader.go index c068cdba..6f6c8539 100644 --- a/pkg/acl/tree/rawloader.go +++ b/pkg/acl/tree/rawloader.go @@ -2,8 +2,8 @@ package tree import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" "time" ) @@ -18,7 +18,7 @@ type rawChangeLoader struct { type rawCacheEntry struct { change *Change - rawChange *aclpb.RawTreeChangeWithId + rawChange *treechangeproto.RawTreeChangeWithId position int } @@ -29,15 +29,15 @@ func newRawChangeLoader(treeStorage storage.TreeStorage, changeBuilder ChangeBui } } -func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb.RawTreeChangeWithId, error) { +func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*treechangeproto.RawTreeChangeWithId, error) { var stack []*Change for _, h := range t.headIds { stack = append(stack, t.attached[h]) } - convert := func(chs []*Change) (rawChanges []*aclpb.RawTreeChangeWithId, err error) { + convert := func(chs []*Change) (rawChanges []*treechangeproto.RawTreeChangeWithId, err error) { for _, ch := range chs { - var raw *aclpb.RawTreeChangeWithId + var raw *treechangeproto.RawTreeChangeWithId raw, err = r.changeBuilder.BuildRaw(ch) if err != nil { return @@ -95,7 +95,7 @@ func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*aclpb. return convert(results) } -func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoints []string) ([]*aclpb.RawTreeChangeWithId, error) { +func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoints []string) ([]*treechangeproto.RawTreeChangeWithId, error) { // resetting cache r.cache = make(map[string]rawCacheEntry) defer func() { @@ -162,7 +162,7 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi // preparing first pass r.idStack = append(r.idStack, heads...) - var buffer []*aclpb.RawTreeChangeWithId + var buffer []*treechangeproto.RawTreeChangeWithId rootVisited := dfs(commonSnapshot, heads, 0, func(counter int, mapExists bool) bool { @@ -203,7 +203,7 @@ func (r *rawChangeLoader) LoadFromStorage(commonSnapshot string, heads, breakpoi }) // discarding visited - buffer = discardFromSlice(buffer, func(change *aclpb.RawTreeChangeWithId) bool { + buffer = discardFromSlice(buffer, func(change *treechangeproto.RawTreeChangeWithId) bool { return change == nil }) diff --git a/pkg/acl/tree/treegraph_nix.go b/pkg/acl/tree/treegraph_nix.go index c506c9b3..ae4f5281 100644 --- a/pkg/acl/tree/treegraph_nix.go +++ b/pkg/acl/tree/treegraph_nix.go @@ -59,7 +59,7 @@ func (t *Tree) Graph(parser DescriptionParser) (data string, err error) { label := fmt.Sprintf("Id: %s\nOrd: %s\nTime: %s\nChanges: %s\n", shortId, ord, - time.Unix(c.Content.Timestamp, 0).Format("02.01.06 15:04:05"), + time.Unix(c.Timestamp, 0).Format("02.01.06 15:04:05"), strings.Join(chSymbs, ","), ) n.SetLabel(label) diff --git a/pkg/acl/treechangeproto/protos/treechange.proto b/pkg/acl/treechangeproto/protos/treechange.proto new file mode 100644 index 00000000..8f733a5d --- /dev/null +++ b/pkg/acl/treechangeproto/protos/treechange.proto @@ -0,0 +1,55 @@ +syntax = "proto3"; +package treechange; +option go_package = "pkg/acl/treechangeproto"; + +// RootChange is a root of a tree +message RootChange { + // AclHeadId is a cid of latest acl record at the time of tree creation + string aclHeadId = 1; + // SpaceId is an id of space where the document is placed + string spaceId = 2; + // ChangeType is a type of tree which this RootChange is a root of + string changeType = 3; + // Timestamp is this change creation timestamp + int64 timestamp = 4; + // Seed is a random bytes to make root change unique + bytes seed = 5; + // Identity is a public key of the tree's creator + bytes identity = 6; +} + +// TreeChange is a change of a tree +message TreeChange { + // TreeHeadIds are previous ids for this TreeChange + repeated string treeHeadIds = 1; + // AclHeadId is a cid of latest acl record at the time of this change + string aclHeadId = 2; + // SnapshotBaseId is a snapshot (root) of the tree where this change is added + string snapshotBaseId = 3; + // ChangesData is an arbitrary payload to be read by the client + bytes changesData = 4; + // CurrentReadKeyHash is the hash of the read key which is used to encrypt this change + uint64 currentReadKeyHash = 5; + // Timestamp is this change creation timestamp + int64 timestamp = 6; + // Identity is a public key with which the raw payload of this change is signed + bytes identity = 7; + // IsSnapshot indicates whether this change contains a snapshot of state + bool isSnapshot = 8; +} + +// RawTreeChange is a marshalled TreeChange (or RootChange) payload and a signature of this payload +message RawTreeChange { + // Payload is a byte payload containing TreeChange + bytes payload = 1; + // Signature is a signature made by identity indicated in the TreeChange payload + bytes signature = 2; +} + +// RawTreeChangeWithId is a marshalled RawTreeChange with CID +message RawTreeChangeWithId { + // RawChange is a byte payload of RawTreeChange + bytes rawChange = 1; + // Id is a cid made from rawChange payload + string id = 2; +} diff --git a/pkg/acl/treechangeproto/treechange.pb.go b/pkg/acl/treechangeproto/treechange.pb.go new file mode 100644 index 00000000..fd4deb8a --- /dev/null +++ b/pkg/acl/treechangeproto/treechange.pb.go @@ -0,0 +1,1537 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: pkg/acl/treechangeproto/protos/treechange.proto + +package treechangeproto + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// RootChange is a root of a tree +type RootChange struct { + // AclHeadId is a cid of latest acl record at the time of tree creation + AclHeadId string `protobuf:"bytes,1,opt,name=aclHeadId,proto3" json:"aclHeadId,omitempty"` + // SpaceId is an id of space where the document is placed + SpaceId string `protobuf:"bytes,2,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + // ChangeType is a type of tree which this RootChange is a root of + ChangeType string `protobuf:"bytes,3,opt,name=changeType,proto3" json:"changeType,omitempty"` + // Timestamp is this change creation timestamp + Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Seed is a random bytes to make root change unique + Seed []byte `protobuf:"bytes,5,opt,name=seed,proto3" json:"seed,omitempty"` + // Identity is a public key of the tree's creator + Identity []byte `protobuf:"bytes,6,opt,name=identity,proto3" json:"identity,omitempty"` +} + +func (m *RootChange) Reset() { *m = RootChange{} } +func (m *RootChange) String() string { return proto.CompactTextString(m) } +func (*RootChange) ProtoMessage() {} +func (*RootChange) Descriptor() ([]byte, []int) { + return fileDescriptor_f177d8514fae978f, []int{0} +} +func (m *RootChange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RootChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RootChange.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 *RootChange) XXX_Merge(src proto.Message) { + xxx_messageInfo_RootChange.Merge(m, src) +} +func (m *RootChange) XXX_Size() int { + return m.Size() +} +func (m *RootChange) XXX_DiscardUnknown() { + xxx_messageInfo_RootChange.DiscardUnknown(m) +} + +var xxx_messageInfo_RootChange proto.InternalMessageInfo + +func (m *RootChange) GetAclHeadId() string { + if m != nil { + return m.AclHeadId + } + return "" +} + +func (m *RootChange) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +func (m *RootChange) GetChangeType() string { + if m != nil { + return m.ChangeType + } + return "" +} + +func (m *RootChange) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *RootChange) GetSeed() []byte { + if m != nil { + return m.Seed + } + return nil +} + +func (m *RootChange) GetIdentity() []byte { + if m != nil { + return m.Identity + } + return nil +} + +// TreeChange is a change of a tree +type TreeChange struct { + // TreeHeadIds are previous ids for this TreeChange + TreeHeadIds []string `protobuf:"bytes,1,rep,name=treeHeadIds,proto3" json:"treeHeadIds,omitempty"` + // AclHeadId is a cid of latest acl record at the time of this change + AclHeadId string `protobuf:"bytes,2,opt,name=aclHeadId,proto3" json:"aclHeadId,omitempty"` + // SnapshotBaseId is a snapshot (root) of the tree where this change is added + SnapshotBaseId string `protobuf:"bytes,3,opt,name=snapshotBaseId,proto3" json:"snapshotBaseId,omitempty"` + // ChangesData is an arbitrary payload to be read by the client + ChangesData []byte `protobuf:"bytes,4,opt,name=changesData,proto3" json:"changesData,omitempty"` + // CurrentReadKeyHash is the hash of the read key which is used to encrypt this change + CurrentReadKeyHash uint64 `protobuf:"varint,5,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` + // Timestamp is this change creation timestamp + Timestamp int64 `protobuf:"varint,6,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Identity is a public key with which the raw payload of this change is signed + Identity []byte `protobuf:"bytes,7,opt,name=identity,proto3" json:"identity,omitempty"` + // IsSnapshot indicates whether this change contains a snapshot of state + IsSnapshot bool `protobuf:"varint,8,opt,name=isSnapshot,proto3" json:"isSnapshot,omitempty"` +} + +func (m *TreeChange) Reset() { *m = TreeChange{} } +func (m *TreeChange) String() string { return proto.CompactTextString(m) } +func (*TreeChange) ProtoMessage() {} +func (*TreeChange) Descriptor() ([]byte, []int) { + return fileDescriptor_f177d8514fae978f, []int{1} +} +func (m *TreeChange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TreeChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TreeChange.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 *TreeChange) XXX_Merge(src proto.Message) { + xxx_messageInfo_TreeChange.Merge(m, src) +} +func (m *TreeChange) XXX_Size() int { + return m.Size() +} +func (m *TreeChange) XXX_DiscardUnknown() { + xxx_messageInfo_TreeChange.DiscardUnknown(m) +} + +var xxx_messageInfo_TreeChange proto.InternalMessageInfo + +func (m *TreeChange) GetTreeHeadIds() []string { + if m != nil { + return m.TreeHeadIds + } + return nil +} + +func (m *TreeChange) GetAclHeadId() string { + if m != nil { + return m.AclHeadId + } + return "" +} + +func (m *TreeChange) GetSnapshotBaseId() string { + if m != nil { + return m.SnapshotBaseId + } + return "" +} + +func (m *TreeChange) GetChangesData() []byte { + if m != nil { + return m.ChangesData + } + return nil +} + +func (m *TreeChange) GetCurrentReadKeyHash() uint64 { + if m != nil { + return m.CurrentReadKeyHash + } + return 0 +} + +func (m *TreeChange) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *TreeChange) GetIdentity() []byte { + if m != nil { + return m.Identity + } + return nil +} + +func (m *TreeChange) GetIsSnapshot() bool { + if m != nil { + return m.IsSnapshot + } + return false +} + +// RawTreeChange is a marshalled TreeChange (or RootChange) payload and a signature of this payload +type RawTreeChange struct { + // Payload is a byte payload containing TreeChange + Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` + // Signature is a signature made by identity indicated in the TreeChange payload + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` +} + +func (m *RawTreeChange) Reset() { *m = RawTreeChange{} } +func (m *RawTreeChange) String() string { return proto.CompactTextString(m) } +func (*RawTreeChange) ProtoMessage() {} +func (*RawTreeChange) Descriptor() ([]byte, []int) { + return fileDescriptor_f177d8514fae978f, []int{2} +} +func (m *RawTreeChange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RawTreeChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RawTreeChange.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 *RawTreeChange) XXX_Merge(src proto.Message) { + xxx_messageInfo_RawTreeChange.Merge(m, src) +} +func (m *RawTreeChange) XXX_Size() int { + return m.Size() +} +func (m *RawTreeChange) XXX_DiscardUnknown() { + xxx_messageInfo_RawTreeChange.DiscardUnknown(m) +} + +var xxx_messageInfo_RawTreeChange proto.InternalMessageInfo + +func (m *RawTreeChange) GetPayload() []byte { + if m != nil { + return m.Payload + } + return nil +} + +func (m *RawTreeChange) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +// RawTreeChangeWithId is a marshalled RawTreeChange with CID +type RawTreeChangeWithId struct { + // RawChange is a byte payload of RawTreeChange + RawChange []byte `protobuf:"bytes,1,opt,name=rawChange,proto3" json:"rawChange,omitempty"` + // Id is a cid made from rawChange payload + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *RawTreeChangeWithId) Reset() { *m = RawTreeChangeWithId{} } +func (m *RawTreeChangeWithId) String() string { return proto.CompactTextString(m) } +func (*RawTreeChangeWithId) ProtoMessage() {} +func (*RawTreeChangeWithId) Descriptor() ([]byte, []int) { + return fileDescriptor_f177d8514fae978f, []int{3} +} +func (m *RawTreeChangeWithId) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RawTreeChangeWithId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RawTreeChangeWithId.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 *RawTreeChangeWithId) XXX_Merge(src proto.Message) { + xxx_messageInfo_RawTreeChangeWithId.Merge(m, src) +} +func (m *RawTreeChangeWithId) XXX_Size() int { + return m.Size() +} +func (m *RawTreeChangeWithId) XXX_DiscardUnknown() { + xxx_messageInfo_RawTreeChangeWithId.DiscardUnknown(m) +} + +var xxx_messageInfo_RawTreeChangeWithId proto.InternalMessageInfo + +func (m *RawTreeChangeWithId) GetRawChange() []byte { + if m != nil { + return m.RawChange + } + return nil +} + +func (m *RawTreeChangeWithId) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func init() { + proto.RegisterType((*RootChange)(nil), "treechange.RootChange") + proto.RegisterType((*TreeChange)(nil), "treechange.TreeChange") + proto.RegisterType((*RawTreeChange)(nil), "treechange.RawTreeChange") + proto.RegisterType((*RawTreeChangeWithId)(nil), "treechange.RawTreeChangeWithId") +} + +func init() { + proto.RegisterFile("pkg/acl/treechangeproto/protos/treechange.proto", fileDescriptor_f177d8514fae978f) +} + +var fileDescriptor_f177d8514fae978f = []byte{ + // 393 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xcf, 0x0e, 0x93, 0x40, + 0x10, 0x87, 0xbb, 0xb4, 0xf6, 0xcf, 0x88, 0x3d, 0xac, 0x07, 0x37, 0xc6, 0x10, 0xc2, 0xc1, 0x70, + 0x2a, 0x31, 0xbe, 0x41, 0x6b, 0x62, 0x1b, 0x6f, 0x6b, 0x13, 0x13, 0x6f, 0x23, 0x4c, 0xca, 0xc6, + 0x16, 0x08, 0xbb, 0x4d, 0xc3, 0x5b, 0xf8, 0x08, 0x3e, 0x83, 0x4f, 0xe1, 0xb1, 0x47, 0x8f, 0xa6, + 0x7d, 0x11, 0xc3, 0xd2, 0x0a, 0x34, 0x7a, 0x01, 0xe6, 0x9b, 0x30, 0xcc, 0xef, 0x63, 0x21, 0x2a, + 0xbe, 0xee, 0x22, 0x8c, 0xf7, 0x91, 0x29, 0x89, 0xe2, 0x14, 0xb3, 0x1d, 0x15, 0x65, 0x6e, 0xf2, + 0xc8, 0x5e, 0x75, 0x07, 0x2f, 0x2c, 0xe1, 0xd0, 0x92, 0xe0, 0x07, 0x03, 0x90, 0x79, 0x6e, 0x56, + 0xb6, 0xe4, 0xaf, 0x60, 0x86, 0xf1, 0x7e, 0x4d, 0x98, 0x6c, 0x12, 0xc1, 0x7c, 0x16, 0xce, 0x64, + 0x0b, 0xb8, 0x80, 0x89, 0x2e, 0x30, 0xa6, 0x4d, 0x22, 0x1c, 0xdb, 0xbb, 0x97, 0xdc, 0x03, 0x68, + 0x06, 0x6e, 0xab, 0x82, 0xc4, 0xd0, 0x36, 0x3b, 0xa4, 0x9e, 0x6b, 0xd4, 0x81, 0xb4, 0xc1, 0x43, + 0x21, 0x46, 0x3e, 0x0b, 0x87, 0xb2, 0x05, 0x9c, 0xc3, 0x48, 0x13, 0x25, 0xe2, 0x89, 0xcf, 0x42, + 0x57, 0xda, 0x67, 0xfe, 0x12, 0xa6, 0x2a, 0xa1, 0xcc, 0x28, 0x53, 0x89, 0xb1, 0xe5, 0x7f, 0xeb, + 0xe0, 0xbb, 0x03, 0xb0, 0x2d, 0x89, 0x6e, 0x4b, 0xfb, 0xf0, 0xb4, 0x4e, 0xd4, 0x2c, 0xa9, 0x05, + 0xf3, 0x87, 0xe1, 0x4c, 0x76, 0x51, 0x3f, 0x96, 0xf3, 0x18, 0xeb, 0x35, 0xcc, 0x75, 0x86, 0x85, + 0x4e, 0x73, 0xb3, 0x44, 0x5d, 0xa7, 0x6b, 0x02, 0x3c, 0xd0, 0xfa, 0x3b, 0x4d, 0x24, 0xfd, 0x0e, + 0x0d, 0xda, 0x18, 0xae, 0xec, 0x22, 0xbe, 0x00, 0x1e, 0x1f, 0xcb, 0x92, 0x32, 0x23, 0x09, 0x93, + 0x0f, 0x54, 0xad, 0x51, 0xa7, 0x36, 0xd6, 0x48, 0xfe, 0xa3, 0xd3, 0xd7, 0x32, 0x7e, 0xd4, 0xd2, + 0x55, 0x30, 0xe9, 0x2b, 0xa8, 0x85, 0x2b, 0xfd, 0xf1, 0xb6, 0x9f, 0x98, 0xfa, 0x2c, 0x9c, 0xca, + 0x0e, 0x09, 0xde, 0xc3, 0x33, 0x89, 0xa7, 0x8e, 0x24, 0x01, 0x93, 0x02, 0xab, 0x7d, 0x8e, 0xcd, + 0x7f, 0x75, 0xe5, 0xbd, 0xac, 0x97, 0xd0, 0x6a, 0x97, 0xa1, 0x39, 0x96, 0x64, 0xe5, 0xb8, 0xb2, + 0x05, 0xc1, 0x0a, 0x9e, 0xf7, 0x06, 0x7d, 0x52, 0x26, 0xdd, 0xd8, 0x97, 0x4a, 0x3c, 0x35, 0xe8, + 0x36, 0xb0, 0x05, 0x7c, 0x0e, 0x8e, 0xba, 0x8b, 0x76, 0x54, 0xb2, 0x7c, 0xf3, 0xf3, 0xe2, 0xb1, + 0xf3, 0xc5, 0x63, 0xbf, 0x2f, 0x1e, 0xfb, 0x76, 0xf5, 0x06, 0xe7, 0xab, 0x37, 0xf8, 0x75, 0xf5, + 0x06, 0x9f, 0x5f, 0xfc, 0xe7, 0xf0, 0x7e, 0x19, 0xdb, 0xdb, 0xdb, 0x3f, 0x01, 0x00, 0x00, 0xff, + 0xff, 0xa5, 0x78, 0xc6, 0x1e, 0xde, 0x02, 0x00, 0x00, +} + +func (m *RootChange) 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 *RootChange) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RootChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.Identity))) + i-- + dAtA[i] = 0x32 + } + if len(m.Seed) > 0 { + i -= len(m.Seed) + copy(dAtA[i:], m.Seed) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.Seed))) + i-- + dAtA[i] = 0x2a + } + if m.Timestamp != 0 { + i = encodeVarintTreechange(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x20 + } + if len(m.ChangeType) > 0 { + i -= len(m.ChangeType) + copy(dAtA[i:], m.ChangeType) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.ChangeType))) + i-- + dAtA[i] = 0x1a + } + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0x12 + } + if len(m.AclHeadId) > 0 { + i -= len(m.AclHeadId) + copy(dAtA[i:], m.AclHeadId) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.AclHeadId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TreeChange) 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 *TreeChange) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.IsSnapshot { + i-- + if m.IsSnapshot { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x40 + } + if len(m.Identity) > 0 { + i -= len(m.Identity) + copy(dAtA[i:], m.Identity) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.Identity))) + i-- + dAtA[i] = 0x3a + } + if m.Timestamp != 0 { + i = encodeVarintTreechange(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x30 + } + if m.CurrentReadKeyHash != 0 { + i = encodeVarintTreechange(dAtA, i, uint64(m.CurrentReadKeyHash)) + i-- + dAtA[i] = 0x28 + } + if len(m.ChangesData) > 0 { + i -= len(m.ChangesData) + copy(dAtA[i:], m.ChangesData) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.ChangesData))) + i-- + dAtA[i] = 0x22 + } + if len(m.SnapshotBaseId) > 0 { + i -= len(m.SnapshotBaseId) + copy(dAtA[i:], m.SnapshotBaseId) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.SnapshotBaseId))) + i-- + dAtA[i] = 0x1a + } + if len(m.AclHeadId) > 0 { + i -= len(m.AclHeadId) + copy(dAtA[i:], m.AclHeadId) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.AclHeadId))) + i-- + dAtA[i] = 0x12 + } + if len(m.TreeHeadIds) > 0 { + for iNdEx := len(m.TreeHeadIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TreeHeadIds[iNdEx]) + copy(dAtA[i:], m.TreeHeadIds[iNdEx]) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.TreeHeadIds[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *RawTreeChange) 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 *RawTreeChange) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RawTreeChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signature) > 0 { + i -= len(m.Signature) + copy(dAtA[i:], m.Signature) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.Signature))) + i-- + dAtA[i] = 0x12 + } + if len(m.Payload) > 0 { + i -= len(m.Payload) + copy(dAtA[i:], m.Payload) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.Payload))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RawTreeChangeWithId) 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 *RawTreeChangeWithId) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RawTreeChangeWithId) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.RawChange) > 0 { + i -= len(m.RawChange) + copy(dAtA[i:], m.RawChange) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.RawChange))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintTreechange(dAtA []byte, offset int, v uint64) int { + offset -= sovTreechange(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *RootChange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.AclHeadId) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + l = len(m.ChangeType) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + if m.Timestamp != 0 { + n += 1 + sovTreechange(uint64(m.Timestamp)) + } + l = len(m.Seed) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + l = len(m.Identity) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + return n +} + +func (m *TreeChange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.TreeHeadIds) > 0 { + for _, s := range m.TreeHeadIds { + l = len(s) + n += 1 + l + sovTreechange(uint64(l)) + } + } + l = len(m.AclHeadId) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + l = len(m.SnapshotBaseId) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + l = len(m.ChangesData) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + if m.CurrentReadKeyHash != 0 { + n += 1 + sovTreechange(uint64(m.CurrentReadKeyHash)) + } + if m.Timestamp != 0 { + n += 1 + sovTreechange(uint64(m.Timestamp)) + } + l = len(m.Identity) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + if m.IsSnapshot { + n += 2 + } + return n +} + +func (m *RawTreeChange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Payload) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + l = len(m.Signature) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + return n +} + +func (m *RawTreeChangeWithId) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.RawChange) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + return n +} + +func sovTreechange(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTreechange(x uint64) (n int) { + return sovTreechange(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *RootChange) 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 ErrIntOverflowTreechange + } + 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: RootChange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RootChange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AclHeadId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AclHeadId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + 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 ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChangeType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChangeType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Seed", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Seed = append(m.Seed[:0], dAtA[iNdEx:postIndex]...) + if m.Seed == nil { + m.Seed = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTreechange(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTreechange + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TreeChange) 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 ErrIntOverflowTreechange + } + 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: TreeChange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TreeChange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TreeHeadIds", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TreeHeadIds = append(m.TreeHeadIds, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AclHeadId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AclHeadId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotBaseId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotBaseId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChangesData", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChangesData = append(m.ChangesData[:0], dAtA[iNdEx:postIndex]...) + if m.ChangesData == nil { + m.ChangesData = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentReadKeyHash", wireType) + } + m.CurrentReadKeyHash = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentReadKeyHash |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identity = append(m.Identity[:0], dAtA[iNdEx:postIndex]...) + if m.Identity == nil { + m.Identity = []byte{} + } + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsSnapshot", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IsSnapshot = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipTreechange(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTreechange + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RawTreeChange) 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 ErrIntOverflowTreechange + } + 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: RawTreeChange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RawTreeChange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) + if m.Payload == nil { + m.Payload = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) + if m.Signature == nil { + m.Signature = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTreechange(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTreechange + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RawTreeChangeWithId) 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 ErrIntOverflowTreechange + } + 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: RawTreeChangeWithId: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RawTreeChangeWithId: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RawChange", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RawChange = append(m.RawChange[:0], dAtA[iNdEx:postIndex]...) + if m.RawChange == nil { + m.RawChange = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTreechange(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTreechange + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTreechange(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTreechange + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTreechange + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTreechange + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTreechange + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTreechange + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTreechange + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTreechange = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTreechange = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTreechange = fmt.Errorf("proto: unexpected end of group") +) diff --git a/service/document/service.go b/service/document/service.go index c8010e10..6d1192c2 100644 --- a/service/document/service.go +++ b/service/document/service.go @@ -6,7 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" testchanges "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/proto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" diff --git a/service/storage/service.go b/service/storage/service.go index 43fb44d5..627627c0 100644 --- a/service/storage/service.go +++ b/service/storage/service.go @@ -4,7 +4,7 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" ) diff --git a/service/treecache/service.go b/service/treecache/service.go index 829885e3..90e91b98 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -6,7 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" aclstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" diff --git a/syncproto/proto/sync.proto b/syncproto/proto/sync.proto index 80548336..d1c60d7d 100644 --- a/syncproto/proto/sync.proto +++ b/syncproto/proto/sync.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package anytype; option go_package = "/syncproto"; -import "pkg/acl/aclchanges/aclpb/protos/aclchanges.proto"; +import "pkg/acl/aclrecordproto/aclpb/protos/aclrecordproto.proto"; message Message { Header header = 1; From d77d8dbdd14a96242354bf7faca04d65950a38a9 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 26 Sep 2022 12:03:20 +0200 Subject: [PATCH 084/219] Fixes to acls --- pkg/acl/aclrecordproto/aclrecord.pb.go | 294 ++++++++---------- pkg/acl/aclrecordproto/protos/aclrecord.proto | 6 +- pkg/acl/common/keychain.go | 9 +- pkg/acl/list/aclreadkeyderive.go | 10 + pkg/acl/list/aclrecordbuilder.go | 95 ++++++ pkg/acl/list/aclstate.go | 184 ++++++----- pkg/acl/list/aclstatebuilder.go | 29 +- pkg/acl/list/changebuilder.go | 131 -------- pkg/acl/list/list.go | 82 ++--- pkg/acl/list/record.go | 69 +--- util/keys/symmetric/symmetric.go | 7 + 11 files changed, 401 insertions(+), 515 deletions(-) create mode 100644 pkg/acl/list/aclreadkeyderive.go create mode 100644 pkg/acl/list/aclrecordbuilder.go delete mode 100644 pkg/acl/list/changebuilder.go diff --git a/pkg/acl/aclrecordproto/aclrecord.pb.go b/pkg/acl/aclrecordproto/aclrecord.pb.go index 69035b70..158b70f5 100644 --- a/pkg/acl/aclrecordproto/aclrecord.pb.go +++ b/pkg/acl/aclrecordproto/aclrecord.pb.go @@ -231,11 +231,13 @@ func (m *ACLRecord) GetTimestamp() int64 { } type ACLRoot struct { - Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` - SpaceId string `protobuf:"bytes,3,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - EncryptedReadKey []byte `protobuf:"bytes,4,opt,name=encryptedReadKey,proto3" json:"encryptedReadKey,omitempty"` - DerivationScheme string `protobuf:"bytes,5,opt,name=derivationScheme,proto3" json:"derivationScheme,omitempty"` + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` + SpaceId string `protobuf:"bytes,3,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + EncryptedReadKey []byte `protobuf:"bytes,4,opt,name=encryptedReadKey,proto3" json:"encryptedReadKey,omitempty"` + DerivationScheme string `protobuf:"bytes,5,opt,name=derivationScheme,proto3" json:"derivationScheme,omitempty"` + CurrentReadKeyHash uint64 `protobuf:"varint,6,opt,name=currentReadKeyHash,proto3" json:"currentReadKeyHash,omitempty"` + Timestamp int64 `protobuf:"varint,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (m *ACLRoot) Reset() { *m = ACLRoot{} } @@ -306,6 +308,20 @@ func (m *ACLRoot) GetDerivationScheme() string { return "" } +func (m *ACLRoot) GetCurrentReadKeyHash() uint64 { + if m != nil { + return m.CurrentReadKeyHash + } + return 0 +} + +func (m *ACLRoot) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + type ACLContentValue struct { // Types that are valid to be assigned to Value: // *ACLContentValue_UserAdd @@ -535,11 +551,9 @@ func (m *ACLState) GetInvites() map[string]*ACLUserInvite { } type ACLUserState struct { - Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` - EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` - Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=aclrecord.ACLUserPermissions" json:"permissions,omitempty"` - IsConfirmed bool `protobuf:"varint,5,opt,name=isConfirmed,proto3" json:"isConfirmed,omitempty"` + Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` + EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` + Permissions ACLUserPermissions `protobuf:"varint,3,opt,name=permissions,proto3,enum=aclrecord.ACLUserPermissions" json:"permissions,omitempty"` } func (m *ACLUserState) Reset() { *m = ACLUserState{} } @@ -589,13 +603,6 @@ func (m *ACLUserState) GetEncryptionKey() []byte { return nil } -func (m *ACLUserState) GetEncryptedReadKeys() [][]byte { - if m != nil { - return m.EncryptedReadKeys - } - return nil -} - func (m *ACLUserState) GetPermissions() ACLUserPermissions { if m != nil { return m.Permissions @@ -603,13 +610,6 @@ func (m *ACLUserState) GetPermissions() ACLUserPermissions { return ACLUserPermissions_Admin } -func (m *ACLUserState) GetIsConfirmed() bool { - if m != nil { - return m.IsConfirmed - } - return false -} - type ACLUserAdd struct { Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` @@ -1018,61 +1018,61 @@ func init() { } var fileDescriptor_14abe0d1b4206d54 = []byte{ - // 862 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0xcd, 0x6e, 0x23, 0x45, - 0x10, 0x76, 0x8f, 0x9d, 0x38, 0x53, 0xe3, 0xdd, 0x78, 0x5b, 0x90, 0x1d, 0x45, 0x8b, 0x65, 0x8d, - 0x38, 0x58, 0x2b, 0xf0, 0x82, 0x41, 0x5a, 0x94, 0x03, 0xc8, 0x6b, 0x76, 0x65, 0x93, 0x1c, 0x56, - 0x1d, 0x60, 0x11, 0xb7, 0xde, 0x99, 0x26, 0x69, 0xad, 0x3d, 0x33, 0xea, 0x6e, 0x1b, 0xf9, 0xc8, - 0x1b, 0xf0, 0x0a, 0x3c, 0x08, 0x27, 0x2e, 0x1c, 0x73, 0x41, 0xe2, 0x08, 0xc9, 0x0b, 0x70, 0xe7, - 0x82, 0xba, 0xe7, 0xdf, 0xe3, 0x58, 0x42, 0x8a, 0x90, 0x38, 0x24, 0x9e, 0xaa, 0xfa, 0xaa, 0xfc, - 0xd5, 0xd7, 0x35, 0xd5, 0x86, 0xf7, 0xe3, 0x37, 0x17, 0x4f, 0xa8, 0x3f, 0xd7, 0x7f, 0x82, 0xf9, - 0x91, 0x08, 0x62, 0x11, 0xa9, 0xe8, 0x89, 0xf9, 0x2f, 0x0b, 0xef, 0xd0, 0x38, 0xb0, 0x9d, 0x3b, - 0xbc, 0x17, 0xd0, 0x21, 0xf4, 0xfb, 0xf1, 0xe4, 0x8c, 0x18, 0x1b, 0xbb, 0xd0, 0x8e, 0xe9, 0x7a, - 0x1e, 0xd1, 0xc0, 0x45, 0x7d, 0x34, 0xe8, 0x90, 0xcc, 0xc4, 0x8f, 0xc0, 0x96, 0xfc, 0x22, 0xa4, - 0x6a, 0x29, 0x98, 0x6b, 0x99, 0x58, 0xe1, 0xf0, 0x3e, 0x05, 0x5c, 0xae, 0xf3, 0x8a, 0xab, 0xcb, - 0xd9, 0xae, 0x6a, 0xf7, 0xc1, 0xe2, 0x81, 0x29, 0x63, 0x13, 0x8b, 0x07, 0xde, 0x4f, 0x08, 0xec, - 0x82, 0xc5, 0x11, 0xec, 0xc7, 0x82, 0xad, 0x66, 0x49, 0x9a, 0x4d, 0x52, 0x0b, 0x1f, 0xc3, 0x01, - 0x0f, 0x58, 0xa8, 0xb8, 0x5a, 0xa7, 0x14, 0x72, 0x1b, 0x63, 0x68, 0x05, 0x54, 0x51, 0xb7, 0x69, - 0xfc, 0xe6, 0x19, 0x0f, 0x01, 0xfb, 0x4b, 0x21, 0x58, 0xa8, 0x08, 0xa3, 0xc1, 0x29, 0x5b, 0x4f, - 0xa9, 0xbc, 0x74, 0x5b, 0x7d, 0x34, 0x68, 0x91, 0x2d, 0x11, 0xdd, 0xa3, 0xe2, 0x0b, 0x26, 0x15, - 0x5d, 0xc4, 0xee, 0x5e, 0x1f, 0x0d, 0x9a, 0xa4, 0x70, 0x78, 0x3f, 0x23, 0x68, 0x6b, 0x8e, 0x51, - 0xa4, 0x2a, 0x4c, 0xd0, 0x06, 0x93, 0x77, 0xe1, 0x1e, 0x0b, 0x7d, 0xb1, 0x8e, 0x15, 0x8f, 0xc2, - 0x53, 0x96, 0x51, 0xad, 0x3a, 0xb5, 0x36, 0x32, 0xa6, 0x3e, 0x9b, 0x05, 0x86, 0xb2, 0x4d, 0x32, - 0x13, 0x3f, 0x86, 0x6e, 0x0a, 0x65, 0x41, 0xca, 0xce, 0x70, 0xee, 0x90, 0x9a, 0x5f, 0x63, 0x03, - 0x26, 0xf8, 0x8a, 0xea, 0xb2, 0xe7, 0xfe, 0x25, 0x5b, 0x30, 0x43, 0xdc, 0x26, 0x35, 0xbf, 0xf7, - 0x9b, 0x05, 0x87, 0xe3, 0xc9, 0xd9, 0x24, 0x0a, 0x15, 0x0b, 0xd5, 0xd7, 0x74, 0xbe, 0x64, 0xf8, - 0x43, 0x68, 0x2f, 0x25, 0x13, 0xe3, 0x20, 0x91, 0xda, 0x19, 0xbd, 0x3d, 0x2c, 0xa6, 0x65, 0x3c, - 0x39, 0xfb, 0x2a, 0x09, 0x4e, 0x1b, 0x24, 0xc3, 0xe1, 0x13, 0x00, 0xfd, 0x48, 0xd8, 0x22, 0x5a, - 0x25, 0x93, 0xe0, 0x8c, 0xdc, 0x7a, 0x56, 0x12, 0x9f, 0x36, 0x48, 0x09, 0x8d, 0xbf, 0x81, 0xb7, - 0xb4, 0xf5, 0x92, 0x89, 0x05, 0x97, 0x92, 0x47, 0xe1, 0xe4, 0x92, 0x86, 0x17, 0xcc, 0x28, 0xe0, - 0x8c, 0xbc, 0x7a, 0x95, 0x4d, 0xe4, 0xb4, 0x41, 0xb6, 0x56, 0xc8, 0x58, 0xcd, 0xc2, 0x15, 0x57, - 0xcc, 0xc8, 0xb5, 0x95, 0x55, 0x12, 0xcf, 0x58, 0x25, 0x16, 0xfe, 0x18, 0x0e, 0xb4, 0xf5, 0x45, - 0xc4, 0x43, 0x23, 0x9e, 0x33, 0x3a, 0xaa, 0x67, 0xea, 0xe8, 0xb4, 0x41, 0x72, 0xe4, 0xb3, 0x36, - 0xec, 0xad, 0xb4, 0x86, 0xde, 0x73, 0x33, 0x16, 0x9f, 0xeb, 0x81, 0x3b, 0x01, 0xa0, 0xfe, 0x3c, - 0x55, 0xd8, 0x45, 0xfd, 0xe6, 0xc0, 0x19, 0x1d, 0x57, 0x6b, 0x95, 0xe5, 0x27, 0x25, 0xb4, 0xf7, - 0x37, 0x82, 0x83, 0xf1, 0xe4, 0xec, 0x5c, 0x51, 0xc5, 0xf4, 0x0c, 0x89, 0x62, 0x30, 0x99, 0x34, - 0xb5, 0x5a, 0xa4, 0xea, 0xc4, 0x4f, 0x93, 0xa6, 0x4d, 0x8a, 0x74, 0x2d, 0xf3, 0x75, 0x0f, 0xeb, - 0xd4, 0x4d, 0x9c, 0x94, 0xa0, 0xf8, 0x04, 0xda, 0xdc, 0xf4, 0x2e, 0xdd, 0xa6, 0xc9, 0xea, 0x57, - 0xb3, 0x0c, 0x6c, 0x98, 0xc8, 0x23, 0x9f, 0x87, 0x4a, 0xac, 0x49, 0x96, 0x70, 0xfc, 0x25, 0x74, - 0xca, 0x01, 0xdc, 0x85, 0xe6, 0x1b, 0xb6, 0x4e, 0xdf, 0x54, 0xfd, 0x88, 0x87, 0xa9, 0x32, 0xb7, - 0x0f, 0x47, 0x52, 0x80, 0x24, 0xb0, 0x13, 0xeb, 0x13, 0xe4, 0xfd, 0x89, 0xa0, 0x53, 0xa6, 0x7b, - 0x07, 0x6f, 0xd8, 0x7b, 0xf0, 0x60, 0xf3, 0x7d, 0x49, 0xda, 0xed, 0x90, 0x7a, 0x00, 0x7f, 0x06, - 0x4e, 0x9c, 0x0f, 0x95, 0x34, 0x13, 0x74, 0x7f, 0xf4, 0xce, 0xae, 0x89, 0x94, 0xa4, 0x9c, 0x81, - 0xfb, 0xe0, 0x70, 0x39, 0x89, 0xc2, 0xef, 0xb8, 0x58, 0xb0, 0xc0, 0x0c, 0xd2, 0x01, 0x29, 0xbb, - 0xf4, 0x02, 0x81, 0xe2, 0x9d, 0xfa, 0xdf, 0x75, 0xe8, 0xfd, 0x85, 0xe0, 0x5e, 0xe5, 0x00, 0xf1, - 0x00, 0x0e, 0xa9, 0xef, 0xb3, 0x58, 0xbd, 0x5c, 0xbe, 0x9e, 0x73, 0xff, 0x94, 0x65, 0x9d, 0x6c, - 0xba, 0x4b, 0x4b, 0xad, 0x80, 0x5a, 0x95, 0xa5, 0x56, 0x60, 0xff, 0xe3, 0x83, 0xd3, 0xe7, 0x60, - 0xda, 0x99, 0x05, 0xe9, 0xee, 0xcc, 0x6d, 0xef, 0x17, 0x04, 0x4e, 0x69, 0x01, 0xdc, 0xc1, 0x99, - 0xe5, 0x92, 0x9d, 0xe7, 0xb7, 0x69, 0xb3, 0x2c, 0x59, 0xee, 0xae, 0xf0, 0x6a, 0x55, 0x79, 0x6d, - 0x97, 0x68, 0xef, 0x16, 0x89, 0x3c, 0x99, 0x9f, 0x5b, 0xba, 0x87, 0x77, 0xb5, 0xf1, 0x02, 0x0e, - 0xd3, 0x2d, 0x43, 0x58, 0x3c, 0xa7, 0x7e, 0xbe, 0x23, 0x1e, 0x55, 0x35, 0x25, 0x15, 0x10, 0xd9, - 0x4c, 0xf2, 0x7e, 0x40, 0xf0, 0xa0, 0x06, 0xbb, 0x03, 0x01, 0xb7, 0x5d, 0x8f, 0xcd, 0xed, 0xd7, - 0xa3, 0xb7, 0x82, 0x87, 0xb7, 0x5c, 0x24, 0x3b, 0x89, 0x6c, 0x8c, 0x94, 0xf5, 0x6f, 0x47, 0xea, - 0xf1, 0x53, 0xc0, 0x75, 0x08, 0xb6, 0x61, 0x6f, 0x1c, 0x2c, 0x78, 0xd8, 0x6d, 0x60, 0x80, 0xfd, - 0x57, 0x82, 0x2b, 0x26, 0xba, 0x48, 0x3f, 0x6b, 0xbe, 0x4c, 0x74, 0xad, 0x67, 0x1f, 0xfc, 0x7a, - 0xdd, 0x43, 0x57, 0xd7, 0x3d, 0xf4, 0xc7, 0x75, 0x0f, 0xfd, 0x78, 0xd3, 0x6b, 0x5c, 0xdd, 0xf4, - 0x1a, 0xbf, 0xdf, 0xf4, 0x1a, 0xdf, 0x1e, 0x6d, 0xff, 0x8d, 0xf7, 0x7a, 0xdf, 0x7c, 0x7c, 0xf4, - 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x93, 0x89, 0xed, 0xeb, 0x04, 0x0a, 0x00, 0x00, + // 859 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xdf, 0x59, 0x3b, 0x71, 0xf6, 0xd9, 0x6d, 0xdc, 0x11, 0xa4, 0xab, 0xa8, 0x58, 0xd6, 0x8a, + 0x83, 0x55, 0x81, 0x0b, 0x06, 0xa9, 0x28, 0x07, 0x90, 0x6b, 0x5a, 0xd9, 0x24, 0x87, 0x6a, 0x02, + 0x14, 0x71, 0x9b, 0xee, 0x8e, 0x92, 0x51, 0xed, 0xdd, 0xd5, 0xec, 0xd8, 0xc8, 0x47, 0xce, 0x5c, + 0xe0, 0x23, 0xf0, 0x41, 0x38, 0x71, 0xe1, 0xd8, 0x0b, 0x12, 0x47, 0x94, 0x7c, 0x01, 0xee, 0x5c, + 0xd0, 0xcc, 0xfe, 0xdf, 0xb5, 0x2d, 0x2a, 0x59, 0x3d, 0x24, 0xde, 0xf7, 0xde, 0xef, 0x3d, 0xff, + 0xe6, 0xf7, 0xde, 0xbc, 0x35, 0x7c, 0x18, 0xbe, 0xba, 0x7a, 0x44, 0xdd, 0xb9, 0xfa, 0x13, 0xcc, + 0x0d, 0x84, 0x17, 0x8a, 0x40, 0x06, 0x8f, 0xf4, 0xff, 0x28, 0xf7, 0x0e, 0xb5, 0x03, 0x5b, 0x99, + 0xc3, 0x79, 0x06, 0x1d, 0x42, 0x7f, 0x18, 0x4f, 0x2e, 0x88, 0xb6, 0xb1, 0x0d, 0xad, 0x90, 0xae, + 0xe7, 0x01, 0xf5, 0x6c, 0xd4, 0x47, 0x83, 0x0e, 0x49, 0x4d, 0xfc, 0x00, 0xac, 0x88, 0x5f, 0xf9, + 0x54, 0x2e, 0x05, 0xb3, 0x4d, 0x1d, 0xcb, 0x1d, 0xce, 0xe7, 0x80, 0x8b, 0x75, 0x5e, 0x70, 0x79, + 0x3d, 0xdb, 0x55, 0xed, 0x2e, 0x98, 0xdc, 0xd3, 0x65, 0x2c, 0x62, 0x72, 0xcf, 0xf9, 0x15, 0x81, + 0x95, 0xb3, 0x38, 0x81, 0xc3, 0x50, 0xb0, 0xd5, 0x2c, 0x4e, 0xb3, 0x48, 0x62, 0xe1, 0x53, 0x38, + 0xe2, 0x1e, 0xf3, 0x25, 0x97, 0xeb, 0x84, 0x42, 0x66, 0x63, 0x0c, 0x4d, 0x8f, 0x4a, 0x6a, 0x37, + 0xb4, 0x5f, 0x3f, 0xe3, 0x21, 0x60, 0x77, 0x29, 0x04, 0xf3, 0x25, 0x61, 0xd4, 0x3b, 0x67, 0xeb, + 0x29, 0x8d, 0xae, 0xed, 0x66, 0x1f, 0x0d, 0x9a, 0x64, 0x43, 0x44, 0x9d, 0x51, 0xf2, 0x05, 0x8b, + 0x24, 0x5d, 0x84, 0xf6, 0x41, 0x1f, 0x0d, 0x1a, 0x24, 0x77, 0x38, 0x3f, 0x99, 0xd0, 0x52, 0x1c, + 0x83, 0x40, 0x96, 0x98, 0xa0, 0x0a, 0x93, 0xf7, 0xe1, 0x0e, 0xf3, 0x5d, 0xb1, 0x0e, 0x25, 0x0f, + 0xfc, 0x73, 0x96, 0x52, 0x2d, 0x3b, 0x95, 0x36, 0x51, 0x48, 0x5d, 0x36, 0xf3, 0x34, 0x65, 0x8b, + 0xa4, 0x26, 0x7e, 0x08, 0xdd, 0x04, 0xca, 0xbc, 0x84, 0x9d, 0xe6, 0xdc, 0x21, 0x35, 0xbf, 0xc2, + 0x7a, 0x4c, 0xf0, 0x15, 0x55, 0x65, 0x2f, 0xdd, 0x6b, 0xb6, 0x60, 0x9a, 0xb8, 0x45, 0x6a, 0xfe, + 0x2d, 0x6a, 0x1c, 0xfe, 0x3f, 0x35, 0x5a, 0x55, 0x35, 0xfe, 0x34, 0xe1, 0x78, 0x3c, 0xb9, 0x98, + 0x04, 0xbe, 0x64, 0xbe, 0xfc, 0x96, 0xce, 0x97, 0x0c, 0x7f, 0x0c, 0xad, 0x65, 0xc4, 0xc4, 0xd8, + 0x8b, 0x1b, 0xd7, 0x1e, 0xbd, 0x3b, 0xcc, 0x67, 0x6f, 0x3c, 0xb9, 0xf8, 0x26, 0x0e, 0x4e, 0x0d, + 0x92, 0xe2, 0xf0, 0x19, 0x80, 0x7a, 0x24, 0x6c, 0x11, 0xac, 0xe2, 0xb9, 0x6a, 0x8f, 0xec, 0x7a, + 0x56, 0x1c, 0x9f, 0x1a, 0xa4, 0x80, 0xc6, 0xdf, 0xc1, 0x3b, 0xca, 0x7a, 0xce, 0xc4, 0x82, 0x47, + 0x11, 0x0f, 0xfc, 0xc9, 0x35, 0xf5, 0xaf, 0x98, 0xd6, 0xb3, 0x3d, 0x72, 0xea, 0x55, 0xaa, 0xc8, + 0xa9, 0x41, 0x36, 0x56, 0x48, 0x59, 0xcd, 0xfc, 0x15, 0x97, 0x4c, 0x8b, 0xbf, 0x91, 0x55, 0x1c, + 0x4f, 0x59, 0xc5, 0x16, 0xfe, 0x14, 0x8e, 0x94, 0xf5, 0x55, 0xc0, 0x7d, 0xdd, 0x8a, 0xf6, 0xe8, + 0xa4, 0x9e, 0xa9, 0xa2, 0x53, 0x83, 0x64, 0xc8, 0x27, 0x2d, 0x38, 0x58, 0x29, 0x0d, 0x9d, 0xa7, + 0x7a, 0xc8, 0xbe, 0x54, 0xe3, 0x7b, 0x06, 0x40, 0xdd, 0x79, 0xa2, 0xb0, 0x8d, 0xfa, 0x8d, 0x41, + 0x7b, 0x74, 0x5a, 0xae, 0x55, 0x94, 0x9f, 0x14, 0xd0, 0xce, 0xbf, 0x08, 0x8e, 0xc6, 0x93, 0x8b, + 0x4b, 0x49, 0x25, 0x53, 0x13, 0x29, 0xf2, 0xc6, 0xb2, 0x48, 0xd7, 0x6a, 0x92, 0xb2, 0x13, 0x3f, + 0x8e, 0x0f, 0xad, 0x53, 0x22, 0xdb, 0xd4, 0x5f, 0x77, 0xbf, 0x4e, 0x5d, 0xc7, 0x49, 0x01, 0x8a, + 0xcf, 0xa0, 0xc5, 0xf5, 0xd9, 0x23, 0xbb, 0xa1, 0xb3, 0xfa, 0xe5, 0x2c, 0x0d, 0x1b, 0xc6, 0xf2, + 0x44, 0x4f, 0x7d, 0x29, 0xd6, 0x24, 0x4d, 0x38, 0xfd, 0x1a, 0x3a, 0xc5, 0x00, 0xee, 0x42, 0xe3, + 0x15, 0x5b, 0x27, 0xf7, 0x5e, 0x3d, 0xe2, 0x61, 0xa2, 0xcc, 0xf6, 0xe1, 0x88, 0x0b, 0x90, 0x18, + 0x76, 0x66, 0x7e, 0x86, 0x9c, 0x5f, 0x10, 0x74, 0x8a, 0x74, 0xf7, 0x70, 0x5f, 0xbf, 0x80, 0x76, + 0x98, 0x8d, 0x49, 0xa4, 0x67, 0xec, 0xee, 0xe8, 0xbd, 0x5d, 0x33, 0x16, 0x91, 0x62, 0x86, 0xf3, + 0x1b, 0x02, 0xc8, 0xef, 0xc0, 0x1e, 0x18, 0x7d, 0x00, 0xf7, 0xaa, 0xfb, 0x20, 0x6e, 0x40, 0x87, + 0xd4, 0x03, 0x55, 0xfe, 0xcd, 0x37, 0xe6, 0xff, 0x0f, 0x82, 0x3b, 0x25, 0xc1, 0xf1, 0x00, 0x8e, + 0xa9, 0xeb, 0xb2, 0x50, 0x3e, 0x5f, 0xbe, 0x9c, 0x73, 0xf7, 0x9c, 0xa5, 0x27, 0xa9, 0xba, 0x0b, + 0x2b, 0x2d, 0x87, 0x9a, 0xa5, 0x95, 0x96, 0x63, 0xdf, 0xee, 0xb1, 0x74, 0x1f, 0xf4, 0x71, 0x66, + 0x5e, 0xb2, 0x39, 0x33, 0xdb, 0xf9, 0x1d, 0x41, 0xbb, 0x70, 0x61, 0xf7, 0xd0, 0xb3, 0x4c, 0xb2, + 0xcb, 0xec, 0x5d, 0xda, 0x28, 0x4a, 0x96, 0xb9, 0x4b, 0xbc, 0x9a, 0x65, 0x5e, 0x9b, 0x25, 0x3a, + 0xd8, 0x22, 0x91, 0x13, 0x65, 0x7d, 0x4b, 0xf6, 0xe6, 0xae, 0x63, 0x3c, 0x83, 0xe3, 0x64, 0x2b, + 0x10, 0x16, 0xce, 0xa9, 0x9b, 0xdd, 0xe9, 0x07, 0x65, 0x4d, 0x49, 0x09, 0x44, 0xaa, 0x49, 0xce, + 0x8f, 0x08, 0xee, 0xd5, 0x60, 0x7b, 0x10, 0x70, 0xd3, 0xcb, 0xb1, 0xb1, 0xf9, 0xe5, 0xe8, 0xac, + 0xe0, 0xfe, 0x96, 0xc5, 0xbf, 0x93, 0x48, 0x65, 0xa4, 0xcc, 0x37, 0x1d, 0xa9, 0x87, 0x8f, 0x01, + 0xd7, 0x21, 0xd8, 0x82, 0x83, 0xb1, 0xb7, 0xe0, 0x7e, 0xd7, 0xc0, 0x00, 0x87, 0x2f, 0x04, 0x97, + 0x4c, 0x74, 0x91, 0x7a, 0x56, 0x7c, 0x99, 0xe8, 0x9a, 0x4f, 0x3e, 0xfa, 0xe3, 0xa6, 0x87, 0x5e, + 0xdf, 0xf4, 0xd0, 0xdf, 0x37, 0x3d, 0xf4, 0xf3, 0x6d, 0xcf, 0x78, 0x7d, 0xdb, 0x33, 0xfe, 0xba, + 0xed, 0x19, 0xdf, 0x9f, 0x6c, 0xfe, 0x85, 0xf7, 0xf2, 0x50, 0x7f, 0x7c, 0xf2, 0x5f, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x0d, 0xd2, 0xee, 0x14, 0x02, 0x0a, 0x00, 0x00, } func (m *RawACLRecord) Marshal() (dAtA []byte, err error) { @@ -1223,6 +1223,16 @@ func (m *ACLRoot) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Timestamp != 0 { + i = encodeVarintAclrecord(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x38 + } + if m.CurrentReadKeyHash != 0 { + i = encodeVarintAclrecord(dAtA, i, uint64(m.CurrentReadKeyHash)) + i-- + dAtA[i] = 0x30 + } if len(m.DerivationScheme) > 0 { i -= len(m.DerivationScheme) copy(dAtA[i:], m.DerivationScheme) @@ -1536,29 +1546,10 @@ func (m *ACLUserState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.IsConfirmed { - i-- - if m.IsConfirmed { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x28 - } if m.Permissions != 0 { i = encodeVarintAclrecord(dAtA, i, uint64(m.Permissions)) i-- - dAtA[i] = 0x20 - } - if len(m.EncryptedReadKeys) > 0 { - for iNdEx := len(m.EncryptedReadKeys) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.EncryptedReadKeys[iNdEx]) - copy(dAtA[i:], m.EncryptedReadKeys[iNdEx]) - i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptedReadKeys[iNdEx]))) - i-- - dAtA[i] = 0x1a - } + dAtA[i] = 0x18 } if len(m.EncryptionKey) > 0 { i -= len(m.EncryptionKey) @@ -1967,6 +1958,12 @@ func (m *ACLRoot) Size() (n int) { if l > 0 { n += 1 + l + sovAclrecord(uint64(l)) } + if m.CurrentReadKeyHash != 0 { + n += 1 + sovAclrecord(uint64(m.CurrentReadKeyHash)) + } + if m.Timestamp != 0 { + n += 1 + sovAclrecord(uint64(m.Timestamp)) + } return n } @@ -2106,18 +2103,9 @@ func (m *ACLUserState) Size() (n int) { if l > 0 { n += 1 + l + sovAclrecord(uint64(l)) } - if len(m.EncryptedReadKeys) > 0 { - for _, b := range m.EncryptedReadKeys { - l = len(b) - n += 1 + l + sovAclrecord(uint64(l)) - } - } if m.Permissions != 0 { n += 1 + sovAclrecord(uint64(m.Permissions)) } - if m.IsConfirmed { - n += 2 - } return n } @@ -2887,6 +2875,44 @@ func (m *ACLRoot) Unmarshal(dAtA []byte) error { } m.DerivationScheme = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentReadKeyHash", wireType) + } + m.CurrentReadKeyHash = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentReadKeyHash |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipAclrecord(dAtA[iNdEx:]) @@ -3604,38 +3630,6 @@ func (m *ACLUserState) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKeys", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclrecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclrecord - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclrecord - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptedReadKeys = append(m.EncryptedReadKeys, make([]byte, postIndex-iNdEx)) - copy(m.EncryptedReadKeys[len(m.EncryptedReadKeys)-1], dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Permissions", wireType) } @@ -3654,26 +3648,6 @@ func (m *ACLUserState) Unmarshal(dAtA []byte) error { break } } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsConfirmed", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclrecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IsConfirmed = bool(v != 0) default: iNdEx = preIndex skippy, err := skipAclrecord(dAtA[iNdEx:]) diff --git a/pkg/acl/aclrecordproto/protos/aclrecord.proto b/pkg/acl/aclrecordproto/protos/aclrecord.proto index 01b5aa6f..4d2a969a 100644 --- a/pkg/acl/aclrecordproto/protos/aclrecord.proto +++ b/pkg/acl/aclrecordproto/protos/aclrecord.proto @@ -26,6 +26,8 @@ message ACLRoot { string spaceId = 3; bytes encryptedReadKey = 4; string derivationScheme = 5; + uint64 currentReadKeyHash = 6; + int64 timestamp = 7; } message ACLContentValue { @@ -51,9 +53,7 @@ message ACLState { message ACLUserState { bytes identity = 1; bytes encryptionKey = 2; - repeated bytes encryptedReadKeys = 3; - ACLUserPermissions permissions = 4; - bool isConfirmed = 5; + ACLUserPermissions permissions = 3; } message ACLUserAdd { diff --git a/pkg/acl/common/keychain.go b/pkg/acl/common/keychain.go index d90965c6..b9fc0fb6 100644 --- a/pkg/acl/common/keychain.go +++ b/pkg/acl/common/keychain.go @@ -1,19 +1,16 @@ package common import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" ) type Keychain struct { - decoder keys.Decoder - keys map[string]signingkey.PubKey + keys map[string]signingkey.PubKey } func NewKeychain() *Keychain { return &Keychain{ - decoder: signingkey.NewEDPubKeyDecoder(), - keys: make(map[string]signingkey.PubKey), + keys: make(map[string]signingkey.PubKey), } } @@ -21,7 +18,7 @@ func (k *Keychain) GetOrAdd(identity string) (signingkey.PubKey, error) { if key, exists := k.keys[identity]; exists { return key, nil } - res, err := k.decoder.DecodeFromBytes([]byte(identity)) + res, err := signingkey.NewSigningEd25519PubKeyFromBytes([]byte(identity)) if err != nil { return nil, err } diff --git a/pkg/acl/list/aclreadkeyderive.go b/pkg/acl/list/aclreadkeyderive.go new file mode 100644 index 00000000..c20b2501 --- /dev/null +++ b/pkg/acl/list/aclreadkeyderive.go @@ -0,0 +1,10 @@ +package list + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" + +func ACLReadKeyDerive(signKey []byte, encKey []byte) (*symmetric.Key, error) { + concBuf := make([]byte, 0, len(signKey)+len(encKey)) + concBuf = append(concBuf, signKey...) + concBuf = append(concBuf, encKey...) + return symmetric.DeriveFromBytes(concBuf) +} diff --git a/pkg/acl/list/aclrecordbuilder.go b/pkg/acl/list/aclrecordbuilder.go new file mode 100644 index 00000000..26c9e08f --- /dev/null +++ b/pkg/acl/list/aclrecordbuilder.go @@ -0,0 +1,95 @@ +package list + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/gogo/protobuf/proto" +) + +type ACLRecordBuilder interface { + ConvertFromRaw(rawIdRecord *aclrecordproto.RawACLRecordWithId) (rec *ACLRecord, err error) +} + +type aclRecordBuilder struct { + id string + keychain *common.Keychain +} + +func newACLRecordBuilder(id string, keychain *common.Keychain) ACLRecordBuilder { + return &aclRecordBuilder{ + id: id, + keychain: keychain, + } +} + +func (a *aclRecordBuilder) ConvertFromRaw(rawIdRecord *aclrecordproto.RawACLRecordWithId) (rec *ACLRecord, err error) { + rawRec := &aclrecordproto.RawACLRecord{} + err = proto.Unmarshal(rawIdRecord.Payload, rawRec) + if err != nil { + return + } + + if rawIdRecord.Id == a.id { + aclRoot := &aclrecordproto.ACLRoot{} + err = proto.Unmarshal(rawRec.Payload, aclRoot) + if err != nil { + return + } + + rec = &ACLRecord{ + Id: rawIdRecord.Id, + CurrentReadKeyHash: aclRoot.CurrentReadKeyHash, + Timestamp: aclRoot.Timestamp, + Signature: rawRec.Signature, + Identity: aclRoot.Identity, + Model: aclRoot, + } + } else { + aclRecord := &aclrecordproto.ACLRecord{} + err = proto.Unmarshal(rawRec.Payload, aclRecord) + if err != nil { + return + } + + rec = &ACLRecord{ + Id: rawIdRecord.Id, + PrevId: aclRecord.PrevId, + CurrentReadKeyHash: aclRecord.CurrentReadKeyHash, + Timestamp: aclRecord.Timestamp, + Data: aclRecord.Data, + Signature: rawRec.Signature, + Identity: aclRecord.Identity, + } + } + + err = verifyRaw(a.keychain, rawRec, rawIdRecord, rec.Identity) + return +} + +func verifyRaw( + keychain *common.Keychain, + rawRec *aclrecordproto.RawACLRecord, + recWithId *aclrecordproto.RawACLRecordWithId, + identity []byte) (err error) { + identityKey, err := keychain.GetOrAdd(string(identity)) + if err != nil { + return + } + + // verifying signature + res, err := identityKey.Verify(rawRec.Payload, rawRec.Signature) + if err != nil { + return + } + if !res { + err = ErrInvalidSignature + return + } + + // verifying ID + if !cid.VerifyCID(recWithId.Payload, recWithId.Id) { + err = ErrIncorrectCID + } + return +} diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index 27416972..166fff71 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -27,6 +27,7 @@ var ErrNoSuchRecord = errors.New("no such record") var ErrInsufficientPermissions = errors.New("insufficient permissions") var ErrNoReadKey = errors.New("acl state doesn't have a read key") var ErrInvalidSignature = errors.New("signature is invalid") +var ErrIncorrectRoot = errors.New("incorrect root") type UserPermissionPair struct { Identity string @@ -34,13 +35,13 @@ type UserPermissionPair struct { } type ACLState struct { + id string currentReadKeyHash uint64 userReadKeys map[uint64]*symmetric.Key userStates map[string]*aclrecordproto.ACLUserState userInvites map[string]*aclrecordproto.ACLUserInvite - - signingPubKeyDecoder keys.Decoder - encryptionKey encryptionkey.PrivKey + encryptionKey encryptionkey.PrivKey + signingKey signingkey.PrivKey identity string permissionsAtRecord map[string][]UserPermissionPair @@ -48,30 +49,30 @@ type ACLState struct { keychain *common.Keychain } -func newACLStateWithIdentity( - identity string, - encryptionKey encryptionkey.PrivKey, - decoder keys.Decoder) *ACLState { - return &ACLState{ - identity: identity, - encryptionKey: encryptionKey, - userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclrecordproto.ACLUserState), - userInvites: make(map[string]*aclrecordproto.ACLUserInvite), - signingPubKeyDecoder: decoder, - permissionsAtRecord: make(map[string][]UserPermissionPair), - keychain: common.NewKeychain(), +func newACLStateWithKeys( + signingKey signingkey.PrivKey, + encryptionKey encryptionkey.PrivKey) (*ACLState, error) { + identity, err := signingKey.Raw() + if err != nil { + return nil, err } + return &ACLState{ + identity: string(identity), + signingKey: signingKey, + encryptionKey: encryptionKey, + userReadKeys: make(map[uint64]*symmetric.Key), + userStates: make(map[string]*aclrecordproto.ACLUserState), + userInvites: make(map[string]*aclrecordproto.ACLUserInvite), + permissionsAtRecord: make(map[string][]UserPermissionPair), + }, nil } func newACLState(decoder keys.Decoder) *ACLState { return &ACLState{ - signingPubKeyDecoder: decoder, - userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclrecordproto.ACLUserState), - userInvites: make(map[string]*aclrecordproto.ACLUserInvite), - permissionsAtRecord: make(map[string][]UserPermissionPair), - keychain: common.NewKeychain(), + userReadKeys: make(map[uint64]*symmetric.Key), + userStates: make(map[string]*aclrecordproto.ACLUserState), + userInvites: make(map[string]*aclrecordproto.ACLUserInvite), + permissionsAtRecord: make(map[string][]UserPermissionPair), } } @@ -106,40 +107,27 @@ func (st *ACLState) PermissionsAtRecord(id string, identity string) (UserPermiss return UserPermissionPair{}, ErrNoSuchUser } -func (st *ACLState) applyRecord(record *aclrecordproto.ACLRecord) (err error) { +func (st *ACLState) applyRecord(record *ACLRecord) (err error) { + if record.Id == st.id { + root, ok := record.Model.(*aclrecordproto.ACLRoot) + if !ok { + return ErrIncorrectRoot + } + return st.applyRoot(root) + } aclData := &aclrecordproto.ACLData{} - err = proto.Unmarshal(record.Data, aclData) - if err != nil { - return - } - - err = st.applyChangeData(aclData, record.CurrentReadKeyHash, record.Identity) - if err != nil { - return - } - - st.currentReadKeyHash = record.CurrentReadKeyHash - return -} - -func (st *ACLState) applyChangeAndUpdate(recordWrapper *ACLRecord) (err error) { - var ( - change = recordWrapper.Content - aclData = &aclrecordproto.ACLData{} - ) - - if recordWrapper.Model != nil { - aclData = recordWrapper.Model.(*aclrecordproto.ACLData) + if record.Model != nil { + aclData = record.Model.(*aclrecordproto.ACLData) } else { - err = proto.Unmarshal(change.Data, aclData) + err = proto.Unmarshal(record.Data, aclData) if err != nil { return } - recordWrapper.Model = aclData + record.Model = aclData } - err = st.applyChangeData(aclData, recordWrapper.Content.CurrentReadKeyHash, recordWrapper.Content.Identity) + err = st.applyChangeData(aclData, record.CurrentReadKeyHash, record.Identity) if err != nil { return } @@ -154,10 +142,61 @@ func (st *ACLState) applyChangeAndUpdate(recordWrapper *ACLRecord) (err error) { permissions = append(permissions, permission) } - st.permissionsAtRecord[recordWrapper.Id] = permissions + st.permissionsAtRecord[record.Id] = permissions return nil } +func (st *ACLState) applyRoot(root *aclrecordproto.ACLRoot) (err error) { + if st.signingKey != nil && st.encryptionKey != nil { + err = st.saveReadKeyFromRoot(root) + if err != nil { + return + } + } + + // adding user to the list + userState := &aclrecordproto.ACLUserState{ + Identity: root.Identity, + EncryptionKey: root.EncryptionKey, + Permissions: aclrecordproto.ACLUserPermissions_Admin, + } + st.userStates[string(root.Identity)] = userState + return +} + +func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error) { + var readKey *symmetric.Key + if len(root.GetDerivationScheme()) != 0 { + var encPubKey []byte + encPubKey, err = st.encryptionKey.GetPublic().Raw() + if err != nil { + return + } + + readKey, err = ACLReadKeyDerive([]byte(st.identity), encPubKey) + if err != nil { + return + } + } else { + readKey, _, err = st.decryptReadKeyAndHash(root.EncryptedReadKey) + if err != nil { + return + } + } + + hasher := fnv.New64() + _, err = hasher.Write(readKey.Bytes()) + if err != nil { + return + } + if hasher.Sum64() != root.CurrentReadKeyHash { + return ErrIncorrectRoot + } + st.currentReadKeyHash = root.CurrentReadKeyHash + st.userReadKeys[root.CurrentReadKeyHash] = readKey + return +} + func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uint64, identity []byte) (err error) { defer func() { if err != nil { @@ -166,11 +205,8 @@ func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uin st.currentReadKeyHash = hash }() - // we can't check this for the user which is joining, because it will not be in our list - // the same is for the first change to be added - skipIdentityCheck := st.isUserJoin(changeData) || (st.currentReadKeyHash == 0 && st.isUserAdd(changeData, identity)) - if !skipIdentityCheck { - // we check signature when we add this to the Tree, so no need to do it here + if !st.isUserJoin(changeData) { + // we check signature when we add this to the List, so no need to do it here if _, exists := st.userStates[string(identity)]; !exists { err = ErrNoSuchUser return @@ -204,8 +240,6 @@ func (st *ACLState) applyChangeContent(ch *aclrecordproto.ACLContentValue) error return st.applyUserInvite(ch.GetUserInvite()) case ch.GetUserJoin() != nil: return st.applyUserJoin(ch.GetUserJoin()) - case ch.GetUserConfirm() != nil: - return st.applyUserConfirm(ch.GetUserConfirm()) default: return fmt.Errorf("unexpected change type: %v", ch) } @@ -228,9 +262,9 @@ func (st *ACLState) applyUserInvite(ch *aclrecordproto.ACLUserInvite) error { } func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error { - invite, exists := st.userInvites[ch.UserInviteId] + invite, exists := st.userInvites[ch.InviteId] if !exists { - return fmt.Errorf("no such invite with id %s", ch.UserInviteId) + return fmt.Errorf("no such invite with id %s", ch.InviteId) } chIdentity := string(ch.Identity) @@ -240,7 +274,7 @@ func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error { // validating signature signature := ch.GetAcceptSignature() - verificationKey, err := st.signingPubKeyDecoder.DecodeFromBytes(invite.AcceptPublicKey) + verificationKey, err := signingkey.NewSigningEd25519PubKeyFromBytes(invite.AcceptPublicKey) if err != nil { return fmt.Errorf("public key verifying invite accepts is given in incorrect format: %v", err) } @@ -267,11 +301,9 @@ func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error { // adding user to the list userState := &aclrecordproto.ACLUserState{ - Identity: ch.Identity, - EncryptionKey: ch.EncryptionKey, - EncryptedReadKeys: ch.EncryptedReadKeys, - Permissions: invite.Permissions, - IsConfirmed: true, + Identity: ch.Identity, + EncryptionKey: ch.EncryptionKey, + Permissions: invite.Permissions, } st.userStates[chIdentity] = userState return nil @@ -284,10 +316,9 @@ func (st *ACLState) applyUserAdd(ch *aclrecordproto.ACLUserAdd) error { } st.userStates[chIdentity] = &aclrecordproto.ACLUserState{ - Identity: ch.Identity, - EncryptionKey: ch.EncryptionKey, - Permissions: ch.Permissions, - EncryptedReadKeys: ch.EncryptedReadKeys, + Identity: ch.Identity, + EncryptionKey: ch.EncryptionKey, + Permissions: ch.Permissions, } if chIdentity == st.identity { @@ -318,12 +349,6 @@ func (st *ACLState) applyUserRemove(ch *aclrecordproto.ACLUserRemove) error { for _, replace := range ch.ReadKeyReplaces { repIdentity := string(replace.Identity) - userState, exists := st.userStates[repIdentity] - if !exists { - continue - } - - userState.EncryptedReadKeys = append(userState.EncryptedReadKeys, replace.EncryptedReadKey) // if this is our identity then we have to decrypt the key if repIdentity == st.identity { key, hash, err := st.decryptReadKeyAndHash(replace.EncryptedReadKey) @@ -338,17 +363,6 @@ func (st *ACLState) applyUserRemove(ch *aclrecordproto.ACLUserRemove) error { return nil } -func (st *ACLState) applyUserConfirm(ch *aclrecordproto.ACLUserConfirm) error { - chIdentity := string(ch.Identity) - state, exists := st.userStates[chIdentity] - if !exists { - return ErrNoSuchUser - } - - state.IsConfirmed = true - return nil -} - func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, error) { decrypted, err := st.encryptionKey.Decrypt(msg) if err != nil { diff --git a/pkg/acl/list/aclstatebuilder.go b/pkg/acl/list/aclstatebuilder.go index da79141b..2d7693fb 100644 --- a/pkg/acl/list/aclstatebuilder.go +++ b/pkg/acl/list/aclstatebuilder.go @@ -4,19 +4,20 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" ) type aclStateBuilder struct { - identity string - key encryptionkey.PrivKey - decoder keys.Decoder + signPrivKey signingkey.PrivKey + encPrivKey encryptionkey.PrivKey + decoder keys.Decoder } func newACLStateBuilderWithIdentity(decoder keys.Decoder, accountData *account.AccountData) *aclStateBuilder { return &aclStateBuilder{ - decoder: decoder, - identity: string(accountData.Identity), - key: accountData.EncKey, + decoder: decoder, + signPrivKey: accountData.SignKey, + encPrivKey: accountData.EncKey, } } @@ -26,19 +27,17 @@ func newACLStateBuilder(decoder keys.Decoder) *aclStateBuilder { } } -func (sb *aclStateBuilder) Build(records []*ACLRecord) (*ACLState, error) { - var ( - err error - state *ACLState - ) - - if sb.key != nil { - state = newACLStateWithIdentity(sb.identity, sb.key, sb.decoder) +func (sb *aclStateBuilder) Build(records []*ACLRecord) (state *ACLState, err error) { + if sb.encPrivKey != nil && sb.signPrivKey != nil { + state, err = newACLStateWithKeys(sb.signPrivKey, sb.encPrivKey) + if err != nil { + return + } } else { state = newACLState(sb.decoder) } for _, rec := range records { - err = state.applyChangeAndUpdate(rec) + err = state.applyRecord(rec) if err != nil { return nil, err } diff --git a/pkg/acl/list/changebuilder.go b/pkg/acl/list/changebuilder.go deleted file mode 100644 index f56e5259..00000000 --- a/pkg/acl/list/changebuilder.go +++ /dev/null @@ -1,131 +0,0 @@ -package list - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" - "github.com/gogo/protobuf/proto" - "hash/fnv" - "time" -) - -type MarshalledChange = []byte - -type ACLChangeBuilder interface { - UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLUserPermissions) error - AddId(id string) // TODO: this is only for testing -} - -type aclChangeBuilder struct { - aclState *ACLState - list ACLList - acc *account.AccountData - - aclData *aclpb.ACLData - id string - readKey *symmetric.Key - readKeyHash uint64 -} - -func newACLChangeBuilder() *aclChangeBuilder { - return &aclChangeBuilder{} -} - -func (c *aclChangeBuilder) Init(state *ACLState, list ACLList, acc *account.AccountData) { - c.aclState = state - c.list = list - c.acc = acc - - c.aclData = &aclpb.ACLData{} - // setting read key for further encryption etc - if state.currentReadKeyHash == 0 { - c.readKey, _ = symmetric.NewRandom() - - hasher := fnv.New64() - hasher.Write(c.readKey.Bytes()) - c.readKeyHash = hasher.Sum64() - } else { - c.readKey = c.aclState.userReadKeys[c.aclState.currentReadKeyHash] - c.readKeyHash = c.aclState.currentReadKeyHash - } -} - -func (c *aclChangeBuilder) AddId(id string) { - c.id = id -} - -func (c *aclChangeBuilder) UserAdd(identity string, encryptionKey encryptionkey.PubKey, permissions aclpb.ACLUserPermissions) error { - var allKeys []*symmetric.Key - if c.aclState.currentReadKeyHash != 0 { - for _, key := range c.aclState.userReadKeys { - allKeys = append(allKeys, key) - } - } else { - allKeys = append(allKeys, c.readKey) - } - - var encryptedKeys [][]byte - for _, k := range allKeys { - res, err := encryptionKey.Encrypt(k.Bytes()) - if err != nil { - return err - } - - encryptedKeys = append(encryptedKeys, res) - } - rawKey, err := encryptionKey.Raw() - if err != nil { - return err - } - ch := &aclpb.ACLContentValue{ - Value: &aclpb.ACLContentValue_UserAdd{ - UserAdd: &aclpb.ACLUserAdd{ - Identity: []byte(identity), - EncryptionKey: rawKey, - EncryptedReadKeys: encryptedKeys, - Permissions: permissions, - }, - }, - } - c.aclData.AclContent = append(c.aclData.AclContent, ch) - return nil -} - -func (c *aclChangeBuilder) BuildAndApply() (*ACLRecord, []byte, error) { - aclRecord := &aclpb.ACLRecord{ - PrevId: c.list.Head().Id, - CurrentReadKeyHash: c.readKeyHash, - Timestamp: int64(time.Now().Nanosecond()), - Identity: c.acc.Identity, - } - - marshalledData, err := proto.Marshal(c.aclData) - if err != nil { - return nil, nil, err - } - aclRecord.Data = marshalledData - err = c.aclState.applyRecord(aclRecord) - if err != nil { - return nil, nil, err - } - - fullMarshalledChange, err := proto.Marshal(aclRecord) - if err != nil { - return nil, nil, err - } - signature, err := c.acc.SignKey.Sign(fullMarshalledChange) - if err != nil { - return nil, nil, err - } - id, err := cid.NewCIDFromBytes(fullMarshalledChange) - if err != nil { - return nil, nil, err - } - ch := NewRecord(id, aclRecord) - ch.Model = c.aclData - ch.Sign = signature - - return ch, fullMarshalledChange, nil -} diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index d20d5b69..aad93a8f 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -5,10 +5,9 @@ import ( "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "sync" ) @@ -26,7 +25,7 @@ type RWLocker interface { type ACLList interface { RWLocker ID() string - Header() *aclpb.ACLHeader + Root() *aclrecordproto.ACLRoot Records() []*ACLRecord ACLState() *ACLState IsAfter(first string, second string) (bool, error) @@ -38,7 +37,7 @@ type ACLList interface { } type aclList struct { - header *aclpb.ACLHeader + root *aclrecordproto.ACLRoot records []*ACLRecord indexes map[string]int id string @@ -51,52 +50,50 @@ type aclList struct { } func BuildACLListWithIdentity(acc *account.AccountData, storage storage.ListStorage) (ACLList, error) { + id, err := storage.ID() + if err != nil { + return nil, err + } builder := newACLStateBuilderWithIdentity(acc.Decoder, acc) - return buildWithACLStateBuilder(builder, storage) + return build(id, builder, newACLRecordBuilder(id, common.NewKeychain()), storage) } func BuildACLList(decoder keys.Decoder, storage storage.ListStorage) (ACLList, error) { - return buildWithACLStateBuilder(newACLStateBuilder(decoder), storage) -} - -func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStorage) (list ACLList, err error) { - header, err := storage.Root() - if err != nil { - return - } - id, err := storage.ID() + if err != nil { + return nil, err + } + return build(id, newACLStateBuilder(decoder), newACLRecordBuilder(id, common.NewKeychain()), storage) +} + +func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage storage.ListStorage) (list ACLList, err error) { + rootWithId, err := storage.Root() if err != nil { return } - - rawRecord, err := storage.Head() + aclRecRoot, err := recBuilder.ConvertFromRaw(rootWithId) if err != nil { return } - keychain := common.NewKeychain() - record, err := NewFromRawRecord(rawRecord) + rawRecordWithId, err := storage.Head() if err != nil { return } - err = verifyRecord(keychain, rawRecord, record) + + record, err := recBuilder.ConvertFromRaw(rawRecordWithId) if err != nil { return } records := []*ACLRecord{record} - for record.Content.PrevId != "" { - rawRecord, err = storage.GetRawRecord(context.Background(), record.Content.PrevId) + for record.PrevId != "" { + rawRecordWithId, err = storage.GetRawRecord(context.Background(), record.PrevId) if err != nil { return } - record, err = NewFromRawRecord(rawRecord) - if err != nil { - return - } - err = verifyRecord(keychain, rawRecord, record) + record, err = recBuilder.ConvertFromRaw(rawRecordWithId) if err != nil { return } @@ -114,16 +111,16 @@ func buildWithACLStateBuilder(builder *aclStateBuilder, storage storage.ListStor indexes[records[len(records)/2].Id] = len(records) / 2 } - state, err := builder.Build(records) + state, err := stateBuilder.Build(records) if err != nil { return } list = &aclList{ - header: header, + root: aclRecRoot.Model.(*aclrecordproto.ACLRoot), records: records, indexes: indexes, - builder: builder, + builder: stateBuilder, aclState: state, id: id, RWMutex: sync.RWMutex{}, @@ -139,8 +136,8 @@ func (a *aclList) ID() string { return a.id } -func (a *aclList) Header() *aclpb.ACLHeader { - return a.header +func (a *aclList) Root() *aclrecordproto.ACLRoot { + return a.root } func (a *aclList) ACLState() *ACLState { @@ -191,26 +188,3 @@ func (a *aclList) IterateFrom(startId string, iterFunc IterFunc) { func (a *aclList) Close() (err error) { return nil } - -func verifyRecord(keychain *common.Keychain, rawRecord *aclpb.RawACLRecord, record *ACLRecord) (err error) { - identityKey, err := keychain.GetOrAdd(record.Identity) - if err != nil { - return - } - - // verifying signature - res, err := identityKey.Verify(rawRecord.Payload, rawRecord.Signature) - if err != nil { - return - } - if !res { - err = ErrInvalidSignature - return - } - - // verifying ID - if !cid.VerifyCID(rawRecord.Payload, rawRecord.Id) { - err = ErrIncorrectCID - } - return -} diff --git a/pkg/acl/list/record.go b/pkg/acl/list/record.go index 04f4abbf..abb37736 100644 --- a/pkg/acl/list/record.go +++ b/pkg/acl/list/record.go @@ -1,65 +1,12 @@ package list -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/gogo/protobuf/proto" -) - type ACLRecord struct { - Id string - Content *aclrecordproto.ACLRecord - Identity string - Model interface{} - Sign []byte + Id string + PrevId string + CurrentReadKeyHash uint64 + Timestamp int64 + Data []byte + Identity []byte + Model interface{} + Signature []byte } - -func NewRecord(id string, aclRecord *aclrecordproto.ACLRecord) *ACLRecord { - return &ACLRecord{ - Id: id, - Content: aclRecord, - Identity: string(aclRecord.Identity), - } -} - -func NewFromRawRecord(rawRecWithId *aclrecordproto.RawACLRecordWithId) (aclRec *ACLRecord, err error) { - rawRec := &aclrecordproto.RawACLRecord{} - err = proto.Unmarshal(rawRecWithId.Payload, rawRec) - if err != nil { - return - } - - protoAclRec := &aclrecordproto.ACLRecord{} - err = proto.Unmarshal(rawRec.Payload, protoAclRec) - if err != nil { - return - } - - return &ACLRecord{ - Id: rawRecWithId.Id, - Content: protoAclRec, - Sign: rawRec.Signature, - Identity: string(protoAclRec.Identity), - }, nil -} - -func NewFromRawRoot(rawRecWithId *aclrecordproto.RawACLRecordWithId) (aclRec *ACLRecord, err error) { - rawRec := &aclrecordproto.RawACLRecord{} - err = proto.Unmarshal(rawRecWithId.Payload, rawRec) - if err != nil { - return - } - - protoAclRec := &aclrecordproto.ACLRecord{} - err = proto.Unmarshal(rawRec.Payload, protoAclRec) - if err != nil { - return - } - - return &ACLRecord{ - Id: rawRecWithId.Id, - Content: protoAclRec, - Sign: rawRec.Signature, - Identity: string(protoAclRec.Identity), - }, nil -} - diff --git a/util/keys/symmetric/symmetric.go b/util/keys/symmetric/symmetric.go index 22648769..711f1fdd 100644 --- a/util/keys/symmetric/symmetric.go +++ b/util/keys/symmetric/symmetric.go @@ -5,6 +5,7 @@ import ( "crypto/cipher" "crypto/rand" "fmt" + "github.com/minio/sha256-simd" mbase "github.com/multiformats/go-multibase" ) @@ -21,6 +22,12 @@ type Key struct { raw []byte } +func DeriveFromBytes(bytes []byte) (*Key, error) { + bArray := sha256.Sum256(bytes) + bSlice := bArray[:] + return FromBytes(bSlice) +} + func (k *Key) Equals(otherKey *Key) bool { otherRaw := otherKey.raw keyRaw := k.raw From 674e784318c8490fb80b184441e72b06f757d49a Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 26 Sep 2022 13:47:34 +0200 Subject: [PATCH 085/219] Make acl list etc compile --- .../aclreadkeyderive.go | 2 +- pkg/acl/list/aclstate.go | 2 +- pkg/acl/list/list_test.go | 22 +-- pkg/acl/testutils/acllistbuilder/keychain.go | 12 +- .../acllistbuilder/liststoragebuilder.go | 157 ++++++++++-------- .../liststoragebuildergraph_nix.go | 8 +- .../testutils/acllistbuilder/ymlentities.go | 19 ++- .../testutils/yamltests/userjoinexample.yml | 15 +- .../testutils/yamltests/userremoveexample.yml | 15 +- 9 files changed, 140 insertions(+), 112 deletions(-) rename pkg/acl/{list => aclrecordproto}/aclreadkeyderive.go (93%) diff --git a/pkg/acl/list/aclreadkeyderive.go b/pkg/acl/aclrecordproto/aclreadkeyderive.go similarity index 93% rename from pkg/acl/list/aclreadkeyderive.go rename to pkg/acl/aclrecordproto/aclreadkeyderive.go index c20b2501..a09ba6ce 100644 --- a/pkg/acl/list/aclreadkeyderive.go +++ b/pkg/acl/aclrecordproto/aclreadkeyderive.go @@ -1,4 +1,4 @@ -package list +package aclrecordproto import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index 166fff71..7caf345a 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -173,7 +173,7 @@ func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error return } - readKey, err = ACLReadKeyDerive([]byte(st.identity), encPubKey) + readKey, err = aclrecordproto.ACLReadKeyDerive([]byte(st.identity), encPubKey) if err != nil { return } diff --git a/pkg/acl/list/list_test.go b/pkg/acl/list/list_test.go index d36cd373..6c3c70d1 100644 --- a/pkg/acl/list/list_test.go +++ b/pkg/acl/list/list_test.go @@ -1,7 +1,7 @@ package list import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/stretchr/testify/assert" @@ -23,10 +23,10 @@ func TestAclList_ACLState_UserInviteAndJoin(t *testing.T) { idC := keychain.GetIdentity("C") // checking final state - assert.Equal(t, aclpb.ACLUserPermissions_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) - assert.Equal(t, aclpb.ACLUserPermissions_Writer, aclList.ACLState().GetUserStates()[idB].Permissions) - assert.Equal(t, aclpb.ACLUserPermissions_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) - assert.Equal(t, aclList.Head().Content.CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) + assert.Equal(t, aclrecordproto.ACLUserPermissions_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) + assert.Equal(t, aclrecordproto.ACLUserPermissions_Writer, aclList.ACLState().GetUserStates()[idB].Permissions) + assert.Equal(t, aclrecordproto.ACLUserPermissions_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) + assert.Equal(t, aclList.Head().CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) var records []*ACLRecord aclList.Iterate(func(record *ACLRecord) (IsContinue bool) { @@ -44,7 +44,7 @@ func TestAclList_ACLState_UserInviteAndJoin(t *testing.T) { assert.NoError(t, err, "should have no error with permissions of B in the record 2") assert.Equal(t, UserPermissionPair{ Identity: idB, - Permission: aclpb.ACLUserPermissions_Writer, + Permission: aclrecordproto.ACLUserPermissions_Writer, }, perm) } @@ -62,9 +62,9 @@ func TestAclList_ACLState_UserJoinAndRemove(t *testing.T) { idC := keychain.GetIdentity("C") // checking final state - assert.Equal(t, aclpb.ACLUserPermissions_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) - assert.Equal(t, aclpb.ACLUserPermissions_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) - assert.Equal(t, aclList.Head().Content.CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) + assert.Equal(t, aclrecordproto.ACLUserPermissions_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) + assert.Equal(t, aclrecordproto.ACLUserPermissions_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) + assert.Equal(t, aclList.Head().CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) _, exists := aclList.ACLState().GetUserStates()[idB] assert.Equal(t, false, exists) @@ -78,13 +78,13 @@ func TestAclList_ACLState_UserJoinAndRemove(t *testing.T) { // checking permissions at specific records assert.Equal(t, 4, len(records)) - assert.NotEqual(t, records[2].Content.CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) + assert.NotEqual(t, records[2].CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) perm, err := aclList.ACLState().PermissionsAtRecord(records[2].Id, idB) assert.NoError(t, err, "should have no error with permissions of B in the record 2") assert.Equal(t, UserPermissionPair{ Identity: idB, - Permission: aclpb.ACLUserPermissions_Writer, + Permission: aclrecordproto.ACLUserPermissions_Writer, }, perm) _, err = aclList.ACLState().PermissionsAtRecord(records[3].Id, idB) diff --git a/pkg/acl/testutils/acllistbuilder/keychain.go b/pkg/acl/testutils/acllistbuilder/keychain.go index b6112ae9..0a32293e 100644 --- a/pkg/acl/testutils/acllistbuilder/keychain.go +++ b/pkg/acl/testutils/acllistbuilder/keychain.go @@ -1,6 +1,7 @@ package acllistbuilder import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "hash/fnv" @@ -21,6 +22,7 @@ type Keychain struct { ReadKeys map[string]*SymKey ReadKeysByHash map[uint64]*SymKey GeneratedIdentities map[string]string + DerivedIdentity string coder signingkey.PubKeyDecoder } @@ -37,6 +39,7 @@ func NewKeychain() *Keychain { } func (k *Keychain) ParseKeys(keys *Keys) { + k.DerivedIdentity = keys.Derived for _, encKey := range keys.Enc { k.AddEncryptionKey(encKey) } @@ -123,6 +126,13 @@ func (k *Keychain) AddReadKey(key *Key) { if err != nil { panic("should be able to generate symmetric key") } + } else if key.Value == "derived" { + signKey, _ := k.SigningKeys[k.DerivedIdentity].Raw() + encKey, _ := k.EncryptionKeys[k.DerivedIdentity].Raw() + rkey, err = aclrecordproto.ACLReadKeyDerive(signKey, encKey) + if err != nil { + panic("should be able to derive symmetric key") + } } else { rkey, err = symmetric.FromString(key.Value) if err != nil { @@ -150,7 +160,7 @@ func (k *Keychain) AddKey(key *Key) { } switch parts[1] { - case "Sign": + case "Signature": k.AddSigningKey(key) case "Enc": k.AddEncryptionKey(key) diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index c6d8703a..ca1b1649 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -3,12 +3,13 @@ package acllistbuilder import ( "context" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/yamltests" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "hash/fnv" "io/ioutil" "path" "time" @@ -19,17 +20,18 @@ import ( type ACLListStorageBuilder struct { aclList string - records []*aclpb.ACLRecord - rawRecords []*aclpb.RawACLRecord + records []*aclrecordproto.ACLRecord + rawRecords []*aclrecordproto.RawACLRecordWithId indexes map[string]int keychain *Keychain - header *aclpb.ACLHeader + rawRoot *aclrecordproto.RawACLRecordWithId + root *aclrecordproto.ACLRoot id string } func NewACLListStorageBuilder(keychain *Keychain) *ACLListStorageBuilder { return &ACLListStorageBuilder{ - records: make([]*aclpb.ACLRecord, 0), + records: make([]*aclrecordproto.ACLRecord, 0), indexes: make(map[string]int), keychain: keychain, } @@ -58,47 +60,66 @@ func NewACLListStorageBuilderFromFile(file string) (*ACLListStorageBuilder, erro return tb, nil } -func (t *ACLListStorageBuilder) createRaw(rec *aclpb.ACLRecord) *aclpb.RawACLRecord { - aclMarshaled, err := proto.Marshal(rec) +func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) *aclrecordproto.RawACLRecordWithId { + protoMarshalled, err := rec.Marshal() if err != nil { panic("should be able to marshal final acl message!") } - signature, err := t.keychain.SigningKeysByIdentity[string(rec.Identity)].Sign(aclMarshaled) + signature, err := t.keychain.SigningKeysByIdentity[string(identity)].Sign(protoMarshalled) if err != nil { panic("should be able to sign final acl message!") } - id, _ := cid.NewCIDFromBytes(aclMarshaled) - - return &aclpb.RawACLRecord{ - Payload: aclMarshaled, + rawRec := &aclrecordproto.RawACLRecord{ + Payload: protoMarshalled, Signature: signature, - Id: id, + } + + rawMarshalled, err := proto.Marshal(rawRec) + if err != nil { + panic(err) + } + + id, _ := cid.NewCIDFromBytes(rawMarshalled) + + return &aclrecordproto.RawACLRecordWithId{ + Payload: rawMarshalled, + Id: id, } } -func (t *ACLListStorageBuilder) getRecord(idx int) *aclpb.RawACLRecord { - return t.rawRecords[idx] +func (t *ACLListStorageBuilder) getRecord(idx int) *aclrecordproto.RawACLRecordWithId { + if idx > 0 { + return t.rawRecords[idx-1] + } + return t.rawRoot } -func (t *ACLListStorageBuilder) Head() (*aclpb.RawACLRecord, error) { - return t.getRecord(len(t.records) - 1), nil +func (t *ACLListStorageBuilder) Head() (*aclrecordproto.RawACLRecordWithId, error) { + l := len(t.records) + if l > 1 { + return t.rawRecords[l-2], nil + } + return t.rawRoot, nil } -func (t *ACLListStorageBuilder) Header() (*aclpb.ACLHeader, error) { - return t.header, nil +func (t *ACLListStorageBuilder) Root() (*aclrecordproto.RawACLRecordWithId, error) { + return t.rawRoot, nil } -func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*aclpb.RawACLRecord, error) { +func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error) { recIdx, ok := t.indexes[id] if !ok { + if id == t.rawRoot.Id { + return t.rawRoot, nil + } return nil, fmt.Errorf("no such record") } return t.getRecord(recIdx), nil } -func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclpb.RawACLRecord) error { +func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { panic("implement me") } @@ -106,7 +127,7 @@ func (t *ACLListStorageBuilder) ID() (string, error) { return t.id, nil } -func (t *ACLListStorageBuilder) GetRawRecords() []*aclpb.RawACLRecord { +func (t *ACLListStorageBuilder) GetRawRecords() []*aclrecordproto.RawACLRecordWithId { return t.rawRecords } @@ -122,29 +143,29 @@ func (t *ACLListStorageBuilder) Parse(tree *YMLList) { prevId := "" for idx, rec := range tree.Records { newRecord := t.parseRecord(rec, prevId) - rawRecord := t.createRaw(newRecord) + rawRecord := t.createRaw(newRecord, newRecord.Identity) t.records = append(t.records, newRecord) - t.rawRecords = append(t.rawRecords, t.createRaw(newRecord)) + t.rawRecords = append(t.rawRecords, rawRecord) t.indexes[rawRecord.Id] = idx prevId = rawRecord.Id } - t.createHeaderAndId() + t.parseRoot(tree.Root) } -func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclpb.ACLRecord { +func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclrecordproto.ACLRecord { k := t.keychain.GetKey(rec.ReadKey).(*SymKey) - var aclChangeContents []*aclpb.ACLContentValue + var aclChangeContents []*aclrecordproto.ACLContentValue for _, ch := range rec.AclChanges { aclChangeContent := t.parseACLChange(ch) aclChangeContents = append(aclChangeContents, aclChangeContent) } - data := &aclpb.ACLData{ + data := &aclrecordproto.ACLData{ AclContent: aclChangeContents, } bytes, _ := data.Marshal() - return &aclpb.ACLRecord{ + return &aclrecordproto.ACLRecord{ PrevId: prevId, Identity: []byte(t.keychain.GetIdentity(rec.Identity)), Data: bytes, @@ -153,7 +174,7 @@ func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclpb.A } } -func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACLContentValue) { +func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecordproto.ACLContentValue) { switch { case ch.UserAdd != nil: add := ch.UserAdd @@ -161,9 +182,9 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL encKey := t.keychain.GetKey(add.EncryptionKey).(encryptionkey.PrivKey) rawKey, _ := encKey.GetPublic().Raw() - convCh = &aclpb.ACLContentValue{ - Value: &aclpb.ACLContentValue_UserAdd{ - UserAdd: &aclpb.ACLUserAdd{ + convCh = &aclrecordproto.ACLContentValue{ + Value: &aclrecordproto.ACLContentValue_UserAdd{ + UserAdd: &aclrecordproto.ACLUserAdd{ Identity: []byte(t.keychain.GetIdentity(add.Identity)), EncryptionKey: rawKey, EncryptedReadKeys: t.encryptReadKeys(add.EncryptedReadKeys, encKey), @@ -185,13 +206,13 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL panic(err) } - convCh = &aclpb.ACLContentValue{ - Value: &aclpb.ACLContentValue_UserJoin{ - UserJoin: &aclpb.ACLUserJoin{ + convCh = &aclrecordproto.ACLContentValue{ + Value: &aclrecordproto.ACLContentValue_UserJoin{ + UserJoin: &aclrecordproto.ACLUserJoin{ Identity: []byte(t.keychain.GetIdentity(join.Identity)), EncryptionKey: rawKey, AcceptSignature: signature, - UserInviteId: join.InviteId, + InviteId: join.InviteId, EncryptedReadKeys: t.encryptReadKeys(join.EncryptedReadKeys, encKey), }, }, @@ -203,9 +224,9 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL GetKey(invite.EncryptionKey).(encryptionkey.PrivKey) rawEncKey, _ := encKey.GetPublic().Raw() - convCh = &aclpb.ACLContentValue{ - Value: &aclpb.ACLContentValue_UserInvite{ - UserInvite: &aclpb.ACLUserInvite{ + convCh = &aclrecordproto.ACLContentValue{ + Value: &aclrecordproto.ACLContentValue_UserInvite{ + UserInvite: &aclrecordproto.ACLUserInvite{ AcceptPublicKey: rawAcceptKey, EncryptPublicKey: rawEncKey, EncryptedReadKeys: t.encryptReadKeys(invite.EncryptedReadKeys, encKey), @@ -214,23 +235,12 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL }, }, } - case ch.UserConfirm != nil: - confirm := ch.UserConfirm - - convCh = &aclpb.ACLContentValue{ - Value: &aclpb.ACLContentValue_UserConfirm{ - UserConfirm: &aclpb.ACLUserConfirm{ - Identity: []byte(t.keychain.GetIdentity(confirm.Identity)), - UserAddId: confirm.UserAddId, - }, - }, - } case ch.UserPermissionChange != nil: permissionChange := ch.UserPermissionChange - convCh = &aclpb.ACLContentValue{ - Value: &aclpb.ACLContentValue_UserPermissionChange{ - UserPermissionChange: &aclpb.ACLUserPermissionChange{ + convCh = &aclrecordproto.ACLContentValue{ + Value: &aclrecordproto.ACLContentValue_UserPermissionChange{ + UserPermissionChange: &aclrecordproto.ACLUserPermissionChange{ Identity: []byte(t.keychain.GetIdentity(permissionChange.Identity)), Permissions: t.convertPermission(permissionChange.Permission), }, @@ -241,7 +251,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL newReadKey := t.keychain.GetKey(remove.NewReadKey).(*SymKey) - var replaces []*aclpb.ACLReadKeyReplace + var replaces []*aclrecordproto.ACLReadKeyReplace for _, id := range remove.IdentitiesLeft { identity := t.keychain.GetIdentity(id) encKey := t.keychain.EncryptionKeys[id] @@ -250,16 +260,16 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclpb.ACL if err != nil { panic(err) } - replaces = append(replaces, &aclpb.ACLReadKeyReplace{ + replaces = append(replaces, &aclrecordproto.ACLReadKeyReplace{ Identity: []byte(identity), EncryptionKey: rawEncKey, EncryptedReadKey: encReadKey, }) } - convCh = &aclpb.ACLContentValue{ - Value: &aclpb.ACLContentValue_UserRemove{ - UserRemove: &aclpb.ACLUserRemove{ + convCh = &aclrecordproto.ACLContentValue{ + Value: &aclrecordproto.ACLContentValue_UserRemove{ + UserRemove: &aclrecordproto.ACLUserRemove{ Identity: []byte(t.keychain.GetIdentity(remove.RemovedIdentity)), ReadKeyReplaces: replaces, }, @@ -286,20 +296,20 @@ func (t *ACLListStorageBuilder) encryptReadKeys(keys []string, encKey encryption return } -func (t *ACLListStorageBuilder) convertPermission(perm string) aclpb.ACLUserPermissions { +func (t *ACLListStorageBuilder) convertPermission(perm string) aclrecordproto.ACLUserPermissions { switch perm { case "admin": - return aclpb.ACLUserPermissions_Admin + return aclrecordproto.ACLUserPermissions_Admin case "writer": - return aclpb.ACLUserPermissions_Writer + return aclrecordproto.ACLUserPermissions_Writer case "reader": - return aclpb.ACLUserPermissions_Reader + return aclrecordproto.ACLUserPermissions_Reader default: panic(fmt.Sprintf("incorrect permission: %s", perm)) } } -func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclpb.ACLRecord, id string) error) (err error) { +func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclrecordproto.ACLRecord, id string) error) (err error) { for i := len(t.records) - 1; i >= 0; i-- { err = f(t.records[i], t.rawRecords[i].Id) if err != nil { @@ -309,11 +319,22 @@ func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclpb.ACLRecord, id return nil } -func (t *ACLListStorageBuilder) createHeaderAndId() { - t.header = &aclpb.ACLHeader{ - FirstId: t.rawRecords[0].Id, +func (t *ACLListStorageBuilder) parseRoot(root *Root) { + rawSignKey, _ := t.keychain.GetKey(root.Identity).(signingkey.PrivKey).GetPublic().Raw() + rawEncKey, _ := t.keychain.GetKey(root.EncryptionKey).(encryptionkey.PrivKey).GetPublic().Raw() + readKey, _ := aclrecordproto.ACLReadKeyDerive(rawSignKey, rawEncKey) + hasher := fnv.New64() + hasher.Write(readKey.Bytes()) + t.root = &aclrecordproto.ACLRoot{ + Identity: rawSignKey, + EncryptionKey: rawEncKey, + SpaceId: root.SpaceId, + EncryptedReadKey: nil, + DerivationScheme: "scheme", + CurrentReadKeyHash: hasher.Sum64(), } - bytes, _ := t.header.Marshal() + t.rawRoot = t.createRaw(t.root, rawSignKey) + bytes, _ := t.rawRoot.Marshal() id, _ := cid.NewCIDFromBytes(bytes) t.id = id } diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go b/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go index d7dfc85f..34b6fc92 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go @@ -9,7 +9,7 @@ package acllistbuilder import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/gogo/protobuf/proto" "strings" @@ -33,11 +33,11 @@ func (t *ACLListStorageBuilder) Graph() (string, error) { graph.SetDir(true) var nodes = make(map[string]struct{}) - var addNodes = func(r *aclpb.ACLRecord, id string) error { + var addNodes = func(r *aclrecordproto.ACLRecord, id string) error { style := "solid" var chSymbs []string - aclData := &aclpb.ACLData{} + aclData := &aclrecordproto.ACLData{} err := proto.Unmarshal(r.GetData(), aclData) if err != nil { return err @@ -92,7 +92,7 @@ func (t *ACLListStorageBuilder) Graph() (string, error) { return nil } - var addLinks = func(r *aclpb.ACLRecord, id string) error { + var addLinks = func(r *aclrecordproto.ACLRecord, id string) error { if r.PrevId == "" { return nil } diff --git a/pkg/acl/testutils/acllistbuilder/ymlentities.go b/pkg/acl/testutils/acllistbuilder/ymlentities.go index 4d0fb069..2b77c698 100644 --- a/pkg/acl/testutils/acllistbuilder/ymlentities.go +++ b/pkg/acl/testutils/acllistbuilder/ymlentities.go @@ -6,9 +6,10 @@ type Key struct { } type Keys struct { - Enc []*Key `yaml:"Enc"` - Sign []*Key `yaml:"Sign"` - Read []*Key `yaml:"Read"` + Derived string `yaml:"Derived"` + Enc []*Key `yaml:"Enc"` + Sign []*Key `yaml:"Sign"` + Read []*Key `yaml:"Read"` } type ACLChange struct { @@ -35,11 +36,6 @@ type ACLChange struct { InviteId string `yaml:"inviteId"` } `yaml:"userInvite"` - UserConfirm *struct { - Identity string `yaml:"identity"` - UserAddId string `yaml:"UserAddId"` - } `yaml:"userConfirm"` - UserRemove *struct { RemovedIdentity string `yaml:"removedIdentity"` NewReadKey string `yaml:"newReadKey"` @@ -63,7 +59,14 @@ type Header struct { IsWorkspace bool `yaml:"isWorkspace"` } +type Root struct { + Identity string `yaml:"identity"` + EncryptionKey string `yaml:"encryptionKey"` + SpaceId string `yaml:"spaceId"` +} + type YMLList struct { + Root *Root Records []*Record `yaml:"records"` Keys Keys `yaml:"keys"` diff --git a/pkg/acl/testutils/yamltests/userjoinexample.yml b/pkg/acl/testutils/yamltests/userjoinexample.yml index 014c9349..45abf458 100644 --- a/pkg/acl/testutils/yamltests/userjoinexample.yml +++ b/pkg/acl/testutils/yamltests/userjoinexample.yml @@ -1,12 +1,8 @@ -records: +root: - identity: A - aclChanges: - - userAdd: - identity: A - permission: admin - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 + encryptionKey: key.Enc.A + spaceId: space +records: - identity: A aclChanges: - userInvite: @@ -31,6 +27,7 @@ records: encryptedReadKeys: [key.Read.1] readKey: key.Read.1 keys: + Derived: A Enc: - name: A value: generated @@ -51,4 +48,4 @@ keys: value: generated Read: - name: 1 - value: generated + value: derived diff --git a/pkg/acl/testutils/yamltests/userremoveexample.yml b/pkg/acl/testutils/yamltests/userremoveexample.yml index 9d90468c..39a30f25 100644 --- a/pkg/acl/testutils/yamltests/userremoveexample.yml +++ b/pkg/acl/testutils/yamltests/userremoveexample.yml @@ -1,12 +1,8 @@ -records: +root: - identity: A - aclChanges: - - userAdd: - identity: A - permission: admin - encryptionKey: key.Enc.A - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 + encryptionKey: key.Enc.A + spaceId: space +records: - identity: A aclChanges: - userInvite: @@ -38,6 +34,7 @@ records: identitiesLeft: [A, C] readKey: key.Read.2 keys: + Derived: A Enc: - name: A value: generated @@ -58,6 +55,6 @@ keys: value: generated Read: - name: 1 - value: generated + value: derived - name: 2 value: generated From 632d73698f33949e8532b822ff8679a014f5cca4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 26 Sep 2022 14:41:50 +0200 Subject: [PATCH 086/219] More test fixes --- pkg/acl/list/aclstate.go | 6 +- pkg/acl/list/aclstatebuilder.go | 20 ++--- pkg/acl/list/list.go | 9 ++- pkg/acl/testutils/acllistbuilder/keychain.go | 74 +++++++++---------- .../acllistbuilder/liststoragebuilder.go | 41 ++++------ .../testutils/acllistbuilder/ymlentities.go | 5 +- .../testutils/yamltests/userjoinexample.yml | 5 +- .../testutils/yamltests/userremoveexample.yml | 5 +- 8 files changed, 78 insertions(+), 87 deletions(-) diff --git a/pkg/acl/list/aclstate.go b/pkg/acl/list/aclstate.go index 7caf345a..a8df8c53 100644 --- a/pkg/acl/list/aclstate.go +++ b/pkg/acl/list/aclstate.go @@ -7,7 +7,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" @@ -50,6 +49,7 @@ type ACLState struct { } func newACLStateWithKeys( + id string, signingKey signingkey.PrivKey, encryptionKey encryptionkey.PrivKey) (*ACLState, error) { identity, err := signingKey.Raw() @@ -57,6 +57,7 @@ func newACLStateWithKeys( return nil, err } return &ACLState{ + id: id, identity: string(identity), signingKey: signingKey, encryptionKey: encryptionKey, @@ -67,8 +68,9 @@ func newACLStateWithKeys( }, nil } -func newACLState(decoder keys.Decoder) *ACLState { +func newACLState(id string) *ACLState { return &ACLState{ + id: id, userReadKeys: make(map[uint64]*symmetric.Key), userStates: make(map[string]*aclrecordproto.ACLUserState), userInvites: make(map[string]*aclrecordproto.ACLUserInvite), diff --git a/pkg/acl/list/aclstatebuilder.go b/pkg/acl/list/aclstatebuilder.go index 2d7693fb..75b606af 100644 --- a/pkg/acl/list/aclstatebuilder.go +++ b/pkg/acl/list/aclstatebuilder.go @@ -2,7 +2,6 @@ package list import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" ) @@ -10,31 +9,32 @@ import ( type aclStateBuilder struct { signPrivKey signingkey.PrivKey encPrivKey encryptionkey.PrivKey - decoder keys.Decoder + id string } -func newACLStateBuilderWithIdentity(decoder keys.Decoder, accountData *account.AccountData) *aclStateBuilder { +func newACLStateBuilderWithIdentity(accountData *account.AccountData) *aclStateBuilder { return &aclStateBuilder{ - decoder: decoder, signPrivKey: accountData.SignKey, encPrivKey: accountData.EncKey, } } -func newACLStateBuilder(decoder keys.Decoder) *aclStateBuilder { - return &aclStateBuilder{ - decoder: decoder, - } +func newACLStateBuilder() *aclStateBuilder { + return &aclStateBuilder{} +} + +func (sb *aclStateBuilder) Init(id string) { + sb.id = id } func (sb *aclStateBuilder) Build(records []*ACLRecord) (state *ACLState, err error) { if sb.encPrivKey != nil && sb.signPrivKey != nil { - state, err = newACLStateWithKeys(sb.signPrivKey, sb.encPrivKey) + state, err = newACLStateWithKeys(sb.id, sb.signPrivKey, sb.encPrivKey) if err != nil { return } } else { - state = newACLState(sb.decoder) + state = newACLState(sb.id) } for _, rec := range records { err = state.applyRecord(rec) diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index aad93a8f..f940e4b4 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -54,7 +54,7 @@ func BuildACLListWithIdentity(acc *account.AccountData, storage storage.ListStor if err != nil { return nil, err } - builder := newACLStateBuilderWithIdentity(acc.Decoder, acc) + builder := newACLStateBuilderWithIdentity(acc) return build(id, builder, newACLRecordBuilder(id, common.NewKeychain()), storage) } @@ -63,7 +63,7 @@ func BuildACLList(decoder keys.Decoder, storage storage.ListStorage) (ACLList, e if err != nil { return nil, err } - return build(id, newACLStateBuilder(decoder), newACLRecordBuilder(id, common.NewKeychain()), storage) + return build(id, newACLStateBuilder(), newACLRecordBuilder(id, common.NewKeychain()), storage) } func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage storage.ListStorage) (list ACLList, err error) { @@ -87,7 +87,7 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder } records := []*ACLRecord{record} - for record.PrevId != "" { + for record.PrevId != "" && record.PrevId != id { rawRecordWithId, err = storage.GetRawRecord(context.Background(), record.PrevId) if err != nil { return @@ -99,6 +99,8 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder } records = append(records, record) } + // adding root in the end, because we already parsed it + records = append(records, aclRecRoot) indexes := make(map[string]int) for i, j := 0, len(records)-1; i < j; i, j = i+1, j-1 { @@ -111,6 +113,7 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder indexes[records[len(records)/2].Id] = len(records) / 2 } + stateBuilder.Init(id) state, err := stateBuilder.Build(records) if err != nil { return diff --git a/pkg/acl/testutils/acllistbuilder/keychain.go b/pkg/acl/testutils/acllistbuilder/keychain.go index 0a32293e..e26f389b 100644 --- a/pkg/acl/testutils/acllistbuilder/keychain.go +++ b/pkg/acl/testutils/acllistbuilder/keychain.go @@ -15,30 +15,30 @@ type SymKey struct { Key *symmetric.Key } -type Keychain struct { - SigningKeys map[string]signingkey.PrivKey - SigningKeysByIdentity map[string]signingkey.PrivKey - EncryptionKeys map[string]encryptionkey.PrivKey - ReadKeys map[string]*SymKey - ReadKeysByHash map[uint64]*SymKey - GeneratedIdentities map[string]string - DerivedIdentity string - coder signingkey.PubKeyDecoder +type YAMLKeychain struct { + SigningKeysByYAMLIdentity map[string]signingkey.PrivKey + SigningKeysByRealIdentity map[string]signingkey.PrivKey + EncryptionKeysByYAMLIdentity map[string]encryptionkey.PrivKey + ReadKeysByYAMLIdentity map[string]*SymKey + ReadKeysByHash map[uint64]*SymKey + GeneratedIdentities map[string]string + DerivedIdentity string + coder signingkey.PubKeyDecoder } -func NewKeychain() *Keychain { - return &Keychain{ - SigningKeys: map[string]signingkey.PrivKey{}, - SigningKeysByIdentity: map[string]signingkey.PrivKey{}, - EncryptionKeys: map[string]encryptionkey.PrivKey{}, - GeneratedIdentities: map[string]string{}, - ReadKeys: map[string]*SymKey{}, - ReadKeysByHash: map[uint64]*SymKey{}, - coder: signingkey.NewEd25519PubKeyDecoder(), +func NewKeychain() *YAMLKeychain { + return &YAMLKeychain{ + SigningKeysByYAMLIdentity: map[string]signingkey.PrivKey{}, + SigningKeysByRealIdentity: map[string]signingkey.PrivKey{}, + EncryptionKeysByYAMLIdentity: map[string]encryptionkey.PrivKey{}, + GeneratedIdentities: map[string]string{}, + ReadKeysByYAMLIdentity: map[string]*SymKey{}, + ReadKeysByHash: map[uint64]*SymKey{}, + coder: signingkey.NewEd25519PubKeyDecoder(), } } -func (k *Keychain) ParseKeys(keys *Keys) { +func (k *YAMLKeychain) ParseKeys(keys *Keys) { k.DerivedIdentity = keys.Derived for _, encKey := range keys.Enc { k.AddEncryptionKey(encKey) @@ -53,8 +53,8 @@ func (k *Keychain) ParseKeys(keys *Keys) { } } -func (k *Keychain) AddEncryptionKey(key *Key) { - if _, exists := k.EncryptionKeys[key.Name]; exists { +func (k *YAMLKeychain) AddEncryptionKey(key *Key) { + if _, exists := k.EncryptionKeysByYAMLIdentity[key.Name]; exists { return } var ( @@ -74,11 +74,11 @@ func (k *Keychain) AddEncryptionKey(key *Key) { } newPrivKey = privKey.(encryptionkey.PrivKey) } - k.EncryptionKeys[key.Name] = newPrivKey + k.EncryptionKeysByYAMLIdentity[key.Name] = newPrivKey } -func (k *Keychain) AddSigningKey(key *Key) { - if _, exists := k.SigningKeys[key.Name]; exists { +func (k *YAMLKeychain) AddSigningKey(key *Key) { + if _, exists := k.SigningKeysByYAMLIdentity[key.Name]; exists { return } var ( @@ -101,19 +101,19 @@ func (k *Keychain) AddSigningKey(key *Key) { pubKey = newPrivKey.GetPublic() } - k.SigningKeys[key.Name] = newPrivKey + k.SigningKeysByYAMLIdentity[key.Name] = newPrivKey rawPubKey, err := pubKey.Raw() if err != nil { panic(err) } encoded := string(rawPubKey) - k.SigningKeysByIdentity[encoded] = newPrivKey + k.SigningKeysByRealIdentity[encoded] = newPrivKey k.GeneratedIdentities[key.Name] = encoded } -func (k *Keychain) AddReadKey(key *Key) { - if _, exists := k.ReadKeys[key.Name]; exists { +func (k *YAMLKeychain) AddReadKey(key *Key) { + if _, exists := k.ReadKeysByYAMLIdentity[key.Name]; exists { return } @@ -127,8 +127,8 @@ func (k *Keychain) AddReadKey(key *Key) { panic("should be able to generate symmetric key") } } else if key.Value == "derived" { - signKey, _ := k.SigningKeys[k.DerivedIdentity].Raw() - encKey, _ := k.EncryptionKeys[k.DerivedIdentity].Raw() + signKey, _ := k.SigningKeysByYAMLIdentity[k.DerivedIdentity].Raw() + encKey, _ := k.EncryptionKeysByYAMLIdentity[k.DerivedIdentity].Raw() rkey, err = aclrecordproto.ACLReadKeyDerive(signKey, encKey) if err != nil { panic("should be able to derive symmetric key") @@ -143,7 +143,7 @@ func (k *Keychain) AddReadKey(key *Key) { hasher := fnv.New64() hasher.Write(rkey.Bytes()) - k.ReadKeys[key.Name] = &SymKey{ + k.ReadKeysByYAMLIdentity[key.Name] = &SymKey{ Hash: hasher.Sum64(), Key: rkey, } @@ -153,7 +153,7 @@ func (k *Keychain) AddReadKey(key *Key) { } } -func (k *Keychain) AddKey(key *Key) { +func (k *YAMLKeychain) AddKey(key *Key) { parts := strings.Split(key.Name, ".") if len(parts) != 3 { panic("cannot parse a key") @@ -171,7 +171,7 @@ func (k *Keychain) AddKey(key *Key) { } } -func (k *Keychain) GetKey(key string) interface{} { +func (k *YAMLKeychain) GetKey(key string) interface{} { parts := strings.Split(key, ".") if len(parts) != 3 { panic("cannot parse a key") @@ -180,15 +180,15 @@ func (k *Keychain) GetKey(key string) interface{} { switch parts[1] { case "Sign": - if key, exists := k.SigningKeys[name]; exists { + if key, exists := k.SigningKeysByYAMLIdentity[name]; exists { return key } case "Enc": - if key, exists := k.EncryptionKeys[name]; exists { + if key, exists := k.EncryptionKeysByYAMLIdentity[name]; exists { return key } case "Read": - if key, exists := k.ReadKeys[name]; exists { + if key, exists := k.ReadKeysByYAMLIdentity[name]; exists { return key } default: @@ -197,6 +197,6 @@ func (k *Keychain) GetKey(key string) interface{} { return nil } -func (k *Keychain) GetIdentity(name string) string { +func (k *YAMLKeychain) GetIdentity(name string) string { return k.GeneratedIdentities[name] } diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index ca1b1649..d855ac99 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -23,13 +23,13 @@ type ACLListStorageBuilder struct { records []*aclrecordproto.ACLRecord rawRecords []*aclrecordproto.RawACLRecordWithId indexes map[string]int - keychain *Keychain + keychain *YAMLKeychain rawRoot *aclrecordproto.RawACLRecordWithId root *aclrecordproto.ACLRoot id string } -func NewACLListStorageBuilder(keychain *Keychain) *ACLListStorageBuilder { +func NewACLListStorageBuilder(keychain *YAMLKeychain) *ACLListStorageBuilder { return &ACLListStorageBuilder{ records: make([]*aclrecordproto.ACLRecord, 0), indexes: make(map[string]int), @@ -66,7 +66,7 @@ func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) panic("should be able to marshal final acl message!") } - signature, err := t.keychain.SigningKeysByIdentity[string(identity)].Sign(protoMarshalled) + signature, err := t.keychain.SigningKeysByRealIdentity[string(identity)].Sign(protoMarshalled) if err != nil { panic("should be able to sign final acl message!") } @@ -89,17 +89,10 @@ func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) } } -func (t *ACLListStorageBuilder) getRecord(idx int) *aclrecordproto.RawACLRecordWithId { - if idx > 0 { - return t.rawRecords[idx-1] - } - return t.rawRoot -} - func (t *ACLListStorageBuilder) Head() (*aclrecordproto.RawACLRecordWithId, error) { l := len(t.records) - if l > 1 { - return t.rawRecords[l-2], nil + if l > 0 { + return t.rawRecords[l-1], nil } return t.rawRoot, nil } @@ -116,7 +109,7 @@ func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*a } return nil, fmt.Errorf("no such record") } - return t.getRecord(recIdx), nil + return t.rawRecords[recIdx], nil } func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { @@ -131,7 +124,7 @@ func (t *ACLListStorageBuilder) GetRawRecords() []*aclrecordproto.RawACLRecordWi return t.rawRecords } -func (t *ACLListStorageBuilder) GetKeychain() *Keychain { +func (t *ACLListStorageBuilder) GetKeychain() *YAMLKeychain { return t.keychain } @@ -140,7 +133,8 @@ func (t *ACLListStorageBuilder) Parse(tree *YMLList) { // are specified in the yml file, because our identities should be Ed25519 // the same thing is happening for the encryption keys t.keychain.ParseKeys(&tree.Keys) - prevId := "" + t.parseRoot(tree.Root) + prevId := t.id for idx, rec := range tree.Records { newRecord := t.parseRecord(rec, prevId) rawRecord := t.createRaw(newRecord, newRecord.Identity) @@ -149,8 +143,6 @@ func (t *ACLListStorageBuilder) Parse(tree *YMLList) { t.indexes[rawRecord.Id] = idx prevId = rawRecord.Id } - - t.parseRoot(tree.Root) } func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclrecordproto.ACLRecord { @@ -199,7 +191,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord GetKey(join.EncryptionKey).(encryptionkey.PrivKey) rawKey, _ := encKey.GetPublic().Raw() - idKey, _ := t.keychain.SigningKeys[join.Identity].GetPublic().Raw() + idKey, _ := t.keychain.SigningKeysByYAMLIdentity[join.Identity].GetPublic().Raw() signKey := t.keychain.GetKey(join.AcceptSignature).(signingkey.PrivKey) signature, err := signKey.Sign(idKey) if err != nil { @@ -253,15 +245,14 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord var replaces []*aclrecordproto.ACLReadKeyReplace for _, id := range remove.IdentitiesLeft { - identity := t.keychain.GetIdentity(id) - encKey := t.keychain.EncryptionKeys[id] + encKey := t.keychain.EncryptionKeysByYAMLIdentity[id] rawEncKey, _ := encKey.GetPublic().Raw() encReadKey, err := encKey.GetPublic().Encrypt(newReadKey.Key.Bytes()) if err != nil { panic(err) } replaces = append(replaces, &aclrecordproto.ACLReadKeyReplace{ - Identity: []byte(identity), + Identity: []byte(t.keychain.GetIdentity(id)), EncryptionKey: rawEncKey, EncryptedReadKey: encReadKey, }) @@ -320,8 +311,8 @@ func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclrecordproto.ACLR } func (t *ACLListStorageBuilder) parseRoot(root *Root) { - rawSignKey, _ := t.keychain.GetKey(root.Identity).(signingkey.PrivKey).GetPublic().Raw() - rawEncKey, _ := t.keychain.GetKey(root.EncryptionKey).(encryptionkey.PrivKey).GetPublic().Raw() + rawSignKey, _ := t.keychain.SigningKeysByYAMLIdentity[root.Identity].GetPublic().Raw() + rawEncKey, _ := t.keychain.EncryptionKeysByYAMLIdentity[root.Identity].GetPublic().Raw() readKey, _ := aclrecordproto.ACLReadKeyDerive(rawSignKey, rawEncKey) hasher := fnv.New64() hasher.Write(readKey.Bytes()) @@ -334,7 +325,5 @@ func (t *ACLListStorageBuilder) parseRoot(root *Root) { CurrentReadKeyHash: hasher.Sum64(), } t.rawRoot = t.createRaw(t.root, rawSignKey) - bytes, _ := t.rawRoot.Marshal() - id, _ := cid.NewCIDFromBytes(bytes) - t.id = id + t.id = t.rawRoot.Id } diff --git a/pkg/acl/testutils/acllistbuilder/ymlentities.go b/pkg/acl/testutils/acllistbuilder/ymlentities.go index 2b77c698..df1e43c6 100644 --- a/pkg/acl/testutils/acllistbuilder/ymlentities.go +++ b/pkg/acl/testutils/acllistbuilder/ymlentities.go @@ -60,9 +60,8 @@ type Header struct { } type Root struct { - Identity string `yaml:"identity"` - EncryptionKey string `yaml:"encryptionKey"` - SpaceId string `yaml:"spaceId"` + Identity string `yaml:"identity"` + SpaceId string `yaml:"spaceId"` } type YMLList struct { diff --git a/pkg/acl/testutils/yamltests/userjoinexample.yml b/pkg/acl/testutils/yamltests/userjoinexample.yml index 45abf458..6d7bb48e 100644 --- a/pkg/acl/testutils/yamltests/userjoinexample.yml +++ b/pkg/acl/testutils/yamltests/userjoinexample.yml @@ -1,7 +1,6 @@ root: - - identity: A - encryptionKey: key.Enc.A - spaceId: space + identity: A + spaceId: space records: - identity: A aclChanges: diff --git a/pkg/acl/testutils/yamltests/userremoveexample.yml b/pkg/acl/testutils/yamltests/userremoveexample.yml index 39a30f25..6cf51b84 100644 --- a/pkg/acl/testutils/yamltests/userremoveexample.yml +++ b/pkg/acl/testutils/yamltests/userremoveexample.yml @@ -1,7 +1,6 @@ root: - - identity: A - encryptionKey: key.Enc.A - spaceId: space + identity: A + spaceId: space records: - identity: A aclChanges: From 9d73e1d5c1898ec83ce5d71db21d4a589c713cdf Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 26 Sep 2022 20:32:59 +0200 Subject: [PATCH 087/219] Remove decoders and fix sync tree --- cmd/nodesgen/gen.go | 8 +- cmd/nodesgen/nodemap.yml | 4 +- common/account/service.go | 40 +++--- .../spacesyncproto/protos/spacesync.proto | 2 +- .../spacesyncproto/spacesync.pb.go | 132 +++++++++--------- common/commonspace/syncservice/syncservice.go | 14 +- common/commonspace/synctree/synctree.go | 4 +- pkg/acl/account/accountdata.go | 2 - pkg/acl/list/list.go | 3 +- pkg/acl/list/list_test.go | 5 +- pkg/acl/testutils/acllistbuilder/keychain.go | 11 +- pkg/acl/tree/objecttree.go | 6 +- pkg/acl/tree/objecttree_test.go | 17 +-- pkg/acl/tree/objecttreefactory.go | 13 +- service/node/service.go | 5 +- util/keys/asymmetric/encryptionkey/rsa.go | 8 -- util/keys/asymmetric/signingkey/ed25519.go | 42 ------ util/keys/asymmetric/signingkey/signingkey.go | 7 - util/keys/decode.go | 30 ++++ util/keys/decoder.go | 38 ----- util/keys/key.go | 7 - 21 files changed, 149 insertions(+), 249 deletions(-) create mode 100644 util/keys/decode.go delete mode 100644 util/keys/decoder.go diff --git a/cmd/nodesgen/gen.go b/cmd/nodesgen/gen.go index 069c3c59..3e1104a5 100644 --- a/cmd/nodesgen/gen.go +++ b/cmd/nodesgen/gen.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/peer" @@ -100,15 +101,12 @@ func genConfig(addresses []string, apiPort string) (config.Config, error) { return config.Config{}, err } - encKeyDecoder := encryptionkey.NewRSAPrivKeyDecoder() - signKeyDecoder := signingkey.NewEDPrivKeyDecoder() - - encEncKey, err := encKeyDecoder.EncodeToString(encKey) + encEncKey, err := keys.EncodeKeyToString(encKey) if err != nil { return config.Config{}, err } - encSignKey, err := signKeyDecoder.EncodeToString(signKey) + encSignKey, err := keys.EncodeKeyToString(signKey) if err != nil { return config.Config{}, err } diff --git a/cmd/nodesgen/nodemap.yml b/cmd/nodesgen/nodemap.yml index d7b776aa..27a0cb15 100644 --- a/cmd/nodesgen/nodemap.yml +++ b/cmd/nodesgen/nodemap.yml @@ -1,9 +1,7 @@ nodes: - grpcAddresses: - "127.0.0.1:4430" - - "127.0.0.1:4431" apiPort: "8080" - grpcAddresses: - - "127.0.0.1:4432" - - "127.0.0.1:4433" + - "127.0.0.1:4431" apiPort: "8081" diff --git a/common/account/service.go b/common/account/service.go index 7b0cc621..8cc55031 100644 --- a/common/account/service.go +++ b/common/account/service.go @@ -4,6 +4,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" ) @@ -34,33 +35,34 @@ func New() app.Component { func (s *service) Init(a *app.App) (err error) { cfg := a.MustComponent(config.CName).(*config.Config) - - // decoding our keys - privateEncryptionDecoder := encryptionkey.NewRSAPrivKeyDecoder() - privateSigningDecoder := signingkey.NewEDPrivKeyDecoder() - publicSigningDecoder := signingkey.NewEDPubKeyDecoder() + // TODO: add deviceKey acc := cfg.Account - decodedEncryptionKey, err := privateEncryptionDecoder.DecodeFromString(acc.EncryptionKey) - if err != nil { - return err - } - decodedSigningKey, err := privateSigningDecoder.DecodeFromString(acc.SigningKey) - if err != nil { - return err - } - signKey := decodedSigningKey.(signingkey.PrivKey) - identity, err := publicSigningDecoder.EncodeToString(signKey.GetPublic()) + decodedEncryptionKey, err := keys.DecodeKeyFromString( + acc.EncryptionKey, + encryptionkey.NewEncryptionRsaPrivKeyFromBytes, + nil) + if err != nil { + return err + } + + decodedSigningKey, err := keys.DecodeKeyFromString( + acc.SigningKey, + signingkey.NewSigningEd25519PrivKeyFromBytes, + nil) + if err != nil { + return err + } + + identity, err := decodedSigningKey.GetPublic().Raw() if err != nil { return err } - // TODO: using acl lib format basically, but we should simplify this s.accountData = &account.AccountData{ Identity: identity, - SignKey: signKey, - EncKey: decodedEncryptionKey.(encryptionkey.PrivKey), - Decoder: signingkey.NewEDPubKeyDecoder(), + SignKey: decodedSigningKey, + EncKey: decodedEncryptionKey, } s.peerId = acc.PeerId diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index a4bb3171..d4d65733 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -49,7 +49,7 @@ message HeadSyncResponse { message ObjectSyncMessage { string spaceId = 1; ObjectSyncContentValue content = 2; - treechange.RootChange treeHeader = 3; + treechange.RawTreeChangeWithId rootChange = 3; string treeId = 4; string trackingId = 5; // diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index a0e6bf89..6cbcba84 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -320,11 +320,11 @@ func (m *HeadSyncResponse) GetResults() []*HeadSyncResult { // ObjectSyncMessage is a message sent on object sync type ObjectSyncMessage struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - Content *ObjectSyncContentValue `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` - TreeHeader *treechangeproto.RootChange `protobuf:"bytes,3,opt,name=treeHeader,proto3" json:"treeHeader,omitempty"` - TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` - TrackingId string `protobuf:"bytes,5,opt,name=trackingId,proto3" json:"trackingId,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + Content *ObjectSyncContentValue `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` + RootChange *treechangeproto.RawTreeChangeWithId `protobuf:"bytes,3,opt,name=rootChange,proto3" json:"rootChange,omitempty"` + TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` + TrackingId string `protobuf:"bytes,5,opt,name=trackingId,proto3" json:"trackingId,omitempty"` } func (m *ObjectSyncMessage) Reset() { *m = ObjectSyncMessage{} } @@ -374,9 +374,9 @@ func (m *ObjectSyncMessage) GetContent() *ObjectSyncContentValue { return nil } -func (m *ObjectSyncMessage) GetTreeHeader() *treechangeproto.RootChange { +func (m *ObjectSyncMessage) GetRootChange() *treechangeproto.RawTreeChangeWithId { if m != nil { - return m.TreeHeader + return m.RootChange } return nil } @@ -831,57 +831,57 @@ func init() { } var fileDescriptor_5855f4ef9cf24cdb = []byte{ - // 797 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x55, 0xcd, 0x8e, 0xe3, 0x44, - 0x10, 0xb6, 0x33, 0x99, 0x49, 0x52, 0x99, 0x99, 0x0d, 0x0d, 0x3b, 0x98, 0x00, 0xd9, 0xe0, 0x03, - 0x8a, 0x40, 0x4a, 0x50, 0x90, 0x10, 0x30, 0x5c, 0xd8, 0x51, 0x46, 0x89, 0x56, 0xfc, 0xa8, 0x67, - 0x17, 0x24, 0xc4, 0xa5, 0xd7, 0xae, 0x4d, 0xcc, 0xda, 0x6e, 0xe3, 0xee, 0xb0, 0xe4, 0x09, 0xb8, - 0x80, 0x84, 0x78, 0x03, 0x9e, 0x85, 0x0b, 0xc7, 0x3d, 0xc2, 0x0d, 0xcd, 0xbc, 0x08, 0xea, 0xb2, - 0x1d, 0x3b, 0xc1, 0xbb, 0x1c, 0xf7, 0x12, 0x77, 0x7d, 0x5d, 0xf5, 0xf5, 0xd7, 0x55, 0xd5, 0x15, - 0xf8, 0xd0, 0x93, 0x51, 0x24, 0xe3, 0x49, 0xf6, 0x51, 0x89, 0xf0, 0x70, 0x42, 0xbf, 0x6a, 0x13, - 0x7b, 0x49, 0x2a, 0xb5, 0x9c, 0xd0, 0xaf, 0x2a, 0xd1, 0x31, 0x01, 0xac, 0x2d, 0xe2, 0xcd, 0x95, - 0xc1, 0xfa, 0x93, 0xe4, 0xf1, 0x72, 0x22, 0xbc, 0x70, 0xa2, 0x53, 0x44, 0x6f, 0x25, 0xe2, 0x25, - 0xee, 0x44, 0x96, 0x70, 0x16, 0xea, 0x2e, 0xe0, 0x64, 0x8e, 0xc2, 0xbf, 0xda, 0xc4, 0x1e, 0x37, - 0x30, 0x63, 0xd0, 0x7c, 0x94, 0xca, 0xc8, 0xb1, 0x87, 0xf6, 0xa8, 0xc9, 0x69, 0xcd, 0x4e, 0xa1, - 0xa1, 0xa5, 0xd3, 0x20, 0xa4, 0xa1, 0x25, 0x7b, 0x05, 0x0e, 0xc3, 0x20, 0x0a, 0xb4, 0x73, 0x30, - 0xb4, 0x47, 0x27, 0x3c, 0x33, 0xdc, 0x27, 0x70, 0xba, 0xa5, 0x42, 0xb5, 0x0e, 0xb5, 0xe1, 0x5a, - 0x09, 0xb5, 0x22, 0xae, 0x63, 0x4e, 0x6b, 0x76, 0x0e, 0x6d, 0x0c, 0x31, 0xc2, 0x58, 0x2b, 0xa7, - 0x31, 0x3c, 0x18, 0x75, 0xa7, 0x77, 0xc6, 0x85, 0xfc, 0xf1, 0x6e, 0xfc, 0x2c, 0xf3, 0xe3, 0xdb, - 0x00, 0x73, 0xb0, 0x27, 0xd7, 0xf1, 0xf6, 0x60, 0x32, 0xdc, 0x73, 0xb8, 0x5d, 0x1b, 0x68, 0x74, - 0x07, 0x3e, 0x9d, 0xde, 0xe1, 0x8d, 0xc0, 0x27, 0x3d, 0x28, 0x7c, 0xba, 0x49, 0x87, 0xd3, 0xda, - 0xfd, 0x16, 0x6e, 0x95, 0xc1, 0xdf, 0xaf, 0x51, 0x69, 0xe6, 0x40, 0x8b, 0x32, 0xbc, 0x28, 0x62, - 0x0b, 0x93, 0x4d, 0xe0, 0x28, 0x35, 0x59, 0x2a, 0xa4, 0xbf, 0x5a, 0x23, 0xdd, 0xec, 0xf3, 0xdc, - 0xcd, 0xbd, 0x84, 0x5e, 0x45, 0x5a, 0x22, 0x63, 0x85, 0x6c, 0x0a, 0xad, 0x94, 0x64, 0x2a, 0xc7, - 0x26, 0x16, 0xe7, 0x59, 0x09, 0xe0, 0x85, 0xa3, 0xfb, 0xb7, 0x0d, 0x2f, 0x7d, 0xf1, 0xf0, 0x3b, - 0xf4, 0xb4, 0xd9, 0xfd, 0x0c, 0x95, 0x12, 0x4b, 0x7c, 0x8e, 0xd0, 0x8f, 0xa1, 0xe5, 0xc9, 0x58, - 0x63, 0xac, 0xe9, 0xb2, 0xdd, 0xe9, 0xb0, 0x3c, 0xa3, 0xe4, 0xb9, 0xc8, 0x5c, 0xbe, 0x12, 0xe1, - 0x1a, 0x79, 0x11, 0xc0, 0x3e, 0x00, 0x30, 0x6d, 0x62, 0xa4, 0x60, 0x4a, 0x99, 0xee, 0x4e, 0xcf, - 0xc6, 0x95, 0xce, 0xe1, 0x52, 0xea, 0x0b, 0x5a, 0xf2, 0x8a, 0x27, 0x3b, 0x83, 0x23, 0x63, 0x2d, - 0x7c, 0xa7, 0x49, 0x62, 0x72, 0x8b, 0x0d, 0x0c, 0x9f, 0xf0, 0x1e, 0x07, 0xf1, 0x72, 0xe1, 0x3b, - 0x87, 0xb4, 0x57, 0x41, 0xdc, 0x3f, 0x1a, 0x70, 0x56, 0xaf, 0x89, 0x7d, 0x02, 0x60, 0x8a, 0xf4, - 0x20, 0xf1, 0x85, 0x46, 0xba, 0x63, 0x77, 0xda, 0xdf, 0xbf, 0xc9, 0x7c, 0xeb, 0x31, 0xb7, 0x78, - 0xc5, 0x9f, 0xdd, 0x83, 0x5b, 0x8f, 0xd6, 0x61, 0x58, 0x29, 0x6d, 0x9e, 0x8c, 0x3b, 0xfb, 0x14, - 0x97, 0xbb, 0x6e, 0x73, 0x8b, 0xef, 0x47, 0xb2, 0xcf, 0xa1, 0x57, 0x42, 0x59, 0x25, 0xf3, 0xdc, - 0x0c, 0x9f, 0xcd, 0x96, 0xf9, 0xcd, 0x2d, 0xfe, 0x9f, 0x58, 0x36, 0x83, 0x13, 0x4c, 0x53, 0x99, - 0x6e, 0xc9, 0x9a, 0x44, 0xf6, 0xe6, 0x3e, 0xd9, 0xac, 0xea, 0x34, 0xb7, 0xf8, 0x6e, 0xd4, 0xdd, - 0x16, 0x1c, 0xfe, 0x60, 0x52, 0xe5, 0xfe, 0x64, 0x43, 0x6f, 0x3f, 0x1f, 0xe6, 0xbd, 0x98, 0x7c, - 0x64, 0x8d, 0xd6, 0xe1, 0x99, 0xc1, 0x3e, 0x82, 0x56, 0x56, 0xc9, 0xf2, 0x05, 0x56, 0xab, 0x2b, - 0x9e, 0xdc, 0x4f, 0x11, 0xb3, 0x02, 0x7f, 0x1d, 0xe8, 0xd5, 0xc2, 0xe7, 0x85, 0x3f, 0x73, 0xe1, - 0x58, 0xc5, 0x22, 0x51, 0x2b, 0xa9, 0xbf, 0x14, 0x7a, 0xe5, 0x1c, 0x10, 0xef, 0x0e, 0xe6, 0xfe, - 0x6c, 0xc3, 0xed, 0xda, 0xb4, 0xbe, 0x18, 0x39, 0xbf, 0xd8, 0x45, 0x7b, 0xed, 0xd7, 0xe5, 0xc5, - 0xe8, 0x79, 0x17, 0x5e, 0xae, 0xa9, 0xac, 0xd1, 0x42, 0x95, 0xcd, 0x5f, 0x72, 0x66, 0xb8, 0xbf, - 0xdb, 0xd0, 0xa5, 0x6e, 0xc8, 0xdf, 0x58, 0x1f, 0xda, 0x81, 0x8f, 0xb1, 0x0e, 0xf4, 0x26, 0x9f, - 0xaa, 0x5b, 0x9b, 0xbd, 0x01, 0x1d, 0x1d, 0x44, 0xa8, 0xb4, 0x88, 0x12, 0x6a, 0xf4, 0x03, 0x5e, - 0x02, 0x66, 0x97, 0x86, 0xc3, 0xfd, 0x4d, 0x92, 0x35, 0x6e, 0x87, 0x97, 0x00, 0x7b, 0x1b, 0x4e, - 0x53, 0x4c, 0xc2, 0xc0, 0x13, 0x3a, 0x90, 0xf1, 0x3d, 0xdc, 0x50, 0x3b, 0x36, 0xf9, 0x1e, 0x6a, - 0x26, 0xa8, 0x42, 0xcc, 0x5e, 0xf1, 0x31, 0xa7, 0xf5, 0x3b, 0x7d, 0x68, 0xcf, 0xd2, 0xf4, 0x42, - 0xfa, 0xa8, 0xd8, 0x29, 0xc0, 0x83, 0x18, 0x7f, 0x4c, 0xd0, 0xd3, 0xe8, 0xf7, 0xac, 0xe9, 0x6f, - 0x36, 0x1c, 0x92, 0x7e, 0xf6, 0x29, 0xb4, 0x8b, 0xe1, 0xc6, 0x5e, 0xab, 0x1b, 0x78, 0xd4, 0x22, - 0xfd, 0x7e, 0xed, 0x2c, 0xcc, 0x52, 0x74, 0x09, 0x47, 0x57, 0x3a, 0x45, 0x11, 0xb1, 0xd7, 0xeb, - 0xa6, 0x59, 0x3e, 0x15, 0xfb, 0xcf, 0xdb, 0x1c, 0xd9, 0xef, 0xd9, 0x77, 0xcf, 0xff, 0xbc, 0x1e, - 0xd8, 0x4f, 0xaf, 0x07, 0xf6, 0x3f, 0xd7, 0x03, 0xfb, 0xd7, 0x9b, 0x81, 0xf5, 0xf4, 0x66, 0x60, - 0xfd, 0x75, 0x33, 0xb0, 0xbe, 0x79, 0xeb, 0x7f, 0xff, 0x82, 0x1f, 0x1e, 0xd1, 0xe7, 0xfd, 0x7f, - 0x03, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x1f, 0x02, 0x55, 0xae, 0x07, 0x00, 0x00, + // 793 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x55, 0xcd, 0x8e, 0x1b, 0x45, + 0x10, 0x9e, 0xf1, 0x7a, 0xd7, 0x76, 0xed, 0xae, 0x63, 0x1a, 0x12, 0x06, 0x03, 0x8e, 0x99, 0x03, + 0xb2, 0x40, 0x5a, 0x23, 0x73, 0x01, 0x16, 0x09, 0x91, 0x95, 0x57, 0xb6, 0x22, 0x7e, 0xd4, 0x9b, + 0x80, 0x84, 0xb8, 0x74, 0x66, 0x2a, 0xf6, 0x90, 0x99, 0xe9, 0xa1, 0xbb, 0x4d, 0xf0, 0x13, 0x70, + 0x01, 0x09, 0xf1, 0x06, 0x3c, 0x0b, 0x17, 0x8e, 0x39, 0x72, 0x44, 0xde, 0x17, 0x41, 0x5d, 0xe3, + 0xf1, 0xd8, 0x66, 0x92, 0x1c, 0xf7, 0xe2, 0xe9, 0xaa, 0xfe, 0xbe, 0xea, 0xaf, 0xab, 0xaa, 0xcb, + 0xf0, 0x51, 0x20, 0x93, 0x44, 0xa6, 0xc3, 0xfc, 0xa3, 0x33, 0x11, 0xe0, 0x90, 0x7e, 0xf5, 0x32, + 0x0d, 0x32, 0x25, 0x8d, 0x1c, 0xd2, 0xaf, 0x2e, 0xbd, 0x67, 0xe4, 0x60, 0x4d, 0x91, 0x2e, 0xaf, + 0xac, 0xaf, 0x3b, 0xcc, 0x9e, 0xcc, 0x86, 0x22, 0x88, 0x87, 0x46, 0x21, 0x06, 0x73, 0x91, 0xce, + 0x70, 0x87, 0x59, 0xba, 0x73, 0xaa, 0x3f, 0x85, 0xd3, 0x09, 0x8a, 0xf0, 0x6a, 0x99, 0x06, 0xdc, + 0xba, 0x19, 0x83, 0xfa, 0x63, 0x25, 0x13, 0xcf, 0xed, 0xbb, 0x83, 0x3a, 0xa7, 0x35, 0x6b, 0x43, + 0xcd, 0x48, 0xaf, 0x46, 0x9e, 0x9a, 0x91, 0xec, 0x35, 0x38, 0x8c, 0xa3, 0x24, 0x32, 0xde, 0x41, + 0xdf, 0x1d, 0x9c, 0xf2, 0xdc, 0xf0, 0x9f, 0x42, 0x7b, 0x13, 0x0a, 0xf5, 0x22, 0x36, 0x36, 0xd6, + 0x5c, 0xe8, 0x39, 0xc5, 0x3a, 0xe1, 0xb4, 0x66, 0xe7, 0xd0, 0xc4, 0x18, 0x13, 0x4c, 0x8d, 0xf6, + 0x6a, 0xfd, 0x83, 0xc1, 0xf1, 0xe8, 0xee, 0x59, 0x21, 0xff, 0x6c, 0x97, 0x3f, 0xce, 0x71, 0x7c, + 0x43, 0xb0, 0x07, 0x07, 0x72, 0x91, 0x6e, 0x0e, 0x26, 0xc3, 0x3f, 0x87, 0xdb, 0x95, 0x44, 0xab, + 0x3b, 0x0a, 0xe9, 0xf4, 0x16, 0xaf, 0x45, 0x21, 0xe9, 0x41, 0x11, 0xd2, 0x4d, 0x5a, 0x9c, 0xd6, + 0xfe, 0xf7, 0x70, 0xab, 0x24, 0xff, 0xb8, 0x40, 0x6d, 0x98, 0x07, 0x0d, 0xca, 0xf0, 0xb4, 0xe0, + 0x16, 0x26, 0x1b, 0xc2, 0x91, 0xb2, 0x59, 0x2a, 0xa4, 0xbf, 0x5e, 0x21, 0xdd, 0xee, 0xf3, 0x35, + 0xcc, 0xbf, 0x84, 0xce, 0x96, 0xb4, 0x4c, 0xa6, 0x1a, 0xd9, 0x08, 0x1a, 0x8a, 0x64, 0x6a, 0xcf, + 0xa5, 0x28, 0xde, 0xf3, 0x12, 0xc0, 0x0b, 0xa0, 0xbf, 0x72, 0xe1, 0x95, 0xaf, 0x1e, 0xfd, 0x80, + 0x81, 0xb1, 0xbb, 0x5f, 0xa0, 0xd6, 0x62, 0x86, 0x2f, 0x10, 0xfa, 0x09, 0x34, 0x02, 0x99, 0x1a, + 0x4c, 0x0d, 0x5d, 0xf6, 0x78, 0xd4, 0x2f, 0xcf, 0x28, 0xe3, 0x5c, 0xe4, 0x90, 0x6f, 0x44, 0xbc, + 0x40, 0x5e, 0x10, 0xd8, 0x67, 0x00, 0x4a, 0x4a, 0x73, 0x41, 0x6d, 0x42, 0x99, 0xb6, 0x35, 0xda, + 0xea, 0x1c, 0x2e, 0x9e, 0x3e, 0x50, 0x88, 0x39, 0xe0, 0xdb, 0xc8, 0xcc, 0xa7, 0x21, 0xdf, 0xa2, + 0xb0, 0x3b, 0x70, 0x64, 0xd1, 0xd3, 0xd0, 0xab, 0x93, 0xaa, 0xb5, 0xc5, 0x7a, 0x00, 0x46, 0x89, + 0xe0, 0x49, 0x94, 0xce, 0xa6, 0xa1, 0x77, 0x48, 0x7b, 0x5b, 0x1e, 0xff, 0xaf, 0x1a, 0xdc, 0xa9, + 0x16, 0xc7, 0x3e, 0x05, 0xb0, 0xd5, 0x7a, 0x98, 0x85, 0xc2, 0x20, 0x5d, 0xf6, 0x78, 0xd4, 0xdd, + 0xbf, 0xd2, 0x64, 0x83, 0x98, 0x38, 0x7c, 0x0b, 0xcf, 0xee, 0xc3, 0xad, 0xc7, 0x8b, 0x38, 0xde, + 0xaa, 0xf1, 0x3a, 0x2b, 0x77, 0xf7, 0x43, 0x5c, 0xee, 0xc2, 0x26, 0x0e, 0xdf, 0x67, 0xb2, 0x2f, + 0xa1, 0x53, 0xba, 0xf2, 0x92, 0xae, 0x93, 0xd4, 0x7f, 0x7e, 0xb4, 0x1c, 0x37, 0x71, 0xf8, 0xff, + 0xb8, 0x6c, 0x0c, 0xa7, 0xa8, 0x94, 0x54, 0x9b, 0x60, 0x75, 0x0a, 0xf6, 0xf6, 0x7e, 0xb0, 0xf1, + 0x36, 0x68, 0xe2, 0xf0, 0x5d, 0xd6, 0xbd, 0x06, 0x1c, 0xfe, 0x64, 0x53, 0xe5, 0xff, 0xe2, 0x42, + 0x67, 0x3f, 0x1f, 0xf6, 0xe1, 0xd8, 0x7c, 0xe4, 0x1d, 0xd7, 0xe2, 0xb9, 0xc1, 0x3e, 0x86, 0x46, + 0x5e, 0xd2, 0xf2, 0x29, 0xbe, 0xa4, 0xcc, 0x05, 0x9e, 0xf9, 0x70, 0xa2, 0x53, 0x91, 0xe9, 0xb9, + 0x34, 0x5f, 0x0b, 0x33, 0xf7, 0x0e, 0x28, 0xee, 0x8e, 0xcf, 0xff, 0xd5, 0x85, 0xdb, 0x95, 0x69, + 0xbd, 0x19, 0x39, 0xbf, 0xb9, 0x45, 0x7b, 0xed, 0xd7, 0xe5, 0x66, 0xf4, 0xbc, 0x0f, 0xaf, 0x56, + 0x54, 0xd6, 0x6a, 0xa1, 0xca, 0xae, 0x9f, 0x74, 0x6e, 0xf8, 0x7f, 0xba, 0x70, 0x4c, 0xdd, 0x60, + 0x8b, 0x8a, 0x8a, 0x75, 0xa1, 0x19, 0x85, 0x98, 0x9a, 0xc8, 0x2c, 0xd7, 0xe3, 0x75, 0x63, 0xb3, + 0xb7, 0xa0, 0x65, 0xa2, 0x04, 0xb5, 0x11, 0x49, 0x46, 0x8d, 0x7e, 0xc0, 0x4b, 0x87, 0xdd, 0xa5, + 0x29, 0xf1, 0x60, 0x99, 0xe5, 0x8d, 0xdb, 0xe2, 0xa5, 0x83, 0xbd, 0x0b, 0x6d, 0x85, 0x59, 0x1c, + 0x05, 0xc2, 0x44, 0x32, 0xbd, 0x8f, 0x4b, 0x6a, 0xc7, 0x3a, 0xdf, 0xf3, 0xda, 0x51, 0xaa, 0x11, + 0xf3, 0x57, 0x7c, 0xc2, 0x69, 0xfd, 0x5e, 0x17, 0x9a, 0x63, 0xa5, 0x2e, 0x64, 0x88, 0x9a, 0xb5, + 0x01, 0x1e, 0xa6, 0xf8, 0x73, 0x86, 0x81, 0xc1, 0xb0, 0xe3, 0x8c, 0xfe, 0x70, 0xe1, 0x90, 0xf4, + 0xb3, 0xcf, 0xa1, 0x59, 0x4c, 0x39, 0xf6, 0x46, 0xd5, 0xe4, 0xa3, 0x16, 0xe9, 0x76, 0x2b, 0x87, + 0x62, 0x9e, 0xa2, 0x4b, 0x38, 0xba, 0x32, 0x0a, 0x45, 0xc2, 0xde, 0xac, 0x1a, 0x6b, 0xeb, 0xf1, + 0xd8, 0x7d, 0xd1, 0xe6, 0xc0, 0xfd, 0xc0, 0xbd, 0x77, 0xfe, 0xf7, 0xaa, 0xe7, 0x3e, 0x5b, 0xf5, + 0xdc, 0x7f, 0x57, 0x3d, 0xf7, 0xf7, 0xeb, 0x9e, 0xf3, 0xec, 0xba, 0xe7, 0xfc, 0x73, 0xdd, 0x73, + 0xbe, 0x7b, 0xe7, 0xa5, 0xff, 0xc5, 0x8f, 0x8e, 0xe8, 0xf3, 0xe1, 0x7f, 0x01, 0x00, 0x00, 0xff, + 0xff, 0x33, 0xca, 0x5b, 0xe5, 0xb7, 0x07, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { @@ -1123,9 +1123,9 @@ func (m *ObjectSyncMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x22 } - if m.TreeHeader != nil { + if m.RootChange != nil { { - size, err := m.TreeHeader.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.RootChange.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -1638,8 +1638,8 @@ func (m *ObjectSyncMessage) Size() (n int) { l = m.Content.Size() n += 1 + l + sovSpacesync(uint64(l)) } - if m.TreeHeader != nil { - l = m.TreeHeader.Size() + if m.RootChange != nil { + l = m.RootChange.Size() n += 1 + l + sovSpacesync(uint64(l)) } l = len(m.TreeId) @@ -2497,7 +2497,7 @@ func (m *ObjectSyncMessage) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeHeader", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RootChange", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2524,10 +2524,10 @@ func (m *ObjectSyncMessage) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.TreeHeader == nil { - m.TreeHeader = &treechangeproto.RootChange{} + if m.RootChange == nil { + m.RootChange = &treechangeproto.RawTreeChangeWithId{} } - if err := m.TreeHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.RootChange.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index c7039a73..ecf43dfe 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -5,12 +5,16 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" "time" ) type SyncService interface { - NotifyHeadUpdate(ctx context.Context, treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) + NotifyHeadUpdate( + ctx context.Context, + treeId string, + root *treechangeproto.RawTreeChangeWithId, + update *spacesyncproto.ObjectHeadUpdate) (err error) StreamPool() StreamPool Init() @@ -72,7 +76,11 @@ func (s *syncService) Close() (err error) { return s.streamPool.Close() } -func (s *syncService) NotifyHeadUpdate(ctx context.Context, treeId string, header *aclpb.TreeHeader, update *spacesyncproto.ObjectHeadUpdate) (err error) { +func (s *syncService) NotifyHeadUpdate( + ctx context.Context, + treeId string, + header *treechangeproto.RawTreeChangeWithId, + update *spacesyncproto.ObjectHeadUpdate) (err error) { s.headNotifiable.UpdateHeads(treeId, update.Heads) return s.streamPool.BroadcastAsync(spacesyncproto.WrapHeadUpdate(update, header, treeId, "")) } diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 149c7c9b..68ea48f4 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -4,10 +4,10 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" ) type UpdateListener interface { @@ -91,7 +91,7 @@ func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeCo return } -func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*aclpb.RawTreeChangeWithId) (res tree.AddResult, err error) { +func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeproto.RawTreeChangeWithId) (res tree.AddResult, err error) { res, err = s.AddRawChanges(ctx, changes...) if err != nil { return diff --git a/pkg/acl/account/accountdata.go b/pkg/acl/account/accountdata.go index 4368a26c..3d3fdf28 100644 --- a/pkg/acl/account/accountdata.go +++ b/pkg/acl/account/accountdata.go @@ -1,7 +1,6 @@ package account import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" ) @@ -10,5 +9,4 @@ type AccountData struct { // TODO: create a convenient constructor for this Identity []byte // public key SignKey signingkey.PrivKey EncKey encryptionkey.PrivKey - Decoder keys.Decoder } diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index f940e4b4..46a48681 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -8,7 +8,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "sync" ) @@ -58,7 +57,7 @@ func BuildACLListWithIdentity(acc *account.AccountData, storage storage.ListStor return build(id, builder, newACLRecordBuilder(id, common.NewKeychain()), storage) } -func BuildACLList(decoder keys.Decoder, storage storage.ListStorage) (ACLList, error) { +func BuildACLList(storage storage.ListStorage) (ACLList, error) { id, err := storage.ID() if err != nil { return nil, err diff --git a/pkg/acl/list/list_test.go b/pkg/acl/list/list_test.go index 6c3c70d1..13019b21 100644 --- a/pkg/acl/list/list_test.go +++ b/pkg/acl/list/list_test.go @@ -3,7 +3,6 @@ package list import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" @@ -15,7 +14,7 @@ func TestAclList_ACLState_UserInviteAndJoin(t *testing.T) { keychain := st.(*acllistbuilder.ACLListStorageBuilder).GetKeychain() - aclList, err := BuildACLList(signingkey.NewEDPubKeyDecoder(), st) + aclList, err := BuildACLList(st) require.NoError(t, err, "building acl list should be without error") idA := keychain.GetIdentity("A") @@ -54,7 +53,7 @@ func TestAclList_ACLState_UserJoinAndRemove(t *testing.T) { keychain := st.(*acllistbuilder.ACLListStorageBuilder).GetKeychain() - aclList, err := BuildACLList(signingkey.NewEDPubKeyDecoder(), st) + aclList, err := BuildACLList(st) require.NoError(t, err, "building acl list should be without error") idA := keychain.GetIdentity("A") diff --git a/pkg/acl/testutils/acllistbuilder/keychain.go b/pkg/acl/testutils/acllistbuilder/keychain.go index e26f389b..c893a665 100644 --- a/pkg/acl/testutils/acllistbuilder/keychain.go +++ b/pkg/acl/testutils/acllistbuilder/keychain.go @@ -2,6 +2,7 @@ package acllistbuilder import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "hash/fnv" @@ -23,7 +24,6 @@ type YAMLKeychain struct { ReadKeysByHash map[uint64]*SymKey GeneratedIdentities map[string]string DerivedIdentity string - coder signingkey.PubKeyDecoder } func NewKeychain() *YAMLKeychain { @@ -34,7 +34,6 @@ func NewKeychain() *YAMLKeychain { GeneratedIdentities: map[string]string{}, ReadKeysByYAMLIdentity: map[string]*SymKey{}, ReadKeysByHash: map[uint64]*SymKey{}, - coder: signingkey.NewEd25519PubKeyDecoder(), } } @@ -67,12 +66,10 @@ func (k *YAMLKeychain) AddEncryptionKey(key *Key) { panic(err) } } else { - decoder := encryptionkey.NewRSAPrivKeyDecoder() - privKey, err := decoder.DecodeFromString(key.Value) + newPrivKey, err = keys.DecodeKeyFromString(key.Value, encryptionkey.NewEncryptionRsaPrivKeyFromBytes, nil) if err != nil { panic(err) } - newPrivKey = privKey.(encryptionkey.PrivKey) } k.EncryptionKeysByYAMLIdentity[key.Name] = newPrivKey } @@ -92,12 +89,10 @@ func (k *YAMLKeychain) AddSigningKey(key *Key) { panic(err) } } else { - decoder := signingkey.NewEDPrivKeyDecoder() - privKey, err := decoder.DecodeFromString(key.Value) + newPrivKey, err = keys.DecodeKeyFromString(key.Value, signingkey.NewSigningEd25519PrivKeyFromBytes, nil) if err != nil { panic(err) } - newPrivKey = privKey.(signingkey.PrivKey) pubKey = newPrivKey.GetPublic() } diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 115ce87e..bb342070 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -39,7 +39,7 @@ type ObjectTree interface { RWLocker ID() string - Header() *treechangeproto.RootChange + Header() *treechangeproto.RawTreeChangeWithId Heads() []string Root() *Change HasChange(string) bool @@ -68,7 +68,7 @@ type objectTree struct { aclList list.ACLList id string - root *treechangeproto.RootChange + root *treechangeproto.RawTreeChangeWithId tree *Tree keys map[uint64]*symmetric.Key @@ -132,7 +132,7 @@ func (ot *objectTree) ID() string { return ot.id } -func (ot *objectTree) Header() *treechangeproto.RootChange { +func (ot *objectTree) Header() *treechangeproto.RawTreeChangeWithId { return ot.root } diff --git a/pkg/acl/tree/objecttree_test.go b/pkg/acl/tree/objecttree_test.go index 832c15fa..fcfab7e7 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/pkg/acl/tree/objecttree_test.go @@ -2,13 +2,10 @@ package tree import ( "context" - "crypto/rand" - "encoding/hex" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" @@ -108,7 +105,7 @@ func prepareACLList(t *testing.T) list.ACLList { st, err := acllistbuilder.NewListStorageWithTestName("userjoinexample.yml") require.NoError(t, err, "building storage should not result in error") - aclList, err := list.BuildACLList(signingkey.NewEDPubKeyDecoder(), st) + aclList, err := list.BuildACLList(st) require.NoError(t, err, "building acl list should be without error") return aclList @@ -151,18 +148,6 @@ func prepareTreeContext(t *testing.T, aclList list.ACLList) testTreeContext { } } -func TestSameSignature(t *testing.T) { - privKey, _, err := signingkey.GenerateEd25519Key(rand.Reader) - require.NoError(t, err) - bytes := []byte("asefhiosahjfoiesjgioesajgihs") - for i := 0; i < 5; i++ { - signed, err := privKey.Sign(bytes) - require.NoError(t, err) - t.Log(hex.EncodeToString(signed)) - } - // kitten step voyage hand cover funny timber auction differ mushroom update pulp -} - func TestObjectTree(t *testing.T) { aclList := prepareACLList(t) diff --git a/pkg/acl/tree/objecttreefactory.go b/pkg/acl/tree/objecttreefactory.go index f6ab5f77..3a65fde8 100644 --- a/pkg/acl/tree/objecttreefactory.go +++ b/pkg/acl/tree/objecttreefactory.go @@ -7,7 +7,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" - "github.com/gogo/protobuf/proto" "go.uber.org/zap" ) @@ -114,19 +113,13 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { return nil, err } - rawRootWithId, err := objTree.treeStorage.Root() + objTree.root, err = objTree.treeStorage.Root() if err != nil { return nil, err } - rawRoot := &treechangeproto.RawTreeChange{} - err = proto.Unmarshal(rawRootWithId.RawChange, rawRoot) - if err != nil { - return nil, err - } - - objTree.root = &treechangeproto.RootChange{} - err = proto.Unmarshal(rawRoot.Payload, objTree.root) + // verifying root + _, err = objTree.changeBuilder.ConvertFromRaw(objTree.root, true) if err != nil { return nil, err } diff --git a/service/node/service.go b/service/node/service.go index 8b86fa9f..fd1fe5b7 100644 --- a/service/node/service.go +++ b/service/node/service.go @@ -5,7 +5,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "go.uber.org/zap" @@ -83,9 +82,7 @@ func (s *service) Nodes() []*Node { func nodeFromConfigNode( n config.Node, - peerId string, - privateSigningDecoder keys.Decoder, - privateEncryptionDecoder keys.Decoder) (*Node, error) { + peerId string) (*Node, error) { decodedSigningKey, err := privateSigningDecoder.DecodeFromString(n.SigningKey) if err != nil { return nil, err diff --git a/util/keys/asymmetric/encryptionkey/rsa.go b/util/keys/asymmetric/encryptionkey/rsa.go index 4e70091a..6c733488 100644 --- a/util/keys/asymmetric/encryptionkey/rsa.go +++ b/util/keys/asymmetric/encryptionkey/rsa.go @@ -107,14 +107,6 @@ func NewEncryptionRsaPubKeyFromBytes(bytes []byte) (PubKey, error) { return &EncryptionRsaPubKey{pubKey: *pk}, nil } -func NewRSAPrivKeyDecoder() keys.Decoder { - return keys.NewKeyDecoder(NewEncryptionRsaPrivKeyFromBytes) -} - -func NewRSAPubKeyDecoder() keys.Decoder { - return keys.NewKeyDecoder(NewEncryptionRsaPubKeyFromBytes) -} - func keyEquals(k1, k2 keys.Key) bool { a, err := k1.Raw() if err != nil { diff --git a/util/keys/asymmetric/signingkey/ed25519.go b/util/keys/asymmetric/signingkey/ed25519.go index 90763e67..beb4b6ed 100644 --- a/util/keys/asymmetric/signingkey/ed25519.go +++ b/util/keys/asymmetric/signingkey/ed25519.go @@ -9,8 +9,6 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "io" - - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/strkey" ) // Ed25519PrivateKey is an ed25519 private key. @@ -147,43 +145,3 @@ func UnmarshalEd25519PrivateKey(data []byte) (PrivKey, error) { k: ed25519.PrivateKey(data), }, nil } - -// TODO: remove this one in favor of new one -type Ed25519SigningPubKeyDecoder struct{} - -func NewEd25519PubKeyDecoder() PubKeyDecoder { - return &Ed25519SigningPubKeyDecoder{} -} - -func (e *Ed25519SigningPubKeyDecoder) DecodeFromBytes(bytes []byte) (PubKey, error) { - return NewSigningEd25519PubKeyFromBytes(bytes) -} - -func (e *Ed25519SigningPubKeyDecoder) DecodeFromString(identity string) (PubKey, error) { - pubKeyRaw, err := strkey.Decode(0x5b, identity) - if err != nil { - return nil, err - } - - return e.DecodeFromBytes(pubKeyRaw) -} - -func (e *Ed25519SigningPubKeyDecoder) DecodeFromStringIntoBytes(identity string) ([]byte, error) { - return strkey.Decode(0x5b, identity) -} - -func (e *Ed25519SigningPubKeyDecoder) EncodeToString(pubkey PubKey) (string, error) { - raw, err := pubkey.Raw() - if err != nil { - return "", err - } - return strkey.Encode(0x5b, raw) -} - -func NewEDPrivKeyDecoder() keys.Decoder { - return keys.NewKeyDecoder(NewSigningEd25519PrivKeyFromBytes) -} - -func NewEDPubKeyDecoder() keys.Decoder { - return keys.NewKeyDecoder(NewSigningEd25519PubKeyFromBytes) -} diff --git a/util/keys/asymmetric/signingkey/signingkey.go b/util/keys/asymmetric/signingkey/signingkey.go index 30299eb4..07576a67 100644 --- a/util/keys/asymmetric/signingkey/signingkey.go +++ b/util/keys/asymmetric/signingkey/signingkey.go @@ -15,10 +15,3 @@ type PubKey interface { Verify(data []byte, sig []byte) (bool, error) } - -type PubKeyDecoder interface { - DecodeFromBytes(bytes []byte) (PubKey, error) - DecodeFromString(identity string) (PubKey, error) - DecodeFromStringIntoBytes(identity string) ([]byte, error) - EncodeToString(pubkey PubKey) (string, error) -} diff --git a/util/keys/decode.go b/util/keys/decode.go new file mode 100644 index 00000000..c08e7c41 --- /dev/null +++ b/util/keys/decode.go @@ -0,0 +1,30 @@ +package keys + +import ( + "encoding/base64" +) + +func EncodeKeyToString[T Key](key T) (str string, err error) { + raw, err := key.Raw() + if err != nil { + return + } + str = EncodeBytesToString(raw) + return +} + +func EncodeBytesToString(bytes []byte) string { + return base64.StdEncoding.EncodeToString(bytes) +} + +func DecodeKeyFromString[T Key](str string, construct func([]byte) (T, error), def T) (T, error) { + dec, err := DecodeBytesFromString(str) + if err != nil { + return def, err + } + return construct(dec) +} + +func DecodeBytesFromString(str string) (bytes []byte, err error) { + return base64.StdEncoding.DecodeString(str) +} diff --git a/util/keys/decoder.go b/util/keys/decoder.go deleted file mode 100644 index 0b194794..00000000 --- a/util/keys/decoder.go +++ /dev/null @@ -1,38 +0,0 @@ -package keys - -import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/strkey" - -type keyDecoder[T Key] struct { - create func([]byte) (T, error) -} - -func NewKeyDecoder[T Key](create func(bytes []byte) (T, error)) Decoder { - return &keyDecoder[T]{ - create: create, - } -} - -func (e *keyDecoder[T]) DecodeFromBytes(bytes []byte) (Key, error) { - return e.create(bytes) -} - -func (e *keyDecoder[T]) DecodeFromString(identity string) (Key, error) { - pubKeyRaw, err := strkey.Decode(0x5b, identity) - if err != nil { - return nil, err - } - - return e.DecodeFromBytes(pubKeyRaw) -} - -func (e *keyDecoder[T]) DecodeFromStringIntoBytes(identity string) ([]byte, error) { - return strkey.Decode(0x5b, identity) -} - -func (e *keyDecoder[T]) EncodeToString(key Key) (string, error) { - raw, err := key.Raw() - if err != nil { - return "", err - } - return strkey.Encode(0x5b, raw) -} diff --git a/util/keys/key.go b/util/keys/key.go index 2170fac8..150d0897 100644 --- a/util/keys/key.go +++ b/util/keys/key.go @@ -8,13 +8,6 @@ type Key interface { Raw() ([]byte, error) } -type Decoder interface { - DecodeFromBytes(bytes []byte) (Key, error) - DecodeFromString(identity string) (Key, error) - DecodeFromStringIntoBytes(identity string) ([]byte, error) - EncodeToString(key Key) (string, error) -} - func KeyEquals(k1, k2 Key) bool { a, err := k1.Raw() if err != nil { From 227e7d47abf3f84d31c9d17cb48c47853dd4d9a0 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 26 Sep 2022 22:15:40 +0200 Subject: [PATCH 088/219] Few more fixes, remove node service --- common/commonspace/space.go | 8 +- .../commonspace/spacesyncproto/spacesync.go | 18 +-- common/commonspace/spacetree/spacetree.go | 38 ++++++ common/commonspace/syncservice/synchandler.go | 8 +- common/nodeconf/service.go | 62 +++++++++- service/node/service.go | 111 ------------------ 6 files changed, 112 insertions(+), 133 deletions(-) delete mode 100644 service/node/service.go diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 5fbc675b..1e319a44 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -99,10 +99,10 @@ func (s *space) BuildTree(ctx context.Context, id string, listener synctree.Upda fullSyncResp := resp.GetContent().GetFullSyncResponse() payload := treestorage.TreeStorageCreatePayload{ - TreeId: resp.TreeId, - Header: resp.TreeHeader, - Changes: fullSyncResp.Changes, - Heads: fullSyncResp.Heads, + TreeId: resp.TreeId, + RootRawChange: resp.RootChange, + Changes: fullSyncResp.Changes, + Heads: fullSyncResp.Heads, } // basically building tree with inmemory storage and validating that it was without errors diff --git a/common/commonspace/spacesyncproto/spacesync.go b/common/commonspace/spacesyncproto/spacesync.go index 6ac07962..2e22737a 100644 --- a/common/commonspace/spacesyncproto/spacesync.go +++ b/common/commonspace/spacesyncproto/spacesync.go @@ -1,45 +1,45 @@ package spacesyncproto -import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" +import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" type SpaceStream = DRPCSpace_StreamStream -func WrapHeadUpdate(update *ObjectHeadUpdate, header *aclpb.TreeHeader, treeId, trackingId string) *ObjectSyncMessage { +func WrapHeadUpdate(update *ObjectHeadUpdate, rootChange *treechangeproto.RawTreeChangeWithId, treeId, trackingId string) *ObjectSyncMessage { return &ObjectSyncMessage{ Content: &ObjectSyncContentValue{ Value: &ObjectSyncContentValue_HeadUpdate{HeadUpdate: update}, }, - TreeHeader: header, + RootChange: rootChange, TreeId: treeId, } } -func WrapFullRequest(request *ObjectFullSyncRequest, header *aclpb.TreeHeader, treeId, trackingId string) *ObjectSyncMessage { +func WrapFullRequest(request *ObjectFullSyncRequest, rootChange *treechangeproto.RawTreeChangeWithId, treeId, trackingId string) *ObjectSyncMessage { return &ObjectSyncMessage{ Content: &ObjectSyncContentValue{ Value: &ObjectSyncContentValue_FullSyncRequest{FullSyncRequest: request}, }, - TreeHeader: header, + RootChange: rootChange, TreeId: treeId, } } -func WrapFullResponse(response *ObjectFullSyncResponse, header *aclpb.TreeHeader, treeId, trackingId string) *ObjectSyncMessage { +func WrapFullResponse(response *ObjectFullSyncResponse, rootChange *treechangeproto.RawTreeChangeWithId, treeId, trackingId string) *ObjectSyncMessage { return &ObjectSyncMessage{ Content: &ObjectSyncContentValue{ Value: &ObjectSyncContentValue_FullSyncResponse{FullSyncResponse: response}, }, - TreeHeader: header, + RootChange: rootChange, TreeId: treeId, } } -func WrapError(err error, header *aclpb.TreeHeader, treeId, trackingId string) *ObjectSyncMessage { +func WrapError(err error, rootChange *treechangeproto.RawTreeChangeWithId, treeId, trackingId string) *ObjectSyncMessage { return &ObjectSyncMessage{ Content: &ObjectSyncContentValue{ Value: &ObjectSyncContentValue_ErrorResponse{ErrorResponse: &ObjectErrorResponse{Error: err.Error()}}, }, - TreeHeader: header, + RootChange: rootChange, TreeId: treeId, } } diff --git a/common/commonspace/spacetree/spacetree.go b/common/commonspace/spacetree/spacetree.go index 9cb4ff16..a8eab744 100644 --- a/common/commonspace/spacetree/spacetree.go +++ b/common/commonspace/spacetree/spacetree.go @@ -1 +1,39 @@ package spacetree + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" +) + +type SpaceTree interface { + cache.TreeContainer + ID() string + GetObjectIds() []string + Sync() +} + +type spaceTree struct{} + +func (s *spaceTree) Tree() tree.ObjectTree { + //TODO implement me + panic("implement me") +} + +func (s *spaceTree) ID() string { + //TODO implement me + panic("implement me") +} + +func (s *spaceTree) GetObjectIds() []string { + //TODO implement me + panic("implement me") +} + +func (s *spaceTree) Sync() { + //TODO implement me + panic("implement me") +} + +func NewSpaceTree(id string) (SpaceTree, error) { + return &spaceTree{}, nil +} diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index 0d3be042..c8470de5 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -4,8 +4,8 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" ) @@ -80,7 +80,7 @@ func (s *syncHandler) HandleHeadUpdate( if fullRequest != nil { return s.syncClient.SendAsync(senderId, - spacesyncproto.WrapFullRequest(fullRequest, msg.TreeHeader, msg.TreeId, msg.TrackingId)) + spacesyncproto.WrapFullRequest(fullRequest, msg.RootChange, msg.TreeId, msg.TrackingId)) } return } @@ -92,7 +92,7 @@ func (s *syncHandler) HandleFullSyncRequest( msg *spacesyncproto.ObjectSyncMessage) (err error) { var ( fullResponse *spacesyncproto.ObjectFullSyncResponse - header = msg.TreeHeader + header = msg.RootChange ) defer func() { if err != nil { @@ -167,7 +167,7 @@ func (s *syncHandler) prepareFullSyncRequest( SnapshotPath: t.SnapshotPath(), } if len(update.Changes) != 0 { - var changesAfterSnapshot []*aclpb.RawTreeChangeWithId + var changesAfterSnapshot []*treechangeproto.RawTreeChangeWithId changesAfterSnapshot, err = t.ChangesAfterCommonSnapshot(update.SnapshotPath, update.Heads) if err != nil { return diff --git a/common/nodeconf/service.go b/common/nodeconf/service.go index 870223cb..a70fe4a1 100644 --- a/common/nodeconf/service.go +++ b/common/nodeconf/service.go @@ -5,7 +5,9 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-chash" ) @@ -31,11 +33,26 @@ type service struct { last Configuration } +type Node struct { + Address string + PeerId string + SigningKey signingkey.PubKey + EncryptionKey encryptionkey.PubKey +} + +func (n *Node) Id() string { + return n.PeerId +} + +func (n *Node) Capacity() float64 { + return 1 +} + func (s *service) Init(a *app.App) (err error) { conf := a.MustComponent(config.CName).(*config.Config) s.accountId = conf.Account.PeerId s.pool = a.MustComponent(pool.CName).(pool.Pool) - configNodes := a.MustComponent(node.CName).(node.Service).Nodes() + config := &configuration{ id: "config", accountId: s.accountId, @@ -47,9 +64,18 @@ func (s *service) Init(a *app.App) (err error) { }); err != nil { return } - members := make([]chash.Member, 0, len(configNodes)) - for _, n := range configNodes { - members = append(members, n) + members := make([]chash.Member, 0, len(conf.Nodes)-1) + for _, n := range conf.Nodes { + if n.PeerId == conf.Account.PeerId { + continue + } + var member *Node + member, err = nodeFromConfigNode(n) + if err != nil { + return + } + + members = append(members, member) } if err = config.chash.AddMembers(members...); err != nil { return @@ -70,3 +96,29 @@ func (s *service) GetById(id string) Configuration { //TODO implement me panic("implement me") } + +func nodeFromConfigNode( + n config.Node) (*Node, error) { + decodedSigningKey, err := keys.DecodeKeyFromString( + n.SigningKey, + signingkey.UnmarshalEd25519PrivateKey, + nil) + if err != nil { + return nil, err + } + + decodedEncryptionKey, err := keys.DecodeKeyFromString( + n.SigningKey, + encryptionkey.NewEncryptionRsaPrivKeyFromBytes, + nil) + if err != nil { + return nil, err + } + + return &Node{ + Address: n.Address, + PeerId: n.PeerId, + SigningKey: decodedSigningKey.GetPublic(), + EncryptionKey: decodedEncryptionKey.GetPublic(), + }, nil +} diff --git a/service/node/service.go b/service/node/service.go deleted file mode 100644 index fd1fe5b7..00000000 --- a/service/node/service.go +++ /dev/null @@ -1,111 +0,0 @@ -package node - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "go.uber.org/zap" -) - -const CName = "NodesService" - -var log = logger.NewNamed("nodesservice") - -type Node struct { - Address string - PeerId string - SigningKey signingkey.PubKey - EncryptionKey encryptionkey.PubKey - SigningKeyString string - EncryptionKeyString string -} - -func (n *Node) Id() string { - return n.PeerId -} - -func (n *Node) Capacity() float64 { - return 1 -} - -func New() app.Component { - return &service{} -} - -type Service interface { - Nodes() []*Node -} - -type service struct { - nodes []*Node -} - -func (s *service) Init(a *app.App) (err error) { - cfg := a.MustComponent(config.CName).(*config.Config) - signDecoder := signingkey.NewEDPrivKeyDecoder() - rsaDecoder := encryptionkey.NewRSAPrivKeyDecoder() - - var filteredNodes []*Node - for _, n := range cfg.Nodes { - if n.PeerId == cfg.Account.PeerId { - continue - } - node, err := nodeFromConfigNode(n, n.PeerId, signDecoder, rsaDecoder) - if err != nil { - return err - } - log.With(zap.String("node", node.PeerId)).Debug("adding peer to known nodes") - filteredNodes = append(filteredNodes, node) - } - s.nodes = filteredNodes - return nil -} - -func (s *service) Name() (name string) { - return CName -} - -func (s *service) Run(ctx context.Context) (err error) { - return nil -} - -func (s *service) Close(ctx context.Context) (err error) { - return nil -} - -func (s *service) Nodes() []*Node { - return s.nodes -} - -func nodeFromConfigNode( - n config.Node, - peerId string) (*Node, error) { - decodedSigningKey, err := privateSigningDecoder.DecodeFromString(n.SigningKey) - if err != nil { - return nil, err - } - - decodedEncryptionKey, err := privateEncryptionDecoder.DecodeFromString(n.EncryptionKey) - if err != nil { - return nil, err - } - - encKeyString, err := privateEncryptionDecoder.EncodeToString(decodedEncryptionKey.(encryptionkey.PrivKey).GetPublic()) - if err != nil { - return nil, err - } - - signKeyString, err := privateSigningDecoder.EncodeToString(decodedSigningKey.(signingkey.PrivKey).GetPublic()) - - return &Node{ - Address: n.Address, - PeerId: peerId, - SigningKey: decodedSigningKey.(signingkey.PrivKey).GetPublic(), - EncryptionKey: decodedEncryptionKey.(encryptionkey.PrivKey).GetPublic(), - SigningKeyString: signKeyString, - EncryptionKeyString: encKeyString, - }, nil -} From 0b97aaa302ad51cc5cd93d5b0f18e1f0d9a0849f Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 26 Sep 2022 22:20:08 +0200 Subject: [PATCH 089/219] Remove unneeded files --- service/api/service.go | 137 --- service/document/service.go | 219 ----- service/storage/service.go | 71 -- service/treecache/service.go | 127 --- syncproto/helpers.go | 45 - syncproto/proto/sync.proto | 49 - syncproto/sync.pb.go | 1791 ---------------------------------- util/crc16/crc16.go | 122 --- util/strkey/strkey.go | 118 --- 9 files changed, 2679 deletions(-) delete mode 100644 service/api/service.go delete mode 100644 service/document/service.go delete mode 100644 service/storage/service.go delete mode 100644 service/treecache/service.go delete mode 100644 syncproto/helpers.go delete mode 100644 syncproto/proto/sync.proto delete mode 100644 syncproto/sync.pb.go delete mode 100644 util/crc16/crc16.go delete mode 100644 util/strkey/strkey.go diff --git a/service/api/service.go b/service/api/service.go deleted file mode 100644 index 1b9f9c17..00000000 --- a/service/api/service.go +++ /dev/null @@ -1,137 +0,0 @@ -package api - -import ( - "context" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/document" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" - "go.uber.org/zap" - "io" - "net/http" - "time" -) - -const CName = "APIService" - -var log = logger.NewNamed("api") - -func New() app.Component { - return &service{} -} - -type service struct { - treeCache treecache.Service - documentService document.Service - srv *http.Server - cfg *config.Config -} - -func (s *service) Init(a *app.App) (err error) { - s.treeCache = a.MustComponent(treecache.CName).(treecache.Service) - s.documentService = a.MustComponent(document.CName).(document.Service) - s.cfg = a.MustComponent(config.CName).(*config.Config) - return nil -} - -func (s *service) Name() (name string) { - return CName -} - -func (s *service) Run(ctx context.Context) (err error) { - defer func() { - if err == nil { - log.With(zap.String("port", s.cfg.APIServer.Port)).Info("api server started running") - } - }() - - s.srv = &http.Server{ - Addr: fmt.Sprintf(":%s", s.cfg.APIServer.Port), - } - mux := http.NewServeMux() - mux.HandleFunc("/treeDump", s.treeDump) - mux.HandleFunc("/createDocumentTree", s.createDocumentTree) - mux.HandleFunc("/appendDocument", s.appendDocument) - s.srv.Handler = mux - - go s.runServer() - return nil -} - -func (s *service) runServer() { - err := s.srv.ListenAndServe() - if err != nil { - log.With(zap.Error(err)).Error("could not run api server") - } -} - -func (s *service) Close(ctx context.Context) (err error) { - return s.srv.Shutdown(ctx) -} - -func (s *service) treeDump(w http.ResponseWriter, req *http.Request) { - var ( - query = req.URL.Query() - treeId = query.Get("treeId") - dump string - err error - ) - err = s.treeCache.Do(context.Background(), treeId, func(obj interface{}) error { - t := obj.(tree.ObjectTree) - dump, err = t.DebugDump() - if err != nil { - return err - } - return nil - }) - if err != nil { - sendText(w, http.StatusInternalServerError, err.Error()) - return - } - sendText(w, http.StatusOK, dump) -} - -func (s *service) createDocumentTree(w http.ResponseWriter, req *http.Request) { - var ( - query = req.URL.Query() - text = query.Get("text") - aclListId = query.Get("aclListId") - ) - timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30) - treeId, err := s.documentService.CreateDocumentTree(timeoutCtx, aclListId, text) - cancel() - if err != nil { - sendText(w, http.StatusInternalServerError, err.Error()) - return - } - sendText(w, http.StatusOK, treeId) -} - -func (s *service) appendDocument(w http.ResponseWriter, req *http.Request) { - var ( - query = req.URL.Query() - text = query.Get("text") - treeId = query.Get("treeId") - ) - timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30) - err := s.documentService.UpdateDocumentTree(timeoutCtx, treeId, text) - cancel() - if err != nil { - sendText(w, http.StatusInternalServerError, err.Error()) - return - } - sendText(w, http.StatusOK, fmt.Sprintf("updated document with id: %s with text: %s", treeId, text)) -} - -func sendText(r http.ResponseWriter, code int, body string) { - r.Header().Set("Content-Type", "text/plain") - r.WriteHeader(code) - - _, err := io.WriteString(r, fmt.Sprintf("%s\n", body)) - if err != nil { - log.Error("writing response failed", zap.Error(err)) - } -} diff --git a/service/document/service.go b/service/document/service.go deleted file mode 100644 index 6d1192c2..00000000 --- a/service/document/service.go +++ /dev/null @@ -1,219 +0,0 @@ -package document - -import ( - "context" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - testchanges "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/proto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto" - "github.com/gogo/protobuf/proto" - "go.uber.org/zap" -) - -var CName = "DocumentService" - -var log = logger.NewNamed("documentservice") - -type service struct { - messageService message.Service - treeCache treecache.Service - account account.Service - storage storage.Service - // to create new documents we need to know all nodes - nodes []*node.Node -} - -type Service interface { - UpdateDocumentTree(ctx context.Context, id, text string) error - CreateDocumentTree(ctx context.Context, aclTreeId string, text string) (id string, err error) -} - -func New() app.Component { - return &service{} -} - -func (s *service) Init(a *app.App) (err error) { - s.account = a.MustComponent(account.CName).(account.Service) - s.messageService = a.MustComponent(message.CName).(message.Service) - s.treeCache = a.MustComponent(treecache.CName).(treecache.Service) - s.storage = a.MustComponent(storage.CName).(storage.Service) - - nodesService := a.MustComponent(node.CName).(node.Service) - s.nodes = nodesService.Nodes() - - return nil -} - -func (s *service) Name() (name string) { - return CName -} - -func (s *service) Run(ctx context.Context) (err error) { - syncData := s.storage.ImportedACLSyncData() - - // we could have added a timeout or some additional logic, - // but let's just use the ACL id of the latest started node :-) - return s.messageService.SendToSpaceAsync("", syncproto.WrapACLList( - &syncproto.SyncACLList{Records: syncData.Records}, - syncData.Header, - syncData.Id, - )) -} - -func (s *service) Close(ctx context.Context) (err error) { - return nil -} - -func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err error) { - var ( - ch *aclpb.RawChange - header *aclpb.Header - snapshotPath []string - heads []string - ) - log.With(zap.String("id", id), zap.String("text", text)). - Debug("updating document") - - err = s.treeCache.Do(ctx, id, func(obj interface{}) error { - docTree, ok := obj.(tree.ObjectTree) - if !ok { - return fmt.Errorf("can't update acl trees with text") - } - - docTree.Lock() - defer docTree.Unlock() - err = s.treeCache.Do(ctx, docTree.Header().AclListId, func(obj interface{}) error { - aclTree := obj.(list.ACLList) - aclTree.RLock() - defer aclTree.RUnlock() - - content := createAppendTextChange(text) - signable := tree.SignableChangeContent{ - Proto: content, - Key: s.account.Account().SignKey, - Identity: s.account.Account().Identity, - IsSnapshot: false, - } - ch, err = docTree.AddContent(ctx, signable) - if err != nil { - return err - } - return nil - }) - if err != nil { - return err - } - - id = docTree.ID() - heads = docTree.Heads() - header = docTree.Header() - snapshotPath = docTree.SnapshotPath() - return nil - }) - if err != nil { - return err - } - log.With( - zap.String("id", id), - zap.Strings("heads", heads), - zap.String("header", header.String())). - Debug("document updated in the database") - - return s.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ - Heads: heads, - Changes: []*aclpb.RawChange{ch}, - SnapshotPath: snapshotPath, - }, header, id)) -} - -func (s *service) CreateDocumentTree(ctx context.Context, aclListId string, text string) (id string, err error) { - acc := s.account.Account() - var ( - ch *aclpb.RawChange - header *aclpb.Header - snapshotPath []string - heads []string - ) - err = s.treeCache.Do(ctx, aclListId, func(obj interface{}) error { - t := obj.(list.ACLList) - t.RLock() - defer t.RUnlock() - - content := createInitialTextChange(text) - doc, err := tree.CreateNewTreeStorage(acc, t, content, s.storage.CreateTreeStorage) - if err != nil { - return err - } - - id, err = doc.ID() - if err != nil { - return err - } - - header, err = doc.Header() - if err != nil { - return err - } - - heads = []string{header.FirstId} - snapshotPath = []string{header.FirstId} - ch, err = doc.GetRawChange(ctx, header.FirstId) - if err != nil { - return err - } - - return nil - }) - if err != nil { - return "", err - } - - log.With(zap.String("id", id), zap.String("text", text)). - Debug("creating document") - - err = s.messageService.SendToSpaceAsync("", syncproto.WrapHeadUpdate(&syncproto.SyncHeadUpdate{ - Heads: heads, - Changes: []*aclpb.RawChange{ch}, - SnapshotPath: snapshotPath, - }, header, id)) - if err != nil { - return "", err - } - return id, err -} - -func createInitialTextChange(text string) proto.Marshaler { - return &testchanges.PlainTextChangeData{ - Content: []*testchanges.PlainTextChangeContent{ - createAppendTextChangeContent(text), - }, - Snapshot: &testchanges.PlainTextChangeSnapshot{Text: text}, - } -} - -func createAppendTextChange(text string) proto.Marshaler { - return &testchanges.PlainTextChangeData{ - Content: []*testchanges.PlainTextChangeContent{ - createAppendTextChangeContent(text), - }, - } -} - -func createAppendTextChangeContent(text string) *testchanges.PlainTextChangeContent { - return &testchanges.PlainTextChangeContent{ - Value: &testchanges.PlainTextChangeContentValueOfTextAppend{ - TextAppend: &testchanges.PlainTextChangeTextAppend{ - Text: text, - }, - }, - } -} diff --git a/service/storage/service.go b/service/storage/service.go deleted file mode 100644 index 627627c0..00000000 --- a/service/storage/service.go +++ /dev/null @@ -1,71 +0,0 @@ -package storage - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" -) - -var CName = "storage" - -var log = logger.NewNamed("storage").Sugar() - -type ImportedACLSyncData struct { - Id string - Header *aclpb.Header - Records []*aclpb.RawACLRecord -} - -type Service interface { - storage.Provider - ImportedACLSyncData() ImportedACLSyncData -} - -func New() app.Component { - return &service{} -} - -type service struct { - storageProvider storage.Provider - importedACLSyncData ImportedACLSyncData -} - -func (s *service) Init(a *app.App) (err error) { - s.storageProvider = storage.NewInMemoryTreeStorageProvider() - // importing hardcoded acl list, check that the keys there are correct - return nil -} - -func (s *service) Storage(treeId string) (storage.Storage, error) { - return s.storageProvider.Storage(treeId) -} - -func (s *service) AddStorage(id string, st storage.Storage) error { - return s.storageProvider.AddStorage(id, st) -} - -func (s *service) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (storage.TreeStorage, error) { - return s.storageProvider.CreateTreeStorage(payload) -} - -func (s *service) CreateACLListStorage(payload storage.ACLListStorageCreatePayload) (storage.ListStorage, error) { - return s.storageProvider.CreateACLListStorage(payload) -} - -func (s *service) Name() (name string) { - return CName -} - -func (s *service) ImportedACLSyncData() ImportedACLSyncData { - return s.importedACLSyncData -} - -func (s *service) Run(ctx context.Context) (err error) { - return nil -} - -func (s service) Close(ctx context.Context) (err error) { - return nil -} diff --git a/service/treecache/service.go b/service/treecache/service.go deleted file mode 100644 index 90e91b98..00000000 --- a/service/treecache/service.go +++ /dev/null @@ -1,127 +0,0 @@ -package treecache - -import ( - "context" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto/aclpb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - aclstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage" - "go.uber.org/zap" -) - -const CName = "treecache" - -type ObjFunc = func(obj interface{}) error - -var log = logger.NewNamed("treecache") - -type Service interface { - Do(ctx context.Context, id string, f ObjFunc) error - Add(ctx context.Context, id string, payload any) error -} - -type service struct { - storage storage.Service - account account.Service - cache ocache.OCache -} - -func New() app.ComponentRunnable { - return &service{} -} - -func (s *service) Do(ctx context.Context, treeId string, f ObjFunc) error { - log. - With(zap.String("treeId", treeId)). - Debug("requesting tree from cache to perform operation") - - t, err := s.cache.Get(ctx, treeId) - defer s.cache.Release(treeId) - if err != nil { - return err - } - return f(t) -} - -func (s *service) Add(ctx context.Context, treeId string, payload any) error { - switch pl := payload.(type) { - case aclstorage.TreeStorageCreatePayload: - log. - With(zap.String("treeId", treeId), zap.Int("len(changes)", len(pl.Changes))). - Debug("adding Tree with changes") - - _, err := s.storage.CreateTreeStorage(payload.(aclstorage.TreeStorageCreatePayload)) - if err != nil { - return err - } - case aclstorage.ACLListStorageCreatePayload: - log. - With(zap.String("treeId", treeId), zap.Int("len(changes)", len(pl.Records))). - Debug("adding ACLList with records") - - _, err := s.storage.CreateACLListStorage(payload.(aclstorage.ACLListStorageCreatePayload)) - if err != nil { - return err - } - - } - return nil -} - -func (s *service) Init(a *app.App) (err error) { - s.cache = ocache.New(s.loadTree) - s.account = a.MustComponent(account.CName).(account.Service) - s.storage = a.MustComponent(storage.CName).(storage.Service) - // TODO: for test we should load some predefined keys - return nil -} - -func (s *service) Name() (name string) { - return CName -} - -func (s *service) Run(ctx context.Context) (err error) { - return nil -} - -func (s *service) Close(ctx context.Context) (err error) { - return s.cache.Close() -} - -func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error) { - t, err := s.storage.Storage(id) - if err != nil { - return nil, err - } - header, err := t.Header() - if err != nil { - return nil, err - } - - switch header.DocType { // handler - case aclpb.Header_ACL: - return list.BuildACLListWithIdentity(s.account.Account(), t.(aclstorage.ListStorage)) - case aclpb.Header_DocTree: - break - default: - return nil, fmt.Errorf("incorrect type") - } - log.Info("got header", zap.String("header", header.String())) - var objTree tree.ObjectTree - err = s.Do(ctx, header.AclListId, func(obj interface{}) error { - aclList := obj.(list.ACLList) - objTree, err = tree.BuildObjectTree(t.(aclstorage.TreeStorage), nil, aclList) - if err != nil { - return err - } - return nil - }) - - return objTree, err -} diff --git a/syncproto/helpers.go b/syncproto/helpers.go deleted file mode 100644 index fbbf11dc..00000000 --- a/syncproto/helpers.go +++ /dev/null @@ -1,45 +0,0 @@ -package syncproto - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" -) - -func WrapHeadUpdate(update *SyncHeadUpdate, header *aclpb.Header, treeId string) *Sync { - return &Sync{ - Message: &SyncContentValue{ - Value: &SyncContentValueValueOfHeadUpdate{HeadUpdate: update}, - }, - TreeHeader: header, - TreeId: treeId, - } -} - -func WrapFullRequest(request *SyncFullRequest, header *aclpb.Header, treeId string) *Sync { - return &Sync{ - Message: &SyncContentValue{ - Value: &SyncContentValueValueOfFullSyncRequest{FullSyncRequest: request}, - }, - TreeHeader: header, - TreeId: treeId, - } -} - -func WrapFullResponse(response *SyncFullResponse, header *aclpb.Header, treeId string) *Sync { - return &Sync{ - Message: &SyncContentValue{ - Value: &SyncContentValueValueOfFullSyncResponse{FullSyncResponse: response}, - }, - TreeHeader: header, - TreeId: treeId, - } -} - -func WrapACLList(aclList *SyncACLList, header *aclpb.Header, id string) *Sync { - return &Sync{ - Message: &SyncContentValue{ - Value: &SyncContentValueValueOfAclList{AclList: aclList}, - }, - TreeHeader: header, - TreeId: id, - } -} diff --git a/syncproto/proto/sync.proto b/syncproto/proto/sync.proto deleted file mode 100644 index d1c60d7d..00000000 --- a/syncproto/proto/sync.proto +++ /dev/null @@ -1,49 +0,0 @@ -syntax = "proto3"; -package anytype; -option go_package = "/syncproto"; - -import "pkg/acl/aclrecordproto/aclpb/protos/aclrecordproto.proto"; - -message Message { - Header header = 1; - bytes data = 2; -} - -message Header { - bytes traceId = 1; - uint64 requestId = 2; - uint64 replyId = 3; - MessageType type = 4; - string debugInfo = 5; -} - -enum MessageType { - MessageTypeSystem = 0; - MessageTypeSpace = 1; - MessageTypeSync = 2; -} - -message System { - Handshake handshake = 1; - Ping ping = 2; - Ack ack = 3; - - message Handshake { - string protocolVersion = 1; - } - message Ping { - uint64 unixTime = 1; - } - message Ack { - Error error = 2; - } - message Error { - Code code = 1; - string description = 2; - - enum Code { - UNKNOWN = 0; - UNSUPPORTED_PROTOCOL_VERSION = 10; - } - } -} diff --git a/syncproto/sync.pb.go b/syncproto/sync.pb.go deleted file mode 100644 index 20a189a1..00000000 --- a/syncproto/sync.pb.go +++ /dev/null @@ -1,1791 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: syncproto/proto/sync.proto - -package syncproto - -import ( - fmt "fmt" - _ "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type MessageType int32 - -const ( - MessageType_MessageTypeSystem MessageType = 0 - MessageType_MessageTypeSpace MessageType = 1 - MessageType_MessageTypeSync MessageType = 2 -) - -var MessageType_name = map[int32]string{ - 0: "MessageTypeSystem", - 1: "MessageTypeSpace", - 2: "MessageTypeSync", -} - -var MessageType_value = map[string]int32{ - "MessageTypeSystem": 0, - "MessageTypeSpace": 1, - "MessageTypeSync": 2, -} - -func (x MessageType) String() string { - return proto.EnumName(MessageType_name, int32(x)) -} - -func (MessageType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{0} -} - -type System_Error_Code int32 - -const ( - System_Error_UNKNOWN System_Error_Code = 0 - System_Error_UNSUPPORTED_PROTOCOL_VERSION System_Error_Code = 10 -) - -var System_Error_Code_name = map[int32]string{ - 0: "UNKNOWN", - 10: "UNSUPPORTED_PROTOCOL_VERSION", -} - -var System_Error_Code_value = map[string]int32{ - "UNKNOWN": 0, - "UNSUPPORTED_PROTOCOL_VERSION": 10, -} - -func (x System_Error_Code) String() string { - return proto.EnumName(System_Error_Code_name, int32(x)) -} - -func (System_Error_Code) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{2, 3, 0} -} - -type Message struct { - Header *Header `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` -} - -func (m *Message) Reset() { *m = Message{} } -func (m *Message) String() string { return proto.CompactTextString(m) } -func (*Message) ProtoMessage() {} -func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{0} -} -func (m *Message) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Message.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 *Message) XXX_Merge(src proto.Message) { - xxx_messageInfo_Message.Merge(m, src) -} -func (m *Message) XXX_Size() int { - return m.Size() -} -func (m *Message) XXX_DiscardUnknown() { - xxx_messageInfo_Message.DiscardUnknown(m) -} - -var xxx_messageInfo_Message proto.InternalMessageInfo - -func (m *Message) GetHeader() *Header { - if m != nil { - return m.Header - } - return nil -} - -func (m *Message) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -type Header struct { - TraceId []byte `protobuf:"bytes,1,opt,name=traceId,proto3" json:"traceId,omitempty"` - RequestId uint64 `protobuf:"varint,2,opt,name=requestId,proto3" json:"requestId,omitempty"` - ReplyId uint64 `protobuf:"varint,3,opt,name=replyId,proto3" json:"replyId,omitempty"` - Type MessageType `protobuf:"varint,4,opt,name=type,proto3,enum=anytype.MessageType" json:"type,omitempty"` - DebugInfo string `protobuf:"bytes,5,opt,name=debugInfo,proto3" json:"debugInfo,omitempty"` -} - -func (m *Header) Reset() { *m = Header{} } -func (m *Header) String() string { return proto.CompactTextString(m) } -func (*Header) ProtoMessage() {} -func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{1} -} -func (m *Header) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Header.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 *Header) XXX_Merge(src proto.Message) { - xxx_messageInfo_Header.Merge(m, src) -} -func (m *Header) XXX_Size() int { - return m.Size() -} -func (m *Header) XXX_DiscardUnknown() { - xxx_messageInfo_Header.DiscardUnknown(m) -} - -var xxx_messageInfo_Header proto.InternalMessageInfo - -func (m *Header) GetTraceId() []byte { - if m != nil { - return m.TraceId - } - return nil -} - -func (m *Header) GetRequestId() uint64 { - if m != nil { - return m.RequestId - } - return 0 -} - -func (m *Header) GetReplyId() uint64 { - if m != nil { - return m.ReplyId - } - return 0 -} - -func (m *Header) GetType() MessageType { - if m != nil { - return m.Type - } - return MessageType_MessageTypeSystem -} - -func (m *Header) GetDebugInfo() string { - if m != nil { - return m.DebugInfo - } - return "" -} - -type System struct { - Handshake *System_Handshake `protobuf:"bytes,1,opt,name=handshake,proto3" json:"handshake,omitempty"` - Ping *System_Ping `protobuf:"bytes,2,opt,name=ping,proto3" json:"ping,omitempty"` - Ack *System_Ack `protobuf:"bytes,3,opt,name=ack,proto3" json:"ack,omitempty"` -} - -func (m *System) Reset() { *m = System{} } -func (m *System) String() string { return proto.CompactTextString(m) } -func (*System) ProtoMessage() {} -func (*System) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{2} -} -func (m *System) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *System) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_System.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 *System) XXX_Merge(src proto.Message) { - xxx_messageInfo_System.Merge(m, src) -} -func (m *System) XXX_Size() int { - return m.Size() -} -func (m *System) XXX_DiscardUnknown() { - xxx_messageInfo_System.DiscardUnknown(m) -} - -var xxx_messageInfo_System proto.InternalMessageInfo - -func (m *System) GetHandshake() *System_Handshake { - if m != nil { - return m.Handshake - } - return nil -} - -func (m *System) GetPing() *System_Ping { - if m != nil { - return m.Ping - } - return nil -} - -func (m *System) GetAck() *System_Ack { - if m != nil { - return m.Ack - } - return nil -} - -type System_Handshake struct { - ProtocolVersion string `protobuf:"bytes,1,opt,name=protocolVersion,proto3" json:"protocolVersion,omitempty"` -} - -func (m *System_Handshake) Reset() { *m = System_Handshake{} } -func (m *System_Handshake) String() string { return proto.CompactTextString(m) } -func (*System_Handshake) ProtoMessage() {} -func (*System_Handshake) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{2, 0} -} -func (m *System_Handshake) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *System_Handshake) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_System_Handshake.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 *System_Handshake) XXX_Merge(src proto.Message) { - xxx_messageInfo_System_Handshake.Merge(m, src) -} -func (m *System_Handshake) XXX_Size() int { - return m.Size() -} -func (m *System_Handshake) XXX_DiscardUnknown() { - xxx_messageInfo_System_Handshake.DiscardUnknown(m) -} - -var xxx_messageInfo_System_Handshake proto.InternalMessageInfo - -func (m *System_Handshake) GetProtocolVersion() string { - if m != nil { - return m.ProtocolVersion - } - return "" -} - -type System_Ping struct { - UnixTime uint64 `protobuf:"varint,1,opt,name=unixTime,proto3" json:"unixTime,omitempty"` -} - -func (m *System_Ping) Reset() { *m = System_Ping{} } -func (m *System_Ping) String() string { return proto.CompactTextString(m) } -func (*System_Ping) ProtoMessage() {} -func (*System_Ping) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{2, 1} -} -func (m *System_Ping) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *System_Ping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_System_Ping.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 *System_Ping) XXX_Merge(src proto.Message) { - xxx_messageInfo_System_Ping.Merge(m, src) -} -func (m *System_Ping) XXX_Size() int { - return m.Size() -} -func (m *System_Ping) XXX_DiscardUnknown() { - xxx_messageInfo_System_Ping.DiscardUnknown(m) -} - -var xxx_messageInfo_System_Ping proto.InternalMessageInfo - -func (m *System_Ping) GetUnixTime() uint64 { - if m != nil { - return m.UnixTime - } - return 0 -} - -type System_Ack struct { - Error *System_Error `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` -} - -func (m *System_Ack) Reset() { *m = System_Ack{} } -func (m *System_Ack) String() string { return proto.CompactTextString(m) } -func (*System_Ack) ProtoMessage() {} -func (*System_Ack) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{2, 2} -} -func (m *System_Ack) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *System_Ack) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_System_Ack.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 *System_Ack) XXX_Merge(src proto.Message) { - xxx_messageInfo_System_Ack.Merge(m, src) -} -func (m *System_Ack) XXX_Size() int { - return m.Size() -} -func (m *System_Ack) XXX_DiscardUnknown() { - xxx_messageInfo_System_Ack.DiscardUnknown(m) -} - -var xxx_messageInfo_System_Ack proto.InternalMessageInfo - -func (m *System_Ack) GetError() *System_Error { - if m != nil { - return m.Error - } - return nil -} - -type System_Error struct { - Code System_Error_Code `protobuf:"varint,1,opt,name=code,proto3,enum=anytype.System_Error_Code" json:"code,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` -} - -func (m *System_Error) Reset() { *m = System_Error{} } -func (m *System_Error) String() string { return proto.CompactTextString(m) } -func (*System_Error) ProtoMessage() {} -func (*System_Error) Descriptor() ([]byte, []int) { - return fileDescriptor_4b28dfdd48a89166, []int{2, 3} -} -func (m *System_Error) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *System_Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_System_Error.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 *System_Error) XXX_Merge(src proto.Message) { - xxx_messageInfo_System_Error.Merge(m, src) -} -func (m *System_Error) XXX_Size() int { - return m.Size() -} -func (m *System_Error) XXX_DiscardUnknown() { - xxx_messageInfo_System_Error.DiscardUnknown(m) -} - -var xxx_messageInfo_System_Error proto.InternalMessageInfo - -func (m *System_Error) GetCode() System_Error_Code { - if m != nil { - return m.Code - } - return System_Error_UNKNOWN -} - -func (m *System_Error) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func init() { - proto.RegisterEnum("anytype.MessageType", MessageType_name, MessageType_value) - proto.RegisterEnum("anytype.System_Error_Code", System_Error_Code_name, System_Error_Code_value) - proto.RegisterType((*Message)(nil), "anytype.Message") - proto.RegisterType((*Header)(nil), "anytype.Header") - proto.RegisterType((*System)(nil), "anytype.System") - proto.RegisterType((*System_Handshake)(nil), "anytype.System.Handshake") - proto.RegisterType((*System_Ping)(nil), "anytype.System.Ping") - proto.RegisterType((*System_Ack)(nil), "anytype.System.Ack") - proto.RegisterType((*System_Error)(nil), "anytype.System.Error") -} - -func init() { proto.RegisterFile("syncproto/proto/sync.proto", fileDescriptor_4b28dfdd48a89166) } - -var fileDescriptor_4b28dfdd48a89166 = []byte{ - // 536 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x93, 0xd1, 0x8a, 0xd3, 0x40, - 0x14, 0x86, 0x3b, 0xdb, 0x6c, 0x6b, 0x4f, 0x96, 0xdd, 0x38, 0xbb, 0x0b, 0x31, 0x2c, 0x21, 0x14, - 0xc5, 0xa2, 0x90, 0x4a, 0x65, 0xf1, 0x7a, 0x5d, 0x2b, 0x2d, 0x6a, 0x53, 0xa6, 0xed, 0x0a, 0xde, - 0x2c, 0xd3, 0xc9, 0x98, 0x86, 0x76, 0x93, 0x98, 0xa4, 0x60, 0xde, 0x62, 0x9f, 0xc1, 0x67, 0xf0, - 0x21, 0xbc, 0xdc, 0x4b, 0x2f, 0xa5, 0x7d, 0x11, 0x99, 0x49, 0xda, 0xc6, 0xe2, 0x45, 0x92, 0x39, - 0xff, 0xf9, 0xff, 0x33, 0xdf, 0x30, 0x04, 0x8c, 0x24, 0x0b, 0x58, 0x14, 0x87, 0x69, 0xd8, 0xce, - 0xdf, 0xa2, 0xb6, 0xe5, 0x12, 0xd7, 0x69, 0x90, 0xa5, 0x59, 0xc4, 0x8d, 0x57, 0xd1, 0xdc, 0x6b, - 0x53, 0xb6, 0x10, 0x0f, 0x9b, 0xd1, 0xc0, 0xe3, 0x89, 0x58, 0x46, 0xd3, 0x3c, 0x93, 0x94, 0xf4, - 0x3c, 0xda, 0x7c, 0x0f, 0xf5, 0x4f, 0x3c, 0x49, 0xa8, 0xc7, 0xf1, 0x73, 0xa8, 0xcd, 0x38, 0x75, - 0x79, 0xac, 0x23, 0x0b, 0xb5, 0xd4, 0xce, 0x89, 0x5d, 0x8c, 0xb5, 0x7b, 0x52, 0x26, 0x45, 0x1b, - 0x63, 0x50, 0x5c, 0x9a, 0x52, 0xfd, 0xc0, 0x42, 0xad, 0x23, 0x22, 0xd7, 0xcd, 0x1f, 0x08, 0x6a, - 0xb9, 0x0d, 0xeb, 0x50, 0x4f, 0x63, 0xca, 0x78, 0xdf, 0x95, 0x83, 0x8e, 0xc8, 0xa6, 0xc4, 0x17, - 0xd0, 0x88, 0xf9, 0xb7, 0x25, 0x4f, 0xd2, 0xbe, 0x2b, 0xd3, 0x0a, 0xd9, 0x09, 0x22, 0x17, 0xf3, - 0x68, 0x91, 0xf5, 0x5d, 0xbd, 0x2a, 0x7b, 0x9b, 0x12, 0xb7, 0x40, 0x11, 0x1c, 0xba, 0x62, 0xa1, - 0xd6, 0x71, 0xe7, 0x6c, 0xcb, 0x55, 0x90, 0x8f, 0xb3, 0x88, 0x13, 0xe9, 0x10, 0x3b, 0xb8, 0x7c, - 0xba, 0xf4, 0xfa, 0xc1, 0xd7, 0x50, 0x3f, 0xb4, 0x50, 0xab, 0x41, 0x76, 0x42, 0xf3, 0x67, 0x15, - 0x6a, 0xa3, 0x2c, 0x49, 0xf9, 0x1d, 0x7e, 0x03, 0x8d, 0x19, 0x0d, 0xdc, 0x64, 0x46, 0xe7, 0xbc, - 0x38, 0xef, 0x93, 0xed, 0xdc, 0xdc, 0x63, 0xf7, 0x36, 0x06, 0xb2, 0xf3, 0x0a, 0x96, 0xc8, 0x0f, - 0x3c, 0x89, 0xaf, 0x96, 0x58, 0x8a, 0xcc, 0xd0, 0x0f, 0x3c, 0x22, 0x1d, 0xf8, 0x19, 0x54, 0x29, - 0x9b, 0xcb, 0xb3, 0xa8, 0x9d, 0xd3, 0x7d, 0xe3, 0x15, 0x9b, 0x13, 0xd1, 0x37, 0x2e, 0xa1, 0xd1, - 0x2b, 0x4d, 0x3f, 0x91, 0xf7, 0xc2, 0xc2, 0xc5, 0x0d, 0x8f, 0x13, 0x3f, 0x0c, 0x24, 0x5c, 0x83, - 0xec, 0xcb, 0x46, 0x13, 0x14, 0xb1, 0x17, 0x36, 0xe0, 0xd1, 0x32, 0xf0, 0xbf, 0x8f, 0xfd, 0xbb, - 0xfc, 0x1c, 0x0a, 0xd9, 0xd6, 0x46, 0x07, 0xaa, 0x57, 0x6c, 0x8e, 0x5f, 0xc2, 0x21, 0x8f, 0xe3, - 0x30, 0x2e, 0x98, 0xcf, 0xf7, 0x51, 0xba, 0xa2, 0x49, 0x72, 0x8f, 0x71, 0x8f, 0xe0, 0x50, 0x0a, - 0xd8, 0x06, 0x85, 0x85, 0x6e, 0x3e, 0xf5, 0xb8, 0x63, 0xfc, 0x37, 0x65, 0x5f, 0x87, 0x2e, 0x27, - 0xd2, 0x87, 0x2d, 0x50, 0x5d, 0x9e, 0xb0, 0xd8, 0x8f, 0x52, 0xc1, 0x7d, 0x20, 0xb9, 0xcb, 0x52, - 0xf3, 0x12, 0x14, 0xe1, 0xc7, 0x2a, 0xd4, 0x27, 0x83, 0x0f, 0x03, 0xe7, 0xf3, 0x40, 0xab, 0x60, - 0x0b, 0x2e, 0x26, 0x83, 0xd1, 0x64, 0x38, 0x74, 0xc8, 0xb8, 0xfb, 0xee, 0x76, 0x48, 0x9c, 0xb1, - 0x73, 0xed, 0x7c, 0xbc, 0xbd, 0xe9, 0x92, 0x51, 0xdf, 0x19, 0x68, 0xf0, 0xc2, 0x01, 0xb5, 0x74, - 0xd3, 0xf8, 0x1c, 0x1e, 0x97, 0xca, 0x9c, 0x46, 0xab, 0xe0, 0x33, 0xd0, 0xca, 0x72, 0x44, 0x19, - 0xd7, 0x10, 0x3e, 0x85, 0x93, 0x7f, 0xcc, 0x01, 0xd3, 0x0e, 0xde, 0x3e, 0xfd, 0xb5, 0x32, 0xd1, - 0xc3, 0xca, 0x44, 0x7f, 0x56, 0x26, 0xba, 0x5f, 0x9b, 0x95, 0x87, 0xb5, 0x59, 0xf9, 0xbd, 0x36, - 0x2b, 0x5f, 0xa0, 0xbd, 0xfd, 0xcd, 0xa6, 0x35, 0xf9, 0x79, 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff, - 0x5f, 0xee, 0x92, 0xca, 0x7a, 0x03, 0x00, 0x00, -} - -func (m *Message) 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 *Message) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Message) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Data) > 0 { - i -= len(m.Data) - copy(dAtA[i:], m.Data) - i = encodeVarintSync(dAtA, i, uint64(len(m.Data))) - i-- - dAtA[i] = 0x12 - } - if m.Header != nil { - { - size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Header) 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 *Header) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Header) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.DebugInfo) > 0 { - i -= len(m.DebugInfo) - copy(dAtA[i:], m.DebugInfo) - i = encodeVarintSync(dAtA, i, uint64(len(m.DebugInfo))) - i-- - dAtA[i] = 0x2a - } - if m.Type != 0 { - i = encodeVarintSync(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x20 - } - if m.ReplyId != 0 { - i = encodeVarintSync(dAtA, i, uint64(m.ReplyId)) - i-- - dAtA[i] = 0x18 - } - if m.RequestId != 0 { - i = encodeVarintSync(dAtA, i, uint64(m.RequestId)) - i-- - dAtA[i] = 0x10 - } - if len(m.TraceId) > 0 { - i -= len(m.TraceId) - copy(dAtA[i:], m.TraceId) - i = encodeVarintSync(dAtA, i, uint64(len(m.TraceId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *System) 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 *System) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *System) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Ack != nil { - { - size, err := m.Ack.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.Ping != nil { - { - size, err := m.Ping.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.Handshake != nil { - { - size, err := m.Handshake.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *System_Handshake) 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 *System_Handshake) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *System_Handshake) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ProtocolVersion) > 0 { - i -= len(m.ProtocolVersion) - copy(dAtA[i:], m.ProtocolVersion) - i = encodeVarintSync(dAtA, i, uint64(len(m.ProtocolVersion))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *System_Ping) 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 *System_Ping) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *System_Ping) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.UnixTime != 0 { - i = encodeVarintSync(dAtA, i, uint64(m.UnixTime)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *System_Ack) 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 *System_Ack) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *System_Ack) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Error != nil { - { - size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} - -func (m *System_Error) 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 *System_Error) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *System_Error) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Description) > 0 { - i -= len(m.Description) - copy(dAtA[i:], m.Description) - i = encodeVarintSync(dAtA, i, uint64(len(m.Description))) - i-- - dAtA[i] = 0x12 - } - if m.Code != 0 { - i = encodeVarintSync(dAtA, i, uint64(m.Code)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintSync(dAtA []byte, offset int, v uint64) int { - offset -= sovSync(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Message) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Header != nil { - l = m.Header.Size() - n += 1 + l + sovSync(uint64(l)) - } - l = len(m.Data) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } - return n -} - -func (m *Header) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.TraceId) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } - if m.RequestId != 0 { - n += 1 + sovSync(uint64(m.RequestId)) - } - if m.ReplyId != 0 { - n += 1 + sovSync(uint64(m.ReplyId)) - } - if m.Type != 0 { - n += 1 + sovSync(uint64(m.Type)) - } - l = len(m.DebugInfo) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } - return n -} - -func (m *System) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Handshake != nil { - l = m.Handshake.Size() - n += 1 + l + sovSync(uint64(l)) - } - if m.Ping != nil { - l = m.Ping.Size() - n += 1 + l + sovSync(uint64(l)) - } - if m.Ack != nil { - l = m.Ack.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} - -func (m *System_Handshake) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ProtocolVersion) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } - return n -} - -func (m *System_Ping) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.UnixTime != 0 { - n += 1 + sovSync(uint64(m.UnixTime)) - } - return n -} - -func (m *System_Ack) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Error != nil { - l = m.Error.Size() - n += 1 + l + sovSync(uint64(l)) - } - return n -} - -func (m *System_Error) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Code != 0 { - n += 1 + sovSync(uint64(m.Code)) - } - l = len(m.Description) - if l > 0 { - n += 1 + l + sovSync(uint64(l)) - } - return n -} - -func sovSync(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozSync(x uint64) (n int) { - return sovSync(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Message) 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 ErrIntOverflowSync - } - 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: Message: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Message: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Header == nil { - m.Header = &Header{} - } - if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) - if m.Data == nil { - m.Data = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Header) 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 ErrIntOverflowSync - } - 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: Header: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Header: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TraceId", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TraceId = append(m.TraceId[:0], dAtA[iNdEx:postIndex]...) - if m.TraceId == nil { - m.TraceId = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field RequestId", wireType) - } - m.RequestId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.RequestId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReplyId", wireType) - } - m.ReplyId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ReplyId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= MessageType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DebugInfo", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DebugInfo = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *System) 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 ErrIntOverflowSync - } - 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: System: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: System: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Handshake", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Handshake == nil { - m.Handshake = &System_Handshake{} - } - if err := m.Handshake.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Ping", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Ping == nil { - m.Ping = &System_Ping{} - } - if err := m.Ping.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Ack", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Ack == nil { - m.Ack = &System_Ack{} - } - if err := m.Ack.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *System_Handshake) 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 ErrIntOverflowSync - } - 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: Handshake: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Handshake: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProtocolVersion", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ProtocolVersion = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *System_Ping) 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 ErrIntOverflowSync - } - 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: Ping: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ping: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field UnixTime", wireType) - } - m.UnixTime = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.UnixTime |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *System_Ack) 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 ErrIntOverflowSync - } - 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: Ack: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ack: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Error == nil { - m.Error = &System_Error{} - } - if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *System_Error) 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 ErrIntOverflowSync - } - 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: Error: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) - } - m.Code = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Code |= System_Error_Code(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSync - } - 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 ErrInvalidLengthSync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Description = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipSync(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowSync - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowSync - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowSync - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthSync - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupSync - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthSync - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthSync = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowSync = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupSync = fmt.Errorf("proto: unexpected end of group") -) diff --git a/util/crc16/crc16.go b/util/crc16/crc16.go deleted file mode 100644 index 810f4bed..00000000 --- a/util/crc16/crc16.go +++ /dev/null @@ -1,122 +0,0 @@ -// Package crc16 is implementation according to CCITT standards. -// -// Note by @antirez: this is actually the XMODEM CRC 16 algorithm, using the -// following parameters: -// -// Name : "XMODEM", also known as "ZMODEM", "CRC-16/ACORN" -// Width : 16 bit -// Poly : 1021 (That is actually x^16 + x^12 + x^5 + 1) -// Initialization : 0000 -// Reflect Input byte : False -// Reflect Output CRC : False -// Xor constant to output CRC : 0000 -// Output for "123456789" : 31C3 -// -// ported from the c++ code in the stellar-core codebase -// (https://github.com/stellar/stellar-core). The code is licensed -// as: -/* - * Copyright 2001-2010 Georges Menie (www.menie.org) - * Copyright 2010-2012 Salvatore Sanfilippo (adapted to Redis coding style) - * Copyright 2015 Stellar Development Foundation (ported to go) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the University of California, Berkeley nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package crc16 - -import ( - "bytes" - "encoding/binary" - "fmt" -) - -// ErrInvalidChecksum is returned when Validate determines either the checksum -// or the payload has been corrupted -var ErrInvalidChecksum = fmt.Errorf("invalid checksum") - -var crc16tab = [256]uint16{ - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, - 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, - 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, - 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, - 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, - 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, - 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, - 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, - 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, - 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, - 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, - 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, - 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, - 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, - 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, - 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, - 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, - 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, - 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, - 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, - 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, - 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, - 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0, -} - -// Checksum returns the 2-byte checksum for the provided data -func Checksum(data []byte) []byte { - var crc uint16 - var out bytes.Buffer - for _, b := range data { - crc = ((crc << 8) & 0xffff) ^ crc16tab[((crc>>8)^uint16(b))&0x00FF] - } - - err := binary.Write(&out, binary.LittleEndian, crc) - if err != nil { - panic(err) - } - - return out.Bytes() -} - -// Validate returns an error if the provided checksum does not match -// the calculated checksum of the provided data -func Validate(data []byte, expected []byte) error { - - actual := Checksum(data) - - // validate the provided checksum against the calculated - if !bytes.Equal(actual, expected) { - return ErrInvalidChecksum - } - - return nil -} diff --git a/util/strkey/strkey.go b/util/strkey/strkey.go deleted file mode 100644 index 0e766f12..00000000 --- a/util/strkey/strkey.go +++ /dev/null @@ -1,118 +0,0 @@ -package strkey - -import ( - "bytes" - "encoding/binary" - "fmt" - - "github.com/mr-tron/base58/base58" - - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/crc16" -) - -// ErrInvalidVersionByte is returned when the version byte from a provided -// strkey-encoded string is not one of the valid values. -var ErrInvalidVersionByte = fmt.Errorf("invalid version byte") - -// VersionByte represents one of the possible prefix values for a StrKey base -// string--the string the when encoded using base58 yields a final StrKey. -type VersionByte byte - -// Decode decodes the provided StrKey into a raw value, checking the checksum -// and ensuring the expected VersionByte (the version parameter) is the value -// actually encoded into the provided src string. -func Decode(expected VersionByte, src string) ([]byte, error) { - raw, err := decodeString(src) - if err != nil { - return nil, err - } - - // decode into components - version := VersionByte(raw[0]) - vp := raw[0 : len(raw)-2] - payload := raw[1 : len(raw)-2] - checksum := raw[len(raw)-2:] - - // ensure version byte is expected - if version != expected { - return nil, ErrInvalidVersionByte - } - - // ensure checksum is valid - if err := crc16.Validate(vp, checksum); err != nil { - return nil, err - } - - // if we made it through the gaunlet, return the decoded value - return payload, nil -} - -// MustDecode is like Decode, but panics on error -func MustDecode(expected VersionByte, src string) []byte { - d, err := Decode(expected, src) - if err != nil { - panic(err) - } - return d -} - -// Encode encodes the provided data to a StrKey, using the provided version -// byte. -func Encode(version VersionByte, src []byte) (string, error) { - var raw bytes.Buffer - - // write version byte - if err := binary.Write(&raw, binary.LittleEndian, version); err != nil { - return "", err - } - - // write payload - if _, err := raw.Write(src); err != nil { - return "", err - } - - // calculate and write checksum - checksum := crc16.Checksum(raw.Bytes()) - if _, err := raw.Write(checksum); err != nil { - return "", err - } - - result := base58.FastBase58Encoding(raw.Bytes()) - return result, nil -} - -// MustEncode is like Encode, but panics on error -func MustEncode(version VersionByte, src []byte) string { - e, err := Encode(version, src) - if err != nil { - panic(err) - } - return e -} - -// Version extracts and returns the version byte from the provided source -// string. -func Version(src string) (VersionByte, error) { - raw, err := decodeString(src) - if err != nil { - return VersionByte(0), err - } - - return VersionByte(raw[0]), nil -} - -// decodeString decodes a base58 string into the raw bytes, and ensures it could -// potentially be strkey encoded (i.e. it has both a version byte and a -// checksum, neither of which are explicitly checked by this func) -func decodeString(src string) ([]byte, error) { - raw, err := base58.FastBase58Decoding(src) - if err != nil { - return nil, fmt.Errorf("base58 decode failed: %s", err) - } - - if len(raw) < 3 { - return nil, fmt.Errorf("encoded value is %d bytes; minimum valid length is 3", len(raw)) - } - - return raw, nil -} From 67f0b82ae4b25998787f3b9b1cd0d66c0e9ffab3 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 26 Sep 2022 22:26:42 +0200 Subject: [PATCH 090/219] Fix keys --- cmd/node/node.go | 2 -- common/net/secure/service.go | 5 ++--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/cmd/node/node.go b/cmd/node/node.go index 6f4cdf88..dd456aa2 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -15,7 +15,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace" - "github.com/anytypeio/go-anytype-infrastructure-experiments/service/node" "go.uber.org/zap" "net/http" _ "net/http/pprof" @@ -90,7 +89,6 @@ func main() { func Bootstrap(a *app.App) { a.Register(account.New()). - Register(node.New()). Register(nodeconf.New()). Register(secure.New()). Register(dialer.New()). diff --git a/common/net/secure/service.go b/common/net/secure/service.go index 40a30f8c..306e2d27 100644 --- a/common/net/secure/service.go +++ b/common/net/secure/service.go @@ -6,7 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/sec" @@ -37,8 +37,7 @@ type service struct { func (s *service) Init(a *app.App) (err error) { account := a.MustComponent(config.CName).(*config.Config).Account - decoder := signingkey.NewEDPrivKeyDecoder() - pkb, err := decoder.DecodeFromStringIntoBytes(account.SigningKey) + pkb, err := keys.DecodeBytesFromString(account.SigningKey) if err != nil { return } From c111257f63a6bf9e930112c50de51b13492abb50 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 27 Sep 2022 13:31:50 +0200 Subject: [PATCH 091/219] Change account logic and add space objects --- cmd/node/node.go | 2 +- common/account/service.go | 65 +---------------------- common/commonspace/service.go | 1 - common/commonspace/space.go | 19 +++---- common/commonspace/spacetree/spacetree.go | 39 -------------- common/commonspace/storage/storage.go | 5 +- common/net/secure/service.go | 24 --------- node/account/service.go | 63 ++++++++++++++++++++++ node/nodespace/nodecache/treecache.go | 10 +++- 9 files changed, 86 insertions(+), 142 deletions(-) delete mode 100644 common/commonspace/spacetree/spacetree.go create mode 100644 node/account/service.go diff --git a/cmd/node/node.go b/cmd/node/node.go index dd456aa2..3a0e0f64 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -6,7 +6,6 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" @@ -14,6 +13,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/node/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace" "go.uber.org/zap" "net/http" diff --git a/common/account/service.go b/common/account/service.go index 8cc55031..bdf6984d 100644 --- a/common/account/service.go +++ b/common/account/service.go @@ -2,73 +2,12 @@ package account import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" ) -const CName = "account" +const CName = "common.account" type Service interface { + app.Component Account() *account.AccountData } - -type service struct { - accountData *account.AccountData - peerId string -} - -func (s *service) Account() *account.AccountData { - return s.accountData -} - -type StaticAccount struct { - SigningKey string `yaml:"signingKey"` - EncryptionKey string `yaml:"encryptionKey"` -} - -func New() app.Component { - return &service{} -} - -func (s *service) Init(a *app.App) (err error) { - cfg := a.MustComponent(config.CName).(*config.Config) - // TODO: add deviceKey - acc := cfg.Account - - decodedEncryptionKey, err := keys.DecodeKeyFromString( - acc.EncryptionKey, - encryptionkey.NewEncryptionRsaPrivKeyFromBytes, - nil) - if err != nil { - return err - } - - decodedSigningKey, err := keys.DecodeKeyFromString( - acc.SigningKey, - signingkey.NewSigningEd25519PrivKeyFromBytes, - nil) - if err != nil { - return err - } - - identity, err := decodedSigningKey.GetPublic().Raw() - if err != nil { - return err - } - - s.accountData = &account.AccountData{ - Identity: identity, - SignKey: decodedSigningKey, - EncKey: decodedEncryptionKey, - } - s.peerId = acc.PeerId - - return nil -} - -func (s *service) Name() (name string) { - return CName -} diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 1ddf8dd0..ae1edd99 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -51,7 +51,6 @@ func (s *service) CreateSpace(ctx context.Context, id string, deps SpaceDeps) (S syncService := syncservice.NewSyncService(id, diffService, deps.Cache, lastConfiguration) sp := &space{ id: id, - conf: s.config, syncService: syncService, diffService: diffService, cache: deps.Cache, diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 1e319a44..07dac8f6 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -8,7 +8,6 @@ import ( "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/synctree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" @@ -29,9 +28,8 @@ type Space interface { } type space struct { - id string - conf config.Space - mu sync.RWMutex + id string + mu sync.RWMutex rpc *rpcHandler @@ -46,9 +44,13 @@ func (s *space) Id() string { return s.id } -func (s *space) Init(ctx context.Context) error { +func (s *space) Init(ctx context.Context) (err error) { s.rpc = &rpcHandler{s: s} - s.diffService.Init(s.getObjectIds()) + initialIds, err := s.storage.StoredIds() + if err != nil { + return + } + s.diffService.Init(initialIds) s.syncService.Init() // basically this provides access for the external cache to use space's tree building functions s.cache.SetBuildFunc(s.BuildTree) @@ -119,11 +121,6 @@ func (s *space) BuildTree(ctx context.Context, id string, listener synctree.Upda return synctree.BuildSyncTree(ctx, s.syncService, store.(treestorage.TreeStorage), listener, s.aclList) } -func (s *space) getObjectIds() []string { - // TODO: add space object logic - return nil -} - func (s *space) Close() error { s.diffService.Close() s.cache.Close() diff --git a/common/commonspace/spacetree/spacetree.go b/common/commonspace/spacetree/spacetree.go deleted file mode 100644 index a8eab744..00000000 --- a/common/commonspace/spacetree/spacetree.go +++ /dev/null @@ -1,39 +0,0 @@ -package spacetree - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" -) - -type SpaceTree interface { - cache.TreeContainer - ID() string - GetObjectIds() []string - Sync() -} - -type spaceTree struct{} - -func (s *spaceTree) Tree() tree.ObjectTree { - //TODO implement me - panic("implement me") -} - -func (s *spaceTree) ID() string { - //TODO implement me - panic("implement me") -} - -func (s *spaceTree) GetObjectIds() []string { - //TODO implement me - panic("implement me") -} - -func (s *spaceTree) Sync() { - //TODO implement me - panic("implement me") -} - -func NewSpaceTree(id string) (SpaceTree, error) { - return &spaceTree{}, nil -} diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index b58d06d1..fb67e1df 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -4,8 +4,9 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" ) +const CName = "commonspace.storage" + type Storage interface { storage.Provider + StoredIds() ([]string, error) } - -const CName = "commonspace.storage" diff --git a/common/net/secure/service.go b/common/net/secure/service.go index 306e2d27..a93c3242 100644 --- a/common/net/secure/service.go +++ b/common/net/secure/service.go @@ -2,13 +2,11 @@ package secure import ( "context" - "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/sec" libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls" "go.uber.org/zap" @@ -45,28 +43,6 @@ func (s *service) Init(a *app.App) (err error) { return } - pid, err := peer.Decode(account.PeerId) - if err != nil { - return - } - - var testData = []byte("test data") - sign, err := s.key.Sign(testData) - if err != nil { - return - } - pubKey, err := pid.ExtractPublicKey() - if err != nil { - return - } - ok, err := pubKey.Verify(testData, sign) - if err != nil { - return - } - if !ok { - return fmt.Errorf("peerId and privateKey mismatched") - } - log.Info("secure service init", zap.String("peerId", account.PeerId)) return nil diff --git a/node/account/service.go b/node/account/service.go new file mode 100644 index 00000000..f9f7a6a2 --- /dev/null +++ b/node/account/service.go @@ -0,0 +1,63 @@ +package account + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" +) + +type service struct { + accountData *account.AccountData + peerId string +} + +func (s *service) Account() *account.AccountData { + return s.accountData +} + +func New() app.Component { + return &service{} +} + +func (s *service) Init(a *app.App) (err error) { + cfg := a.MustComponent(config.CName).(*config.Config) + acc := cfg.Account + + decodedEncryptionKey, err := keys.DecodeKeyFromString( + acc.EncryptionKey, + encryptionkey.NewEncryptionRsaPrivKeyFromBytes, + nil) + if err != nil { + return err + } + + decodedSigningKey, err := keys.DecodeKeyFromString( + acc.SigningKey, + signingkey.NewSigningEd25519PrivKeyFromBytes, + nil) + if err != nil { + return err + } + + identity, err := decodedSigningKey.GetPublic().Raw() + if err != nil { + return err + } + + s.accountData = &account.AccountData{ + Identity: identity, + SignKey: decodedSigningKey, + EncKey: decodedEncryptionKey, + } + s.peerId = acc.PeerId + + return nil +} + +func (s *service) Name() (name string) { + return commonaccount.CName +} diff --git a/node/nodespace/nodecache/treecache.go b/node/nodespace/nodecache/treecache.go index af195df9..926bced6 100644 --- a/node/nodespace/nodecache/treecache.go +++ b/node/nodespace/nodecache/treecache.go @@ -2,6 +2,7 @@ package nodecache import ( "context" + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" @@ -9,6 +10,7 @@ import ( ) var log = logger.NewNamed("treecache") +var ErrCacheObjectWithoutTree = errors.New("cache object contains no tree") type treeCache struct { gcttl int @@ -44,11 +46,17 @@ func (c *treeCache) GetTree(ctx context.Context, id string) (res cache.TreeResul return cache.TreeResult{}, err } + treeContainer, ok := cacheRes.(cache.TreeContainer) + if !ok { + err = ErrCacheObjectWithoutTree + return + } + res = cache.TreeResult{ Release: func() { c.cache.Release(id) }, - TreeContainer: cacheRes.(cache.TreeContainer), + TreeContainer: treeContainer, } return } From ac3a50a31c0273266902736d91efd7cb7abef7ef Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 27 Sep 2022 14:05:21 +0200 Subject: [PATCH 092/219] Gen new configs --- cmd/nodesgen/gen.go | 8 ++++-- etc/config.1.yml | 16 ------------ etc/config.2.yml | 16 ------------ etc/config.yml | 25 +++++++++---------- ...K2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml | 25 ------------------- ...zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml | 25 ------------------- etc/configs/config1.yml | 24 ++++++++++++++++++ etc/configs/config2.yml | 24 ++++++++++++++++++ 8 files changed, 66 insertions(+), 97 deletions(-) delete mode 100644 etc/config.1.yml delete mode 100644 etc/config.2.yml delete mode 100755 etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml delete mode 100755 etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml create mode 100755 etc/configs/config1.yml create mode 100755 etc/configs/config2.yml diff --git a/cmd/nodesgen/gen.go b/cmd/nodesgen/gen.go index 3e1104a5..2eddeab6 100644 --- a/cmd/nodesgen/gen.go +++ b/cmd/nodesgen/gen.go @@ -76,8 +76,8 @@ func main() { } createDir() } - for _, cfg := range configs { - path := fmt.Sprintf("%s/%s.yml", configsPath, cfg.Account.PeerId) + for idx, cfg := range configs { + path := fmt.Sprintf("%s/config%d.yml", configsPath, idx+1) bytes, err := yaml.Marshal(cfg) if err != nil { panic(fmt.Sprintf("could not marshal the keys: %v", err)) @@ -130,5 +130,9 @@ func genConfig(addresses []string, apiPort string) (config.Config, error) { APIServer: config.APIServer{ Port: apiPort, }, + Space: config.Space{ + GCTTL: 60, + SyncPeriod: 10, + }, }, nil } diff --git a/etc/config.1.yml b/etc/config.1.yml deleted file mode 100644 index 093d1ef7..00000000 --- a/etc/config.1.yml +++ /dev/null @@ -1,16 +0,0 @@ -anytype: - swarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec" - -grpcServer: - listenAddrs: - - "127.0.0.1:4431" - -peerList: - myId: - peerId: "12D3KooWA4FLWvrMbCtp2MbzKcC5RRN7HqxxBxPcSADFfzrGiW3U" - privKey: "InCGjb55V9+jj2PebUExUuwrpOIBc4hmgk2dSqyk3k4DjmgrdoNVuFe7xCFaFdUVb0RJYj6A+OTp2yXASTmq2w==" - remote: - - peerId: "12D3KooWHJpSEMQUZCyK8TK181LhjzntWjKfXDr7MWks9cw41R2C" - addr: "127.0.0.1:4430" - - peerId: "12D3KooWK6c1CPLL4Bvjim9A9SDRmehy12hYjbqX1VASHKfH7W7H" - addr: "127.0.0.1:4432" diff --git a/etc/config.2.yml b/etc/config.2.yml deleted file mode 100644 index 701fdc5f..00000000 --- a/etc/config.2.yml +++ /dev/null @@ -1,16 +0,0 @@ -anytype: - swarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec" - -grpcServer: - listenAddrs: - - "127.0.0.1:4432" - -peerList: - myId: - peerId: "12D3KooWK6c1CPLL4Bvjim9A9SDRmehy12hYjbqX1VASHKfH7W7H" - privKey: "jynYZBgtM4elT+6e7M5UERTJCZgUd3hDdmQjCqTpApyJ4h53V6TQan4Ru4OXqz+91rCLjpIVdphhaB0l+TvNsA==" - remote: - - peerId: "12D3KooWA4FLWvrMbCtp2MbzKcC5RRN7HqxxBxPcSADFfzrGiW3U" - addr: "127.0.0.1:4431" - - peerId: "12D3KooWHJpSEMQUZCyK8TK181LhjzntWjKfXDr7MWks9cw41R2C" - addr: "127.0.0.1:4430" diff --git a/etc/config.yml b/etc/config.yml index 09b13d54..8c829b5f 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -3,23 +3,22 @@ anytype: grpcServer: listenAddrs: - 127.0.0.1:4430 - - 127.0.0.1:4431 tls: false account: - peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 - signingKey: 3id6ddLcoNoe9rDgGM88ET8T6TnvHm5GFqFdN6kBzn7Q8d6VUGgjeT59CNWFiaofdeRnHBvX2A5ZacMXvfwaYEFuCbug - encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd + peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu + signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA== + encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg== apiServer: port: "8080" +nodes: + - peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu + address: 127.0.0.1:4430 + signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA== + encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg== + - peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK + address: 127.0.0.1:4431 + signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg== + encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w== space: gcTTL: 60 syncPeriod: 10 -nodes: - - peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 - address: 127.0.0.1:4430 - signingKey: 3id6ddLcoNoe9rDgGM88ET8T6TnvHm5GFqFdN6kBzn7Q8d6VUGgjeT59CNWFiaofdeRnHBvX2A5ZacMXvfwaYEFuCbug - encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd - - peerId: 12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw - address: 127.0.0.1:4432 - signingKey: 3iiLPj6wMUQpPwTBNZcUgkbXub1jumg4AEV9LfMyFHZVc84GLyAjVbVvH6EAGhcNrxRxL82aW4BimhDZCpLsRCqx5vwj - encryptionKey: JgG4CcCbae1qEpe7mKXzp7m5hNc56SSyZd9DwUaEStKJrq7RToAC2Vgd3i6hKRwa58zCWeN6Wjc3o6qrdKPEPRvcyEPysamajVo5mdQiUgWAmr97pGEsyjuRjQoC2GY2LvLiEQxEgwFgJxKGMHMiaWMtDfxCDUaDEm4bu5RdMhqRZekAWho6c3WoEeruSr14iX1TrocFNfBkBY7CjEw8kcywXCTNgtvhb2Qiwgj5AxEF4wyw4bzaNA9ctXb1hoHPFVMu6C51pkFY7jUD9zwyH3ukgnAewkGAcPNbKmaTAtMosKRVaAN97mAwXh2VRt1hWmRvVk7r76EjnVKhD4vbsKZc56RVcHTVWRVdhU7FGyPsiE5rSQAz1JQGYzxnZpX7EG77CyrmUGyfueVfRHhwY2oq8A4uQCRaQxSaJHYLowjXSxh8DQ2V6MTqyzti32C27utBYdHzLVCJSGkmdzGwrFcHqsq7nLDxmvJVErPvyReixEe8kFmqopJ3e6LLm8WdYw9K6JYBjXnEfwPzm7Von9sf3dcaGDUHYfttMyeke7fAXJkvPRje69hYVyzdQGAauuojzGkkvQWCSMK1KCMNMznRaPDCNvofrQhYrub24WhmwpKhorufdfW8Cb4T6reBDCtaWVsbuinjtL6F6Sui5aYHJFLJ6e4pPewr1P4EuZYRbMBZwN5KvDLhTGLBuBnaTqUUdF6bj2U22NoRYMogiHiftqKqiexKNDXX1Zg9RQEvxgjuVo6SBW42mVEA8agrLhruRqCmiduJxVrfqLNGeYXHXrcmMEgW7uosJbPXvTcfRvdFWS1ov7oSALvj6vhDQ28Yi9D2ETNdNsfVWAFQuwvPpW7CHQGXTitprVbqH8JYxNZuGygcLmr5efbB22Vzu4ntd1HoraQpG12qeDEUA7tXYUpoYyuSdWwKPjSAMtaQcCSfVrhKQHQuKJargrVrez8vjWuwLfvSucV7ZHe7gjqvYgULdE1ubRCRSd7DuLjEN2Vd6obzV2c3MRet7ZSf4Sp88WM5AuTyW7BjArBc4S3gUQ8rYaiZ8Tu7NCxkEzbFwWRaemZkwfvcsX3XxqjyF37tFSGkEqE5kuBvpZW72675LkDffj7kH1zA8yE6dVujJjWsNYVFJWndUtz5Vy2KCdZAbBgq19q4AtsxWPodU2N3yZXzFAFAzTrxS6V4P7Scpdau1avgRvHLcBQPunA37xaYMy8YMifJwtmRY25mnAQwZAk3eANk7tXwZd58SDnciLNvARJvwKzTQBXcshkwyy52SX8XmXDJsPnRLaHmiYBJ63Yzr5XpZuuAtxb9qrWG2NHCNxfomHokWacV1hjZPPd6ZxT1FuRozB6Qt2NLcyqY7bnTcQJb1jPUaTAGXXCR8WVmmmYo2fDQe8CdBmgyPvbzNTEJUyScBz4RdycB5PZap4SurJCWtHbuMyQbQUB6jJgURDstfXS5Akfe4oruNq9rnYcNtnsDJPtrhXHBqzDizmf1BDxR5FB2RCxzCgeAfg8WQ1Ug9PVAGTzob6ZqCrGXzWXEUniZnf1vjr7QhGKBYXEX9SWDoSMUpP4FreVDTnx15ijRZTV3p8xG5fE9e36TnugRVvTyq7XzmyPBjW2r66f1bior diff --git a/etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml b/etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml deleted file mode 100755 index dcea6558..00000000 --- a/etc/configs/12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1.yml +++ /dev/null @@ -1,25 +0,0 @@ -anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec -grpcServer: - listenAddrs: - - 127.0.0.1:4430 - - 127.0.0.1:4431 - tls: false -account: - peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 - signingKey: 3id6ddLcoNoe9rDgGM88ET8T6TnvHm5GFqFdN6kBzn7Q8d6VUGgjeT59CNWFiaofdeRnHBvX2A5ZacMXvfwaYEFuCbug - encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd -apiServer: - port: "8080" -space: - gcTTL: 60 - syncPeriod: 10 -nodes: - - peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 - address: 127.0.0.1:4430 - signingKey: 3id6ddLcoNoe9rDgGM88ET8T6TnvHm5GFqFdN6kBzn7Q8d6VUGgjeT59CNWFiaofdeRnHBvX2A5ZacMXvfwaYEFuCbug - encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd - - peerId: 12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw - address: 127.0.0.1:4432 - signingKey: 3iiLPj6wMUQpPwTBNZcUgkbXub1jumg4AEV9LfMyFHZVc84GLyAjVbVvH6EAGhcNrxRxL82aW4BimhDZCpLsRCqx5vwj - encryptionKey: JgG4CcCbae1qEpe7mKXzp7m5hNc56SSyZd9DwUaEStKJrq7RToAC2Vgd3i6hKRwa58zCWeN6Wjc3o6qrdKPEPRvcyEPysamajVo5mdQiUgWAmr97pGEsyjuRjQoC2GY2LvLiEQxEgwFgJxKGMHMiaWMtDfxCDUaDEm4bu5RdMhqRZekAWho6c3WoEeruSr14iX1TrocFNfBkBY7CjEw8kcywXCTNgtvhb2Qiwgj5AxEF4wyw4bzaNA9ctXb1hoHPFVMu6C51pkFY7jUD9zwyH3ukgnAewkGAcPNbKmaTAtMosKRVaAN97mAwXh2VRt1hWmRvVk7r76EjnVKhD4vbsKZc56RVcHTVWRVdhU7FGyPsiE5rSQAz1JQGYzxnZpX7EG77CyrmUGyfueVfRHhwY2oq8A4uQCRaQxSaJHYLowjXSxh8DQ2V6MTqyzti32C27utBYdHzLVCJSGkmdzGwrFcHqsq7nLDxmvJVErPvyReixEe8kFmqopJ3e6LLm8WdYw9K6JYBjXnEfwPzm7Von9sf3dcaGDUHYfttMyeke7fAXJkvPRje69hYVyzdQGAauuojzGkkvQWCSMK1KCMNMznRaPDCNvofrQhYrub24WhmwpKhorufdfW8Cb4T6reBDCtaWVsbuinjtL6F6Sui5aYHJFLJ6e4pPewr1P4EuZYRbMBZwN5KvDLhTGLBuBnaTqUUdF6bj2U22NoRYMogiHiftqKqiexKNDXX1Zg9RQEvxgjuVo6SBW42mVEA8agrLhruRqCmiduJxVrfqLNGeYXHXrcmMEgW7uosJbPXvTcfRvdFWS1ov7oSALvj6vhDQ28Yi9D2ETNdNsfVWAFQuwvPpW7CHQGXTitprVbqH8JYxNZuGygcLmr5efbB22Vzu4ntd1HoraQpG12qeDEUA7tXYUpoYyuSdWwKPjSAMtaQcCSfVrhKQHQuKJargrVrez8vjWuwLfvSucV7ZHe7gjqvYgULdE1ubRCRSd7DuLjEN2Vd6obzV2c3MRet7ZSf4Sp88WM5AuTyW7BjArBc4S3gUQ8rYaiZ8Tu7NCxkEzbFwWRaemZkwfvcsX3XxqjyF37tFSGkEqE5kuBvpZW72675LkDffj7kH1zA8yE6dVujJjWsNYVFJWndUtz5Vy2KCdZAbBgq19q4AtsxWPodU2N3yZXzFAFAzTrxS6V4P7Scpdau1avgRvHLcBQPunA37xaYMy8YMifJwtmRY25mnAQwZAk3eANk7tXwZd58SDnciLNvARJvwKzTQBXcshkwyy52SX8XmXDJsPnRLaHmiYBJ63Yzr5XpZuuAtxb9qrWG2NHCNxfomHokWacV1hjZPPd6ZxT1FuRozB6Qt2NLcyqY7bnTcQJb1jPUaTAGXXCR8WVmmmYo2fDQe8CdBmgyPvbzNTEJUyScBz4RdycB5PZap4SurJCWtHbuMyQbQUB6jJgURDstfXS5Akfe4oruNq9rnYcNtnsDJPtrhXHBqzDizmf1BDxR5FB2RCxzCgeAfg8WQ1Ug9PVAGTzob6ZqCrGXzWXEUniZnf1vjr7QhGKBYXEX9SWDoSMUpP4FreVDTnx15ijRZTV3p8xG5fE9e36TnugRVvTyq7XzmyPBjW2r66f1bior diff --git a/etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml b/etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml deleted file mode 100755 index eb88a19b..00000000 --- a/etc/configs/12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw.yml +++ /dev/null @@ -1,25 +0,0 @@ -anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec -grpcServer: - listenAddrs: - - 127.0.0.1:4432 - - 127.0.0.1:4433 - tls: false -account: - peerId: 12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw - signingKey: 3iiLPj6wMUQpPwTBNZcUgkbXub1jumg4AEV9LfMyFHZVc84GLyAjVbVvH6EAGhcNrxRxL82aW4BimhDZCpLsRCqx5vwj - encryptionKey: JgG4CcCbae1qEpe7mKXzp7m5hNc56SSyZd9DwUaEStKJrq7RToAC2Vgd3i6hKRwa58zCWeN6Wjc3o6qrdKPEPRvcyEPysamajVo5mdQiUgWAmr97pGEsyjuRjQoC2GY2LvLiEQxEgwFgJxKGMHMiaWMtDfxCDUaDEm4bu5RdMhqRZekAWho6c3WoEeruSr14iX1TrocFNfBkBY7CjEw8kcywXCTNgtvhb2Qiwgj5AxEF4wyw4bzaNA9ctXb1hoHPFVMu6C51pkFY7jUD9zwyH3ukgnAewkGAcPNbKmaTAtMosKRVaAN97mAwXh2VRt1hWmRvVk7r76EjnVKhD4vbsKZc56RVcHTVWRVdhU7FGyPsiE5rSQAz1JQGYzxnZpX7EG77CyrmUGyfueVfRHhwY2oq8A4uQCRaQxSaJHYLowjXSxh8DQ2V6MTqyzti32C27utBYdHzLVCJSGkmdzGwrFcHqsq7nLDxmvJVErPvyReixEe8kFmqopJ3e6LLm8WdYw9K6JYBjXnEfwPzm7Von9sf3dcaGDUHYfttMyeke7fAXJkvPRje69hYVyzdQGAauuojzGkkvQWCSMK1KCMNMznRaPDCNvofrQhYrub24WhmwpKhorufdfW8Cb4T6reBDCtaWVsbuinjtL6F6Sui5aYHJFLJ6e4pPewr1P4EuZYRbMBZwN5KvDLhTGLBuBnaTqUUdF6bj2U22NoRYMogiHiftqKqiexKNDXX1Zg9RQEvxgjuVo6SBW42mVEA8agrLhruRqCmiduJxVrfqLNGeYXHXrcmMEgW7uosJbPXvTcfRvdFWS1ov7oSALvj6vhDQ28Yi9D2ETNdNsfVWAFQuwvPpW7CHQGXTitprVbqH8JYxNZuGygcLmr5efbB22Vzu4ntd1HoraQpG12qeDEUA7tXYUpoYyuSdWwKPjSAMtaQcCSfVrhKQHQuKJargrVrez8vjWuwLfvSucV7ZHe7gjqvYgULdE1ubRCRSd7DuLjEN2Vd6obzV2c3MRet7ZSf4Sp88WM5AuTyW7BjArBc4S3gUQ8rYaiZ8Tu7NCxkEzbFwWRaemZkwfvcsX3XxqjyF37tFSGkEqE5kuBvpZW72675LkDffj7kH1zA8yE6dVujJjWsNYVFJWndUtz5Vy2KCdZAbBgq19q4AtsxWPodU2N3yZXzFAFAzTrxS6V4P7Scpdau1avgRvHLcBQPunA37xaYMy8YMifJwtmRY25mnAQwZAk3eANk7tXwZd58SDnciLNvARJvwKzTQBXcshkwyy52SX8XmXDJsPnRLaHmiYBJ63Yzr5XpZuuAtxb9qrWG2NHCNxfomHokWacV1hjZPPd6ZxT1FuRozB6Qt2NLcyqY7bnTcQJb1jPUaTAGXXCR8WVmmmYo2fDQe8CdBmgyPvbzNTEJUyScBz4RdycB5PZap4SurJCWtHbuMyQbQUB6jJgURDstfXS5Akfe4oruNq9rnYcNtnsDJPtrhXHBqzDizmf1BDxR5FB2RCxzCgeAfg8WQ1Ug9PVAGTzob6ZqCrGXzWXEUniZnf1vjr7QhGKBYXEX9SWDoSMUpP4FreVDTnx15ijRZTV3p8xG5fE9e36TnugRVvTyq7XzmyPBjW2r66f1bior -apiServer: - port: "8081" -space: - gcTTL: 60 - syncPeriod: 10 -nodes: - - peerId: 12D3KooWMHuhZgK2skkLrvL51QQTXaXQKYy2QqfvPNBFnzR2ubA1 - address: 127.0.0.1:4430 - signingKey: 3id6ddLcoNoe9rDgGM88ET8T6TnvHm5GFqFdN6kBzn7Q8d6VUGgjeT59CNWFiaofdeRnHBvX2A5ZacMXvfwaYEFuCbug - encryptionKey: JgG4CcCbae1qEpe7mKpBzsHjZhXUmDSNVNX2B1gxFZsJyMX4V6kBQUott9zRWyeXaW1ZmpzuxDXnwSQpAnNurhXyGa9iQaAPqzY9A9VWBPD33Yy1eW7TRuVemzToh8jJQKQKnZNbF8ucTWV9qahusKzyvN8uyhrqoW2tAPfA9S3E3ognCuqbLSW6yjE2rBKayvyS1BVwzjSd6FZK4DDyjfU3pbEVjut3wytGEAn9af6sNMmyCnf2MX5vLovWs9rU8av61wD4z7HTsXyGFx4K75N4Go249Hpe9SKAT6HxhRc3yvj63krPLiQV5yMuH2UeMUXBDekUQyNmBEdn9wrur7mLqB67Bc6tcc2PP8XApBCdWJHvHjN4FktSpaG5vbCqoZbLD1oCbk36q2x9s6XM8pydVqD1J9P3nTbfgMb5pJCTFjNtgKeuKv6wjfJeA9jF1VhcJQisfsahgv9MvZ9M8FJpZTq1zKUhYDCRnZxUkraoMS5yNNVdDzaUckKEDthqik7BMWCWT79vq7uVgMwEvGwGi76gtoMg1159bbPMLZ4bdPVfhH2S9QjPrzQfwZSrzB2YeVPjWpaXDeLDity5H8n1NK2oniAQR6gE71n81neSptsuhV6o6QpQ89AU8y57XmEsou4VEryn8vUxBHhULLxrLNUouxyWamCeFiDjk5cSN6koQsf9BYKSNTPFTrwjTKForDokMhcPdMtFktKwjv7u9UEGcY4MKvNzZZkc77gHiP8bqVtdNNoLpTFUC5SZ9i7bKdHvK12HpSy7yzzPeMXJ9UwhLxkok1g81ngTbN1yxRhvYXyHZFtguCR9kvGojDjka91MTBtk551qDw9eCn2xZT9U8jqzBCjdpvSg3mRWKMPnYAGB7m7u1ye165wyGFvzcHAx3vtXjxAqLUeKYZCjv2m6V9D2Y4qH1TQNddWqH14T1JVMis971UCH9Ddpj6a3387oUnufD1P6HZN2ieJCvptrmbGVvxJYYSvmVf1dkwbtqurDRNWD7TJ7gf6iqSP549C9bxP4GpLt3ygjHmMtcuUzstBuztvunJUnQhfnJxqU6LjRdsFzm53wGWgXNxab7ZvQcPyLwsevn1b98FGPnVpS5iY4LjmqW4ugrC6HgrbsjrXiKzR1yZKhLQkCbLzPoaHb8iB5iBnCr7d4yf5CtfpFRqgoqMFdK5LNZYmDX4HzUKN6A7wC3gGiSRFTLcgGZeSMkB5Pa61CZBU7WCQgFxykycE9HRA7PiQa496GWDCV15teToCpFRsAa6jDmR1MGXPeLRqQgve49VXnQN5FL7c1VuEv5SWjeTuCnMB47DJKBaP7eKJNKgLwETALzSCMF3nRiRgeb15kfoS4BbrJ5yupjrvwmbmvNg1AYFFS5sYNWft7K8v87wQvBakRtGP71Kp8NX77XFtu6xdB7sR6jpfC6qJPyB9akWNXgCrWy9kE4ih42gwAZdUugNZ9YtEsgRM3pwb6qJhkAPyEJtrxrja859PCAgqPSQiPQN33PaMkgQ6HJknu8CrjKRiXAycZ16KLUkHV64TNhEjPTcX1a7rqpD131AYMWX8d7CCdc9Ys7RUb6BwguuNSh8rJK3x4AkMDSUsaE8ynKvpC7RXZpJ9Nxfhd - - peerId: 12D3KooWT3c7Y5zvWhhjSxd5Ve3GKZi6WCsG6JHxcxgXixRFdBbw - address: 127.0.0.1:4432 - signingKey: 3iiLPj6wMUQpPwTBNZcUgkbXub1jumg4AEV9LfMyFHZVc84GLyAjVbVvH6EAGhcNrxRxL82aW4BimhDZCpLsRCqx5vwj - encryptionKey: JgG4CcCbae1qEpe7mKXzp7m5hNc56SSyZd9DwUaEStKJrq7RToAC2Vgd3i6hKRwa58zCWeN6Wjc3o6qrdKPEPRvcyEPysamajVo5mdQiUgWAmr97pGEsyjuRjQoC2GY2LvLiEQxEgwFgJxKGMHMiaWMtDfxCDUaDEm4bu5RdMhqRZekAWho6c3WoEeruSr14iX1TrocFNfBkBY7CjEw8kcywXCTNgtvhb2Qiwgj5AxEF4wyw4bzaNA9ctXb1hoHPFVMu6C51pkFY7jUD9zwyH3ukgnAewkGAcPNbKmaTAtMosKRVaAN97mAwXh2VRt1hWmRvVk7r76EjnVKhD4vbsKZc56RVcHTVWRVdhU7FGyPsiE5rSQAz1JQGYzxnZpX7EG77CyrmUGyfueVfRHhwY2oq8A4uQCRaQxSaJHYLowjXSxh8DQ2V6MTqyzti32C27utBYdHzLVCJSGkmdzGwrFcHqsq7nLDxmvJVErPvyReixEe8kFmqopJ3e6LLm8WdYw9K6JYBjXnEfwPzm7Von9sf3dcaGDUHYfttMyeke7fAXJkvPRje69hYVyzdQGAauuojzGkkvQWCSMK1KCMNMznRaPDCNvofrQhYrub24WhmwpKhorufdfW8Cb4T6reBDCtaWVsbuinjtL6F6Sui5aYHJFLJ6e4pPewr1P4EuZYRbMBZwN5KvDLhTGLBuBnaTqUUdF6bj2U22NoRYMogiHiftqKqiexKNDXX1Zg9RQEvxgjuVo6SBW42mVEA8agrLhruRqCmiduJxVrfqLNGeYXHXrcmMEgW7uosJbPXvTcfRvdFWS1ov7oSALvj6vhDQ28Yi9D2ETNdNsfVWAFQuwvPpW7CHQGXTitprVbqH8JYxNZuGygcLmr5efbB22Vzu4ntd1HoraQpG12qeDEUA7tXYUpoYyuSdWwKPjSAMtaQcCSfVrhKQHQuKJargrVrez8vjWuwLfvSucV7ZHe7gjqvYgULdE1ubRCRSd7DuLjEN2Vd6obzV2c3MRet7ZSf4Sp88WM5AuTyW7BjArBc4S3gUQ8rYaiZ8Tu7NCxkEzbFwWRaemZkwfvcsX3XxqjyF37tFSGkEqE5kuBvpZW72675LkDffj7kH1zA8yE6dVujJjWsNYVFJWndUtz5Vy2KCdZAbBgq19q4AtsxWPodU2N3yZXzFAFAzTrxS6V4P7Scpdau1avgRvHLcBQPunA37xaYMy8YMifJwtmRY25mnAQwZAk3eANk7tXwZd58SDnciLNvARJvwKzTQBXcshkwyy52SX8XmXDJsPnRLaHmiYBJ63Yzr5XpZuuAtxb9qrWG2NHCNxfomHokWacV1hjZPPd6ZxT1FuRozB6Qt2NLcyqY7bnTcQJb1jPUaTAGXXCR8WVmmmYo2fDQe8CdBmgyPvbzNTEJUyScBz4RdycB5PZap4SurJCWtHbuMyQbQUB6jJgURDstfXS5Akfe4oruNq9rnYcNtnsDJPtrhXHBqzDizmf1BDxR5FB2RCxzCgeAfg8WQ1Ug9PVAGTzob6ZqCrGXzWXEUniZnf1vjr7QhGKBYXEX9SWDoSMUpP4FreVDTnx15ijRZTV3p8xG5fE9e36TnugRVvTyq7XzmyPBjW2r66f1bior diff --git a/etc/configs/config1.yml b/etc/configs/config1.yml new file mode 100755 index 00000000..4885eab8 --- /dev/null +++ b/etc/configs/config1.yml @@ -0,0 +1,24 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4430 + tls: false +account: + peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu + signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA== + encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg== +apiServer: + port: "8080" +nodes: + - peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu + address: 127.0.0.1:4430 + signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA== + encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg== + - peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK + address: 127.0.0.1:4431 + signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg== + encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w== +space: + gcTTL: 60 + syncPeriod: 10 diff --git a/etc/configs/config2.yml b/etc/configs/config2.yml new file mode 100755 index 00000000..5e1eaadb --- /dev/null +++ b/etc/configs/config2.yml @@ -0,0 +1,24 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4431 + tls: false +account: + peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK + signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg== + encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w== +apiServer: + port: "8081" +nodes: + - peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu + address: 127.0.0.1:4430 + signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA== + encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg== + - peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK + address: 127.0.0.1:4431 + signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg== + encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w== +space: + gcTTL: 60 + syncPeriod: 10 From dbc951a9d059436bd98a4a29b9cfe8b11c3da6c6 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Tue, 27 Sep 2022 19:43:39 +0300 Subject: [PATCH 093/219] rpc errors --- common/net/rpc/rpcerr/registry.go | 51 +++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 common/net/rpc/rpcerr/registry.go diff --git a/common/net/rpc/rpcerr/registry.go b/common/net/rpc/rpcerr/registry.go new file mode 100644 index 00000000..872c0fd9 --- /dev/null +++ b/common/net/rpc/rpcerr/registry.go @@ -0,0 +1,51 @@ +package rpcerr + +import ( + "errors" + "fmt" + "storj.io/drpc/drpcerr" +) + +var ( + Unexpected = RegisterErr(errors.New("unexpected"), 1) + Closed = RegisterErr(errors.New("closed"), 2) +) + +var ( + errsMap = make(map[uint64]error) +) + +func RegisterErr(err error, code uint64) error { + if e, ok := errsMap[code]; ok { + panic(fmt.Errorf("attempt to register error with exiswting code: %d; registered error: %v", code, e)) + } + errWithCode := drpcerr.WithCode(err, code) + errsMap[code] = errWithCode + return errWithCode +} + +func Err(code uint64) error { + err, ok := errsMap[code] + if !ok { + return drpcerr.WithCode(fmt.Errorf("unexpected error, code: %d", code), code) + } + return err +} + +func Unwrap(e error) error { + code := drpcerr.Code(e) + if code == 0 { + return e + } + err, ok := errsMap[code] + if !ok { + return drpcerr.WithCode(fmt.Errorf("unexpected error: %v; code: %d", err, code), code) + } + return err +} + +type ErrGroup int64 + +func (g ErrGroup) Register(err error, code uint64) error { + return RegisterErr(err, uint64(g)+code) +} From 51af8c223df16050c0e09990676684bedfbe70fe Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 27 Sep 2022 21:06:49 +0200 Subject: [PATCH 094/219] Add space/tree creation and derivation and push space protocol changes --- Makefile | 2 +- cmd/node/node.go | 1 + common/commonspace/diffservice/diffservice.go | 4 +- common/commonspace/service.go | 231 +++++++- common/commonspace/space.go | 29 +- .../spacesyncproto/protos/spacesync.proto | 22 +- .../spacesyncproto/spacesync.pb.go | 524 ++++++++++++++++-- .../spacesyncproto/spacesync_drpc.pb.go | 42 +- common/commonspace/storage/storage.go | 17 +- common/commonspace/syncservice/syncservice.go | 3 +- common/commonspace/synctree/synctree.go | 24 + node/nodespace/rpchandler.go | 4 + node/nodespace/service.go | 7 +- pkg/acl/tree/changebuilder.go | 3 +- pkg/acl/tree/objecttreefactory.go | 27 +- 15 files changed, 858 insertions(+), 82 deletions(-) diff --git a/Makefile b/Makefile index e9143f01..53ddd25b 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ proto: $(GOGO_START) protoc --gogofaster_out=:. $(P_ACL_RECORDS_PATH_PB)/protos/*.proto $(GOGO_START) protoc --gogofaster_out=:. $(P_TREE_CHANGES_PATH_PB)/protos/*.proto $(GOGO_START) protoc --gogofaster_out=:. $(P_TEST_CHANGES_PATH_PB)/proto/*.proto - $(eval PKGMAP := $$(P_TREE_CHANGES)) + $(eval PKGMAP := $$(P_TREE_CHANGES),$$(P_ACL_RECORDS)) $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. --go-drpc_out=protolib=github.com/gogo/protobuf:. common/commonspace/spacesyncproto/protos/*.proto diff --git a/cmd/node/node.go b/cmd/node/node.go index 3a0e0f64..47d0c3e5 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -89,6 +89,7 @@ func main() { func Bootstrap(a *app.App) { a.Register(account.New()). + // TODO: add space storage provider from node side Register(nodeconf.New()). Register(secure.New()). Register(dialer.New()). diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index b530d05f..71cf36ce 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -27,7 +27,7 @@ type DiffService interface { type diffService struct { spaceId string periodicSync *periodicSync - storage storage.Storage + storage storage.SpaceStorage nconf nodeconf.Configuration diff ldiff.Diff cache cache.TreeCache @@ -39,7 +39,7 @@ type diffService struct { func NewDiffService( spaceId string, syncPeriod int, - storage storage.Storage, + storage storage.SpaceStorage, nconf nodeconf.Configuration, cache cache.TreeCache, log *zap.Logger) DiffService { diff --git a/common/commonspace/service.go b/common/commonspace/service.go index ae1edd99..f5b10591 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -6,10 +6,17 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "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/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "hash/fnv" + "math/rand" + "time" ) const CName = "common.commonspace" @@ -21,22 +28,21 @@ func New() Service { } type Service interface { - CreateSpace(ctx context.Context, id string, deps SpaceDeps) (sp Space, err error) + CreateSpace(ctx context.Context, cache cache.TreeCache, payload SpaceCreatePayload) (Space, error) + DeriveSpace(ctx context.Context, cache cache.TreeCache, payload SpaceDerivePayload) (Space, error) + GetSpace(ctx context.Context, id string, cache cache.TreeCache) (sp Space, err error) app.Component } type service struct { config config.Space configurationService nodeconf.Service -} - -type SpaceDeps struct { - Cache cache.TreeCache - Storage storage.Storage + storageProvider storage.SpaceStorageProvider } func (s *service) Init(a *app.App) (err error) { s.config = a.MustComponent(config.CName).(*config.Config).Space + s.storageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) return nil } @@ -45,19 +51,222 @@ func (s *service) Name() (name string) { return CName } -func (s *service) CreateSpace(ctx context.Context, id string, deps SpaceDeps) (Space, error) { +func (s *service) CreateSpace( + ctx context.Context, + cache cache.TreeCache, + payload SpaceCreatePayload) (sp Space, err error) { + + // unmarshalling signing and encryption keys + identity, err := payload.SigningKey.GetPublic().Raw() + if err != nil { + return + } + encPubKey, err := payload.EncryptionKey.GetPublic().Raw() + if err != nil { + return + } + + // preparing header and space id + bytes := make([]byte, 32) + _, err = rand.Read(bytes) + if err != nil { + return + } + header := &spacesyncproto.SpaceHeader{ + Identity: identity, + Timestamp: time.Now().UnixNano(), + SpaceType: payload.SpaceType, + ReplicationKey: payload.ReplicationKey, + Seed: bytes, + } + marshalled, err := header.Marshal() + if err != nil { + return + } + id, err := cid.NewCIDFromBytes(marshalled) + if err != nil { + return + } + spaceId := NewSpaceId(id, payload.ReplicationKey) + + // encrypting read key + hasher := fnv.New64() + _, err = hasher.Write(payload.ReadKey) + if err != nil { + return + } + readKeyHash := hasher.Sum64() + encReadKey, err := payload.EncryptionKey.GetPublic().Encrypt(payload.ReadKey) + if err != nil { + return + } + + // preparing acl + aclRoot := &aclrecordproto.ACLRoot{ + Identity: identity, + EncryptionKey: encPubKey, + SpaceId: spaceId, + EncryptedReadKey: encReadKey, + DerivationScheme: "", + CurrentReadKeyHash: readKeyHash, + Timestamp: time.Now().UnixNano(), + } + rawWithId, err := marshalACLRoot(aclRoot, payload.SigningKey) + if err != nil { + return + } + + // creating storage + storageCreate := storage.SpaceStorageCreatePayload{ + RecWithId: rawWithId, + SpaceHeader: header, + Id: id, + } + _, err = s.storageProvider.CreateSpaceStorage(storageCreate) + if err != nil { + return + } + + return s.GetSpace(ctx, spaceId, cache) +} + +func (s *service) DeriveSpace( + ctx context.Context, + cache cache.TreeCache, + payload SpaceDerivePayload) (sp Space, err error) { + + // unmarshalling signing and encryption keys + identity, err := payload.SigningKey.GetPublic().Raw() + if err != nil { + return + } + signPrivKey, err := payload.SigningKey.Raw() + if err != nil { + return + } + encPubKey, err := payload.EncryptionKey.GetPublic().Raw() + if err != nil { + return + } + encPrivKey, err := payload.EncryptionKey.Raw() + if err != nil { + return + } + + // preparing replication key + hasher := fnv.New64() + _, err = hasher.Write(identity) + if err != nil { + return + } + repKey := hasher.Sum64() + + // preparing header and space id + header := &spacesyncproto.SpaceHeader{ + Identity: identity, + SpaceType: SpaceTypeDerived, + ReplicationKey: repKey, + } + marshalled, err := header.Marshal() + if err != nil { + return + } + id, err := cid.NewCIDFromBytes(marshalled) + if err != nil { + return + } + spaceId := NewSpaceId(id, repKey) + + // deriving and encrypting read key + readKey, err := aclrecordproto.ACLReadKeyDerive(signPrivKey, encPrivKey) + if err != nil { + return + } + hasher = fnv.New64() + _, err = hasher.Write(readKey.Bytes()) + if err != nil { + return + } + readKeyHash := hasher.Sum64() + encReadKey, err := payload.EncryptionKey.GetPublic().Encrypt(readKey.Bytes()) + if err != nil { + return + } + + // preparing acl + aclRoot := &aclrecordproto.ACLRoot{ + Identity: identity, + EncryptionKey: encPubKey, + SpaceId: spaceId, + EncryptedReadKey: encReadKey, + DerivationScheme: "", + CurrentReadKeyHash: readKeyHash, + Timestamp: time.Now().UnixNano(), + } + rawWithId, err := marshalACLRoot(aclRoot, payload.SigningKey) + if err != nil { + return + } + + // creating storage + storageCreate := storage.SpaceStorageCreatePayload{ + RecWithId: rawWithId, + SpaceHeader: header, + Id: id, + } + _, err = s.storageProvider.CreateSpaceStorage(storageCreate) + if err != nil { + return + } + + return s.GetSpace(ctx, spaceId, cache) +} + +func (s *service) GetSpace(ctx context.Context, id string, cache cache.TreeCache) (Space, error) { + st, err := s.storageProvider.SpaceStorage(id) + if err != nil { + return nil, err + } lastConfiguration := s.configurationService.GetLast() - diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, deps.Storage, lastConfiguration, deps.Cache, log) - syncService := syncservice.NewSyncService(id, diffService, deps.Cache, lastConfiguration) + diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, lastConfiguration, cache, log) + syncService := syncservice.NewSyncService(id, diffService, cache, lastConfiguration) sp := &space{ id: id, syncService: syncService, diffService: diffService, - cache: deps.Cache, - storage: deps.Storage, + cache: cache, + storage: st, } if err := sp.Init(ctx); err != nil { return nil, err } return sp, nil } + +func marshalACLRoot(aclRoot *aclrecordproto.ACLRoot, key signingkey.PrivKey) (rawWithId *aclrecordproto.RawACLRecordWithId, err error) { + marshalledRoot, err := aclRoot.Marshal() + if err != nil { + return + } + signature, err := key.Sign(marshalledRoot) + if err != nil { + return + } + raw := &aclrecordproto.RawACLRecord{ + Payload: marshalledRoot, + Signature: signature, + } + marshalledRaw, err := raw.Marshal() + if err != nil { + return + } + aclHeadId, err := cid.NewCIDFromBytes(marshalledRaw) + if err != nil { + return + } + rawWithId = &aclrecordproto.RawACLRecordWithId{ + Payload: marshalledRaw, + Id: aclHeadId, + } + return +} diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 07dac8f6..31c2fdfa 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -2,6 +2,7 @@ package commonspace import ( "context" + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" @@ -11,9 +12,30 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" "sync" ) +type SpaceCreatePayload struct { + SigningKey signingkey.PrivKey + EncryptionKey encryptionkey.PrivKey + SpaceType string + ReadKey []byte + ReplicationKey uint64 +} + +const SpaceTypeDerived = "derived.space" + +type SpaceDerivePayload struct { + SigningKey signingkey.PrivKey + EncryptionKey encryptionkey.PrivKey +} + +func NewSpaceId(id string, repKey uint64) string { + return fmt.Sprintf("%s.%d", id, repKey) +} + type Space interface { Id() string @@ -21,6 +43,7 @@ type Space interface { SyncService() syncservice.SyncService DiffService() diffservice.DiffService + DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) BuildTree(ctx context.Context, id string, listener synctree.UpdateListener) (tree.ObjectTree, error) @@ -35,7 +58,7 @@ type space struct { syncService syncservice.SyncService diffService diffservice.DiffService - storage storage.Storage + storage storage.SpaceStorage cache cache.TreeCache aclList list.ACLList } @@ -69,6 +92,10 @@ func (s *space) DiffService() diffservice.DiffService { return s.diffService } +func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) { + return synctree.DeriveSyncTree(ctx, payload, s.syncService, listener, s.aclList, s.storage.CreateTreeStorage) +} + func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) { return synctree.CreateSyncTree(ctx, payload, s.syncService, listener, s.aclList, s.storage.CreateTreeStorage) } diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index d4d65733..8131db4f 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -3,6 +3,7 @@ package anySpace; option go_package = "common/commonspace/spacesyncproto"; import "pkg/acl/treechangeproto/protos/treechange.proto"; +import "pkg/acl/aclrecordproto/protos/aclrecord.proto"; enum ErrCodes { Unexpected = 0; @@ -11,6 +12,9 @@ enum ErrCodes { service Space { // HeadSync compares all objects and their hashes in a space rpc HeadSync(HeadSyncRequest) returns (HeadSyncResponse); + // PushSpace sends new space to the node + rpc PushSpace(PushSpaceRequest) returns (PushSpaceResponse); + // Stream opens object sync stream with node or client rpc Stream(stream ObjectSyncMessage) returns (stream ObjectSyncMessage); } @@ -52,9 +56,9 @@ message ObjectSyncMessage { treechange.RawTreeChangeWithId rootChange = 3; string treeId = 4; string trackingId = 5; -// -// string identity = 5; -// string peerSignature = 6; + +// string identity = 5; +// string peerSignature = 6; } // ObjectSyncContentValue provides different types for object sync @@ -88,10 +92,22 @@ message ObjectFullSyncResponse { repeated string snapshotPath = 3; } +// ObjectErrorResponse is an error sent as a response for a full sync request message ObjectErrorResponse { string error = 1; } +// PushSpaceRequest is a request to add space on a node containing only one acl record +message PushSpaceRequest { + string spaceId = 1; + SpaceHeader spaceHeader = 2; + aclrecord.RawACLRecordWithId aclRoot = 3; +} + +// PushSpaceResponse is an empty response +message PushSpaceResponse {} + +// SpaceHeader is a header for a space message SpaceHeader { bytes identity = 1; int64 timestamp = 2; diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 6cbcba84..8cffa076 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -5,6 +5,7 @@ package spacesyncproto import ( fmt "fmt" + aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" proto "github.com/gogo/protobuf/proto" io "io" @@ -690,6 +691,7 @@ func (m *ObjectFullSyncResponse) GetSnapshotPath() []string { return nil } +// ObjectErrorResponse is an error sent as a response for a full sync request type ObjectErrorResponse struct { Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` } @@ -734,6 +736,105 @@ func (m *ObjectErrorResponse) GetError() string { return "" } +// PushSpaceRequest is a request to add space on a node containing only one acl record +type PushSpaceRequest struct { + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + SpaceHeader *SpaceHeader `protobuf:"bytes,2,opt,name=spaceHeader,proto3" json:"spaceHeader,omitempty"` + AclRoot *aclrecordproto.RawACLRecordWithId `protobuf:"bytes,3,opt,name=aclRoot,proto3" json:"aclRoot,omitempty"` +} + +func (m *PushSpaceRequest) Reset() { *m = PushSpaceRequest{} } +func (m *PushSpaceRequest) String() string { return proto.CompactTextString(m) } +func (*PushSpaceRequest) ProtoMessage() {} +func (*PushSpaceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{11} +} +func (m *PushSpaceRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PushSpaceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PushSpaceRequest.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 *PushSpaceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PushSpaceRequest.Merge(m, src) +} +func (m *PushSpaceRequest) XXX_Size() int { + return m.Size() +} +func (m *PushSpaceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PushSpaceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PushSpaceRequest proto.InternalMessageInfo + +func (m *PushSpaceRequest) GetSpaceId() string { + if m != nil { + return m.SpaceId + } + return "" +} + +func (m *PushSpaceRequest) GetSpaceHeader() *SpaceHeader { + if m != nil { + return m.SpaceHeader + } + return nil +} + +func (m *PushSpaceRequest) GetAclRoot() *aclrecordproto.RawACLRecordWithId { + if m != nil { + return m.AclRoot + } + return nil +} + +// PushSpaceResponse is an empty response +type PushSpaceResponse struct { +} + +func (m *PushSpaceResponse) Reset() { *m = PushSpaceResponse{} } +func (m *PushSpaceResponse) String() string { return proto.CompactTextString(m) } +func (*PushSpaceResponse) ProtoMessage() {} +func (*PushSpaceResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{12} +} +func (m *PushSpaceResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PushSpaceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PushSpaceResponse.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 *PushSpaceResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_PushSpaceResponse.Merge(m, src) +} +func (m *PushSpaceResponse) XXX_Size() int { + return m.Size() +} +func (m *PushSpaceResponse) XXX_DiscardUnknown() { + xxx_messageInfo_PushSpaceResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_PushSpaceResponse proto.InternalMessageInfo + +// SpaceHeader is a header for a space type SpaceHeader struct { Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` @@ -746,7 +847,7 @@ func (m *SpaceHeader) Reset() { *m = SpaceHeader{} } func (m *SpaceHeader) String() string { return proto.CompactTextString(m) } func (*SpaceHeader) ProtoMessage() {} func (*SpaceHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{11} + return fileDescriptor_5855f4ef9cf24cdb, []int{13} } func (m *SpaceHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -823,6 +924,8 @@ func init() { proto.RegisterType((*ObjectFullSyncRequest)(nil), "anySpace.ObjectFullSyncRequest") proto.RegisterType((*ObjectFullSyncResponse)(nil), "anySpace.ObjectFullSyncResponse") proto.RegisterType((*ObjectErrorResponse)(nil), "anySpace.ObjectErrorResponse") + proto.RegisterType((*PushSpaceRequest)(nil), "anySpace.PushSpaceRequest") + proto.RegisterType((*PushSpaceResponse)(nil), "anySpace.PushSpaceResponse") proto.RegisterType((*SpaceHeader)(nil), "anySpace.SpaceHeader") } @@ -831,57 +934,63 @@ func init() { } var fileDescriptor_5855f4ef9cf24cdb = []byte{ - // 793 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x55, 0xcd, 0x8e, 0x1b, 0x45, - 0x10, 0x9e, 0xf1, 0x7a, 0xd7, 0x76, 0xed, 0xae, 0x63, 0x1a, 0x12, 0x06, 0x03, 0x8e, 0x99, 0x03, - 0xb2, 0x40, 0x5a, 0x23, 0x73, 0x01, 0x16, 0x09, 0x91, 0x95, 0x57, 0xb6, 0x22, 0x7e, 0xd4, 0x9b, - 0x80, 0x84, 0xb8, 0x74, 0x66, 0x2a, 0xf6, 0x90, 0x99, 0xe9, 0xa1, 0xbb, 0x4d, 0xf0, 0x13, 0x70, - 0x01, 0x09, 0xf1, 0x06, 0x3c, 0x0b, 0x17, 0x8e, 0x39, 0x72, 0x44, 0xde, 0x17, 0x41, 0x5d, 0xe3, - 0xf1, 0xd8, 0x66, 0x92, 0x1c, 0xf7, 0xe2, 0xe9, 0xaa, 0xfe, 0xbe, 0xea, 0xaf, 0xab, 0xaa, 0xcb, - 0xf0, 0x51, 0x20, 0x93, 0x44, 0xa6, 0xc3, 0xfc, 0xa3, 0x33, 0x11, 0xe0, 0x90, 0x7e, 0xf5, 0x32, - 0x0d, 0x32, 0x25, 0x8d, 0x1c, 0xd2, 0xaf, 0x2e, 0xbd, 0x67, 0xe4, 0x60, 0x4d, 0x91, 0x2e, 0xaf, - 0xac, 0xaf, 0x3b, 0xcc, 0x9e, 0xcc, 0x86, 0x22, 0x88, 0x87, 0x46, 0x21, 0x06, 0x73, 0x91, 0xce, - 0x70, 0x87, 0x59, 0xba, 0x73, 0xaa, 0x3f, 0x85, 0xd3, 0x09, 0x8a, 0xf0, 0x6a, 0x99, 0x06, 0xdc, - 0xba, 0x19, 0x83, 0xfa, 0x63, 0x25, 0x13, 0xcf, 0xed, 0xbb, 0x83, 0x3a, 0xa7, 0x35, 0x6b, 0x43, - 0xcd, 0x48, 0xaf, 0x46, 0x9e, 0x9a, 0x91, 0xec, 0x35, 0x38, 0x8c, 0xa3, 0x24, 0x32, 0xde, 0x41, - 0xdf, 0x1d, 0x9c, 0xf2, 0xdc, 0xf0, 0x9f, 0x42, 0x7b, 0x13, 0x0a, 0xf5, 0x22, 0x36, 0x36, 0xd6, - 0x5c, 0xe8, 0x39, 0xc5, 0x3a, 0xe1, 0xb4, 0x66, 0xe7, 0xd0, 0xc4, 0x18, 0x13, 0x4c, 0x8d, 0xf6, - 0x6a, 0xfd, 0x83, 0xc1, 0xf1, 0xe8, 0xee, 0x59, 0x21, 0xff, 0x6c, 0x97, 0x3f, 0xce, 0x71, 0x7c, - 0x43, 0xb0, 0x07, 0x07, 0x72, 0x91, 0x6e, 0x0e, 0x26, 0xc3, 0x3f, 0x87, 0xdb, 0x95, 0x44, 0xab, - 0x3b, 0x0a, 0xe9, 0xf4, 0x16, 0xaf, 0x45, 0x21, 0xe9, 0x41, 0x11, 0xd2, 0x4d, 0x5a, 0x9c, 0xd6, - 0xfe, 0xf7, 0x70, 0xab, 0x24, 0xff, 0xb8, 0x40, 0x6d, 0x98, 0x07, 0x0d, 0xca, 0xf0, 0xb4, 0xe0, - 0x16, 0x26, 0x1b, 0xc2, 0x91, 0xb2, 0x59, 0x2a, 0xa4, 0xbf, 0x5e, 0x21, 0xdd, 0xee, 0xf3, 0x35, - 0xcc, 0xbf, 0x84, 0xce, 0x96, 0xb4, 0x4c, 0xa6, 0x1a, 0xd9, 0x08, 0x1a, 0x8a, 0x64, 0x6a, 0xcf, - 0xa5, 0x28, 0xde, 0xf3, 0x12, 0xc0, 0x0b, 0xa0, 0xbf, 0x72, 0xe1, 0x95, 0xaf, 0x1e, 0xfd, 0x80, - 0x81, 0xb1, 0xbb, 0x5f, 0xa0, 0xd6, 0x62, 0x86, 0x2f, 0x10, 0xfa, 0x09, 0x34, 0x02, 0x99, 0x1a, - 0x4c, 0x0d, 0x5d, 0xf6, 0x78, 0xd4, 0x2f, 0xcf, 0x28, 0xe3, 0x5c, 0xe4, 0x90, 0x6f, 0x44, 0xbc, - 0x40, 0x5e, 0x10, 0xd8, 0x67, 0x00, 0x4a, 0x4a, 0x73, 0x41, 0x6d, 0x42, 0x99, 0xb6, 0x35, 0xda, - 0xea, 0x1c, 0x2e, 0x9e, 0x3e, 0x50, 0x88, 0x39, 0xe0, 0xdb, 0xc8, 0xcc, 0xa7, 0x21, 0xdf, 0xa2, - 0xb0, 0x3b, 0x70, 0x64, 0xd1, 0xd3, 0xd0, 0xab, 0x93, 0xaa, 0xb5, 0xc5, 0x7a, 0x00, 0x46, 0x89, - 0xe0, 0x49, 0x94, 0xce, 0xa6, 0xa1, 0x77, 0x48, 0x7b, 0x5b, 0x1e, 0xff, 0xaf, 0x1a, 0xdc, 0xa9, - 0x16, 0xc7, 0x3e, 0x05, 0xb0, 0xd5, 0x7a, 0x98, 0x85, 0xc2, 0x20, 0x5d, 0xf6, 0x78, 0xd4, 0xdd, - 0xbf, 0xd2, 0x64, 0x83, 0x98, 0x38, 0x7c, 0x0b, 0xcf, 0xee, 0xc3, 0xad, 0xc7, 0x8b, 0x38, 0xde, - 0xaa, 0xf1, 0x3a, 0x2b, 0x77, 0xf7, 0x43, 0x5c, 0xee, 0xc2, 0x26, 0x0e, 0xdf, 0x67, 0xb2, 0x2f, - 0xa1, 0x53, 0xba, 0xf2, 0x92, 0xae, 0x93, 0xd4, 0x7f, 0x7e, 0xb4, 0x1c, 0x37, 0x71, 0xf8, 0xff, - 0xb8, 0x6c, 0x0c, 0xa7, 0xa8, 0x94, 0x54, 0x9b, 0x60, 0x75, 0x0a, 0xf6, 0xf6, 0x7e, 0xb0, 0xf1, - 0x36, 0x68, 0xe2, 0xf0, 0x5d, 0xd6, 0xbd, 0x06, 0x1c, 0xfe, 0x64, 0x53, 0xe5, 0xff, 0xe2, 0x42, - 0x67, 0x3f, 0x1f, 0xf6, 0xe1, 0xd8, 0x7c, 0xe4, 0x1d, 0xd7, 0xe2, 0xb9, 0xc1, 0x3e, 0x86, 0x46, - 0x5e, 0xd2, 0xf2, 0x29, 0xbe, 0xa4, 0xcc, 0x05, 0x9e, 0xf9, 0x70, 0xa2, 0x53, 0x91, 0xe9, 0xb9, - 0x34, 0x5f, 0x0b, 0x33, 0xf7, 0x0e, 0x28, 0xee, 0x8e, 0xcf, 0xff, 0xd5, 0x85, 0xdb, 0x95, 0x69, - 0xbd, 0x19, 0x39, 0xbf, 0xb9, 0x45, 0x7b, 0xed, 0xd7, 0xe5, 0x66, 0xf4, 0xbc, 0x0f, 0xaf, 0x56, - 0x54, 0xd6, 0x6a, 0xa1, 0xca, 0xae, 0x9f, 0x74, 0x6e, 0xf8, 0x7f, 0xba, 0x70, 0x4c, 0xdd, 0x60, - 0x8b, 0x8a, 0x8a, 0x75, 0xa1, 0x19, 0x85, 0x98, 0x9a, 0xc8, 0x2c, 0xd7, 0xe3, 0x75, 0x63, 0xb3, - 0xb7, 0xa0, 0x65, 0xa2, 0x04, 0xb5, 0x11, 0x49, 0x46, 0x8d, 0x7e, 0xc0, 0x4b, 0x87, 0xdd, 0xa5, - 0x29, 0xf1, 0x60, 0x99, 0xe5, 0x8d, 0xdb, 0xe2, 0xa5, 0x83, 0xbd, 0x0b, 0x6d, 0x85, 0x59, 0x1c, - 0x05, 0xc2, 0x44, 0x32, 0xbd, 0x8f, 0x4b, 0x6a, 0xc7, 0x3a, 0xdf, 0xf3, 0xda, 0x51, 0xaa, 0x11, - 0xf3, 0x57, 0x7c, 0xc2, 0x69, 0xfd, 0x5e, 0x17, 0x9a, 0x63, 0xa5, 0x2e, 0x64, 0x88, 0x9a, 0xb5, - 0x01, 0x1e, 0xa6, 0xf8, 0x73, 0x86, 0x81, 0xc1, 0xb0, 0xe3, 0x8c, 0xfe, 0x70, 0xe1, 0x90, 0xf4, - 0xb3, 0xcf, 0xa1, 0x59, 0x4c, 0x39, 0xf6, 0x46, 0xd5, 0xe4, 0xa3, 0x16, 0xe9, 0x76, 0x2b, 0x87, - 0x62, 0x9e, 0xa2, 0x4b, 0x38, 0xba, 0x32, 0x0a, 0x45, 0xc2, 0xde, 0xac, 0x1a, 0x6b, 0xeb, 0xf1, - 0xd8, 0x7d, 0xd1, 0xe6, 0xc0, 0xfd, 0xc0, 0xbd, 0x77, 0xfe, 0xf7, 0xaa, 0xe7, 0x3e, 0x5b, 0xf5, - 0xdc, 0x7f, 0x57, 0x3d, 0xf7, 0xf7, 0xeb, 0x9e, 0xf3, 0xec, 0xba, 0xe7, 0xfc, 0x73, 0xdd, 0x73, - 0xbe, 0x7b, 0xe7, 0xa5, 0xff, 0xc5, 0x8f, 0x8e, 0xe8, 0xf3, 0xe1, 0x7f, 0x01, 0x00, 0x00, 0xff, - 0xff, 0x33, 0xca, 0x5b, 0xe5, 0xb7, 0x07, 0x00, 0x00, + // 887 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xf7, 0x3a, 0x4e, 0x6c, 0x3f, 0x27, 0xa9, 0x3b, 0x25, 0x65, 0x71, 0xa9, 0x6b, 0xf6, 0x80, + 0x22, 0x10, 0x31, 0x32, 0x87, 0x02, 0x41, 0x42, 0x6d, 0x48, 0x64, 0xab, 0xfc, 0xa9, 0x26, 0x2d, + 0x48, 0x88, 0xcb, 0x74, 0xf7, 0x35, 0x5e, 0xba, 0xde, 0x59, 0x66, 0xc7, 0x04, 0x7f, 0x02, 0x2e, + 0x20, 0xf1, 0x09, 0x90, 0xf8, 0x2c, 0x5c, 0x38, 0xf6, 0xd8, 0x23, 0x4a, 0xbe, 0x08, 0x9a, 0x37, + 0xbb, 0xde, 0xb5, 0xd9, 0x36, 0xc7, 0x5e, 0xbc, 0xf3, 0xde, 0xfb, 0xbd, 0x37, 0xbf, 0xf7, 0x67, + 0x66, 0x0c, 0x1f, 0xfb, 0x72, 0x36, 0x93, 0xf1, 0xd0, 0x7e, 0xd2, 0x44, 0xf8, 0x38, 0xa4, 0xdf, + 0x74, 0x11, 0xfb, 0x89, 0x92, 0x5a, 0x0e, 0xe9, 0x37, 0x2d, 0xb4, 0x07, 0xa4, 0x60, 0x2d, 0x11, + 0x2f, 0x4e, 0x8d, 0xae, 0x37, 0x4c, 0x9e, 0x9d, 0x0d, 0x85, 0x1f, 0x0d, 0xb5, 0x42, 0xf4, 0xa7, + 0x22, 0x3e, 0xc3, 0x15, 0xcf, 0x42, 0x6d, 0x5d, 0x7b, 0x1f, 0xe4, 0x0e, 0xc2, 0x8f, 0x14, 0xfa, + 0x52, 0x05, 0x2b, 0xf8, 0xa5, 0xd6, 0xc2, 0xbd, 0x09, 0xec, 0x8c, 0x51, 0x04, 0xa7, 0x8b, 0xd8, + 0xe7, 0x26, 0x0a, 0x63, 0xd0, 0x78, 0xaa, 0xe4, 0xcc, 0x75, 0x06, 0xce, 0x7e, 0x83, 0xd3, 0x9a, + 0xed, 0x42, 0x5d, 0x4b, 0xb7, 0x4e, 0x9a, 0xba, 0x96, 0xec, 0x0d, 0xd8, 0x8c, 0xc2, 0x59, 0xa8, + 0xdd, 0x8d, 0x81, 0xb3, 0xbf, 0xc3, 0xad, 0xe0, 0x9d, 0xc3, 0xee, 0x32, 0x14, 0xa6, 0xf3, 0x48, + 0x9b, 0x58, 0x53, 0x91, 0x4e, 0x29, 0xd6, 0x36, 0xa7, 0x35, 0x3b, 0x84, 0x16, 0x46, 0x38, 0xc3, + 0x58, 0xa7, 0x6e, 0x7d, 0xb0, 0xb1, 0xdf, 0x19, 0xdd, 0x39, 0xc8, 0xb3, 0x3d, 0x58, 0xf5, 0x3f, + 0xb6, 0x38, 0xbe, 0x74, 0x30, 0x1b, 0xfb, 0x72, 0x1e, 0x2f, 0x37, 0x26, 0xc1, 0x3b, 0x84, 0xbd, + 0x4a, 0x47, 0xc3, 0x3b, 0x0c, 0x68, 0xf7, 0x36, 0xaf, 0x87, 0x01, 0xf1, 0x41, 0x11, 0x50, 0x26, + 0x6d, 0x4e, 0x6b, 0xef, 0x07, 0xb8, 0x56, 0x38, 0xff, 0x34, 0xc7, 0x54, 0x33, 0x17, 0x9a, 0xd4, + 0x90, 0x49, 0xee, 0x9b, 0x8b, 0x6c, 0x08, 0x5b, 0xca, 0x54, 0x29, 0xa7, 0xfe, 0x66, 0x05, 0x75, + 0x63, 0xe7, 0x19, 0xcc, 0x3b, 0x81, 0x6e, 0x89, 0x5a, 0x22, 0xe3, 0x14, 0xd9, 0x08, 0x9a, 0x8a, + 0x68, 0xa6, 0xae, 0x43, 0x51, 0xdc, 0x97, 0x15, 0x80, 0xe7, 0x40, 0xef, 0xc2, 0x81, 0xeb, 0xdf, + 0x3c, 0xf9, 0x11, 0x7d, 0x6d, 0xac, 0x5f, 0x61, 0x9a, 0x8a, 0x33, 0x7c, 0x05, 0xd1, 0x4f, 0xa1, + 0xe9, 0xcb, 0x58, 0x63, 0xac, 0x29, 0xd9, 0xce, 0x68, 0x50, 0xec, 0x51, 0xc4, 0x39, 0xb2, 0x90, + 0x6f, 0x45, 0x34, 0x47, 0x9e, 0x3b, 0xb0, 0xcf, 0x01, 0x94, 0x94, 0xfa, 0x88, 0xa6, 0x8a, 0x2a, + 0x6d, 0x7a, 0x54, 0x1a, 0x34, 0x2e, 0xce, 0x1f, 0x29, 0x44, 0x0b, 0xf8, 0x2e, 0xd4, 0xd3, 0x49, + 0xc0, 0x4b, 0x2e, 0xec, 0x26, 0x6c, 0x19, 0xf4, 0x24, 0x70, 0x1b, 0xc4, 0x2a, 0x93, 0x58, 0x1f, + 0x40, 0x2b, 0xe1, 0x3f, 0x0b, 0xe3, 0xb3, 0x49, 0xe0, 0x6e, 0x92, 0xad, 0xa4, 0xf1, 0xfe, 0xae, + 0xc3, 0xcd, 0x6a, 0x72, 0xec, 0x33, 0x00, 0xd3, 0xad, 0xc7, 0x49, 0x20, 0x34, 0x52, 0xb2, 0x9d, + 0x51, 0x6f, 0x3d, 0xa5, 0xf1, 0x12, 0x31, 0xae, 0xf1, 0x12, 0x9e, 0x3d, 0x80, 0x6b, 0x4f, 0xe7, + 0x51, 0x54, 0xea, 0x71, 0x56, 0x95, 0x3b, 0xeb, 0x21, 0x4e, 0x56, 0x61, 0xe3, 0x1a, 0x5f, 0xf7, + 0x64, 0x5f, 0x43, 0xb7, 0x50, 0xd9, 0x96, 0x66, 0x45, 0x1a, 0xbc, 0x3c, 0x9a, 0xc5, 0x8d, 0x6b, + 0xfc, 0x7f, 0xbe, 0xec, 0x18, 0x76, 0x50, 0x29, 0xa9, 0x96, 0xc1, 0x1a, 0x14, 0xec, 0xf6, 0x7a, + 0xb0, 0xe3, 0x32, 0x68, 0x5c, 0xe3, 0xab, 0x5e, 0xf7, 0x9b, 0xb0, 0xf9, 0xb3, 0x29, 0x95, 0xf7, + 0xab, 0x03, 0xdd, 0xf5, 0x7a, 0x98, 0x83, 0x63, 0xea, 0x61, 0x27, 0xae, 0xcd, 0xad, 0xc0, 0x3e, + 0x81, 0xa6, 0x6d, 0x69, 0x71, 0x14, 0xaf, 0x68, 0x73, 0x8e, 0x67, 0x1e, 0x6c, 0xa7, 0xb1, 0x48, + 0xd2, 0xa9, 0xd4, 0x0f, 0x85, 0x9e, 0xba, 0x1b, 0x14, 0x77, 0x45, 0xe7, 0xfd, 0xe6, 0xc0, 0x5e, + 0x65, 0x59, 0x5f, 0x0f, 0x9d, 0xdf, 0x9d, 0x7c, 0xbc, 0xd6, 0xfb, 0xf2, 0x7a, 0xf8, 0xbc, 0x0f, + 0x37, 0x2a, 0x3a, 0x6b, 0xb8, 0x50, 0x67, 0xb3, 0x23, 0x6d, 0x05, 0xef, 0x4f, 0x07, 0xba, 0x0f, + 0xe7, 0xe9, 0x94, 0x26, 0xe2, 0xea, 0x8b, 0xea, 0x2e, 0x74, 0x68, 0x69, 0x46, 0x00, 0x55, 0x36, + 0xed, 0x7b, 0xc5, 0x48, 0x9d, 0x16, 0x46, 0x5e, 0x46, 0xb2, 0xbb, 0xd0, 0x14, 0x7e, 0xc4, 0xa5, + 0xd4, 0xd9, 0x50, 0xdf, 0x3e, 0x28, 0x9e, 0x0c, 0x2e, 0xce, 0xef, 0x1d, 0x7d, 0xc9, 0x49, 0xc8, + 0x33, 0xce, 0xd0, 0xde, 0x0d, 0xb8, 0x5e, 0xe2, 0x67, 0x73, 0xf1, 0xfe, 0x72, 0xa0, 0x53, 0xda, + 0x8a, 0xf5, 0xa0, 0x15, 0x06, 0x18, 0xeb, 0x50, 0x2f, 0xb2, 0x47, 0x61, 0x29, 0xb3, 0xb7, 0xa1, + 0xad, 0xc3, 0x19, 0xa6, 0x5a, 0xcc, 0x12, 0x22, 0xbc, 0xc1, 0x0b, 0x85, 0xb1, 0x12, 0xcd, 0x47, + 0x8b, 0xc4, 0x1e, 0xb7, 0x36, 0x2f, 0x14, 0xec, 0x5d, 0xd8, 0x55, 0x98, 0x44, 0xa1, 0x2f, 0x74, + 0x28, 0xe3, 0x07, 0xb8, 0xa0, 0x43, 0xd4, 0xe0, 0x6b, 0x5a, 0xf3, 0x00, 0xa4, 0x88, 0xf6, 0xee, + 0xd9, 0xe6, 0xb4, 0x7e, 0xaf, 0x07, 0xad, 0x63, 0xa5, 0x8e, 0x64, 0x80, 0x29, 0xdb, 0x05, 0x78, + 0x1c, 0xe3, 0x2f, 0x09, 0xfa, 0x1a, 0x83, 0x6e, 0x6d, 0xf4, 0xc2, 0x81, 0x4d, 0xe2, 0xcf, 0xee, + 0x41, 0x2b, 0xbf, 0x9b, 0xd9, 0x5b, 0x55, 0xf7, 0x35, 0x75, 0xa4, 0xd7, 0xab, 0xbc, 0xca, 0x6d, + 0x63, 0xbf, 0x80, 0xf6, 0xb2, 0x42, 0xac, 0x04, 0x5c, 0x6f, 0x6b, 0xef, 0x56, 0xa5, 0x2d, 0x8b, + 0x72, 0x02, 0x5b, 0xa7, 0x5a, 0xa1, 0x98, 0xb1, 0x5b, 0x55, 0x57, 0x7a, 0xf6, 0x34, 0xf4, 0x5e, + 0x65, 0xdc, 0x77, 0x3e, 0x74, 0xee, 0x1f, 0xfe, 0x73, 0xd1, 0x77, 0x9e, 0x5f, 0xf4, 0x9d, 0x7f, + 0x2f, 0xfa, 0xce, 0x1f, 0x97, 0xfd, 0xda, 0xf3, 0xcb, 0x7e, 0xed, 0xc5, 0x65, 0xbf, 0xf6, 0xfd, + 0x3b, 0x57, 0xfe, 0x6d, 0x79, 0xb2, 0x45, 0x9f, 0x8f, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x7d, + 0x4c, 0x93, 0xdc, 0xe2, 0x08, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { @@ -1468,6 +1577,83 @@ func (m *ObjectErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PushSpaceRequest) 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 *PushSpaceRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PushSpaceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.AclRoot != nil { + { + size, err := m.AclRoot.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.SpaceHeader != nil { + { + size, err := m.SpaceHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.SpaceId) > 0 { + i -= len(m.SpaceId) + copy(dAtA[i:], m.SpaceId) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SpaceId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PushSpaceResponse) 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 *PushSpaceResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PushSpaceResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func (m *SpaceHeader) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1807,6 +1993,36 @@ func (m *ObjectErrorResponse) Size() (n int) { return n } +func (m *PushSpaceRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpaceId) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + if m.SpaceHeader != nil { + l = m.SpaceHeader.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + if m.AclRoot != nil { + l = m.AclRoot.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} + +func (m *PushSpaceResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func (m *SpaceHeader) Size() (n int) { if m == nil { return 0 @@ -3332,6 +3548,210 @@ func (m *ObjectErrorResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *PushSpaceRequest) 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 ErrIntOverflowSpacesync + } + 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: PushSpaceRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PushSpaceRequest: 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 ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + 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 SpaceHeader", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SpaceHeader == nil { + m.SpaceHeader = &SpaceHeader{} + } + if err := m.SpaceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AclRoot", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AclRoot == nil { + m.AclRoot = &aclrecordproto.RawACLRecordWithId{} + } + if err := m.AclRoot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PushSpaceResponse) 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 ErrIntOverflowSpacesync + } + 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: PushSpaceResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PushSpaceResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *SpaceHeader) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/common/commonspace/spacesyncproto/spacesync_drpc.pb.go b/common/commonspace/spacesyncproto/spacesync_drpc.pb.go index 9f984b1e..d17223ae 100644 --- a/common/commonspace/spacesyncproto/spacesync_drpc.pb.go +++ b/common/commonspace/spacesyncproto/spacesync_drpc.pb.go @@ -41,6 +41,7 @@ type DRPCSpaceClient interface { DRPCConn() drpc.Conn HeadSync(ctx context.Context, in *HeadSyncRequest) (*HeadSyncResponse, error) + PushSpace(ctx context.Context, in *PushSpaceRequest) (*PushSpaceResponse, error) Stream(ctx context.Context) (DRPCSpace_StreamClient, error) } @@ -63,6 +64,15 @@ func (c *drpcSpaceClient) HeadSync(ctx context.Context, in *HeadSyncRequest) (*H return out, nil } +func (c *drpcSpaceClient) PushSpace(ctx context.Context, in *PushSpaceRequest) (*PushSpaceResponse, error) { + out := new(PushSpaceResponse) + err := c.cc.Invoke(ctx, "/anySpace.Space/PushSpace", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}, in, out) + if err != nil { + return nil, err + } + return out, nil +} + func (c *drpcSpaceClient) Stream(ctx context.Context) (DRPCSpace_StreamClient, error) { stream, err := c.cc.NewStream(ctx, "/anySpace.Space/Stream", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) if err != nil { @@ -100,6 +110,7 @@ func (x *drpcSpace_StreamClient) RecvMsg(m *ObjectSyncMessage) error { type DRPCSpaceServer interface { HeadSync(context.Context, *HeadSyncRequest) (*HeadSyncResponse, error) + PushSpace(context.Context, *PushSpaceRequest) (*PushSpaceResponse, error) Stream(DRPCSpace_StreamStream) error } @@ -109,13 +120,17 @@ func (s *DRPCSpaceUnimplementedServer) HeadSync(context.Context, *HeadSyncReques return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) } +func (s *DRPCSpaceUnimplementedServer) PushSpace(context.Context, *PushSpaceRequest) (*PushSpaceResponse, error) { + return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) +} + func (s *DRPCSpaceUnimplementedServer) Stream(DRPCSpace_StreamStream) error { return drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) } type DRPCSpaceDescription struct{} -func (DRPCSpaceDescription) NumMethods() int { return 2 } +func (DRPCSpaceDescription) NumMethods() int { return 3 } func (DRPCSpaceDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { switch n { @@ -129,6 +144,15 @@ func (DRPCSpaceDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, ) }, DRPCSpaceServer.HeadSync, true case 1: + return "/anySpace.Space/PushSpace", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}, + func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { + return srv.(DRPCSpaceServer). + PushSpace( + ctx, + in1.(*PushSpaceRequest), + ) + }, DRPCSpaceServer.PushSpace, true + case 2: return "/anySpace.Space/Stream", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}, func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { return nil, srv.(DRPCSpaceServer). @@ -161,6 +185,22 @@ func (x *drpcSpace_HeadSyncStream) SendAndClose(m *HeadSyncResponse) error { return x.CloseSend() } +type DRPCSpace_PushSpaceStream interface { + drpc.Stream + SendAndClose(*PushSpaceResponse) error +} + +type drpcSpace_PushSpaceStream struct { + drpc.Stream +} + +func (x *drpcSpace_PushSpaceStream) SendAndClose(m *PushSpaceResponse) error { + if err := x.MsgSend(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { + return err + } + return x.CloseSend() +} + type DRPCSpace_StreamStream interface { drpc.Stream Send(*ObjectSyncMessage) error diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index fb67e1df..d2869680 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -1,12 +1,27 @@ package storage import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" ) const CName = "commonspace.storage" -type Storage interface { +type SpaceStorage interface { storage.Provider StoredIds() ([]string, error) } + +type SpaceStorageCreatePayload struct { + RecWithId *aclrecordproto.RawACLRecordWithId + SpaceHeader *spacesyncproto.SpaceHeader + Id string +} + +type SpaceStorageProvider interface { + app.Component + SpaceStorage(id string) (SpaceStorage, error) + CreateSpaceStorage(payload SpaceStorageCreatePayload) (SpaceStorage, error) +} diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index ecf43dfe..4ba8c08b 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -101,7 +101,8 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { if err != nil { continue } - + // sending empty message for the server to understand from which space is it coming + stream.Send(&spacesyncproto.ObjectSyncMessage{SpaceId: s.spaceId}) s.streamPool.AddAndReadStreamAsync(stream) } } diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 68ea48f4..a339b6fb 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -22,6 +22,30 @@ type SyncTree struct { listener UpdateListener } +func DeriveSyncTree( + ctx context.Context, + payload tree.ObjectTreeCreatePayload, + syncService syncservice.SyncService, + listener UpdateListener, + aclList list.ACLList, + createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { + t, err = tree.CreateDerivedObjectTree(payload, aclList, createStorage) + if err != nil { + return + } + t = &SyncTree{ + ObjectTree: t, + syncService: syncService, + listener: listener, + } + + err = syncService.NotifyHeadUpdate(ctx, t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{ + Heads: t.Heads(), + SnapshotPath: t.SnapshotPath(), + }) + return +} + func CreateSyncTree( ctx context.Context, payload tree.ObjectTreeCreatePayload, diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go index 082e7b90..1c4e49d7 100644 --- a/node/nodespace/rpchandler.go +++ b/node/nodespace/rpchandler.go @@ -9,6 +9,10 @@ type rpcHandler struct { s *service } +func (r *rpcHandler) PushSpace(ctx context.Context, request *spacesyncproto.PushSpaceRequest) (*spacesyncproto.PushSpaceResponse, error) { + return nil, nil +} + func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) { sp, err := r.s.GetSpace(ctx, req.SpaceId) if err != nil { diff --git a/node/nodespace/service.go b/node/nodespace/service.go index 9602a18b..9b3990c8 100644 --- a/node/nodespace/service.go +++ b/node/nodespace/service.go @@ -9,7 +9,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace/nodecache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "time" ) @@ -38,11 +37,7 @@ func (s *service) Init(a *app.App) (err error) { s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service) s.spaceCache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { - deps := commonspace.SpaceDeps{ - Cache: nodecache.NewNodeCache(s.conf.GCTTL), - Storage: storage.NewInMemoryTreeStorageProvider(), - } - return s.commonSpace.CreateSpace(ctx, id, deps) + return s.commonSpace.GetSpace(ctx, id, nodecache.NewNodeCache(s.conf.GCTTL)) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), diff --git a/pkg/acl/tree/changebuilder.go b/pkg/acl/tree/changebuilder.go index 1a2e207b..885dff34 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/pkg/acl/tree/changebuilder.go @@ -32,6 +32,7 @@ type InitialContent struct { SpaceId string Seed []byte ChangeType string + Timestamp int64 } type ChangeBuilder interface { @@ -100,7 +101,7 @@ func (c *changeBuilder) SetRootRawChange(rawIdChange *treechangeproto.RawTreeCha func (c *changeBuilder) BuildInitialContent(payload InitialContent) (ch *Change, rawIdChange *treechangeproto.RawTreeChangeWithId, err error) { change := &treechangeproto.RootChange{ AclHeadId: payload.AclHeadId, - Timestamp: int64(time.Now().Nanosecond()), + Timestamp: payload.Timestamp, Identity: payload.Identity, ChangeType: payload.ChangeType, SpaceId: payload.SpaceId, diff --git a/pkg/acl/tree/objecttreefactory.go b/pkg/acl/tree/objecttreefactory.go index 3a65fde8..61631412 100644 --- a/pkg/acl/tree/objecttreefactory.go +++ b/pkg/acl/tree/objecttreefactory.go @@ -8,12 +8,13 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" "go.uber.org/zap" + "math/rand" + "time" ) type ObjectTreeCreatePayload struct { SignKey signingkey.PrivKey ChangeType string - Seed []byte SpaceId string Identity []byte } @@ -27,10 +28,31 @@ func BuildObjectTree(treeStorage storage.TreeStorage, aclList list.ACLList) (Obj return buildObjectTree(deps) } +func CreateDerivedObjectTree( + payload ObjectTreeCreatePayload, + aclList list.ACLList, + createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + return createObjectTree(payload, 0, nil, aclList, createStorage) +} + func CreateObjectTree( payload ObjectTreeCreatePayload, aclList list.ACLList, createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + bytes := make([]byte, 32) + _, err = rand.Read(bytes) + if err != nil { + return + } + return createObjectTree(payload, time.Now().UnixNano(), bytes, aclList, createStorage) +} + +func createObjectTree( + payload ObjectTreeCreatePayload, + timestamp int64, + seed []byte, + aclList list.ACLList, + createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { aclList.RLock() var ( deps = defaultObjectTreeDeps(nil, nil, aclList) @@ -46,8 +68,9 @@ func CreateObjectTree( Identity: payload.Identity, SigningKey: payload.SignKey, SpaceId: payload.SpaceId, - Seed: payload.Seed, ChangeType: payload.ChangeType, + Timestamp: timestamp, + Seed: seed, } _, raw, err := deps.changeBuilder.BuildInitialContent(cnt) From 9be23b4ff7a148a4bceb5e6a6cf2ee5bb1130e12 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 28 Sep 2022 09:18:04 +0200 Subject: [PATCH 095/219] Add push space logic and change storage interface --- common/commonspace/diffservice/diffservice.go | 38 +++++- common/commonspace/space.go | 2 +- common/commonspace/spacesyncproto/errors.go | 13 ++ .../spacesyncproto/protos/spacesync.proto | 2 + .../spacesyncproto/spacesync.pb.go | 127 +++++++++--------- common/commonspace/storage/storage.go | 2 + common/commonspace/syncservice/syncservice.go | 2 + node/nodespace/rpchandler.go | 24 +++- node/nodespace/service.go | 9 +- pkg/acl/storage/inmemory.go | 29 +--- pkg/acl/storage/provider.go | 9 +- 11 files changed, 150 insertions(+), 107 deletions(-) create mode 100644 common/commonspace/spacesyncproto/errors.go diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index 71cf36ce..45ad5e0a 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -7,8 +7,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "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" - treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" "go.uber.org/zap" "strings" @@ -100,8 +100,12 @@ func (d *diffService) syncWithPeer(ctx context.Context, p peer.Peer) (err error) cl := spacesyncproto.NewDRPCSpaceClient(p) rdiff := remotediff.NewRemoteDiff(d.spaceId, cl) newIds, changedIds, removedIds, err := d.diff.Diff(ctx, rdiff) - if err != nil { - return nil + err = rpcerr.Unwrap(err) + if err != nil && err != spacesyncproto.ErrSpaceMissing { + return err + } + if err == spacesyncproto.ErrSpaceMissing { + return d.sendPushSpaceRequest(ctx, cl) } d.pingTreesInCache(ctx, newIds) @@ -122,11 +126,11 @@ func (d *diffService) pingTreesInCache(ctx context.Context, trees []string) { func (d *diffService) fillDiff(objectIds []string) { var els = make([]ldiff.Element, 0, len(objectIds)) for _, id := range objectIds { - st, err := d.storage.Storage(id) + st, err := d.storage.TreeStorage(id) if err != nil { continue } - heads, err := st.(treestorage.TreeStorage).Heads() + heads, err := st.Heads() if err != nil { continue } @@ -138,6 +142,30 @@ func (d *diffService) fillDiff(objectIds []string) { d.diff.Set(els...) } +func (d *diffService) sendPushSpaceRequest(ctx context.Context, cl spacesyncproto.DRPCSpaceClient) (err error) { + aclStorage, err := d.storage.ACLStorage() + if err != nil { + return + } + + root, err := aclStorage.Root() + if err != nil { + return + } + + header, err := d.storage.SpaceHeader() + if err != nil { + return + } + + _, err = cl.PushSpace(ctx, &spacesyncproto.PushSpaceRequest{ + SpaceId: d.spaceId, + SpaceHeader: header, + AclRoot: root, + }) + return +} + func concatStrings(strs []string) string { var ( b strings.Builder diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 31c2fdfa..50f0dfc9 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -114,7 +114,7 @@ func (s *space) BuildTree(ctx context.Context, id string, listener synctree.Upda ) } - store, err := s.storage.Storage(id) + store, err := s.storage.TreeStorage(id) if err != nil && err != treestorage.ErrUnknownTreeId { return } diff --git a/common/commonspace/spacesyncproto/errors.go b/common/commonspace/spacesyncproto/errors.go new file mode 100644 index 00000000..2011bf9c --- /dev/null +++ b/common/commonspace/spacesyncproto/errors.go @@ -0,0 +1,13 @@ +package spacesyncproto + +import ( + "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpcerr" +) + +var ( + errGroup = rpcerr.ErrGroup(ErrCodes_ErrorOffset) + + ErrUnexpected = errGroup.Register(errors.New("Unexpected error"), uint64(ErrCodes_Unexpected)) + ErrSpaceMissing = errGroup.Register(errors.New("Space is missing"), uint64(ErrCodes_SpaceMissing)) +) diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index 8131db4f..4d834c17 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -7,6 +7,8 @@ import "pkg/acl/aclrecordproto/protos/aclrecord.proto"; enum ErrCodes { Unexpected = 0; + SpaceMissing = 1; + ErrorOffset = 16; } service Space { diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 8cffa076..f629510d 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -27,15 +27,21 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type ErrCodes int32 const ( - ErrCodes_Unexpected ErrCodes = 0 + ErrCodes_Unexpected ErrCodes = 0 + ErrCodes_SpaceMissing ErrCodes = 1 + ErrCodes_ErrorOffset ErrCodes = 16 ) var ErrCodes_name = map[int32]string{ - 0: "Unexpected", + 0: "Unexpected", + 1: "SpaceMissing", + 16: "ErrorOffset", } var ErrCodes_value = map[string]int32{ - "Unexpected": 0, + "Unexpected": 0, + "SpaceMissing": 1, + "ErrorOffset": 16, } func (x ErrCodes) String() string { @@ -934,63 +940,64 @@ func init() { } var fileDescriptor_5855f4ef9cf24cdb = []byte{ - // 887 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xf7, 0x3a, 0x4e, 0x6c, 0x3f, 0x27, 0xa9, 0x3b, 0x25, 0x65, 0x71, 0xa9, 0x6b, 0xf6, 0x80, - 0x22, 0x10, 0x31, 0x32, 0x87, 0x02, 0x41, 0x42, 0x6d, 0x48, 0x64, 0xab, 0xfc, 0xa9, 0x26, 0x2d, - 0x48, 0x88, 0xcb, 0x74, 0xf7, 0x35, 0x5e, 0xba, 0xde, 0x59, 0x66, 0xc7, 0x04, 0x7f, 0x02, 0x2e, - 0x20, 0xf1, 0x09, 0x90, 0xf8, 0x2c, 0x5c, 0x38, 0xf6, 0xd8, 0x23, 0x4a, 0xbe, 0x08, 0x9a, 0x37, - 0xbb, 0xde, 0xb5, 0xd9, 0x36, 0xc7, 0x5e, 0xbc, 0xf3, 0xde, 0xfb, 0xbd, 0x37, 0xbf, 0xf7, 0x67, - 0x66, 0x0c, 0x1f, 0xfb, 0x72, 0x36, 0x93, 0xf1, 0xd0, 0x7e, 0xd2, 0x44, 0xf8, 0x38, 0xa4, 0xdf, - 0x74, 0x11, 0xfb, 0x89, 0x92, 0x5a, 0x0e, 0xe9, 0x37, 0x2d, 0xb4, 0x07, 0xa4, 0x60, 0x2d, 0x11, - 0x2f, 0x4e, 0x8d, 0xae, 0x37, 0x4c, 0x9e, 0x9d, 0x0d, 0x85, 0x1f, 0x0d, 0xb5, 0x42, 0xf4, 0xa7, - 0x22, 0x3e, 0xc3, 0x15, 0xcf, 0x42, 0x6d, 0x5d, 0x7b, 0x1f, 0xe4, 0x0e, 0xc2, 0x8f, 0x14, 0xfa, - 0x52, 0x05, 0x2b, 0xf8, 0xa5, 0xd6, 0xc2, 0xbd, 0x09, 0xec, 0x8c, 0x51, 0x04, 0xa7, 0x8b, 0xd8, - 0xe7, 0x26, 0x0a, 0x63, 0xd0, 0x78, 0xaa, 0xe4, 0xcc, 0x75, 0x06, 0xce, 0x7e, 0x83, 0xd3, 0x9a, - 0xed, 0x42, 0x5d, 0x4b, 0xb7, 0x4e, 0x9a, 0xba, 0x96, 0xec, 0x0d, 0xd8, 0x8c, 0xc2, 0x59, 0xa8, - 0xdd, 0x8d, 0x81, 0xb3, 0xbf, 0xc3, 0xad, 0xe0, 0x9d, 0xc3, 0xee, 0x32, 0x14, 0xa6, 0xf3, 0x48, - 0x9b, 0x58, 0x53, 0x91, 0x4e, 0x29, 0xd6, 0x36, 0xa7, 0x35, 0x3b, 0x84, 0x16, 0x46, 0x38, 0xc3, - 0x58, 0xa7, 0x6e, 0x7d, 0xb0, 0xb1, 0xdf, 0x19, 0xdd, 0x39, 0xc8, 0xb3, 0x3d, 0x58, 0xf5, 0x3f, - 0xb6, 0x38, 0xbe, 0x74, 0x30, 0x1b, 0xfb, 0x72, 0x1e, 0x2f, 0x37, 0x26, 0xc1, 0x3b, 0x84, 0xbd, - 0x4a, 0x47, 0xc3, 0x3b, 0x0c, 0x68, 0xf7, 0x36, 0xaf, 0x87, 0x01, 0xf1, 0x41, 0x11, 0x50, 0x26, - 0x6d, 0x4e, 0x6b, 0xef, 0x07, 0xb8, 0x56, 0x38, 0xff, 0x34, 0xc7, 0x54, 0x33, 0x17, 0x9a, 0xd4, - 0x90, 0x49, 0xee, 0x9b, 0x8b, 0x6c, 0x08, 0x5b, 0xca, 0x54, 0x29, 0xa7, 0xfe, 0x66, 0x05, 0x75, - 0x63, 0xe7, 0x19, 0xcc, 0x3b, 0x81, 0x6e, 0x89, 0x5a, 0x22, 0xe3, 0x14, 0xd9, 0x08, 0x9a, 0x8a, - 0x68, 0xa6, 0xae, 0x43, 0x51, 0xdc, 0x97, 0x15, 0x80, 0xe7, 0x40, 0xef, 0xc2, 0x81, 0xeb, 0xdf, - 0x3c, 0xf9, 0x11, 0x7d, 0x6d, 0xac, 0x5f, 0x61, 0x9a, 0x8a, 0x33, 0x7c, 0x05, 0xd1, 0x4f, 0xa1, - 0xe9, 0xcb, 0x58, 0x63, 0xac, 0x29, 0xd9, 0xce, 0x68, 0x50, 0xec, 0x51, 0xc4, 0x39, 0xb2, 0x90, - 0x6f, 0x45, 0x34, 0x47, 0x9e, 0x3b, 0xb0, 0xcf, 0x01, 0x94, 0x94, 0xfa, 0x88, 0xa6, 0x8a, 0x2a, - 0x6d, 0x7a, 0x54, 0x1a, 0x34, 0x2e, 0xce, 0x1f, 0x29, 0x44, 0x0b, 0xf8, 0x2e, 0xd4, 0xd3, 0x49, - 0xc0, 0x4b, 0x2e, 0xec, 0x26, 0x6c, 0x19, 0xf4, 0x24, 0x70, 0x1b, 0xc4, 0x2a, 0x93, 0x58, 0x1f, - 0x40, 0x2b, 0xe1, 0x3f, 0x0b, 0xe3, 0xb3, 0x49, 0xe0, 0x6e, 0x92, 0xad, 0xa4, 0xf1, 0xfe, 0xae, - 0xc3, 0xcd, 0x6a, 0x72, 0xec, 0x33, 0x00, 0xd3, 0xad, 0xc7, 0x49, 0x20, 0x34, 0x52, 0xb2, 0x9d, - 0x51, 0x6f, 0x3d, 0xa5, 0xf1, 0x12, 0x31, 0xae, 0xf1, 0x12, 0x9e, 0x3d, 0x80, 0x6b, 0x4f, 0xe7, - 0x51, 0x54, 0xea, 0x71, 0x56, 0x95, 0x3b, 0xeb, 0x21, 0x4e, 0x56, 0x61, 0xe3, 0x1a, 0x5f, 0xf7, - 0x64, 0x5f, 0x43, 0xb7, 0x50, 0xd9, 0x96, 0x66, 0x45, 0x1a, 0xbc, 0x3c, 0x9a, 0xc5, 0x8d, 0x6b, - 0xfc, 0x7f, 0xbe, 0xec, 0x18, 0x76, 0x50, 0x29, 0xa9, 0x96, 0xc1, 0x1a, 0x14, 0xec, 0xf6, 0x7a, - 0xb0, 0xe3, 0x32, 0x68, 0x5c, 0xe3, 0xab, 0x5e, 0xf7, 0x9b, 0xb0, 0xf9, 0xb3, 0x29, 0x95, 0xf7, - 0xab, 0x03, 0xdd, 0xf5, 0x7a, 0x98, 0x83, 0x63, 0xea, 0x61, 0x27, 0xae, 0xcd, 0xad, 0xc0, 0x3e, - 0x81, 0xa6, 0x6d, 0x69, 0x71, 0x14, 0xaf, 0x68, 0x73, 0x8e, 0x67, 0x1e, 0x6c, 0xa7, 0xb1, 0x48, - 0xd2, 0xa9, 0xd4, 0x0f, 0x85, 0x9e, 0xba, 0x1b, 0x14, 0x77, 0x45, 0xe7, 0xfd, 0xe6, 0xc0, 0x5e, - 0x65, 0x59, 0x5f, 0x0f, 0x9d, 0xdf, 0x9d, 0x7c, 0xbc, 0xd6, 0xfb, 0xf2, 0x7a, 0xf8, 0xbc, 0x0f, - 0x37, 0x2a, 0x3a, 0x6b, 0xb8, 0x50, 0x67, 0xb3, 0x23, 0x6d, 0x05, 0xef, 0x4f, 0x07, 0xba, 0x0f, - 0xe7, 0xe9, 0x94, 0x26, 0xe2, 0xea, 0x8b, 0xea, 0x2e, 0x74, 0x68, 0x69, 0x46, 0x00, 0x55, 0x36, - 0xed, 0x7b, 0xc5, 0x48, 0x9d, 0x16, 0x46, 0x5e, 0x46, 0xb2, 0xbb, 0xd0, 0x14, 0x7e, 0xc4, 0xa5, - 0xd4, 0xd9, 0x50, 0xdf, 0x3e, 0x28, 0x9e, 0x0c, 0x2e, 0xce, 0xef, 0x1d, 0x7d, 0xc9, 0x49, 0xc8, - 0x33, 0xce, 0xd0, 0xde, 0x0d, 0xb8, 0x5e, 0xe2, 0x67, 0x73, 0xf1, 0xfe, 0x72, 0xa0, 0x53, 0xda, - 0x8a, 0xf5, 0xa0, 0x15, 0x06, 0x18, 0xeb, 0x50, 0x2f, 0xb2, 0x47, 0x61, 0x29, 0xb3, 0xb7, 0xa1, - 0xad, 0xc3, 0x19, 0xa6, 0x5a, 0xcc, 0x12, 0x22, 0xbc, 0xc1, 0x0b, 0x85, 0xb1, 0x12, 0xcd, 0x47, - 0x8b, 0xc4, 0x1e, 0xb7, 0x36, 0x2f, 0x14, 0xec, 0x5d, 0xd8, 0x55, 0x98, 0x44, 0xa1, 0x2f, 0x74, - 0x28, 0xe3, 0x07, 0xb8, 0xa0, 0x43, 0xd4, 0xe0, 0x6b, 0x5a, 0xf3, 0x00, 0xa4, 0x88, 0xf6, 0xee, - 0xd9, 0xe6, 0xb4, 0x7e, 0xaf, 0x07, 0xad, 0x63, 0xa5, 0x8e, 0x64, 0x80, 0x29, 0xdb, 0x05, 0x78, - 0x1c, 0xe3, 0x2f, 0x09, 0xfa, 0x1a, 0x83, 0x6e, 0x6d, 0xf4, 0xc2, 0x81, 0x4d, 0xe2, 0xcf, 0xee, - 0x41, 0x2b, 0xbf, 0x9b, 0xd9, 0x5b, 0x55, 0xf7, 0x35, 0x75, 0xa4, 0xd7, 0xab, 0xbc, 0xca, 0x6d, - 0x63, 0xbf, 0x80, 0xf6, 0xb2, 0x42, 0xac, 0x04, 0x5c, 0x6f, 0x6b, 0xef, 0x56, 0xa5, 0x2d, 0x8b, - 0x72, 0x02, 0x5b, 0xa7, 0x5a, 0xa1, 0x98, 0xb1, 0x5b, 0x55, 0x57, 0x7a, 0xf6, 0x34, 0xf4, 0x5e, - 0x65, 0xdc, 0x77, 0x3e, 0x74, 0xee, 0x1f, 0xfe, 0x73, 0xd1, 0x77, 0x9e, 0x5f, 0xf4, 0x9d, 0x7f, - 0x2f, 0xfa, 0xce, 0x1f, 0x97, 0xfd, 0xda, 0xf3, 0xcb, 0x7e, 0xed, 0xc5, 0x65, 0xbf, 0xf6, 0xfd, - 0x3b, 0x57, 0xfe, 0x6d, 0x79, 0xb2, 0x45, 0x9f, 0x8f, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x7d, - 0x4c, 0x93, 0xdc, 0xe2, 0x08, 0x00, 0x00, + // 911 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xcd, 0x8e, 0x1b, 0x45, + 0x10, 0xf6, 0x78, 0x7f, 0x6c, 0x97, 0xf7, 0xc7, 0xe9, 0xb0, 0x61, 0x70, 0x88, 0x63, 0xe6, 0x80, + 0x56, 0x20, 0xd6, 0xc8, 0x1c, 0x02, 0x2c, 0x08, 0x25, 0xcb, 0xae, 0x6c, 0x85, 0x90, 0xa8, 0x37, + 0x01, 0x09, 0x71, 0xe9, 0xcc, 0xd4, 0xda, 0x43, 0xc6, 0xd3, 0x43, 0x77, 0x9b, 0xc5, 0x4f, 0xc0, + 0x05, 0x24, 0x9e, 0x00, 0x89, 0x67, 0xe1, 0xc2, 0x31, 0xc7, 0x1c, 0xd1, 0xee, 0x8b, 0xa0, 0xae, + 0x99, 0xf1, 0x8c, 0x1d, 0x27, 0x7b, 0xcc, 0xc5, 0xd3, 0x55, 0xfd, 0x55, 0xf5, 0xd7, 0xf5, 0x55, + 0x77, 0x1b, 0x3e, 0xf5, 0xe5, 0x64, 0x22, 0xe3, 0x5e, 0xfa, 0xd1, 0x89, 0xf0, 0xb1, 0x47, 0xbf, + 0x7a, 0x16, 0xfb, 0x89, 0x92, 0x46, 0xf6, 0xe8, 0x57, 0x17, 0xde, 0x03, 0x72, 0xb0, 0xba, 0x88, + 0x67, 0xa7, 0xd6, 0xd7, 0xee, 0x25, 0xcf, 0x46, 0x3d, 0xe1, 0x47, 0x3d, 0xa3, 0x10, 0xfd, 0xb1, + 0x88, 0x47, 0xb8, 0x10, 0x59, 0xb8, 0xd3, 0xd0, 0xf6, 0x47, 0x79, 0x80, 0xf0, 0x23, 0x85, 0xbe, + 0x54, 0xc1, 0x02, 0x7e, 0xee, 0x4d, 0xe1, 0xde, 0x10, 0xb6, 0x07, 0x28, 0x82, 0xd3, 0x59, 0xec, + 0x73, 0x9b, 0x85, 0x31, 0x58, 0x3f, 0x53, 0x72, 0xe2, 0x3a, 0x5d, 0x67, 0x7f, 0x9d, 0xd3, 0x98, + 0xed, 0x40, 0xd5, 0x48, 0xb7, 0x4a, 0x9e, 0xaa, 0x91, 0xec, 0x2d, 0xd8, 0x88, 0xc2, 0x49, 0x68, + 0xdc, 0xb5, 0xae, 0xb3, 0xbf, 0xcd, 0x53, 0xc3, 0x3b, 0x87, 0x9d, 0x79, 0x2a, 0xd4, 0xd3, 0xc8, + 0xd8, 0x5c, 0x63, 0xa1, 0xc7, 0x94, 0x6b, 0x8b, 0xd3, 0x98, 0x1d, 0x42, 0x1d, 0x23, 0x9c, 0x60, + 0x6c, 0xb4, 0x5b, 0xed, 0xae, 0xed, 0x37, 0xfb, 0xb7, 0x0f, 0xf2, 0xdd, 0x1e, 0x2c, 0xc6, 0x1f, + 0xa7, 0x38, 0x3e, 0x0f, 0xb0, 0x0b, 0xfb, 0x72, 0x1a, 0xcf, 0x17, 0x26, 0xc3, 0x3b, 0x84, 0xbd, + 0x95, 0x81, 0x96, 0x77, 0x18, 0xd0, 0xea, 0x0d, 0x5e, 0x0d, 0x03, 0xe2, 0x83, 0x22, 0xa0, 0x9d, + 0x34, 0x38, 0x8d, 0xbd, 0x1f, 0x61, 0xb7, 0x08, 0xfe, 0x79, 0x8a, 0xda, 0x30, 0x17, 0x6a, 0x24, + 0xc8, 0x30, 0x8f, 0xcd, 0x4d, 0xd6, 0x83, 0x4d, 0x65, 0xab, 0x94, 0x53, 0x7f, 0x7b, 0x05, 0x75, + 0x3b, 0xcf, 0x33, 0x98, 0x77, 0x02, 0xad, 0x12, 0xb5, 0x44, 0xc6, 0x1a, 0x59, 0x1f, 0x6a, 0x8a, + 0x68, 0x6a, 0xd7, 0xa1, 0x2c, 0xee, 0xab, 0x0a, 0xc0, 0x73, 0xa0, 0x77, 0xe1, 0xc0, 0xb5, 0x87, + 0x4f, 0x7f, 0x42, 0xdf, 0xd8, 0xd9, 0x07, 0xa8, 0xb5, 0x18, 0xe1, 0x6b, 0x88, 0x7e, 0x0e, 0x35, + 0x5f, 0xc6, 0x06, 0x63, 0x43, 0x9b, 0x6d, 0xf6, 0xbb, 0xc5, 0x1a, 0x45, 0x9e, 0xa3, 0x14, 0xf2, + 0x9d, 0x88, 0xa6, 0xc8, 0xf3, 0x00, 0xf6, 0x15, 0x80, 0x92, 0xd2, 0x1c, 0x51, 0x57, 0x51, 0xa5, + 0xad, 0x46, 0xa5, 0x46, 0xe3, 0xe2, 0xfc, 0xb1, 0x42, 0x4c, 0x01, 0xdf, 0x87, 0x66, 0x3c, 0x0c, + 0x78, 0x29, 0x84, 0xdd, 0x80, 0x4d, 0x8b, 0x1e, 0x06, 0xee, 0x3a, 0xb1, 0xca, 0x2c, 0xd6, 0x01, + 0x30, 0x4a, 0xf8, 0xcf, 0xc2, 0x78, 0x34, 0x0c, 0xdc, 0x0d, 0x9a, 0x2b, 0x79, 0xbc, 0x7f, 0xaa, + 0x70, 0x63, 0x35, 0x39, 0xf6, 0x05, 0x80, 0x55, 0xeb, 0x49, 0x12, 0x08, 0x83, 0xb4, 0xd9, 0x66, + 0xbf, 0xbd, 0xbc, 0xa5, 0xc1, 0x1c, 0x31, 0xa8, 0xf0, 0x12, 0x9e, 0xdd, 0x87, 0xdd, 0xb3, 0x69, + 0x14, 0x95, 0x34, 0xce, 0xaa, 0x72, 0x7b, 0x39, 0xc5, 0xc9, 0x22, 0x6c, 0x50, 0xe1, 0xcb, 0x91, + 0xec, 0x5b, 0x68, 0x15, 0xae, 0x54, 0xd2, 0xac, 0x48, 0xdd, 0x57, 0x67, 0x4b, 0x71, 0x83, 0x0a, + 0x7f, 0x29, 0x96, 0x1d, 0xc3, 0x36, 0x2a, 0x25, 0xd5, 0x3c, 0xd9, 0x3a, 0x25, 0xbb, 0xb5, 0x9c, + 0xec, 0xb8, 0x0c, 0x1a, 0x54, 0xf8, 0x62, 0xd4, 0xbd, 0x1a, 0x6c, 0xfc, 0x62, 0x4b, 0xe5, 0xfd, + 0xe6, 0x40, 0x6b, 0xb9, 0x1e, 0xf6, 0xe0, 0xd8, 0x7a, 0xa4, 0x1d, 0xd7, 0xe0, 0xa9, 0xc1, 0x3e, + 0x83, 0x5a, 0x2a, 0x69, 0x71, 0x14, 0xaf, 0x90, 0x39, 0xc7, 0x33, 0x0f, 0xb6, 0x74, 0x2c, 0x12, + 0x3d, 0x96, 0xe6, 0x91, 0x30, 0x63, 0x77, 0x8d, 0xf2, 0x2e, 0xf8, 0xbc, 0xdf, 0x1d, 0xd8, 0x5b, + 0x59, 0xd6, 0x37, 0x43, 0xe7, 0x0f, 0x27, 0x6f, 0xaf, 0x65, 0x5d, 0xde, 0x0c, 0x9f, 0x0f, 0xe1, + 0xfa, 0x0a, 0x65, 0x2d, 0x17, 0x52, 0x36, 0x3b, 0xd2, 0xa9, 0xe1, 0xfd, 0xe5, 0x40, 0xeb, 0xd1, + 0x54, 0x8f, 0xa9, 0x23, 0xae, 0xbe, 0xa8, 0xee, 0x40, 0x93, 0x86, 0xb6, 0x05, 0x50, 0x65, 0xdd, + 0xbe, 0x57, 0xb4, 0xd4, 0x69, 0x31, 0xc9, 0xcb, 0x48, 0x76, 0x07, 0x6a, 0xc2, 0x8f, 0xb8, 0x94, + 0x26, 0x6b, 0xea, 0x5b, 0x07, 0xc5, 0x93, 0xc1, 0xc5, 0xf9, 0xdd, 0xa3, 0x6f, 0x38, 0x19, 0xf9, + 0x8e, 0x33, 0xb4, 0x77, 0x1d, 0xae, 0x95, 0xf8, 0xa5, 0x7b, 0xf1, 0xfe, 0x76, 0xa0, 0x59, 0x5a, + 0x8a, 0xb5, 0xa1, 0x1e, 0x06, 0x18, 0x9b, 0xd0, 0xcc, 0xb2, 0x47, 0x61, 0x6e, 0xb3, 0x77, 0xa1, + 0x61, 0xc2, 0x09, 0x6a, 0x23, 0x26, 0x09, 0x11, 0x5e, 0xe3, 0x85, 0xc3, 0xce, 0x12, 0xcd, 0xc7, + 0xb3, 0x24, 0x3d, 0x6e, 0x0d, 0x5e, 0x38, 0xd8, 0xfb, 0xb0, 0xa3, 0x30, 0x89, 0x42, 0x5f, 0x98, + 0x50, 0xc6, 0xf7, 0x71, 0x46, 0x87, 0x68, 0x9d, 0x2f, 0x79, 0xed, 0x03, 0xa0, 0x11, 0xd3, 0xbb, + 0x67, 0x8b, 0xd3, 0xf8, 0x83, 0x2f, 0xa1, 0x7e, 0xac, 0xd4, 0x91, 0x0c, 0x50, 0xb3, 0x1d, 0x80, + 0x27, 0x31, 0xfe, 0x9a, 0xa0, 0x6f, 0x30, 0x68, 0x55, 0x58, 0x0b, 0xb6, 0x88, 0xfe, 0x83, 0x50, + 0xeb, 0x30, 0x1e, 0xb5, 0x1c, 0xb6, 0x0b, 0x4d, 0x92, 0xeb, 0xe1, 0xd9, 0x99, 0x46, 0xd3, 0x6a, + 0xf5, 0x5f, 0x38, 0xb0, 0x41, 0x18, 0x76, 0x17, 0xea, 0xf9, 0xf5, 0xcd, 0xde, 0x59, 0x75, 0xa5, + 0x93, 0x68, 0xed, 0xf6, 0xca, 0xdb, 0x3e, 0xd5, 0xfe, 0x6b, 0x68, 0xcc, 0x8b, 0xc8, 0x4a, 0xc0, + 0x65, 0xe5, 0xdb, 0x37, 0x57, 0xce, 0x65, 0x59, 0x4e, 0x60, 0xf3, 0xd4, 0x28, 0x14, 0x13, 0x76, + 0x73, 0xd5, 0xad, 0x9f, 0xbd, 0x1e, 0xed, 0xd7, 0x4d, 0xee, 0x3b, 0x1f, 0x3b, 0xf7, 0x0e, 0xff, + 0xbd, 0xe8, 0x38, 0xcf, 0x2f, 0x3a, 0xce, 0x7f, 0x17, 0x1d, 0xe7, 0xcf, 0xcb, 0x4e, 0xe5, 0xf9, + 0x65, 0xa7, 0xf2, 0xe2, 0xb2, 0x53, 0xf9, 0xe1, 0xbd, 0x2b, 0xff, 0xd9, 0x3c, 0xdd, 0xa4, 0xcf, + 0x27, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x19, 0x98, 0xcc, 0x05, 0x09, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index d2869680..818d9ba8 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -11,6 +11,8 @@ const CName = "commonspace.storage" type SpaceStorage interface { storage.Provider + ACLStorage() (storage.ListStorage, error) + SpaceHeader() (*spacesyncproto.SpaceHeader, error) StoredIds() ([]string, error) } diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 4ba8c08b..dc9b5caf 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -99,6 +99,8 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { cl := spacesyncproto.NewDRPCSpaceClient(peer) stream, err := cl.Stream(ctx) 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 continue } // sending empty message for the server to understand from which space is it coming diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go index 1c4e49d7..486de544 100644 --- a/node/nodespace/rpchandler.go +++ b/node/nodespace/rpchandler.go @@ -3,20 +3,36 @@ package nodespace import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" ) type rpcHandler struct { s *service } -func (r *rpcHandler) PushSpace(ctx context.Context, request *spacesyncproto.PushSpaceRequest) (*spacesyncproto.PushSpaceResponse, error) { - return nil, nil +func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) { + _, err = r.s.GetSpace(ctx, req.SpaceId) + if err == nil { + resp = &spacesyncproto.PushSpaceResponse{} + return + } + payload := storage.SpaceStorageCreatePayload{ + RecWithId: req.AclRoot, + SpaceHeader: req.SpaceHeader, + Id: req.SpaceId, + } + _, err = r.s.spaceStorageProvider.CreateSpaceStorage(payload) + if err != nil { + err = spacesyncproto.ErrUnexpected + return + } + return } func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) { sp, err := r.s.GetSpace(ctx, req.SpaceId) if err != nil { - return nil, err + return nil, spacesyncproto.ErrSpaceMissing } return sp.SpaceSyncRpc().HeadSync(ctx, req) } @@ -28,7 +44,7 @@ func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) error } sp, err := r.s.GetSpace(stream.Context(), msg.SpaceId) if err != nil { - return err + return spacesyncproto.ErrSpaceMissing } return sp.SpaceSyncRpc().Stream(stream) } diff --git a/node/nodespace/service.go b/node/nodespace/service.go index 9b3990c8..33093179 100644 --- a/node/nodespace/service.go +++ b/node/nodespace/service.go @@ -6,6 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace/nodecache" @@ -27,14 +28,16 @@ type Service interface { } type service struct { - conf config.Space - spaceCache ocache.OCache - commonSpace commonspace.Service + conf config.Space + spaceCache ocache.OCache + commonSpace commonspace.Service + spaceStorageProvider storage.SpaceStorageProvider } func (s *service) Init(a *app.App) (err error) { s.conf = a.MustComponent(config.CName).(*config.Config).Space s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service) + s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.spaceCache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { return s.commonSpace.GetSpace(ctx, id, nodecache.NewNodeCache(s.conf.GCTTL)) diff --git a/pkg/acl/storage/inmemory.go b/pkg/acl/storage/inmemory.go index 1e200e68..6ddbea57 100644 --- a/pkg/acl/storage/inmemory.go +++ b/pkg/acl/storage/inmemory.go @@ -134,22 +134,11 @@ func (t *inMemoryTreeStorage) GetRawChange(ctx context.Context, changeId string) } type inMemoryStorageProvider struct { - objects map[string]Storage + objects map[string]TreeStorage sync.RWMutex } -func (i *inMemoryStorageProvider) AddStorage(id string, st Storage) error { - i.Lock() - defer i.Unlock() - if _, exists := i.objects[id]; exists { - return fmt.Errorf("storage already exists") - } - - i.objects[id] = st - return nil -} - -func (i *inMemoryStorageProvider) Storage(id string) (Storage, error) { +func (i *inMemoryStorageProvider) TreeStorage(id string) (TreeStorage, error) { i.RLock() defer i.RUnlock() if tree, exists := i.objects[id]; exists { @@ -170,20 +159,8 @@ func (i *inMemoryStorageProvider) CreateTreeStorage(payload TreeStorageCreatePay return res, nil } -func (i *inMemoryStorageProvider) CreateACLListStorage(payload ACLListStorageCreatePayload) (ListStorage, error) { - i.Lock() - defer i.Unlock() - res, err := NewInMemoryACLListStorage(payload.ListId, payload.Records) - if err != nil { - return nil, err - } - - i.objects[payload.ListId] = res - return res, nil -} - func NewInMemoryTreeStorageProvider() Provider { return &inMemoryStorageProvider{ - objects: make(map[string]Storage), + objects: make(map[string]TreeStorage), } } diff --git a/pkg/acl/storage/provider.go b/pkg/acl/storage/provider.go index 3c2c7d91..4e738b28 100644 --- a/pkg/acl/storage/provider.go +++ b/pkg/acl/storage/provider.go @@ -2,7 +2,6 @@ package storage import ( "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" ) @@ -15,13 +14,7 @@ type TreeStorageCreatePayload struct { Heads []string } -type ACLListStorageCreatePayload struct { - ListId string - Records []*aclrecordproto.RawACLRecordWithId -} - type Provider interface { - Storage(id string) (Storage, error) + TreeStorage(id string) (TreeStorage, error) CreateTreeStorage(payload TreeStorageCreatePayload) (TreeStorage, error) - CreateACLListStorage(payload ACLListStorageCreatePayload) (ListStorage, error) } From 533880e9f131c82852b076c9b9526dac6643c240 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 28 Sep 2022 19:55:47 +0200 Subject: [PATCH 096/219] Add better error handling --- common/commonspace/cache/treecache.go | 3 + common/commonspace/space.go | 2 - common/commonspace/spacesyncproto/errors.go | 5 +- .../spacesyncproto/protos/spacesync.proto | 3 +- .../spacesyncproto/spacesync.pb.go | 128 +++++++++--------- common/commonspace/storage/storage.go | 3 + common/commonspace/syncservice/syncservice.go | 11 +- node/nodespace/rpchandler.go | 11 +- 8 files changed, 97 insertions(+), 69 deletions(-) diff --git a/common/commonspace/cache/treecache.go b/common/commonspace/cache/treecache.go index 1a6305b7..24be3590 100644 --- a/common/commonspace/cache/treecache.go +++ b/common/commonspace/cache/treecache.go @@ -2,12 +2,15 @@ package cache import ( "context" + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" ) const CName = "commonspace.cache" +var ErrSpaceNotFound = errors.New("space not found") + type TreeContainer interface { Tree() tree.ObjectTree } diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 50f0dfc9..2df67d1b 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -40,8 +40,6 @@ type Space interface { Id() string SpaceSyncRpc() RpcHandler - SyncService() syncservice.SyncService - DiffService() diffservice.DiffService DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) diff --git a/common/commonspace/spacesyncproto/errors.go b/common/commonspace/spacesyncproto/errors.go index 2011bf9c..9b7b3559 100644 --- a/common/commonspace/spacesyncproto/errors.go +++ b/common/commonspace/spacesyncproto/errors.go @@ -8,6 +8,7 @@ import ( var ( errGroup = rpcerr.ErrGroup(ErrCodes_ErrorOffset) - ErrUnexpected = errGroup.Register(errors.New("Unexpected error"), uint64(ErrCodes_Unexpected)) - ErrSpaceMissing = errGroup.Register(errors.New("Space is missing"), uint64(ErrCodes_SpaceMissing)) + ErrUnexpected = errGroup.Register(errors.New("unexpected error"), uint64(ErrCodes_Unexpected)) + ErrSpaceMissing = errGroup.Register(errors.New("space is missing"), uint64(ErrCodes_SpaceMissing)) + ErrSpaceExists = errGroup.Register(errors.New("space exists"), uint64(ErrCodes_SpaceMissing)) ) diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index 4d834c17..2b45d366 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -8,7 +8,8 @@ import "pkg/acl/aclrecordproto/protos/aclrecord.proto"; enum ErrCodes { Unexpected = 0; SpaceMissing = 1; - ErrorOffset = 16; + SpaceExists = 2; + ErrorOffset = 100; } service Space { diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index f629510d..0c89fb20 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -29,19 +29,22 @@ type ErrCodes int32 const ( ErrCodes_Unexpected ErrCodes = 0 ErrCodes_SpaceMissing ErrCodes = 1 - ErrCodes_ErrorOffset ErrCodes = 16 + ErrCodes_SpaceExists ErrCodes = 2 + ErrCodes_ErrorOffset ErrCodes = 100 ) var ErrCodes_name = map[int32]string{ - 0: "Unexpected", - 1: "SpaceMissing", - 16: "ErrorOffset", + 0: "Unexpected", + 1: "SpaceMissing", + 2: "SpaceExists", + 100: "ErrorOffset", } var ErrCodes_value = map[string]int32{ "Unexpected": 0, "SpaceMissing": 1, - "ErrorOffset": 16, + "SpaceExists": 2, + "ErrorOffset": 100, } func (x ErrCodes) String() string { @@ -940,64 +943,65 @@ func init() { } var fileDescriptor_5855f4ef9cf24cdb = []byte{ - // 911 bytes of a gzipped FileDescriptorProto + // 919 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xcd, 0x8e, 0x1b, 0x45, - 0x10, 0xf6, 0x78, 0x7f, 0x6c, 0x97, 0xf7, 0xc7, 0xe9, 0xb0, 0x61, 0x70, 0x88, 0x63, 0xe6, 0x80, - 0x56, 0x20, 0xd6, 0xc8, 0x1c, 0x02, 0x2c, 0x08, 0x25, 0xcb, 0xae, 0x6c, 0x85, 0x90, 0xa8, 0x37, - 0x01, 0x09, 0x71, 0xe9, 0xcc, 0xd4, 0xda, 0x43, 0xc6, 0xd3, 0x43, 0x77, 0x9b, 0xc5, 0x4f, 0xc0, - 0x05, 0x24, 0x9e, 0x00, 0x89, 0x67, 0xe1, 0xc2, 0x31, 0xc7, 0x1c, 0xd1, 0xee, 0x8b, 0xa0, 0xae, - 0x99, 0xf1, 0x8c, 0x1d, 0x27, 0x7b, 0xcc, 0xc5, 0xd3, 0x55, 0xfd, 0x55, 0xf5, 0xd7, 0xf5, 0x55, - 0x77, 0x1b, 0x3e, 0xf5, 0xe5, 0x64, 0x22, 0xe3, 0x5e, 0xfa, 0xd1, 0x89, 0xf0, 0xb1, 0x47, 0xbf, - 0x7a, 0x16, 0xfb, 0x89, 0x92, 0x46, 0xf6, 0xe8, 0x57, 0x17, 0xde, 0x03, 0x72, 0xb0, 0xba, 0x88, - 0x67, 0xa7, 0xd6, 0xd7, 0xee, 0x25, 0xcf, 0x46, 0x3d, 0xe1, 0x47, 0x3d, 0xa3, 0x10, 0xfd, 0xb1, - 0x88, 0x47, 0xb8, 0x10, 0x59, 0xb8, 0xd3, 0xd0, 0xf6, 0x47, 0x79, 0x80, 0xf0, 0x23, 0x85, 0xbe, - 0x54, 0xc1, 0x02, 0x7e, 0xee, 0x4d, 0xe1, 0xde, 0x10, 0xb6, 0x07, 0x28, 0x82, 0xd3, 0x59, 0xec, - 0x73, 0x9b, 0x85, 0x31, 0x58, 0x3f, 0x53, 0x72, 0xe2, 0x3a, 0x5d, 0x67, 0x7f, 0x9d, 0xd3, 0x98, - 0xed, 0x40, 0xd5, 0x48, 0xb7, 0x4a, 0x9e, 0xaa, 0x91, 0xec, 0x2d, 0xd8, 0x88, 0xc2, 0x49, 0x68, - 0xdc, 0xb5, 0xae, 0xb3, 0xbf, 0xcd, 0x53, 0xc3, 0x3b, 0x87, 0x9d, 0x79, 0x2a, 0xd4, 0xd3, 0xc8, - 0xd8, 0x5c, 0x63, 0xa1, 0xc7, 0x94, 0x6b, 0x8b, 0xd3, 0x98, 0x1d, 0x42, 0x1d, 0x23, 0x9c, 0x60, - 0x6c, 0xb4, 0x5b, 0xed, 0xae, 0xed, 0x37, 0xfb, 0xb7, 0x0f, 0xf2, 0xdd, 0x1e, 0x2c, 0xc6, 0x1f, - 0xa7, 0x38, 0x3e, 0x0f, 0xb0, 0x0b, 0xfb, 0x72, 0x1a, 0xcf, 0x17, 0x26, 0xc3, 0x3b, 0x84, 0xbd, - 0x95, 0x81, 0x96, 0x77, 0x18, 0xd0, 0xea, 0x0d, 0x5e, 0x0d, 0x03, 0xe2, 0x83, 0x22, 0xa0, 0x9d, - 0x34, 0x38, 0x8d, 0xbd, 0x1f, 0x61, 0xb7, 0x08, 0xfe, 0x79, 0x8a, 0xda, 0x30, 0x17, 0x6a, 0x24, - 0xc8, 0x30, 0x8f, 0xcd, 0x4d, 0xd6, 0x83, 0x4d, 0x65, 0xab, 0x94, 0x53, 0x7f, 0x7b, 0x05, 0x75, - 0x3b, 0xcf, 0x33, 0x98, 0x77, 0x02, 0xad, 0x12, 0xb5, 0x44, 0xc6, 0x1a, 0x59, 0x1f, 0x6a, 0x8a, - 0x68, 0x6a, 0xd7, 0xa1, 0x2c, 0xee, 0xab, 0x0a, 0xc0, 0x73, 0xa0, 0x77, 0xe1, 0xc0, 0xb5, 0x87, - 0x4f, 0x7f, 0x42, 0xdf, 0xd8, 0xd9, 0x07, 0xa8, 0xb5, 0x18, 0xe1, 0x6b, 0x88, 0x7e, 0x0e, 0x35, - 0x5f, 0xc6, 0x06, 0x63, 0x43, 0x9b, 0x6d, 0xf6, 0xbb, 0xc5, 0x1a, 0x45, 0x9e, 0xa3, 0x14, 0xf2, - 0x9d, 0x88, 0xa6, 0xc8, 0xf3, 0x00, 0xf6, 0x15, 0x80, 0x92, 0xd2, 0x1c, 0x51, 0x57, 0x51, 0xa5, - 0xad, 0x46, 0xa5, 0x46, 0xe3, 0xe2, 0xfc, 0xb1, 0x42, 0x4c, 0x01, 0xdf, 0x87, 0x66, 0x3c, 0x0c, - 0x78, 0x29, 0x84, 0xdd, 0x80, 0x4d, 0x8b, 0x1e, 0x06, 0xee, 0x3a, 0xb1, 0xca, 0x2c, 0xd6, 0x01, - 0x30, 0x4a, 0xf8, 0xcf, 0xc2, 0x78, 0x34, 0x0c, 0xdc, 0x0d, 0x9a, 0x2b, 0x79, 0xbc, 0x7f, 0xaa, - 0x70, 0x63, 0x35, 0x39, 0xf6, 0x05, 0x80, 0x55, 0xeb, 0x49, 0x12, 0x08, 0x83, 0xb4, 0xd9, 0x66, - 0xbf, 0xbd, 0xbc, 0xa5, 0xc1, 0x1c, 0x31, 0xa8, 0xf0, 0x12, 0x9e, 0xdd, 0x87, 0xdd, 0xb3, 0x69, - 0x14, 0x95, 0x34, 0xce, 0xaa, 0x72, 0x7b, 0x39, 0xc5, 0xc9, 0x22, 0x6c, 0x50, 0xe1, 0xcb, 0x91, - 0xec, 0x5b, 0x68, 0x15, 0xae, 0x54, 0xd2, 0xac, 0x48, 0xdd, 0x57, 0x67, 0x4b, 0x71, 0x83, 0x0a, - 0x7f, 0x29, 0x96, 0x1d, 0xc3, 0x36, 0x2a, 0x25, 0xd5, 0x3c, 0xd9, 0x3a, 0x25, 0xbb, 0xb5, 0x9c, - 0xec, 0xb8, 0x0c, 0x1a, 0x54, 0xf8, 0x62, 0xd4, 0xbd, 0x1a, 0x6c, 0xfc, 0x62, 0x4b, 0xe5, 0xfd, - 0xe6, 0x40, 0x6b, 0xb9, 0x1e, 0xf6, 0xe0, 0xd8, 0x7a, 0xa4, 0x1d, 0xd7, 0xe0, 0xa9, 0xc1, 0x3e, - 0x83, 0x5a, 0x2a, 0x69, 0x71, 0x14, 0xaf, 0x90, 0x39, 0xc7, 0x33, 0x0f, 0xb6, 0x74, 0x2c, 0x12, - 0x3d, 0x96, 0xe6, 0x91, 0x30, 0x63, 0x77, 0x8d, 0xf2, 0x2e, 0xf8, 0xbc, 0xdf, 0x1d, 0xd8, 0x5b, - 0x59, 0xd6, 0x37, 0x43, 0xe7, 0x0f, 0x27, 0x6f, 0xaf, 0x65, 0x5d, 0xde, 0x0c, 0x9f, 0x0f, 0xe1, - 0xfa, 0x0a, 0x65, 0x2d, 0x17, 0x52, 0x36, 0x3b, 0xd2, 0xa9, 0xe1, 0xfd, 0xe5, 0x40, 0xeb, 0xd1, - 0x54, 0x8f, 0xa9, 0x23, 0xae, 0xbe, 0xa8, 0xee, 0x40, 0x93, 0x86, 0xb6, 0x05, 0x50, 0x65, 0xdd, - 0xbe, 0x57, 0xb4, 0xd4, 0x69, 0x31, 0xc9, 0xcb, 0x48, 0x76, 0x07, 0x6a, 0xc2, 0x8f, 0xb8, 0x94, - 0x26, 0x6b, 0xea, 0x5b, 0x07, 0xc5, 0x93, 0xc1, 0xc5, 0xf9, 0xdd, 0xa3, 0x6f, 0x38, 0x19, 0xf9, - 0x8e, 0x33, 0xb4, 0x77, 0x1d, 0xae, 0x95, 0xf8, 0xa5, 0x7b, 0xf1, 0xfe, 0x76, 0xa0, 0x59, 0x5a, - 0x8a, 0xb5, 0xa1, 0x1e, 0x06, 0x18, 0x9b, 0xd0, 0xcc, 0xb2, 0x47, 0x61, 0x6e, 0xb3, 0x77, 0xa1, - 0x61, 0xc2, 0x09, 0x6a, 0x23, 0x26, 0x09, 0x11, 0x5e, 0xe3, 0x85, 0xc3, 0xce, 0x12, 0xcd, 0xc7, - 0xb3, 0x24, 0x3d, 0x6e, 0x0d, 0x5e, 0x38, 0xd8, 0xfb, 0xb0, 0xa3, 0x30, 0x89, 0x42, 0x5f, 0x98, - 0x50, 0xc6, 0xf7, 0x71, 0x46, 0x87, 0x68, 0x9d, 0x2f, 0x79, 0xed, 0x03, 0xa0, 0x11, 0xd3, 0xbb, - 0x67, 0x8b, 0xd3, 0xf8, 0x83, 0x2f, 0xa1, 0x7e, 0xac, 0xd4, 0x91, 0x0c, 0x50, 0xb3, 0x1d, 0x80, - 0x27, 0x31, 0xfe, 0x9a, 0xa0, 0x6f, 0x30, 0x68, 0x55, 0x58, 0x0b, 0xb6, 0x88, 0xfe, 0x83, 0x50, - 0xeb, 0x30, 0x1e, 0xb5, 0x1c, 0xb6, 0x0b, 0x4d, 0x92, 0xeb, 0xe1, 0xd9, 0x99, 0x46, 0xd3, 0x6a, - 0xf5, 0x5f, 0x38, 0xb0, 0x41, 0x18, 0x76, 0x17, 0xea, 0xf9, 0xf5, 0xcd, 0xde, 0x59, 0x75, 0xa5, - 0x93, 0x68, 0xed, 0xf6, 0xca, 0xdb, 0x3e, 0xd5, 0xfe, 0x6b, 0x68, 0xcc, 0x8b, 0xc8, 0x4a, 0xc0, - 0x65, 0xe5, 0xdb, 0x37, 0x57, 0xce, 0x65, 0x59, 0x4e, 0x60, 0xf3, 0xd4, 0x28, 0x14, 0x13, 0x76, - 0x73, 0xd5, 0xad, 0x9f, 0xbd, 0x1e, 0xed, 0xd7, 0x4d, 0xee, 0x3b, 0x1f, 0x3b, 0xf7, 0x0e, 0xff, - 0xbd, 0xe8, 0x38, 0xcf, 0x2f, 0x3a, 0xce, 0x7f, 0x17, 0x1d, 0xe7, 0xcf, 0xcb, 0x4e, 0xe5, 0xf9, - 0x65, 0xa7, 0xf2, 0xe2, 0xb2, 0x53, 0xf9, 0xe1, 0xbd, 0x2b, 0xff, 0xd9, 0x3c, 0xdd, 0xa4, 0xcf, - 0x27, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x19, 0x98, 0xcc, 0x05, 0x09, 0x00, 0x00, + 0x10, 0xf6, 0x78, 0xbd, 0x6b, 0xbb, 0xbc, 0x3f, 0x4e, 0x87, 0x0d, 0x83, 0x43, 0x1c, 0x33, 0x07, + 0xb4, 0x02, 0xb1, 0x46, 0xe6, 0x10, 0x60, 0x91, 0x50, 0xb2, 0x78, 0x65, 0x2b, 0xe4, 0x47, 0xbd, + 0x09, 0x48, 0x88, 0x4b, 0x67, 0xa6, 0xd6, 0x1e, 0x32, 0x9e, 0x1e, 0xa6, 0xdb, 0x6c, 0xfc, 0x04, + 0x5c, 0x40, 0xe2, 0x09, 0x90, 0x78, 0x16, 0x2e, 0x1c, 0x73, 0xcc, 0x11, 0xed, 0xbe, 0x08, 0xea, + 0x9a, 0x19, 0xcf, 0xd8, 0x4c, 0xb2, 0xc7, 0x5c, 0x3c, 0x5d, 0x55, 0x5f, 0x55, 0x7f, 0xf5, 0xd3, + 0xdd, 0x86, 0xcf, 0x5d, 0x39, 0x9b, 0xc9, 0xb0, 0x9f, 0x7c, 0x54, 0x24, 0x5c, 0xec, 0xd3, 0xaf, + 0x5a, 0x84, 0x6e, 0x14, 0x4b, 0x2d, 0xfb, 0xf4, 0xab, 0x72, 0xed, 0x21, 0x29, 0x58, 0x43, 0x84, + 0x8b, 0x53, 0xa3, 0xeb, 0xf4, 0xa3, 0xe7, 0x93, 0xbe, 0x70, 0x83, 0xbe, 0x8e, 0x11, 0xdd, 0xa9, + 0x08, 0x27, 0xb8, 0xe2, 0x99, 0xab, 0x13, 0xd7, 0xce, 0x27, 0x99, 0x83, 0x70, 0x83, 0x18, 0x5d, + 0x19, 0x7b, 0x2b, 0xf8, 0xa5, 0x36, 0x81, 0x3b, 0x63, 0xd8, 0x19, 0xa1, 0xf0, 0x4e, 0x17, 0xa1, + 0xcb, 0x4d, 0x14, 0xc6, 0xa0, 0x76, 0x16, 0xcb, 0x99, 0x6d, 0xf5, 0xac, 0x83, 0x1a, 0xa7, 0x35, + 0xdb, 0x85, 0xaa, 0x96, 0x76, 0x95, 0x34, 0x55, 0x2d, 0xd9, 0x3b, 0xb0, 0x19, 0xf8, 0x33, 0x5f, + 0xdb, 0x1b, 0x3d, 0xeb, 0x60, 0x87, 0x27, 0x82, 0x73, 0x0e, 0xbb, 0xcb, 0x50, 0xa8, 0xe6, 0x81, + 0x36, 0xb1, 0xa6, 0x42, 0x4d, 0x29, 0xd6, 0x36, 0xa7, 0x35, 0x3b, 0x82, 0x06, 0x06, 0x38, 0xc3, + 0x50, 0x2b, 0xbb, 0xda, 0xdb, 0x38, 0x68, 0x0d, 0x6e, 0x1f, 0x66, 0xd9, 0x1e, 0xae, 0xfa, 0x0f, + 0x13, 0x1c, 0x5f, 0x3a, 0x98, 0x8d, 0x5d, 0x39, 0x0f, 0x97, 0x1b, 0x93, 0xe0, 0x1c, 0xc1, 0x7e, + 0xa9, 0xa3, 0xe1, 0xed, 0x7b, 0xb4, 0x7b, 0x93, 0x57, 0x7d, 0x8f, 0xf8, 0xa0, 0xf0, 0x28, 0x93, + 0x26, 0xa7, 0xb5, 0xf3, 0x23, 0xec, 0xe5, 0xce, 0x3f, 0xcf, 0x51, 0x69, 0x66, 0x43, 0x9d, 0x1a, + 0x32, 0xce, 0x7c, 0x33, 0x91, 0xf5, 0x61, 0x2b, 0x36, 0x55, 0xca, 0xa8, 0xbf, 0x5b, 0x42, 0xdd, + 0xd8, 0x79, 0x0a, 0x73, 0x4e, 0xa0, 0x5d, 0xa0, 0x16, 0xc9, 0x50, 0x21, 0x1b, 0x40, 0x3d, 0x26, + 0x9a, 0xca, 0xb6, 0x28, 0x8a, 0xfd, 0xba, 0x02, 0xf0, 0x0c, 0xe8, 0x5c, 0x58, 0x70, 0xed, 0xd1, + 0xb3, 0x9f, 0xd0, 0xd5, 0xc6, 0xfa, 0x00, 0x95, 0x12, 0x13, 0x7c, 0x03, 0xd1, 0x2f, 0xa1, 0xee, + 0xca, 0x50, 0x63, 0xa8, 0x29, 0xd9, 0xd6, 0xa0, 0x97, 0xef, 0x91, 0xc7, 0x39, 0x4e, 0x20, 0xdf, + 0x89, 0x60, 0x8e, 0x3c, 0x73, 0x60, 0x5f, 0x03, 0xc4, 0x52, 0xea, 0x63, 0x9a, 0x2a, 0xaa, 0xb4, + 0xe9, 0x51, 0x61, 0xd0, 0xb8, 0x38, 0x7f, 0x12, 0x23, 0x26, 0x80, 0xef, 0x7d, 0x3d, 0x1d, 0x7b, + 0xbc, 0xe0, 0xc2, 0x6e, 0xc0, 0x96, 0x41, 0x8f, 0x3d, 0xbb, 0x46, 0xac, 0x52, 0x89, 0x75, 0x01, + 0x74, 0x2c, 0xdc, 0xe7, 0x7e, 0x38, 0x19, 0x7b, 0xf6, 0x26, 0xd9, 0x0a, 0x1a, 0xe7, 0xef, 0x2a, + 0xdc, 0x28, 0x27, 0xc7, 0xbe, 0x02, 0x30, 0xdd, 0x7a, 0x1a, 0x79, 0x42, 0x23, 0x25, 0xdb, 0x1a, + 0x74, 0xd6, 0x53, 0x1a, 0x2d, 0x11, 0xa3, 0x0a, 0x2f, 0xe0, 0xd9, 0x7d, 0xd8, 0x3b, 0x9b, 0x07, + 0x41, 0xa1, 0xc7, 0x69, 0x55, 0x6e, 0xaf, 0x87, 0x38, 0x59, 0x85, 0x8d, 0x2a, 0x7c, 0xdd, 0x93, + 0x3d, 0x84, 0x76, 0xae, 0x4a, 0x5a, 0x9a, 0x16, 0xa9, 0xf7, 0xfa, 0x68, 0x09, 0x6e, 0x54, 0xe1, + 0xff, 0xf3, 0x65, 0x43, 0xd8, 0xc1, 0x38, 0x96, 0xf1, 0x32, 0x58, 0x8d, 0x82, 0xdd, 0x5a, 0x0f, + 0x36, 0x2c, 0x82, 0x46, 0x15, 0xbe, 0xea, 0x75, 0xaf, 0x0e, 0x9b, 0xbf, 0x98, 0x52, 0x39, 0xbf, + 0x5a, 0xd0, 0x5e, 0xaf, 0x87, 0x39, 0x38, 0xa6, 0x1e, 0xc9, 0xc4, 0x35, 0x79, 0x22, 0xb0, 0x2f, + 0xa0, 0x9e, 0xb4, 0x34, 0x3f, 0x8a, 0x57, 0xb4, 0x39, 0xc3, 0x33, 0x07, 0xb6, 0x55, 0x28, 0x22, + 0x35, 0x95, 0xfa, 0xb1, 0xd0, 0x53, 0x7b, 0x83, 0xe2, 0xae, 0xe8, 0x9c, 0xdf, 0x2c, 0xd8, 0x2f, + 0x2d, 0xeb, 0xdb, 0xa1, 0xf3, 0xbb, 0x95, 0x8d, 0xd7, 0x7a, 0x5f, 0xde, 0x0e, 0x9f, 0x8f, 0xe1, + 0x7a, 0x49, 0x67, 0x0d, 0x17, 0xea, 0x6c, 0x7a, 0xa4, 0x13, 0xc1, 0xf9, 0xd3, 0x82, 0xf6, 0xe3, + 0xb9, 0x9a, 0xd2, 0x44, 0x5c, 0x7d, 0x51, 0xdd, 0x81, 0x16, 0x2d, 0xcd, 0x08, 0x60, 0x9c, 0x4e, + 0xfb, 0x7e, 0x3e, 0x52, 0xa7, 0xb9, 0x91, 0x17, 0x91, 0xec, 0x0e, 0xd4, 0x85, 0x1b, 0x70, 0x29, + 0x75, 0x3a, 0xd4, 0xb7, 0x0e, 0xf3, 0x27, 0x83, 0x8b, 0xf3, 0xbb, 0xc7, 0xdf, 0x72, 0x12, 0xb2, + 0x8c, 0x53, 0xb4, 0x73, 0x1d, 0xae, 0x15, 0xf8, 0x25, 0xb9, 0x38, 0x7f, 0x59, 0xd0, 0x2a, 0x6c, + 0xc5, 0x3a, 0xd0, 0xf0, 0x3d, 0x0c, 0xb5, 0xaf, 0x17, 0xe9, 0xa3, 0xb0, 0x94, 0xd9, 0xfb, 0xd0, + 0xd4, 0xfe, 0x0c, 0x95, 0x16, 0xb3, 0x88, 0x08, 0x6f, 0xf0, 0x5c, 0x61, 0xac, 0x44, 0xf3, 0xc9, + 0x22, 0x4a, 0x8e, 0x5b, 0x93, 0xe7, 0x0a, 0xf6, 0x21, 0xec, 0xc6, 0x18, 0x05, 0xbe, 0x2b, 0xb4, + 0x2f, 0xc3, 0xfb, 0xb8, 0xa0, 0x43, 0x54, 0xe3, 0x6b, 0x5a, 0xf3, 0x00, 0x28, 0xc4, 0xe4, 0xee, + 0xd9, 0xe6, 0xb4, 0xfe, 0xe8, 0x21, 0x34, 0x86, 0x71, 0x7c, 0x2c, 0x3d, 0x54, 0x6c, 0x17, 0xe0, + 0x69, 0x88, 0x2f, 0x22, 0x74, 0x35, 0x7a, 0xed, 0x0a, 0x6b, 0xc3, 0x36, 0xd1, 0x7f, 0xe0, 0x2b, + 0xe5, 0x87, 0x93, 0xb6, 0xc5, 0xf6, 0xd2, 0x84, 0x86, 0x2f, 0x7c, 0xa5, 0x55, 0xbb, 0x6a, 0x14, + 0xd4, 0xbf, 0x47, 0x67, 0x67, 0x0a, 0x75, 0xdb, 0x1b, 0xbc, 0xb2, 0x60, 0x93, 0x20, 0xec, 0x2e, + 0x34, 0xb2, 0xfb, 0x9c, 0xbd, 0x57, 0x76, 0xc7, 0x53, 0x17, 0x3b, 0x9d, 0xd2, 0xeb, 0x3f, 0x19, + 0x86, 0x6f, 0xa0, 0xb9, 0xac, 0x2a, 0x2b, 0x00, 0xd7, 0x47, 0xa1, 0x73, 0xb3, 0xd4, 0x96, 0x46, + 0x39, 0x81, 0xad, 0x53, 0x1d, 0xa3, 0x98, 0xb1, 0x9b, 0x65, 0xcf, 0x40, 0xfa, 0x9c, 0x74, 0xde, + 0x64, 0x3c, 0xb0, 0x3e, 0xb5, 0xee, 0x1d, 0xfd, 0x73, 0xd1, 0xb5, 0x5e, 0x5e, 0x74, 0xad, 0x7f, + 0x2f, 0xba, 0xd6, 0x1f, 0x97, 0xdd, 0xca, 0xcb, 0xcb, 0x6e, 0xe5, 0xd5, 0x65, 0xb7, 0xf2, 0xc3, + 0x07, 0x57, 0xfe, 0xd5, 0x79, 0xb6, 0x45, 0x9f, 0xcf, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xce, + 0x99, 0xdc, 0xc5, 0x16, 0x09, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index 818d9ba8..add06e08 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -1,6 +1,7 @@ package storage import ( + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" @@ -9,6 +10,8 @@ import ( const CName = "commonspace.storage" +var ErrSpaceStorageExists = errors.New("space storage exists") + type SpaceStorage interface { storage.Provider ACLStorage() (storage.ListStorage, error) diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index dc9b5caf..68b74e69 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -2,13 +2,17 @@ package syncservice import ( "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "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/pkg/acl/treechangeproto" "time" ) +var log = logger.NewNamed("syncservice").Sugar() + type SyncService interface { NotifyHeadUpdate( ctx context.Context, @@ -104,7 +108,12 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { continue } // sending empty message for the server to understand from which space is it coming - stream.Send(&spacesyncproto.ObjectSyncMessage{SpaceId: s.spaceId}) + err = stream.Send(&spacesyncproto.ObjectSyncMessage{SpaceId: s.spaceId}) + if err != nil { + err = rpcerr.Unwrap(err) + log.With("spaceId", s.spaceId).Errorf("failed to open stream: %v", err) + continue + } s.streamPool.AddAndReadStreamAsync(stream) } } diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go index 486de544..dd050fde 100644 --- a/node/nodespace/rpchandler.go +++ b/node/nodespace/rpchandler.go @@ -2,6 +2,7 @@ package nodespace import ( "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" ) @@ -13,9 +14,14 @@ type rpcHandler struct { func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) { _, err = r.s.GetSpace(ctx, req.SpaceId) if err == nil { - resp = &spacesyncproto.PushSpaceResponse{} + err = spacesyncproto.ErrSpaceExists return } + if err != cache.ErrSpaceNotFound { + err = spacesyncproto.ErrUnexpected + return + } + payload := storage.SpaceStorageCreatePayload{ RecWithId: req.AclRoot, SpaceHeader: req.SpaceHeader, @@ -24,6 +30,9 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac _, err = r.s.spaceStorageProvider.CreateSpaceStorage(payload) if err != nil { err = spacesyncproto.ErrUnexpected + if err == storage.ErrSpaceStorageExists { + err = spacesyncproto.ErrSpaceExists + } return } return From 131f4a69682ce3b5d665d87a0f7d35beb61e45ca Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 28 Sep 2022 20:56:11 +0200 Subject: [PATCH 097/219] Change cache logic --- common/commonspace/cache/treecache.go | 7 +-- common/commonspace/diffservice/diffservice.go | 2 +- common/commonspace/service.go | 16 ++--- common/commonspace/space.go | 3 - common/commonspace/syncservice/synchandler.go | 10 +-- common/commonspace/syncservice/syncservice.go | 2 +- node/nodespace/nodecache/treecache.go | 61 +++++++++++++------ node/nodespace/service.go | 3 +- 8 files changed, 63 insertions(+), 41 deletions(-) diff --git a/common/commonspace/cache/treecache.go b/common/commonspace/cache/treecache.go index 24be3590..cd47f1c3 100644 --- a/common/commonspace/cache/treecache.go +++ b/common/commonspace/cache/treecache.go @@ -3,6 +3,7 @@ package cache import ( "context" "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" ) @@ -23,8 +24,6 @@ type TreeResult struct { type BuildFunc = func(ctx context.Context, id string, listener synctree.UpdateListener) (tree.ObjectTree, error) type TreeCache interface { - GetTree(ctx context.Context, id string) (TreeResult, error) - SetBuildFunc(f BuildFunc) - - Close() error + app.ComponentRunnable + GetTree(ctx context.Context, spaceId, treeId string) (TreeResult, error) } diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index 45ad5e0a..ff376d31 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -119,7 +119,7 @@ func (d *diffService) syncWithPeer(ctx context.Context, p peer.Peer) (err error) func (d *diffService) pingTreesInCache(ctx context.Context, trees []string) { for _, tId := range trees { - _, _ = d.cache.GetTree(ctx, tId) + _, _ = d.cache.GetTree(ctx, d.spaceId, tId) } } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index f5b10591..48f4b4cf 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -30,7 +30,7 @@ func New() Service { type Service interface { CreateSpace(ctx context.Context, cache cache.TreeCache, payload SpaceCreatePayload) (Space, error) DeriveSpace(ctx context.Context, cache cache.TreeCache, payload SpaceDerivePayload) (Space, error) - GetSpace(ctx context.Context, id string, cache cache.TreeCache) (sp Space, err error) + GetSpace(ctx context.Context, id string) (sp Space, err error) app.Component } @@ -38,12 +38,14 @@ type service struct { config config.Space configurationService nodeconf.Service storageProvider storage.SpaceStorageProvider + cache cache.TreeCache } func (s *service) Init(a *app.App) (err error) { s.config = a.MustComponent(config.CName).(*config.Config).Space s.storageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) + s.cache = a.MustComponent(cache.CName).(cache.TreeCache) return nil } @@ -127,7 +129,7 @@ func (s *service) CreateSpace( return } - return s.GetSpace(ctx, spaceId, cache) + return s.GetSpace(ctx, spaceId) } func (s *service) DeriveSpace( @@ -219,22 +221,22 @@ func (s *service) DeriveSpace( return } - return s.GetSpace(ctx, spaceId, cache) + return s.GetSpace(ctx, spaceId) } -func (s *service) GetSpace(ctx context.Context, id string, cache cache.TreeCache) (Space, error) { +func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { st, err := s.storageProvider.SpaceStorage(id) if err != nil { return nil, err } lastConfiguration := s.configurationService.GetLast() - diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, lastConfiguration, cache, log) - syncService := syncservice.NewSyncService(id, diffService, cache, lastConfiguration) + diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, lastConfiguration, s.cache, log) + syncService := syncservice.NewSyncService(id, diffService, s.cache, lastConfiguration) sp := &space{ id: id, syncService: syncService, diffService: diffService, - cache: cache, + cache: s.cache, storage: st, } if err := sp.Init(ctx); err != nil { diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 2df67d1b..83be2504 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -73,8 +73,6 @@ func (s *space) Init(ctx context.Context) (err error) { } s.diffService.Init(initialIds) s.syncService.Init() - // basically this provides access for the external cache to use space's tree building functions - s.cache.SetBuildFunc(s.BuildTree) return nil } @@ -148,6 +146,5 @@ func (s *space) BuildTree(ctx context.Context, id string, listener synctree.Upda func (s *space) Close() error { s.diffService.Close() - s.cache.Close() return s.syncService.Close() } diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index c8470de5..3a0da9fd 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -10,6 +10,7 @@ import ( ) type syncHandler struct { + spaceId string treeCache cache.TreeCache syncClient SyncClient } @@ -18,8 +19,9 @@ type SyncHandler interface { HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) } -func newSyncHandler(treeCache cache.TreeCache, syncClient SyncClient) *syncHandler { +func newSyncHandler(spaceId string, treeCache cache.TreeCache, syncClient SyncClient) *syncHandler { return &syncHandler{ + spaceId: spaceId, treeCache: treeCache, syncClient: syncClient, } @@ -48,7 +50,7 @@ func (s *syncHandler) HandleHeadUpdate( fullRequest *spacesyncproto.ObjectFullSyncRequest result tree.AddResult ) - res, err := s.treeCache.GetTree(ctx, msg.TreeId) + res, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) if err != nil { return } @@ -100,7 +102,7 @@ func (s *syncHandler) HandleFullSyncRequest( } }() - res, err := s.treeCache.GetTree(ctx, msg.TreeId) + res, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) if err != nil { return } @@ -136,7 +138,7 @@ func (s *syncHandler) HandleFullSyncResponse( senderId string, response *spacesyncproto.ObjectFullSyncResponse, msg *spacesyncproto.ObjectSyncMessage) (err error) { - res, err := s.treeCache.GetTree(ctx, msg.TreeId) + res, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) if err != nil { return } diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 68b74e69..59aa3621 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -49,7 +49,7 @@ func NewSyncService(spaceId string, headNotifiable HeadNotifiable, cache cache.T streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { return syncHandler.HandleMessage(ctx, senderId, message) }) - syncHandler = newSyncHandler(cache, streamPool) + syncHandler = newSyncHandler(spaceId, cache, streamPool) return newSyncService(spaceId, headNotifiable, syncHandler, streamPool, configuration) } diff --git a/node/nodespace/nodecache/treecache.go b/node/nodespace/nodecache/treecache.go index 926bced6..e0238528 100644 --- a/node/nodespace/nodecache/treecache.go +++ b/node/nodespace/nodecache/treecache.go @@ -3,8 +3,10 @@ package nodecache import ( "context" "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "time" ) @@ -12,9 +14,45 @@ import ( var log = logger.NewNamed("treecache") var ErrCacheObjectWithoutTree = errors.New("cache object contains no tree") +type ctxKey int + +const spaceKey ctxKey = 0 + type treeCache struct { - gcttl int - cache ocache.OCache + gcttl int + cache ocache.OCache + nodeService nodespace.Service +} + +func (c *treeCache) Run(ctx context.Context) (err error) { + return nil +} + +func (c *treeCache) Close(ctx context.Context) (err error) { + return c.cache.Close() +} + +func (c *treeCache) Init(a *app.App) (err error) { + c.nodeService = a.MustComponent(nodespace.CName).(nodespace.Service) + c.cache = ocache.New( + func(ctx context.Context, id string) (value ocache.Object, err error) { + spaceId := ctx.Value(spaceKey).(string) + space, err := c.nodeService.GetSpace(ctx, spaceId) + if err != nil { + return + } + return space.BuildTree(ctx, id, nil) + }, + ocache.WithLogger(log.Sugar()), + ocache.WithGCPeriod(time.Minute), + ocache.WithTTL(time.Duration(c.gcttl)*time.Second), + ocache.WithRefCounter(false), + ) + return nil +} + +func (c *treeCache) Name() (name string) { + return cache.CName } func NewNodeCache(ttl int) cache.TreeCache { @@ -23,24 +61,9 @@ func NewNodeCache(ttl int) cache.TreeCache { } } -func (c *treeCache) SetBuildFunc(buildFunc cache.BuildFunc) { - c.cache = ocache.New( - func(ctx context.Context, id string) (value ocache.Object, err error) { - return buildFunc(ctx, id, nil) - }, - ocache.WithLogger(log.Sugar()), - ocache.WithGCPeriod(time.Minute), - ocache.WithTTL(time.Duration(c.gcttl)*time.Second), - ocache.WithRefCounter(false), - ) -} - -func (c *treeCache) Close() (err error) { - return c.cache.Close() -} - -func (c *treeCache) GetTree(ctx context.Context, id string) (res cache.TreeResult, err error) { +func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (res cache.TreeResult, err error) { var cacheRes ocache.Object + ctx = context.WithValue(ctx, spaceKey, spaceId) cacheRes, err = c.cache.Get(ctx, id) if err != nil { return cache.TreeResult{}, err diff --git a/node/nodespace/service.go b/node/nodespace/service.go index 33093179..0920ef42 100644 --- a/node/nodespace/service.go +++ b/node/nodespace/service.go @@ -9,7 +9,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace/nodecache" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "time" ) @@ -40,7 +39,7 @@ func (s *service) Init(a *app.App) (err error) { s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.spaceCache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { - return s.commonSpace.GetSpace(ctx, id, nodecache.NewNodeCache(s.conf.GCTTL)) + return s.commonSpace.GetSpace(ctx, id) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), From e99650615d65c614339918c86a7c93efe1ed1ccc Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 29 Sep 2022 16:22:56 +0200 Subject: [PATCH 098/219] Fix circular deps etc --- common/commonspace/cache/treecache.go | 4 ++-- common/commonspace/space.go | 13 +++++++------ common/commonspace/spacesyncproto/errors.go | 2 +- common/commonspace/synctree/synctree.go | 16 ++++++---------- .../synctree/updatelistener/updatelistener.go | 8 ++++++++ common/net/rpc/rpcerr/registry.go | 2 +- common/nodeconf/service.go | 2 +- 7 files changed, 26 insertions(+), 21 deletions(-) create mode 100644 common/commonspace/synctree/updatelistener/updatelistener.go diff --git a/common/commonspace/cache/treecache.go b/common/commonspace/cache/treecache.go index cd47f1c3..9983231f 100644 --- a/common/commonspace/cache/treecache.go +++ b/common/commonspace/cache/treecache.go @@ -4,7 +4,7 @@ import ( "context" "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" ) @@ -21,7 +21,7 @@ type TreeResult struct { TreeContainer TreeContainer } -type BuildFunc = func(ctx context.Context, id string, listener synctree.UpdateListener) (tree.ObjectTree, error) +type BuildFunc = func(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree.ObjectTree, error) type TreeCache interface { app.ComponentRunnable diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 83be2504..46099da3 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/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" @@ -41,9 +42,9 @@ type Space interface { SpaceSyncRpc() RpcHandler - DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) - CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) - BuildTree(ctx context.Context, id string, listener synctree.UpdateListener) (tree.ObjectTree, error) + DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) + CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) + BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree.ObjectTree, error) Close() error } @@ -88,15 +89,15 @@ func (s *space) DiffService() diffservice.DiffService { return s.diffService } -func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) { +func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) { return synctree.DeriveSyncTree(ctx, payload, s.syncService, listener, s.aclList, s.storage.CreateTreeStorage) } -func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener synctree.UpdateListener) (tree.ObjectTree, error) { +func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) { return synctree.CreateSyncTree(ctx, payload, s.syncService, listener, s.aclList, s.storage.CreateTreeStorage) } -func (s *space) BuildTree(ctx context.Context, id string, listener synctree.UpdateListener) (t tree.ObjectTree, err error) { +func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t tree.ObjectTree, err error) { getTreeRemote := func() (*spacesyncproto.ObjectSyncMessage, error) { // TODO: add empty context handling (when this is not happening due to head update) peerId, err := syncservice.GetPeerIdFromStreamContext(ctx) diff --git a/common/commonspace/spacesyncproto/errors.go b/common/commonspace/spacesyncproto/errors.go index 9b7b3559..44034ccb 100644 --- a/common/commonspace/spacesyncproto/errors.go +++ b/common/commonspace/spacesyncproto/errors.go @@ -10,5 +10,5 @@ var ( ErrUnexpected = errGroup.Register(errors.New("unexpected error"), uint64(ErrCodes_Unexpected)) ErrSpaceMissing = errGroup.Register(errors.New("space is missing"), uint64(ErrCodes_SpaceMissing)) - ErrSpaceExists = errGroup.Register(errors.New("space exists"), uint64(ErrCodes_SpaceMissing)) + ErrSpaceExists = errGroup.Register(errors.New("space exists"), uint64(ErrCodes_SpaceExists)) ) diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index a339b6fb..f3075825 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -4,29 +4,25 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" ) -type UpdateListener interface { - Update(tree tree.ObjectTree) - Rebuild(tree tree.ObjectTree) -} - // SyncTree sends head updates to sync service and also sends new changes to update listener type SyncTree struct { tree.ObjectTree syncService syncservice.SyncService - listener UpdateListener + listener updatelistener.UpdateListener } func DeriveSyncTree( ctx context.Context, payload tree.ObjectTreeCreatePayload, syncService syncservice.SyncService, - listener UpdateListener, + listener updatelistener.UpdateListener, aclList list.ACLList, createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { t, err = tree.CreateDerivedObjectTree(payload, aclList, createStorage) @@ -50,7 +46,7 @@ func CreateSyncTree( ctx context.Context, payload tree.ObjectTreeCreatePayload, syncService syncservice.SyncService, - listener UpdateListener, + listener updatelistener.UpdateListener, aclList list.ACLList, createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { t, err = tree.CreateObjectTree(payload, aclList, createStorage) @@ -74,7 +70,7 @@ func BuildSyncTree( ctx context.Context, syncService syncservice.SyncService, treeStorage storage.TreeStorage, - listener UpdateListener, + listener updatelistener.UpdateListener, aclList list.ACLList) (t tree.ObjectTree, err error) { return buildSyncTree(ctx, syncService, treeStorage, listener, aclList) } @@ -83,7 +79,7 @@ func buildSyncTree( ctx context.Context, syncService syncservice.SyncService, treeStorage storage.TreeStorage, - listener UpdateListener, + listener updatelistener.UpdateListener, aclList list.ACLList) (t tree.ObjectTree, err error) { t, err = tree.BuildObjectTree(treeStorage, aclList) if err != nil { diff --git a/common/commonspace/synctree/updatelistener/updatelistener.go b/common/commonspace/synctree/updatelistener/updatelistener.go new file mode 100644 index 00000000..0a1a6659 --- /dev/null +++ b/common/commonspace/synctree/updatelistener/updatelistener.go @@ -0,0 +1,8 @@ +package updatelistener + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + +type UpdateListener interface { + Update(tree tree.ObjectTree) + Rebuild(tree tree.ObjectTree) +} diff --git a/common/net/rpc/rpcerr/registry.go b/common/net/rpc/rpcerr/registry.go index 872c0fd9..5160fec3 100644 --- a/common/net/rpc/rpcerr/registry.go +++ b/common/net/rpc/rpcerr/registry.go @@ -17,7 +17,7 @@ var ( func RegisterErr(err error, code uint64) error { if e, ok := errsMap[code]; ok { - panic(fmt.Errorf("attempt to register error with exiswting code: %d; registered error: %v", code, e)) + panic(fmt.Errorf("attempt to register error with existing code: %d; registered error: %v", code, e)) } errWithCode := drpcerr.WithCode(err, code) errsMap[code] = errWithCode diff --git a/common/nodeconf/service.go b/common/nodeconf/service.go index a70fe4a1..d78aab4d 100644 --- a/common/nodeconf/service.go +++ b/common/nodeconf/service.go @@ -108,7 +108,7 @@ func nodeFromConfigNode( } decodedEncryptionKey, err := keys.DecodeKeyFromString( - n.SigningKey, + n.EncryptionKey, encryptionkey.NewEncryptionRsaPrivKeyFromBytes, nil) if err != nil { From 8e6237e885d0e80ef994e3868d3b6e5f2edd917e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 29 Sep 2022 16:51:05 +0200 Subject: [PATCH 099/219] Separate diff service into components --- common/commonspace/diffservice/diffservice.go | 96 +++------------ common/commonspace/diffservice/diffsyncer.go | 112 ++++++++++++++++++ .../commonspace/diffservice/periodicsync.go | 39 +++--- common/commonspace/syncservice/syncservice.go | 4 +- 4 files changed, 153 insertions(+), 98 deletions(-) create mode 100644 common/commonspace/diffservice/diffsyncer.go diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index ff376d31..eab5c441 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -6,13 +6,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" - "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" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" "go.uber.org/zap" "strings" - "time" ) type DiffService interface { @@ -26,11 +23,9 @@ type DiffService interface { type diffService struct { spaceId string - periodicSync *periodicSync + periodicSync PeriodicSync storage storage.SpaceStorage - nconf nodeconf.Configuration diff ldiff.Diff - cache cache.TreeCache log *zap.Logger syncPeriod int @@ -40,23 +35,27 @@ func NewDiffService( spaceId string, syncPeriod int, storage storage.SpaceStorage, - nconf nodeconf.Configuration, + conf nodeconf.Configuration, cache cache.TreeCache, log *zap.Logger) DiffService { + diff := ldiff.New(16, 16) + l := log.With(zap.String("spaceId", spaceId)) + syncer := newDiffSyncer(spaceId, diff, conf, cache, storage, l) + periodicSync := newPeriodicSync(syncPeriod, syncer, l) + return &diffService{ - spaceId: spaceId, - storage: storage, - nconf: nconf, - cache: cache, - log: log, - syncPeriod: syncPeriod, + spaceId: spaceId, + storage: storage, + periodicSync: periodicSync, + diff: diff, + log: log, + syncPeriod: syncPeriod, } } func (d *diffService) Init(objectIds []string) { - d.periodicSync = newPeriodicSync(d.syncPeriod, d.sync, d.log.With(zap.String("spaceId", d.spaceId))) - d.diff = ldiff.New(16, 16) d.fillDiff(objectIds) + d.periodicSync.Run() } func (d *diffService) HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) { @@ -80,49 +79,6 @@ func (d *diffService) Close() (err error) { return nil } -func (d *diffService) sync(ctx context.Context) error { - st := time.Now() - // diffing with responsible peers according to configuration - peers, err := d.nconf.ResponsiblePeers(ctx, d.spaceId) - if err != nil { - return err - } - for _, p := range peers { - if err := d.syncWithPeer(ctx, p); err != nil { - d.log.Error("can't sync with peer", zap.String("peer", p.Id()), zap.Error(err)) - } - } - d.log.Info("synced", zap.String("spaceId", d.spaceId), zap.Duration("dur", time.Since(st))) - return nil -} - -func (d *diffService) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { - cl := spacesyncproto.NewDRPCSpaceClient(p) - rdiff := remotediff.NewRemoteDiff(d.spaceId, cl) - newIds, changedIds, removedIds, err := d.diff.Diff(ctx, rdiff) - err = rpcerr.Unwrap(err) - if err != nil && err != spacesyncproto.ErrSpaceMissing { - return err - } - if err == spacesyncproto.ErrSpaceMissing { - return d.sendPushSpaceRequest(ctx, cl) - } - - d.pingTreesInCache(ctx, newIds) - d.pingTreesInCache(ctx, changedIds) - - d.log.Info("sync done:", zap.Int("newIds", len(newIds)), - zap.Int("changedIds", len(changedIds)), - zap.Int("removedIds", len(removedIds))) - return -} - -func (d *diffService) pingTreesInCache(ctx context.Context, trees []string) { - for _, tId := range trees { - _, _ = d.cache.GetTree(ctx, d.spaceId, tId) - } -} - func (d *diffService) fillDiff(objectIds []string) { var els = make([]ldiff.Element, 0, len(objectIds)) for _, id := range objectIds { @@ -142,30 +98,6 @@ func (d *diffService) fillDiff(objectIds []string) { d.diff.Set(els...) } -func (d *diffService) sendPushSpaceRequest(ctx context.Context, cl spacesyncproto.DRPCSpaceClient) (err error) { - aclStorage, err := d.storage.ACLStorage() - if err != nil { - return - } - - root, err := aclStorage.Root() - if err != nil { - return - } - - header, err := d.storage.SpaceHeader() - if err != nil { - return - } - - _, err = cl.PushSpace(ctx, &spacesyncproto.PushSpaceRequest{ - SpaceId: d.spaceId, - SpaceHeader: header, - AclRoot: root, - }) - return -} - func concatStrings(strs []string) string { var ( b strings.Builder diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go new file mode 100644 index 00000000..8eec6c9b --- /dev/null +++ b/common/commonspace/diffservice/diffsyncer.go @@ -0,0 +1,112 @@ +package diffservice + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "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" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" + "go.uber.org/zap" + "time" +) + +type DiffSyncer interface { + Sync(ctx context.Context) error +} + +func newDiffSyncer( + spaceId string, + diff ldiff.Diff, + nconf nodeconf.Configuration, + cache cache.TreeCache, + storage storage.SpaceStorage, + log *zap.Logger) DiffSyncer { + return &diffSyncer{ + diff: diff, + nconf: nconf, + spaceId: spaceId, + cache: cache, + storage: storage, + log: log, + } +} + +type diffSyncer struct { + diff ldiff.Diff + nconf nodeconf.Configuration + spaceId string + cache cache.TreeCache + storage storage.SpaceStorage + log *zap.Logger +} + +func (d *diffSyncer) Sync(ctx context.Context) error { + st := time.Now() + // diffing with responsible peers according to configuration + peers, err := d.nconf.ResponsiblePeers(ctx, d.spaceId) + if err != nil { + return err + } + for _, p := range peers { + if err := d.syncWithPeer(ctx, p); err != nil { + d.log.Error("can't sync with peer", zap.String("peer", p.Id()), zap.Error(err)) + } + } + d.log.Info("synced", zap.String("spaceId", d.spaceId), zap.Duration("dur", time.Since(st))) + return nil +} + +func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { + cl := spacesyncproto.NewDRPCSpaceClient(p) + rdiff := remotediff.NewRemoteDiff(d.spaceId, cl) + newIds, changedIds, removedIds, err := d.diff.Diff(ctx, rdiff) + err = rpcerr.Unwrap(err) + if err != nil && err != spacesyncproto.ErrSpaceMissing { + return err + } + if err == spacesyncproto.ErrSpaceMissing { + return d.sendPushSpaceRequest(ctx, cl) + } + + d.pingTreesInCache(ctx, newIds) + d.pingTreesInCache(ctx, changedIds) + + d.log.Info("sync done:", zap.Int("newIds", len(newIds)), + zap.Int("changedIds", len(changedIds)), + zap.Int("removedIds", len(removedIds))) + return +} + +func (d *diffSyncer) pingTreesInCache(ctx context.Context, trees []string) { + for _, tId := range trees { + _, _ = d.cache.GetTree(ctx, d.spaceId, tId) + } +} + +func (d *diffSyncer) sendPushSpaceRequest(ctx context.Context, cl spacesyncproto.DRPCSpaceClient) (err error) { + aclStorage, err := d.storage.ACLStorage() + if err != nil { + return + } + + root, err := aclStorage.Root() + if err != nil { + return + } + + header, err := d.storage.SpaceHeader() + if err != nil { + return + } + + _, err = cl.PushSpace(ctx, &spacesyncproto.PushSpaceRequest{ + SpaceId: d.spaceId, + SpaceHeader: header, + AclRoot: root, + }) + return +} diff --git a/common/commonspace/diffservice/periodicsync.go b/common/commonspace/diffservice/periodicsync.go index 59616eab..a74b25cf 100644 --- a/common/commonspace/diffservice/periodicsync.go +++ b/common/commonspace/diffservice/periodicsync.go @@ -6,25 +6,34 @@ import ( "time" ) -func newPeriodicSync(periodSeconds int, sync func(ctx context.Context) error, l *zap.Logger) *periodicSync { +type PeriodicSync interface { + Run() + Close() +} + +func newPeriodicSync(periodSeconds int, syncer DiffSyncer, l *zap.Logger) *periodicSync { ctx, cancel := context.WithCancel(context.Background()) - ps := &periodicSync{ - log: l, - sync: sync, - syncCtx: ctx, - syncCancel: cancel, - syncLoopDone: make(chan struct{}), + return &periodicSync{ + syncer: syncer, + log: l, + syncCtx: ctx, + syncCancel: cancel, + syncLoopDone: make(chan struct{}), + periodSeconds: periodSeconds, } - go ps.syncLoop(periodSeconds) - return ps } type periodicSync struct { - log *zap.Logger - sync func(ctx context.Context) error - syncCtx context.Context - syncCancel context.CancelFunc - syncLoopDone chan struct{} + log *zap.Logger + syncer DiffSyncer + syncCtx context.Context + syncCancel context.CancelFunc + syncLoopDone chan struct{} + periodSeconds int +} + +func (p *periodicSync) Run() { + go p.syncLoop(p.periodSeconds) } func (p *periodicSync) syncLoop(periodSeconds int) { @@ -33,7 +42,7 @@ func (p *periodicSync) syncLoop(periodSeconds int) { doSync := func() { ctx, cancel := context.WithTimeout(p.syncCtx, time.Minute) defer cancel() - if err := p.sync(ctx); err != nil { + if err := p.syncer.Sync(ctx); err != nil { p.log.Warn("periodic sync error", zap.Error(err)) } } diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 59aa3621..0d9bf722 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -103,6 +103,8 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { cl := spacesyncproto.NewDRPCSpaceClient(peer) stream, err := cl.Stream(ctx) if err != nil { + err = rpcerr.Unwrap(err) + log.With("spaceId", s.spaceId).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 @@ -111,7 +113,7 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { err = stream.Send(&spacesyncproto.ObjectSyncMessage{SpaceId: s.spaceId}) if err != nil { err = rpcerr.Unwrap(err) - log.With("spaceId", s.spaceId).Errorf("failed to open stream: %v", err) + log.With("spaceId", s.spaceId).Errorf("failed to send first message to stream: %v", err) continue } s.streamPool.AddAndReadStreamAsync(stream) From 82eda9a0929f78fd69d9b8808f8b92f4222ad84a Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 30 Sep 2022 09:28:13 +0200 Subject: [PATCH 100/219] Prepare components for testing --- common/commonspace/diffservice/diffservice.go | 4 +- common/commonspace/diffservice/diffsyncer.go | 16 +- common/commonspace/payloads.go | 193 ++++++++++++++++++ common/commonspace/service.go | 182 +---------------- .../commonspace/spacesyncproto/spacesync.go | 15 +- common/commonspace/syncservice/syncservice.go | 14 +- 6 files changed, 234 insertions(+), 190 deletions(-) create mode 100644 common/commonspace/payloads.go diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index eab5c441..e5a94a1f 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -38,9 +38,11 @@ func NewDiffService( conf nodeconf.Configuration, cache cache.TreeCache, log *zap.Logger) DiffService { + diff := ldiff.New(16, 16) l := log.With(zap.String("spaceId", spaceId)) - syncer := newDiffSyncer(spaceId, diff, conf, cache, storage, l) + factory := spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient) + syncer := newDiffSyncer(spaceId, diff, conf, cache, storage, factory, l) periodicSync := newPeriodicSync(syncPeriod, syncer, l) return &diffService{ diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index 8eec6c9b..88cd00f4 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -24,6 +24,7 @@ func newDiffSyncer( nconf nodeconf.Configuration, cache cache.TreeCache, storage storage.SpaceStorage, + clientFactory spacesyncproto.ClientFactory, log *zap.Logger) DiffSyncer { return &diffSyncer{ diff: diff, @@ -36,12 +37,13 @@ func newDiffSyncer( } type diffSyncer struct { - diff ldiff.Diff - nconf nodeconf.Configuration - spaceId string - cache cache.TreeCache - storage storage.SpaceStorage - log *zap.Logger + spaceId string + diff ldiff.Diff + nconf nodeconf.Configuration + cache cache.TreeCache + storage storage.SpaceStorage + clientFactory spacesyncproto.ClientFactory + log *zap.Logger } func (d *diffSyncer) Sync(ctx context.Context) error { @@ -61,7 +63,7 @@ func (d *diffSyncer) Sync(ctx context.Context) error { } func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error) { - cl := spacesyncproto.NewDRPCSpaceClient(p) + cl := d.clientFactory.Client(p) rdiff := remotediff.NewRemoteDiff(d.spaceId, cl) newIds, changedIds, removedIds, err := d.diff.Diff(ctx, rdiff) err = rpcerr.Unwrap(err) diff --git a/common/commonspace/payloads.go b/common/commonspace/payloads.go new file mode 100644 index 00000000..fae285ab --- /dev/null +++ b/common/commonspace/payloads.go @@ -0,0 +1,193 @@ +package commonspace + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "hash/fnv" + "math/rand" + "time" +) + +func storagePayloadForSpaceCreate(payload SpaceCreatePayload) (storagePayload storage.SpaceStorageCreatePayload, err error) { + // unmarshalling signing and encryption keys + identity, err := payload.SigningKey.GetPublic().Raw() + if err != nil { + return + } + encPubKey, err := payload.EncryptionKey.GetPublic().Raw() + if err != nil { + return + } + + // preparing header and space id + bytes := make([]byte, 32) + _, err = rand.Read(bytes) + if err != nil { + return + } + header := &spacesyncproto.SpaceHeader{ + Identity: identity, + Timestamp: time.Now().UnixNano(), + SpaceType: payload.SpaceType, + ReplicationKey: payload.ReplicationKey, + Seed: bytes, + } + marshalled, err := header.Marshal() + if err != nil { + return + } + id, err := cid.NewCIDFromBytes(marshalled) + if err != nil { + return + } + spaceId := NewSpaceId(id, payload.ReplicationKey) + + // encrypting read key + hasher := fnv.New64() + _, err = hasher.Write(payload.ReadKey) + if err != nil { + return + } + readKeyHash := hasher.Sum64() + encReadKey, err := payload.EncryptionKey.GetPublic().Encrypt(payload.ReadKey) + if err != nil { + return + } + + // preparing acl + aclRoot := &aclrecordproto.ACLRoot{ + Identity: identity, + EncryptionKey: encPubKey, + SpaceId: spaceId, + EncryptedReadKey: encReadKey, + DerivationScheme: "", + CurrentReadKeyHash: readKeyHash, + Timestamp: time.Now().UnixNano(), + } + rawWithId, err := marshalACLRoot(aclRoot, payload.SigningKey) + if err != nil { + return + } + + // creating storage + storagePayload = storage.SpaceStorageCreatePayload{ + RecWithId: rawWithId, + SpaceHeader: header, + Id: id, + } + return +} + +func storagePayloadForSpaceDerive(payload SpaceDerivePayload) (storagePayload storage.SpaceStorageCreatePayload, err error) { + // unmarshalling signing and encryption keys + identity, err := payload.SigningKey.GetPublic().Raw() + if err != nil { + return + } + signPrivKey, err := payload.SigningKey.Raw() + if err != nil { + return + } + encPubKey, err := payload.EncryptionKey.GetPublic().Raw() + if err != nil { + return + } + encPrivKey, err := payload.EncryptionKey.Raw() + if err != nil { + return + } + + // preparing replication key + hasher := fnv.New64() + _, err = hasher.Write(identity) + if err != nil { + return + } + repKey := hasher.Sum64() + + // preparing header and space id + header := &spacesyncproto.SpaceHeader{ + Identity: identity, + SpaceType: SpaceTypeDerived, + ReplicationKey: repKey, + } + marshalled, err := header.Marshal() + if err != nil { + return + } + id, err := cid.NewCIDFromBytes(marshalled) + if err != nil { + return + } + spaceId := NewSpaceId(id, repKey) + + // deriving and encrypting read key + readKey, err := aclrecordproto.ACLReadKeyDerive(signPrivKey, encPrivKey) + if err != nil { + return + } + hasher = fnv.New64() + _, err = hasher.Write(readKey.Bytes()) + if err != nil { + return + } + readKeyHash := hasher.Sum64() + encReadKey, err := payload.EncryptionKey.GetPublic().Encrypt(readKey.Bytes()) + if err != nil { + return + } + + // preparing acl + aclRoot := &aclrecordproto.ACLRoot{ + Identity: identity, + EncryptionKey: encPubKey, + SpaceId: spaceId, + EncryptedReadKey: encReadKey, + DerivationScheme: "", + CurrentReadKeyHash: readKeyHash, + Timestamp: time.Now().UnixNano(), + } + rawWithId, err := marshalACLRoot(aclRoot, payload.SigningKey) + if err != nil { + return + } + + // creating storage + storagePayload = storage.SpaceStorageCreatePayload{ + RecWithId: rawWithId, + SpaceHeader: header, + Id: id, + } + return +} + +func marshalACLRoot(aclRoot *aclrecordproto.ACLRoot, key signingkey.PrivKey) (rawWithId *aclrecordproto.RawACLRecordWithId, err error) { + marshalledRoot, err := aclRoot.Marshal() + if err != nil { + return + } + signature, err := key.Sign(marshalledRoot) + if err != nil { + return + } + raw := &aclrecordproto.RawACLRecord{ + Payload: marshalledRoot, + Signature: signature, + } + marshalledRaw, err := raw.Marshal() + if err != nil { + return + } + aclHeadId, err := cid.NewCIDFromBytes(marshalledRaw) + if err != nil { + return + } + rawWithId = &aclrecordproto.RawACLRecordWithId{ + Payload: marshalledRaw, + Id: aclHeadId, + } + return +} diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 48f4b4cf..ef287659 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -6,17 +6,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "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/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "hash/fnv" - "math/rand" - "time" ) const CName = "common.commonspace" @@ -57,171 +50,32 @@ func (s *service) CreateSpace( ctx context.Context, cache cache.TreeCache, payload SpaceCreatePayload) (sp Space, err error) { - - // unmarshalling signing and encryption keys - identity, err := payload.SigningKey.GetPublic().Raw() + storageCreate, err := storagePayloadForSpaceCreate(payload) if err != nil { return } - encPubKey, err := payload.EncryptionKey.GetPublic().Raw() - if err != nil { - return - } - - // preparing header and space id - bytes := make([]byte, 32) - _, err = rand.Read(bytes) - if err != nil { - return - } - header := &spacesyncproto.SpaceHeader{ - Identity: identity, - Timestamp: time.Now().UnixNano(), - SpaceType: payload.SpaceType, - ReplicationKey: payload.ReplicationKey, - Seed: bytes, - } - marshalled, err := header.Marshal() - if err != nil { - return - } - id, err := cid.NewCIDFromBytes(marshalled) - if err != nil { - return - } - spaceId := NewSpaceId(id, payload.ReplicationKey) - - // encrypting read key - hasher := fnv.New64() - _, err = hasher.Write(payload.ReadKey) - if err != nil { - return - } - readKeyHash := hasher.Sum64() - encReadKey, err := payload.EncryptionKey.GetPublic().Encrypt(payload.ReadKey) - if err != nil { - return - } - - // preparing acl - aclRoot := &aclrecordproto.ACLRoot{ - Identity: identity, - EncryptionKey: encPubKey, - SpaceId: spaceId, - EncryptedReadKey: encReadKey, - DerivationScheme: "", - CurrentReadKeyHash: readKeyHash, - Timestamp: time.Now().UnixNano(), - } - rawWithId, err := marshalACLRoot(aclRoot, payload.SigningKey) - if err != nil { - return - } - - // creating storage - storageCreate := storage.SpaceStorageCreatePayload{ - RecWithId: rawWithId, - SpaceHeader: header, - Id: id, - } _, err = s.storageProvider.CreateSpaceStorage(storageCreate) if err != nil { return } - return s.GetSpace(ctx, spaceId) + return s.GetSpace(ctx, storageCreate.Id) } func (s *service) DeriveSpace( ctx context.Context, cache cache.TreeCache, payload SpaceDerivePayload) (sp Space, err error) { - - // unmarshalling signing and encryption keys - identity, err := payload.SigningKey.GetPublic().Raw() + storageCreate, err := storagePayloadForSpaceDerive(payload) if err != nil { return } - signPrivKey, err := payload.SigningKey.Raw() - if err != nil { - return - } - encPubKey, err := payload.EncryptionKey.GetPublic().Raw() - if err != nil { - return - } - encPrivKey, err := payload.EncryptionKey.Raw() - if err != nil { - return - } - - // preparing replication key - hasher := fnv.New64() - _, err = hasher.Write(identity) - if err != nil { - return - } - repKey := hasher.Sum64() - - // preparing header and space id - header := &spacesyncproto.SpaceHeader{ - Identity: identity, - SpaceType: SpaceTypeDerived, - ReplicationKey: repKey, - } - marshalled, err := header.Marshal() - if err != nil { - return - } - id, err := cid.NewCIDFromBytes(marshalled) - if err != nil { - return - } - spaceId := NewSpaceId(id, repKey) - - // deriving and encrypting read key - readKey, err := aclrecordproto.ACLReadKeyDerive(signPrivKey, encPrivKey) - if err != nil { - return - } - hasher = fnv.New64() - _, err = hasher.Write(readKey.Bytes()) - if err != nil { - return - } - readKeyHash := hasher.Sum64() - encReadKey, err := payload.EncryptionKey.GetPublic().Encrypt(readKey.Bytes()) - if err != nil { - return - } - - // preparing acl - aclRoot := &aclrecordproto.ACLRoot{ - Identity: identity, - EncryptionKey: encPubKey, - SpaceId: spaceId, - EncryptedReadKey: encReadKey, - DerivationScheme: "", - CurrentReadKeyHash: readKeyHash, - Timestamp: time.Now().UnixNano(), - } - rawWithId, err := marshalACLRoot(aclRoot, payload.SigningKey) - if err != nil { - return - } - - // creating storage - storageCreate := storage.SpaceStorageCreatePayload{ - RecWithId: rawWithId, - SpaceHeader: header, - Id: id, - } _, err = s.storageProvider.CreateSpaceStorage(storageCreate) if err != nil { return } - return s.GetSpace(ctx, spaceId) + return s.GetSpace(ctx, storageCreate.Id) } func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { @@ -244,31 +98,3 @@ func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { } return sp, nil } - -func marshalACLRoot(aclRoot *aclrecordproto.ACLRoot, key signingkey.PrivKey) (rawWithId *aclrecordproto.RawACLRecordWithId, err error) { - marshalledRoot, err := aclRoot.Marshal() - if err != nil { - return - } - signature, err := key.Sign(marshalledRoot) - if err != nil { - return - } - raw := &aclrecordproto.RawACLRecord{ - Payload: marshalledRoot, - Signature: signature, - } - marshalledRaw, err := raw.Marshal() - if err != nil { - return - } - aclHeadId, err := cid.NewCIDFromBytes(marshalledRaw) - if err != nil { - return - } - rawWithId = &aclrecordproto.RawACLRecordWithId{ - Payload: marshalledRaw, - Id: aclHeadId, - } - return -} diff --git a/common/commonspace/spacesyncproto/spacesync.go b/common/commonspace/spacesyncproto/spacesync.go index 2e22737a..d06102c4 100644 --- a/common/commonspace/spacesyncproto/spacesync.go +++ b/common/commonspace/spacesyncproto/spacesync.go @@ -1,9 +1,22 @@ package spacesyncproto -import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "storj.io/drpc" +) type SpaceStream = DRPCSpace_StreamStream +type ClientFactoryFunc func(cc drpc.Conn) DRPCSpaceClient + +func (c ClientFactoryFunc) Client(cc drpc.Conn) DRPCSpaceClient { + return c(cc) +} + +type ClientFactory interface { + Client(cc drpc.Conn) DRPCSpaceClient +} + func WrapHeadUpdate(update *ObjectHeadUpdate, rootChange *treechangeproto.RawTreeChangeWithId, treeId, trackingId string) *ObjectSyncMessage { return &ObjectSyncMessage{ Content: &ObjectSyncContentValue{ diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 0d9bf722..64ac67a6 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -38,6 +38,7 @@ type syncService struct { streamPool StreamPool headNotifiable HeadNotifiable configuration nodeconf.Configuration + clientFactory spacesyncproto.ClientFactory streamLoopCtx context.Context stopStreamLoop context.CancelFunc @@ -50,7 +51,13 @@ func NewSyncService(spaceId string, headNotifiable HeadNotifiable, cache cache.T return syncHandler.HandleMessage(ctx, senderId, message) }) syncHandler = newSyncHandler(spaceId, cache, streamPool) - return newSyncService(spaceId, headNotifiable, syncHandler, streamPool, configuration) + return newSyncService( + spaceId, + headNotifiable, + syncHandler, + streamPool, + spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient), + configuration) } func newSyncService( @@ -58,12 +65,14 @@ func newSyncService( headNotifiable HeadNotifiable, syncHandler SyncHandler, streamPool StreamPool, + clientFactory spacesyncproto.ClientFactory, configuration nodeconf.Configuration) *syncService { return &syncService{ syncHandler: syncHandler, streamPool: streamPool, headNotifiable: headNotifiable, configuration: configuration, + clientFactory: clientFactory, spaceId: spaceId, streamLoopDone: make(chan struct{}), } @@ -100,8 +109,7 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { if s.streamPool.HasActiveStream(peer.Id()) { continue } - cl := spacesyncproto.NewDRPCSpaceClient(peer) - stream, err := cl.Stream(ctx) + stream, err := s.clientFactory.Client(peer).Stream(ctx) if err != nil { err = rpcerr.Unwrap(err) log.With("spaceId", s.spaceId).Errorf("failed to open stream: %v", err) From b9c942410337323281a56bde66bed061eed3c1e0 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 30 Sep 2022 13:49:31 +0200 Subject: [PATCH 101/219] Add mock to write diffservice tests --- Makefile | 7 +- common/commonspace/cache/treecache.go | 1 + common/commonspace/cache/treecache_mock.go | 107 +++++++ .../diffservice/diffsyncer_test.go | 34 ++ .../spacesyncproto/drpcspaceclient_mock.go | 95 ++++++ .../commonspace/spacesyncproto/spacesync.go | 1 + common/commonspace/storage/storage.go | 1 + common/commonspace/storage/storage_mock.go | 193 ++++++++++++ common/nodeconf/configuration.go | 1 + common/nodeconf/configuration_mock.go | 123 ++++++++ go.mod | 8 +- go.sum | 6 + pkg/acl/list/list.go | 1 + pkg/acl/list/list_mock.go | 221 +++++++++++++ pkg/acl/tree/objecttree.go | 1 + pkg/acl/tree/objecttree_mock.go | 290 ++++++++++++++++++ pkg/ldiff/diff.go | 1 + pkg/ldiff/diff_mock.go | 135 ++++++++ 18 files changed, 1223 insertions(+), 3 deletions(-) create mode 100644 common/commonspace/cache/treecache_mock.go create mode 100644 common/commonspace/diffservice/diffsyncer_test.go create mode 100644 common/commonspace/spacesyncproto/drpcspaceclient_mock.go create mode 100644 common/commonspace/storage/storage_mock.go create mode 100644 common/nodeconf/configuration_mock.go create mode 100644 pkg/acl/list/list_mock.go create mode 100644 pkg/acl/tree/objecttree_mock.go create mode 100644 pkg/ldiff/diff_mock.go diff --git a/Makefile b/Makefile index 53ddd25b..ab14b8c4 100644 --- a/Makefile +++ b/Makefile @@ -33,4 +33,9 @@ proto: build: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) - go build -v -o bin/anytype-node -ldflags "$(FLAGS)" cmd/node/node.go \ No newline at end of file + go build -v -o bin/anytype-node -ldflags "$(FLAGS)" cmd/node/node.go + +test-deps: + @echo 'Generating test mocks...' + @go install github.com/golang/mock/mockgen + @go generate ./... \ No newline at end of file diff --git a/common/commonspace/cache/treecache.go b/common/commonspace/cache/treecache.go index 9983231f..4f72f0fd 100644 --- a/common/commonspace/cache/treecache.go +++ b/common/commonspace/cache/treecache.go @@ -1,3 +1,4 @@ +//go:generate mockgen -package cache -destination treecache_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache TreeCache package cache import ( diff --git a/common/commonspace/cache/treecache_mock.go b/common/commonspace/cache/treecache_mock.go new file mode 100644 index 00000000..1a42b411 --- /dev/null +++ b/common/commonspace/cache/treecache_mock.go @@ -0,0 +1,107 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache (interfaces: TreeCache) + +// Package cache is a generated GoMock package. +package cache + +import ( + context "context" + reflect "reflect" + + app "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + gomock "github.com/golang/mock/gomock" +) + +// MockTreeCache is a mock of TreeCache interface. +type MockTreeCache struct { + ctrl *gomock.Controller + recorder *MockTreeCacheMockRecorder +} + +// MockTreeCacheMockRecorder is the mock recorder for MockTreeCache. +type MockTreeCacheMockRecorder struct { + mock *MockTreeCache +} + +// NewMockTreeCache creates a new mock instance. +func NewMockTreeCache(ctrl *gomock.Controller) *MockTreeCache { + mock := &MockTreeCache{ctrl: ctrl} + mock.recorder = &MockTreeCacheMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockTreeCache) EXPECT() *MockTreeCacheMockRecorder { + return m.recorder +} + +// Close mocks base method. +func (m *MockTreeCache) Close(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close. +func (mr *MockTreeCacheMockRecorder) Close(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockTreeCache)(nil).Close), arg0) +} + +// GetTree mocks base method. +func (m *MockTreeCache) GetTree(arg0 context.Context, arg1, arg2 string) (TreeResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetTree", arg0, arg1, arg2) + ret0, _ := ret[0].(TreeResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTree indicates an expected call of GetTree. +func (mr *MockTreeCacheMockRecorder) GetTree(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTree", reflect.TypeOf((*MockTreeCache)(nil).GetTree), arg0, arg1, arg2) +} + +// Init mocks base method. +func (m *MockTreeCache) Init(arg0 *app.App) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Init", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Init indicates an expected call of Init. +func (mr *MockTreeCacheMockRecorder) Init(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockTreeCache)(nil).Init), arg0) +} + +// Name mocks base method. +func (m *MockTreeCache) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *MockTreeCacheMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockTreeCache)(nil).Name)) +} + +// Run mocks base method. +func (m *MockTreeCache) Run(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Run", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Run indicates an expected call of Run. +func (mr *MockTreeCacheMockRecorder) Run(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockTreeCache)(nil).Run), arg0) +} diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go new file mode 100644 index 00000000..af199c54 --- /dev/null +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -0,0 +1,34 @@ +package diffservice + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" + "github.com/golang/mock/gomock" + "storj.io/drpc" + "testing" +) + +func TestDiffSyncer_Sync(t *testing.T) { + // setup + ctx := context.Background() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + diffMock := ldiff.NewMockDiff(ctrl) + nconfMock := nodeconf.NewMockConfiguration(ctrl) + cacheMock := cache.NewMockTreeCache(ctrl) + stMock := storage.NewMockSpaceStorage(ctrl) + clientMock := spacesyncproto.NewMockDRPCSpaceClient(ctrl) + factory := spacesyncproto.ClientFactoryFunc(func(cc drpc.Conn) spacesyncproto.DRPCSpaceClient { + return clientMock + }) + spaceId := "spaceId" + l := logger.NewNamed(spaceId) + diffSyncer := newDiffSyncer(spaceId, diffMock, nconfMock, cacheMock, stMock, factory, l) + diffSyncer.Sync(ctx) +} diff --git a/common/commonspace/spacesyncproto/drpcspaceclient_mock.go b/common/commonspace/spacesyncproto/drpcspaceclient_mock.go new file mode 100644 index 00000000..4e8fd108 --- /dev/null +++ b/common/commonspace/spacesyncproto/drpcspaceclient_mock.go @@ -0,0 +1,95 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto (interfaces: DRPCSpaceClient) + +// Package spacesyncproto is a generated GoMock package. +package spacesyncproto + +import ( + context "context" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" + drpc "storj.io/drpc" +) + +// MockDRPCSpaceClient is a mock of DRPCSpaceClient interface. +type MockDRPCSpaceClient struct { + ctrl *gomock.Controller + recorder *MockDRPCSpaceClientMockRecorder +} + +// MockDRPCSpaceClientMockRecorder is the mock recorder for MockDRPCSpaceClient. +type MockDRPCSpaceClientMockRecorder struct { + mock *MockDRPCSpaceClient +} + +// NewMockDRPCSpaceClient creates a new mock instance. +func NewMockDRPCSpaceClient(ctrl *gomock.Controller) *MockDRPCSpaceClient { + mock := &MockDRPCSpaceClient{ctrl: ctrl} + mock.recorder = &MockDRPCSpaceClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockDRPCSpaceClient) EXPECT() *MockDRPCSpaceClientMockRecorder { + return m.recorder +} + +// DRPCConn mocks base method. +func (m *MockDRPCSpaceClient) DRPCConn() drpc.Conn { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DRPCConn") + ret0, _ := ret[0].(drpc.Conn) + return ret0 +} + +// DRPCConn indicates an expected call of DRPCConn. +func (mr *MockDRPCSpaceClientMockRecorder) DRPCConn() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DRPCConn", reflect.TypeOf((*MockDRPCSpaceClient)(nil).DRPCConn)) +} + +// HeadSync mocks base method. +func (m *MockDRPCSpaceClient) HeadSync(arg0 context.Context, arg1 *HeadSyncRequest) (*HeadSyncResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HeadSync", arg0, arg1) + ret0, _ := ret[0].(*HeadSyncResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// HeadSync indicates an expected call of HeadSync. +func (mr *MockDRPCSpaceClientMockRecorder) HeadSync(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadSync", reflect.TypeOf((*MockDRPCSpaceClient)(nil).HeadSync), arg0, arg1) +} + +// PushSpace mocks base method. +func (m *MockDRPCSpaceClient) PushSpace(arg0 context.Context, arg1 *PushSpaceRequest) (*PushSpaceResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PushSpace", arg0, arg1) + ret0, _ := ret[0].(*PushSpaceResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PushSpace indicates an expected call of PushSpace. +func (mr *MockDRPCSpaceClientMockRecorder) PushSpace(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PushSpace", reflect.TypeOf((*MockDRPCSpaceClient)(nil).PushSpace), arg0, arg1) +} + +// Stream mocks base method. +func (m *MockDRPCSpaceClient) Stream(arg0 context.Context) (DRPCSpace_StreamClient, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stream", arg0) + ret0, _ := ret[0].(DRPCSpace_StreamClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Stream indicates an expected call of Stream. +func (mr *MockDRPCSpaceClientMockRecorder) Stream(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stream", reflect.TypeOf((*MockDRPCSpaceClient)(nil).Stream), arg0) +} diff --git a/common/commonspace/spacesyncproto/spacesync.go b/common/commonspace/spacesyncproto/spacesync.go index d06102c4..e7924694 100644 --- a/common/commonspace/spacesyncproto/spacesync.go +++ b/common/commonspace/spacesyncproto/spacesync.go @@ -1,3 +1,4 @@ +//go:generate mockgen -package spacesyncproto -destination drpcspaceclient_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto DRPCSpaceClient package spacesyncproto import ( diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index add06e08..60d852e6 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -1,3 +1,4 @@ +//go:generate mockgen -package storage -destination storage_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage SpaceStorageProvider,SpaceStorage package storage import ( diff --git a/common/commonspace/storage/storage_mock.go b/common/commonspace/storage/storage_mock.go new file mode 100644 index 00000000..c671fbad --- /dev/null +++ b/common/commonspace/storage/storage_mock.go @@ -0,0 +1,193 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage (interfaces: SpaceStorageProvider,SpaceStorage) + +// Package storage is a generated GoMock package. +package storage + +import ( + reflect "reflect" + + app "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + storage0 "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + gomock "github.com/golang/mock/gomock" +) + +// MockSpaceStorageProvider is a mock of SpaceStorageProvider interface. +type MockSpaceStorageProvider struct { + ctrl *gomock.Controller + recorder *MockSpaceStorageProviderMockRecorder +} + +// MockSpaceStorageProviderMockRecorder is the mock recorder for MockSpaceStorageProvider. +type MockSpaceStorageProviderMockRecorder struct { + mock *MockSpaceStorageProvider +} + +// NewMockSpaceStorageProvider creates a new mock instance. +func NewMockSpaceStorageProvider(ctrl *gomock.Controller) *MockSpaceStorageProvider { + mock := &MockSpaceStorageProvider{ctrl: ctrl} + mock.recorder = &MockSpaceStorageProviderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockSpaceStorageProvider) EXPECT() *MockSpaceStorageProviderMockRecorder { + return m.recorder +} + +// CreateSpaceStorage mocks base method. +func (m *MockSpaceStorageProvider) CreateSpaceStorage(arg0 SpaceStorageCreatePayload) (SpaceStorage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateSpaceStorage", arg0) + ret0, _ := ret[0].(SpaceStorage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateSpaceStorage indicates an expected call of CreateSpaceStorage. +func (mr *MockSpaceStorageProviderMockRecorder) CreateSpaceStorage(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSpaceStorage", reflect.TypeOf((*MockSpaceStorageProvider)(nil).CreateSpaceStorage), arg0) +} + +// Init mocks base method. +func (m *MockSpaceStorageProvider) Init(arg0 *app.App) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Init", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Init indicates an expected call of Init. +func (mr *MockSpaceStorageProviderMockRecorder) Init(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockSpaceStorageProvider)(nil).Init), arg0) +} + +// Name mocks base method. +func (m *MockSpaceStorageProvider) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *MockSpaceStorageProviderMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockSpaceStorageProvider)(nil).Name)) +} + +// SpaceStorage mocks base method. +func (m *MockSpaceStorageProvider) SpaceStorage(arg0 string) (SpaceStorage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SpaceStorage", arg0) + ret0, _ := ret[0].(SpaceStorage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SpaceStorage indicates an expected call of SpaceStorage. +func (mr *MockSpaceStorageProviderMockRecorder) SpaceStorage(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SpaceStorage", reflect.TypeOf((*MockSpaceStorageProvider)(nil).SpaceStorage), arg0) +} + +// MockSpaceStorage is a mock of SpaceStorage interface. +type MockSpaceStorage struct { + ctrl *gomock.Controller + recorder *MockSpaceStorageMockRecorder +} + +// MockSpaceStorageMockRecorder is the mock recorder for MockSpaceStorage. +type MockSpaceStorageMockRecorder struct { + mock *MockSpaceStorage +} + +// NewMockSpaceStorage creates a new mock instance. +func NewMockSpaceStorage(ctrl *gomock.Controller) *MockSpaceStorage { + mock := &MockSpaceStorage{ctrl: ctrl} + mock.recorder = &MockSpaceStorageMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockSpaceStorage) EXPECT() *MockSpaceStorageMockRecorder { + return m.recorder +} + +// ACLStorage mocks base method. +func (m *MockSpaceStorage) ACLStorage() (storage0.ListStorage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ACLStorage") + ret0, _ := ret[0].(storage0.ListStorage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ACLStorage indicates an expected call of ACLStorage. +func (mr *MockSpaceStorageMockRecorder) ACLStorage() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ACLStorage", reflect.TypeOf((*MockSpaceStorage)(nil).ACLStorage)) +} + +// CreateTreeStorage mocks base method. +func (m *MockSpaceStorage) CreateTreeStorage(arg0 storage0.TreeStorageCreatePayload) (storage0.TreeStorage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateTreeStorage", arg0) + ret0, _ := ret[0].(storage0.TreeStorage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateTreeStorage indicates an expected call of CreateTreeStorage. +func (mr *MockSpaceStorageMockRecorder) CreateTreeStorage(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTreeStorage", reflect.TypeOf((*MockSpaceStorage)(nil).CreateTreeStorage), arg0) +} + +// SpaceHeader mocks base method. +func (m *MockSpaceStorage) SpaceHeader() (*spacesyncproto.SpaceHeader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SpaceHeader") + ret0, _ := ret[0].(*spacesyncproto.SpaceHeader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SpaceHeader indicates an expected call of SpaceHeader. +func (mr *MockSpaceStorageMockRecorder) SpaceHeader() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SpaceHeader", reflect.TypeOf((*MockSpaceStorage)(nil).SpaceHeader)) +} + +// StoredIds mocks base method. +func (m *MockSpaceStorage) StoredIds() ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StoredIds") + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StoredIds indicates an expected call of StoredIds. +func (mr *MockSpaceStorageMockRecorder) StoredIds() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoredIds", reflect.TypeOf((*MockSpaceStorage)(nil).StoredIds)) +} + +// TreeStorage mocks base method. +func (m *MockSpaceStorage) TreeStorage(arg0 string) (storage0.TreeStorage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TreeStorage", arg0) + ret0, _ := ret[0].(storage0.TreeStorage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// TreeStorage indicates an expected call of TreeStorage. +func (mr *MockSpaceStorageMockRecorder) TreeStorage(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TreeStorage", reflect.TypeOf((*MockSpaceStorage)(nil).TreeStorage), arg0) +} diff --git a/common/nodeconf/configuration.go b/common/nodeconf/configuration.go index 597d1018..cb169103 100644 --- a/common/nodeconf/configuration.go +++ b/common/nodeconf/configuration.go @@ -1,3 +1,4 @@ +//go:generate mockgen -package nodeconf -destination configuration_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf Configuration package nodeconf import ( diff --git a/common/nodeconf/configuration_mock.go b/common/nodeconf/configuration_mock.go new file mode 100644 index 00000000..c84e1848 --- /dev/null +++ b/common/nodeconf/configuration_mock.go @@ -0,0 +1,123 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf (interfaces: Configuration) + +// Package nodeconf is a generated GoMock package. +package nodeconf + +import ( + context "context" + reflect "reflect" + + peer "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" + gomock "github.com/golang/mock/gomock" +) + +// MockConfiguration is a mock of Configuration interface. +type MockConfiguration struct { + ctrl *gomock.Controller + recorder *MockConfigurationMockRecorder +} + +// MockConfigurationMockRecorder is the mock recorder for MockConfiguration. +type MockConfigurationMockRecorder struct { + mock *MockConfiguration +} + +// NewMockConfiguration creates a new mock instance. +func NewMockConfiguration(ctrl *gomock.Controller) *MockConfiguration { + mock := &MockConfiguration{ctrl: ctrl} + mock.recorder = &MockConfigurationMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockConfiguration) EXPECT() *MockConfigurationMockRecorder { + return m.recorder +} + +// AllPeers mocks base method. +func (m *MockConfiguration) AllPeers(arg0 context.Context, arg1 string) ([]peer.Peer, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AllPeers", arg0, arg1) + ret0, _ := ret[0].([]peer.Peer) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllPeers indicates an expected call of AllPeers. +func (mr *MockConfigurationMockRecorder) AllPeers(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllPeers", reflect.TypeOf((*MockConfiguration)(nil).AllPeers), arg0, arg1) +} + +// Id mocks base method. +func (m *MockConfiguration) Id() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Id") + ret0, _ := ret[0].(string) + return ret0 +} + +// Id indicates an expected call of Id. +func (mr *MockConfigurationMockRecorder) Id() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Id", reflect.TypeOf((*MockConfiguration)(nil).Id)) +} + +// IsResponsible mocks base method. +func (m *MockConfiguration) IsResponsible(arg0 string) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsResponsible", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsResponsible indicates an expected call of IsResponsible. +func (mr *MockConfigurationMockRecorder) IsResponsible(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsResponsible", reflect.TypeOf((*MockConfiguration)(nil).IsResponsible), arg0) +} + +// NodeIds mocks base method. +func (m *MockConfiguration) NodeIds(arg0 string) []string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NodeIds", arg0) + ret0, _ := ret[0].([]string) + return ret0 +} + +// NodeIds indicates an expected call of NodeIds. +func (mr *MockConfigurationMockRecorder) NodeIds(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeIds", reflect.TypeOf((*MockConfiguration)(nil).NodeIds), arg0) +} + +// OnePeer mocks base method. +func (m *MockConfiguration) OnePeer(arg0 context.Context, arg1 string) (peer.Peer, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OnePeer", arg0, arg1) + ret0, _ := ret[0].(peer.Peer) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// OnePeer indicates an expected call of OnePeer. +func (mr *MockConfigurationMockRecorder) OnePeer(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnePeer", reflect.TypeOf((*MockConfiguration)(nil).OnePeer), arg0, arg1) +} + +// ResponsiblePeers mocks base method. +func (m *MockConfiguration) ResponsiblePeers(arg0 context.Context, arg1 string) ([]peer.Peer, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ResponsiblePeers", arg0, arg1) + ret0, _ := ret[0].([]peer.Peer) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ResponsiblePeers indicates an expected call of ResponsiblePeers. +func (mr *MockConfigurationMockRecorder) ResponsiblePeers(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResponsiblePeers", reflect.TypeOf((*MockConfiguration)(nil).ResponsiblePeers), arg0, arg1) +} diff --git a/go.mod b/go.mod index 9c60aa54..65064b7d 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/ipfs/go-cid v0.1.0 github.com/libp2p/go-libp2p v0.20.3 github.com/libp2p/go-libp2p-core v0.16.1 - github.com/mr-tron/base58 v1.2.0 + github.com/minio/sha256-simd v1.0.0 github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.1.0 github.com/stretchr/testify v1.8.0 @@ -33,11 +33,12 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/mock v1.6.0 // indirect github.com/klauspost/cpuid/v2 v2.0.12 // indirect github.com/libp2p/go-buffer-pool v0.0.2 // indirect github.com/libp2p/go-openssl v0.0.7 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // 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.0.3 // indirect github.com/multiformats/go-base36 v0.1.0 // indirect github.com/multiformats/go-multiaddr v0.5.0 // indirect @@ -51,7 +52,10 @@ require ( go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect + golang.org/x/mod v0.4.2 // indirect golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect + golang.org/x/tools v0.1.5 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.1.6 // indirect diff --git a/go.sum b/go.sum index 34c05834..8982483e 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= @@ -141,6 +143,7 @@ golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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= @@ -173,10 +176,13 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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= 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= diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index 46a48681..0e2a31ed 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -1,3 +1,4 @@ +//go:generate mockgen -package list -destination list_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list ACLList package list import ( diff --git a/pkg/acl/list/list_mock.go b/pkg/acl/list/list_mock.go new file mode 100644 index 00000000..215ca59e --- /dev/null +++ b/pkg/acl/list/list_mock.go @@ -0,0 +1,221 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list (interfaces: ACLList) + +// Package list is a generated GoMock package. +package list + +import ( + reflect "reflect" + + aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + gomock "github.com/golang/mock/gomock" +) + +// MockACLList is a mock of ACLList interface. +type MockACLList struct { + ctrl *gomock.Controller + recorder *MockACLListMockRecorder +} + +// MockACLListMockRecorder is the mock recorder for MockACLList. +type MockACLListMockRecorder struct { + mock *MockACLList +} + +// NewMockACLList creates a new mock instance. +func NewMockACLList(ctrl *gomock.Controller) *MockACLList { + mock := &MockACLList{ctrl: ctrl} + mock.recorder = &MockACLListMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockACLList) EXPECT() *MockACLListMockRecorder { + return m.recorder +} + +// ACLState mocks base method. +func (m *MockACLList) ACLState() *ACLState { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ACLState") + ret0, _ := ret[0].(*ACLState) + return ret0 +} + +// ACLState indicates an expected call of ACLState. +func (mr *MockACLListMockRecorder) ACLState() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ACLState", reflect.TypeOf((*MockACLList)(nil).ACLState)) +} + +// Close mocks base method. +func (m *MockACLList) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close. +func (mr *MockACLListMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockACLList)(nil).Close)) +} + +// Get mocks base method. +func (m *MockACLList) Get(arg0 string) (*ACLRecord, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Get", arg0) + ret0, _ := ret[0].(*ACLRecord) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Get indicates an expected call of Get. +func (mr *MockACLListMockRecorder) Get(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockACLList)(nil).Get), arg0) +} + +// Head mocks base method. +func (m *MockACLList) Head() *ACLRecord { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Head") + ret0, _ := ret[0].(*ACLRecord) + return ret0 +} + +// Head indicates an expected call of Head. +func (mr *MockACLListMockRecorder) Head() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Head", reflect.TypeOf((*MockACLList)(nil).Head)) +} + +// ID mocks base method. +func (m *MockACLList) ID() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(string) + return ret0 +} + +// ID indicates an expected call of ID. +func (mr *MockACLListMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockACLList)(nil).ID)) +} + +// IsAfter mocks base method. +func (m *MockACLList) IsAfter(arg0, arg1 string) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsAfter", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// IsAfter indicates an expected call of IsAfter. +func (mr *MockACLListMockRecorder) IsAfter(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsAfter", reflect.TypeOf((*MockACLList)(nil).IsAfter), arg0, arg1) +} + +// Iterate mocks base method. +func (m *MockACLList) Iterate(arg0 func(*ACLRecord) bool) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Iterate", arg0) +} + +// Iterate indicates an expected call of Iterate. +func (mr *MockACLListMockRecorder) Iterate(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Iterate", reflect.TypeOf((*MockACLList)(nil).Iterate), arg0) +} + +// IterateFrom mocks base method. +func (m *MockACLList) IterateFrom(arg0 string, arg1 func(*ACLRecord) bool) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "IterateFrom", arg0, arg1) +} + +// IterateFrom indicates an expected call of IterateFrom. +func (mr *MockACLListMockRecorder) IterateFrom(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IterateFrom", reflect.TypeOf((*MockACLList)(nil).IterateFrom), arg0, arg1) +} + +// Lock mocks base method. +func (m *MockACLList) Lock() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Lock") +} + +// Lock indicates an expected call of Lock. +func (mr *MockACLListMockRecorder) Lock() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Lock", reflect.TypeOf((*MockACLList)(nil).Lock)) +} + +// RLock mocks base method. +func (m *MockACLList) RLock() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "RLock") +} + +// RLock indicates an expected call of RLock. +func (mr *MockACLListMockRecorder) RLock() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RLock", reflect.TypeOf((*MockACLList)(nil).RLock)) +} + +// RUnlock mocks base method. +func (m *MockACLList) RUnlock() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "RUnlock") +} + +// RUnlock indicates an expected call of RUnlock. +func (mr *MockACLListMockRecorder) RUnlock() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RUnlock", reflect.TypeOf((*MockACLList)(nil).RUnlock)) +} + +// Records mocks base method. +func (m *MockACLList) Records() []*ACLRecord { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Records") + ret0, _ := ret[0].([]*ACLRecord) + return ret0 +} + +// Records indicates an expected call of Records. +func (mr *MockACLListMockRecorder) Records() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Records", reflect.TypeOf((*MockACLList)(nil).Records)) +} + +// Root mocks base method. +func (m *MockACLList) Root() *aclrecordproto.ACLRoot { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Root") + ret0, _ := ret[0].(*aclrecordproto.ACLRoot) + return ret0 +} + +// Root indicates an expected call of Root. +func (mr *MockACLListMockRecorder) Root() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Root", reflect.TypeOf((*MockACLList)(nil).Root)) +} + +// Unlock mocks base method. +func (m *MockACLList) Unlock() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Unlock") +} + +// Unlock indicates an expected call of Unlock. +func (mr *MockACLListMockRecorder) Unlock() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unlock", reflect.TypeOf((*MockACLList)(nil).Unlock)) +} diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index bb342070..95348feb 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -1,3 +1,4 @@ +//go:generate mockgen -package tree -destination objecttree_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree ObjectTree package tree import ( diff --git a/pkg/acl/tree/objecttree_mock.go b/pkg/acl/tree/objecttree_mock.go new file mode 100644 index 00000000..5632850d --- /dev/null +++ b/pkg/acl/tree/objecttree_mock.go @@ -0,0 +1,290 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree (interfaces: ObjectTree) + +// Package tree is a generated GoMock package. +package tree + +import ( + context "context" + reflect "reflect" + + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + gomock "github.com/golang/mock/gomock" +) + +// MockObjectTree is a mock of ObjectTree interface. +type MockObjectTree struct { + ctrl *gomock.Controller + recorder *MockObjectTreeMockRecorder +} + +// MockObjectTreeMockRecorder is the mock recorder for MockObjectTree. +type MockObjectTreeMockRecorder struct { + mock *MockObjectTree +} + +// NewMockObjectTree creates a new mock instance. +func NewMockObjectTree(ctrl *gomock.Controller) *MockObjectTree { + mock := &MockObjectTree{ctrl: ctrl} + mock.recorder = &MockObjectTreeMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockObjectTree) EXPECT() *MockObjectTreeMockRecorder { + return m.recorder +} + +// AddContent mocks base method. +func (m *MockObjectTree) AddContent(arg0 context.Context, arg1 SignableChangeContent) (AddResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddContent", arg0, arg1) + ret0, _ := ret[0].(AddResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AddContent indicates an expected call of AddContent. +func (mr *MockObjectTreeMockRecorder) AddContent(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddContent", reflect.TypeOf((*MockObjectTree)(nil).AddContent), arg0, arg1) +} + +// AddRawChanges mocks base method. +func (m *MockObjectTree) AddRawChanges(arg0 context.Context, arg1 ...*treechangeproto.RawTreeChangeWithId) (AddResult, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AddRawChanges", varargs...) + ret0, _ := ret[0].(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 { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawChanges", reflect.TypeOf((*MockObjectTree)(nil).AddRawChanges), varargs...) +} + +// ChangesAfterCommonSnapshot mocks base method. +func (m *MockObjectTree) ChangesAfterCommonSnapshot(arg0, arg1 []string) ([]*treechangeproto.RawTreeChangeWithId, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChangesAfterCommonSnapshot", arg0, arg1) + ret0, _ := ret[0].([]*treechangeproto.RawTreeChangeWithId) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChangesAfterCommonSnapshot indicates an expected call of ChangesAfterCommonSnapshot. +func (mr *MockObjectTreeMockRecorder) ChangesAfterCommonSnapshot(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChangesAfterCommonSnapshot", reflect.TypeOf((*MockObjectTree)(nil).ChangesAfterCommonSnapshot), arg0, arg1) +} + +// Close mocks base method. +func (m *MockObjectTree) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close. +func (mr *MockObjectTreeMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockObjectTree)(nil).Close)) +} + +// DebugDump mocks base method. +func (m *MockObjectTree) DebugDump() (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DebugDump") + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DebugDump indicates an expected call of DebugDump. +func (mr *MockObjectTreeMockRecorder) DebugDump() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugDump", reflect.TypeOf((*MockObjectTree)(nil).DebugDump)) +} + +// HasChange mocks base method. +func (m *MockObjectTree) HasChange(arg0 string) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HasChange", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// HasChange indicates an expected call of HasChange. +func (mr *MockObjectTreeMockRecorder) HasChange(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasChange", reflect.TypeOf((*MockObjectTree)(nil).HasChange), arg0) +} + +// Header mocks base method. +func (m *MockObjectTree) Header() *treechangeproto.RawTreeChangeWithId { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Header") + ret0, _ := ret[0].(*treechangeproto.RawTreeChangeWithId) + return ret0 +} + +// Header indicates an expected call of Header. +func (mr *MockObjectTreeMockRecorder) Header() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockObjectTree)(nil).Header)) +} + +// Heads mocks base method. +func (m *MockObjectTree) Heads() []string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Heads") + ret0, _ := ret[0].([]string) + return ret0 +} + +// Heads indicates an expected call of Heads. +func (mr *MockObjectTreeMockRecorder) Heads() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Heads", reflect.TypeOf((*MockObjectTree)(nil).Heads)) +} + +// ID mocks base method. +func (m *MockObjectTree) ID() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(string) + return ret0 +} + +// ID indicates an expected call of ID. +func (mr *MockObjectTreeMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockObjectTree)(nil).ID)) +} + +// Iterate mocks base method. +func (m *MockObjectTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*Change) bool) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Iterate", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Iterate indicates an expected call of Iterate. +func (mr *MockObjectTreeMockRecorder) Iterate(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Iterate", reflect.TypeOf((*MockObjectTree)(nil).Iterate), arg0, arg1) +} + +// IterateFrom mocks base method. +func (m *MockObjectTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*Change) bool) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IterateFrom", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// IterateFrom indicates an expected call of IterateFrom. +func (mr *MockObjectTreeMockRecorder) IterateFrom(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IterateFrom", reflect.TypeOf((*MockObjectTree)(nil).IterateFrom), arg0, arg1, arg2) +} + +// Lock mocks base method. +func (m *MockObjectTree) Lock() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Lock") +} + +// Lock indicates an expected call of Lock. +func (mr *MockObjectTreeMockRecorder) Lock() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Lock", reflect.TypeOf((*MockObjectTree)(nil).Lock)) +} + +// RLock mocks base method. +func (m *MockObjectTree) RLock() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "RLock") +} + +// RLock indicates an expected call of RLock. +func (mr *MockObjectTreeMockRecorder) RLock() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RLock", reflect.TypeOf((*MockObjectTree)(nil).RLock)) +} + +// RUnlock mocks base method. +func (m *MockObjectTree) RUnlock() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "RUnlock") +} + +// RUnlock indicates an expected call of RUnlock. +func (mr *MockObjectTreeMockRecorder) RUnlock() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RUnlock", reflect.TypeOf((*MockObjectTree)(nil).RUnlock)) +} + +// Root mocks base method. +func (m *MockObjectTree) Root() *Change { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Root") + ret0, _ := ret[0].(*Change) + return ret0 +} + +// Root indicates an expected call of Root. +func (mr *MockObjectTreeMockRecorder) Root() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Root", reflect.TypeOf((*MockObjectTree)(nil).Root)) +} + +// SnapshotPath mocks base method. +func (m *MockObjectTree) SnapshotPath() []string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SnapshotPath") + ret0, _ := ret[0].([]string) + return ret0 +} + +// SnapshotPath indicates an expected call of SnapshotPath. +func (mr *MockObjectTreeMockRecorder) SnapshotPath() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SnapshotPath", reflect.TypeOf((*MockObjectTree)(nil).SnapshotPath)) +} + +// Storage mocks base method. +func (m *MockObjectTree) Storage() storage.TreeStorage { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Storage") + ret0, _ := ret[0].(storage.TreeStorage) + return ret0 +} + +// Storage indicates an expected call of Storage. +func (mr *MockObjectTreeMockRecorder) Storage() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Storage", reflect.TypeOf((*MockObjectTree)(nil).Storage)) +} + +// Unlock mocks base method. +func (m *MockObjectTree) Unlock() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Unlock") +} + +// Unlock indicates an expected call of Unlock. +func (mr *MockObjectTreeMockRecorder) Unlock() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unlock", reflect.TypeOf((*MockObjectTree)(nil).Unlock)) +} diff --git a/pkg/ldiff/diff.go b/pkg/ldiff/diff.go index 6f276afd..10346e45 100644 --- a/pkg/ldiff/diff.go +++ b/pkg/ldiff/diff.go @@ -1,3 +1,4 @@ +//go:generate mockgen -package ldiff -destination diff_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff Diff,Remote // Package ldiff provides a container of elements with fixed id and changeable content. // Diff can calculate the difference with another diff container (you can make it remote) with minimum hops and traffic. package ldiff diff --git a/pkg/ldiff/diff_mock.go b/pkg/ldiff/diff_mock.go new file mode 100644 index 00000000..e750af44 --- /dev/null +++ b/pkg/ldiff/diff_mock.go @@ -0,0 +1,135 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff (interfaces: Diff,Remote) + +// Package ldiff is a generated GoMock package. +package ldiff + +import ( + context "context" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" +) + +// MockDiff is a mock of Diff interface. +type MockDiff struct { + ctrl *gomock.Controller + recorder *MockDiffMockRecorder +} + +// MockDiffMockRecorder is the mock recorder for MockDiff. +type MockDiffMockRecorder struct { + mock *MockDiff +} + +// NewMockDiff creates a new mock instance. +func NewMockDiff(ctrl *gomock.Controller) *MockDiff { + mock := &MockDiff{ctrl: ctrl} + mock.recorder = &MockDiffMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockDiff) EXPECT() *MockDiffMockRecorder { + return m.recorder +} + +// Diff mocks base method. +func (m *MockDiff) Diff(arg0 context.Context, arg1 Remote) ([]string, []string, []string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Diff", arg0, arg1) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].([]string) + ret2, _ := ret[2].([]string) + ret3, _ := ret[3].(error) + return ret0, ret1, ret2, ret3 +} + +// Diff indicates an expected call of Diff. +func (mr *MockDiffMockRecorder) Diff(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Diff", reflect.TypeOf((*MockDiff)(nil).Diff), arg0, arg1) +} + +// Ranges mocks base method. +func (m *MockDiff) Ranges(arg0 context.Context, arg1 []Range, arg2 []RangeResult) ([]RangeResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Ranges", arg0, arg1, arg2) + ret0, _ := ret[0].([]RangeResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Ranges indicates an expected call of Ranges. +func (mr *MockDiffMockRecorder) Ranges(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Ranges", reflect.TypeOf((*MockDiff)(nil).Ranges), arg0, arg1, arg2) +} + +// RemoveId mocks base method. +func (m *MockDiff) RemoveId(arg0 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoveId", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// RemoveId indicates an expected call of RemoveId. +func (mr *MockDiffMockRecorder) RemoveId(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveId", reflect.TypeOf((*MockDiff)(nil).RemoveId), arg0) +} + +// Set mocks base method. +func (m *MockDiff) Set(arg0 ...Element) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "Set", varargs...) +} + +// Set indicates an expected call of Set. +func (mr *MockDiffMockRecorder) Set(arg0 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockDiff)(nil).Set), arg0...) +} + +// MockRemote is a mock of Remote interface. +type MockRemote struct { + ctrl *gomock.Controller + recorder *MockRemoteMockRecorder +} + +// MockRemoteMockRecorder is the mock recorder for MockRemote. +type MockRemoteMockRecorder struct { + mock *MockRemote +} + +// NewMockRemote creates a new mock instance. +func NewMockRemote(ctrl *gomock.Controller) *MockRemote { + mock := &MockRemote{ctrl: ctrl} + mock.recorder = &MockRemoteMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockRemote) EXPECT() *MockRemoteMockRecorder { + return m.recorder +} + +// Ranges mocks base method. +func (m *MockRemote) Ranges(arg0 context.Context, arg1 []Range, arg2 []RangeResult) ([]RangeResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Ranges", arg0, arg1, arg2) + ret0, _ := ret[0].([]RangeResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Ranges indicates an expected call of Ranges. +func (mr *MockRemoteMockRecorder) Ranges(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Ranges", reflect.TypeOf((*MockRemote)(nil).Ranges), arg0, arg1, arg2) +} From 68ed132e61975ba29b17a8f4d942ee102bff37b0 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 30 Sep 2022 14:21:48 +0200 Subject: [PATCH 102/219] Make sync test --- common/commonspace/diffservice/diffsyncer.go | 13 +++++++------ .../diffservice/diffsyncer_test.go | 19 ++++++++++++++++++- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index 88cd00f4..8e354294 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -27,12 +27,13 @@ func newDiffSyncer( clientFactory spacesyncproto.ClientFactory, log *zap.Logger) DiffSyncer { return &diffSyncer{ - diff: diff, - nconf: nconf, - spaceId: spaceId, - cache: cache, - storage: storage, - log: log, + diff: diff, + nconf: nconf, + spaceId: spaceId, + cache: cache, + storage: storage, + clientFactory: clientFactory, + log: log, } } diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index af199c54..ffc610c8 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -4,8 +4,10 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" "github.com/golang/mock/gomock" @@ -30,5 +32,20 @@ func TestDiffSyncer_Sync(t *testing.T) { spaceId := "spaceId" l := logger.NewNamed(spaceId) diffSyncer := newDiffSyncer(spaceId, diffMock, nconfMock, cacheMock, stMock, factory, l) - diffSyncer.Sync(ctx) + + t.Run("diff syncer sync simple", func(t *testing.T) { + nconfMock.EXPECT(). + ResponsiblePeers(gomock.Any(), spaceId). + Return([]peer.Peer{nil}, nil) + diffMock.EXPECT(). + Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). + Return([]string{"new"}, []string{"changed"}, nil, nil) + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, "new"). + Return(cache.TreeResult{}, nil) + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, "changed"). + Return(cache.TreeResult{}, nil) + _ = diffSyncer.Sync(ctx) + }) } From c01441460b717bd8ab49304b6ab606828ed45e2b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 30 Sep 2022 14:41:36 +0200 Subject: [PATCH 103/219] Add push space custom matchers --- .../diffservice/diffsyncer_test.go | 70 ++++++++++- pkg/acl/storage/liststorage.go | 1 + pkg/acl/storage/liststorage_mock.go | 110 ++++++++++++++++++ 3 files changed, 175 insertions(+), 6 deletions(-) create mode 100644 pkg/acl/storage/liststorage_mock.go diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index ffc610c8..64d0abfd 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -9,12 +9,44 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" "github.com/golang/mock/gomock" "storj.io/drpc" "testing" ) +type pushSpaceRequestMatcher struct { + spaceId string + aclRoot *aclrecordproto.RawACLRecordWithId + spaceHeader *spacesyncproto.SpaceHeader +} + +func (p pushSpaceRequestMatcher) Matches(x interface{}) bool { + res, ok := x.(*spacesyncproto.PushSpaceRequest) + if !ok { + return false + } + + return res.SpaceId == p.spaceId && res.AclRoot == p.aclRoot && res.SpaceHeader == p.spaceHeader +} + +func (p pushSpaceRequestMatcher) String() string { + return "" +} + +func newPushSpaceRequestMatcher( + spaceId string, + aclRoot *aclrecordproto.RawACLRecordWithId, + spaceHeader *spacesyncproto.SpaceHeader) *pushSpaceRequestMatcher { + return &pushSpaceRequestMatcher{ + spaceId: spaceId, + aclRoot: aclRoot, + spaceHeader: spaceHeader, + } +} + func TestDiffSyncer_Sync(t *testing.T) { // setup ctx := context.Background() @@ -40,12 +72,38 @@ func TestDiffSyncer_Sync(t *testing.T) { diffMock.EXPECT(). Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). Return([]string{"new"}, []string{"changed"}, nil, nil) - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, "new"). - Return(cache.TreeResult{}, nil) - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, "changed"). - Return(cache.TreeResult{}, nil) + for _, arg := range []string{"new", "changed"} { + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, arg). + Return(cache.TreeResult{}, nil) + } + _ = diffSyncer.Sync(ctx) + }) + + t.Run("diff syncer sync space missing", func(t *testing.T) { + aclStorageMock := storage2.NewMockListStorage(ctrl) + aclRoot := &aclrecordproto.RawACLRecordWithId{} + spaceHeader := &spacesyncproto.SpaceHeader{} + + nconfMock.EXPECT(). + ResponsiblePeers(gomock.Any(), spaceId). + Return([]peer.Peer{nil}, nil) + diffMock.EXPECT(). + Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). + Return(nil, nil, nil, spacesyncproto.ErrSpaceMissing) + stMock.EXPECT(). + ACLStorage(). + Return(aclStorageMock, nil) + stMock.EXPECT(). + SpaceHeader(). + Return(spaceHeader, nil) + aclStorageMock.EXPECT(). + Root(). + Return(aclRoot, nil) + clientMock.EXPECT(). + PushSpace(gomock.Any(), newPushSpaceRequestMatcher(spaceId, aclRoot, spaceHeader)). + Return(nil, nil) + _ = diffSyncer.Sync(ctx) }) } diff --git a/pkg/acl/storage/liststorage.go b/pkg/acl/storage/liststorage.go index c4fe7d6e..19b4dfe1 100644 --- a/pkg/acl/storage/liststorage.go +++ b/pkg/acl/storage/liststorage.go @@ -1,3 +1,4 @@ +//go:generate mockgen -package storage -destination liststorage_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage ListStorage package storage import ( diff --git a/pkg/acl/storage/liststorage_mock.go b/pkg/acl/storage/liststorage_mock.go new file mode 100644 index 00000000..07a5ef80 --- /dev/null +++ b/pkg/acl/storage/liststorage_mock.go @@ -0,0 +1,110 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage (interfaces: ListStorage) + +// Package storage is a generated GoMock package. +package storage + +import ( + context "context" + reflect "reflect" + + aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + gomock "github.com/golang/mock/gomock" +) + +// MockListStorage is a mock of ListStorage interface. +type MockListStorage struct { + ctrl *gomock.Controller + recorder *MockListStorageMockRecorder +} + +// MockListStorageMockRecorder is the mock recorder for MockListStorage. +type MockListStorageMockRecorder struct { + mock *MockListStorage +} + +// NewMockListStorage creates a new mock instance. +func NewMockListStorage(ctrl *gomock.Controller) *MockListStorage { + mock := &MockListStorage{ctrl: ctrl} + mock.recorder = &MockListStorageMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockListStorage) EXPECT() *MockListStorageMockRecorder { + return m.recorder +} + +// AddRawRecord mocks base method. +func (m *MockListStorage) AddRawRecord(arg0 context.Context, arg1 *aclrecordproto.RawACLRecordWithId) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddRawRecord", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddRawRecord indicates an expected call of AddRawRecord. +func (mr *MockListStorageMockRecorder) AddRawRecord(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawRecord", reflect.TypeOf((*MockListStorage)(nil).AddRawRecord), arg0, arg1) +} + +// GetRawRecord mocks base method. +func (m *MockListStorage) GetRawRecord(arg0 context.Context, arg1 string) (*aclrecordproto.RawACLRecordWithId, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetRawRecord", arg0, arg1) + ret0, _ := ret[0].(*aclrecordproto.RawACLRecordWithId) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetRawRecord indicates an expected call of GetRawRecord. +func (mr *MockListStorageMockRecorder) GetRawRecord(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRawRecord", reflect.TypeOf((*MockListStorage)(nil).GetRawRecord), arg0, arg1) +} + +// Head mocks base method. +func (m *MockListStorage) Head() (*aclrecordproto.RawACLRecordWithId, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Head") + ret0, _ := ret[0].(*aclrecordproto.RawACLRecordWithId) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Head indicates an expected call of Head. +func (mr *MockListStorageMockRecorder) Head() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Head", reflect.TypeOf((*MockListStorage)(nil).Head)) +} + +// ID mocks base method. +func (m *MockListStorage) ID() (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ID indicates an expected call of ID. +func (mr *MockListStorageMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockListStorage)(nil).ID)) +} + +// Root mocks base method. +func (m *MockListStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Root") + ret0, _ := ret[0].(*aclrecordproto.RawACLRecordWithId) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Root indicates an expected call of Root. +func (mr *MockListStorageMockRecorder) Root() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Root", reflect.TypeOf((*MockListStorage)(nil).Root)) +} From beccba6d95bd23d55bad0585de20560c6a52279f Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 30 Sep 2022 14:43:11 +0200 Subject: [PATCH 104/219] Require no error in tests --- common/commonspace/diffservice/diffsyncer_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index 64d0abfd..70a849d0 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -13,6 +13,7 @@ import ( storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" "storj.io/drpc" "testing" ) @@ -77,7 +78,7 @@ func TestDiffSyncer_Sync(t *testing.T) { GetTree(gomock.Any(), spaceId, arg). Return(cache.TreeResult{}, nil) } - _ = diffSyncer.Sync(ctx) + require.NoError(t, diffSyncer.Sync(ctx)) }) t.Run("diff syncer sync space missing", func(t *testing.T) { @@ -104,6 +105,6 @@ func TestDiffSyncer_Sync(t *testing.T) { PushSpace(gomock.Any(), newPushSpaceRequestMatcher(spaceId, aclRoot, spaceHeader)). Return(nil, nil) - _ = diffSyncer.Sync(ctx) + require.NoError(t, diffSyncer.Sync(ctx)) }) } From 86ef6d2dd6b256e7bf83c8aa792567d31e283930 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 30 Sep 2022 15:53:33 +0200 Subject: [PATCH 105/219] Move mocks to separate packages --- .../mock_cache.go} | 9 ++-- common/commonspace/cache/treecache.go | 2 +- .../diffservice/diffsyncer_test.go | 49 +++++++++++++++---- .../mock_spacesyncproto.go} | 17 ++++--- .../commonspace/spacesyncproto/spacesync.go | 2 +- .../mock_storage.go} | 13 ++--- common/commonspace/storage/storage.go | 2 +- common/nodeconf/configuration.go | 2 +- .../mock_nodeconf.go} | 4 +- pkg/acl/list/list.go | 2 +- .../{list_mock.go => mock_list/mock_list.go} | 25 +++++----- pkg/acl/storage/liststorage.go | 2 +- .../mock_storage.go} | 4 +- .../mock_objecttree.go} | 21 ++++---- pkg/acl/tree/objecttree.go | 2 +- pkg/ldiff/diff.go | 2 +- .../mock_ldiff.go} | 17 ++++--- 17 files changed, 105 insertions(+), 70 deletions(-) rename common/commonspace/cache/{treecache_mock.go => mock_cache/mock_cache.go} (93%) rename common/commonspace/spacesyncproto/{drpcspaceclient_mock.go => mock_spacesyncproto/mock_spacesyncproto.go} (82%) rename common/commonspace/storage/{storage_mock.go => mock_storage/mock_storage.go} (93%) rename common/nodeconf/{configuration_mock.go => mock_nodeconf/mock_nodeconf.go} (98%) rename pkg/acl/list/{list_mock.go => mock_list/mock_list.go} (90%) rename pkg/acl/storage/{liststorage_mock.go => mock_storage/mock_storage.go} (97%) rename pkg/acl/tree/{objecttree_mock.go => mock_objecttree/mock_objecttree.go} (93%) rename pkg/ldiff/{diff_mock.go => mock_ldiff/mock_ldiff.go} (85%) diff --git a/common/commonspace/cache/treecache_mock.go b/common/commonspace/cache/mock_cache/mock_cache.go similarity index 93% rename from common/commonspace/cache/treecache_mock.go rename to common/commonspace/cache/mock_cache/mock_cache.go index 1a42b411..84822cdb 100644 --- a/common/commonspace/cache/treecache_mock.go +++ b/common/commonspace/cache/mock_cache/mock_cache.go @@ -1,14 +1,15 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache (interfaces: TreeCache) -// Package cache is a generated GoMock package. -package cache +// Package mock_cache is a generated GoMock package. +package mock_cache import ( context "context" reflect "reflect" app "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + cache "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" gomock "github.com/golang/mock/gomock" ) @@ -50,10 +51,10 @@ func (mr *MockTreeCacheMockRecorder) Close(arg0 interface{}) *gomock.Call { } // GetTree mocks base method. -func (m *MockTreeCache) GetTree(arg0 context.Context, arg1, arg2 string) (TreeResult, error) { +func (m *MockTreeCache) GetTree(arg0 context.Context, arg1, arg2 string) (cache.TreeResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetTree", arg0, arg1, arg2) - ret0, _ := ret[0].(TreeResult) + ret0, _ := ret[0].(cache.TreeResult) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/common/commonspace/cache/treecache.go b/common/commonspace/cache/treecache.go index 4f72f0fd..274f044a 100644 --- a/common/commonspace/cache/treecache.go +++ b/common/commonspace/cache/treecache.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package cache -destination treecache_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache TreeCache +//go:generate mockgen -destination mock_cache/mock_cache.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache TreeCache package cache import ( diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index 70a849d0..211aecb7 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -4,14 +4,16 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache/mock_cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto/mock_spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf/mock_nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" + mock_aclstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage/mock_storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff/mock_ldiff" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" "storj.io/drpc" @@ -54,11 +56,11 @@ func TestDiffSyncer_Sync(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() - diffMock := ldiff.NewMockDiff(ctrl) - nconfMock := nodeconf.NewMockConfiguration(ctrl) - cacheMock := cache.NewMockTreeCache(ctrl) - stMock := storage.NewMockSpaceStorage(ctrl) - clientMock := spacesyncproto.NewMockDRPCSpaceClient(ctrl) + diffMock := mock_ldiff.NewMockDiff(ctrl) + nconfMock := mock_nodeconf.NewMockConfiguration(ctrl) + cacheMock := mock_cache.NewMockTreeCache(ctrl) + stMock := mock_storage.NewMockSpaceStorage(ctrl) + clientMock := mock_spacesyncproto.NewMockDRPCSpaceClient(ctrl) factory := spacesyncproto.ClientFactoryFunc(func(cc drpc.Conn) spacesyncproto.DRPCSpaceClient { return clientMock }) @@ -82,7 +84,34 @@ func TestDiffSyncer_Sync(t *testing.T) { }) t.Run("diff syncer sync space missing", func(t *testing.T) { - aclStorageMock := storage2.NewMockListStorage(ctrl) + aclStorageMock := mock_aclstorage.NewMockListStorage(ctrl) + aclRoot := &aclrecordproto.RawACLRecordWithId{} + spaceHeader := &spacesyncproto.SpaceHeader{} + + nconfMock.EXPECT(). + ResponsiblePeers(gomock.Any(), spaceId). + Return([]peer.Peer{nil}, nil) + diffMock.EXPECT(). + Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). + Return(nil, nil, nil, spacesyncproto.ErrSpaceMissing) + stMock.EXPECT(). + ACLStorage(). + Return(aclStorageMock, nil) + stMock.EXPECT(). + SpaceHeader(). + Return(spaceHeader, nil) + aclStorageMock.EXPECT(). + Root(). + Return(aclRoot, nil) + clientMock.EXPECT(). + PushSpace(gomock.Any(), newPushSpaceRequestMatcher(spaceId, aclRoot, spaceHeader)). + Return(nil, nil) + + require.NoError(t, diffSyncer.Sync(ctx)) + }) + + t.Run("diff syncer sync space missing", func(t *testing.T) { + aclStorageMock := mock_aclstorage.NewMockListStorage(ctrl) aclRoot := &aclrecordproto.RawACLRecordWithId{} spaceHeader := &spacesyncproto.SpaceHeader{} diff --git a/common/commonspace/spacesyncproto/drpcspaceclient_mock.go b/common/commonspace/spacesyncproto/mock_spacesyncproto/mock_spacesyncproto.go similarity index 82% rename from common/commonspace/spacesyncproto/drpcspaceclient_mock.go rename to common/commonspace/spacesyncproto/mock_spacesyncproto/mock_spacesyncproto.go index 4e8fd108..0d0d52c5 100644 --- a/common/commonspace/spacesyncproto/drpcspaceclient_mock.go +++ b/common/commonspace/spacesyncproto/mock_spacesyncproto/mock_spacesyncproto.go @@ -1,13 +1,14 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto (interfaces: DRPCSpaceClient) -// Package spacesyncproto is a generated GoMock package. -package spacesyncproto +// Package mock_spacesyncproto is a generated GoMock package. +package mock_spacesyncproto import ( context "context" reflect "reflect" + spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" gomock "github.com/golang/mock/gomock" drpc "storj.io/drpc" ) @@ -50,10 +51,10 @@ func (mr *MockDRPCSpaceClientMockRecorder) DRPCConn() *gomock.Call { } // HeadSync mocks base method. -func (m *MockDRPCSpaceClient) HeadSync(arg0 context.Context, arg1 *HeadSyncRequest) (*HeadSyncResponse, error) { +func (m *MockDRPCSpaceClient) HeadSync(arg0 context.Context, arg1 *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "HeadSync", arg0, arg1) - ret0, _ := ret[0].(*HeadSyncResponse) + ret0, _ := ret[0].(*spacesyncproto.HeadSyncResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -65,10 +66,10 @@ func (mr *MockDRPCSpaceClientMockRecorder) HeadSync(arg0, arg1 interface{}) *gom } // PushSpace mocks base method. -func (m *MockDRPCSpaceClient) PushSpace(arg0 context.Context, arg1 *PushSpaceRequest) (*PushSpaceResponse, error) { +func (m *MockDRPCSpaceClient) PushSpace(arg0 context.Context, arg1 *spacesyncproto.PushSpaceRequest) (*spacesyncproto.PushSpaceResponse, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "PushSpace", arg0, arg1) - ret0, _ := ret[0].(*PushSpaceResponse) + ret0, _ := ret[0].(*spacesyncproto.PushSpaceResponse) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -80,10 +81,10 @@ func (mr *MockDRPCSpaceClientMockRecorder) PushSpace(arg0, arg1 interface{}) *go } // Stream mocks base method. -func (m *MockDRPCSpaceClient) Stream(arg0 context.Context) (DRPCSpace_StreamClient, error) { +func (m *MockDRPCSpaceClient) Stream(arg0 context.Context) (spacesyncproto.DRPCSpace_StreamClient, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Stream", arg0) - ret0, _ := ret[0].(DRPCSpace_StreamClient) + ret0, _ := ret[0].(spacesyncproto.DRPCSpace_StreamClient) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/common/commonspace/spacesyncproto/spacesync.go b/common/commonspace/spacesyncproto/spacesync.go index e7924694..068642fe 100644 --- a/common/commonspace/spacesyncproto/spacesync.go +++ b/common/commonspace/spacesyncproto/spacesync.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package spacesyncproto -destination drpcspaceclient_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto DRPCSpaceClient +//go:generate mockgen -destination mock_spacesyncproto/mock_spacesyncproto.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto DRPCSpaceClient package spacesyncproto import ( diff --git a/common/commonspace/storage/storage_mock.go b/common/commonspace/storage/mock_storage/mock_storage.go similarity index 93% rename from common/commonspace/storage/storage_mock.go rename to common/commonspace/storage/mock_storage/mock_storage.go index c671fbad..14b6003f 100644 --- a/common/commonspace/storage/storage_mock.go +++ b/common/commonspace/storage/mock_storage/mock_storage.go @@ -1,14 +1,15 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage (interfaces: SpaceStorageProvider,SpaceStorage) -// Package storage is a generated GoMock package. -package storage +// Package mock_storage is a generated GoMock package. +package mock_storage import ( reflect "reflect" app "github.com/anytypeio/go-anytype-infrastructure-experiments/app" spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" storage0 "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" gomock "github.com/golang/mock/gomock" ) @@ -37,10 +38,10 @@ func (m *MockSpaceStorageProvider) EXPECT() *MockSpaceStorageProviderMockRecorde } // CreateSpaceStorage mocks base method. -func (m *MockSpaceStorageProvider) CreateSpaceStorage(arg0 SpaceStorageCreatePayload) (SpaceStorage, error) { +func (m *MockSpaceStorageProvider) CreateSpaceStorage(arg0 storage.SpaceStorageCreatePayload) (storage.SpaceStorage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateSpaceStorage", arg0) - ret0, _ := ret[0].(SpaceStorage) + ret0, _ := ret[0].(storage.SpaceStorage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -80,10 +81,10 @@ func (mr *MockSpaceStorageProviderMockRecorder) Name() *gomock.Call { } // SpaceStorage mocks base method. -func (m *MockSpaceStorageProvider) SpaceStorage(arg0 string) (SpaceStorage, error) { +func (m *MockSpaceStorageProvider) SpaceStorage(arg0 string) (storage.SpaceStorage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SpaceStorage", arg0) - ret0, _ := ret[0].(SpaceStorage) + ret0, _ := ret[0].(storage.SpaceStorage) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index 60d852e6..fc1cfa8d 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package storage -destination storage_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage SpaceStorageProvider,SpaceStorage +//go:generate mockgen -destination mock_storage/mock_storage.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage SpaceStorageProvider,SpaceStorage package storage import ( diff --git a/common/nodeconf/configuration.go b/common/nodeconf/configuration.go index cb169103..8e50303b 100644 --- a/common/nodeconf/configuration.go +++ b/common/nodeconf/configuration.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package nodeconf -destination configuration_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf Configuration +//go:generate mockgen -destination mock_nodeconf/mock_nodeconf.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf Configuration package nodeconf import ( diff --git a/common/nodeconf/configuration_mock.go b/common/nodeconf/mock_nodeconf/mock_nodeconf.go similarity index 98% rename from common/nodeconf/configuration_mock.go rename to common/nodeconf/mock_nodeconf/mock_nodeconf.go index c84e1848..e65895eb 100644 --- a/common/nodeconf/configuration_mock.go +++ b/common/nodeconf/mock_nodeconf/mock_nodeconf.go @@ -1,8 +1,8 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf (interfaces: Configuration) -// Package nodeconf is a generated GoMock package. -package nodeconf +// Package mock_nodeconf is a generated GoMock package. +package mock_nodeconf import ( context "context" diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index 0e2a31ed..dae887e6 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package list -destination list_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list ACLList +//go:generate mockgen -destination mock_list/mock_list.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list ACLList package list import ( diff --git a/pkg/acl/list/list_mock.go b/pkg/acl/list/mock_list/mock_list.go similarity index 90% rename from pkg/acl/list/list_mock.go rename to pkg/acl/list/mock_list/mock_list.go index 215ca59e..e4c7cc6e 100644 --- a/pkg/acl/list/list_mock.go +++ b/pkg/acl/list/mock_list/mock_list.go @@ -1,13 +1,14 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list (interfaces: ACLList) -// Package list is a generated GoMock package. -package list +// Package mock_list is a generated GoMock package. +package mock_list import ( reflect "reflect" aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + list "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" gomock "github.com/golang/mock/gomock" ) @@ -35,10 +36,10 @@ func (m *MockACLList) EXPECT() *MockACLListMockRecorder { } // ACLState mocks base method. -func (m *MockACLList) ACLState() *ACLState { +func (m *MockACLList) ACLState() *list.ACLState { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ACLState") - ret0, _ := ret[0].(*ACLState) + ret0, _ := ret[0].(*list.ACLState) return ret0 } @@ -63,10 +64,10 @@ func (mr *MockACLListMockRecorder) Close() *gomock.Call { } // Get mocks base method. -func (m *MockACLList) Get(arg0 string) (*ACLRecord, error) { +func (m *MockACLList) Get(arg0 string) (*list.ACLRecord, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Get", arg0) - ret0, _ := ret[0].(*ACLRecord) + ret0, _ := ret[0].(*list.ACLRecord) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -78,10 +79,10 @@ func (mr *MockACLListMockRecorder) Get(arg0 interface{}) *gomock.Call { } // Head mocks base method. -func (m *MockACLList) Head() *ACLRecord { +func (m *MockACLList) Head() *list.ACLRecord { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Head") - ret0, _ := ret[0].(*ACLRecord) + ret0, _ := ret[0].(*list.ACLRecord) return ret0 } @@ -121,7 +122,7 @@ func (mr *MockACLListMockRecorder) IsAfter(arg0, arg1 interface{}) *gomock.Call } // Iterate mocks base method. -func (m *MockACLList) Iterate(arg0 func(*ACLRecord) bool) { +func (m *MockACLList) Iterate(arg0 func(*list.ACLRecord) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "Iterate", arg0) } @@ -133,7 +134,7 @@ func (mr *MockACLListMockRecorder) Iterate(arg0 interface{}) *gomock.Call { } // IterateFrom mocks base method. -func (m *MockACLList) IterateFrom(arg0 string, arg1 func(*ACLRecord) bool) { +func (m *MockACLList) IterateFrom(arg0 string, arg1 func(*list.ACLRecord) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "IterateFrom", arg0, arg1) } @@ -181,10 +182,10 @@ func (mr *MockACLListMockRecorder) RUnlock() *gomock.Call { } // Records mocks base method. -func (m *MockACLList) Records() []*ACLRecord { +func (m *MockACLList) Records() []*list.ACLRecord { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Records") - ret0, _ := ret[0].([]*ACLRecord) + ret0, _ := ret[0].([]*list.ACLRecord) return ret0 } diff --git a/pkg/acl/storage/liststorage.go b/pkg/acl/storage/liststorage.go index 19b4dfe1..7aad8a01 100644 --- a/pkg/acl/storage/liststorage.go +++ b/pkg/acl/storage/liststorage.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package storage -destination liststorage_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage ListStorage +//go:generate mockgen -destination mock_storage/mock_storage.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage ListStorage package storage import ( diff --git a/pkg/acl/storage/liststorage_mock.go b/pkg/acl/storage/mock_storage/mock_storage.go similarity index 97% rename from pkg/acl/storage/liststorage_mock.go rename to pkg/acl/storage/mock_storage/mock_storage.go index 07a5ef80..72dc884d 100644 --- a/pkg/acl/storage/liststorage_mock.go +++ b/pkg/acl/storage/mock_storage/mock_storage.go @@ -1,8 +1,8 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage (interfaces: ListStorage) -// Package storage is a generated GoMock package. -package storage +// Package mock_storage is a generated GoMock package. +package mock_storage import ( context "context" diff --git a/pkg/acl/tree/objecttree_mock.go b/pkg/acl/tree/mock_objecttree/mock_objecttree.go similarity index 93% rename from pkg/acl/tree/objecttree_mock.go rename to pkg/acl/tree/mock_objecttree/mock_objecttree.go index 5632850d..a4eac719 100644 --- a/pkg/acl/tree/objecttree_mock.go +++ b/pkg/acl/tree/mock_objecttree/mock_objecttree.go @@ -1,14 +1,15 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree (interfaces: ObjectTree) -// Package tree is a generated GoMock package. -package tree +// Package mock_tree is a generated GoMock package. +package mock_tree import ( context "context" reflect "reflect" storage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + tree "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" gomock "github.com/golang/mock/gomock" ) @@ -37,10 +38,10 @@ func (m *MockObjectTree) EXPECT() *MockObjectTreeMockRecorder { } // AddContent mocks base method. -func (m *MockObjectTree) AddContent(arg0 context.Context, arg1 SignableChangeContent) (AddResult, error) { +func (m *MockObjectTree) AddContent(arg0 context.Context, arg1 tree.SignableChangeContent) (tree.AddResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AddContent", arg0, arg1) - ret0, _ := ret[0].(AddResult) + ret0, _ := ret[0].(tree.AddResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -52,14 +53,14 @@ func (mr *MockObjectTreeMockRecorder) AddContent(arg0, arg1 interface{}) *gomock } // AddRawChanges mocks base method. -func (m *MockObjectTree) AddRawChanges(arg0 context.Context, arg1 ...*treechangeproto.RawTreeChangeWithId) (AddResult, error) { +func (m *MockObjectTree) AddRawChanges(arg0 context.Context, arg1 ...*treechangeproto.RawTreeChangeWithId) (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...) - ret0, _ := ret[0].(AddResult) + ret0, _ := ret[0].(tree.AddResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -172,7 +173,7 @@ func (mr *MockObjectTreeMockRecorder) ID() *gomock.Call { } // Iterate mocks base method. -func (m *MockObjectTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*Change) bool) error { +func (m *MockObjectTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*tree.Change) bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Iterate", arg0, arg1) ret0, _ := ret[0].(error) @@ -186,7 +187,7 @@ func (mr *MockObjectTreeMockRecorder) Iterate(arg0, arg1 interface{}) *gomock.Ca } // IterateFrom mocks base method. -func (m *MockObjectTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*Change) bool) error { +func (m *MockObjectTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*tree.Change) bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IterateFrom", arg0, arg1, arg2) ret0, _ := ret[0].(error) @@ -236,10 +237,10 @@ func (mr *MockObjectTreeMockRecorder) RUnlock() *gomock.Call { } // Root mocks base method. -func (m *MockObjectTree) Root() *Change { +func (m *MockObjectTree) Root() *tree.Change { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Root") - ret0, _ := ret[0].(*Change) + ret0, _ := ret[0].(*tree.Change) return ret0 } diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 95348feb..47305d23 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package tree -destination objecttree_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree ObjectTree +//go:generate mockgen -destination mock_objecttree/mock_objecttree.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree ObjectTree package tree import ( diff --git a/pkg/ldiff/diff.go b/pkg/ldiff/diff.go index 10346e45..2f9a5161 100644 --- a/pkg/ldiff/diff.go +++ b/pkg/ldiff/diff.go @@ -1,4 +1,4 @@ -//go:generate mockgen -package ldiff -destination diff_mock.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff Diff,Remote +//go:generate mockgen -destination mock_ldiff/mock_ldiff.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff Diff,Remote // Package ldiff provides a container of elements with fixed id and changeable content. // Diff can calculate the difference with another diff container (you can make it remote) with minimum hops and traffic. package ldiff diff --git a/pkg/ldiff/diff_mock.go b/pkg/ldiff/mock_ldiff/mock_ldiff.go similarity index 85% rename from pkg/ldiff/diff_mock.go rename to pkg/ldiff/mock_ldiff/mock_ldiff.go index e750af44..183e7bef 100644 --- a/pkg/ldiff/diff_mock.go +++ b/pkg/ldiff/mock_ldiff/mock_ldiff.go @@ -1,13 +1,14 @@ // Code generated by MockGen. DO NOT EDIT. // Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff (interfaces: Diff,Remote) -// Package ldiff is a generated GoMock package. -package ldiff +// Package mock_ldiff is a generated GoMock package. +package mock_ldiff import ( context "context" reflect "reflect" + ldiff "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" gomock "github.com/golang/mock/gomock" ) @@ -35,7 +36,7 @@ func (m *MockDiff) EXPECT() *MockDiffMockRecorder { } // Diff mocks base method. -func (m *MockDiff) Diff(arg0 context.Context, arg1 Remote) ([]string, []string, []string, error) { +func (m *MockDiff) Diff(arg0 context.Context, arg1 ldiff.Remote) ([]string, []string, []string, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Diff", arg0, arg1) ret0, _ := ret[0].([]string) @@ -52,10 +53,10 @@ func (mr *MockDiffMockRecorder) Diff(arg0, arg1 interface{}) *gomock.Call { } // Ranges mocks base method. -func (m *MockDiff) Ranges(arg0 context.Context, arg1 []Range, arg2 []RangeResult) ([]RangeResult, error) { +func (m *MockDiff) Ranges(arg0 context.Context, arg1 []ldiff.Range, arg2 []ldiff.RangeResult) ([]ldiff.RangeResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Ranges", arg0, arg1, arg2) - ret0, _ := ret[0].([]RangeResult) + ret0, _ := ret[0].([]ldiff.RangeResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -81,7 +82,7 @@ func (mr *MockDiffMockRecorder) RemoveId(arg0 interface{}) *gomock.Call { } // Set mocks base method. -func (m *MockDiff) Set(arg0 ...Element) { +func (m *MockDiff) Set(arg0 ...ldiff.Element) { m.ctrl.T.Helper() varargs := []interface{}{} for _, a := range arg0 { @@ -120,10 +121,10 @@ func (m *MockRemote) EXPECT() *MockRemoteMockRecorder { } // Ranges mocks base method. -func (m *MockRemote) Ranges(arg0 context.Context, arg1 []Range, arg2 []RangeResult) ([]RangeResult, error) { +func (m *MockRemote) Ranges(arg0 context.Context, arg1 []ldiff.Range, arg2 []ldiff.RangeResult) ([]ldiff.RangeResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Ranges", arg0, arg1, arg2) - ret0, _ := ret[0].([]RangeResult) + ret0, _ := ret[0].([]ldiff.RangeResult) ret1, _ := ret[1].(error) return ret0, ret1 } From 53d10dc597ed953b5ea238db07e442dd31961f60 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 30 Sep 2022 16:02:47 +0200 Subject: [PATCH 106/219] Add more syncer tests --- .../diffservice/diffsyncer_test.go | 65 +++++++++++++------ 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index 211aecb7..041857e3 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -2,6 +2,7 @@ package diffservice import ( "context" + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache/mock_cache" @@ -18,6 +19,7 @@ import ( "github.com/stretchr/testify/require" "storj.io/drpc" "testing" + "time" ) type pushSpaceRequestMatcher struct { @@ -39,6 +41,35 @@ func (p pushSpaceRequestMatcher) String() string { return "" } +type mockPeer struct{} + +func (m mockPeer) Id() string { + return "mockId" +} + +func (m mockPeer) LastUsage() time.Time { + return time.Time{} +} + +func (m mockPeer) UpdateLastUsage() { +} + +func (m mockPeer) Close() error { + return nil +} + +func (m mockPeer) Closed() <-chan struct{} { + return make(chan struct{}) +} + +func (m mockPeer) Invoke(ctx context.Context, rpc string, enc drpc.Encoding, in, out drpc.Message) error { + return nil +} + +func (m mockPeer) NewStream(ctx context.Context, rpc string, enc drpc.Encoding) (drpc.Stream, error) { + return nil, nil +} + func newPushSpaceRequestMatcher( spaceId string, aclRoot *aclrecordproto.RawACLRecordWithId, @@ -71,7 +102,7 @@ func TestDiffSyncer_Sync(t *testing.T) { t.Run("diff syncer sync simple", func(t *testing.T) { nconfMock.EXPECT(). ResponsiblePeers(gomock.Any(), spaceId). - Return([]peer.Peer{nil}, nil) + Return([]peer.Peer{mockPeer{}}, nil) diffMock.EXPECT(). Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). Return([]string{"new"}, []string{"changed"}, nil, nil) @@ -83,6 +114,14 @@ func TestDiffSyncer_Sync(t *testing.T) { require.NoError(t, diffSyncer.Sync(ctx)) }) + t.Run("diff syncer sync conf error", func(t *testing.T) { + nconfMock.EXPECT(). + ResponsiblePeers(gomock.Any(), spaceId). + Return(nil, fmt.Errorf("some error")) + + require.Error(t, diffSyncer.Sync(ctx)) + }) + t.Run("diff syncer sync space missing", func(t *testing.T) { aclStorageMock := mock_aclstorage.NewMockListStorage(ctrl) aclRoot := &aclrecordproto.RawACLRecordWithId{} @@ -90,7 +129,7 @@ func TestDiffSyncer_Sync(t *testing.T) { nconfMock.EXPECT(). ResponsiblePeers(gomock.Any(), spaceId). - Return([]peer.Peer{nil}, nil) + Return([]peer.Peer{mockPeer{}}, nil) diffMock.EXPECT(). Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). Return(nil, nil, nil, spacesyncproto.ErrSpaceMissing) @@ -110,29 +149,13 @@ func TestDiffSyncer_Sync(t *testing.T) { require.NoError(t, diffSyncer.Sync(ctx)) }) - t.Run("diff syncer sync space missing", func(t *testing.T) { - aclStorageMock := mock_aclstorage.NewMockListStorage(ctrl) - aclRoot := &aclrecordproto.RawACLRecordWithId{} - spaceHeader := &spacesyncproto.SpaceHeader{} - + t.Run("diff syncer sync other error", func(t *testing.T) { nconfMock.EXPECT(). ResponsiblePeers(gomock.Any(), spaceId). - Return([]peer.Peer{nil}, nil) + Return([]peer.Peer{mockPeer{}}, nil) diffMock.EXPECT(). Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). - Return(nil, nil, nil, spacesyncproto.ErrSpaceMissing) - stMock.EXPECT(). - ACLStorage(). - Return(aclStorageMock, nil) - stMock.EXPECT(). - SpaceHeader(). - Return(spaceHeader, nil) - aclStorageMock.EXPECT(). - Root(). - Return(aclRoot, nil) - clientMock.EXPECT(). - PushSpace(gomock.Any(), newPushSpaceRequestMatcher(spaceId, aclRoot, spaceHeader)). - Return(nil, nil) + Return(nil, nil, nil, spacesyncproto.ErrUnexpected) require.NoError(t, diffSyncer.Sync(ctx)) }) From aaaab9deca0f6bd1737ffa4d3d8ddca581010dbb Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 30 Sep 2022 16:12:41 +0200 Subject: [PATCH 107/219] Add periodicsync test --- common/commonspace/diffservice/diffservice.go | 1 + .../mock_diffservice/mock_diffservice.go | 49 +++++++++++++++++++ .../diffservice/periodicsync_test.go | 39 +++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 common/commonspace/diffservice/mock_diffservice/mock_diffservice.go create mode 100644 common/commonspace/diffservice/periodicsync_test.go diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index e5a94a1f..44401783 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -1,3 +1,4 @@ +//go:generate mockgen -destination mock_diffservice/mock_diffservice.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice DiffSyncer package diffservice import ( diff --git a/common/commonspace/diffservice/mock_diffservice/mock_diffservice.go b/common/commonspace/diffservice/mock_diffservice/mock_diffservice.go new file mode 100644 index 00000000..6f22a1a4 --- /dev/null +++ b/common/commonspace/diffservice/mock_diffservice/mock_diffservice.go @@ -0,0 +1,49 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice (interfaces: DiffSyncer) + +// Package mock_diffservice is a generated GoMock package. +package mock_diffservice + +import ( + context "context" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" +) + +// MockDiffSyncer is a mock of DiffSyncer interface. +type MockDiffSyncer struct { + ctrl *gomock.Controller + recorder *MockDiffSyncerMockRecorder +} + +// MockDiffSyncerMockRecorder is the mock recorder for MockDiffSyncer. +type MockDiffSyncerMockRecorder struct { + mock *MockDiffSyncer +} + +// NewMockDiffSyncer creates a new mock instance. +func NewMockDiffSyncer(ctrl *gomock.Controller) *MockDiffSyncer { + mock := &MockDiffSyncer{ctrl: ctrl} + mock.recorder = &MockDiffSyncerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockDiffSyncer) EXPECT() *MockDiffSyncerMockRecorder { + return m.recorder +} + +// Sync mocks base method. +func (m *MockDiffSyncer) Sync(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Sync", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Sync indicates an expected call of Sync. +func (mr *MockDiffSyncerMockRecorder) Sync(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Sync", reflect.TypeOf((*MockDiffSyncer)(nil).Sync), arg0) +} diff --git a/common/commonspace/diffservice/periodicsync_test.go b/common/commonspace/diffservice/periodicsync_test.go new file mode 100644 index 00000000..5b7c7e41 --- /dev/null +++ b/common/commonspace/diffservice/periodicsync_test.go @@ -0,0 +1,39 @@ +package diffservice + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice/mock_diffservice" + "github.com/golang/mock/gomock" + "testing" + "time" +) + +func TestPeriodicSync_Run(t *testing.T) { + // setup + //ctx := context.Background() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + l := logger.NewNamed("sync") + diffSyncer := mock_diffservice.NewMockDiffSyncer(ctrl) + t.Run("diff syncer 1 time", func(t *testing.T) { + secs := 0 + pSync := newPeriodicSync(secs, diffSyncer, l) + + diffSyncer.EXPECT().Sync(gomock.Any()).Times(1).Return(nil) + + pSync.Run() + pSync.Close() + }) + + t.Run("diff syncer 2 times", func(t *testing.T) { + secs := 1 + + pSync := newPeriodicSync(secs, diffSyncer, l) + diffSyncer.EXPECT().Sync(gomock.Any()).Times(2).Return(nil) + + pSync.Run() + time.Sleep(time.Second * time.Duration(secs)) + pSync.Close() + }) +} From 48ae45550d191325c0dd9905b67867f77ff89ff5 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 30 Sep 2022 16:55:34 +0200 Subject: [PATCH 108/219] Add diffservice tests --- common/commonspace/diffservice/diffservice.go | 2 +- .../diffservice/diffservice_test.go | 59 +++++++++ .../mock_diffservice/mock_diffservice.go | 49 +++++++- .../diffservice/periodicsync_test.go | 1 - pkg/acl/storage/liststorage.go | 2 +- pkg/acl/storage/mock_storage/mock_storage.go | 114 +++++++++++++++++- 6 files changed, 222 insertions(+), 5 deletions(-) create mode 100644 common/commonspace/diffservice/diffservice_test.go diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index 44401783..15a9ff65 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination mock_diffservice/mock_diffservice.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice DiffSyncer +//go:generate mockgen -destination mock_diffservice/mock_diffservice.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice DiffSyncer,PeriodicSync package diffservice import ( diff --git a/common/commonspace/diffservice/diffservice_test.go b/common/commonspace/diffservice/diffservice_test.go new file mode 100644 index 00000000..27b4da3b --- /dev/null +++ b/common/commonspace/diffservice/diffservice_test.go @@ -0,0 +1,59 @@ +package diffservice + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice/mock_diffservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage" + mock_storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage/mock_storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff/mock_ldiff" + "github.com/golang/mock/gomock" + "testing" +) + +func TestDiffService(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + spaceId := "spaceId" + l := logger.NewNamed("sync") + pSyncMock := mock_diffservice.NewMockPeriodicSync(ctrl) + storageMock := mock_storage.NewMockSpaceStorage(ctrl) + treeStorageMock := mock_storage2.NewMockTreeStorage(ctrl) + diffMock := mock_ldiff.NewMockDiff(ctrl) + syncPeriod := 1 + initId := "initId" + + service := &diffService{ + spaceId: spaceId, + storage: storageMock, + periodicSync: pSyncMock, + diff: diffMock, + log: l, + syncPeriod: syncPeriod, + } + + t.Run("init", func(t *testing.T) { + storageMock.EXPECT().TreeStorage(initId).Return(treeStorageMock, nil) + treeStorageMock.EXPECT().Heads().Return([]string{"h1", "h2"}, nil) + diffMock.EXPECT().Set(ldiff.Element{ + Id: initId, + Head: "h1h2", + }) + pSyncMock.EXPECT().Run() + service.Init([]string{initId}) + }) + + t.Run("update heads", func(t *testing.T) { + diffMock.EXPECT().Set(ldiff.Element{ + Id: initId, + Head: "h1h2", + }) + service.UpdateHeads(initId, []string{"h1", "h2"}) + }) + + t.Run("close", func(t *testing.T) { + pSyncMock.EXPECT().Close() + service.Close() + }) +} diff --git a/common/commonspace/diffservice/mock_diffservice/mock_diffservice.go b/common/commonspace/diffservice/mock_diffservice/mock_diffservice.go index 6f22a1a4..966a7cc5 100644 --- a/common/commonspace/diffservice/mock_diffservice/mock_diffservice.go +++ b/common/commonspace/diffservice/mock_diffservice/mock_diffservice.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice (interfaces: DiffSyncer) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice (interfaces: DiffSyncer,PeriodicSync) // Package mock_diffservice is a generated GoMock package. package mock_diffservice @@ -47,3 +47,50 @@ func (mr *MockDiffSyncerMockRecorder) Sync(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Sync", reflect.TypeOf((*MockDiffSyncer)(nil).Sync), arg0) } + +// MockPeriodicSync is a mock of PeriodicSync interface. +type MockPeriodicSync struct { + ctrl *gomock.Controller + recorder *MockPeriodicSyncMockRecorder +} + +// MockPeriodicSyncMockRecorder is the mock recorder for MockPeriodicSync. +type MockPeriodicSyncMockRecorder struct { + mock *MockPeriodicSync +} + +// NewMockPeriodicSync creates a new mock instance. +func NewMockPeriodicSync(ctrl *gomock.Controller) *MockPeriodicSync { + mock := &MockPeriodicSync{ctrl: ctrl} + mock.recorder = &MockPeriodicSyncMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockPeriodicSync) EXPECT() *MockPeriodicSyncMockRecorder { + return m.recorder +} + +// Close mocks base method. +func (m *MockPeriodicSync) Close() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Close") +} + +// Close indicates an expected call of Close. +func (mr *MockPeriodicSyncMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockPeriodicSync)(nil).Close)) +} + +// Run mocks base method. +func (m *MockPeriodicSync) Run() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Run") +} + +// Run indicates an expected call of Run. +func (mr *MockPeriodicSyncMockRecorder) Run() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockPeriodicSync)(nil).Run)) +} diff --git a/common/commonspace/diffservice/periodicsync_test.go b/common/commonspace/diffservice/periodicsync_test.go index 5b7c7e41..56d855f2 100644 --- a/common/commonspace/diffservice/periodicsync_test.go +++ b/common/commonspace/diffservice/periodicsync_test.go @@ -10,7 +10,6 @@ import ( func TestPeriodicSync_Run(t *testing.T) { // setup - //ctx := context.Background() ctrl := gomock.NewController(t) defer ctrl.Finish() diff --git a/pkg/acl/storage/liststorage.go b/pkg/acl/storage/liststorage.go index 7aad8a01..222fd8d8 100644 --- a/pkg/acl/storage/liststorage.go +++ b/pkg/acl/storage/liststorage.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination mock_storage/mock_storage.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage ListStorage +//go:generate mockgen -destination mock_storage/mock_storage.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage ListStorage,TreeStorage package storage import ( diff --git a/pkg/acl/storage/mock_storage/mock_storage.go b/pkg/acl/storage/mock_storage/mock_storage.go index 72dc884d..5fff6944 100644 --- a/pkg/acl/storage/mock_storage/mock_storage.go +++ b/pkg/acl/storage/mock_storage/mock_storage.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage (interfaces: ListStorage) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage (interfaces: ListStorage,TreeStorage) // Package mock_storage is a generated GoMock package. package mock_storage @@ -9,6 +9,7 @@ import ( reflect "reflect" aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" gomock "github.com/golang/mock/gomock" ) @@ -108,3 +109,114 @@ func (mr *MockListStorageMockRecorder) Root() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Root", reflect.TypeOf((*MockListStorage)(nil).Root)) } + +// MockTreeStorage is a mock of TreeStorage interface. +type MockTreeStorage struct { + ctrl *gomock.Controller + recorder *MockTreeStorageMockRecorder +} + +// MockTreeStorageMockRecorder is the mock recorder for MockTreeStorage. +type MockTreeStorageMockRecorder struct { + mock *MockTreeStorage +} + +// NewMockTreeStorage creates a new mock instance. +func NewMockTreeStorage(ctrl *gomock.Controller) *MockTreeStorage { + mock := &MockTreeStorage{ctrl: ctrl} + mock.recorder = &MockTreeStorageMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockTreeStorage) EXPECT() *MockTreeStorageMockRecorder { + return m.recorder +} + +// AddRawChange mocks base method. +func (m *MockTreeStorage) AddRawChange(arg0 *treechangeproto.RawTreeChangeWithId) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddRawChange", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddRawChange indicates an expected call of AddRawChange. +func (mr *MockTreeStorageMockRecorder) AddRawChange(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawChange", reflect.TypeOf((*MockTreeStorage)(nil).AddRawChange), arg0) +} + +// GetRawChange mocks base method. +func (m *MockTreeStorage) GetRawChange(arg0 context.Context, arg1 string) (*treechangeproto.RawTreeChangeWithId, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetRawChange", arg0, arg1) + ret0, _ := ret[0].(*treechangeproto.RawTreeChangeWithId) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetRawChange indicates an expected call of GetRawChange. +func (mr *MockTreeStorageMockRecorder) GetRawChange(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRawChange", reflect.TypeOf((*MockTreeStorage)(nil).GetRawChange), arg0, arg1) +} + +// Heads mocks base method. +func (m *MockTreeStorage) Heads() ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Heads") + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Heads indicates an expected call of Heads. +func (mr *MockTreeStorageMockRecorder) Heads() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Heads", reflect.TypeOf((*MockTreeStorage)(nil).Heads)) +} + +// ID mocks base method. +func (m *MockTreeStorage) ID() (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ID indicates an expected call of ID. +func (mr *MockTreeStorageMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockTreeStorage)(nil).ID)) +} + +// Root mocks base method. +func (m *MockTreeStorage) Root() (*treechangeproto.RawTreeChangeWithId, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Root") + ret0, _ := ret[0].(*treechangeproto.RawTreeChangeWithId) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Root indicates an expected call of Root. +func (mr *MockTreeStorageMockRecorder) Root() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Root", reflect.TypeOf((*MockTreeStorage)(nil).Root)) +} + +// SetHeads mocks base method. +func (m *MockTreeStorage) SetHeads(arg0 []string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHeads", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetHeads indicates an expected call of SetHeads. +func (mr *MockTreeStorageMockRecorder) SetHeads(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHeads", reflect.TypeOf((*MockTreeStorage)(nil).SetHeads), arg0) +} From 7e6c72a198701f7bc9af984fe3d002b335138e25 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Fri, 30 Sep 2022 19:16:44 +0300 Subject: [PATCH 109/219] consistent node db component --- Makefile | 2 + consensus/config/account.go | 7 + consensus/config/config.go | 35 + consensus/config/grpc.go | 6 + consensus/config/mongo.go | 7 + consensus/consensus.go | 22 + consensus/consensusproto/consensus.pb.go | 1718 +++++++++++++++++ consensus/consensusproto/consensus_drpc.pb.go | 217 +++ .../consensusproto/consensuserrs/errors.go | 16 + .../consensusproto/protos/consensus.proto | 55 + consensus/db/db.go | 181 ++ consensus/db/db_test.go | 218 +++ go.mod | 16 +- go.sum | 34 +- pkg/acl/aclrecordproto/aclrecord.pb.go | 1 + .../testutils/testchanges/proto/test.pb.go | 1 + 16 files changed, 2531 insertions(+), 5 deletions(-) create mode 100644 consensus/config/account.go create mode 100644 consensus/config/config.go create mode 100644 consensus/config/grpc.go create mode 100644 consensus/config/mongo.go create mode 100644 consensus/consensus.go create mode 100644 consensus/consensusproto/consensus.pb.go create mode 100644 consensus/consensusproto/consensus_drpc.pb.go create mode 100644 consensus/consensusproto/consensuserrs/errors.go create mode 100644 consensus/consensusproto/protos/consensus.proto create mode 100644 consensus/db/db.go create mode 100644 consensus/db/db_test.go diff --git a/Makefile b/Makefile index 53ddd25b..7817be8c 100644 --- a/Makefile +++ b/Makefile @@ -29,6 +29,8 @@ proto: $(GOGO_START) protoc --gogofaster_out=:. $(P_TEST_CHANGES_PATH_PB)/proto/*.proto $(eval PKGMAP := $$(P_TREE_CHANGES),$$(P_ACL_RECORDS)) $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. --go-drpc_out=protolib=github.com/gogo/protobuf:. common/commonspace/spacesyncproto/protos/*.proto + $(GOGO_START) protoc --gogofaster_out=:. --go-drpc_out=protolib=github.com/gogo/protobuf:. consensus/consensusproto/protos/*.proto + build: diff --git a/consensus/config/account.go b/consensus/config/account.go new file mode 100644 index 00000000..4525b26f --- /dev/null +++ b/consensus/config/account.go @@ -0,0 +1,7 @@ +package config + +type Account struct { + PeerId string `yaml:"peerId"` + SigningKey string `yaml:"signingKey"` + EncryptionKey string `yaml:"encryptionKey"` +} diff --git a/consensus/config/config.go b/consensus/config/config.go new file mode 100644 index 00000000..87a7ea79 --- /dev/null +++ b/consensus/config/config.go @@ -0,0 +1,35 @@ +package config + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "gopkg.in/yaml.v3" + "io/ioutil" +) + +const CName = "config" + +func NewFromFile(path string) (c *Config, err error) { + c = &Config{} + data, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + if err = yaml.Unmarshal(data, c); err != nil { + return nil, err + } + return +} + +type Config struct { + GrpcServer GrpcServer `yaml:"grpcServer"` + Account Account `yaml:"account"` + Mongo Mongo `yaml:"mongo"` +} + +func (c *Config) Init(a *app.App) (err error) { + return +} + +func (c Config) Name() (name string) { + return CName +} diff --git a/consensus/config/grpc.go b/consensus/config/grpc.go new file mode 100644 index 00000000..700c3567 --- /dev/null +++ b/consensus/config/grpc.go @@ -0,0 +1,6 @@ +package config + +type GrpcServer struct { + ListenAddrs []string `yaml:"listenAddrs"` + TLS bool `yaml:"tls"` +} diff --git a/consensus/config/mongo.go b/consensus/config/mongo.go new file mode 100644 index 00000000..87fb679d --- /dev/null +++ b/consensus/config/mongo.go @@ -0,0 +1,7 @@ +package config + +type Mongo struct { + Connect string `yaml:"connect"` + Database string `yaml:"database"` + LogCollection string `yaml:"logCollection"` +} diff --git a/consensus/consensus.go b/consensus/consensus.go new file mode 100644 index 00000000..a041ae26 --- /dev/null +++ b/consensus/consensus.go @@ -0,0 +1,22 @@ +package consensus + +import "time" + +type Log struct { + Id []byte `bson:"_id"` + Records []Record `bson:"records"` +} + +type Record struct { + Id []byte `bson:"id"` + PrevId []byte `bson:"prevId"` + Payload []byte `bson:"payload"` + Created time.Time `bson:"created"'` +} + +func (l Log) CopyRecords() Log { + l2 := l + l2.Records = make([]Record, len(l.Records)) + copy(l2.Records, l.Records) + return l2 +} diff --git a/consensus/consensusproto/consensus.pb.go b/consensus/consensusproto/consensus.pb.go new file mode 100644 index 00000000..1b3e20d2 --- /dev/null +++ b/consensus/consensusproto/consensus.pb.go @@ -0,0 +1,1718 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: consensus/consensusproto/protos/consensus.proto + +package consensusproto + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type ErrCodes int32 + +const ( + ErrCodes_Unexpected ErrCodes = 0 + ErrCodes_LogExists ErrCodes = 1 + ErrCodes_LogNotFound ErrCodes = 2 + ErrCodes_RecordConflict ErrCodes = 3 + ErrCodes_ErrorOffset ErrCodes = 300 +) + +var ErrCodes_name = map[int32]string{ + 0: "Unexpected", + 1: "LogExists", + 2: "LogNotFound", + 3: "RecordConflict", + 300: "ErrorOffset", +} + +var ErrCodes_value = map[string]int32{ + "Unexpected": 0, + "LogExists": 1, + "LogNotFound": 2, + "RecordConflict": 3, + "ErrorOffset": 300, +} + +func (x ErrCodes) String() string { + return proto.EnumName(ErrCodes_name, int32(x)) +} + +func (ErrCodes) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_b8d7f1c16b400059, []int{0} +} + +type Log struct { + Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Records []*Record `protobuf:"bytes,2,rep,name=records,proto3" json:"records,omitempty"` + CreatedUnix uint64 `protobuf:"varint,3,opt,name=createdUnix,proto3" json:"createdUnix,omitempty"` +} + +func (m *Log) Reset() { *m = Log{} } +func (m *Log) String() string { return proto.CompactTextString(m) } +func (*Log) ProtoMessage() {} +func (*Log) Descriptor() ([]byte, []int) { + return fileDescriptor_b8d7f1c16b400059, []int{0} +} +func (m *Log) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Log) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Log.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 *Log) XXX_Merge(src proto.Message) { + xxx_messageInfo_Log.Merge(m, src) +} +func (m *Log) XXX_Size() int { + return m.Size() +} +func (m *Log) XXX_DiscardUnknown() { + xxx_messageInfo_Log.DiscardUnknown(m) +} + +var xxx_messageInfo_Log proto.InternalMessageInfo + +func (m *Log) GetId() []byte { + if m != nil { + return m.Id + } + return nil +} + +func (m *Log) GetRecords() []*Record { + if m != nil { + return m.Records + } + return nil +} + +func (m *Log) GetCreatedUnix() uint64 { + if m != nil { + return m.CreatedUnix + } + return 0 +} + +type Record struct { + Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + PrevId []byte `protobuf:"bytes,2,opt,name=prevId,proto3" json:"prevId,omitempty"` + Payload []byte `protobuf:"bytes,3,opt,name=payload,proto3" json:"payload,omitempty"` + CreatedUnix uint64 `protobuf:"varint,4,opt,name=createdUnix,proto3" json:"createdUnix,omitempty"` +} + +func (m *Record) Reset() { *m = Record{} } +func (m *Record) String() string { return proto.CompactTextString(m) } +func (*Record) ProtoMessage() {} +func (*Record) Descriptor() ([]byte, []int) { + return fileDescriptor_b8d7f1c16b400059, []int{1} +} +func (m *Record) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Record) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Record.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 *Record) XXX_Merge(src proto.Message) { + xxx_messageInfo_Record.Merge(m, src) +} +func (m *Record) XXX_Size() int { + return m.Size() +} +func (m *Record) XXX_DiscardUnknown() { + xxx_messageInfo_Record.DiscardUnknown(m) +} + +var xxx_messageInfo_Record proto.InternalMessageInfo + +func (m *Record) GetId() []byte { + if m != nil { + return m.Id + } + return nil +} + +func (m *Record) GetPrevId() []byte { + if m != nil { + return m.PrevId + } + return nil +} + +func (m *Record) GetPayload() []byte { + if m != nil { + return m.Payload + } + return nil +} + +func (m *Record) GetCreatedUnix() uint64 { + if m != nil { + return m.CreatedUnix + } + return 0 +} + +type Ok struct { +} + +func (m *Ok) Reset() { *m = Ok{} } +func (m *Ok) String() string { return proto.CompactTextString(m) } +func (*Ok) ProtoMessage() {} +func (*Ok) Descriptor() ([]byte, []int) { + return fileDescriptor_b8d7f1c16b400059, []int{2} +} +func (m *Ok) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Ok) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Ok.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 *Ok) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ok.Merge(m, src) +} +func (m *Ok) XXX_Size() int { + return m.Size() +} +func (m *Ok) XXX_DiscardUnknown() { + xxx_messageInfo_Ok.DiscardUnknown(m) +} + +var xxx_messageInfo_Ok proto.InternalMessageInfo + +type AddLogRequest struct { + Log *Log `protobuf:"bytes,1,opt,name=log,proto3" json:"log,omitempty"` +} + +func (m *AddLogRequest) Reset() { *m = AddLogRequest{} } +func (m *AddLogRequest) String() string { return proto.CompactTextString(m) } +func (*AddLogRequest) ProtoMessage() {} +func (*AddLogRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_b8d7f1c16b400059, []int{3} +} +func (m *AddLogRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AddLogRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddLogRequest.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 *AddLogRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddLogRequest.Merge(m, src) +} +func (m *AddLogRequest) XXX_Size() int { + return m.Size() +} +func (m *AddLogRequest) XXX_DiscardUnknown() { + xxx_messageInfo_AddLogRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_AddLogRequest proto.InternalMessageInfo + +func (m *AddLogRequest) GetLog() *Log { + if m != nil { + return m.Log + } + return nil +} + +type AddRecordRequest struct { + LogId []byte `protobuf:"bytes,1,opt,name=logId,proto3" json:"logId,omitempty"` + Record *Record `protobuf:"bytes,2,opt,name=record,proto3" json:"record,omitempty"` +} + +func (m *AddRecordRequest) Reset() { *m = AddRecordRequest{} } +func (m *AddRecordRequest) String() string { return proto.CompactTextString(m) } +func (*AddRecordRequest) ProtoMessage() {} +func (*AddRecordRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_b8d7f1c16b400059, []int{4} +} +func (m *AddRecordRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AddRecordRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddRecordRequest.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 *AddRecordRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddRecordRequest.Merge(m, src) +} +func (m *AddRecordRequest) XXX_Size() int { + return m.Size() +} +func (m *AddRecordRequest) XXX_DiscardUnknown() { + xxx_messageInfo_AddRecordRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_AddRecordRequest proto.InternalMessageInfo + +func (m *AddRecordRequest) GetLogId() []byte { + if m != nil { + return m.LogId + } + return nil +} + +func (m *AddRecordRequest) GetRecord() *Record { + if m != nil { + return m.Record + } + return nil +} + +type WatchLogRequest struct { + LogId []byte `protobuf:"bytes,1,opt,name=logId,proto3" json:"logId,omitempty"` +} + +func (m *WatchLogRequest) Reset() { *m = WatchLogRequest{} } +func (m *WatchLogRequest) String() string { return proto.CompactTextString(m) } +func (*WatchLogRequest) ProtoMessage() {} +func (*WatchLogRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_b8d7f1c16b400059, []int{5} +} +func (m *WatchLogRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WatchLogRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WatchLogRequest.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 *WatchLogRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_WatchLogRequest.Merge(m, src) +} +func (m *WatchLogRequest) XXX_Size() int { + return m.Size() +} +func (m *WatchLogRequest) XXX_DiscardUnknown() { + xxx_messageInfo_WatchLogRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_WatchLogRequest proto.InternalMessageInfo + +func (m *WatchLogRequest) GetLogId() []byte { + if m != nil { + return m.LogId + } + return nil +} + +type WatchLogEvent struct { + LogId []byte `protobuf:"bytes,1,opt,name=logId,proto3" json:"logId,omitempty"` + Records []*Record `protobuf:"bytes,2,rep,name=records,proto3" json:"records,omitempty"` +} + +func (m *WatchLogEvent) Reset() { *m = WatchLogEvent{} } +func (m *WatchLogEvent) String() string { return proto.CompactTextString(m) } +func (*WatchLogEvent) ProtoMessage() {} +func (*WatchLogEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_b8d7f1c16b400059, []int{6} +} +func (m *WatchLogEvent) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WatchLogEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WatchLogEvent.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 *WatchLogEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_WatchLogEvent.Merge(m, src) +} +func (m *WatchLogEvent) XXX_Size() int { + return m.Size() +} +func (m *WatchLogEvent) XXX_DiscardUnknown() { + xxx_messageInfo_WatchLogEvent.DiscardUnknown(m) +} + +var xxx_messageInfo_WatchLogEvent proto.InternalMessageInfo + +func (m *WatchLogEvent) GetLogId() []byte { + if m != nil { + return m.LogId + } + return nil +} + +func (m *WatchLogEvent) GetRecords() []*Record { + if m != nil { + return m.Records + } + return nil +} + +func init() { + proto.RegisterEnum("anyConsensus.ErrCodes", ErrCodes_name, ErrCodes_value) + proto.RegisterType((*Log)(nil), "anyConsensus.Log") + proto.RegisterType((*Record)(nil), "anyConsensus.Record") + proto.RegisterType((*Ok)(nil), "anyConsensus.Ok") + proto.RegisterType((*AddLogRequest)(nil), "anyConsensus.AddLogRequest") + proto.RegisterType((*AddRecordRequest)(nil), "anyConsensus.AddRecordRequest") + proto.RegisterType((*WatchLogRequest)(nil), "anyConsensus.WatchLogRequest") + proto.RegisterType((*WatchLogEvent)(nil), "anyConsensus.WatchLogEvent") +} + +func init() { + proto.RegisterFile("consensus/consensusproto/protos/consensus.proto", fileDescriptor_b8d7f1c16b400059) +} + +var fileDescriptor_b8d7f1c16b400059 = []byte{ + // 458 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x41, 0x8b, 0xd3, 0x40, + 0x14, 0xee, 0x24, 0x35, 0xbb, 0x7d, 0x69, 0xbb, 0xf1, 0xb1, 0x48, 0xd8, 0xc5, 0x50, 0xe2, 0xc1, + 0x22, 0xd2, 0x95, 0x2a, 0x78, 0xf2, 0xb0, 0x96, 0x8a, 0x0b, 0xc5, 0x42, 0xa0, 0x0a, 0x9e, 0x8c, + 0x99, 0x69, 0x0c, 0x1b, 0x32, 0x75, 0x66, 0xba, 0x74, 0xff, 0x85, 0x3f, 0xc4, 0x1f, 0xe2, 0x45, + 0xd8, 0xa3, 0x47, 0x69, 0xff, 0x88, 0x74, 0xd2, 0xac, 0xc9, 0xb6, 0x3d, 0xec, 0x25, 0xc9, 0x7c, + 0xdf, 0xfb, 0xde, 0xf7, 0xe6, 0x7b, 0x04, 0xce, 0x22, 0x9e, 0x49, 0x96, 0xc9, 0xb9, 0xfc, 0xff, + 0x35, 0x13, 0x5c, 0xf1, 0x33, 0xfd, 0x2c, 0xa1, 0x3d, 0x0d, 0x60, 0x33, 0xcc, 0xae, 0x07, 0x05, + 0xe6, 0xc7, 0x60, 0x8e, 0x78, 0x8c, 0x6d, 0x30, 0x12, 0xea, 0x92, 0x0e, 0xe9, 0x36, 0x03, 0x23, + 0xa1, 0xd8, 0x83, 0x03, 0xc1, 0x22, 0x2e, 0xa8, 0x74, 0x8d, 0x8e, 0xd9, 0xb5, 0xfb, 0xc7, 0xbd, + 0xb2, 0xac, 0x17, 0x68, 0x32, 0x28, 0x8a, 0xb0, 0x03, 0x76, 0x24, 0x58, 0xa8, 0x18, 0x9d, 0x64, + 0xc9, 0xc2, 0x35, 0x3b, 0xa4, 0x5b, 0x0f, 0xca, 0x90, 0x9f, 0x82, 0x95, 0x8b, 0xb6, 0xbc, 0x1e, + 0x81, 0x35, 0x13, 0xec, 0xea, 0x82, 0xba, 0x86, 0xc6, 0x36, 0x27, 0x74, 0xe1, 0x60, 0x16, 0x5e, + 0xa7, 0x3c, 0xa4, 0xba, 0x5f, 0x33, 0x28, 0x8e, 0x77, 0xdd, 0xea, 0xdb, 0x6e, 0x75, 0x30, 0xc6, + 0x97, 0xfe, 0x2b, 0x68, 0x9d, 0x53, 0x3a, 0xe2, 0x71, 0xc0, 0xbe, 0xcf, 0x99, 0x54, 0xf8, 0x04, + 0xcc, 0x94, 0xc7, 0xda, 0xdb, 0xee, 0x3f, 0xac, 0x5e, 0x69, 0x5d, 0xb6, 0x66, 0xfd, 0x8f, 0xe0, + 0x9c, 0x53, 0xba, 0xb9, 0xe1, 0x46, 0x78, 0x0c, 0x0f, 0x52, 0x1e, 0x5f, 0x14, 0x63, 0xe7, 0x07, + 0x7c, 0x0e, 0x56, 0x1e, 0x80, 0x9e, 0x7c, 0x5f, 0x48, 0x9b, 0x1a, 0xff, 0x29, 0x1c, 0x7d, 0x0a, + 0x55, 0xf4, 0xad, 0x34, 0xcf, 0xce, 0xb6, 0xfe, 0x04, 0x5a, 0x45, 0xe1, 0xf0, 0x8a, 0x65, 0xfb, + 0xdc, 0xef, 0xb9, 0xa3, 0x67, 0x5f, 0xe0, 0x70, 0x28, 0xc4, 0x80, 0x53, 0x26, 0xb1, 0x0d, 0x30, + 0xc9, 0xd8, 0x62, 0xc6, 0x22, 0xc5, 0xa8, 0x53, 0xc3, 0x16, 0x34, 0xd6, 0x6e, 0x8b, 0x44, 0x2a, + 0xe9, 0x10, 0x3c, 0x02, 0x7b, 0xc4, 0xe3, 0x0f, 0x5c, 0xbd, 0xe3, 0xf3, 0x8c, 0x3a, 0x06, 0x22, + 0xb4, 0xf3, 0x76, 0x03, 0x9e, 0x4d, 0xd3, 0x24, 0x52, 0x8e, 0x89, 0x0e, 0xd8, 0x43, 0x21, 0xb8, + 0x18, 0x4f, 0xa7, 0x92, 0x29, 0xe7, 0xa7, 0xd1, 0xff, 0x4d, 0xa0, 0x71, 0xeb, 0x8f, 0xaf, 0xc1, + 0xca, 0xd3, 0xc7, 0xd3, 0xea, 0x60, 0x95, 0x9d, 0x9c, 0x38, 0x55, 0x72, 0x7c, 0x89, 0x6f, 0xa0, + 0x71, 0xbb, 0x00, 0xf4, 0xb6, 0xb4, 0x95, 0xcd, 0xec, 0x90, 0xbf, 0x87, 0xc3, 0x22, 0x3e, 0x7c, + 0x5c, 0x65, 0xef, 0xe4, 0x7f, 0x72, 0xba, 0x9b, 0xd6, 0xa9, 0xbf, 0x20, 0x6f, 0xfb, 0xbf, 0x96, + 0x1e, 0xb9, 0x59, 0x7a, 0xe4, 0xef, 0xd2, 0x23, 0x3f, 0x56, 0x5e, 0xed, 0x66, 0xe5, 0xd5, 0xfe, + 0xac, 0xbc, 0xda, 0x67, 0x77, 0xdf, 0x5f, 0xf7, 0xd5, 0xd2, 0xaf, 0x97, 0xff, 0x02, 0x00, 0x00, + 0xff, 0xff, 0x2f, 0xe9, 0x67, 0xad, 0x98, 0x03, 0x00, 0x00, +} + +func (m *Log) 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 *Log) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Log) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CreatedUnix != 0 { + i = encodeVarintConsensus(dAtA, i, uint64(m.CreatedUnix)) + i-- + dAtA[i] = 0x18 + } + if len(m.Records) > 0 { + for iNdEx := len(m.Records) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Records[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintConsensus(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintConsensus(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Record) 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 *Record) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Record) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CreatedUnix != 0 { + i = encodeVarintConsensus(dAtA, i, uint64(m.CreatedUnix)) + i-- + dAtA[i] = 0x20 + } + if len(m.Payload) > 0 { + i -= len(m.Payload) + copy(dAtA[i:], m.Payload) + i = encodeVarintConsensus(dAtA, i, uint64(len(m.Payload))) + i-- + dAtA[i] = 0x1a + } + if len(m.PrevId) > 0 { + i -= len(m.PrevId) + copy(dAtA[i:], m.PrevId) + i = encodeVarintConsensus(dAtA, i, uint64(len(m.PrevId))) + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintConsensus(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Ok) 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 *Ok) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Ok) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *AddLogRequest) 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 *AddLogRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddLogRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Log != nil { + { + size, err := m.Log.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintConsensus(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AddRecordRequest) 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 *AddRecordRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRecordRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Record != nil { + { + size, err := m.Record.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintConsensus(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.LogId) > 0 { + i -= len(m.LogId) + copy(dAtA[i:], m.LogId) + i = encodeVarintConsensus(dAtA, i, uint64(len(m.LogId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *WatchLogRequest) 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 *WatchLogRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WatchLogRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.LogId) > 0 { + i -= len(m.LogId) + copy(dAtA[i:], m.LogId) + i = encodeVarintConsensus(dAtA, i, uint64(len(m.LogId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *WatchLogEvent) 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 *WatchLogEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WatchLogEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Records) > 0 { + for iNdEx := len(m.Records) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Records[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintConsensus(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.LogId) > 0 { + i -= len(m.LogId) + copy(dAtA[i:], m.LogId) + i = encodeVarintConsensus(dAtA, i, uint64(len(m.LogId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintConsensus(dAtA []byte, offset int, v uint64) int { + offset -= sovConsensus(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Log) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovConsensus(uint64(l)) + } + if len(m.Records) > 0 { + for _, e := range m.Records { + l = e.Size() + n += 1 + l + sovConsensus(uint64(l)) + } + } + if m.CreatedUnix != 0 { + n += 1 + sovConsensus(uint64(m.CreatedUnix)) + } + return n +} + +func (m *Record) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovConsensus(uint64(l)) + } + l = len(m.PrevId) + if l > 0 { + n += 1 + l + sovConsensus(uint64(l)) + } + l = len(m.Payload) + if l > 0 { + n += 1 + l + sovConsensus(uint64(l)) + } + if m.CreatedUnix != 0 { + n += 1 + sovConsensus(uint64(m.CreatedUnix)) + } + return n +} + +func (m *Ok) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *AddLogRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Log != nil { + l = m.Log.Size() + n += 1 + l + sovConsensus(uint64(l)) + } + return n +} + +func (m *AddRecordRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.LogId) + if l > 0 { + n += 1 + l + sovConsensus(uint64(l)) + } + if m.Record != nil { + l = m.Record.Size() + n += 1 + l + sovConsensus(uint64(l)) + } + return n +} + +func (m *WatchLogRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.LogId) + if l > 0 { + n += 1 + l + sovConsensus(uint64(l)) + } + return n +} + +func (m *WatchLogEvent) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.LogId) + if l > 0 { + n += 1 + l + sovConsensus(uint64(l)) + } + if len(m.Records) > 0 { + for _, e := range m.Records { + l = e.Size() + n += 1 + l + sovConsensus(uint64(l)) + } + } + return n +} + +func sovConsensus(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozConsensus(x uint64) (n int) { + return sovConsensus(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Log) 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 ErrIntOverflowConsensus + } + 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: Log: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Log: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = append(m.Id[:0], dAtA[iNdEx:postIndex]...) + if m.Id == nil { + m.Id = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Records", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Records = append(m.Records, &Record{}) + if err := m.Records[len(m.Records)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CreatedUnix", wireType) + } + m.CreatedUnix = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CreatedUnix |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipConsensus(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthConsensus + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Record) 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 ErrIntOverflowConsensus + } + 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: Record: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Record: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = append(m.Id[:0], dAtA[iNdEx:postIndex]...) + if m.Id == nil { + m.Id = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevId", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrevId = append(m.PrevId[:0], dAtA[iNdEx:postIndex]...) + if m.PrevId == nil { + m.PrevId = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) + if m.Payload == nil { + m.Payload = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CreatedUnix", wireType) + } + m.CreatedUnix = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CreatedUnix |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipConsensus(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthConsensus + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ok) 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 ErrIntOverflowConsensus + } + 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: Ok: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ok: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipConsensus(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthConsensus + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AddLogRequest) 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 ErrIntOverflowConsensus + } + 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: AddLogRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AddLogRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Log", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Log == nil { + m.Log = &Log{} + } + if err := m.Log.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipConsensus(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthConsensus + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AddRecordRequest) 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 ErrIntOverflowConsensus + } + 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: AddRecordRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AddRecordRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LogId", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LogId = append(m.LogId[:0], dAtA[iNdEx:postIndex]...) + if m.LogId == nil { + m.LogId = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Record", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Record == nil { + m.Record = &Record{} + } + if err := m.Record.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipConsensus(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthConsensus + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WatchLogRequest) 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 ErrIntOverflowConsensus + } + 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: WatchLogRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WatchLogRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LogId", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LogId = append(m.LogId[:0], dAtA[iNdEx:postIndex]...) + if m.LogId == nil { + m.LogId = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipConsensus(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthConsensus + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WatchLogEvent) 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 ErrIntOverflowConsensus + } + 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: WatchLogEvent: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WatchLogEvent: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LogId", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LogId = append(m.LogId[:0], dAtA[iNdEx:postIndex]...) + if m.LogId == nil { + m.LogId = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Records", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Records = append(m.Records, &Record{}) + if err := m.Records[len(m.Records)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipConsensus(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthConsensus + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipConsensus(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowConsensus + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowConsensus + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowConsensus + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthConsensus + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupConsensus + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthConsensus + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthConsensus = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowConsensus = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupConsensus = fmt.Errorf("proto: unexpected end of group") +) diff --git a/consensus/consensusproto/consensus_drpc.pb.go b/consensus/consensusproto/consensus_drpc.pb.go new file mode 100644 index 00000000..f573360f --- /dev/null +++ b/consensus/consensusproto/consensus_drpc.pb.go @@ -0,0 +1,217 @@ +// Code generated by protoc-gen-go-drpc. DO NOT EDIT. +// protoc-gen-go-drpc version: v0.0.32 +// source: consensus/consensusproto/protos/consensus.proto + +package consensusproto + +import ( + bytes "bytes" + context "context" + errors "errors" + jsonpb "github.com/gogo/protobuf/jsonpb" + proto "github.com/gogo/protobuf/proto" + drpc "storj.io/drpc" + drpcerr "storj.io/drpc/drpcerr" +) + +type drpcEncoding_File_consensus_consensusproto_protos_consensus_proto struct{} + +func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) Marshal(msg drpc.Message) ([]byte, error) { + return proto.Marshal(msg.(proto.Message)) +} + +func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) Unmarshal(buf []byte, msg drpc.Message) error { + return proto.Unmarshal(buf, msg.(proto.Message)) +} + +func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) JSONMarshal(msg drpc.Message) ([]byte, error) { + var buf bytes.Buffer + err := new(jsonpb.Marshaler).Marshal(&buf, msg.(proto.Message)) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error { + return jsonpb.Unmarshal(bytes.NewReader(buf), msg.(proto.Message)) +} + +type DRPCConsensusClient interface { + DRPCConn() drpc.Conn + + AddLog(ctx context.Context, in *AddLogRequest) (*Ok, error) + AddRecord(ctx context.Context, in *AddRecordRequest) (*Ok, error) + WatchLog(ctx context.Context, in *WatchLogRequest) (DRPCConsensus_WatchLogClient, error) +} + +type drpcConsensusClient struct { + cc drpc.Conn +} + +func NewDRPCConsensusClient(cc drpc.Conn) DRPCConsensusClient { + return &drpcConsensusClient{cc} +} + +func (c *drpcConsensusClient) DRPCConn() drpc.Conn { return c.cc } + +func (c *drpcConsensusClient) AddLog(ctx context.Context, in *AddLogRequest) (*Ok, error) { + out := new(Ok) + err := c.cc.Invoke(ctx, "/anyConsensus.Consensus/AddLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, in, out) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *drpcConsensusClient) AddRecord(ctx context.Context, in *AddRecordRequest) (*Ok, error) { + out := new(Ok) + err := c.cc.Invoke(ctx, "/anyConsensus.Consensus/AddRecord", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, in, out) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *drpcConsensusClient) WatchLog(ctx context.Context, in *WatchLogRequest) (DRPCConsensus_WatchLogClient, error) { + stream, err := c.cc.NewStream(ctx, "/anyConsensus.Consensus/WatchLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) + if err != nil { + return nil, err + } + x := &drpcConsensus_WatchLogClient{stream} + if err := x.MsgSend(in, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil { + return nil, err + } + if err := x.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type DRPCConsensus_WatchLogClient interface { + drpc.Stream + Recv() (*WatchLogEvent, error) +} + +type drpcConsensus_WatchLogClient struct { + drpc.Stream +} + +func (x *drpcConsensus_WatchLogClient) Recv() (*WatchLogEvent, error) { + m := new(WatchLogEvent) + if err := x.MsgRecv(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil { + return nil, err + } + return m, nil +} + +func (x *drpcConsensus_WatchLogClient) RecvMsg(m *WatchLogEvent) error { + return x.MsgRecv(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) +} + +type DRPCConsensusServer interface { + AddLog(context.Context, *AddLogRequest) (*Ok, error) + AddRecord(context.Context, *AddRecordRequest) (*Ok, error) + WatchLog(*WatchLogRequest, DRPCConsensus_WatchLogStream) error +} + +type DRPCConsensusUnimplementedServer struct{} + +func (s *DRPCConsensusUnimplementedServer) AddLog(context.Context, *AddLogRequest) (*Ok, error) { + return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) +} + +func (s *DRPCConsensusUnimplementedServer) AddRecord(context.Context, *AddRecordRequest) (*Ok, error) { + return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) +} + +func (s *DRPCConsensusUnimplementedServer) WatchLog(*WatchLogRequest, DRPCConsensus_WatchLogStream) error { + return drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) +} + +type DRPCConsensusDescription struct{} + +func (DRPCConsensusDescription) NumMethods() int { return 3 } + +func (DRPCConsensusDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { + switch n { + case 0: + return "/anyConsensus.Consensus/AddLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, + func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { + return srv.(DRPCConsensusServer). + AddLog( + ctx, + in1.(*AddLogRequest), + ) + }, DRPCConsensusServer.AddLog, true + case 1: + return "/anyConsensus.Consensus/AddRecord", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, + func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { + return srv.(DRPCConsensusServer). + AddRecord( + ctx, + in1.(*AddRecordRequest), + ) + }, DRPCConsensusServer.AddRecord, true + case 2: + return "/anyConsensus.Consensus/WatchLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, + func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { + return nil, srv.(DRPCConsensusServer). + WatchLog( + in1.(*WatchLogRequest), + &drpcConsensus_WatchLogStream{in2.(drpc.Stream)}, + ) + }, DRPCConsensusServer.WatchLog, true + default: + return "", nil, nil, nil, false + } +} + +func DRPCRegisterConsensus(mux drpc.Mux, impl DRPCConsensusServer) error { + return mux.Register(impl, DRPCConsensusDescription{}) +} + +type DRPCConsensus_AddLogStream interface { + drpc.Stream + SendAndClose(*Ok) error +} + +type drpcConsensus_AddLogStream struct { + drpc.Stream +} + +func (x *drpcConsensus_AddLogStream) SendAndClose(m *Ok) error { + if err := x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil { + return err + } + return x.CloseSend() +} + +type DRPCConsensus_AddRecordStream interface { + drpc.Stream + SendAndClose(*Ok) error +} + +type drpcConsensus_AddRecordStream struct { + drpc.Stream +} + +func (x *drpcConsensus_AddRecordStream) SendAndClose(m *Ok) error { + if err := x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil { + return err + } + return x.CloseSend() +} + +type DRPCConsensus_WatchLogStream interface { + drpc.Stream + Send(*WatchLogEvent) error +} + +type drpcConsensus_WatchLogStream struct { + drpc.Stream +} + +func (x *drpcConsensus_WatchLogStream) Send(m *WatchLogEvent) error { + return x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) +} diff --git a/consensus/consensusproto/consensuserrs/errors.go b/consensus/consensusproto/consensuserrs/errors.go new file mode 100644 index 00000000..afe5ec10 --- /dev/null +++ b/consensus/consensusproto/consensuserrs/errors.go @@ -0,0 +1,16 @@ +package consensuserrs + +import ( + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpcerr" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" +) + +var ( + errGroup = rpcerr.ErrGroup(consensusproto.ErrCodes_ErrorOffset) + + ErrUnexpected = errGroup.Register(fmt.Errorf("unexpected consensus error"), uint64(consensusproto.ErrCodes_Unexpected)) + ErrConflict = errGroup.Register(fmt.Errorf("records conflict"), uint64(consensusproto.ErrCodes_RecordConflict)) + ErrLogExists = errGroup.Register(fmt.Errorf("log exists"), uint64(consensusproto.ErrCodes_LogExists)) + ErrLogNotFound = errGroup.Register(fmt.Errorf("log not found"), uint64(consensusproto.ErrCodes_LogNotFound)) +) diff --git a/consensus/consensusproto/protos/consensus.proto b/consensus/consensusproto/protos/consensus.proto new file mode 100644 index 00000000..256d2868 --- /dev/null +++ b/consensus/consensusproto/protos/consensus.proto @@ -0,0 +1,55 @@ +syntax = "proto3"; +package anyConsensus; + +option go_package = "consensus/consensusproto"; + +enum ErrCodes { + Unexpected = 0; + LogExists = 1; + LogNotFound = 2; + RecordConflict = 3; + ErrorOffset = 300; +} + + +message Log { + bytes id = 1; + repeated Record records = 2; + uint64 createdUnix = 3; +} + +message Record { + bytes id = 1; + bytes prevId = 2; + bytes payload = 3; + uint64 createdUnix = 4; +} + +service Consensus { + // AddLog adds new log to consensus + rpc AddLog(AddLogRequest) returns (Ok); + // AddRecord adds new record to log + rpc AddRecord(AddRecordRequest) returns (Ok); + // WatchLog fetches log and subscribes for a changes + rpc WatchLog(WatchLogRequest) returns (stream WatchLogEvent); +} + +message Ok {} + +message AddLogRequest { + Log log = 1; +} + +message AddRecordRequest { + bytes logId = 1; + Record record = 2; +} + +message WatchLogRequest { + bytes logId = 1; +} + +message WatchLogEvent { + bytes logId = 1; + repeated Record records = 2; +} diff --git a/consensus/db/db.go b/consensus/db/db.go new file mode 100644 index 00000000..120d7be0 --- /dev/null +++ b/consensus/db/db.go @@ -0,0 +1,181 @@ +package db + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserrs" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "go.uber.org/zap" +) + +const CName = "consensus.db" + +var log = logger.NewNamed(CName) + +func New() Service { + return &service{} +} + +type ChangeReceiver func(logId []byte, records []consensus.Record) + +type Service interface { + AddLog(ctx context.Context, log consensus.Log) (err error) + AddRecord(ctx context.Context, logId []byte, record consensus.Record) (err error) + FetchLog(ctx context.Context, logId []byte) (log consensus.Log, err error) + SetChangeReceiver(receiver ChangeReceiver) (err error) + app.ComponentRunnable +} + +type service struct { + conf config.Mongo + logColl *mongo.Collection + running bool + changeReceiver ChangeReceiver + + streamCtx context.Context + streamCancel context.CancelFunc + listenerDone chan struct{} +} + +func (s *service) Init(a *app.App) (err error) { + s.conf = a.MustComponent(config.CName).(*config.Config).Mongo + return nil +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + client, err := mongo.Connect(ctx, options.Client().ApplyURI(s.conf.Connect)) + if err != nil { + return err + } + s.logColl = client.Database(s.conf.Database).Collection(s.conf.LogCollection) + s.running = true + if s.changeReceiver != nil { + if err = s.runStreamListener(ctx); err != nil { + return err + } + } + return +} + +func (s *service) AddLog(ctx context.Context, l consensus.Log) (err error) { + _, err = s.logColl.InsertOne(ctx, l) + if mongo.IsDuplicateKeyError(err) { + return consensuserrs.ErrLogExists + } + return +} + +type findLogQuery struct { + Id []byte `bson:"_id"` +} + +type findRecordQuery struct { + Id []byte `bson:"_id"` + LastRecordId []byte `bson:"records.0.id"` +} + +type updateOp struct { + Push struct { + Records struct { + Each []consensus.Record `bson:"$each""` + Pos int `bson:"$position"` + } `bson:"records"` + } `bson:"$push"` +} + +func (s *service) AddRecord(ctx context.Context, logId []byte, record consensus.Record) (err error) { + var upd updateOp + upd.Push.Records.Each = []consensus.Record{record} + result, err := s.logColl.UpdateOne(ctx, findRecordQuery{ + Id: logId, + LastRecordId: record.PrevId, + }, upd) + if err != nil { + log.Error("addRecord update error", zap.Error(err)) + return consensuserrs.ErrUnexpected + } + if result.ModifiedCount == 0 { + return consensuserrs.ErrConflict + } + return +} + +func (s *service) FetchLog(ctx context.Context, logId []byte) (l consensus.Log, err error) { + if err = s.logColl.FindOne(ctx, findLogQuery{Id: logId}).Decode(&l); err != nil { + if err == mongo.ErrNoDocuments { + err = consensuserrs.ErrLogNotFound + } + return + } + return +} + +func (s *service) SetChangeReceiver(receiver ChangeReceiver) (err error) { + if s.running { + return fmt.Errorf("set receiver must be called before Run") + } + s.changeReceiver = receiver + return +} + +type matchPipeline struct { + Match struct { + OT string `bson:"operationType"` + } `bson:"$match"` +} + +func (s *service) runStreamListener(ctx context.Context) (err error) { + var mp matchPipeline + mp.Match.OT = "update" + stream, err := s.logColl.Watch(ctx, []matchPipeline{mp}) + if err != nil { + return + } + s.listenerDone = make(chan struct{}) + s.streamCtx, s.streamCancel = context.WithCancel(context.Background()) + go s.streamListener(stream) + return +} + +type streamResult struct { + DocumentKey struct { + Id []byte `bson:"_id"` + } `bson:"documentKey"` + UpdateDescription struct { + UpdateFields struct { + Records []consensus.Record `bson:"records"` + } `bson:"updatedFields""` + } `bson:"updateDescription"` +} + +func (s *service) streamListener(stream *mongo.ChangeStream) { + defer close(s.listenerDone) + for stream.Next(s.streamCtx) { + var res streamResult + if err := stream.Decode(&res); err != nil { + log.Error("stream decode error:", zap.Error(err)) + } + s.changeReceiver(res.DocumentKey.Id, res.UpdateDescription.UpdateFields.Records) + } +} + +func (s *service) Close(ctx context.Context) (err error) { + if s.logColl != nil { + err = s.logColl.Database().Client().Disconnect(ctx) + s.logColl = nil + } + if s.listenerDone != nil { + s.streamCancel() + <-s.listenerDone + } + return +} diff --git a/consensus/db/db_test.go b/consensus/db/db_test.go new file mode 100644 index 00000000..add2ca37 --- /dev/null +++ b/consensus/db/db_test.go @@ -0,0 +1,218 @@ +package db + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserrs" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +var ctx = context.Background() + +func TestService_AddLog(t *testing.T) { + t.Run("success", func(t *testing.T) { + fx := newFixture(t, nil) + defer fx.Finish(t) + log := consensus.Log{ + Id: []byte("logOne"), + Records: []consensus.Record{ + { + Id: []byte("recordOne"), + PrevId: nil, + Payload: []byte("payload"), + Created: time.Now().Truncate(time.Second).UTC(), + }, + }, + } + require.NoError(t, fx.AddLog(ctx, log)) + fetched, err := fx.FetchLog(ctx, log.Id) + require.NoError(t, err) + assert.Equal(t, log, fetched) + }) + t.Run("duplicate error", func(t *testing.T) { + fx := newFixture(t, nil) + defer fx.Finish(t) + log := consensus.Log{ + Id: []byte("logOne"), + } + require.NoError(t, fx.AddLog(ctx, log)) + // TODO: check for specified error + require.Error(t, fx.AddLog(ctx, log)) + }) +} + +func TestService_AddRecord(t *testing.T) { + t.Run("success", func(t *testing.T) { + fx := newFixture(t, nil) + defer fx.Finish(t) + var records = []consensus.Record{ + { + Id: []byte("2"), + PrevId: []byte("1"), + }, + { + Id: []byte("3"), + PrevId: []byte("2"), + }, + { + Id: []byte("4"), + PrevId: []byte("3"), + }, + } + l := consensus.Log{ + Id: []byte("logTestRecords"), + Records: []consensus.Record{ + { + Id: []byte("1"), + }, + }, + } + require.NoError(t, fx.AddLog(ctx, l)) + for _, rec := range records { + require.NoError(t, fx.AddRecord(ctx, l.Id, rec)) + } + fx.assertLogValid(t, l.Id, 4) + }) + t.Run("conflict", func(t *testing.T) { + fx := newFixture(t, nil) + defer fx.Finish(t) + log := consensus.Log{ + Id: []byte("logTestRecords"), + Records: []consensus.Record{ + { + Id: []byte("1"), + }, + }, + } + require.NoError(t, fx.AddLog(ctx, log)) + assert.Error(t, fx.AddRecord(ctx, log.Id, consensus.Record{Id: []byte("2"), PrevId: []byte("3")})) + }) +} + +func TestService_FetchLog(t *testing.T) { + t.Run("not found", func(t *testing.T) { + fx := newFixture(t, nil) + defer fx.Finish(t) + l, err := fx.FetchLog(ctx, []byte("not exists")) + assert.Empty(t, l) + assert.ErrorIs(t, err, consensuserrs.ErrLogNotFound) + }) +} + +func TestService_ChangeReceive(t *testing.T) { + t.Run("set after run", func(t *testing.T) { + fx := newFixture(t, nil) + defer fx.Finish(t) + assert.Error(t, fx.SetChangeReceiver(func(logId []byte, records []consensus.Record) {})) + }) + t.Run("receive changes", func(t *testing.T) { + var logs = make(chan consensus.Log, 10) + var count int + fx := newFixture(t, func(logId []byte, records []consensus.Record) { + logs <- consensus.Log{Id: logId, Records: records} + count++ + }) + defer fx.Finish(t) + var l = consensus.Log{ + Id: []byte("logTestStream"), + Records: []consensus.Record{ + { + Id: []byte("1"), + }, + }, + } + var records = []consensus.Record{ + { + Id: []byte("2"), + PrevId: []byte("1"), + }, + { + Id: []byte("3"), + PrevId: []byte("2"), + }, + { + Id: []byte("4"), + PrevId: []byte("3"), + }, + } + require.NoError(t, fx.AddLog(ctx, l)) + assert.Empty(t, count) + + for _, rec := range records { + require.NoError(t, fx.AddRecord(ctx, l.Id, rec)) + } + + timeout := time.After(time.Second) + for i := 0; i < len(records); i++ { + select { + case resLog := <-logs: + assertLogValid(t, resLog, i+2) + case <-timeout: + require.False(t, true) + } + } + }) +} + +func newFixture(t *testing.T, cr ChangeReceiver) *fixture { + ctx, cancel := context.WithTimeout(ctx, time.Second) + fx := &fixture{ + Service: New(), + cancel: cancel, + a: new(app.App), + } + fx.a.Register(&config.Config{ + Mongo: config.Mongo{ + Connect: "mongodb://localhost:27017/?w=majority", + Database: "consensus_test", + LogCollection: "log", + }, + }) + fx.a.Register(fx.Service) + require.NoError(t, fx.Service.SetChangeReceiver(cr)) + err := fx.a.Start(ctx) + if err != nil { + fx.cancel() + } + require.NoError(t, err) + return fx +} + +type fixture struct { + Service + a *app.App + cancel context.CancelFunc +} + +func (fx *fixture) Finish(t *testing.T) { + if fx.cancel != nil { + fx.cancel() + } + coll := fx.Service.(*service).logColl + t.Log(coll.Drop(ctx)) + assert.NoError(t, fx.a.Close(ctx)) +} + +func (fx *fixture) assertLogValid(t *testing.T, logId []byte, count int) { + log, err := fx.FetchLog(ctx, logId) + require.NoError(t, err) + assertLogValid(t, log, count) +} + +func assertLogValid(t *testing.T, log consensus.Log, count int) { + if count >= 0 { + assert.Len(t, log.Records, count) + } + var prevId []byte + for _, rec := range log.Records { + if len(prevId) != 0 { + assert.Equal(t, string(prevId), string(rec.Id)) + } + prevId = rec.PrevId + } +} diff --git a/go.mod b/go.mod index 9c60aa54..a71e82d4 100644 --- a/go.mod +++ b/go.mod @@ -12,12 +12,13 @@ require ( github.com/ipfs/go-cid v0.1.0 github.com/libp2p/go-libp2p v0.20.3 github.com/libp2p/go-libp2p-core v0.16.1 - github.com/mr-tron/base58 v1.2.0 + github.com/minio/sha256-simd v1.0.0 github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.1.0 github.com/stretchr/testify v1.8.0 github.com/zeebo/blake3 v0.2.3 github.com/zeebo/errs v1.3.0 + go.mongodb.org/mongo-driver v1.10.2 go.uber.org/zap v1.21.0 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 gopkg.in/yaml.v3 v3.0.1 @@ -33,11 +34,14 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/snappy v0.0.1 // indirect + github.com/klauspost/compress v1.15.1 // indirect github.com/klauspost/cpuid/v2 v2.0.12 // indirect github.com/libp2p/go-buffer-pool v0.0.2 // indirect github.com/libp2p/go-openssl v0.0.7 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect - github.com/minio/sha256-simd v1.0.0 // indirect + github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect + github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.0.3 // indirect github.com/multiformats/go-base36 v0.1.0 // indirect github.com/multiformats/go-multiaddr v0.5.0 // indirect @@ -47,11 +51,17 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.1 // indirect + github.com/xdg-go/stringprep v1.0.3 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect - golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect + golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect + golang.org/x/text v0.3.7 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.1.6 // indirect diff --git a/go.sum b/go.sum index 34c05834..fd2783ce 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,10 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= @@ -42,6 +46,9 @@ github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXm github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 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.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= +github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= 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 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE= @@ -64,6 +71,8 @@ github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8Rv 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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= 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= @@ -102,10 +111,21 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 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/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -117,6 +137,8 @@ github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= +go.mongodb.org/mongo-driver v1.10.2 h1:4Wk3cnqOrQCn0P92L3/mmurMxzdvWWs5J9jinAVKD+k= +go.mongodb.org/mongo-driver v1.10.2/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -134,8 +156,8 @@ golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/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/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -149,9 +171,11 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -161,13 +185,18 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/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-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -177,6 +206,7 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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= 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= diff --git a/pkg/acl/aclrecordproto/aclrecord.pb.go b/pkg/acl/aclrecordproto/aclrecord.pb.go index 158b70f5..e11f5209 100644 --- a/pkg/acl/aclrecordproto/aclrecord.pb.go +++ b/pkg/acl/aclrecordproto/aclrecord.pb.go @@ -324,6 +324,7 @@ func (m *ACLRoot) GetTimestamp() int64 { type ACLContentValue struct { // Types that are valid to be assigned to Value: + // // *ACLContentValue_UserAdd // *ACLContentValue_UserRemove // *ACLContentValue_UserPermissionChange diff --git a/pkg/acl/testutils/testchanges/proto/test.pb.go b/pkg/acl/testutils/testchanges/proto/test.pb.go index e8e43c54..d99ba0b5 100644 --- a/pkg/acl/testutils/testchanges/proto/test.pb.go +++ b/pkg/acl/testutils/testchanges/proto/test.pb.go @@ -60,6 +60,7 @@ var xxx_messageInfo_PlainTextChange proto.InternalMessageInfo type PlainTextChange_Content struct { // Types that are valid to be assigned to Value: + // // *PlainTextChange_Content_TextAppend Value isPlainTextChange_Content_Value `protobuf_oneof:"value"` } From edc9a14ef5b6d32f6e467803e68cb26a71ad203c Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 1 Oct 2022 21:04:31 +0200 Subject: [PATCH 110/219] Few tree sync fixes and additions --- .../mock_syncservice/mock_syncservice.go | 78 ++++++ common/commonspace/syncservice/synchandler.go | 27 +- .../syncservice/synchandler_test.go | 58 +++++ pkg/acl/storage/inmemory.go | 5 + pkg/acl/storage/mock_storage/mock_storage.go | 15 ++ pkg/acl/storage/treestorage.go | 1 + .../tree/mock_objecttree/mock_objecttree.go | 16 +- pkg/acl/tree/objecttree.go | 236 +++++++++++------- pkg/acl/tree/objecttreefactory.go | 2 +- 9 files changed, 325 insertions(+), 113 deletions(-) create mode 100644 common/commonspace/syncservice/mock_syncservice/mock_syncservice.go create mode 100644 common/commonspace/syncservice/synchandler_test.go 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..8438ab64 --- /dev/null +++ b/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go @@ -0,0 +1,78 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice (interfaces: SyncClient) + +// Package mock_syncservice is a generated GoMock package. +package mock_syncservice + +import ( + reflect "reflect" + + spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + gomock "github.com/golang/mock/gomock" +) + +// MockSyncClient is a mock of SyncClient interface. +type MockSyncClient struct { + ctrl *gomock.Controller + recorder *MockSyncClientMockRecorder +} + +// MockSyncClientMockRecorder is the mock recorder for MockSyncClient. +type MockSyncClientMockRecorder struct { + mock *MockSyncClient +} + +// NewMockSyncClient creates a new mock instance. +func NewMockSyncClient(ctrl *gomock.Controller) *MockSyncClient { + mock := &MockSyncClient{ctrl: ctrl} + mock.recorder = &MockSyncClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockSyncClient) EXPECT() *MockSyncClientMockRecorder { + return m.recorder +} + +// BroadcastAsync mocks base method. +func (m *MockSyncClient) BroadcastAsync(arg0 *spacesyncproto.ObjectSyncMessage) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BroadcastAsync", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// BroadcastAsync indicates an expected call of BroadcastAsync. +func (mr *MockSyncClientMockRecorder) BroadcastAsync(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BroadcastAsync", reflect.TypeOf((*MockSyncClient)(nil).BroadcastAsync), arg0) +} + +// SendAsync mocks base method. +func (m *MockSyncClient) SendAsync(arg0 string, arg1 *spacesyncproto.ObjectSyncMessage) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendAsync", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendAsync indicates an expected call of SendAsync. +func (mr *MockSyncClientMockRecorder) SendAsync(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendAsync", reflect.TypeOf((*MockSyncClient)(nil).SendAsync), arg0, arg1) +} + +// SendSync mocks base method. +func (m *MockSyncClient) SendSync(arg0 string, arg1 *spacesyncproto.ObjectSyncMessage) (*spacesyncproto.ObjectSyncMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendSync", arg0, arg1) + ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SendSync indicates an expected call of SendSync. +func (mr *MockSyncClientMockRecorder) SendSync(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendSync", reflect.TypeOf((*MockSyncClient)(nil).SendSync), arg0, arg1) +} diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index 3a0da9fd..0123cbff 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -1,3 +1,4 @@ +//go:generate mockgen -destination mock_syncservice/mock_syncservice.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice SyncClient package syncservice import ( @@ -31,16 +32,16 @@ func (s *syncHandler) HandleMessage(ctx context.Context, senderId string, msg *s content := msg.GetContent() switch { case content.GetFullSyncRequest() != nil: - return s.HandleFullSyncRequest(ctx, senderId, content.GetFullSyncRequest(), msg) + return s.handleFullSyncRequest(ctx, senderId, content.GetFullSyncRequest(), msg) case content.GetFullSyncResponse() != nil: - return s.HandleFullSyncResponse(ctx, senderId, content.GetFullSyncResponse(), msg) + return s.handleFullSyncResponse(ctx, senderId, content.GetFullSyncResponse(), msg) case content.GetHeadUpdate() != nil: - return s.HandleHeadUpdate(ctx, senderId, content.GetHeadUpdate(), msg) + return s.handleHeadUpdate(ctx, senderId, content.GetHeadUpdate(), msg) } return nil } -func (s *syncHandler) HandleHeadUpdate( +func (s *syncHandler) handleHeadUpdate( ctx context.Context, senderId string, update *spacesyncproto.ObjectHeadUpdate, @@ -70,12 +71,14 @@ func (s *syncHandler) HandleHeadUpdate( return err } - // if we couldn't add all the changes - if len(update.Changes) != len(result.Added) { - fullRequest, err = s.prepareFullSyncRequest(objTree, update) - if err != nil { - return err - } + // if after the heads are equal, or we have them locally + if slice.UnsortedEquals(update.Heads, result.Heads) || objTree.HasChanges(update.Heads...) { + return nil + } + + fullRequest, err = s.prepareFullSyncRequest(objTree, update) + if err != nil { + return err } return nil }() @@ -87,7 +90,7 @@ func (s *syncHandler) HandleHeadUpdate( return } -func (s *syncHandler) HandleFullSyncRequest( +func (s *syncHandler) handleFullSyncRequest( ctx context.Context, senderId string, request *spacesyncproto.ObjectFullSyncRequest, @@ -133,7 +136,7 @@ func (s *syncHandler) HandleFullSyncRequest( spacesyncproto.WrapFullResponse(fullResponse, header, msg.TreeId, msg.TrackingId)) } -func (s *syncHandler) HandleFullSyncResponse( +func (s *syncHandler) handleFullSyncResponse( ctx context.Context, senderId string, response *spacesyncproto.ObjectFullSyncResponse, diff --git a/common/commonspace/syncservice/synchandler_test.go b/common/commonspace/syncservice/synchandler_test.go new file mode 100644 index 00000000..dc145017 --- /dev/null +++ b/common/commonspace/syncservice/synchandler_test.go @@ -0,0 +1,58 @@ +package syncservice + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache/mock_cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/mock_syncservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + mock_tree "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree/mock_objecttree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + "testing" +) + +type treeContainer struct { + objTree tree.ObjectTree +} + +func (t treeContainer) Tree() tree.ObjectTree { + return t.objTree +} + +func TestSyncHandler_HandleMessage(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + ctx := context.Background() + spaceId := "spaceId" + cacheMock := mock_cache.NewMockTreeCache(ctrl) + syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) + objectTreeMock := mock_tree.NewMockObjectTree(ctrl) + + syncHandler := newSyncHandler(spaceId, cacheMock, syncClientMock) + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + headUpdate := &spacesyncproto.ObjectHeadUpdate{ + Heads: []string{"h1"}, + Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, + SnapshotPath: []string{"h1"}, + } + msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{ + Release: func() {}, + TreeContainer: treeContainer{objectTreeMock}, + }, nil) + objectTreeMock.EXPECT().Lock() + objectTreeMock.EXPECT().Heads().Return([]string{"h2"}) + objectTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). + Return(tree.AddResult{}, nil) + objectTreeMock.EXPECT().Unlock() + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.NoError(t, err) +} diff --git a/pkg/acl/storage/inmemory.go b/pkg/acl/storage/inmemory.go index 6ddbea57..487caa04 100644 --- a/pkg/acl/storage/inmemory.go +++ b/pkg/acl/storage/inmemory.go @@ -87,6 +87,11 @@ func NewInMemoryTreeStorage( }, nil } +func (t *inMemoryTreeStorage) HasChange(ctx context.Context, id string) (bool, error) { + _, exists := t.changes[id] + return exists, nil +} + func (t *inMemoryTreeStorage) ID() (string, error) { t.RLock() defer t.RUnlock() diff --git a/pkg/acl/storage/mock_storage/mock_storage.go b/pkg/acl/storage/mock_storage/mock_storage.go index 5fff6944..f20bf468 100644 --- a/pkg/acl/storage/mock_storage/mock_storage.go +++ b/pkg/acl/storage/mock_storage/mock_storage.go @@ -162,6 +162,21 @@ func (mr *MockTreeStorageMockRecorder) GetRawChange(arg0, arg1 interface{}) *gom return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRawChange", reflect.TypeOf((*MockTreeStorage)(nil).GetRawChange), arg0, arg1) } +// HasChange mocks base method. +func (m *MockTreeStorage) HasChange(arg0 context.Context, arg1 string) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HasChange", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// HasChange indicates an expected call of HasChange. +func (mr *MockTreeStorageMockRecorder) HasChange(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasChange", reflect.TypeOf((*MockTreeStorage)(nil).HasChange), arg0, arg1) +} + // Heads mocks base method. func (m *MockTreeStorage) Heads() ([]string, error) { m.ctrl.T.Helper() diff --git a/pkg/acl/storage/treestorage.go b/pkg/acl/storage/treestorage.go index a9c98f1d..25b91e46 100644 --- a/pkg/acl/storage/treestorage.go +++ b/pkg/acl/storage/treestorage.go @@ -13,6 +13,7 @@ type TreeStorage interface { AddRawChange(change *treechangeproto.RawTreeChangeWithId) error GetRawChange(ctx context.Context, id string) (*treechangeproto.RawTreeChangeWithId, error) + HasChange(ctx context.Context, id string) (bool, error) } type TreeStorageCreatorFunc = func(payload TreeStorageCreatePayload) (TreeStorage, error) diff --git a/pkg/acl/tree/mock_objecttree/mock_objecttree.go b/pkg/acl/tree/mock_objecttree/mock_objecttree.go index a4eac719..70afa9d4 100644 --- a/pkg/acl/tree/mock_objecttree/mock_objecttree.go +++ b/pkg/acl/tree/mock_objecttree/mock_objecttree.go @@ -116,18 +116,22 @@ func (mr *MockObjectTreeMockRecorder) DebugDump() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DebugDump", reflect.TypeOf((*MockObjectTree)(nil).DebugDump)) } -// HasChange mocks base method. -func (m *MockObjectTree) HasChange(arg0 string) bool { +// HasChanges mocks base method. +func (m *MockObjectTree) HasChanges(arg0 ...string) bool { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HasChange", arg0) + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "HasChanges", varargs...) ret0, _ := ret[0].(bool) return ret0 } -// HasChange indicates an expected call of HasChange. -func (mr *MockObjectTreeMockRecorder) HasChange(arg0 interface{}) *gomock.Call { +// HasChanges indicates an expected call of HasChanges. +func (mr *MockObjectTreeMockRecorder) HasChanges(arg0 ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasChange", reflect.TypeOf((*MockObjectTree)(nil).HasChange), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasChanges", reflect.TypeOf((*MockObjectTree)(nil).HasChanges), arg0...) } // Header mocks base method. diff --git a/pkg/acl/tree/objecttree.go b/pkg/acl/tree/objecttree.go index 47305d23..9e6323aa 100644 --- a/pkg/acl/tree/objecttree.go +++ b/pkg/acl/tree/objecttree.go @@ -43,7 +43,7 @@ type ObjectTree interface { Header() *treechangeproto.RawTreeChangeWithId Heads() []string Root() *Change - HasChange(string) bool + HasChanges(...string) bool DebugDump() (string, error) Iterate(convert ChangeConvertFunc, iterate ChangeIterateFunc) error @@ -76,7 +76,7 @@ type objectTree struct { // buffers difSnapshotBuf []*treechangeproto.RawTreeChangeWithId - tmpChangesBuf []*Change + newChangesBuf []*Change newSnapshotsBuf []*Change notSeenIdxBuf []int @@ -227,7 +227,7 @@ func (ot *objectTree) AddRawChanges(ctx context.Context, rawChanges ...*treechan func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechangeproto.RawTreeChangeWithId) (addResult AddResult, err error) { // resetting buffers - ot.tmpChangesBuf = ot.tmpChangesBuf[:0] + ot.newChangesBuf = ot.newChangesBuf[:0] ot.notSeenIdxBuf = ot.notSeenIdxBuf[:0] ot.difSnapshotBuf = ot.difSnapshotBuf[:0] ot.newSnapshotsBuf = ot.newSnapshotsBuf[:0] @@ -247,20 +247,21 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechan if _, exists := ot.tree.attached[ch.Id]; exists { continue } - if _, exists := ot.tree.unAttached[ch.Id]; exists { - continue - } var change *Change - change, err = ot.changeBuilder.ConvertFromRaw(ch, true) - if err != nil { - return + if unAttached, exists := ot.tree.unAttached[ch.Id]; exists { + change = unAttached + } else { + change, err = ot.changeBuilder.ConvertFromRaw(ch, true) + if err != nil { + return + } } if change.IsSnapshot { ot.newSnapshotsBuf = append(ot.newSnapshotsBuf, change) } - ot.tmpChangesBuf = append(ot.tmpChangesBuf, change) + ot.newChangesBuf = append(ot.newChangesBuf, change) ot.notSeenIdxBuf = append(ot.notSeenIdxBuf, idx) } @@ -274,6 +275,106 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechan return } + rollback := func(changes []*Change) { + for _, ch := range changes { + if _, exists := ot.tree.attached[ch.Id]; exists { + delete(ot.tree.attached, ch.Id) + } + } + } + + // checks if we need to go to database + isOldSnapshot := func(ch *Change) bool { + if ch.SnapshotId == ot.tree.RootId() { + return false + } + for _, sn := range ot.newSnapshotsBuf { + // if change refers to newly received snapshot + if ch.SnapshotId == sn.Id { + return false + } + } + return true + } + + shouldRebuildFromStorage := false + // checking if we have some changes with different snapshot and then rebuilding + for idx, ch := range ot.newChangesBuf { + if isOldSnapshot(ch) { + var exists bool + // checking if it exists in the storage, if yes, then at some point it was added to the tree + // thus we don't need to look at this change + exists, err = ot.treeStorage.HasChange(ctx, ch.Id) + if err != nil { + return + } + if exists { + // marking as nil to delete after + ot.newChangesBuf[idx] = nil + continue + } + // we haven't seen the change, and it refers to old snapshot, so we should rebuild + shouldRebuildFromStorage = true + } + } + // discarding all previously seen changes + ot.newChangesBuf = discardFromSlice(ot.newChangesBuf, func(ch *Change) bool { return ch == nil }) + + if shouldRebuildFromStorage { + err = ot.rebuildFromStorage(ot.newChangesBuf) + if err != nil { + // rebuilding without new changes + ot.rebuildFromStorage(nil) + return + } + addResult, err = ot.createAddResult(prevHeadsCopy, Rebuild, nil, 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) + return + } + return + } + + // normal mode of operation, where we don't need to rebuild from database + mode, treeChangesAdded := ot.tree.Add(ot.newChangesBuf...) + switch mode { + case Nothing: + addResult = AddResult{ + OldHeads: prevHeadsCopy, + Heads: prevHeadsCopy, + Mode: mode, + } + return + + default: + // we need to validate only newly added changes + err = ot.validateTree(treeChangesAdded) + if err != nil { + rollback(treeChangesAdded) + err = ErrHasInvalidChanges + return + } + addResult, err = ot.createAddResult(prevHeadsCopy, mode, treeChangesAdded, 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) + return + } + return + } + return +} + +func (ot *objectTree) createAddResult(oldHeads []string, mode Mode, treeChangesAdded []*Change, rawChanges []*treechangeproto.RawTreeChangeWithId) (addResult AddResult, err error) { + headsCopy := func() []string { + newHeads := make([]string, 0, len(ot.tree.Heads())) + newHeads = append(newHeads, ot.tree.Heads()...) + return newHeads + } + // returns changes that we added to the tree as attached this round // they can include not only the changes that were added now, // but also the changes that were previously in the tree @@ -313,88 +414,16 @@ func (ot *objectTree) addRawChanges(ctx context.Context, rawChanges ...*treechan return } - rollback := func(changes []*Change) { - for _, ch := range changes { - if _, exists := ot.tree.attached[ch.Id]; exists { - delete(ot.tree.attached, ch.Id) - } - } - } - - // checks if we need to go to database - isOldSnapshot := func(ch *Change) bool { - if ch.SnapshotId == ot.tree.RootId() { - return false - } - for _, sn := range ot.newSnapshotsBuf { - // if change refers to newly received snapshot - if ch.SnapshotId == sn.Id { - return false - } - } - return true - } - - // checking if we have some changes with different snapshot and then rebuilding - for _, ch := range ot.tmpChangesBuf { - if isOldSnapshot(ch) { - err = ot.rebuildFromStorage(ot.tmpChangesBuf) - if err != nil { - // rebuilding without new changes - ot.rebuildFromStorage(nil) - return - } - var added []*treechangeproto.RawTreeChangeWithId - added, err = getAddedChanges(nil) - // we shouldn't get any error in this case - if err != nil { - panic(err) - } - - addResult = AddResult{ - OldHeads: prevHeadsCopy, - Heads: headsCopy(), - Added: added, - Mode: Rebuild, - } - return - } - } - - // normal mode of operation, where we don't need to rebuild from database - mode, treeChangesAdded := ot.tree.Add(ot.tmpChangesBuf...) - switch mode { - case Nothing: - addResult = AddResult{ - OldHeads: prevHeadsCopy, - Heads: prevHeadsCopy, - Mode: mode, - } + var added []*treechangeproto.RawTreeChangeWithId + added, err = getAddedChanges(treeChangesAdded) + if err != nil { return - - default: - // we need to validate only newly added changes - err = ot.validateTree(treeChangesAdded) - if err != nil { - rollback(treeChangesAdded) - err = ErrHasInvalidChanges - return - } - var added []*treechangeproto.RawTreeChangeWithId - added, err = getAddedChanges(treeChangesAdded) - 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) - return - } - - addResult = AddResult{ - OldHeads: prevHeadsCopy, - Heads: headsCopy(), - Added: added, - Mode: mode, - } + } + addResult = AddResult{ + OldHeads: oldHeads, + Heads: headsCopy(), + Added: added, + Mode: mode, } return } @@ -441,9 +470,28 @@ func (ot *objectTree) IterateFrom(id string, convert ChangeConvertFunc, iterate return } -func (ot *objectTree) HasChange(s string) bool { - _, attachedExists := ot.tree.attached[s] - return attachedExists +func (ot *objectTree) HasChanges(chs ...string) bool { + hasChange := func(s string) bool { + _, attachedExists := ot.tree.attached[s] + if attachedExists { + return attachedExists + } + + has, err := ot.treeStorage.HasChange(context.Background(), s) + if err != nil { + return false + } + + return has + } + + for _, ch := range chs { + if !hasChange(ch) { + return false + } + } + + return true } func (ot *objectTree) Heads() []string { diff --git a/pkg/acl/tree/objecttreefactory.go b/pkg/acl/tree/objecttreefactory.go index 61631412..1db77908 100644 --- a/pkg/acl/tree/objecttreefactory.go +++ b/pkg/acl/tree/objecttreefactory.go @@ -104,7 +104,7 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { rawChangeLoader: deps.rawChangeLoader, tree: nil, keys: make(map[uint64]*symmetric.Key), - tmpChangesBuf: make([]*Change, 0, 10), + newChangesBuf: make([]*Change, 0, 10), difSnapshotBuf: make([]*treechangeproto.RawTreeChangeWithId, 0, 10), notSeenIdxBuf: make([]int, 0, 10), newSnapshotsBuf: make([]*Change, 0, 10), From 20234269e9d3ca0595244627dede932be05751da Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 2 Oct 2022 11:54:34 +0200 Subject: [PATCH 111/219] Update sync handler --- .../commonspace/syncservice/requestfactory.go | 59 ++++++++++++++ common/commonspace/syncservice/synchandler.go | 77 +++++-------------- common/commonspace/syncservice/syncservice.go | 2 +- 3 files changed, 80 insertions(+), 58 deletions(-) create mode 100644 common/commonspace/syncservice/requestfactory.go diff --git a/common/commonspace/syncservice/requestfactory.go b/common/commonspace/syncservice/requestfactory.go new file mode 100644 index 00000000..ab19bc6a --- /dev/null +++ b/common/commonspace/syncservice/requestfactory.go @@ -0,0 +1,59 @@ +package syncservice + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" +) + +type RequestFactory interface { + FullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (req *spacesyncproto.ObjectSyncMessage, err error) + FullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (*spacesyncproto.ObjectSyncMessage, error) +} + +func newRequestFactory() RequestFactory { + return &requestFactory{} +} + +type requestFactory struct{} + +func (r *requestFactory) FullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (msg *spacesyncproto.ObjectSyncMessage, err error) { + req := &spacesyncproto.ObjectFullSyncRequest{} + if t == nil { + msg = spacesyncproto.WrapFullRequest(req, t.Header(), t.ID(), trackingId) + return + } + + req.Heads = t.Heads() + req.SnapshotPath = t.SnapshotPath() + + var changesAfterSnapshot []*treechangeproto.RawTreeChangeWithId + changesAfterSnapshot, err = t.ChangesAfterCommonSnapshot(theirSnapshotPath, theirHeads) + if err != nil { + return + } + + req.Changes = changesAfterSnapshot + msg = spacesyncproto.WrapFullRequest(req, t.Header(), t.ID(), trackingId) + return +} + +func (r *requestFactory) FullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (msg *spacesyncproto.ObjectSyncMessage, err error) { + resp := &spacesyncproto.ObjectFullSyncResponse{ + Heads: t.Heads(), + SnapshotPath: t.SnapshotPath(), + } + if slice.UnsortedEquals(theirHeads, t.Heads()) { + msg = spacesyncproto.WrapFullResponse(resp, t.Header(), t.ID(), trackingId) + return + } + + ourChanges, err := t.ChangesAfterCommonSnapshot(theirSnapshotPath, theirHeads) + if err != nil { + return + } + resp.Changes = ourChanges + msg = spacesyncproto.WrapFullResponse(resp, t.Header(), t.ID(), trackingId) + return +} diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index 0123cbff..16ce2177 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -6,7 +6,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" ) @@ -14,17 +13,19 @@ type syncHandler struct { spaceId string treeCache cache.TreeCache syncClient SyncClient + factory RequestFactory } type SyncHandler interface { HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) } -func newSyncHandler(spaceId string, treeCache cache.TreeCache, syncClient SyncClient) *syncHandler { +func newSyncHandler(spaceId string, treeCache cache.TreeCache, syncClient SyncClient, factory RequestFactory) *syncHandler { return &syncHandler{ spaceId: spaceId, treeCache: treeCache, syncClient: syncClient, + factory: factory, } } @@ -47,10 +48,7 @@ func (s *syncHandler) handleHeadUpdate( update *spacesyncproto.ObjectHeadUpdate, msg *spacesyncproto.ObjectSyncMessage) (err error) { - var ( - fullRequest *spacesyncproto.ObjectFullSyncRequest - result tree.AddResult - ) + var fullRequest *spacesyncproto.ObjectSyncMessage res, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) if err != nil { return @@ -62,21 +60,20 @@ func (s *syncHandler) handleHeadUpdate( defer res.Release() defer objTree.Unlock() - if slice.UnsortedEquals(update.Heads, objTree.Heads()) { + if s.alreadyHaveHeads(objTree, update.Heads) { return nil } - result, err = objTree.AddRawChanges(ctx, update.Changes...) + _, err = objTree.AddRawChanges(ctx, update.Changes...) if err != nil { return err } - // if after the heads are equal, or we have them locally - if slice.UnsortedEquals(update.Heads, result.Heads) || objTree.HasChanges(update.Heads...) { + if s.alreadyHaveHeads(objTree, update.Heads) { return nil } - fullRequest, err = s.prepareFullSyncRequest(objTree, update) + fullRequest, err = s.factory.FullSyncRequest(objTree, update.Heads, update.SnapshotPath, msg.TrackingId) if err != nil { return err } @@ -84,8 +81,7 @@ func (s *syncHandler) handleHeadUpdate( }() if fullRequest != nil { - return s.syncClient.SendAsync(senderId, - spacesyncproto.WrapFullRequest(fullRequest, msg.RootChange, msg.TreeId, msg.TrackingId)) + return s.syncClient.SendAsync(senderId, fullRequest) } return } @@ -96,7 +92,7 @@ func (s *syncHandler) handleFullSyncRequest( request *spacesyncproto.ObjectFullSyncRequest, msg *spacesyncproto.ObjectSyncMessage) (err error) { var ( - fullResponse *spacesyncproto.ObjectFullSyncResponse + fullResponse *spacesyncproto.ObjectSyncMessage header = msg.RootChange ) defer func() { @@ -120,20 +116,21 @@ func (s *syncHandler) handleFullSyncRequest( header = objTree.Header() } - _, err = objTree.AddRawChanges(ctx, request.Changes...) - if err != nil { - return err + if !s.alreadyHaveHeads(objTree, request.Heads) { + _, err = objTree.AddRawChanges(ctx, request.Changes...) + if err != nil { + return err + } } - fullResponse, err = s.prepareFullSyncResponse(request.SnapshotPath, request.Heads, objTree) + fullResponse, err = s.factory.FullSyncResponse(objTree, request.Heads, request.SnapshotPath, msg.TrackingId) return err }() if err != nil { return } - return s.syncClient.SendAsync(senderId, - spacesyncproto.WrapFullResponse(fullResponse, header, msg.TreeId, msg.TrackingId)) + return s.syncClient.SendAsync(senderId, fullResponse) } func (s *syncHandler) handleFullSyncResponse( @@ -152,8 +149,7 @@ func (s *syncHandler) handleFullSyncResponse( defer res.Release() defer objTree.Unlock() - // if we already have the heads for whatever reason - if slice.UnsortedEquals(response.Heads, objTree.Heads()) { + if s.alreadyHaveHeads(objTree, response.Heads) { return nil } @@ -164,39 +160,6 @@ func (s *syncHandler) handleFullSyncResponse( return } -func (s *syncHandler) prepareFullSyncRequest( - t tree.ObjectTree, - update *spacesyncproto.ObjectHeadUpdate) (req *spacesyncproto.ObjectFullSyncRequest, err error) { - req = &spacesyncproto.ObjectFullSyncRequest{ - Heads: t.Heads(), - SnapshotPath: t.SnapshotPath(), - } - if len(update.Changes) != 0 { - var changesAfterSnapshot []*treechangeproto.RawTreeChangeWithId - changesAfterSnapshot, err = t.ChangesAfterCommonSnapshot(update.SnapshotPath, update.Heads) - if err != nil { - return - } - req.Changes = changesAfterSnapshot - } - return &spacesyncproto.ObjectFullSyncRequest{ - Heads: t.Heads(), - SnapshotPath: t.SnapshotPath(), - }, nil -} - -func (s *syncHandler) prepareFullSyncResponse( - theirPath, - theirHeads []string, - t tree.ObjectTree) (*spacesyncproto.ObjectFullSyncResponse, error) { - ourChanges, err := t.ChangesAfterCommonSnapshot(theirPath, theirHeads) - if err != nil { - return nil, err - } - - return &spacesyncproto.ObjectFullSyncResponse{ - Heads: t.Heads(), - Changes: ourChanges, - SnapshotPath: t.SnapshotPath(), - }, nil +func (s *syncHandler) alreadyHaveHeads(t tree.ObjectTree, heads []string) bool { + return slice.UnsortedEquals(t.Heads(), heads) || t.HasChanges(heads...) } diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 64ac67a6..c0a461e1 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -50,7 +50,7 @@ func NewSyncService(spaceId string, headNotifiable HeadNotifiable, cache cache.T streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { return syncHandler.HandleMessage(ctx, senderId, message) }) - syncHandler = newSyncHandler(spaceId, cache, streamPool) + syncHandler = newSyncHandler(spaceId, cache, streamPool, newRequestFactory()) return newSyncService( spaceId, headNotifiable, From 274573df284b8d52e74d8d6411e8f9a87092dda4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 2 Oct 2022 16:11:47 +0200 Subject: [PATCH 112/219] Further updates to sync logic --- common/commonspace/rpchandler.go | 2 +- common/commonspace/space.go | 11 +- .../mock_syncservice/mock_syncservice.go | 130 +++++++++++++++++- .../commonspace/syncservice/requestfactory.go | 26 +++- common/commonspace/syncservice/streampool.go | 37 +++-- common/commonspace/syncservice/syncclient.go | 49 +++++++ common/commonspace/syncservice/synchandler.go | 42 +++--- .../syncservice/synchandler_test.go | 9 +- common/commonspace/syncservice/syncservice.go | 54 +++----- common/commonspace/synctree/synctree.go | 66 ++++----- 10 files changed, 303 insertions(+), 123 deletions(-) create mode 100644 common/commonspace/syncservice/syncclient.go diff --git a/common/commonspace/rpchandler.go b/common/commonspace/rpchandler.go index dbc5b7aa..73698856 100644 --- a/common/commonspace/rpchandler.go +++ b/common/commonspace/rpchandler.go @@ -19,5 +19,5 @@ func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncR } func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) (err error) { - return r.s.SyncService().StreamPool().AddAndReadStreamSync(stream) + return r.s.SyncService().SyncClient().AddAndReadStreamSync(stream) } diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 46099da3..8111895a 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -90,11 +90,11 @@ func (s *space) DiffService() diffservice.DiffService { } func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) { - return synctree.DeriveSyncTree(ctx, payload, s.syncService, listener, s.aclList, s.storage.CreateTreeStorage) + return synctree.DeriveSyncTree(ctx, payload, s.syncService.SyncClient(), listener, s.aclList, s.storage.CreateTreeStorage) } func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) { - return synctree.CreateSyncTree(ctx, payload, s.syncService, listener, s.aclList, s.storage.CreateTreeStorage) + return synctree.CreateSyncTree(ctx, payload, s.syncService.SyncClient(), listener, s.aclList, s.storage.CreateTreeStorage) } func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t tree.ObjectTree, err error) { @@ -104,10 +104,9 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene if err != nil { return nil, err } - - return s.syncService.StreamPool().SendSync( + return s.syncService.SyncClient().SendSync( peerId, - spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{}, nil, id, ""), + s.syncService.SyncClient().CreateNewTreeRequest(id), ) } @@ -142,7 +141,7 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene return } } - return synctree.BuildSyncTree(ctx, s.syncService, store.(treestorage.TreeStorage), listener, s.aclList) + return synctree.BuildSyncTree(ctx, s.syncService.SyncClient(), store.(treestorage.TreeStorage), listener, s.aclList) } func (s *space) Close() error { diff --git a/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go b/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go index 8438ab64..6f1a272b 100644 --- a/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go +++ b/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go @@ -8,6 +8,8 @@ import ( reflect "reflect" spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + tree "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" gomock "github.com/golang/mock/gomock" ) @@ -34,6 +36,32 @@ func (m *MockSyncClient) EXPECT() *MockSyncClientMockRecorder { return m.recorder } +// AddAndReadStreamAsync mocks base method. +func (m *MockSyncClient) AddAndReadStreamAsync(arg0 spacesyncproto.DRPCSpace_StreamStream) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "AddAndReadStreamAsync", arg0) +} + +// AddAndReadStreamAsync indicates an expected call of AddAndReadStreamAsync. +func (mr *MockSyncClientMockRecorder) AddAndReadStreamAsync(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddAndReadStreamAsync", reflect.TypeOf((*MockSyncClient)(nil).AddAndReadStreamAsync), arg0) +} + +// AddAndReadStreamSync mocks base method. +func (m *MockSyncClient) AddAndReadStreamSync(arg0 spacesyncproto.DRPCSpace_StreamStream) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddAndReadStreamSync", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddAndReadStreamSync indicates an expected call of AddAndReadStreamSync. +func (mr *MockSyncClientMockRecorder) AddAndReadStreamSync(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddAndReadStreamSync", reflect.TypeOf((*MockSyncClient)(nil).AddAndReadStreamSync), arg0) +} + // BroadcastAsync mocks base method. func (m *MockSyncClient) BroadcastAsync(arg0 *spacesyncproto.ObjectSyncMessage) error { m.ctrl.T.Helper() @@ -48,8 +76,108 @@ func (mr *MockSyncClientMockRecorder) BroadcastAsync(arg0 interface{}) *gomock.C return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BroadcastAsync", reflect.TypeOf((*MockSyncClient)(nil).BroadcastAsync), arg0) } +// BroadcastAsyncOrSendResponsible mocks base method. +func (m *MockSyncClient) BroadcastAsyncOrSendResponsible(arg0 *spacesyncproto.ObjectSyncMessage) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BroadcastAsyncOrSendResponsible", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// BroadcastAsyncOrSendResponsible indicates an expected call of BroadcastAsyncOrSendResponsible. +func (mr *MockSyncClientMockRecorder) BroadcastAsyncOrSendResponsible(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BroadcastAsyncOrSendResponsible", reflect.TypeOf((*MockSyncClient)(nil).BroadcastAsyncOrSendResponsible), arg0) +} + +// Close mocks base method. +func (m *MockSyncClient) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close. +func (mr *MockSyncClientMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSyncClient)(nil).Close)) +} + +// CreateFullSyncRequest mocks base method. +func (m *MockSyncClient) CreateFullSyncRequest(arg0 tree.ObjectTree, arg1, arg2 []string, arg3 string) (*spacesyncproto.ObjectSyncMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateFullSyncRequest", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateFullSyncRequest indicates an expected call of CreateFullSyncRequest. +func (mr *MockSyncClientMockRecorder) CreateFullSyncRequest(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateFullSyncRequest", reflect.TypeOf((*MockSyncClient)(nil).CreateFullSyncRequest), arg0, arg1, arg2, arg3) +} + +// CreateFullSyncResponse mocks base method. +func (m *MockSyncClient) CreateFullSyncResponse(arg0 tree.ObjectTree, arg1, arg2 []string, arg3 string) (*spacesyncproto.ObjectSyncMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateFullSyncResponse", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateFullSyncResponse indicates an expected call of CreateFullSyncResponse. +func (mr *MockSyncClientMockRecorder) CreateFullSyncResponse(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateFullSyncResponse", reflect.TypeOf((*MockSyncClient)(nil).CreateFullSyncResponse), arg0, arg1, arg2, arg3) +} + +// CreateHeadUpdate mocks base method. +func (m *MockSyncClient) CreateHeadUpdate(arg0 tree.ObjectTree, arg1 []*treechangeproto.RawTreeChangeWithId) *spacesyncproto.ObjectSyncMessage { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateHeadUpdate", arg0, arg1) + ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage) + return ret0 +} + +// CreateHeadUpdate indicates an expected call of CreateHeadUpdate. +func (mr *MockSyncClientMockRecorder) CreateHeadUpdate(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateHeadUpdate", reflect.TypeOf((*MockSyncClient)(nil).CreateHeadUpdate), arg0, arg1) +} + +// CreateNewTreeRequest mocks base method. +func (m *MockSyncClient) CreateNewTreeRequest(arg0 string) *spacesyncproto.ObjectSyncMessage { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateNewTreeRequest", arg0) + ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage) + return ret0 +} + +// CreateNewTreeRequest indicates an expected call of CreateNewTreeRequest. +func (mr *MockSyncClientMockRecorder) CreateNewTreeRequest(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateNewTreeRequest", reflect.TypeOf((*MockSyncClient)(nil).CreateNewTreeRequest), arg0) +} + +// HasActiveStream mocks base method. +func (m *MockSyncClient) HasActiveStream(arg0 string) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HasActiveStream", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// HasActiveStream indicates an expected call of HasActiveStream. +func (mr *MockSyncClientMockRecorder) HasActiveStream(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasActiveStream", reflect.TypeOf((*MockSyncClient)(nil).HasActiveStream), arg0) +} + // SendAsync mocks base method. -func (m *MockSyncClient) SendAsync(arg0 string, arg1 *spacesyncproto.ObjectSyncMessage) error { +func (m *MockSyncClient) SendAsync(arg0 []string, arg1 *spacesyncproto.ObjectSyncMessage) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SendAsync", arg0, arg1) ret0, _ := ret[0].(error) diff --git a/common/commonspace/syncservice/requestfactory.go b/common/commonspace/syncservice/requestfactory.go index ab19bc6a..1237653b 100644 --- a/common/commonspace/syncservice/requestfactory.go +++ b/common/commonspace/syncservice/requestfactory.go @@ -1,6 +1,7 @@ package syncservice import ( + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" @@ -8,8 +9,10 @@ import ( ) type RequestFactory interface { - FullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (req *spacesyncproto.ObjectSyncMessage, err error) - FullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (*spacesyncproto.ObjectSyncMessage, error) + CreateHeadUpdate(t tree.ObjectTree, added []*treechangeproto.RawTreeChangeWithId) (msg *spacesyncproto.ObjectSyncMessage) + CreateNewTreeRequest(id string) (msg *spacesyncproto.ObjectSyncMessage) + CreateFullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (req *spacesyncproto.ObjectSyncMessage, err error) + CreateFullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (*spacesyncproto.ObjectSyncMessage, error) } func newRequestFactory() RequestFactory { @@ -18,11 +21,22 @@ func newRequestFactory() RequestFactory { type requestFactory struct{} -func (r *requestFactory) FullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (msg *spacesyncproto.ObjectSyncMessage, err error) { +func (r *requestFactory) CreateHeadUpdate(t tree.ObjectTree, added []*treechangeproto.RawTreeChangeWithId) (msg *spacesyncproto.ObjectSyncMessage) { + return spacesyncproto.WrapHeadUpdate(&spacesyncproto.ObjectHeadUpdate{ + Heads: t.Heads(), + Changes: added, + SnapshotPath: t.SnapshotPath(), + }, t.Header(), t.ID(), "") +} + +func (r *requestFactory) CreateNewTreeRequest(id string) (msg *spacesyncproto.ObjectSyncMessage) { + return spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{}, nil, id, "") +} + +func (r *requestFactory) CreateFullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (msg *spacesyncproto.ObjectSyncMessage, err error) { req := &spacesyncproto.ObjectFullSyncRequest{} if t == nil { - msg = spacesyncproto.WrapFullRequest(req, t.Header(), t.ID(), trackingId) - return + return nil, fmt.Errorf("tree should not be empty") } req.Heads = t.Heads() @@ -39,7 +53,7 @@ func (r *requestFactory) FullSyncRequest(t tree.ObjectTree, theirHeads, theirSna return } -func (r *requestFactory) FullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (msg *spacesyncproto.ObjectSyncMessage, err error) { +func (r *requestFactory) CreateFullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (msg *spacesyncproto.ObjectSyncMessage, err error) { resp := &spacesyncproto.ObjectFullSyncResponse{ Heads: t.Heads(), SnapshotPath: t.SnapshotPath(), diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 5eb97170..bf457374 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -18,16 +18,16 @@ const maxSimultaneousOperationsPerStream = 10 // StreamPool can be made generic to work with different streams type StreamPool interface { - SyncClient + Sender AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) HasActiveStream(peerId string) bool Close() (err error) } -type SyncClient interface { +type Sender interface { SendSync(peerId string, message *spacesyncproto.ObjectSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error) - SendAsync(peerId string, message *spacesyncproto.ObjectSyncMessage) (err error) + SendAsync(peers []string, message *spacesyncproto.ObjectSyncMessage) (err error) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) } @@ -56,6 +56,8 @@ func newStreamPool(messageHandler MessageHandler) StreamPool { } func (s *streamPool) HasActiveStream(peerId string) (res bool) { + s.Lock() + defer s.Unlock() _, err := s.getOrDeleteStream(peerId) return err == nil } @@ -73,7 +75,7 @@ func (s *streamPool) SendSync( s.waiters[msg.TrackingId] = waiter s.waitersMx.Unlock() - err = s.SendAsync(peerId, msg) + err = s.SendAsync([]string{peerId}, msg) if err != nil { return } @@ -82,18 +84,31 @@ func (s *streamPool) SendSync( return } -func (s *streamPool) SendAsync(peerId string, message *spacesyncproto.ObjectSyncMessage) (err error) { - stream, err := s.getOrDeleteStream(peerId) - if err != nil { - return +func (s *streamPool) SendAsync(peers []string, message *spacesyncproto.ObjectSyncMessage) (err error) { + getStreams := func() (streams []spacesyncproto.SpaceStream) { + for _, pId := range peers { + stream, err := s.getOrDeleteStream(pId) + if err != nil { + continue + } + streams = append(streams, stream) + } + return streams } - return stream.Send(message) + s.Lock() + streams := getStreams() + s.Unlock() + + for _, s := range streams { + if len(peers) == 1 { + err = s.Send(message) + } + } + return err } func (s *streamPool) getOrDeleteStream(id string) (stream spacesyncproto.SpaceStream, err error) { - s.Lock() - defer s.Unlock() stream, exists := s.peerStreams[id] if !exists { err = ErrEmptyPeer diff --git a/common/commonspace/syncservice/syncclient.go b/common/commonspace/syncservice/syncclient.go new file mode 100644 index 00000000..12c25164 --- /dev/null +++ b/common/commonspace/syncservice/syncclient.go @@ -0,0 +1,49 @@ +package syncservice + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" +) + +type SyncClient interface { + StreamPool + RequestFactory + BroadcastAsyncOrSendResponsible(message *spacesyncproto.ObjectSyncMessage) (err error) +} + +type syncClient struct { + StreamPool + RequestFactory + spaceId string + notifiable HeadNotifiable + configuration nodeconf.Configuration +} + +func newSyncClient(spaceId string, pool StreamPool, notifiable HeadNotifiable, factory RequestFactory, configuration nodeconf.Configuration) SyncClient { + return &syncClient{ + StreamPool: pool, + RequestFactory: factory, + notifiable: notifiable, + configuration: configuration, + spaceId: spaceId, + } +} + +func (s *syncClient) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) { + s.notifyIfNeeded(message) + return s.BroadcastAsync(message) +} + +func (s *syncClient) BroadcastAsyncOrSendResponsible(message *spacesyncproto.ObjectSyncMessage) (err error) { + if s.configuration.IsResponsible(s.spaceId) { + return s.SendAsync(s.configuration.NodeIds(s.spaceId), message) + } + return s.BroadcastAsync(message) +} + +func (s *syncClient) notifyIfNeeded(message *spacesyncproto.ObjectSyncMessage) { + if message.GetContent().GetHeadUpdate() != nil { + update := message.GetContent().GetHeadUpdate() + s.notifiable.UpdateHeads(message.TreeId, update.Heads) + } +} diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index 16ce2177..d0edf03c 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -1,4 +1,3 @@ -//go:generate mockgen -destination mock_syncservice/mock_syncservice.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice SyncClient package syncservice import ( @@ -13,19 +12,17 @@ type syncHandler struct { spaceId string treeCache cache.TreeCache syncClient SyncClient - factory RequestFactory } type SyncHandler interface { HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) } -func newSyncHandler(spaceId string, treeCache cache.TreeCache, syncClient SyncClient, factory RequestFactory) *syncHandler { +func newSyncHandler(spaceId string, treeCache cache.TreeCache, syncClient SyncClient) *syncHandler { return &syncHandler{ spaceId: spaceId, treeCache: treeCache, syncClient: syncClient, - factory: factory, } } @@ -48,7 +45,10 @@ func (s *syncHandler) handleHeadUpdate( update *spacesyncproto.ObjectHeadUpdate, msg *spacesyncproto.ObjectSyncMessage) (err error) { - var fullRequest *spacesyncproto.ObjectSyncMessage + var ( + fullRequest *spacesyncproto.ObjectSyncMessage + isEmptyUpdate = len(update.Changes) == 0 + ) res, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) if err != nil { return @@ -60,7 +60,14 @@ func (s *syncHandler) handleHeadUpdate( defer res.Release() defer objTree.Unlock() - if s.alreadyHaveHeads(objTree, update.Heads) { + // isEmptyUpdate is sent when the tree is brought up from cache + if isEmptyUpdate { + // we need to sync in any case + fullRequest, err = s.syncClient.CreateFullSyncRequest(objTree, update.Heads, update.SnapshotPath, msg.TrackingId) + return err + } + + if s.alreadyHasHeads(objTree, update.Heads) { return nil } @@ -69,19 +76,16 @@ func (s *syncHandler) handleHeadUpdate( return err } - if s.alreadyHaveHeads(objTree, update.Heads) { + if s.alreadyHasHeads(objTree, update.Heads) { return nil } - fullRequest, err = s.factory.FullSyncRequest(objTree, update.Heads, update.SnapshotPath, msg.TrackingId) - if err != nil { - return err - } - return nil + fullRequest, err = s.syncClient.CreateFullSyncRequest(objTree, update.Heads, update.SnapshotPath, msg.TrackingId) + return err }() if fullRequest != nil { - return s.syncClient.SendAsync(senderId, fullRequest) + return s.syncClient.SendAsync([]string{senderId}, fullRequest) } return } @@ -97,7 +101,7 @@ func (s *syncHandler) handleFullSyncRequest( ) defer func() { if err != nil { - s.syncClient.SendAsync(senderId, spacesyncproto.WrapError(err, header, msg.TreeId, msg.TrackingId)) + s.syncClient.SendAsync([]string{senderId}, spacesyncproto.WrapError(err, header, msg.TreeId, msg.TrackingId)) } }() @@ -116,21 +120,21 @@ func (s *syncHandler) handleFullSyncRequest( header = objTree.Header() } - if !s.alreadyHaveHeads(objTree, request.Heads) { + if !s.alreadyHasHeads(objTree, request.Heads) { _, err = objTree.AddRawChanges(ctx, request.Changes...) if err != nil { return err } } - fullResponse, err = s.factory.FullSyncResponse(objTree, request.Heads, request.SnapshotPath, msg.TrackingId) + fullResponse, err = s.syncClient.CreateFullSyncResponse(objTree, request.Heads, request.SnapshotPath, msg.TrackingId) return err }() if err != nil { return } - return s.syncClient.SendAsync(senderId, fullResponse) + return s.syncClient.SendAsync([]string{senderId}, fullResponse) } func (s *syncHandler) handleFullSyncResponse( @@ -149,7 +153,7 @@ func (s *syncHandler) handleFullSyncResponse( defer res.Release() defer objTree.Unlock() - if s.alreadyHaveHeads(objTree, response.Heads) { + if s.alreadyHasHeads(objTree, response.Heads) { return nil } @@ -160,6 +164,6 @@ func (s *syncHandler) handleFullSyncResponse( return } -func (s *syncHandler) alreadyHaveHeads(t tree.ObjectTree, heads []string) bool { +func (s *syncHandler) alreadyHasHeads(t tree.ObjectTree, heads []string) bool { return slice.UnsortedEquals(t.Heads(), heads) || t.HasChanges(heads...) } diff --git a/common/commonspace/syncservice/synchandler_test.go b/common/commonspace/syncservice/synchandler_test.go index dc145017..e8fa2b63 100644 --- a/common/commonspace/syncservice/synchandler_test.go +++ b/common/commonspace/syncservice/synchandler_test.go @@ -48,9 +48,12 @@ func TestSyncHandler_HandleMessage(t *testing.T) { Release: func() {}, TreeContainer: treeContainer{objectTreeMock}, }, nil) - objectTreeMock.EXPECT().Lock() - objectTreeMock.EXPECT().Heads().Return([]string{"h2"}) - objectTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). + objectTreeMock.EXPECT(). + Lock() + objectTreeMock.EXPECT(). + Heads().Return([]string{"h2"}) + objectTreeMock.EXPECT(). + AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). Return(tree.AddResult{}, nil) objectTreeMock.EXPECT().Unlock() err := syncHandler.HandleMessage(ctx, senderId, msg) diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index c0a461e1..d065832a 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 SyncClient package syncservice import ( @@ -7,19 +8,13 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "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/pkg/acl/treechangeproto" "time" ) var log = logger.NewNamed("syncservice").Sugar() type SyncService interface { - NotifyHeadUpdate( - ctx context.Context, - treeId string, - root *treechangeproto.RawTreeChangeWithId, - update *spacesyncproto.ObjectHeadUpdate) (err error) - StreamPool() StreamPool + SyncClient() SyncClient Init() Close() (err error) @@ -34,11 +29,9 @@ const respPeersStreamCheckInterval = time.Second * 10 type syncService struct { spaceId string - syncHandler SyncHandler - streamPool StreamPool - headNotifiable HeadNotifiable - configuration nodeconf.Configuration - clientFactory spacesyncproto.ClientFactory + syncClient SyncClient + configuration nodeconf.Configuration + clientFactory spacesyncproto.ClientFactory streamLoopCtx context.Context stopStreamLoop context.CancelFunc @@ -47,30 +40,26 @@ type syncService struct { func NewSyncService(spaceId string, headNotifiable HeadNotifiable, cache cache.TreeCache, configuration nodeconf.Configuration) SyncService { var syncHandler SyncHandler - streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { + pool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { return syncHandler.HandleMessage(ctx, senderId, message) }) - syncHandler = newSyncHandler(spaceId, cache, streamPool, newRequestFactory()) + factory := newRequestFactory() + syncClient := newSyncClient(spaceId, pool, headNotifiable, factory, configuration) + syncHandler = newSyncHandler(spaceId, cache, syncClient) return newSyncService( spaceId, - headNotifiable, - syncHandler, - streamPool, + syncClient, spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient), configuration) } func newSyncService( spaceId string, - headNotifiable HeadNotifiable, - syncHandler SyncHandler, - streamPool StreamPool, + syncClient SyncClient, clientFactory spacesyncproto.ClientFactory, configuration nodeconf.Configuration) *syncService { return &syncService{ - syncHandler: syncHandler, - streamPool: streamPool, - headNotifiable: headNotifiable, + syncClient: syncClient, configuration: configuration, clientFactory: clientFactory, spaceId: spaceId, @@ -86,16 +75,7 @@ func (s *syncService) Init() { func (s *syncService) Close() (err error) { s.stopStreamLoop() <-s.streamLoopDone - return s.streamPool.Close() -} - -func (s *syncService) NotifyHeadUpdate( - ctx context.Context, - treeId string, - header *treechangeproto.RawTreeChangeWithId, - update *spacesyncproto.ObjectHeadUpdate) (err error) { - s.headNotifiable.UpdateHeads(treeId, update.Heads) - return s.streamPool.BroadcastAsync(spacesyncproto.WrapHeadUpdate(update, header, treeId, "")) + return s.syncClient.Close() } func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { @@ -106,7 +86,7 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { return } for _, peer := range respPeers { - if s.streamPool.HasActiveStream(peer.Id()) { + if s.syncClient.HasActiveStream(peer.Id()) { continue } stream, err := s.clientFactory.Client(peer).Stream(ctx) @@ -124,7 +104,7 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { log.With("spaceId", s.spaceId).Errorf("failed to send first message to stream: %v", err) continue } - s.streamPool.AddAndReadStreamAsync(stream) + s.syncClient.AddAndReadStreamAsync(stream) } } @@ -141,6 +121,6 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { } } -func (s *syncService) StreamPool() StreamPool { - return s.streamPool +func (s *syncService) SyncClient() SyncClient { + return s.syncClient } diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index f3075825..99c6014d 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -2,7 +2,6 @@ package synctree import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" @@ -14,14 +13,14 @@ import ( // SyncTree sends head updates to sync service and also sends new changes to update listener type SyncTree struct { tree.ObjectTree - syncService syncservice.SyncService - listener updatelistener.UpdateListener + syncClient syncservice.SyncClient + listener updatelistener.UpdateListener } func DeriveSyncTree( ctx context.Context, payload tree.ObjectTreeCreatePayload, - syncService syncservice.SyncService, + syncClient syncservice.SyncClient, listener updatelistener.UpdateListener, aclList list.ACLList, createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { @@ -30,22 +29,20 @@ func DeriveSyncTree( return } t = &SyncTree{ - ObjectTree: t, - syncService: syncService, - listener: listener, + ObjectTree: t, + syncClient: syncClient, + listener: listener, } - err = syncService.NotifyHeadUpdate(ctx, t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{ - Heads: t.Heads(), - SnapshotPath: t.SnapshotPath(), - }) + headUpdate := syncClient.CreateHeadUpdate(t, nil) + err = syncClient.BroadcastAsync(headUpdate) return } func CreateSyncTree( ctx context.Context, payload tree.ObjectTreeCreatePayload, - syncService syncservice.SyncService, + syncClient syncservice.SyncClient, listener updatelistener.UpdateListener, aclList list.ACLList, createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { @@ -54,30 +51,28 @@ func CreateSyncTree( return } t = &SyncTree{ - ObjectTree: t, - syncService: syncService, - listener: listener, + ObjectTree: t, + syncClient: syncClient, + listener: listener, } - err = syncService.NotifyHeadUpdate(ctx, t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{ - Heads: t.Heads(), - SnapshotPath: t.SnapshotPath(), - }) + headUpdate := syncClient.CreateHeadUpdate(t, nil) + err = syncClient.BroadcastAsync(headUpdate) return } func BuildSyncTree( ctx context.Context, - syncService syncservice.SyncService, + syncClient syncservice.SyncClient, treeStorage storage.TreeStorage, listener updatelistener.UpdateListener, aclList list.ACLList) (t tree.ObjectTree, err error) { - return buildSyncTree(ctx, syncService, treeStorage, listener, aclList) + return buildSyncTree(ctx, syncClient, treeStorage, listener, aclList) } func buildSyncTree( ctx context.Context, - syncService syncservice.SyncService, + syncClient syncservice.SyncClient, treeStorage storage.TreeStorage, listener updatelistener.UpdateListener, aclList list.ACLList) (t tree.ObjectTree, err error) { @@ -86,15 +81,14 @@ func buildSyncTree( return } t = &SyncTree{ - ObjectTree: t, - syncService: syncService, - listener: listener, + ObjectTree: t, + syncClient: syncClient, + listener: listener, } - err = syncService.NotifyHeadUpdate(ctx, t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{ - Heads: t.Heads(), - SnapshotPath: t.SnapshotPath(), - }) + headUpdate := syncClient.CreateHeadUpdate(t, nil) + // here we will have different behaviour based on who is sending this update + err = syncClient.BroadcastAsyncOrSendResponsible(headUpdate) return } @@ -103,11 +97,8 @@ func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeCo if err != nil { return } - err = s.syncService.NotifyHeadUpdate(ctx, s.ID(), s.Header(), &spacesyncproto.ObjectHeadUpdate{ - Heads: res.Heads, - Changes: res.Added, - SnapshotPath: s.SnapshotPath(), - }) + headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added) + err = s.syncClient.BroadcastAsync(headUpdate) return } @@ -125,11 +116,8 @@ func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeprot s.listener.Rebuild(s) } - err = s.syncService.NotifyHeadUpdate(ctx, s.ID(), s.Header(), &spacesyncproto.ObjectHeadUpdate{ - Heads: res.Heads, - Changes: res.Added, - SnapshotPath: s.SnapshotPath(), - }) + headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added) + err = s.syncClient.BroadcastAsync(headUpdate) return } From d7a2a1212964acc2e4799c86adc5297687706aff Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 2 Oct 2022 22:40:13 +0200 Subject: [PATCH 113/219] Add head update tests --- common/commonspace/syncservice/synchandler.go | 3 + .../syncservice/synchandler_test.go | 200 +++++++++++++++--- 2 files changed, 177 insertions(+), 26 deletions(-) diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index d0edf03c..500e6e7b 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -62,6 +62,9 @@ func (s *syncHandler) handleHeadUpdate( // isEmptyUpdate is sent when the tree is brought up from cache if isEmptyUpdate { + 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, msg.TrackingId) return err diff --git a/common/commonspace/syncservice/synchandler_test.go b/common/commonspace/syncservice/synchandler_test.go index e8fa2b63..611dfeff 100644 --- a/common/commonspace/syncservice/synchandler_test.go +++ b/common/commonspace/syncservice/synchandler_test.go @@ -22,7 +22,7 @@ func (t treeContainer) Tree() tree.ObjectTree { return t.objTree } -func TestSyncHandler_HandleMessage(t *testing.T) { +func TestSyncHandler_HandleHeadUpdate(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() @@ -33,29 +33,177 @@ func TestSyncHandler_HandleMessage(t *testing.T) { objectTreeMock := mock_tree.NewMockObjectTree(ctrl) syncHandler := newSyncHandler(spaceId, cacheMock, syncClientMock) - treeId := "treeId" - senderId := "senderId" - chWithId := &treechangeproto.RawTreeChangeWithId{} - headUpdate := &spacesyncproto.ObjectHeadUpdate{ - Heads: []string{"h1"}, - Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, - SnapshotPath: []string{"h1"}, - } - msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{ - Release: func() {}, - TreeContainer: treeContainer{objectTreeMock}, - }, nil) - objectTreeMock.EXPECT(). - Lock() - objectTreeMock.EXPECT(). - Heads().Return([]string{"h2"}) - objectTreeMock.EXPECT(). - AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). - Return(tree.AddResult{}, nil) - objectTreeMock.EXPECT().Unlock() - err := syncHandler.HandleMessage(ctx, senderId, msg) - require.NoError(t, err) + t.Run("head update non empty all heads added", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + headUpdate := &spacesyncproto.ObjectHeadUpdate{ + Heads: []string{"h1"}, + Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, + SnapshotPath: []string{"h1"}, + } + msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{ + Release: func() {}, + TreeContainer: treeContainer{objectTreeMock}, + }, nil) + objectTreeMock.EXPECT(). + Lock() + 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) + objectTreeMock.EXPECT(). + Unlock() + + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.NoError(t, err) + }) + + t.Run("head update non empty heads not added", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + headUpdate := &spacesyncproto.ObjectHeadUpdate{ + Heads: []string{"h1"}, + Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, + SnapshotPath: []string{"h1"}, + } + fullRequest := &spacesyncproto.ObjectSyncMessage{} + msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{ + Release: func() {}, + TreeContainer: treeContainer{objectTreeMock}, + }, nil) + objectTreeMock.EXPECT(). + Lock() + 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"}) + objectTreeMock.EXPECT(). + HasChanges(gomock.Eq([]string{"h1"})). + Return(false) + syncClientMock.EXPECT(). + CreateFullSyncRequest(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"}), gomock.Eq("")). + Return(fullRequest, nil) + objectTreeMock.EXPECT(). + Unlock() + + syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.NoError(t, err) + }) + + t.Run("head update non empty equal heads", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + headUpdate := &spacesyncproto.ObjectHeadUpdate{ + Heads: []string{"h1"}, + Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, + SnapshotPath: []string{"h1"}, + } + msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{ + Release: func() {}, + TreeContainer: treeContainer{objectTreeMock}, + }, nil) + objectTreeMock.EXPECT(). + Lock() + objectTreeMock.EXPECT(). + Heads(). + Return([]string{"h1"}) + objectTreeMock.EXPECT(). + Unlock() + + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.NoError(t, err) + }) + + t.Run("head update empty", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + headUpdate := &spacesyncproto.ObjectHeadUpdate{ + Heads: []string{"h1"}, + Changes: nil, + SnapshotPath: []string{"h1"}, + } + fullRequest := &spacesyncproto.ObjectSyncMessage{} + msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{ + Release: func() {}, + TreeContainer: treeContainer{objectTreeMock}, + }, nil) + objectTreeMock.EXPECT(). + Lock() + objectTreeMock.EXPECT(). + Heads(). + Return([]string{"h2"}) + syncClientMock.EXPECT(). + CreateFullSyncRequest(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"}), gomock.Eq("")). + Return(fullRequest, nil) + objectTreeMock.EXPECT(). + Unlock() + + syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.NoError(t, err) + }) + + t.Run("head update empty equal heads", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + headUpdate := &spacesyncproto.ObjectHeadUpdate{ + Heads: []string{"h1"}, + Changes: nil, + SnapshotPath: []string{"h1"}, + } + msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{ + Release: func() {}, + TreeContainer: treeContainer{objectTreeMock}, + }, nil) + objectTreeMock.EXPECT(). + Lock() + objectTreeMock.EXPECT(). + Heads(). + Return([]string{"h1"}) + objectTreeMock.EXPECT(). + Unlock() + + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.NoError(t, err) + }) } From 86616b6936e666500e8c8aef3c4223cbaa71a6c8 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 3 Oct 2022 23:35:25 +0200 Subject: [PATCH 114/219] Add sync handler tests --- common/commonspace/syncservice/synchandler.go | 2 +- .../syncservice/synchandler_test.go | 230 ++++++++++++++++-- 2 files changed, 210 insertions(+), 22 deletions(-) diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index 500e6e7b..d74645c4 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -123,7 +123,7 @@ func (s *syncHandler) handleFullSyncRequest( header = objTree.Header() } - if !s.alreadyHasHeads(objTree, request.Heads) { + if len(request.Changes) != 0 && !s.alreadyHasHeads(objTree, request.Heads) { _, err = objTree.AddRawChanges(ctx, request.Changes...) if err != nil { return err diff --git a/common/commonspace/syncservice/synchandler_test.go b/common/commonspace/syncservice/synchandler_test.go index 611dfeff..3b16725e 100644 --- a/common/commonspace/syncservice/synchandler_test.go +++ b/common/commonspace/syncservice/synchandler_test.go @@ -2,6 +2,7 @@ package syncservice import ( "context" + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache/mock_cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" @@ -11,6 +12,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" + "sync" "testing" ) @@ -22,6 +24,25 @@ func (t treeContainer) Tree() tree.ObjectTree { return t.objTree } +type testObjTreeMock struct { + *mock_tree.MockObjectTree + m sync.Mutex +} + +func newTestObjMock(mockTree *mock_tree.MockObjectTree) *testObjTreeMock { + return &testObjTreeMock{ + MockObjectTree: mockTree, + } +} + +func (t *testObjTreeMock) Lock() { + t.m.Lock() +} + +func (t *testObjTreeMock) Unlock() { + t.m.Unlock() +} + func TestSyncHandler_HandleHeadUpdate(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() @@ -30,7 +51,7 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { spaceId := "spaceId" cacheMock := mock_cache.NewMockTreeCache(ctrl) syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) - objectTreeMock := mock_tree.NewMockObjectTree(ctrl) + objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) syncHandler := newSyncHandler(spaceId, cacheMock, syncClientMock) t.Run("head update non empty all heads added", func(t *testing.T) { @@ -49,8 +70,6 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { Release: func() {}, TreeContainer: treeContainer{objectTreeMock}, }, nil) - objectTreeMock.EXPECT(). - Lock() objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) @@ -66,8 +85,6 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { objectTreeMock.EXPECT(). HasChanges(gomock.Eq([]string{"h1"})). Return(true) - objectTreeMock.EXPECT(). - Unlock() err := syncHandler.HandleMessage(ctx, senderId, msg) require.NoError(t, err) @@ -90,8 +107,6 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { Release: func() {}, TreeContainer: treeContainer{objectTreeMock}, }, nil) - objectTreeMock.EXPECT(). - Lock() objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) @@ -110,8 +125,6 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { syncClientMock.EXPECT(). CreateFullSyncRequest(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"}), gomock.Eq("")). Return(fullRequest, nil) - objectTreeMock.EXPECT(). - Unlock() syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) err := syncHandler.HandleMessage(ctx, senderId, msg) @@ -134,13 +147,9 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { Release: func() {}, TreeContainer: treeContainer{objectTreeMock}, }, nil) - objectTreeMock.EXPECT(). - Lock() objectTreeMock.EXPECT(). Heads(). Return([]string{"h1"}) - objectTreeMock.EXPECT(). - Unlock() err := syncHandler.HandleMessage(ctx, senderId, msg) require.NoError(t, err) @@ -163,16 +172,12 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { Release: func() {}, TreeContainer: treeContainer{objectTreeMock}, }, nil) - objectTreeMock.EXPECT(). - Lock() objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) syncClientMock.EXPECT(). CreateFullSyncRequest(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"}), gomock.Eq("")). Return(fullRequest, nil) - objectTreeMock.EXPECT(). - Unlock() syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) err := syncHandler.HandleMessage(ctx, senderId, msg) @@ -195,13 +200,196 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { Release: func() {}, TreeContainer: treeContainer{objectTreeMock}, }, nil) - objectTreeMock.EXPECT(). - Lock() + + objectTreeMock.EXPECT(). + Heads(). + Return([]string{"h1"}) + + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.NoError(t, err) + }) +} + +func TestSyncHandler_HandleFullSyncRequest(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + ctx := context.Background() + spaceId := "spaceId" + cacheMock := mock_cache.NewMockTreeCache(ctrl) + syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) + objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) + + syncHandler := newSyncHandler(spaceId, cacheMock, syncClientMock) + t.Run("full sync request with change", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + msg := spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{ + Heads: []string{"h1"}, + Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, + SnapshotPath: []string{"h1"}, + }, chWithId, treeId, "") + fullRequest := &spacesyncproto.ObjectSyncMessage{} + + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{ + Release: func() {}, + TreeContainer: treeContainer{objectTreeMock}, + }, nil) + objectTreeMock.EXPECT(). + Heads(). + Return([]string{"h2"}) + objectTreeMock.EXPECT(). + HasChanges(gomock.Eq([]string{"h1"})). + Return(false) + objectTreeMock.EXPECT(). + AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). + Return(tree.AddResult{}, nil) + syncClientMock.EXPECT(). + CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"}), gomock.Eq("")). + Return(fullRequest, nil) + + syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.NoError(t, err) + }) + + t.Run("full sync request with change same heads", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + msg := spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{ + Heads: []string{"h2"}, + Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, + SnapshotPath: []string{"h2"}, + }, chWithId, treeId, "") + fullRequest := &spacesyncproto.ObjectSyncMessage{} + + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{ + Release: func() {}, + TreeContainer: treeContainer{objectTreeMock}, + }, nil) + objectTreeMock.EXPECT(). + Heads(). + Return([]string{"h2"}) + syncClientMock.EXPECT(). + CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h2"}), gomock.Eq([]string{"h2"}), gomock.Eq("")). + Return(fullRequest, nil) + + syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.NoError(t, err) + }) + + t.Run("full sync request without change", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + msg := spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{ + Heads: []string{"h1"}, + SnapshotPath: []string{"h1"}, + }, chWithId, treeId, "") + fullRequest := &spacesyncproto.ObjectSyncMessage{} + + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{ + Release: func() {}, + TreeContainer: treeContainer{objectTreeMock}, + }, nil) + syncClientMock.EXPECT(). + CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"}), gomock.Eq("")). + Return(fullRequest, nil) + + syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.NoError(t, err) + }) + + t.Run("full sync request with get tree error", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + msg := spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{ + Heads: []string{"h1"}, + SnapshotPath: []string{"h1"}, + }, chWithId, treeId, "") + + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{}, fmt.Errorf("some")) + + syncClientMock.EXPECT(). + SendAsync(gomock.Eq([]string{senderId}), gomock.Any()) + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.Error(t, err) + }) +} + +func TestSyncHandler_HandleFullSyncResponse(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + ctx := context.Background() + spaceId := "spaceId" + cacheMock := mock_cache.NewMockTreeCache(ctrl) + syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) + objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) + + syncHandler := newSyncHandler(spaceId, cacheMock, syncClientMock) + t.Run("full sync response with change", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + msg := spacesyncproto.WrapFullResponse(&spacesyncproto.ObjectFullSyncResponse{ + Heads: []string{"h1"}, + Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, + SnapshotPath: []string{"h1"}, + }, chWithId, treeId, "") + + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{ + Release: func() {}, + TreeContainer: treeContainer{objectTreeMock}, + }, nil) + objectTreeMock.EXPECT(). + Heads(). + Return([]string{"h2"}) + objectTreeMock.EXPECT(). + HasChanges(gomock.Eq([]string{"h1"})). + Return(false) + objectTreeMock.EXPECT(). + AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). + Return(tree.AddResult{}, nil) + + err := syncHandler.HandleMessage(ctx, senderId, msg) + require.NoError(t, err) + }) + + t.Run("full sync response same heads", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + msg := spacesyncproto.WrapFullResponse(&spacesyncproto.ObjectFullSyncResponse{ + Heads: []string{"h1"}, + Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, + SnapshotPath: []string{"h1"}, + }, chWithId, treeId, "") + + cacheMock.EXPECT(). + GetTree(gomock.Any(), spaceId, treeId). + Return(cache.TreeResult{ + Release: func() {}, + TreeContainer: treeContainer{objectTreeMock}, + }, nil) objectTreeMock.EXPECT(). Heads(). Return([]string{"h1"}) - objectTreeMock.EXPECT(). - Unlock() err := syncHandler.HandleMessage(ctx, senderId, msg) require.NoError(t, err) From 5729a329597b86febf8356d3495913b64fac51a1 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Tue, 4 Oct 2022 15:39:29 +0300 Subject: [PATCH 115/219] consensus node --- Makefile | 6 +- cmd/consensusnode/consensusnode.go | 94 +++++++++++++++ cmd/nodesgen/nodemap.yml | 3 + common/account/service.go | 5 + common/net/rpc/server/drpcserver.go | 9 +- common/net/secure/service.go | 3 +- config/config.go | 12 ++ consensus/config/account.go | 7 -- consensus/config/config.go | 19 ++- consensus/config/grpc.go | 6 - consensus/consensusrpc/consensrpc.go | 114 ++++++++++++++++++ consensus/db/db.go | 2 +- consensus/stream/object.go | 68 +++++++++++ consensus/stream/service.go | 127 ++++++++++++++++++++ consensus/stream/service_test.go | 169 +++++++++++++++++++++++++++ consensus/stream/stream.go | 34 ++++++ etc/configs/config1.yml | 22 ++-- etc/configs/config2.yml | 22 ++-- etc/configs/config3.yml | 28 +++++ etc/configs/cons/config1.yml | 32 +++++ etc/configs/cons/config2.yml | 32 +++++ etc/configs/cons/config3.yml | 32 +++++ etc/consensus-node.yml | 11 ++ go.mod | 1 + go.sum | 4 + node/account/service.go | 3 +- 26 files changed, 822 insertions(+), 43 deletions(-) create mode 100644 cmd/consensusnode/consensusnode.go delete mode 100644 consensus/config/account.go delete mode 100644 consensus/config/grpc.go create mode 100644 consensus/consensusrpc/consensrpc.go create mode 100644 consensus/stream/object.go create mode 100644 consensus/stream/service.go create mode 100644 consensus/stream/service_test.go create mode 100644 consensus/stream/stream.go create mode 100755 etc/configs/config3.yml create mode 100755 etc/configs/cons/config1.yml create mode 100755 etc/configs/cons/config2.yml create mode 100755 etc/configs/cons/config3.yml create mode 100644 etc/consensus-node.yml diff --git a/Makefile b/Makefile index 7817be8c..ad53dc00 100644 --- a/Makefile +++ b/Makefile @@ -35,4 +35,8 @@ proto: build: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) - go build -v -o bin/anytype-node -ldflags "$(FLAGS)" cmd/node/node.go \ No newline at end of file + go build -v -o bin/anytype-node -ldflags "$(FLAGS)" cmd/node/node.go + +build-consensus: + @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) + go build -v -o bin/consensus-node -ldflags "$(FLAGS)" cmd/consensusnode/consensusnode.go \ No newline at end of file diff --git a/cmd/consensusnode/consensusnode.go b/cmd/consensusnode/consensusnode.go new file mode 100644 index 00000000..0a563755 --- /dev/null +++ b/cmd/consensusnode/consensusnode.go @@ -0,0 +1,94 @@ +package main + +import ( + "context" + "flag" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusrpc" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/stream" + "github.com/anytypeio/go-anytype-infrastructure-experiments/node/account" + "go.uber.org/zap" + "net/http" + "os" + "os/signal" + "syscall" + "time" +) + +var log = logger.NewNamed("main") + +var ( + flagConfigFile = flag.String("c", "etc/consensus-config.yml", "path to config file") + flagVersion = flag.Bool("v", false, "show version and exit") + flagHelp = flag.Bool("h", false, "show help and exit") +) + +func main() { + flag.Parse() + + if *flagVersion { + fmt.Println(app.VersionDescription()) + return + } + if *flagHelp { + flag.PrintDefaults() + return + } + + if debug, ok := os.LookupEnv("ANYPROF"); ok && debug != "" { + go func() { + http.ListenAndServe(debug, nil) + }() + } + + // create app + ctx := context.Background() + a := new(app.App) + + // open config file + conf, err := config.NewFromFile(*flagConfigFile) + if err != nil { + log.Fatal("can't open config file", zap.Error(err)) + } + + // bootstrap components + a.Register(conf) + Bootstrap(a) + + // start app + if err := a.Start(ctx); err != nil { + log.Fatal("can't start app", zap.Error(err)) + } + log.Info("app started", zap.String("version", a.Version())) + + // wait exit signal + exit := make(chan os.Signal, 1) + signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT) + sig := <-exit + log.Info("received exit signal, stop app...", zap.String("signal", fmt.Sprint(sig))) + + // close app + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + if err := a.Close(ctx); err != nil { + log.Fatal("close error", zap.Error(err)) + } else { + log.Info("goodbye!") + } + time.Sleep(time.Second / 3) +} + +func Bootstrap(a *app.App) { + a.Register(account.New()). + Register(secure.New()). + Register(server.New()). + Register(db.New()). + Register(stream.New()). + Register(consensusrpc.New()) +} diff --git a/cmd/nodesgen/nodemap.yml b/cmd/nodesgen/nodemap.yml index 27a0cb15..137e585f 100644 --- a/cmd/nodesgen/nodemap.yml +++ b/cmd/nodesgen/nodemap.yml @@ -5,3 +5,6 @@ nodes: - grpcAddresses: - "127.0.0.1:4431" apiPort: "8081" + - grpcAddresses: + - "127.0.0.1:4432" + apiPort: "8082" diff --git a/common/account/service.go b/common/account/service.go index bdf6984d..16c62bff 100644 --- a/common/account/service.go +++ b/common/account/service.go @@ -2,6 +2,7 @@ package account import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" ) @@ -11,3 +12,7 @@ type Service interface { app.Component Account() *account.AccountData } + +type ConfigGetter interface { + GetAccount() config.Account +} diff --git a/common/net/rpc/server/drpcserver.go b/common/net/rpc/server/drpcserver.go index 5e6078ff..5ad27a3c 100644 --- a/common/net/rpc/server/drpcserver.go +++ b/common/net/rpc/server/drpcserver.go @@ -4,7 +4,6 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" secure2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/zeebo/errs" @@ -30,20 +29,22 @@ type DRPCServer interface { drpc.Mux } +type configGetter interface { + GetGRPCServer() config.GrpcServer +} + type drpcServer struct { config config.GrpcServer drpcServer *drpcserver.Server transport secure2.Service listeners []secure2.ContextListener - pool pool.Pool cancel func() *drpcmux.Mux } func (s *drpcServer) Init(a *app.App) (err error) { - s.config = a.MustComponent(config.CName).(*config.Config).GrpcServer + s.config = a.MustComponent(config.CName).(configGetter).GetGRPCServer() s.transport = a.MustComponent(secure2.CName).(secure2.Service) - s.pool = a.MustComponent(pool.CName).(pool.Pool) return nil } diff --git a/common/net/secure/service.go b/common/net/secure/service.go index a93c3242..d8ade632 100644 --- a/common/net/secure/service.go +++ b/common/net/secure/service.go @@ -4,6 +4,7 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/libp2p/go-libp2p-core/crypto" @@ -34,7 +35,7 @@ type service struct { } func (s *service) Init(a *app.App) (err error) { - account := a.MustComponent(config.CName).(*config.Config).Account + account := a.MustComponent(config.CName).(commonaccount.ConfigGetter).GetAccount() pkb, err := keys.DecodeBytesFromString(account.SigningKey) if err != nil { return diff --git a/config/config.go b/config/config.go index b8a84e34..012a7da5 100644 --- a/config/config.go +++ b/config/config.go @@ -39,3 +39,15 @@ func (c *Config) Init(a *app.App) (err error) { func (c Config) Name() (name string) { return CName } + +func (c Config) GetAnytype() Anytype { + return c.Anytype +} + +func (c Config) GetGRPCServer() GrpcServer { + return c.GrpcServer +} + +func (c Config) GetAccount() Account { + return c.Account +} diff --git a/consensus/config/account.go b/consensus/config/account.go deleted file mode 100644 index 4525b26f..00000000 --- a/consensus/config/account.go +++ /dev/null @@ -1,7 +0,0 @@ -package config - -type Account struct { - PeerId string `yaml:"peerId"` - SigningKey string `yaml:"signingKey"` - EncryptionKey string `yaml:"encryptionKey"` -} diff --git a/consensus/config/config.go b/consensus/config/config.go index 87a7ea79..45a83a08 100644 --- a/consensus/config/config.go +++ b/consensus/config/config.go @@ -2,6 +2,7 @@ package config import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "gopkg.in/yaml.v3" "io/ioutil" ) @@ -21,9 +22,9 @@ func NewFromFile(path string) (c *Config, err error) { } type Config struct { - GrpcServer GrpcServer `yaml:"grpcServer"` - Account Account `yaml:"account"` - Mongo Mongo `yaml:"mongo"` + GrpcServer config.GrpcServer `yaml:"grpcServer"` + Account config.Account `yaml:"account"` + Mongo Mongo `yaml:"mongo"` } func (c *Config) Init(a *app.App) (err error) { @@ -33,3 +34,15 @@ func (c *Config) Init(a *app.App) (err error) { func (c Config) Name() (name string) { return CName } + +func (c Config) GetMongo() Mongo { + return c.Mongo +} + +func (c Config) GetGRPCServer() config.GrpcServer { + return c.GrpcServer +} + +func (c Config) GetAccount() config.Account { + return c.Account +} diff --git a/consensus/config/grpc.go b/consensus/config/grpc.go deleted file mode 100644 index 700c3567..00000000 --- a/consensus/config/grpc.go +++ /dev/null @@ -1,6 +0,0 @@ -package config - -type GrpcServer struct { - ListenAddrs []string `yaml:"listenAddrs"` - TLS bool `yaml:"tls"` -} diff --git a/consensus/consensusrpc/consensrpc.go b/consensus/consensusrpc/consensrpc.go new file mode 100644 index 00000000..6d502364 --- /dev/null +++ b/consensus/consensusrpc/consensrpc.go @@ -0,0 +1,114 @@ +package consensusrpc + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/stream" + "time" +) + +const CName = "consensus.consensusrpc" + +func New() app.Component { + return &consensusRpc{} +} + +type consensusRpc struct { + db db.Service + stream stream.Service +} + +func (c *consensusRpc) Init(a *app.App) (err error) { + c.db = a.MustComponent(db.CName).(db.Service) + c.stream = a.MustComponent(stream.CName).(stream.Service) + return consensusproto.DRPCRegisterConsensus(a.MustComponent(server.CName).(server.DRPCServer), c) +} + +func (c *consensusRpc) Name() (name string) { + return CName +} + +func (c *consensusRpc) AddLog(ctx context.Context, req *consensusproto.AddLogRequest) (*consensusproto.Ok, error) { + if err := c.db.AddLog(ctx, logFromProto(req.Log)); err != nil { + return nil, err + } + return &consensusproto.Ok{}, nil +} + +func (c *consensusRpc) AddRecord(ctx context.Context, req *consensusproto.AddRecordRequest) (*consensusproto.Ok, error) { + if err := c.db.AddRecord(ctx, req.LogId, recordFromProto(req.Record)); err != nil { + return nil, err + } + return &consensusproto.Ok{}, nil +} + +func (c *consensusRpc) WatchLog(req *consensusproto.WatchLogRequest, rpcStream consensusproto.DRPCConsensus_WatchLogStream) error { + stream, err := c.stream.Subscribe(rpcStream.Context(), req.LogId) + if err != nil { + return err + } + defer stream.Close() + var logSent bool + for { + if !logSent { + if err = rpcStream.Send(&consensusproto.WatchLogEvent{ + LogId: req.LogId, + Records: recordsToProto(stream.Records()), + }); err != nil { + return err + } + } else { + recs := stream.WaitRecords() + if len(recs) == 0 { + return rpcStream.Close() + } + if err = rpcStream.Send(&consensusproto.WatchLogEvent{ + LogId: req.LogId, + Records: recordsToProto(recs), + }); err != nil { + return err + } + } + } +} + +func logFromProto(log *consensusproto.Log) consensus.Log { + return consensus.Log{ + Id: log.Id, + Records: recordsFromProto(log.Records), + } +} + +func recordsFromProto(recs []*consensusproto.Record) []consensus.Record { + res := make([]consensus.Record, len(recs)) + for i, rec := range recs { + res[i] = recordFromProto(rec) + } + return res +} + +func recordFromProto(rec *consensusproto.Record) consensus.Record { + return consensus.Record{ + Id: rec.Id, + PrevId: rec.PrevId, + Payload: rec.Payload, + Created: time.Unix(int64(rec.CreatedUnix), 0), + } +} + +func recordsToProto(recs []consensus.Record) []*consensusproto.Record { + res := make([]*consensusproto.Record, len(recs)) + for i, rec := range recs { + res[i] = &consensusproto.Record{ + Id: rec.Id, + PrevId: rec.PrevId, + Payload: rec.Payload, + CreatedUnix: uint64(rec.Created.Unix()), + } + } + return res +} diff --git a/consensus/db/db.go b/consensus/db/db.go index 120d7be0..d0f2ad10 100644 --- a/consensus/db/db.go +++ b/consensus/db/db.go @@ -153,7 +153,7 @@ type streamResult struct { UpdateDescription struct { UpdateFields struct { Records []consensus.Record `bson:"records"` - } `bson:"updatedFields""` + } `bson:"updatedFields"` } `bson:"updateDescription"` } diff --git a/consensus/stream/object.go b/consensus/stream/object.go new file mode 100644 index 00000000..6f4f3d07 --- /dev/null +++ b/consensus/stream/object.go @@ -0,0 +1,68 @@ +package stream + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" + "github.com/cheggaaa/mb/v2" + "sync" +) + +type object struct { + logId []byte + records []consensus.Record + + streams map[uint32]*stream + + lastStreamId uint32 + + mu sync.Mutex +} + +func (o *object) AddRecords(recs []consensus.Record) { + o.mu.Lock() + defer o.mu.Unlock() + + if len(recs) <= len(o.records) { + return + } + diff := recs[0 : len(recs)-len(o.records)] + o.records = recs + for _, st := range o.streams { + st.AddRecords(diff) + } +} + +func (o *object) Records() []consensus.Record { + o.mu.Lock() + defer o.mu.Unlock() + return o.records +} + +func (o *object) NewStream() Stream { + o.mu.Lock() + defer o.mu.Unlock() + o.lastStreamId++ + st := &stream{ + id: o.lastStreamId, + obj: o, + records: o.records, + mb: mb.New(consensus.Record{}, 100), + } + o.streams[st.id] = st + return st +} + +func (o *object) Locked() bool { + o.mu.Lock() + defer o.mu.Unlock() + return len(o.streams) > 0 +} + +func (o *object) removeStream(id uint32) { + o.mu.Lock() + defer o.mu.Unlock() + delete(o.streams, id) +} + +func (o *object) Close() (err error) { + return nil +} diff --git a/consensus/stream/service.go b/consensus/stream/service.go new file mode 100644 index 00000000..11c5bc42 --- /dev/null +++ b/consensus/stream/service.go @@ -0,0 +1,127 @@ +package stream + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "github.com/mr-tron/base58" + "go.uber.org/zap" + "time" +) + +const CName = "consensus.stream" + +var log = logger.NewNamed(CName) + +var ( + cacheTTL = time.Minute +) + +type ctxLog uint + +const ( + ctxLogKey ctxLog = 1 +) + +func New() Service { + return &service{} +} + +type Stream interface { + LogId() []byte + Records() []consensus.Record + WaitRecords() []consensus.Record + Close() +} + +type Service interface { + Subscribe(ctx context.Context, logId []byte) (stream Stream, err error) + app.ComponentRunnable +} + +type service struct { + db db.Service + cache ocache.OCache +} + +func (s *service) Init(a *app.App) (err error) { + s.db = a.MustComponent(db.CName).(db.Service) + s.cache = ocache.New(s.loadLog, + ocache.WithTTL(cacheTTL), + ocache.WithRefCounter(false), + ocache.WithLogger(log.Named("cache").Sugar()), + ) + + return s.db.SetChangeReceiver(s.receiveChange) +} + +func (s *service) Subscribe(ctx context.Context, logId []byte) (Stream, error) { + obj, err := s.getObject(ctx, logId) + if err != nil { + return nil, err + } + return obj.NewStream(), nil +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + return nil +} + +func (s *service) loadLog(ctx context.Context, id string) (value ocache.Object, err error) { + if ctxLog := ctx.Value(ctxLogKey); ctxLog != nil { + return &object{ + logId: ctxLog.(consensus.Log).Id, + records: ctxLog.(consensus.Log).Records, + streams: make(map[uint32]*stream), + }, nil + } + logId := logIdFromString(id) + dbLog, err := s.db.FetchLog(ctx, logId) + if err != nil { + return nil, err + } + return &object{ + logId: dbLog.Id, + records: dbLog.Records, + streams: make(map[uint32]*stream), + }, nil +} + +func (s *service) receiveChange(logId []byte, records []consensus.Record) { + ctx := context.WithValue(context.Background(), ctxLogKey, consensus.Log{Id: logId, Records: records}) + obj, err := s.getObject(ctx, logId) + if err != nil { + log.Error("failed load object from cache", zap.Error(err)) + return + } + obj.AddRecords(records) +} + +func (s *service) getObject(ctx context.Context, logId []byte) (*object, error) { + id := logIdToString(logId) + cacheObj, err := s.cache.Get(ctx, id) + if err != nil { + return nil, err + } + return cacheObj.(*object), nil +} + +func (s *service) Close(ctx context.Context) (err error) { + return s.cache.Close() +} + +func logIdToString(logId []byte) string { + return base58.Encode(logId) +} + +func logIdFromString(s string) []byte { + logId, _ := base58.Decode(s) + return logId +} diff --git a/consensus/stream/service_test.go b/consensus/stream/service_test.go new file mode 100644 index 00000000..8acf865c --- /dev/null +++ b/consensus/stream/service_test.go @@ -0,0 +1,169 @@ +package stream + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +var ctx = context.Background() + +func TestService_Subscribe(t *testing.T) { + fx := newFixture(t) + defer fx.Finish(t) + + var expLogId = []byte("logId") + + fx.mockDB.fetchLog = func(ctx context.Context, logId []byte) (log consensus.Log, err error) { + require.Equal(t, expLogId, logId) + return consensus.Log{ + Id: logId, + Records: []consensus.Record{ + { + Id: []byte{'1'}, + }, + }, + }, nil + } + + st1, err := fx.Subscribe(ctx, expLogId) + require.NoError(t, err) + require.Equal(t, expLogId, st1.LogId()) + sr1 := readStream(st1) + assert.Equal(t, uint32(1), sr1.id) + + st2, err := fx.Subscribe(ctx, expLogId) + require.NoError(t, err) + require.Equal(t, expLogId, st2.LogId()) + sr2 := readStream(st2) + assert.Equal(t, uint32(2), sr2.id) + + fx.mockDB.receiver(expLogId, []consensus.Record{ + { + Id: []byte{'1'}, + }, + }) + fx.mockDB.receiver([]byte("other id"), []consensus.Record{ + { + Id: []byte{'2'}, + PrevId: []byte{'1'}, + }, + { + Id: []byte{'1'}, + }, + }) + fx.mockDB.receiver(expLogId, []consensus.Record{ + { + Id: []byte{'2'}, + PrevId: []byte{'1'}, + }, + { + Id: []byte{'1'}, + }, + }) + st1.Close() + st2.Close() + + for _, sr := range []*streamReader{sr1, sr2} { + select { + case <-time.After(time.Second / 3): + require.False(t, true, "timeout") + case <-sr.finished: + } + } + + require.Equal(t, sr1.records, sr2.records) + require.Len(t, sr1.records, 1) + assert.Equal(t, []byte{'2'}, sr1.records[0].Id) +} + +func newFixture(t *testing.T) *fixture { + fx := &fixture{ + Service: New(), + mockDB: &mockDB{}, + a: new(app.App), + } + + fx.a.Register(fx.Service).Register(fx.mockDB) + require.NoError(t, fx.a.Start(ctx)) + return fx +} + +type fixture struct { + Service + mockDB *mockDB + a *app.App +} + +func (fx *fixture) Finish(t *testing.T) { + require.NoError(t, fx.a.Close(ctx)) +} + +func readStream(st Stream) *streamReader { + sr := &streamReader{ + id: st.(*stream).id, + stream: st, + finished: make(chan struct{}), + } + go sr.read() + return sr +} + +type streamReader struct { + id uint32 + stream Stream + + records []consensus.Record + finished chan struct{} +} + +func (sr *streamReader) read() { + defer close(sr.finished) + for { + records := sr.stream.WaitRecords() + if len(records) == 0 { + return + } + sr.records = append(sr.records, records...) + } +} + +type mockDB struct { + receiver db.ChangeReceiver + fetchLog func(ctx context.Context, logId []byte) (log consensus.Log, err error) +} + +func (m *mockDB) AddLog(ctx context.Context, log consensus.Log) (err error) { return nil } +func (m *mockDB) AddRecord(ctx context.Context, logId []byte, record consensus.Record) (err error) { + return nil +} + +func (m *mockDB) FetchLog(ctx context.Context, logId []byte) (log consensus.Log, err error) { + return m.fetchLog(ctx, logId) +} + +func (m *mockDB) SetChangeReceiver(receiver db.ChangeReceiver) (err error) { + m.receiver = receiver + return nil +} + +func (m *mockDB) Init(a *app.App) (err error) { + return nil +} + +func (m *mockDB) Name() (name string) { + return db.CName +} + +func (m *mockDB) Run(ctx context.Context) (err error) { + return +} + +func (m *mockDB) Close(ctx context.Context) (err error) { + return +} diff --git a/consensus/stream/stream.go b/consensus/stream/stream.go new file mode 100644 index 00000000..4f8f4b3e --- /dev/null +++ b/consensus/stream/stream.go @@ -0,0 +1,34 @@ +package stream + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" + "github.com/cheggaaa/mb/v2" +) + +type stream struct { + id uint32 + obj *object + records []consensus.Record + mb *mb.MB[consensus.Record] +} + +func (s *stream) LogId() []byte { + return s.obj.logId +} + +func (s *stream) AddRecords(records []consensus.Record) { + _ = s.mb.Add(records...) +} + +func (s *stream) Records() []consensus.Record { + return s.records +} + +func (s *stream) WaitRecords() []consensus.Record { + return s.mb.Wait() +} + +func (s *stream) Close() { + _ = s.mb.Close() + s.obj.removeStream(s.id) +} diff --git a/etc/configs/config1.yml b/etc/configs/config1.yml index 4885eab8..794ce8f9 100755 --- a/etc/configs/config1.yml +++ b/etc/configs/config1.yml @@ -5,20 +5,24 @@ grpcServer: - 127.0.0.1:4430 tls: false account: - peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu - signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA== - encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg== + peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck + signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== + encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== apiServer: port: "8080" nodes: - - peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu + - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck address: 127.0.0.1:4430 - signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA== - encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg== - - peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK + signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== + encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== + - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB address: 127.0.0.1:4431 - signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg== - encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w== + signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== + encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= + - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu + address: 127.0.0.1:4432 + signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== + encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw space: gcTTL: 60 syncPeriod: 10 diff --git a/etc/configs/config2.yml b/etc/configs/config2.yml index 5e1eaadb..51c733ca 100755 --- a/etc/configs/config2.yml +++ b/etc/configs/config2.yml @@ -5,20 +5,24 @@ grpcServer: - 127.0.0.1:4431 tls: false account: - peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK - signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg== - encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w== + peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB + signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== + encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= apiServer: port: "8081" nodes: - - peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu + - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck address: 127.0.0.1:4430 - signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA== - encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg== - - peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK + signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== + encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== + - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB address: 127.0.0.1:4431 - signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg== - encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w== + signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== + encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= + - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu + address: 127.0.0.1:4432 + signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== + encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw space: gcTTL: 60 syncPeriod: 10 diff --git a/etc/configs/config3.yml b/etc/configs/config3.yml new file mode 100755 index 00000000..a8c0e426 --- /dev/null +++ b/etc/configs/config3.yml @@ -0,0 +1,28 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4432 + tls: false +account: + peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu + signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== + encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw +apiServer: + port: "8082" +nodes: + - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck + address: 127.0.0.1:4430 + signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== + encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== + - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB + address: 127.0.0.1:4431 + signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== + encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= + - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu + address: 127.0.0.1:4432 + signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== + encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw +space: + gcTTL: 60 + syncPeriod: 10 diff --git a/etc/configs/cons/config1.yml b/etc/configs/cons/config1.yml new file mode 100755 index 00000000..1b9e053f --- /dev/null +++ b/etc/configs/cons/config1.yml @@ -0,0 +1,32 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4530 + tls: false +account: + peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck + signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== + encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== +apiServer: + port: "8080" +nodes: + - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck + address: 127.0.0.1:4530 + signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== + encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== + - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB + address: 127.0.0.1:4531 + signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== + encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= + - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu + address: 127.0.0.1:4532 + signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== + encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw +space: + gcTTL: 60 + syncPeriod: 10 +mongo: + connect: "mongodb://localhost:27017/?w=majority" + database: "consensus" + collection: "log" diff --git a/etc/configs/cons/config2.yml b/etc/configs/cons/config2.yml new file mode 100755 index 00000000..e6ae09e4 --- /dev/null +++ b/etc/configs/cons/config2.yml @@ -0,0 +1,32 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4531 + tls: false +account: + peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB + signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== + encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= +apiServer: + port: "8081" +nodes: + - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck + address: 127.0.0.1:4530 + signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== + encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== + - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB + address: 127.0.0.1:4531 + signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== + encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= + - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu + address: 127.0.0.1:4532 + signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== + encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw +space: + gcTTL: 60 + syncPeriod: 10 +mongo: + connect: "mongodb://localhost:27017/?w=majority" + database: "consensus" + collection: "log" diff --git a/etc/configs/cons/config3.yml b/etc/configs/cons/config3.yml new file mode 100755 index 00000000..df015573 --- /dev/null +++ b/etc/configs/cons/config3.yml @@ -0,0 +1,32 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4532 + tls: false +account: + peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu + signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== + encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw +apiServer: + port: "8082" +nodes: + - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck + address: 127.0.0.1:4530 + signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== + encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== + - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB + address: 127.0.0.1:4531 + signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== + encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= + - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu + address: 127.0.0.1:4532 + signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== + encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw +space: + gcTTL: 60 + syncPeriod: 10 +mongo: + connect: "mongodb://localhost:27017/?w=majority" + database: "consensus" + collection: "log" \ No newline at end of file diff --git a/etc/consensus-node.yml b/etc/consensus-node.yml new file mode 100644 index 00000000..041c1c14 --- /dev/null +++ b/etc/consensus-node.yml @@ -0,0 +1,11 @@ +rpcServer: + listenAddrs: + - 127.0.0.1:4530 +account: + peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu + signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA== + encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg== +mongo: + connect: "mongodb://localhost:27017/?w=majority" + database: "consensus" + collection: "log" \ No newline at end of file diff --git a/go.mod b/go.mod index a71e82d4..17ad3f10 100644 --- a/go.mod +++ b/go.mod @@ -30,6 +30,7 @@ require ( github.com/btcsuite/btcd v0.22.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.1.3 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/cheggaaa/mb/v2 v2.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/fogleman/gg v1.3.0 // indirect diff --git a/go.sum b/go.sum index fd2783ce..bf139393 100644 --- a/go.sum +++ b/go.sum @@ -15,6 +15,10 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOF github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cheggaaa/mb v1.0.3 h1:03ksWum+6kHclB+kjwKMaBtgl5gtNYUwNpxsHQciKe8= +github.com/cheggaaa/mb v1.0.3/go.mod h1:NUl0GBtFLlfg2o6iZwxzcG7Lslc2wV/ADTFbLXtVPE4= +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/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA= github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/node/account/service.go b/node/account/service.go index f9f7a6a2..3181f9bd 100644 --- a/node/account/service.go +++ b/node/account/service.go @@ -24,8 +24,7 @@ func New() app.Component { } func (s *service) Init(a *app.App) (err error) { - cfg := a.MustComponent(config.CName).(*config.Config) - acc := cfg.Account + acc := a.MustComponent(config.CName).(commonaccount.ConfigGetter).GetAccount() decodedEncryptionKey, err := keys.DecodeKeyFromString( acc.EncryptionKey, From 9f902bfbe968fa76049cf73351bdad90b50b46ab Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Tue, 4 Oct 2022 16:36:11 +0300 Subject: [PATCH 116/219] nodesgen consensus configs --- cmd/nodesgen/gen.go | 88 ++++++++++++++++++++++++++--- cmd/nodesgen/nodemap.yml | 7 +++ config/nodes.go | 5 +- consensus/consensusclient/client.go | 12 ++++ etc/configs/config1.yml | 28 --------- etc/configs/config2.yml | 28 --------- etc/configs/config3.yml | 28 --------- etc/configs/cons/config1.yml | 32 ----------- etc/configs/cons/config2.yml | 32 ----------- etc/configs/cons/config3.yml | 32 ----------- etc/configs/cons1.yml | 12 ++++ etc/configs/cons2.yml | 12 ++++ etc/configs/cons3.yml | 12 ++++ etc/configs/node1.yml | 31 ++++++++++ etc/configs/node2.yml | 31 ++++++++++ etc/configs/node3.yml | 31 ++++++++++ 16 files changed, 232 insertions(+), 189 deletions(-) create mode 100644 consensus/consensusclient/client.go delete mode 100755 etc/configs/config1.yml delete mode 100755 etc/configs/config2.yml delete mode 100755 etc/configs/config3.yml delete mode 100755 etc/configs/cons/config1.yml delete mode 100755 etc/configs/cons/config2.yml delete mode 100755 etc/configs/cons/config3.yml create mode 100755 etc/configs/cons1.yml create mode 100755 etc/configs/cons2.yml create mode 100755 etc/configs/cons3.yml create mode 100755 etc/configs/node1.yml create mode 100755 etc/configs/node2.yml create mode 100755 etc/configs/node3.yml diff --git a/cmd/nodesgen/gen.go b/cmd/nodesgen/gen.go index 2eddeab6..5dcb42fa 100644 --- a/cmd/nodesgen/gen.go +++ b/cmd/nodesgen/gen.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + cconfig "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" @@ -23,6 +24,9 @@ type NodesMap struct { Addresses []string `yaml:"grpcAddresses"` APIPort string `yaml:"apiPort"` } `yaml:"nodes"` + Consensus []struct { + Addresses []string `yaml:"grpcAddresses"` + } } func main() { @@ -41,17 +45,31 @@ func main() { var configs []config.Config var nodes []config.Node for _, n := range nodesMap.Nodes { - cfg, err := genConfig(n.Addresses, n.APIPort) + cfg, err := genNodeConfig(n.Addresses, n.APIPort) if err != nil { panic(fmt.Sprintf("could not generate the config file: %s", err.Error())) } configs = append(configs, cfg) node := config.Node{ - PeerId: cfg.Account.PeerId, - Address: cfg.GrpcServer.ListenAddrs[0], - SigningKey: cfg.Account.SigningKey, - EncryptionKey: cfg.Account.EncryptionKey, + PeerId: cfg.Account.PeerId, + Address: cfg.GrpcServer.ListenAddrs[0], + } + nodes = append(nodes, node) + } + + var consConfigs []cconfig.Config + for _, n := range nodesMap.Consensus { + cfg, err := genConsensusConfig(n.Addresses) + if err != nil { + panic(fmt.Sprintf("could not generate the config file: %s", err.Error())) + } + consConfigs = append(consConfigs, cfg) + + node := config.Node{ + PeerId: cfg.Account.PeerId, + Address: cfg.GrpcServer.ListenAddrs[0], + IsConsensus: true, } nodes = append(nodes, node) } @@ -77,7 +95,19 @@ func main() { createDir() } for idx, cfg := range configs { - path := fmt.Sprintf("%s/config%d.yml", configsPath, idx+1) + path := fmt.Sprintf("%s/node%d.yml", configsPath, idx+1) + bytes, err := yaml.Marshal(cfg) + if err != nil { + panic(fmt.Sprintf("could not marshal the keys: %v", err)) + } + + err = os.WriteFile(path, bytes, os.ModePerm) + if err != nil { + panic(fmt.Sprintf("could not write the config to file: %v", err)) + } + } + for idx, cfg := range consConfigs { + path := fmt.Sprintf("%s/cons%d.yml", configsPath, idx+1) bytes, err := yaml.Marshal(cfg) if err != nil { panic(fmt.Sprintf("could not marshal the keys: %v", err)) @@ -90,7 +120,7 @@ func main() { } } -func genConfig(addresses []string, apiPort string) (config.Config, error) { +func genNodeConfig(addresses []string, apiPort string) (config.Config, error) { encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) if err != nil { return config.Config{}, err @@ -136,3 +166,47 @@ func genConfig(addresses []string, apiPort string) (config.Config, error) { }, }, nil } + +func genConsensusConfig(addresses []string) (cconfig.Config, error) { + encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) + if err != nil { + return cconfig.Config{}, err + } + + signKey, _, err := signingkey.GenerateRandomEd25519KeyPair() + if err != nil { + return cconfig.Config{}, err + } + + encEncKey, err := keys.EncodeKeyToString(encKey) + if err != nil { + return cconfig.Config{}, err + } + + encSignKey, err := keys.EncodeKeyToString(signKey) + if err != nil { + return cconfig.Config{}, err + } + + peerID, err := peer.IDFromSigningPubKey(signKey.GetPublic()) + if err != nil { + return cconfig.Config{}, err + } + + return cconfig.Config{ + GrpcServer: config.GrpcServer{ + ListenAddrs: addresses, + TLS: false, + }, + Account: config.Account{ + PeerId: peerID.String(), + SigningKey: encSignKey, + EncryptionKey: encEncKey, + }, + Mongo: cconfig.Mongo{ + Connect: "mongodb://localhost:27017/?w=majority", + Database: "consensus", + LogCollection: "log", + }, + }, nil +} diff --git a/cmd/nodesgen/nodemap.yml b/cmd/nodesgen/nodemap.yml index 137e585f..ad4e9c80 100644 --- a/cmd/nodesgen/nodemap.yml +++ b/cmd/nodesgen/nodemap.yml @@ -8,3 +8,10 @@ nodes: - grpcAddresses: - "127.0.0.1:4432" apiPort: "8082" +consensus: + - grpcAddresses: + - "127.0.0.1:4530" + - grpcAddresses: + - "127.0.0.1:4531" + - grpcAddresses: + - "127.0.0.1:4532" diff --git a/config/nodes.go b/config/nodes.go index 932a76a9..9583d833 100644 --- a/config/nodes.go +++ b/config/nodes.go @@ -3,6 +3,7 @@ package config type Node struct { PeerId string `yaml:"peerId"` Address string `yaml:"address"` - SigningKey string `yaml:"signingKey"` - EncryptionKey string `yaml:"encryptionKey"` + SigningKey string `yaml:"signingKey,omitempty"` + EncryptionKey string `yaml:"encryptionKey,omitempty"` + IsConsensus bool `yaml:"isConsensus,omitempty"` } diff --git a/consensus/consensusclient/client.go b/consensus/consensusclient/client.go new file mode 100644 index 00000000..59cf8499 --- /dev/null +++ b/consensus/consensusclient/client.go @@ -0,0 +1,12 @@ +package consensusclient + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + +const CName = "consensus.client" + +type Service interface { + app.Component +} + +type service struct { +} diff --git a/etc/configs/config1.yml b/etc/configs/config1.yml deleted file mode 100755 index 794ce8f9..00000000 --- a/etc/configs/config1.yml +++ /dev/null @@ -1,28 +0,0 @@ -anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec -grpcServer: - listenAddrs: - - 127.0.0.1:4430 - tls: false -account: - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck - signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== - encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== -apiServer: - port: "8080" -nodes: - - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck - address: 127.0.0.1:4430 - signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== - encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== - - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB - address: 127.0.0.1:4431 - signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== - encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= - - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu - address: 127.0.0.1:4432 - signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== - encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw -space: - gcTTL: 60 - syncPeriod: 10 diff --git a/etc/configs/config2.yml b/etc/configs/config2.yml deleted file mode 100755 index 51c733ca..00000000 --- a/etc/configs/config2.yml +++ /dev/null @@ -1,28 +0,0 @@ -anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec -grpcServer: - listenAddrs: - - 127.0.0.1:4431 - tls: false -account: - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB - signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== - encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= -apiServer: - port: "8081" -nodes: - - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck - address: 127.0.0.1:4430 - signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== - encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== - - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB - address: 127.0.0.1:4431 - signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== - encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= - - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu - address: 127.0.0.1:4432 - signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== - encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw -space: - gcTTL: 60 - syncPeriod: 10 diff --git a/etc/configs/config3.yml b/etc/configs/config3.yml deleted file mode 100755 index a8c0e426..00000000 --- a/etc/configs/config3.yml +++ /dev/null @@ -1,28 +0,0 @@ -anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec -grpcServer: - listenAddrs: - - 127.0.0.1:4432 - tls: false -account: - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu - signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== - encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw -apiServer: - port: "8082" -nodes: - - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck - address: 127.0.0.1:4430 - signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== - encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== - - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB - address: 127.0.0.1:4431 - signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== - encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= - - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu - address: 127.0.0.1:4432 - signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== - encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw -space: - gcTTL: 60 - syncPeriod: 10 diff --git a/etc/configs/cons/config1.yml b/etc/configs/cons/config1.yml deleted file mode 100755 index 1b9e053f..00000000 --- a/etc/configs/cons/config1.yml +++ /dev/null @@ -1,32 +0,0 @@ -anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec -grpcServer: - listenAddrs: - - 127.0.0.1:4530 - tls: false -account: - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck - signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== - encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== -apiServer: - port: "8080" -nodes: - - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck - address: 127.0.0.1:4530 - signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== - encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== - - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB - address: 127.0.0.1:4531 - signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== - encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= - - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu - address: 127.0.0.1:4532 - signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== - encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw -space: - gcTTL: 60 - syncPeriod: 10 -mongo: - connect: "mongodb://localhost:27017/?w=majority" - database: "consensus" - collection: "log" diff --git a/etc/configs/cons/config2.yml b/etc/configs/cons/config2.yml deleted file mode 100755 index e6ae09e4..00000000 --- a/etc/configs/cons/config2.yml +++ /dev/null @@ -1,32 +0,0 @@ -anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec -grpcServer: - listenAddrs: - - 127.0.0.1:4531 - tls: false -account: - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB - signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== - encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= -apiServer: - port: "8081" -nodes: - - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck - address: 127.0.0.1:4530 - signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== - encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== - - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB - address: 127.0.0.1:4531 - signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== - encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= - - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu - address: 127.0.0.1:4532 - signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== - encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw -space: - gcTTL: 60 - syncPeriod: 10 -mongo: - connect: "mongodb://localhost:27017/?w=majority" - database: "consensus" - collection: "log" diff --git a/etc/configs/cons/config3.yml b/etc/configs/cons/config3.yml deleted file mode 100755 index df015573..00000000 --- a/etc/configs/cons/config3.yml +++ /dev/null @@ -1,32 +0,0 @@ -anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec -grpcServer: - listenAddrs: - - 127.0.0.1:4532 - tls: false -account: - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu - signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== - encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw -apiServer: - port: "8082" -nodes: - - peerId: 12D3KooWPo3aLfq4t6iTmAWp6zDduEyZ4V9yb168NfneF4ufBcck - address: 127.0.0.1:4530 - signingKey: wE4Z/KtDHeA5PCaOQ5x4UQcHFo0B35H9cURBAYiAa8nPrQNFvmXrxgXwLkqwt/HoRN0NlcLzk/sBpU74yaXbNQ== - encryptionKey: MIIEpAIBAAKCAQEAuX3SpXlT52qn4xmS4sC0aw1NSWmmjlb9rKjKWamkbSB8wuuTCCaKboV3NfMR2YfmS+IPZ4IK47l0TtbyFM4Aaga0QTbbhGA0dXI2RiUK2a6iI1/j/wyc75UDJibnsMwCbtswnTJKfvNwEPaGI8yMZpxTMxTxKPMCqqz4Ej2WX87l/aa+9kLdW9FACRmoJUg2dbTrPgbtl+RzrNPjUvoyvN0QMuOr1v+g2lLrBtXDIjw5Tcp9v/aLNoXvhPjOc8z4G3sVGS/T9ndMOkaREef/msKp19QZwB4Lzmg3c7jHrRekrBaUn6azUcTabw7gaSVIh8WXln8Imn7cKqy5oXWRGwIDAQABAoIBAFdHafdsiFtKZybHoMLLM9lvT99sM++j5Qb6AQSBexnSAIJjADMEl3x7lmUvM0Xs2SL5gpAMs30FhUGXiB7b83vwHZ7V5iJ6dhSRIhKNWXal4irM8uXOlIVy0yF/iuM4iyiIQG6m/ECR4ThKF0H+/E1H3yoY/4RqG+YdLzi9++SmEsEig67vO3Uf9icm6bKw64/Sp0Mc4+KKlgu+qCsru2337jjlxJOLv9xWYW3yiTTV2EOJkqxMVqEXknZLVoY6QC+FZwkj3gyJPGFJu0+RqCdt5qcAcXf4/6lCA2iYjN+SuVLRRcNO/IBthRtvjw6XMTGRB9km0kc5tzFLRS52OLECgYEA7zidJZCDEWqdlEhiTwTA7wZbtjNVM5Gyqn22ap8Ux63tsueHPJDJO4/LSNnnO43mi79bXwP8Kh33iE2qnvzY3p1HXl8QWBbfdFl3eyP8rKdI+zZow1+REQQEGTT5gABa9t1we3hBD0Qq6u+a58+MJSlyx9fsJj1Xw81JgmLkbXMCgYEAxoB0bVyG1dfabNdpnLTRHMZKYS8Wc44/VFOLpw+ZBVTj/U+2FLmP5sFzK/TUPJ7C3p3JCMCeXRlmv+Vk4CD3WbVpbfdftFJcq1oJtziNSvSv2aR9eQZqQ9GTJE8Ale8aslxBKUNAWeHVoPSozrMy2KFO48ADQLAFPuBaAVf1Y7kCgYAERF1BO0erOtyetX/TawFKAjIGmPnPFq06L03erwG+4hJYW5rk8Kw2PMVigkiGnmxbV8l4c2i/E5PDwabmeRohNmr8evOerqHDwIjKEIVESyOZH4pU2dKLnCe6j2BX8SmuN5r3CNkYPZ4KXMXFlsUoMIoUmHxk3jk/i9zgz4TFkwKBgQC52zgn1URiINLgqei20w4gNQEbcW1CEOP23qqZZx9NQKifWu0PBpdX5bUiaP/3Kmcm7PF4AnHEla4A6pXCzNsL4bGvRrkTKzKdNZZ3OLoCfovP6hWZJYqFqUpt6pKPz+pdKcfRDKjJ/4t4QttzfZGUB6TH1da10Jl4v7NGIscd8QKBgQCppr1+ZfZH2rcYIgcyZEC2/CqU+CSCkxB0nJJGxZyY8KED3qAcYwAyzsAJaQKEIA91o6fwLOWNgP6H1cnXnRVr31uh/cveGr2xdtwLFc5/QHfTdFloCgsMQH66WwGgqQAQK6g8nBXDov5u0of2XGlLCPB2FD2QHqyizVF1wwl5TA== - - peerId: 12D3KooWMSRCGD7MKFwbxuonTV23Zk8bj5enUPBnrt24z8r8JRWB - address: 127.0.0.1:4531 - signingKey: NO1unZIre3IFAHjJ6hPUYqgxhVpsisqaUNXnBnKyZZWsrOMUiO1mPvUgOWJ4KiecUh6F8s33SAB+7AlXcrGg9A== - encryptionKey: MIIEogIBAAKCAQEA03Ro0fUDPbQ5yCPHebMDdnHha+7j+8/OuzbpXuNICSfx2ogR05mGatH2FCwTTVZRSzc0SSsnWMeas/gtGnkGuH5T0+PN02niHG0FSHyV2fjRhOd2fDq0Dr0BxzTnvt83XqMwRZVlJESQg2a3UFx+tdgo0gtZomSRswHyc0ZTufKYW9VvaWpicTswF57z1Xu6ZtcJzPmcRpAwmJQl1PLVgJ5WXAaBLhpupcmt2z5KNKAhya72WJIcW1SqzLtiOwERwOTXdniPKiWoy7mf+DiVHPRtMv++98nF1VzR1qpqty97VRcNTEb31lc18IUmUgZGS52zd1K/OIazfURmsn5CyQIDAQABAoIBAAt+JjxTHsv5wbI5D5xzuFp1shTVtRp4nvnZ8DEyFTY6L5D7GEzx6TZhFwjdpGbtrBl0dKkNaWQP5T6m3Hy120GnzBKWLReyh5GX81OPQe3I8kpQ8kWqQyMR7sjO/VGIfE/ueq8tgYPJHjmmGYyKmnBzwTQ5XbPP14NtNapCRkay6XiswHOxw0AJTlA4Ob1yTVSl7rBbY+U5QEfOIi+UuFZZ77vAJtZ8GW92k93mASy/io8S2FwvSKCR2aBSUtAx3mJ2LOdVngL6MPBF7OViogt4Ys7IZh2GxqPr3KsbMpNy7EEO4F+/L/BJ4DeCbbox3FohiJVujbtES4XAEumJ3SkCgYEA8qzZGuSscq/FlV3NwQ4YPlkrlpxX5hYA4mUGhMuTBW9sb29b09YaQqiTTqc/0SbpjHBNIf8h+EGGwpo7v5Fo4NsH0nNy0MbbCaD2lZbbfSlMFX9CtZh6tFdT+apqwD9g4A9YLde2gGfwreqjz8iv47UwNihv4Apd8HXNo3IfaqsCgYEA3xC2ZEw8pZm/UU8frtl/K6J+ODxpopjVDgSFSvUKuZEad2e3SK4tT8/KLyjvcmMvzjnNYycC1zXxZYaW+75jQNRJcduZstiRfck+ko0YI7sjE3xP37F2unrWD9/J91J4hyZ5DmnQvZ0hEaA1xJiaenLuqO+BVTQM9qDc6fH6CFsCgYA9h9gQepTDC5BUnBE0dwdsn51utbuPylp1DNqHRzrC8QqUgq7M2oeUCTw4gC2tMWmcQ0k7an5JfQvXQdYOb6chBEhKcx1UlGcrXNXI/hQu+w6gkMDwXHYYTeAr+KrSjf9ZMGrSTNSoYDJlVo4sfB0k5mcQBFbBfr9s3eHDJIeUuwKBgByzGcRtyp/D2Emt1HW6phIHJhY2L6Er6L2U91FdlbOqZ61VOs+vGUVbhrfqnGQrPstZxIMtUcA+wIA/gM2DAWIl7g0oI+5OzulQKyzP2ns+aJTpOZ2eR5hWlZQVRvb7NWauHIUuOB0tSkPqSQCyYa2/e9Vge1NrDv/sUoAHEhRhAoGAEgC9OD/M7YnC0q0R7FaZKmwnR36KkAJNItcgGq7Vrr0kbtBFxos0almHyIMJ9MFkIRjytL2J5RHP8ulvw2bdDiBX80YnNJ+HC0oue6MXGF6a3Wbb0XAkFxarfcR7nNzn3CJS0cwtMNgnQxLGUNHByMH5GsaNey0oAWiDsWtUJxU= - - peerId: 12D3KooWRTGXikGHDdsNATxd6Vk56iu1V4dd6KZj3vv7KnGAMpxu - address: 127.0.0.1:4532 - signingKey: krUwB1X4pZj1oy1i7ICHmMC6KhKmTYQflQaA3u5f3cToU2slOAZlMHEyRv8MUR5Trqtv2uAnQAXFSWotybLdlg== - encryptionKey: MIIEowIBAAKCAQEA2mlMdTZv7lTe3vbUKYbKKRjw0e3TvTmVRl8v/ayWPpn+bf/TPA+r3RoUaWnDEn4mHzUc+KNIPJJtv+uc2GXxG420R8lIs44zacuaYy8hbb7dYqK0u9ZoCkiaaT9nH/d/G8PsVy9jYQri4t4TtvvPebhZ2a2hHr4zEgilgTVEuxte0/QcKvEu2NYxaewLzejc2fJHyFOjfDhJqZOQKt8xlM0xszPcqzIDtDsuJFRRqw3Tk82427Ayc2I9EwLHd4r6qaNejW4BC5OXz+URHOJd130U8sslz4oTmkKuMkdu2HhkOznhw+TIn7TmzW6LQhJY9iBxmmM/V6VTXtgr6Fi7jQIDAQABAoIBAHUYfyVYSio81kAzlQuueDQQawwhtaN9e8p+vfwCy4pEhWP0BAvvWvTvRoI9cZg4ibexghbLc68F0lFSwIREIz/ieQUDpTaexnGx9tO2MPXlnkuDb+JE0QKyahaDJ4a76im4oL0daupcK8f1yBwSZOmdLI7Hx9nznu3MNO9Q38hvppsLNOkUf7KYTkGXGrdfY7CM6Fev9lr1o7QgNkkEgHas9SAxgjXX2sG+bhmz75eRnaoZ0KHhfSih8S17NaPpwpAOSQTdRpFCzEbHKAmn6BCJXGhdg4fSk0WgYEd23WhOaLsni2jqWMy252I5dykcm9qRYM+6Vo7CKEiC4axGkAECgYEA7QhOezQedHQ7qMnd2e/VBG0kgg5qTE+ztyWjBwrgdK2+Fd+DMmIMmZS+ETqz1rxnTp8miXv/7vz1SvxvxUFyXp6nKzFd+hPXJjIwmKuV1QF2kkHxFypOYPXF4BOPng8cEojKrud1nj7Bgm3bL3X6WzE8F5fvauC0DDlRRAZDYR0CgYEA6+OIIq56TMKfMMWNwWIVg3Ec3MZTFr6dwyw/CCAIdg9L4AtdaaY3erkvW7AGEP9ttXt5/foiv2zfd835VtoBevsCFHGzJlZTxuEtXjUHoDTKfxB88XZxIAwYvYJWjlgyOk/tDW/cRI6IshAQm+UhR/m4jYcmnHEqssjidcMDqTECgYEAtZVtehjdU91PbujmmfSPPcrW8wNUD43nYWDl2ZlNhlUrj9ogydIvUOCQEubjqpe+lI57mUtzL4R97aohff27Ph1Qd1hkZBYa9lnwvKSGLh3m1fjKVzLDxKfDpPuXREDTAqfkjcUnZ8kvuVmrVlqNJps7K9/rO/dUNyEZzoD10UkCgYBe5Wk18pU23jDmkQMnIgtflpiy5II2qzaSdvFglmpw/FRc7JWG1ByLnYZEz3qRSgDburHoD8H82pLIAq/lVcy0qdg7W0ZkDOSlJJ94v8Kym6o/FeX9ydVWvCcTziR+HVMPjGnkNvUZC3JImBfmb3ZFG1w4a3+H/ircQ95+25ZUcQKBgHB7u8EEpjxcuiUMSWxpUt2NCVIfwnsQQCBwDKdxh/EC+60kmZr83syAkmxGiB8UQf5VcVYJpTV8R12gsafdBzhXid3qOgWCLze1j5BnaLX4SD2CmOCB0myr0uO4xBYhACpkpZqHWs+ybozylnj6i6TiySxBysfi6aQivjhSo+Rw -space: - gcTTL: 60 - syncPeriod: 10 -mongo: - connect: "mongodb://localhost:27017/?w=majority" - database: "consensus" - collection: "log" \ No newline at end of file diff --git a/etc/configs/cons1.yml b/etc/configs/cons1.yml new file mode 100755 index 00000000..e75afc05 --- /dev/null +++ b/etc/configs/cons1.yml @@ -0,0 +1,12 @@ +grpcServer: + listenAddrs: + - 127.0.0.1:4530 + tls: false +account: + peerId: 12D3KooWKZcPNMmMqi6PZFjUkZqrFXXUYLpzoHBjbHLPojkuj4xp + signingKey: gnmy5mbz+c/TYLEFCa7dgPei1Z94GNEuj7XYutkAVreQzTur/0eA8JfYkWlIDLIMyzqS3pm4PtxG90/L3lKlQQ== + encryptionKey: MIIEogIBAAKCAQEAuxeAfwwc7aJeecn15nSuunXSUdVsaVsyTdxf7R1mc2Rux0CH7wbX0xL+UZVfMQ7hkPSp7rI4kP5T9iq+9gcMVgU6CjlBBJpv7KbbShRn1+71DqdJpfJYJNCawy8nu3YQrS0i15gOE7Pd5G3PZ44dtW8kh+Tq6qC7Am/e5Cd+CRgOxcBQnRQID5HTe18LF2jsx0CuvH/RUZDDdvtRVmxJYKVyWAXXOEKIn8lgdLM3bf5SzzDI2Mf1x50pLBNFBLD0MQJ8IRQ8S426C8SY1WJfyUzVinqmO/w16R67+Lj4qseE+TTmLprVWUgm3CdxzzrGebGU71QrTQc9TUr6tWDbDwIDAQABAoIBAEJevv3S/Twr2poX1Dzx7b5F59uR+8iQSpMmd301bc/HtCjJMq/P3KaLWV71v3Q21DxJHzOHU9vT7VMprN64d17YsdNIplEMvGHWe3qXLJOEuLh/DfhptW0x94UAaHbvFlFo7rBOx8ejijbr4aTZ3J4tlGcFBXVAmbbumsKTY/mzTH4H5zXDoSw2IVWkRP3UogKK3Jmee0fHm7XW5Ue68P2Bv6wCTfF6RGAZTxlX4x9X27OtZMsVPIooLUiUL7sBXXeqSupYIchc/o4ztv7CslNnGF7b6wc48HBkfcB4aoM/RIAXQG58aWFofMXpYEl7Ulk7FUUMXqlKwOrCcteAkhECgYEAzFIQH94N1+E8edQ6vlMvSXQaJvHYrEhQNWGLecLndYi5XCc0AtvR+wdQnGR+lDu1lbcm3h0e1E/G0LHDxkiJndKLrRD5L1JVOyd7I22dTrUAOYNsshygpqiYyt2CENCmEbz9eXZD0a9klqTEABvQVOdNUM5FXXAk6e/gX6i9PlkCgYEA6mnco9x4TysXv1VERP3RaFBPn21rgkxguXO4Jsi70hZ1NR+4L1aXI1ggKAbsXZ0rmjn5aru59cVvv8msnRRt+u5zFKWX8xpKM96+zZbKhv9XGw22jwmy7Sbx5PB3kFPZ5ud6EeQwNlQJLPqSYgAaL0c2mNkaerAQVtmNj0dmx6cCgYAjy/TbQHI4clPAHHi2Q6izO84hKJoHhRvYXmCrUoRuySeAh7XLEmw1iNCMteafXd6wfkgm/f8av2dbxOlB4g+KQQsLpT+jFM+t73rZeCjpUzjY2re+dNmImV07nZdeDtApp2zZTOkQ4aPD6NYWFslnNqcLEzh/6FfvTIGJAO028QKBgGdmArkUyszBCVyQU+jKvM/yfOyp6z4ySogDDzusV4y380NXlnrrCwfAG48MXr58UXtaDzaRT9mlGUHTx5wSIuEIxSJaWMgW1JxEqI0u8m7Ruq5oQhqeAJqzDwgZOeQj2H4NpL63lLyiHNoGPQOVX/dyxhZtzUxI1Sw6EkMdD60JAoGAJN9/rjBKpDG09HRwLA+ize4/+KAk0DLUwd5SoLJozUgw6r0J1eGPXAo9fj6fIKF3m6cW6I/MPX2R+MZ5eQJa82WzFKuwX0IFQvmpegQRGUa5fv8acqIWnhu6jq5MWOLGJfLhFTChscIIUT6I8rz9k57XCyvrIT65Cz8Y4HpggiU= +mongo: + connect: mongodb://localhost:27017/?w=majority + database: consensus + logCollection: log diff --git a/etc/configs/cons2.yml b/etc/configs/cons2.yml new file mode 100755 index 00000000..0ea4662c --- /dev/null +++ b/etc/configs/cons2.yml @@ -0,0 +1,12 @@ +grpcServer: + listenAddrs: + - 127.0.0.1:4531 + tls: false +account: + peerId: 12D3KooWGVroVVTuhc7GcnYZ3T9RmvuB4LWwqQRgvEMWQWPQqTy8 + signingKey: FGi5NwOrRlQAwGuwwi6rwAqAGD4FRGJExr0y+kc2LJpjRCYyLSau5CL2DiFYB+0Qx8+Qq+y2jxkvEjivGEqpzw== + encryptionKey: MIIEpAIBAAKCAQEAzn1d/3riBKfsBbp7zswhj5kHqsFP8ipq614bGdXrB8TyckbCVyfGe7Cgn9443drOr2SpIGgU/HCnxV3IcYYb8jLTfEh8Rfmo0BNhDAgnfGCjsOWxc/h7WRvWCTaQiOqEaN3A2ohA0eE/6lhXSGVJ0YAtOdyuwGFRKxoP4K/DGR4D9Bus04dCzi4bUhQsa02vxvsR35qAtNxJ2gEMGtAnKOeiQBpPt7+uWmNs7eu9CoxvodCQdAwJo66nmorXKYlzFcdDuMdiczJgizXPUMuYB++HBCSjzqFeTSa61IQtwPL3Is0mGhl81sDaN4HE3Q5E5C3zxeJ6vtMnLlddPmBJ4QIDAQABAoIBADLLAelLV/efOt653aSj8Al7sjgdr0W5i210S6RSS6swlhboMvvva9KXQxuwNTrVjQv17ehr0eW67HoPNLRAMfWk7QLgbblkzVLJwZCNHPFqcDmedsU5NVZZE5BWnL0hOwr0qXDYHWHDT86chnPnfn4LUpSuJUprZeT9VzSE56/wkhkm02uB1Nm0MDgQqIToryqWOlgFDtT4vgA4W6apASZRoPb6eT714SdyEggZ/L8Vozw/wiUkZT9EIOrMXMjU/4Laa6Z4SNL27tW5fCxMVOLpapHzc0/2KpnWWEsfB5VIxAyNpce+iTBbzWQQEi8f4NPKkEpsYMmxHWPnk3D+HPUCgYEA5yDhIQT9JJROgCo4G3OqpEqpaC6if1HBWSC5eEL+G9ZHajvGVBBLhRE1fcTtnb77mUVY3UrFkxTlfMnzhloX4xqLPUURN+eyx1UxbJkEt3NI62FH3YhhwnR3JPzA4POks5tmlEwXGQXIojFxCinzFkXaSV1pxnv03d/bTzXQNCsCgYEA5LW9rF8G3W1zZs++dPRAUXreHyq6wku4jIGZVE6nwlFTxLgY+D+5ZVaobJvR6j1Aetzrlc0FMMVb7SuQCI28ajSYAm+luc8657oJoKs5RfAxlM1PHx2u/1WAuL1NRPPLBuT0OpoXx/0JV2N+0h6QhP6ZufyKgI4b3gmZHAvfeCMCgYAtl87RNKq7DIZvweRPhgGjZxcD9i8X7oi1jD8J+i0mUJ7F1gTJkG1VUo+6v54gAAyhr4xYGufem8CpXS0s05jis9nDvFwpKwuZRrT5NzY2+gboZ8hFayHduhvGsBVcSrOyunUBzADCbuGlHRuvZZcOTblBv6ud+9XR7tbUSUlJAQKBgQCwf9CwhWU23JCCdy/z8crxFnD0fHVEHEt/o0RA27J7M2gCGFCsxAC/Q/EWX+nPaxWnu3XTVTT8PlKC5WtyLm+JRq1ItAChNFuxGND1PS4l2wdoXkkBKlcylTmRWAWZgMrdtzMDRoezvoLG/fGRFiVRfWoFLe905jZ7U8zk6AS9IQKBgQC4MjddDxyPulCHigqz4jexS5Rt8yhMxuG+4dZEOdlBmeq1OceGzJVmQNlermuKABXPdvilZmr8FxkvhtKQUy4cXf4ZNZzasLeoSdJ5jputkqZRG8AoH3HJSqNUwH7ckIZESLuHWLoppCw+dNloPxqhecHTkStor2mfFk+/GD9hJA== +mongo: + connect: mongodb://localhost:27017/?w=majority + database: consensus + logCollection: log diff --git a/etc/configs/cons3.yml b/etc/configs/cons3.yml new file mode 100755 index 00000000..1cf1613d --- /dev/null +++ b/etc/configs/cons3.yml @@ -0,0 +1,12 @@ +grpcServer: + listenAddrs: + - 127.0.0.1:4532 + tls: false +account: + peerId: 12D3KooWDLvgBnuUnuLea8QZBEA8MSffmWoNj8JFto3N5AqUDV44 + signingKey: AiP/yP1JWKJvZrxLMA9nnOwvRS8fF3x4ULqipTr6QXI0Zz3Vy90Mqrh05XKzMvN0tf1da7p2NsJHnPSFSpBUcQ== + encryptionKey: MIIEogIBAAKCAQEApCTKugLFti+G1B0hEARjyJPzq/tBe92EJVsY1zCgejBf8AGYu63hfirerSRaHXHbwicuDiQguBE3JiDHsaw213H2TfYNh0QVogVSHaOT8v9Gsd+rjrN24IQT496FUb2g+EEM6/1OgmxjCbmJMUKQgEBIMeciKXr7TIMhKXL6927smOBB39dKqiMxjT3FgKkw+mZFbFgXtTKdjEHQlFF7NC+ht3enN8aesb2O1RDfjf9bVWywrqzITk/fC8OS5k7Is0UZUcKpK7VUasDe6/1jqTfWW0nL+NK14w5GUtAV0j2PY44gdmhAMMdrn0ejR+r2uO8ARpsjyssqd56VKN2c1QIDAQABAoIBABCs9DOFiJSDq4ztEKjR6Vk9PqogMnzk+kHZSWLDO+pt87EsWFnoxlnM/SZV5RnMsWi+Fj21ieVpSlMDTYZNWpz0pPMyphkx34jARaFhNuye5o23jXRH4zHX+TVTK/Qr8aiG40suRsWVQVKBmOB6RLfiz/LR6nSQW+tf/wR4++obHxyikuT4BltgxRHJBS7jSElZ8e2ZAvV7UyWe+72+EF7UPxh5mOe2oE2IhUWFZFHxkf15Z1adfidfGM6PK6GjvaIVLOt4NuQmI/uqDLakz5by8DBhPiSWbQlE4eJ+b7YAyCfv1hG3oZ/M1k0yZYmWlCD5ukn//+cgBvqaVHvFDpkCgYEA1IZ6zw18Wy+TrJizTydnoLya8WCLp+UrwNQSQPC7tIIRtoB/BYs9gh5ecG7C6tPAdmnRGeJFWaLzyCDkGMlXtM9qnA0KFl3fmmXhsYtPqlBRtLR/emrXIEZrylj8WEmFOEbpkHC42LttD06lpe6OUnWvQydoIG09zFYFOzbySlMCgYEAxbiqhdVlV8cvwv3/AWMohprB5bZTmwLsdhk6gWJ1Ue1iDhl97EsfEOF4Y0zm6oZ/CAYB/RMeu3WO/Y2/erJ7mrPWOKYcEXG+9YwPiGaKkl5C+5y8/qm4xdcBQfC9ldY3X3dilQmyC0b27M8Hi9hla0wFZmOhD4yeIL2n1/rvJzcCgYA0Dcw+sprm6rxM5gnlNU2YfRmmTXNnaCZTUJ438b7H86PLA6YZAYXLPQz8lOSBB+R4HGru4BEEZ3k2Z3f26jnlO3htSHRUDiIaeyHQjsKwgIPCswMWRNz0NstoAGuuZDORGS1UB4f+7clEmorQHaIWaGTJGfnTF26vgdI+MrMdqQKBgBjBzKhBVhUtna9eumVkExj3m7u1nrZUIWOQOSEmQOZnQNXfH0NNDLDCap6UbH2FJbbNecZEdJ6oU6Uv8H/ehVeTmQky02TjxzNbvD4qCMPXBbAXqhqBCd/L0h59lF+EmR5dBnz+38pFsnloWtuJ1vkeZbayVuJpiwsydCe5BeT1AoGASfF5izXCmHYXkVwk+8qzJ70cWmtslBwgbvamK9xegRYuIMzIyLFJWsvJwRTCz/IJ2faOcyHQKRVIkQ6RAzOnT+JqalrBe36zAGS+ozWtTLXOXc5iAyEVPHdRUUmWFLLfijH4lmdxpOHR1IGNX474kvThatgiyHSJHtgHuiPLIz4= +mongo: + connect: mongodb://localhost:27017/?w=majority + database: consensus + logCollection: log diff --git a/etc/configs/node1.yml b/etc/configs/node1.yml new file mode 100755 index 00000000..e9a88618 --- /dev/null +++ b/etc/configs/node1.yml @@ -0,0 +1,31 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4430 + tls: false +account: + peerId: 12D3KooWFVGSu8MfoUnPmUGPpJKNpxaM7mezZ98V1ERGEQbTWjnE + signingKey: b3+g3PNCtwX4YCLd+hTmqjub8R4yxCJJ9J7DJHgCw2hUQZ3tjkCDiuSfsdf2O//9jk81gVQ5ky8AHUpIxpGmzw== + encryptionKey: MIIEpAIBAAKCAQEAwDr0KIpH00tfbebj7FDGNbBWIBWxXdwD6M+P3DeAnHUkgK3kgOzkPGvI6gG7h+VzuqcSY566kgvykNd4WdBD0AUmijFi9sKbgw/TplXj2as5V84hwsAcx/DADMQqD14F/GFw54IALhaQhItYJO4eaxKspuxdrVRhJI91b3hRqlLBYgA15M4fYcoHaLSkoHTXuht2vC0qzFniXmJnR7sy2Z4qinTjGwsIo7bR42SjsBnvxx/50sowOAKQ2xjr3G7rBA3YHPxgTG6rWa4+QZabQelaKZaiMIow4ytEggRgFI/ooyvFDPy75XAQooAJCT4CfU3xv3cs3GteYrYlqyhzRwIDAQABAoIBAQCdqDxTe4YI/4pW4sUQLfdCVUttqRz889Oo/4LnhAXRTCoR94yvSJqwC16OvbkGbeOKtDfayHYQDgh1TqMAVlUnqPHA6VxXMajFxxc5Frx2631uTDtYNKPmP8fjMIembuDN60TkOrTXF96TNo2mTD1aZ8h+ZuE1pTy+9YHFWJLx8tvaQ4XcHNDHPuGT/HxeXqD7/COmmoxUMFccasfwlmPtb4uSHDmPl0bzFbhWholf138L/M27Nu8PMCFN6Et73gTdQar2YkAR3NTLDsXtMAEEgmOTI1cjg5nw5E8M3luloR7UoBfDybhnYpN2FEG9nrpSiJyglkF2PBKbvlvfvaLRAoGBAPR5c4NORx5aXCjOj2b15T/S2yFvFejciCHqljvFfe3W7ys5s1oMQlidIAIlQlEYBigjZQMQ3BRegGorlv/DI6B7cdw3JWIiqrfxls3K5guY8SRA7nYJnTozKnwdcJYldE96yG34yL1w6mKEgNDHhu5Xm+dBssO71Jg5LaDOQTD9AoGBAMlK+Iuv8DqXgVX92+RoULVkQAomeSNT3QOrtpVSaOnQOqWnHasaYdF6VM1NkOy05cRdf7nD4TNIMKNsQkGUojpG48lpd9IRldC3CDjmrqojgm0mYNpmQfj2NwWPgJyBrw1VPVc7XX76g41J9XdnAW0XU5H8qa5/8Tcn0tbjIDqTAoGBAJ0AglaJJtMvZJAwV5ffwuJCH8hQ9tkdB7AAX4rzQfREXER+QdhKlzEhdzTpiLVboFiWooBdi3jpV77XT5nhUDf4Dx9FqxRi/xAybo6rByHbjsGhkYLsmbSOt3IN1ggW9aM1TxKQ+xnuMhgi0DdEbDsUuGLDpnJdZiJ8Vfk3fFZhAoGAPMik0Rmpwyeo6Jyl4A0YAg5pwCbqAZ77aHZbxi+CeshkTU1vihGHZEg6f1xi3PerQmaxgRkDUgcEmPTB9Se67Tom4tU0V3zz7ni2xOfz6nCam/cw3AJw/YrsBoPU5G3MvIv23/aPPx7KxsmElC/IoHagx76yRn1gC7W81yLywn0CgYBiHYiEIS0DHXkjTNHV7oAyxdQN2SJ22Zu/6N1cP2sXVirss6JEKEHTzvVT1+qtTHxGyliyJaTiP4+ujNAJS0g6/U0F3v9Nba0/uGPLCI9FaYRxyMgNZAKTtImauMuSmaS93kgsz1Xm8CJhTJwvQaD5EHP4UqVe70G4UwwH10tS9w== +apiServer: + port: "8080" +nodes: + - peerId: 12D3KooWFVGSu8MfoUnPmUGPpJKNpxaM7mezZ98V1ERGEQbTWjnE + address: 127.0.0.1:4430 + - peerId: 12D3KooWMPgKGCLtNkmANzwHAnymEMCggS6csXuDroUFqb63FizD + address: 127.0.0.1:4431 + - peerId: 12D3KooWG7bXBK1NdyyWT4bnGUQjbe9kpVzsZSm97MQVR13zRx4M + address: 127.0.0.1:4432 + - peerId: 12D3KooWKZcPNMmMqi6PZFjUkZqrFXXUYLpzoHBjbHLPojkuj4xp + address: 127.0.0.1:4530 + isConsensus: true + - peerId: 12D3KooWGVroVVTuhc7GcnYZ3T9RmvuB4LWwqQRgvEMWQWPQqTy8 + address: 127.0.0.1:4531 + isConsensus: true + - peerId: 12D3KooWDLvgBnuUnuLea8QZBEA8MSffmWoNj8JFto3N5AqUDV44 + address: 127.0.0.1:4532 + isConsensus: true +space: + gcTTL: 60 + syncPeriod: 10 diff --git a/etc/configs/node2.yml b/etc/configs/node2.yml new file mode 100755 index 00000000..e7d634c7 --- /dev/null +++ b/etc/configs/node2.yml @@ -0,0 +1,31 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4431 + tls: false +account: + peerId: 12D3KooWMPgKGCLtNkmANzwHAnymEMCggS6csXuDroUFqb63FizD + signingKey: TBi1TxcOr6kB5Wp+MQMH2m2jgNu1Un120H5aKw5Gybmr+T3auW8EL/4T5nsO0priJYMg5oki18E3AwCdOpjUqg== + encryptionKey: MIIEpQIBAAKCAQEA40ciap1GvcPsgBo/IAVcpR9KK2fTEKwUs/KCB1Y3nIKTeJSDRKOtQD8TyegiB9VEzWscRPz4sxCCuIfwuuErSl4fchMdClsFC8GYGoCN8KvGcwUoFODdWaUh3garg+TqGPARe40Re6+thR4wpAFQbLeYkaM5MUWxcWf6XgMv0RD04IMwkDvZkDDR8BEP5T6aGC0FLzrqtH8YGSoAoA/IsofjIhB27QO60p6ygY0W9fHWojha6Rxi031HhnVud9wDXiBIk41RHUFxzHJF9bANF1uwJQbAVOF3PBLN4sCwrTtMt+WF832F4UBMKvxqWL5YX49iC3QqOM8N8NXvThkoHQIDAQABAoIBAQDOnMpC1buLo+MKCdI9D+LLEYjhsL8FtwoTFHD0roJbu7DIu2oiKhHECBO7R1Y4fL7RZ4AJj1efoXDUxHAp060BLFO15n5N/bS2nUXjQd7HXcFIqvVnFYzkg+Qn7TRa8O2HwiaChRnRsUEzdOCPF8q/KqB+NT429r569CV89bSwft0B0AfDs0mEjGUH9NxBI9YliA7NsjTVAi8wCIU5HDfGwJddcM7NwAeftXQlguwPm4IAFh+7rMBsUAJiIyXSRGWjknF4OcxN0qYwBdPlHCqr2ty2uN9cUnkelxtmQqK5pywUEoCL0JTqSdNRtTI8qcmSlm6Vk9VFAPnHiEeMvgnZAoGBAOqPAqlz4FRj8OFba+5dsOKkUR7xzgv4tkcyDbWT2qZeWy8aUbrTp+DQjr8X7QNIVMPPagi/Hdpdu8b/Nj2BL0jDJuECDsa0/P1QVCjbqdy9aneUrocX7+O2O6HGmtg/376bWVXH60VsPI3ZX0KtgyQQqPO+JViD6IDn0Do3Jf+bAoGBAPgNvoif2t27f/Kxdd915s2BxXxBA1yri+Kjr1yUoKfWaWaMcwxfAf05+jWOA+4GzTexR/VB8WskXMNIvNu1DTzItb/4Ojn4nx6LT7VuT8lzCcD1G8HmVhdqX7Ogv+kQQMuWBtgvjdBzXro4uV5aB1BognIigCBp12wpcBFh5d6nAoGBAM51ruwk2PKvPZm/dNNNmKMF63mHccxL0XX9ct+/ExiZuT1Ot13xa7WRHfTKRI89HY91hGnKf6Z0FxLkFYQxr8MmM5Se0Q7KxFzcVhfYsj1gZNR5BN5YjYksIHUXcbijEHigGRROcqKa0PoyuYzhWatnFq/lUM4G3aKJaVm0rTe9AoGBANcIqyyrT0O64E8WkfV2su9iWT2+6lgyimCdv06FtcPptpNkm/OUhRftY797bmKw2MQ31gaB9PQJoLTV4IqiKGiSIiTZ3jgVFHOZFy9UAqzDIih5E2gC8oz39SC18MftBA647xQIHWsgKHVM6T0m1IJbJwIkcGgo+MvWHEWlVW2vAoGAOF95zv96d2HseG/TtHdPjmNSpLAL+42cGIl/xlzJdF/VVx8kO6T+Bf4YW9PReLq8pErVFqMHPjumY5+vuFs+GX+eR0cJbQI+dQ9DyFk8fVL1QkHvvnhiS06GRK4MD6waEX7KkeD5N1RM6t2d4fWowxcbQYqt6IV4kVNTK2x06Qo= +apiServer: + port: "8081" +nodes: + - peerId: 12D3KooWFVGSu8MfoUnPmUGPpJKNpxaM7mezZ98V1ERGEQbTWjnE + address: 127.0.0.1:4430 + - peerId: 12D3KooWMPgKGCLtNkmANzwHAnymEMCggS6csXuDroUFqb63FizD + address: 127.0.0.1:4431 + - peerId: 12D3KooWG7bXBK1NdyyWT4bnGUQjbe9kpVzsZSm97MQVR13zRx4M + address: 127.0.0.1:4432 + - peerId: 12D3KooWKZcPNMmMqi6PZFjUkZqrFXXUYLpzoHBjbHLPojkuj4xp + address: 127.0.0.1:4530 + isConsensus: true + - peerId: 12D3KooWGVroVVTuhc7GcnYZ3T9RmvuB4LWwqQRgvEMWQWPQqTy8 + address: 127.0.0.1:4531 + isConsensus: true + - peerId: 12D3KooWDLvgBnuUnuLea8QZBEA8MSffmWoNj8JFto3N5AqUDV44 + address: 127.0.0.1:4532 + isConsensus: true +space: + gcTTL: 60 + syncPeriod: 10 diff --git a/etc/configs/node3.yml b/etc/configs/node3.yml new file mode 100755 index 00000000..975cf31a --- /dev/null +++ b/etc/configs/node3.yml @@ -0,0 +1,31 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4432 + tls: false +account: + peerId: 12D3KooWG7bXBK1NdyyWT4bnGUQjbe9kpVzsZSm97MQVR13zRx4M + signingKey: dm6xzcZCMOEs7h8dOJgMqcFB+EyZMXBjjOFzAqg7GeldkBfDFG75NB1gVc25MhokEeScnh8WAWEvy4YUikPJDg== + encryptionKey: MIIEpQIBAAKCAQEA7habKY4w6fYFTneChju1kFG999EeZG1bXQlNbeV9Wbsg4Hy1FDlZUNf7QxQDxCKGnSHLySt/FOdQvp007WcLIefwgaIr3vJQn1/QBKiYiKytE4qURMwum52FHAtw0Xnd8TjKPynei9boEx5nQ8wRA786sh1BLd9oWg/WZgZZ8fwMZDQTWSdn7bQh5fQcuvnd4MQD4A63JQ+0JitF8g9tLzH5n2IvbicXjkvY31rhf4lo8XeHtkKEkerxhBUm4Q3G0hiCD0xmQqBSNeaRa5dqxplFJmWxyvJM87ugsRFlntHEVpHjnhI8ZLRf/4wDlXqYCQ3pI0V5dSdI2vL2Lynx6QIDAQABAoIBAQC1XylChdyDTnSKawZWxcOxtmOWFosljB0uibifgFR2d9Q6zyWOy4VbzbzOQ7/+uSJ9L1Kz5FvCC9j57H52X6oeYTdZObZb95ItZurrsZfJfmm22jnLExRqXZwaWijOmxzU9yMy7O1o8AUJE38tKZbImPPY3epaTLeM7EWyoSIB8T0G4J99oZBGmjsuUtAVUDzpfuvAmqs8/tSzzOW47HgxCZJJLdmQeiCEwBmKyeMcI5iUfxDFZcTB2yReDNPPWzrkn6HybwtN8f114TvV1sEZpozcnJrhB8bxF34HKEC15j/iXlobH90YvKIdVAOJDGjMJZcQc5B8UkfHeSqf6b+BAoGBAP/4K8ZzwVKU80pbN54ExpoUD5k8L6SREUIjUSpecJ76bdDtbZij2rJ6D9pPKLr5PVEMVtbpcIOY4FBpsWhzkcZ2LW9w7p27DMXAm9jcf15w/WZJAIr5D46qBMAP4hvBm5adsii6HJLBauGz7sLz2uRnQCHQaknLo24mltZ3nP6RAoGBAO4d42ENPusmatInr0oA52jlC/h6yUFLCBoziU2JYm0kNcwVzmeIIIxH5yZtL9viwuNUoZQzWIM6dgxVFyb5qO3QHTqYAL9xgVkxMpyrSHBCwuJxcH8oDu8UH2UDVmna4PUdSc8tpQtAKPGKWdWTOG5G9Fu4BbcwCT7dcCWjmhnZAoGBAOtk4XTuTNHSEu7Fdh9GixF082dbFwFDO1jUO7c4BF/fM5BYWFpwDRXm9J8x/uX7gW0AaPfY09ThiR/KIxFIfr3BPkVm2LmLI9LULz4+gI9sX0xqRCqJosnzBs1NjgUyhg/707Rqew5m+xC3NRJpyVoUrcCq9qQItrH8oOh4NZNRAoGBAN7rKDVxmxe17Yc1E8tqMTpoQ96pxMPVpI4y9TWbioO2xI59U7BlJmNt5R56VbW7AsykLGh78T9Zea5t8rDQRa/th4+VQg34Cyoe/szhJX3DYoNvw+um6uQzqHh+uWV8PeH7O2Az0TFJLYuDBDsICmpjDtzW2LL4y48I67axBNFxAoGAHIn7/XyHYzkCilSDa1BG9TMYErdCehhVjlqFJ2rvQNnQN6NOfFvln3YN0dHxrKNmUzMsn9ZcV/36AIOgEmHeLVD0KUB50MCwBPtcbGN053rXbqx8AQUkPA7/+ERXiLcEELftFn37NXDv4Wj51w92tnUwke80J4lDos87Nx91w70= +apiServer: + port: "8082" +nodes: + - peerId: 12D3KooWFVGSu8MfoUnPmUGPpJKNpxaM7mezZ98V1ERGEQbTWjnE + address: 127.0.0.1:4430 + - peerId: 12D3KooWMPgKGCLtNkmANzwHAnymEMCggS6csXuDroUFqb63FizD + address: 127.0.0.1:4431 + - peerId: 12D3KooWG7bXBK1NdyyWT4bnGUQjbe9kpVzsZSm97MQVR13zRx4M + address: 127.0.0.1:4432 + - peerId: 12D3KooWKZcPNMmMqi6PZFjUkZqrFXXUYLpzoHBjbHLPojkuj4xp + address: 127.0.0.1:4530 + isConsensus: true + - peerId: 12D3KooWGVroVVTuhc7GcnYZ3T9RmvuB4LWwqQRgvEMWQWPQqTy8 + address: 127.0.0.1:4531 + isConsensus: true + - peerId: 12D3KooWDLvgBnuUnuLea8QZBEA8MSffmWoNj8JFto3N5AqUDV44 + address: 127.0.0.1:4532 + isConsensus: true +space: + gcTTL: 60 + syncPeriod: 10 From 9930db8dc71f27a2cafb4bfefb7e62dcfb7421fe Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Tue, 4 Oct 2022 16:40:40 +0300 Subject: [PATCH 117/219] ignore consensus nodes in configuratrion --- common/nodeconf/service.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/common/nodeconf/service.go b/common/nodeconf/service.go index d78aab4d..00fc6a7d 100644 --- a/common/nodeconf/service.go +++ b/common/nodeconf/service.go @@ -64,9 +64,9 @@ func (s *service) Init(a *app.App) (err error) { }); err != nil { return } - members := make([]chash.Member, 0, len(conf.Nodes)-1) + members := make([]chash.Member, 0, len(conf.Nodes)) for _, n := range conf.Nodes { - if n.PeerId == conf.Account.PeerId { + if n.IsConsensus { continue } var member *Node @@ -74,7 +74,6 @@ func (s *service) Init(a *app.App) (err error) { if err != nil { return } - members = append(members, member) } if err = config.chash.AddMembers(members...); err != nil { From b59cc28dc5ebcbc38e99a13f52a34d6bd3a0b22e Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Tue, 4 Oct 2022 17:55:30 +0300 Subject: [PATCH 118/219] consensus client --- common/nodeconf/service.go | 9 ++- consensus/consensusclient/client.go | 93 ++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/common/nodeconf/service.go b/common/nodeconf/service.go index 00fc6a7d..cc80e288 100644 --- a/common/nodeconf/service.go +++ b/common/nodeconf/service.go @@ -23,6 +23,7 @@ var log = logger.NewNamed(CName) type Service interface { GetLast() Configuration GetById(id string) Configuration + ConsensusPeers() []string app.Component } @@ -30,7 +31,8 @@ type service struct { accountId string pool pool.Pool - last Configuration + consensusPeers []string + last Configuration } type Node struct { @@ -67,6 +69,7 @@ func (s *service) Init(a *app.App) (err error) { members := make([]chash.Member, 0, len(conf.Nodes)) for _, n := range conf.Nodes { if n.IsConsensus { + s.consensusPeers = append(s.consensusPeers, n.PeerId) continue } var member *Node @@ -96,6 +99,10 @@ func (s *service) GetById(id string) Configuration { panic("implement me") } +func (s *service) ConsensusPeers() []string { + return s.consensusPeers +} + func nodeFromConfigNode( n config.Node) (*Node, error) { decodedSigningKey, err := keys.DecodeKeyFromString( diff --git a/consensus/consensusclient/client.go b/consensus/consensusclient/client.go index 59cf8499..df277ca5 100644 --- a/consensus/consensusclient/client.go +++ b/consensus/consensusclient/client.go @@ -1,12 +1,103 @@ package consensusclient -import "github.com/anytypeio/go-anytype-infrastructure-experiments/app" +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" + "go.uber.org/zap" + "math/rand" + "sync" +) const CName = "consensus.client" +var log = logger.NewNamed(CName) + +func New() Service { + return new(service) +} + type Service interface { + AddLog(ctx context.Context, clog *consensusproto.Log) (err error) + AddRecord(ctx context.Context, logId []byte, clog *consensusproto.Record) (err error) + WatchLog(ctx context.Context, logId []byte) (stream consensusproto.DRPCConsensus_WatchLogClient, err error) app.Component } type service struct { + pool pool.Pool + nodeconf nodeconf.Service + client consensusproto.DRPCConsensusClient + mu sync.Mutex +} + +func (s *service) Init(a *app.App) (err error) { + s.pool = a.MustComponent(pool.CName).(pool.Pool) + s.nodeconf = a.MustComponent(nodeconf.CName).(nodeconf.Service) + return nil +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) getClient(ctx context.Context) (consensusproto.DRPCConsensusClient, error) { + s.mu.Lock() + defer s.mu.Unlock() + if s.client != nil { + return s.client, nil + } + peers := s.nodeconf.ConsensusPeers() + rand.Shuffle(len(peers), func(i, j int) { + peers[i], peers[j] = peers[j], peers[i] + }) + + for _, peerId := range peers { + peer, err := s.pool.Get(ctx, peerId) + if err != nil { + log.Warn("can't connect to peer", zap.String("peerId", peerId), zap.Error(err)) + continue + } else { + s.client = consensusproto.NewDRPCConsensusClient(peer) + return s.client, nil + } + } + return nil, fmt.Errorf("unable to connect any consensus node") +} + +func (s *service) AddLog(ctx context.Context, clog *consensusproto.Log) (err error) { + cl, err := s.getClient(ctx) + if err != nil { + return + } + _, err = cl.AddLog(ctx, &consensusproto.AddLogRequest{ + Log: clog, + }) + return +} + +func (s *service) AddRecord(ctx context.Context, logId []byte, clog *consensusproto.Record) (err error) { + cl, err := s.getClient(ctx) + if err != nil { + return + } + _, err = cl.AddRecord(ctx, &consensusproto.AddRecordRequest{ + LogId: logId, + Record: clog, + }) + return +} + +func (s *service) WatchLog(ctx context.Context, logId []byte) (stream consensusproto.DRPCConsensus_WatchLogClient, err error) { + cl, err := s.getClient(ctx) + if err != nil { + return + } + return cl.WatchLog(ctx, &consensusproto.WatchLogRequest{ + LogId: logId, + }) } From 9f16e7c272f28f906b323f4f400151b3a3de0737 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Wed, 5 Oct 2022 11:41:48 +0300 Subject: [PATCH 119/219] pool.Dial* methods + consesus test client --- cmd/consensusnode/consensusnode.go | 1 + .../testclient/consensustestclient.go | 260 ++++++++++++++++++ cmd/nodesgen/gen.go | 14 +- common/net/pool/pool.go | 29 +- consensus/consensusclient/client.go | 56 ++-- consensus/consensusrpc/consensrpc.go | 1 + etc/configs/cons1.yml | 6 +- etc/configs/cons2.yml | 6 +- etc/configs/cons3.yml | 6 +- etc/configs/node1.yml | 30 +- etc/configs/node2.yml | 30 +- etc/configs/node3.yml | 30 +- 12 files changed, 394 insertions(+), 75 deletions(-) create mode 100644 cmd/consensusnode/testclient/consensustestclient.go diff --git a/cmd/consensusnode/consensusnode.go b/cmd/consensusnode/consensusnode.go index 0a563755..2e804d35 100644 --- a/cmd/consensusnode/consensusnode.go +++ b/cmd/consensusnode/consensusnode.go @@ -15,6 +15,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/node/account" "go.uber.org/zap" "net/http" + _ "net/http/pprof" "os" "os/signal" "syscall" diff --git a/cmd/consensusnode/testclient/consensustestclient.go b/cmd/consensusnode/testclient/consensustestclient.go new file mode 100644 index 00000000..c0301b8b --- /dev/null +++ b/cmd/consensusnode/testclient/consensustestclient.go @@ -0,0 +1,260 @@ +package main + +import ( + "context" + "flag" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserrs" + "github.com/anytypeio/go-anytype-infrastructure-experiments/node/account" + "go.uber.org/zap" + "gopkg.in/mgo.v2/bson" + "net/http" + _ "net/http/pprof" + "os" + "os/signal" + "syscall" + "time" +) + +var log = logger.NewNamed("main") + +var ( + flagConfigFile = flag.String("c", "etc/consensus-config.yml", "path to config file") + flagVersion = flag.Bool("v", false, "show version and exit") + flagHelp = flag.Bool("h", false, "show help and exit") +) + +func main() { + flag.Parse() + + if *flagVersion { + fmt.Println(app.VersionDescription()) + return + } + if *flagHelp { + flag.PrintDefaults() + return + } + + if debug, ok := os.LookupEnv("ANYPROF"); ok && debug != "" { + go func() { + http.ListenAndServe(debug, nil) + }() + } + + // create app + ctx := context.Background() + a := new(app.App) + + // open config file + conf, err := config.NewFromFile(*flagConfigFile) + if err != nil { + log.Fatal("can't open config file", zap.Error(err)) + } + + // bootstrap components + a.Register(conf) + Bootstrap(a) + + // start app + if err := a.Start(ctx); err != nil { + log.Fatal("can't start app", zap.Error(err)) + } + log.Info("app started", zap.String("version", a.Version())) + + if err := testClient(a.MustComponent(consensusclient.CName).(consensusclient.Service)); err != nil { + log.Fatal("test error", zap.Error(err)) + } else { + log.Info("test success!") + } + + // wait exit signal + exit := make(chan os.Signal, 1) + signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT) + sig := <-exit + log.Info("received exit signal, stop app...", zap.String("signal", fmt.Sprint(sig))) + + // close app + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + if err := a.Close(ctx); err != nil { + log.Fatal("close error", zap.Error(err)) + } else { + log.Info("goodbye!") + } + time.Sleep(time.Second / 3) +} + +func Bootstrap(a *app.App) { + a.Register(account.New()). + Register(secure.New()). + Register(nodeconf.New()). + Register(dialer.New()). + Register(pool.New()). + Register(consensusclient.New()) +} + +func testClient(service consensusclient.Service) (err error) { + if err = testCreateLogAndRecord(service); err != nil { + return err + } + if err = testStream(service); err != nil { + return err + } + return +} + +func testCreateLogAndRecord(service consensusclient.Service) (err error) { + ctx := context.Background() + + // create log + newLogId := []byte(bson.NewObjectId()) + st := time.Now() + lastRecId := []byte(bson.NewObjectId()) + err = service.AddLog(ctx, &consensusproto.Log{ + Id: newLogId, + Records: []*consensusproto.Record{ + { + Id: lastRecId, + Payload: []byte("test"), + CreatedUnix: uint64(time.Now().Unix()), + }, + }, + }) + if err != nil { + return err + } + log.Info("log created", zap.String("id", bson.ObjectId(newLogId).Hex()), zap.Duration("dur", time.Since(st))) + + // create log with same id + st = time.Now() + + err = service.AddLog(ctx, &consensusproto.Log{ + Id: newLogId, + Records: []*consensusproto.Record{ + { + Id: lastRecId, + Payload: []byte("test"), + CreatedUnix: uint64(time.Now().Unix()), + }, + }, + }) + if err != consensuserrs.ErrLogExists { + return fmt.Errorf("unexpected error: '%v' want LogExists", zap.Error(err)) + } + err = nil + log.Info("log duplicate checked", zap.Duration("dur", time.Since(st))) + + // create record + st = time.Now() + recId := []byte(bson.NewObjectId()) + err = service.AddRecord(ctx, newLogId, &consensusproto.Record{ + Id: []byte(bson.NewObjectId()), + PrevId: lastRecId, + CreatedUnix: uint64(time.Now().Unix()), + }) + if err != nil { + return err + } + lastRecId = recId + log.Info("record created", zap.String("id", bson.ObjectId(lastRecId).Hex()), zap.Duration("dur", time.Since(st))) + + // record conflict + st = time.Now() + err = service.AddRecord(ctx, newLogId, &consensusproto.Record{ + Id: []byte(bson.NewObjectId()), + PrevId: []byte(bson.NewObjectId()), + CreatedUnix: uint64(time.Now().Unix()), + }) + if err != consensuserrs.ErrConflict { + return fmt.Errorf("unexpected error: '%v' want Conflict", zap.Error(err)) + } + err = nil + log.Info("conflict record checked", zap.Duration("dur", time.Since(st))) + + return +} + +func testStream(service consensusclient.Service) (err error) { + ctx := context.Background() + + // create log + newLogId := []byte(bson.NewObjectId()) + st := time.Now() + lastRecId := []byte(bson.NewObjectId()) + err = service.AddLog(ctx, &consensusproto.Log{ + Id: newLogId, + Records: []*consensusproto.Record{ + { + Id: lastRecId, + Payload: []byte("test"), + CreatedUnix: uint64(time.Now().Unix()), + }, + }, + }) + if err != nil { + return err + } + log.Info("log created", zap.String("id", bson.ObjectId(newLogId).Hex()), zap.Duration("dur", time.Since(st))) + + stream, err := service.WatchLog(ctx, newLogId) + if err != nil { + return err + } + defer stream.Close() + sr := readStream(stream) + for i := 0; i < 10; i++ { + st = time.Now() + recId := []byte(bson.NewObjectId()) + err = service.AddRecord(ctx, newLogId, &consensusproto.Record{ + Id: recId, + PrevId: lastRecId, + CreatedUnix: uint64(time.Now().Unix()), + }) + if err != nil { + return err + } + lastRecId = recId + log.Info("record created", zap.String("id", bson.ObjectId(lastRecId).Hex()), zap.Duration("dur", time.Since(st))) + } + fmt.Println(sr.log.Records) + return nil +} + +func readStream(stream consensusproto.DRPCConsensus_WatchLogClient) *streamReader { + sr := &streamReader{stream: stream} + go sr.read() + return sr +} + +type streamReader struct { + stream consensusproto.DRPCConsensus_WatchLogClient + log *consensusproto.Log +} + +func (sr *streamReader) read() { + for { + event, err := sr.stream.Recv() + if err != nil { + return + } + fmt.Println("received event", event) + if sr.log == nil { + sr.log = &consensusproto.Log{ + Id: event.LogId, + Records: event.Records, + } + } else { + sr.log.Records = append(event.Records, sr.log.Records...) + } + } +} diff --git a/cmd/nodesgen/gen.go b/cmd/nodesgen/gen.go index 5dcb42fa..51db1459 100644 --- a/cmd/nodesgen/gen.go +++ b/cmd/nodesgen/gen.go @@ -52,8 +52,10 @@ func main() { configs = append(configs, cfg) node := config.Node{ - PeerId: cfg.Account.PeerId, - Address: cfg.GrpcServer.ListenAddrs[0], + PeerId: cfg.Account.PeerId, + Address: cfg.GrpcServer.ListenAddrs[0], + SigningKey: cfg.Account.SigningKey, + EncryptionKey: cfg.Account.EncryptionKey, } nodes = append(nodes, node) } @@ -67,9 +69,11 @@ func main() { consConfigs = append(consConfigs, cfg) node := config.Node{ - PeerId: cfg.Account.PeerId, - Address: cfg.GrpcServer.ListenAddrs[0], - IsConsensus: true, + PeerId: cfg.Account.PeerId, + Address: cfg.GrpcServer.ListenAddrs[0], + SigningKey: cfg.Account.SigningKey, + EncryptionKey: cfg.Account.EncryptionKey, + IsConsensus: true, } nodes = append(nodes, node) } diff --git a/common/net/pool/pool.go b/common/net/pool/pool.go index d4e21bf4..4b7c4c45 100644 --- a/common/net/pool/pool.go +++ b/common/net/pool/pool.go @@ -30,21 +30,26 @@ func New() Pool { type Pool interface { // Get lookups to peer in existing connections or creates and cache new one Get(ctx context.Context, id string) (peer.Peer, error) + // Dial creates new connection to peer and not use cache + Dial(ctx context.Context, id string) (peer.Peer, error) // GetOneOf searches at least one existing connection in cache or creates a new one from a randomly selected id from given list GetOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) + DialOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) + app.ComponentRunnable } type pool struct { - cache ocache.OCache + cache ocache.OCache + dialer dialer.Dialer } func (p *pool) Init(a *app.App) (err error) { - dialer := a.MustComponent(dialer.CName).(dialer.Dialer) + p.dialer = a.MustComponent(dialer.CName).(dialer.Dialer) p.cache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { - return dialer.Dial(ctx, id) + return p.dialer.Dial(ctx, id) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), @@ -77,6 +82,10 @@ func (p *pool) Get(ctx context.Context, id string) (peer.Peer, error) { return p.Get(ctx, id) } +func (p *pool) Dial(ctx context.Context, id string) (peer.Peer, error) { + return p.dialer.Dial(ctx, id) +} + func (p *pool) GetOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) { // finding existing connection for _, peerId := range peerIds { @@ -102,6 +111,20 @@ func (p *pool) GetOneOf(ctx context.Context, peerIds []string) (peer.Peer, error return nil, ErrUnableToConnect } +func (p *pool) DialOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) { + // shuffle ids for better consistency + rand.Shuffle(len(peerIds), func(i, j int) { + peerIds[i], peerIds[j] = peerIds[j], peerIds[i] + }) + // connecting + for _, peerId := range peerIds { + if v, err := p.dialer.Dial(ctx, peerId); err == nil { + return v.(peer.Peer), nil + } + } + return nil, ErrUnableToConnect +} + func (p *pool) Close(ctx context.Context) (err error) { return p.cache.Close() } diff --git a/consensus/consensusclient/client.go b/consensus/consensusclient/client.go index df277ca5..0344734b 100644 --- a/consensus/consensusclient/client.go +++ b/consensus/consensusclient/client.go @@ -2,15 +2,12 @@ package consensusclient import ( "context" - "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" + "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/consensus/consensusproto" - "go.uber.org/zap" - "math/rand" - "sync" ) const CName = "consensus.client" @@ -31,8 +28,6 @@ type Service interface { type service struct { pool pool.Pool nodeconf nodeconf.Service - client consensusproto.DRPCConsensusClient - mu sync.Mutex } func (s *service) Init(a *app.App) (err error) { @@ -46,27 +41,19 @@ func (s *service) Name() (name string) { } func (s *service) getClient(ctx context.Context) (consensusproto.DRPCConsensusClient, error) { - s.mu.Lock() - defer s.mu.Unlock() - if s.client != nil { - return s.client, nil + peer, err := s.pool.GetOneOf(ctx, s.nodeconf.ConsensusPeers()) + if err != nil { + return nil, err } - peers := s.nodeconf.ConsensusPeers() - rand.Shuffle(len(peers), func(i, j int) { - peers[i], peers[j] = peers[j], peers[i] - }) + return consensusproto.NewDRPCConsensusClient(peer), nil +} - for _, peerId := range peers { - peer, err := s.pool.Get(ctx, peerId) - if err != nil { - log.Warn("can't connect to peer", zap.String("peerId", peerId), zap.Error(err)) - continue - } else { - s.client = consensusproto.NewDRPCConsensusClient(peer) - return s.client, nil - } +func (s *service) dialClient(ctx context.Context) (consensusproto.DRPCConsensusClient, error) { + peer, err := s.pool.DialOneOf(ctx, s.nodeconf.ConsensusPeers()) + if err != nil { + return nil, err } - return nil, fmt.Errorf("unable to connect any consensus node") + return consensusproto.NewDRPCConsensusClient(peer), nil } func (s *service) AddLog(ctx context.Context, clog *consensusproto.Log) (err error) { @@ -74,9 +61,11 @@ func (s *service) AddLog(ctx context.Context, clog *consensusproto.Log) (err err if err != nil { return } - _, err = cl.AddLog(ctx, &consensusproto.AddLogRequest{ + if _, err = cl.AddLog(ctx, &consensusproto.AddLogRequest{ Log: clog, - }) + }); err != nil { + return rpcerr.Unwrap(err) + } return } @@ -85,19 +74,24 @@ func (s *service) AddRecord(ctx context.Context, logId []byte, clog *consensuspr if err != nil { return } - _, err = cl.AddRecord(ctx, &consensusproto.AddRecordRequest{ + if _, err = cl.AddRecord(ctx, &consensusproto.AddRecordRequest{ LogId: logId, Record: clog, - }) + }); err != nil { + return rpcerr.Unwrap(err) + } return } func (s *service) WatchLog(ctx context.Context, logId []byte) (stream consensusproto.DRPCConsensus_WatchLogClient, err error) { - cl, err := s.getClient(ctx) + cl, err := s.dialClient(ctx) if err != nil { return } - return cl.WatchLog(ctx, &consensusproto.WatchLogRequest{ + if stream, err = cl.WatchLog(ctx, &consensusproto.WatchLogRequest{ LogId: logId, - }) + }); err != nil { + return nil, rpcerr.Unwrap(err) + } + return } diff --git a/consensus/consensusrpc/consensrpc.go b/consensus/consensusrpc/consensrpc.go index 6d502364..ecf458a7 100644 --- a/consensus/consensusrpc/consensrpc.go +++ b/consensus/consensusrpc/consensrpc.go @@ -61,6 +61,7 @@ func (c *consensusRpc) WatchLog(req *consensusproto.WatchLogRequest, rpcStream c }); err != nil { return err } + logSent = true } else { recs := stream.WaitRecords() if len(recs) == 0 { diff --git a/etc/configs/cons1.yml b/etc/configs/cons1.yml index e75afc05..f77921a0 100755 --- a/etc/configs/cons1.yml +++ b/etc/configs/cons1.yml @@ -3,9 +3,9 @@ grpcServer: - 127.0.0.1:4530 tls: false account: - peerId: 12D3KooWKZcPNMmMqi6PZFjUkZqrFXXUYLpzoHBjbHLPojkuj4xp - signingKey: gnmy5mbz+c/TYLEFCa7dgPei1Z94GNEuj7XYutkAVreQzTur/0eA8JfYkWlIDLIMyzqS3pm4PtxG90/L3lKlQQ== - encryptionKey: MIIEogIBAAKCAQEAuxeAfwwc7aJeecn15nSuunXSUdVsaVsyTdxf7R1mc2Rux0CH7wbX0xL+UZVfMQ7hkPSp7rI4kP5T9iq+9gcMVgU6CjlBBJpv7KbbShRn1+71DqdJpfJYJNCawy8nu3YQrS0i15gOE7Pd5G3PZ44dtW8kh+Tq6qC7Am/e5Cd+CRgOxcBQnRQID5HTe18LF2jsx0CuvH/RUZDDdvtRVmxJYKVyWAXXOEKIn8lgdLM3bf5SzzDI2Mf1x50pLBNFBLD0MQJ8IRQ8S426C8SY1WJfyUzVinqmO/w16R67+Lj4qseE+TTmLprVWUgm3CdxzzrGebGU71QrTQc9TUr6tWDbDwIDAQABAoIBAEJevv3S/Twr2poX1Dzx7b5F59uR+8iQSpMmd301bc/HtCjJMq/P3KaLWV71v3Q21DxJHzOHU9vT7VMprN64d17YsdNIplEMvGHWe3qXLJOEuLh/DfhptW0x94UAaHbvFlFo7rBOx8ejijbr4aTZ3J4tlGcFBXVAmbbumsKTY/mzTH4H5zXDoSw2IVWkRP3UogKK3Jmee0fHm7XW5Ue68P2Bv6wCTfF6RGAZTxlX4x9X27OtZMsVPIooLUiUL7sBXXeqSupYIchc/o4ztv7CslNnGF7b6wc48HBkfcB4aoM/RIAXQG58aWFofMXpYEl7Ulk7FUUMXqlKwOrCcteAkhECgYEAzFIQH94N1+E8edQ6vlMvSXQaJvHYrEhQNWGLecLndYi5XCc0AtvR+wdQnGR+lDu1lbcm3h0e1E/G0LHDxkiJndKLrRD5L1JVOyd7I22dTrUAOYNsshygpqiYyt2CENCmEbz9eXZD0a9klqTEABvQVOdNUM5FXXAk6e/gX6i9PlkCgYEA6mnco9x4TysXv1VERP3RaFBPn21rgkxguXO4Jsi70hZ1NR+4L1aXI1ggKAbsXZ0rmjn5aru59cVvv8msnRRt+u5zFKWX8xpKM96+zZbKhv9XGw22jwmy7Sbx5PB3kFPZ5ud6EeQwNlQJLPqSYgAaL0c2mNkaerAQVtmNj0dmx6cCgYAjy/TbQHI4clPAHHi2Q6izO84hKJoHhRvYXmCrUoRuySeAh7XLEmw1iNCMteafXd6wfkgm/f8av2dbxOlB4g+KQQsLpT+jFM+t73rZeCjpUzjY2re+dNmImV07nZdeDtApp2zZTOkQ4aPD6NYWFslnNqcLEzh/6FfvTIGJAO028QKBgGdmArkUyszBCVyQU+jKvM/yfOyp6z4ySogDDzusV4y380NXlnrrCwfAG48MXr58UXtaDzaRT9mlGUHTx5wSIuEIxSJaWMgW1JxEqI0u8m7Ruq5oQhqeAJqzDwgZOeQj2H4NpL63lLyiHNoGPQOVX/dyxhZtzUxI1Sw6EkMdD60JAoGAJN9/rjBKpDG09HRwLA+ize4/+KAk0DLUwd5SoLJozUgw6r0J1eGPXAo9fj6fIKF3m6cW6I/MPX2R+MZ5eQJa82WzFKuwX0IFQvmpegQRGUa5fv8acqIWnhu6jq5MWOLGJfLhFTChscIIUT6I8rz9k57XCyvrIT65Cz8Y4HpggiU= + peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo + signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg== + encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0= mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/cons2.yml b/etc/configs/cons2.yml index 0ea4662c..e1aad499 100755 --- a/etc/configs/cons2.yml +++ b/etc/configs/cons2.yml @@ -3,9 +3,9 @@ grpcServer: - 127.0.0.1:4531 tls: false account: - peerId: 12D3KooWGVroVVTuhc7GcnYZ3T9RmvuB4LWwqQRgvEMWQWPQqTy8 - signingKey: FGi5NwOrRlQAwGuwwi6rwAqAGD4FRGJExr0y+kc2LJpjRCYyLSau5CL2DiFYB+0Qx8+Qq+y2jxkvEjivGEqpzw== - encryptionKey: MIIEpAIBAAKCAQEAzn1d/3riBKfsBbp7zswhj5kHqsFP8ipq614bGdXrB8TyckbCVyfGe7Cgn9443drOr2SpIGgU/HCnxV3IcYYb8jLTfEh8Rfmo0BNhDAgnfGCjsOWxc/h7WRvWCTaQiOqEaN3A2ohA0eE/6lhXSGVJ0YAtOdyuwGFRKxoP4K/DGR4D9Bus04dCzi4bUhQsa02vxvsR35qAtNxJ2gEMGtAnKOeiQBpPt7+uWmNs7eu9CoxvodCQdAwJo66nmorXKYlzFcdDuMdiczJgizXPUMuYB++HBCSjzqFeTSa61IQtwPL3Is0mGhl81sDaN4HE3Q5E5C3zxeJ6vtMnLlddPmBJ4QIDAQABAoIBADLLAelLV/efOt653aSj8Al7sjgdr0W5i210S6RSS6swlhboMvvva9KXQxuwNTrVjQv17ehr0eW67HoPNLRAMfWk7QLgbblkzVLJwZCNHPFqcDmedsU5NVZZE5BWnL0hOwr0qXDYHWHDT86chnPnfn4LUpSuJUprZeT9VzSE56/wkhkm02uB1Nm0MDgQqIToryqWOlgFDtT4vgA4W6apASZRoPb6eT714SdyEggZ/L8Vozw/wiUkZT9EIOrMXMjU/4Laa6Z4SNL27tW5fCxMVOLpapHzc0/2KpnWWEsfB5VIxAyNpce+iTBbzWQQEi8f4NPKkEpsYMmxHWPnk3D+HPUCgYEA5yDhIQT9JJROgCo4G3OqpEqpaC6if1HBWSC5eEL+G9ZHajvGVBBLhRE1fcTtnb77mUVY3UrFkxTlfMnzhloX4xqLPUURN+eyx1UxbJkEt3NI62FH3YhhwnR3JPzA4POks5tmlEwXGQXIojFxCinzFkXaSV1pxnv03d/bTzXQNCsCgYEA5LW9rF8G3W1zZs++dPRAUXreHyq6wku4jIGZVE6nwlFTxLgY+D+5ZVaobJvR6j1Aetzrlc0FMMVb7SuQCI28ajSYAm+luc8657oJoKs5RfAxlM1PHx2u/1WAuL1NRPPLBuT0OpoXx/0JV2N+0h6QhP6ZufyKgI4b3gmZHAvfeCMCgYAtl87RNKq7DIZvweRPhgGjZxcD9i8X7oi1jD8J+i0mUJ7F1gTJkG1VUo+6v54gAAyhr4xYGufem8CpXS0s05jis9nDvFwpKwuZRrT5NzY2+gboZ8hFayHduhvGsBVcSrOyunUBzADCbuGlHRuvZZcOTblBv6ud+9XR7tbUSUlJAQKBgQCwf9CwhWU23JCCdy/z8crxFnD0fHVEHEt/o0RA27J7M2gCGFCsxAC/Q/EWX+nPaxWnu3XTVTT8PlKC5WtyLm+JRq1ItAChNFuxGND1PS4l2wdoXkkBKlcylTmRWAWZgMrdtzMDRoezvoLG/fGRFiVRfWoFLe905jZ7U8zk6AS9IQKBgQC4MjddDxyPulCHigqz4jexS5Rt8yhMxuG+4dZEOdlBmeq1OceGzJVmQNlermuKABXPdvilZmr8FxkvhtKQUy4cXf4ZNZzasLeoSdJ5jputkqZRG8AoH3HJSqNUwH7ckIZESLuHWLoppCw+dNloPxqhecHTkStor2mfFk+/GD9hJA== + peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm + signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g== + encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/cons3.yml b/etc/configs/cons3.yml index 1cf1613d..e750b653 100755 --- a/etc/configs/cons3.yml +++ b/etc/configs/cons3.yml @@ -3,9 +3,9 @@ grpcServer: - 127.0.0.1:4532 tls: false account: - peerId: 12D3KooWDLvgBnuUnuLea8QZBEA8MSffmWoNj8JFto3N5AqUDV44 - signingKey: AiP/yP1JWKJvZrxLMA9nnOwvRS8fF3x4ULqipTr6QXI0Zz3Vy90Mqrh05XKzMvN0tf1da7p2NsJHnPSFSpBUcQ== - encryptionKey: MIIEogIBAAKCAQEApCTKugLFti+G1B0hEARjyJPzq/tBe92EJVsY1zCgejBf8AGYu63hfirerSRaHXHbwicuDiQguBE3JiDHsaw213H2TfYNh0QVogVSHaOT8v9Gsd+rjrN24IQT496FUb2g+EEM6/1OgmxjCbmJMUKQgEBIMeciKXr7TIMhKXL6927smOBB39dKqiMxjT3FgKkw+mZFbFgXtTKdjEHQlFF7NC+ht3enN8aesb2O1RDfjf9bVWywrqzITk/fC8OS5k7Is0UZUcKpK7VUasDe6/1jqTfWW0nL+NK14w5GUtAV0j2PY44gdmhAMMdrn0ejR+r2uO8ARpsjyssqd56VKN2c1QIDAQABAoIBABCs9DOFiJSDq4ztEKjR6Vk9PqogMnzk+kHZSWLDO+pt87EsWFnoxlnM/SZV5RnMsWi+Fj21ieVpSlMDTYZNWpz0pPMyphkx34jARaFhNuye5o23jXRH4zHX+TVTK/Qr8aiG40suRsWVQVKBmOB6RLfiz/LR6nSQW+tf/wR4++obHxyikuT4BltgxRHJBS7jSElZ8e2ZAvV7UyWe+72+EF7UPxh5mOe2oE2IhUWFZFHxkf15Z1adfidfGM6PK6GjvaIVLOt4NuQmI/uqDLakz5by8DBhPiSWbQlE4eJ+b7YAyCfv1hG3oZ/M1k0yZYmWlCD5ukn//+cgBvqaVHvFDpkCgYEA1IZ6zw18Wy+TrJizTydnoLya8WCLp+UrwNQSQPC7tIIRtoB/BYs9gh5ecG7C6tPAdmnRGeJFWaLzyCDkGMlXtM9qnA0KFl3fmmXhsYtPqlBRtLR/emrXIEZrylj8WEmFOEbpkHC42LttD06lpe6OUnWvQydoIG09zFYFOzbySlMCgYEAxbiqhdVlV8cvwv3/AWMohprB5bZTmwLsdhk6gWJ1Ue1iDhl97EsfEOF4Y0zm6oZ/CAYB/RMeu3WO/Y2/erJ7mrPWOKYcEXG+9YwPiGaKkl5C+5y8/qm4xdcBQfC9ldY3X3dilQmyC0b27M8Hi9hla0wFZmOhD4yeIL2n1/rvJzcCgYA0Dcw+sprm6rxM5gnlNU2YfRmmTXNnaCZTUJ438b7H86PLA6YZAYXLPQz8lOSBB+R4HGru4BEEZ3k2Z3f26jnlO3htSHRUDiIaeyHQjsKwgIPCswMWRNz0NstoAGuuZDORGS1UB4f+7clEmorQHaIWaGTJGfnTF26vgdI+MrMdqQKBgBjBzKhBVhUtna9eumVkExj3m7u1nrZUIWOQOSEmQOZnQNXfH0NNDLDCap6UbH2FJbbNecZEdJ6oU6Uv8H/ehVeTmQky02TjxzNbvD4qCMPXBbAXqhqBCd/L0h59lF+EmR5dBnz+38pFsnloWtuJ1vkeZbayVuJpiwsydCe5BeT1AoGASfF5izXCmHYXkVwk+8qzJ70cWmtslBwgbvamK9xegRYuIMzIyLFJWsvJwRTCz/IJ2faOcyHQKRVIkQ6RAzOnT+JqalrBe36zAGS+ozWtTLXOXc5iAyEVPHdRUUmWFLLfijH4lmdxpOHR1IGNX474kvThatgiyHSJHtgHuiPLIz4= + peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS + signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ== + encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/node1.yml b/etc/configs/node1.yml index e9a88618..2d15529c 100755 --- a/etc/configs/node1.yml +++ b/etc/configs/node1.yml @@ -5,26 +5,38 @@ grpcServer: - 127.0.0.1:4430 tls: false account: - peerId: 12D3KooWFVGSu8MfoUnPmUGPpJKNpxaM7mezZ98V1ERGEQbTWjnE - signingKey: b3+g3PNCtwX4YCLd+hTmqjub8R4yxCJJ9J7DJHgCw2hUQZ3tjkCDiuSfsdf2O//9jk81gVQ5ky8AHUpIxpGmzw== - encryptionKey: MIIEpAIBAAKCAQEAwDr0KIpH00tfbebj7FDGNbBWIBWxXdwD6M+P3DeAnHUkgK3kgOzkPGvI6gG7h+VzuqcSY566kgvykNd4WdBD0AUmijFi9sKbgw/TplXj2as5V84hwsAcx/DADMQqD14F/GFw54IALhaQhItYJO4eaxKspuxdrVRhJI91b3hRqlLBYgA15M4fYcoHaLSkoHTXuht2vC0qzFniXmJnR7sy2Z4qinTjGwsIo7bR42SjsBnvxx/50sowOAKQ2xjr3G7rBA3YHPxgTG6rWa4+QZabQelaKZaiMIow4ytEggRgFI/ooyvFDPy75XAQooAJCT4CfU3xv3cs3GteYrYlqyhzRwIDAQABAoIBAQCdqDxTe4YI/4pW4sUQLfdCVUttqRz889Oo/4LnhAXRTCoR94yvSJqwC16OvbkGbeOKtDfayHYQDgh1TqMAVlUnqPHA6VxXMajFxxc5Frx2631uTDtYNKPmP8fjMIembuDN60TkOrTXF96TNo2mTD1aZ8h+ZuE1pTy+9YHFWJLx8tvaQ4XcHNDHPuGT/HxeXqD7/COmmoxUMFccasfwlmPtb4uSHDmPl0bzFbhWholf138L/M27Nu8PMCFN6Et73gTdQar2YkAR3NTLDsXtMAEEgmOTI1cjg5nw5E8M3luloR7UoBfDybhnYpN2FEG9nrpSiJyglkF2PBKbvlvfvaLRAoGBAPR5c4NORx5aXCjOj2b15T/S2yFvFejciCHqljvFfe3W7ys5s1oMQlidIAIlQlEYBigjZQMQ3BRegGorlv/DI6B7cdw3JWIiqrfxls3K5guY8SRA7nYJnTozKnwdcJYldE96yG34yL1w6mKEgNDHhu5Xm+dBssO71Jg5LaDOQTD9AoGBAMlK+Iuv8DqXgVX92+RoULVkQAomeSNT3QOrtpVSaOnQOqWnHasaYdF6VM1NkOy05cRdf7nD4TNIMKNsQkGUojpG48lpd9IRldC3CDjmrqojgm0mYNpmQfj2NwWPgJyBrw1VPVc7XX76g41J9XdnAW0XU5H8qa5/8Tcn0tbjIDqTAoGBAJ0AglaJJtMvZJAwV5ffwuJCH8hQ9tkdB7AAX4rzQfREXER+QdhKlzEhdzTpiLVboFiWooBdi3jpV77XT5nhUDf4Dx9FqxRi/xAybo6rByHbjsGhkYLsmbSOt3IN1ggW9aM1TxKQ+xnuMhgi0DdEbDsUuGLDpnJdZiJ8Vfk3fFZhAoGAPMik0Rmpwyeo6Jyl4A0YAg5pwCbqAZ77aHZbxi+CeshkTU1vihGHZEg6f1xi3PerQmaxgRkDUgcEmPTB9Se67Tom4tU0V3zz7ni2xOfz6nCam/cw3AJw/YrsBoPU5G3MvIv23/aPPx7KxsmElC/IoHagx76yRn1gC7W81yLywn0CgYBiHYiEIS0DHXkjTNHV7oAyxdQN2SJ22Zu/6N1cP2sXVirss6JEKEHTzvVT1+qtTHxGyliyJaTiP4+ujNAJS0g6/U0F3v9Nba0/uGPLCI9FaYRxyMgNZAKTtImauMuSmaS93kgsz1Xm8CJhTJwvQaD5EHP4UqVe70G4UwwH10tS9w== + peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN + signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw== + encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ== apiServer: port: "8080" nodes: - - peerId: 12D3KooWFVGSu8MfoUnPmUGPpJKNpxaM7mezZ98V1ERGEQbTWjnE + - peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN address: 127.0.0.1:4430 - - peerId: 12D3KooWMPgKGCLtNkmANzwHAnymEMCggS6csXuDroUFqb63FizD + signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw== + encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ== + - peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT address: 127.0.0.1:4431 - - peerId: 12D3KooWG7bXBK1NdyyWT4bnGUQjbe9kpVzsZSm97MQVR13zRx4M + signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA== + encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg== + - peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC address: 127.0.0.1:4432 - - peerId: 12D3KooWKZcPNMmMqi6PZFjUkZqrFXXUYLpzoHBjbHLPojkuj4xp + signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w== + encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm + - peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo address: 127.0.0.1:4530 + signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg== + encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0= isConsensus: true - - peerId: 12D3KooWGVroVVTuhc7GcnYZ3T9RmvuB4LWwqQRgvEMWQWPQqTy8 + - peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm address: 127.0.0.1:4531 + signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g== + encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi isConsensus: true - - peerId: 12D3KooWDLvgBnuUnuLea8QZBEA8MSffmWoNj8JFto3N5AqUDV44 + - peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS address: 127.0.0.1:4532 + signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ== + encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP isConsensus: true space: gcTTL: 60 diff --git a/etc/configs/node2.yml b/etc/configs/node2.yml index e7d634c7..57318da5 100755 --- a/etc/configs/node2.yml +++ b/etc/configs/node2.yml @@ -5,26 +5,38 @@ grpcServer: - 127.0.0.1:4431 tls: false account: - peerId: 12D3KooWMPgKGCLtNkmANzwHAnymEMCggS6csXuDroUFqb63FizD - signingKey: TBi1TxcOr6kB5Wp+MQMH2m2jgNu1Un120H5aKw5Gybmr+T3auW8EL/4T5nsO0priJYMg5oki18E3AwCdOpjUqg== - encryptionKey: MIIEpQIBAAKCAQEA40ciap1GvcPsgBo/IAVcpR9KK2fTEKwUs/KCB1Y3nIKTeJSDRKOtQD8TyegiB9VEzWscRPz4sxCCuIfwuuErSl4fchMdClsFC8GYGoCN8KvGcwUoFODdWaUh3garg+TqGPARe40Re6+thR4wpAFQbLeYkaM5MUWxcWf6XgMv0RD04IMwkDvZkDDR8BEP5T6aGC0FLzrqtH8YGSoAoA/IsofjIhB27QO60p6ygY0W9fHWojha6Rxi031HhnVud9wDXiBIk41RHUFxzHJF9bANF1uwJQbAVOF3PBLN4sCwrTtMt+WF832F4UBMKvxqWL5YX49iC3QqOM8N8NXvThkoHQIDAQABAoIBAQDOnMpC1buLo+MKCdI9D+LLEYjhsL8FtwoTFHD0roJbu7DIu2oiKhHECBO7R1Y4fL7RZ4AJj1efoXDUxHAp060BLFO15n5N/bS2nUXjQd7HXcFIqvVnFYzkg+Qn7TRa8O2HwiaChRnRsUEzdOCPF8q/KqB+NT429r569CV89bSwft0B0AfDs0mEjGUH9NxBI9YliA7NsjTVAi8wCIU5HDfGwJddcM7NwAeftXQlguwPm4IAFh+7rMBsUAJiIyXSRGWjknF4OcxN0qYwBdPlHCqr2ty2uN9cUnkelxtmQqK5pywUEoCL0JTqSdNRtTI8qcmSlm6Vk9VFAPnHiEeMvgnZAoGBAOqPAqlz4FRj8OFba+5dsOKkUR7xzgv4tkcyDbWT2qZeWy8aUbrTp+DQjr8X7QNIVMPPagi/Hdpdu8b/Nj2BL0jDJuECDsa0/P1QVCjbqdy9aneUrocX7+O2O6HGmtg/376bWVXH60VsPI3ZX0KtgyQQqPO+JViD6IDn0Do3Jf+bAoGBAPgNvoif2t27f/Kxdd915s2BxXxBA1yri+Kjr1yUoKfWaWaMcwxfAf05+jWOA+4GzTexR/VB8WskXMNIvNu1DTzItb/4Ojn4nx6LT7VuT8lzCcD1G8HmVhdqX7Ogv+kQQMuWBtgvjdBzXro4uV5aB1BognIigCBp12wpcBFh5d6nAoGBAM51ruwk2PKvPZm/dNNNmKMF63mHccxL0XX9ct+/ExiZuT1Ot13xa7WRHfTKRI89HY91hGnKf6Z0FxLkFYQxr8MmM5Se0Q7KxFzcVhfYsj1gZNR5BN5YjYksIHUXcbijEHigGRROcqKa0PoyuYzhWatnFq/lUM4G3aKJaVm0rTe9AoGBANcIqyyrT0O64E8WkfV2su9iWT2+6lgyimCdv06FtcPptpNkm/OUhRftY797bmKw2MQ31gaB9PQJoLTV4IqiKGiSIiTZ3jgVFHOZFy9UAqzDIih5E2gC8oz39SC18MftBA647xQIHWsgKHVM6T0m1IJbJwIkcGgo+MvWHEWlVW2vAoGAOF95zv96d2HseG/TtHdPjmNSpLAL+42cGIl/xlzJdF/VVx8kO6T+Bf4YW9PReLq8pErVFqMHPjumY5+vuFs+GX+eR0cJbQI+dQ9DyFk8fVL1QkHvvnhiS06GRK4MD6waEX7KkeD5N1RM6t2d4fWowxcbQYqt6IV4kVNTK2x06Qo= + peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT + signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA== + encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg== apiServer: port: "8081" nodes: - - peerId: 12D3KooWFVGSu8MfoUnPmUGPpJKNpxaM7mezZ98V1ERGEQbTWjnE + - peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN address: 127.0.0.1:4430 - - peerId: 12D3KooWMPgKGCLtNkmANzwHAnymEMCggS6csXuDroUFqb63FizD + signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw== + encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ== + - peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT address: 127.0.0.1:4431 - - peerId: 12D3KooWG7bXBK1NdyyWT4bnGUQjbe9kpVzsZSm97MQVR13zRx4M + signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA== + encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg== + - peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC address: 127.0.0.1:4432 - - peerId: 12D3KooWKZcPNMmMqi6PZFjUkZqrFXXUYLpzoHBjbHLPojkuj4xp + signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w== + encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm + - peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo address: 127.0.0.1:4530 + signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg== + encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0= isConsensus: true - - peerId: 12D3KooWGVroVVTuhc7GcnYZ3T9RmvuB4LWwqQRgvEMWQWPQqTy8 + - peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm address: 127.0.0.1:4531 + signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g== + encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi isConsensus: true - - peerId: 12D3KooWDLvgBnuUnuLea8QZBEA8MSffmWoNj8JFto3N5AqUDV44 + - peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS address: 127.0.0.1:4532 + signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ== + encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP isConsensus: true space: gcTTL: 60 diff --git a/etc/configs/node3.yml b/etc/configs/node3.yml index 975cf31a..3b77fd1d 100755 --- a/etc/configs/node3.yml +++ b/etc/configs/node3.yml @@ -5,26 +5,38 @@ grpcServer: - 127.0.0.1:4432 tls: false account: - peerId: 12D3KooWG7bXBK1NdyyWT4bnGUQjbe9kpVzsZSm97MQVR13zRx4M - signingKey: dm6xzcZCMOEs7h8dOJgMqcFB+EyZMXBjjOFzAqg7GeldkBfDFG75NB1gVc25MhokEeScnh8WAWEvy4YUikPJDg== - encryptionKey: MIIEpQIBAAKCAQEA7habKY4w6fYFTneChju1kFG999EeZG1bXQlNbeV9Wbsg4Hy1FDlZUNf7QxQDxCKGnSHLySt/FOdQvp007WcLIefwgaIr3vJQn1/QBKiYiKytE4qURMwum52FHAtw0Xnd8TjKPynei9boEx5nQ8wRA786sh1BLd9oWg/WZgZZ8fwMZDQTWSdn7bQh5fQcuvnd4MQD4A63JQ+0JitF8g9tLzH5n2IvbicXjkvY31rhf4lo8XeHtkKEkerxhBUm4Q3G0hiCD0xmQqBSNeaRa5dqxplFJmWxyvJM87ugsRFlntHEVpHjnhI8ZLRf/4wDlXqYCQ3pI0V5dSdI2vL2Lynx6QIDAQABAoIBAQC1XylChdyDTnSKawZWxcOxtmOWFosljB0uibifgFR2d9Q6zyWOy4VbzbzOQ7/+uSJ9L1Kz5FvCC9j57H52X6oeYTdZObZb95ItZurrsZfJfmm22jnLExRqXZwaWijOmxzU9yMy7O1o8AUJE38tKZbImPPY3epaTLeM7EWyoSIB8T0G4J99oZBGmjsuUtAVUDzpfuvAmqs8/tSzzOW47HgxCZJJLdmQeiCEwBmKyeMcI5iUfxDFZcTB2yReDNPPWzrkn6HybwtN8f114TvV1sEZpozcnJrhB8bxF34HKEC15j/iXlobH90YvKIdVAOJDGjMJZcQc5B8UkfHeSqf6b+BAoGBAP/4K8ZzwVKU80pbN54ExpoUD5k8L6SREUIjUSpecJ76bdDtbZij2rJ6D9pPKLr5PVEMVtbpcIOY4FBpsWhzkcZ2LW9w7p27DMXAm9jcf15w/WZJAIr5D46qBMAP4hvBm5adsii6HJLBauGz7sLz2uRnQCHQaknLo24mltZ3nP6RAoGBAO4d42ENPusmatInr0oA52jlC/h6yUFLCBoziU2JYm0kNcwVzmeIIIxH5yZtL9viwuNUoZQzWIM6dgxVFyb5qO3QHTqYAL9xgVkxMpyrSHBCwuJxcH8oDu8UH2UDVmna4PUdSc8tpQtAKPGKWdWTOG5G9Fu4BbcwCT7dcCWjmhnZAoGBAOtk4XTuTNHSEu7Fdh9GixF082dbFwFDO1jUO7c4BF/fM5BYWFpwDRXm9J8x/uX7gW0AaPfY09ThiR/KIxFIfr3BPkVm2LmLI9LULz4+gI9sX0xqRCqJosnzBs1NjgUyhg/707Rqew5m+xC3NRJpyVoUrcCq9qQItrH8oOh4NZNRAoGBAN7rKDVxmxe17Yc1E8tqMTpoQ96pxMPVpI4y9TWbioO2xI59U7BlJmNt5R56VbW7AsykLGh78T9Zea5t8rDQRa/th4+VQg34Cyoe/szhJX3DYoNvw+um6uQzqHh+uWV8PeH7O2Az0TFJLYuDBDsICmpjDtzW2LL4y48I67axBNFxAoGAHIn7/XyHYzkCilSDa1BG9TMYErdCehhVjlqFJ2rvQNnQN6NOfFvln3YN0dHxrKNmUzMsn9ZcV/36AIOgEmHeLVD0KUB50MCwBPtcbGN053rXbqx8AQUkPA7/+ERXiLcEELftFn37NXDv4Wj51w92tnUwke80J4lDos87Nx91w70= + peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC + signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w== + encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm apiServer: port: "8082" nodes: - - peerId: 12D3KooWFVGSu8MfoUnPmUGPpJKNpxaM7mezZ98V1ERGEQbTWjnE + - peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN address: 127.0.0.1:4430 - - peerId: 12D3KooWMPgKGCLtNkmANzwHAnymEMCggS6csXuDroUFqb63FizD + signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw== + encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ== + - peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT address: 127.0.0.1:4431 - - peerId: 12D3KooWG7bXBK1NdyyWT4bnGUQjbe9kpVzsZSm97MQVR13zRx4M + signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA== + encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg== + - peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC address: 127.0.0.1:4432 - - peerId: 12D3KooWKZcPNMmMqi6PZFjUkZqrFXXUYLpzoHBjbHLPojkuj4xp + signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w== + encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm + - peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo address: 127.0.0.1:4530 + signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg== + encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0= isConsensus: true - - peerId: 12D3KooWGVroVVTuhc7GcnYZ3T9RmvuB4LWwqQRgvEMWQWPQqTy8 + - peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm address: 127.0.0.1:4531 + signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g== + encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi isConsensus: true - - peerId: 12D3KooWDLvgBnuUnuLea8QZBEA8MSffmWoNj8JFto3N5AqUDV44 + - peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS address: 127.0.0.1:4532 + signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ== + encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP isConsensus: true space: gcTTL: 60 From 6374ef8d1b7a721b4127138e5cb46320cbf47cf7 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Fri, 7 Oct 2022 11:04:48 +0300 Subject: [PATCH 120/219] rewrite for single stream --- .../testclient/consensustestclient.go | 137 ++++++++++++++-- consensus/consensus.go | 7 - consensus/consensusclient/client.go | 11 +- consensus/consensusclient/stream.go | 66 ++++++++ consensus/consensusproto/consensus.pb.go | 148 ++++++++++++------ consensus/consensusproto/consensus_drpc.pb.go | 35 +++-- .../consensusproto/protos/consensus.proto | 5 +- consensus/consensusrpc/consensrpc.go | 45 +++--- consensus/stream/object.go | 23 +-- consensus/stream/service.go | 55 ++++--- consensus/stream/service_test.go | 89 +++++++---- consensus/stream/stream.go | 74 +++++++-- 12 files changed, 503 insertions(+), 192 deletions(-) create mode 100644 consensus/consensusclient/stream.go diff --git a/cmd/consensusnode/testclient/consensustestclient.go b/cmd/consensusnode/testclient/consensustestclient.go index c0301b8b..d362f03c 100644 --- a/cmd/consensusnode/testclient/consensustestclient.go +++ b/cmd/consensusnode/testclient/consensustestclient.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "context" "flag" "fmt" @@ -17,10 +18,12 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/node/account" "go.uber.org/zap" "gopkg.in/mgo.v2/bson" + "math/rand" "net/http" _ "net/http/pprof" "os" "os/signal" + "sync" "syscall" "time" ) @@ -77,6 +80,9 @@ func main() { log.Info("test success!") } + b := &bench{service: a.MustComponent(consensusclient.CName).(consensusclient.Service)} + b.run() + // wait exit signal exit := make(chan os.Signal, 1) signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT) @@ -206,11 +212,18 @@ func testStream(service consensusclient.Service) (err error) { } log.Info("log created", zap.String("id", bson.ObjectId(newLogId).Hex()), zap.Duration("dur", time.Since(st))) - stream, err := service.WatchLog(ctx, newLogId) + stream, err := service.WatchLog(ctx) if err != nil { return err } defer stream.Close() + + st = time.Now() + if err = stream.WatchIds([][]byte{newLogId}); err != nil { + return err + } + log.Info("watch", zap.String("id", bson.ObjectId(newLogId).Hex()), zap.Duration("dur", time.Since(st))) + sr := readStream(stream) for i := 0; i < 10; i++ { st = time.Now() @@ -226,35 +239,129 @@ func testStream(service consensusclient.Service) (err error) { lastRecId = recId log.Info("record created", zap.String("id", bson.ObjectId(lastRecId).Hex()), zap.Duration("dur", time.Since(st))) } - fmt.Println(sr.log.Records) + sr.validate() return nil } -func readStream(stream consensusproto.DRPCConsensus_WatchLogClient) *streamReader { - sr := &streamReader{stream: stream} +func readStream(stream consensusclient.Stream) *streamReader { + sr := &streamReader{stream: stream, logs: map[string]*consensusproto.Log{}} go sr.read() return sr } type streamReader struct { - stream consensusproto.DRPCConsensus_WatchLogClient - log *consensusproto.Log + stream consensusclient.Stream + logs map[string]*consensusproto.Log } func (sr *streamReader) read() { for { - event, err := sr.stream.Recv() - if err != nil { + recs := sr.stream.WaitLogs() + if len(recs) == 0 { return } - fmt.Println("received event", event) - if sr.log == nil { - sr.log = &consensusproto.Log{ - Id: event.LogId, - Records: event.Records, + for _, rec := range recs { + if el, ok := sr.logs[string(rec.Id)]; !ok { + sr.logs[string(rec.Id)] = &consensusproto.Log{ + Id: rec.Id, + Records: rec.Records, + } + } else { + el.Records = append(rec.Records, el.Records...) + sr.logs[string(rec.Id)] = el } - } else { - sr.log.Records = append(event.Records, sr.log.Records...) } } } + +func (sr *streamReader) validate() { + var lc, rc int + for _, log := range sr.logs { + lc++ + rc += len(log.Records) + validateLog(log) + } + fmt.Println("logs valid; log count:", lc, "records:", rc) +} + +func validateLog(log *consensusproto.Log) { + var prevId []byte + for _, rec := range log.Records { + if len(prevId) != 0 { + if !bytes.Equal(prevId, rec.Id) { + panic(fmt.Sprintf("invalid log: %+v", log)) + } + } + prevId = rec.PrevId + } +} + +type bench struct { + service consensusclient.Service + stream consensusclient.Stream +} + +func (b *bench) run() { + var err error + b.stream, err = b.service.WatchLog(context.Background()) + if err != nil { + panic(err) + } + defer b.stream.Close() + sr := readStream(b.stream) + var wg sync.WaitGroup + for i := 0; i < 100; i++ { + time.Sleep(time.Second / 100) + wg.Add(1) + go func() { + defer wg.Done() + b.client() + }() + fmt.Println("total streams:", i+1) + } + wg.Wait() + sr.validate() +} + +func (b *bench) client() { + ctx := context.Background() + + // create log + newLogId := []byte(bson.NewObjectId()) + lastRecId := []byte(bson.NewObjectId()) + err := b.service.AddLog(ctx, &consensusproto.Log{ + Id: newLogId, + Records: []*consensusproto.Record{ + { + Id: lastRecId, + Payload: []byte("test"), + CreatedUnix: uint64(time.Now().Unix()), + }, + }, + }) + for i := 0; i < 5; i++ { + fmt.Println("watch", bson.ObjectId(newLogId).Hex()) + if err = b.stream.WatchIds([][]byte{newLogId}); err != nil { + panic(err) + } + for i := 0; i < rand.Intn(20); i++ { + time.Sleep(time.Millisecond * time.Duration(rand.Intn(10000))) + recId := []byte(bson.NewObjectId()) + err = b.service.AddRecord(ctx, newLogId, &consensusproto.Record{ + Id: recId, + PrevId: lastRecId, + Payload: []byte("some payload 1 2 3 4 5 6 6 7 oijoj"), + CreatedUnix: uint64(time.Now().Unix()), + }) + if err != nil { + panic(err) + } + lastRecId = recId + } + if err = b.stream.UnwatchIds([][]byte{newLogId}); err != nil { + panic(err) + } + fmt.Println("unwatch", bson.ObjectId(newLogId).Hex()) + time.Sleep(time.Minute * 1) + } +} diff --git a/consensus/consensus.go b/consensus/consensus.go index a041ae26..c0b99f4b 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -13,10 +13,3 @@ type Record struct { Payload []byte `bson:"payload"` Created time.Time `bson:"created"'` } - -func (l Log) CopyRecords() Log { - l2 := l - l2.Records = make([]Record, len(l.Records)) - copy(l2.Records, l.Records) - return l2 -} diff --git a/consensus/consensusclient/client.go b/consensus/consensusclient/client.go index 0344734b..39a1bcf4 100644 --- a/consensus/consensusclient/client.go +++ b/consensus/consensusclient/client.go @@ -21,7 +21,7 @@ func New() Service { type Service interface { AddLog(ctx context.Context, clog *consensusproto.Log) (err error) AddRecord(ctx context.Context, logId []byte, clog *consensusproto.Record) (err error) - WatchLog(ctx context.Context, logId []byte) (stream consensusproto.DRPCConsensus_WatchLogClient, err error) + WatchLog(ctx context.Context) (stream Stream, err error) app.Component } @@ -83,15 +83,14 @@ func (s *service) AddRecord(ctx context.Context, logId []byte, clog *consensuspr return } -func (s *service) WatchLog(ctx context.Context, logId []byte) (stream consensusproto.DRPCConsensus_WatchLogClient, err error) { +func (s *service) WatchLog(ctx context.Context) (st Stream, err error) { cl, err := s.dialClient(ctx) if err != nil { return } - if stream, err = cl.WatchLog(ctx, &consensusproto.WatchLogRequest{ - LogId: logId, - }); err != nil { + rpcStream, err := cl.WatchLog(ctx) + if err != nil { return nil, rpcerr.Unwrap(err) } - return + return runStream(rpcStream), nil } diff --git a/consensus/consensusclient/stream.go b/consensus/consensusclient/stream.go new file mode 100644 index 00000000..9c18d07a --- /dev/null +++ b/consensus/consensusclient/stream.go @@ -0,0 +1,66 @@ +package consensusclient + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" + "github.com/cheggaaa/mb/v2" +) + +type Stream interface { + WatchIds(logIds [][]byte) (err error) + UnwatchIds(logIds [][]byte) (err error) + WaitLogs() []*consensusproto.Log + Close() error +} + +func runStream(rpcStream consensusproto.DRPCConsensus_WatchLogClient) Stream { + st := &stream{ + rpcStream: rpcStream, + mb: mb.New((*consensusproto.Log)(nil), 100), + } + go st.readStream() + return st +} + +type stream struct { + rpcStream consensusproto.DRPCConsensus_WatchLogClient + mb *mb.MB[*consensusproto.Log] +} + +func (s *stream) WatchIds(logIds [][]byte) (err error) { + return s.rpcStream.Send(&consensusproto.WatchLogRequest{ + WatchIds: logIds, + }) +} + +func (s *stream) UnwatchIds(logIds [][]byte) (err error) { + return s.rpcStream.Send(&consensusproto.WatchLogRequest{ + UnwatchIds: logIds, + }) +} + +func (s *stream) WaitLogs() []*consensusproto.Log { + return s.mb.Wait() +} + +func (s *stream) readStream() { + defer s.Close() + for { + event, err := s.rpcStream.Recv() + if err != nil { + return + } + if err = s.mb.Add(&consensusproto.Log{ + Id: event.LogId, + Records: event.Records, + }); err != nil { + return + } + } +} + +func (s *stream) Close() error { + if err := s.mb.Close(); err == nil { + return s.rpcStream.Close() + } + return nil +} diff --git a/consensus/consensusproto/consensus.pb.go b/consensus/consensusproto/consensus.pb.go index 1b3e20d2..a2327271 100644 --- a/consensus/consensusproto/consensus.pb.go +++ b/consensus/consensusproto/consensus.pb.go @@ -317,7 +317,8 @@ func (m *AddRecordRequest) GetRecord() *Record { } type WatchLogRequest struct { - LogId []byte `protobuf:"bytes,1,opt,name=logId,proto3" json:"logId,omitempty"` + WatchIds [][]byte `protobuf:"bytes,1,rep,name=watchIds,proto3" json:"watchIds,omitempty"` + UnwatchIds [][]byte `protobuf:"bytes,2,rep,name=unwatchIds,proto3" json:"unwatchIds,omitempty"` } func (m *WatchLogRequest) Reset() { *m = WatchLogRequest{} } @@ -353,9 +354,16 @@ func (m *WatchLogRequest) XXX_DiscardUnknown() { var xxx_messageInfo_WatchLogRequest proto.InternalMessageInfo -func (m *WatchLogRequest) GetLogId() []byte { +func (m *WatchLogRequest) GetWatchIds() [][]byte { if m != nil { - return m.LogId + return m.WatchIds + } + return nil +} + +func (m *WatchLogRequest) GetUnwatchIds() [][]byte { + if m != nil { + return m.UnwatchIds } return nil } @@ -428,36 +436,37 @@ func init() { } var fileDescriptor_b8d7f1c16b400059 = []byte{ - // 458 bytes of a gzipped FileDescriptorProto + // 480 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x41, 0x8b, 0xd3, 0x40, - 0x14, 0xee, 0x24, 0x35, 0xbb, 0x7d, 0x69, 0xbb, 0xf1, 0xb1, 0x48, 0xd8, 0xc5, 0x50, 0xe2, 0xc1, - 0x22, 0xd2, 0x95, 0x2a, 0x78, 0xf2, 0xb0, 0x96, 0x8a, 0x0b, 0xc5, 0x42, 0xa0, 0x0a, 0x9e, 0x8c, - 0x99, 0x69, 0x0c, 0x1b, 0x32, 0x75, 0x66, 0xba, 0x74, 0xff, 0x85, 0x3f, 0xc4, 0x1f, 0xe2, 0x45, - 0xd8, 0xa3, 0x47, 0x69, 0xff, 0x88, 0x74, 0xd2, 0xac, 0xc9, 0xb6, 0x3d, 0xec, 0x25, 0xc9, 0x7c, - 0xdf, 0xfb, 0xde, 0xf7, 0xe6, 0x7b, 0x04, 0xce, 0x22, 0x9e, 0x49, 0x96, 0xc9, 0xb9, 0xfc, 0xff, - 0x35, 0x13, 0x5c, 0xf1, 0x33, 0xfd, 0x2c, 0xa1, 0x3d, 0x0d, 0x60, 0x33, 0xcc, 0xae, 0x07, 0x05, - 0xe6, 0xc7, 0x60, 0x8e, 0x78, 0x8c, 0x6d, 0x30, 0x12, 0xea, 0x92, 0x0e, 0xe9, 0x36, 0x03, 0x23, - 0xa1, 0xd8, 0x83, 0x03, 0xc1, 0x22, 0x2e, 0xa8, 0x74, 0x8d, 0x8e, 0xd9, 0xb5, 0xfb, 0xc7, 0xbd, - 0xb2, 0xac, 0x17, 0x68, 0x32, 0x28, 0x8a, 0xb0, 0x03, 0x76, 0x24, 0x58, 0xa8, 0x18, 0x9d, 0x64, - 0xc9, 0xc2, 0x35, 0x3b, 0xa4, 0x5b, 0x0f, 0xca, 0x90, 0x9f, 0x82, 0x95, 0x8b, 0xb6, 0xbc, 0x1e, - 0x81, 0x35, 0x13, 0xec, 0xea, 0x82, 0xba, 0x86, 0xc6, 0x36, 0x27, 0x74, 0xe1, 0x60, 0x16, 0x5e, - 0xa7, 0x3c, 0xa4, 0xba, 0x5f, 0x33, 0x28, 0x8e, 0x77, 0xdd, 0xea, 0xdb, 0x6e, 0x75, 0x30, 0xc6, - 0x97, 0xfe, 0x2b, 0x68, 0x9d, 0x53, 0x3a, 0xe2, 0x71, 0xc0, 0xbe, 0xcf, 0x99, 0x54, 0xf8, 0x04, - 0xcc, 0x94, 0xc7, 0xda, 0xdb, 0xee, 0x3f, 0xac, 0x5e, 0x69, 0x5d, 0xb6, 0x66, 0xfd, 0x8f, 0xe0, - 0x9c, 0x53, 0xba, 0xb9, 0xe1, 0x46, 0x78, 0x0c, 0x0f, 0x52, 0x1e, 0x5f, 0x14, 0x63, 0xe7, 0x07, - 0x7c, 0x0e, 0x56, 0x1e, 0x80, 0x9e, 0x7c, 0x5f, 0x48, 0x9b, 0x1a, 0xff, 0x29, 0x1c, 0x7d, 0x0a, - 0x55, 0xf4, 0xad, 0x34, 0xcf, 0xce, 0xb6, 0xfe, 0x04, 0x5a, 0x45, 0xe1, 0xf0, 0x8a, 0x65, 0xfb, - 0xdc, 0xef, 0xb9, 0xa3, 0x67, 0x5f, 0xe0, 0x70, 0x28, 0xc4, 0x80, 0x53, 0x26, 0xb1, 0x0d, 0x30, - 0xc9, 0xd8, 0x62, 0xc6, 0x22, 0xc5, 0xa8, 0x53, 0xc3, 0x16, 0x34, 0xd6, 0x6e, 0x8b, 0x44, 0x2a, - 0xe9, 0x10, 0x3c, 0x02, 0x7b, 0xc4, 0xe3, 0x0f, 0x5c, 0xbd, 0xe3, 0xf3, 0x8c, 0x3a, 0x06, 0x22, - 0xb4, 0xf3, 0x76, 0x03, 0x9e, 0x4d, 0xd3, 0x24, 0x52, 0x8e, 0x89, 0x0e, 0xd8, 0x43, 0x21, 0xb8, - 0x18, 0x4f, 0xa7, 0x92, 0x29, 0xe7, 0xa7, 0xd1, 0xff, 0x4d, 0xa0, 0x71, 0xeb, 0x8f, 0xaf, 0xc1, - 0xca, 0xd3, 0xc7, 0xd3, 0xea, 0x60, 0x95, 0x9d, 0x9c, 0x38, 0x55, 0x72, 0x7c, 0x89, 0x6f, 0xa0, - 0x71, 0xbb, 0x00, 0xf4, 0xb6, 0xb4, 0x95, 0xcd, 0xec, 0x90, 0xbf, 0x87, 0xc3, 0x22, 0x3e, 0x7c, - 0x5c, 0x65, 0xef, 0xe4, 0x7f, 0x72, 0xba, 0x9b, 0xd6, 0xa9, 0xbf, 0x20, 0x6f, 0xfb, 0xbf, 0x96, - 0x1e, 0xb9, 0x59, 0x7a, 0xe4, 0xef, 0xd2, 0x23, 0x3f, 0x56, 0x5e, 0xed, 0x66, 0xe5, 0xd5, 0xfe, - 0xac, 0xbc, 0xda, 0x67, 0x77, 0xdf, 0x5f, 0xf7, 0xd5, 0xd2, 0xaf, 0x97, 0xff, 0x02, 0x00, 0x00, - 0xff, 0xff, 0x2f, 0xe9, 0x67, 0xad, 0x98, 0x03, 0x00, 0x00, + 0x14, 0xee, 0x24, 0x6b, 0xb7, 0x7d, 0x69, 0xbb, 0xf1, 0xb1, 0x48, 0xe8, 0x62, 0x08, 0xf1, 0x12, + 0x44, 0xba, 0x52, 0x05, 0x4f, 0x1e, 0xd6, 0x52, 0xa1, 0x52, 0x2d, 0x04, 0xaa, 0xe0, 0xc9, 0x98, + 0x99, 0xc6, 0xb0, 0x21, 0x53, 0x67, 0xd2, 0xb5, 0xfb, 0x2f, 0xfc, 0x21, 0xfe, 0x10, 0x6f, 0xee, + 0xd1, 0xa3, 0xb4, 0x7f, 0x44, 0x3a, 0x69, 0x6a, 0xb2, 0xdd, 0x1e, 0xbc, 0x24, 0x79, 0xdf, 0x37, + 0xef, 0x7d, 0xdf, 0xbc, 0x8f, 0xc0, 0x79, 0xc8, 0x53, 0xc9, 0x52, 0xb9, 0x90, 0xff, 0xbe, 0xe6, + 0x82, 0x67, 0xfc, 0x5c, 0x3d, 0x4b, 0x68, 0x4f, 0x01, 0xd8, 0x0a, 0xd2, 0xeb, 0x41, 0x81, 0xb9, + 0x11, 0xe8, 0x63, 0x1e, 0x61, 0x07, 0xb4, 0x98, 0x5a, 0xc4, 0x21, 0x5e, 0xcb, 0xd7, 0x62, 0x8a, + 0x3d, 0x38, 0x16, 0x2c, 0xe4, 0x82, 0x4a, 0x4b, 0x73, 0x74, 0xcf, 0xe8, 0x9f, 0xf6, 0xca, 0x6d, + 0x3d, 0x5f, 0x91, 0x7e, 0x71, 0x08, 0x1d, 0x30, 0x42, 0xc1, 0x82, 0x8c, 0xd1, 0x69, 0x1a, 0x2f, + 0x2d, 0xdd, 0x21, 0xde, 0x91, 0x5f, 0x86, 0xdc, 0x04, 0xea, 0x79, 0xd3, 0x9e, 0xd6, 0x03, 0xa8, + 0xcf, 0x05, 0xbb, 0x1a, 0x51, 0x4b, 0x53, 0xd8, 0xb6, 0x42, 0x0b, 0x8e, 0xe7, 0xc1, 0x75, 0xc2, + 0x03, 0xaa, 0xe6, 0xb5, 0xfc, 0xa2, 0xbc, 0xad, 0x76, 0xb4, 0xaf, 0x76, 0x04, 0xda, 0xe4, 0xd2, + 0x7d, 0x0e, 0xed, 0x0b, 0x4a, 0xc7, 0x3c, 0xf2, 0xd9, 0xd7, 0x05, 0x93, 0x19, 0x3e, 0x02, 0x3d, + 0xe1, 0x91, 0xd2, 0x36, 0xfa, 0xf7, 0xab, 0x57, 0xda, 0x1c, 0xdb, 0xb0, 0xee, 0x7b, 0x30, 0x2f, + 0x28, 0xdd, 0xde, 0x70, 0xdb, 0x78, 0x0a, 0xf7, 0x12, 0x1e, 0x8d, 0x0a, 0xdb, 0x79, 0x81, 0x4f, + 0xa0, 0x9e, 0x2f, 0x40, 0x39, 0x3f, 0xb4, 0xa4, 0xed, 0x19, 0xf7, 0x2d, 0x9c, 0x7c, 0x08, 0xb2, + 0xf0, 0x4b, 0xc9, 0x4f, 0x17, 0x1a, 0xdf, 0x36, 0xd0, 0x88, 0x4a, 0x8b, 0x38, 0xba, 0xd7, 0xf2, + 0x77, 0x35, 0xda, 0x00, 0x8b, 0x74, 0xc7, 0x6a, 0x8a, 0x2d, 0x21, 0xee, 0x14, 0xda, 0xc5, 0xb8, + 0xe1, 0x15, 0x4b, 0x0f, 0x79, 0xfc, 0xcf, 0x24, 0x1f, 0x7f, 0x82, 0xc6, 0x50, 0x88, 0x01, 0xa7, + 0x4c, 0x62, 0x07, 0x60, 0x9a, 0xb2, 0xe5, 0x9c, 0x85, 0x19, 0xa3, 0x66, 0x0d, 0xdb, 0xd0, 0xdc, + 0xa8, 0x2d, 0x63, 0x99, 0x49, 0x93, 0xe0, 0x09, 0x18, 0x63, 0x1e, 0xbd, 0xe3, 0xd9, 0x6b, 0xbe, + 0x48, 0xa9, 0xa9, 0x21, 0x42, 0x27, 0x1f, 0x37, 0xe0, 0xe9, 0x2c, 0x89, 0xc3, 0xcc, 0xd4, 0xd1, + 0x04, 0x63, 0x28, 0x04, 0x17, 0x93, 0xd9, 0x4c, 0xb2, 0xcc, 0xfc, 0xa1, 0xf5, 0x7f, 0x11, 0x68, + 0xee, 0xf4, 0xf1, 0x05, 0xd4, 0xf3, 0x8c, 0xf0, 0xac, 0x6a, 0xac, 0x92, 0x5c, 0xd7, 0xac, 0x92, + 0x93, 0x4b, 0x7c, 0x09, 0xcd, 0x5d, 0x4c, 0x68, 0xef, 0xf5, 0x56, 0xf2, 0xbb, 0xa3, 0xfd, 0x0d, + 0x34, 0x8a, 0xf5, 0xe1, 0xc3, 0x2a, 0x7b, 0x2b, 0xa5, 0xee, 0xd9, 0xdd, 0xb4, 0xda, 0xba, 0x47, + 0x9e, 0x92, 0x57, 0xfd, 0x9f, 0x2b, 0x9b, 0xdc, 0xac, 0x6c, 0xf2, 0x67, 0x65, 0x93, 0xef, 0x6b, + 0xbb, 0x76, 0xb3, 0xb6, 0x6b, 0xbf, 0xd7, 0x76, 0xed, 0xa3, 0x75, 0xe8, 0xef, 0xfc, 0x5c, 0x57, + 0xaf, 0x67, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xc9, 0xa1, 0x1f, 0xc0, 0x03, 0x00, 0x00, } func (m *Log) Marshal() (dAtA []byte, err error) { @@ -678,12 +687,23 @@ func (m *WatchLogRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.LogId) > 0 { - i -= len(m.LogId) - copy(dAtA[i:], m.LogId) - i = encodeVarintConsensus(dAtA, i, uint64(len(m.LogId))) - i-- - dAtA[i] = 0xa + if len(m.UnwatchIds) > 0 { + for iNdEx := len(m.UnwatchIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.UnwatchIds[iNdEx]) + copy(dAtA[i:], m.UnwatchIds[iNdEx]) + i = encodeVarintConsensus(dAtA, i, uint64(len(m.UnwatchIds[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.WatchIds) > 0 { + for iNdEx := len(m.WatchIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.WatchIds[iNdEx]) + copy(dAtA[i:], m.WatchIds[iNdEx]) + i = encodeVarintConsensus(dAtA, i, uint64(len(m.WatchIds[iNdEx]))) + i-- + dAtA[i] = 0xa + } } return len(dAtA) - i, nil } @@ -834,9 +854,17 @@ func (m *WatchLogRequest) Size() (n int) { } var l int _ = l - l = len(m.LogId) - if l > 0 { - n += 1 + l + sovConsensus(uint64(l)) + if len(m.WatchIds) > 0 { + for _, b := range m.WatchIds { + l = len(b) + n += 1 + l + sovConsensus(uint64(l)) + } + } + if len(m.UnwatchIds) > 0 { + for _, b := range m.UnwatchIds { + l = len(b) + n += 1 + l + sovConsensus(uint64(l)) + } } return n } @@ -1461,7 +1489,7 @@ func (m *WatchLogRequest) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LogId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WatchIds", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -1488,10 +1516,40 @@ func (m *WatchLogRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.LogId = append(m.LogId[:0], dAtA[iNdEx:postIndex]...) - if m.LogId == nil { - m.LogId = []byte{} + m.WatchIds = append(m.WatchIds, make([]byte, postIndex-iNdEx)) + copy(m.WatchIds[len(m.WatchIds)-1], dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UnwatchIds", wireType) } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UnwatchIds = append(m.UnwatchIds, make([]byte, postIndex-iNdEx)) + copy(m.UnwatchIds[len(m.UnwatchIds)-1], dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/consensus/consensusproto/consensus_drpc.pb.go b/consensus/consensusproto/consensus_drpc.pb.go index f573360f..ccdf5bc9 100644 --- a/consensus/consensusproto/consensus_drpc.pb.go +++ b/consensus/consensusproto/consensus_drpc.pb.go @@ -42,7 +42,7 @@ type DRPCConsensusClient interface { AddLog(ctx context.Context, in *AddLogRequest) (*Ok, error) AddRecord(ctx context.Context, in *AddRecordRequest) (*Ok, error) - WatchLog(ctx context.Context, in *WatchLogRequest) (DRPCConsensus_WatchLogClient, error) + WatchLog(ctx context.Context) (DRPCConsensus_WatchLogClient, error) } type drpcConsensusClient struct { @@ -73,23 +73,18 @@ func (c *drpcConsensusClient) AddRecord(ctx context.Context, in *AddRecordReques return out, nil } -func (c *drpcConsensusClient) WatchLog(ctx context.Context, in *WatchLogRequest) (DRPCConsensus_WatchLogClient, error) { +func (c *drpcConsensusClient) WatchLog(ctx context.Context) (DRPCConsensus_WatchLogClient, error) { stream, err := c.cc.NewStream(ctx, "/anyConsensus.Consensus/WatchLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) if err != nil { return nil, err } x := &drpcConsensus_WatchLogClient{stream} - if err := x.MsgSend(in, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil { - return nil, err - } - if err := x.CloseSend(); err != nil { - return nil, err - } return x, nil } type DRPCConsensus_WatchLogClient interface { drpc.Stream + Send(*WatchLogRequest) error Recv() (*WatchLogEvent, error) } @@ -97,6 +92,10 @@ type drpcConsensus_WatchLogClient struct { drpc.Stream } +func (x *drpcConsensus_WatchLogClient) Send(m *WatchLogRequest) error { + return x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) +} + func (x *drpcConsensus_WatchLogClient) Recv() (*WatchLogEvent, error) { m := new(WatchLogEvent) if err := x.MsgRecv(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil { @@ -112,7 +111,7 @@ func (x *drpcConsensus_WatchLogClient) RecvMsg(m *WatchLogEvent) error { type DRPCConsensusServer interface { AddLog(context.Context, *AddLogRequest) (*Ok, error) AddRecord(context.Context, *AddRecordRequest) (*Ok, error) - WatchLog(*WatchLogRequest, DRPCConsensus_WatchLogStream) error + WatchLog(DRPCConsensus_WatchLogStream) error } type DRPCConsensusUnimplementedServer struct{} @@ -125,7 +124,7 @@ func (s *DRPCConsensusUnimplementedServer) AddRecord(context.Context, *AddRecord return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) } -func (s *DRPCConsensusUnimplementedServer) WatchLog(*WatchLogRequest, DRPCConsensus_WatchLogStream) error { +func (s *DRPCConsensusUnimplementedServer) WatchLog(DRPCConsensus_WatchLogStream) error { return drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) } @@ -158,8 +157,7 @@ func (DRPCConsensusDescription) Method(n int) (string, drpc.Encoding, drpc.Recei func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { return nil, srv.(DRPCConsensusServer). WatchLog( - in1.(*WatchLogRequest), - &drpcConsensus_WatchLogStream{in2.(drpc.Stream)}, + &drpcConsensus_WatchLogStream{in1.(drpc.Stream)}, ) }, DRPCConsensusServer.WatchLog, true default: @@ -206,6 +204,7 @@ func (x *drpcConsensus_AddRecordStream) SendAndClose(m *Ok) error { type DRPCConsensus_WatchLogStream interface { drpc.Stream Send(*WatchLogEvent) error + Recv() (*WatchLogRequest, error) } type drpcConsensus_WatchLogStream struct { @@ -215,3 +214,15 @@ type drpcConsensus_WatchLogStream struct { func (x *drpcConsensus_WatchLogStream) Send(m *WatchLogEvent) error { return x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) } + +func (x *drpcConsensus_WatchLogStream) Recv() (*WatchLogRequest, error) { + m := new(WatchLogRequest) + if err := x.MsgRecv(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil { + return nil, err + } + return m, nil +} + +func (x *drpcConsensus_WatchLogStream) RecvMsg(m *WatchLogRequest) error { + return x.MsgRecv(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) +} diff --git a/consensus/consensusproto/protos/consensus.proto b/consensus/consensusproto/protos/consensus.proto index 256d2868..58d6c185 100644 --- a/consensus/consensusproto/protos/consensus.proto +++ b/consensus/consensusproto/protos/consensus.proto @@ -31,7 +31,7 @@ service Consensus { // AddRecord adds new record to log rpc AddRecord(AddRecordRequest) returns (Ok); // WatchLog fetches log and subscribes for a changes - rpc WatchLog(WatchLogRequest) returns (stream WatchLogEvent); + rpc WatchLog(stream WatchLogRequest) returns (stream WatchLogEvent); } message Ok {} @@ -46,7 +46,8 @@ message AddRecordRequest { } message WatchLogRequest { - bytes logId = 1; + repeated bytes watchIds = 1; + repeated bytes unwatchIds = 2; } message WatchLogEvent { diff --git a/consensus/consensusrpc/consensrpc.go b/consensus/consensusrpc/consensrpc.go index ecf458a7..5d18b34a 100644 --- a/consensus/consensusrpc/consensrpc.go +++ b/consensus/consensusrpc/consensrpc.go @@ -46,30 +46,19 @@ func (c *consensusRpc) AddRecord(ctx context.Context, req *consensusproto.AddRec return &consensusproto.Ok{}, nil } -func (c *consensusRpc) WatchLog(req *consensusproto.WatchLogRequest, rpcStream consensusproto.DRPCConsensus_WatchLogStream) error { - stream, err := c.stream.Subscribe(rpcStream.Context(), req.LogId) - if err != nil { - return err - } +func (c *consensusRpc) WatchLog(rpcStream consensusproto.DRPCConsensus_WatchLogStream) error { + stream := c.stream.NewStream() defer stream.Close() - var logSent bool + go c.readStream(stream, rpcStream) for { - if !logSent { - if err = rpcStream.Send(&consensusproto.WatchLogEvent{ - LogId: req.LogId, - Records: recordsToProto(stream.Records()), - }); err != nil { - return err - } - logSent = true - } else { - recs := stream.WaitRecords() - if len(recs) == 0 { - return rpcStream.Close() - } - if err = rpcStream.Send(&consensusproto.WatchLogEvent{ - LogId: req.LogId, - Records: recordsToProto(recs), + recs := stream.WaitLogs() + if len(recs) == 0 { + return rpcStream.Close() + } + for _, rec := range recs { + if err := rpcStream.Send(&consensusproto.WatchLogEvent{ + LogId: rec.Id, + Records: recordsToProto(rec.Records), }); err != nil { return err } @@ -77,6 +66,18 @@ func (c *consensusRpc) WatchLog(req *consensusproto.WatchLogRequest, rpcStream c } } +func (c *consensusRpc) readStream(st *stream.Stream, rpcStream consensusproto.DRPCConsensus_WatchLogStream) { + defer st.Close() + for { + req, err := rpcStream.Recv() + if err != nil { + return + } + st.UnwatchIds(rpcStream.Context(), req.UnwatchIds) + st.WatchIds(rpcStream.Context(), req.WatchIds) + } +} + func logFromProto(log *consensusproto.Log) consensus.Log { return consensus.Log{ Id: log.Id, diff --git a/consensus/stream/object.go b/consensus/stream/object.go index 6f4f3d07..d2714dd9 100644 --- a/consensus/stream/object.go +++ b/consensus/stream/object.go @@ -2,7 +2,6 @@ package stream import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" - "github.com/cheggaaa/mb/v2" "sync" ) @@ -10,9 +9,7 @@ type object struct { logId []byte records []consensus.Record - streams map[uint32]*stream - - lastStreamId uint32 + streams map[uint64]*Stream mu sync.Mutex } @@ -27,7 +24,7 @@ func (o *object) AddRecords(recs []consensus.Record) { diff := recs[0 : len(recs)-len(o.records)] o.records = recs for _, st := range o.streams { - st.AddRecords(diff) + _ = st.AddRecords(o.logId, diff) } } @@ -37,18 +34,12 @@ func (o *object) Records() []consensus.Record { return o.records } -func (o *object) NewStream() Stream { +func (o *object) AddStream(s *Stream) { o.mu.Lock() defer o.mu.Unlock() - o.lastStreamId++ - st := &stream{ - id: o.lastStreamId, - obj: o, - records: o.records, - mb: mb.New(consensus.Record{}, 100), - } - o.streams[st.id] = st - return st + o.streams[s.id] = s + _ = s.AddRecords(o.logId, o.records) + return } func (o *object) Locked() bool { @@ -57,7 +48,7 @@ func (o *object) Locked() bool { return len(o.streams) > 0 } -func (o *object) removeStream(id uint32) { +func (o *object) RemoveStream(id uint64) { o.mu.Lock() defer o.mu.Unlock() delete(o.streams, id) diff --git a/consensus/stream/service.go b/consensus/stream/service.go index 11c5bc42..854846c5 100644 --- a/consensus/stream/service.go +++ b/consensus/stream/service.go @@ -7,8 +7,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "github.com/cheggaaa/mb/v2" "github.com/mr-tron/base58" "go.uber.org/zap" + "sync/atomic" "time" ) @@ -30,21 +32,15 @@ func New() Service { return &service{} } -type Stream interface { - LogId() []byte - Records() []consensus.Record - WaitRecords() []consensus.Record - Close() -} - type Service interface { - Subscribe(ctx context.Context, logId []byte) (stream Stream, err error) + NewStream() *Stream app.ComponentRunnable } type service struct { - db db.Service - cache ocache.OCache + db db.Service + cache ocache.OCache + lastStreamId uint64 } func (s *service) Init(a *app.App) (err error) { @@ -58,14 +54,6 @@ func (s *service) Init(a *app.App) (err error) { return s.db.SetChangeReceiver(s.receiveChange) } -func (s *service) Subscribe(ctx context.Context, logId []byte) (Stream, error) { - obj, err := s.getObject(ctx, logId) - if err != nil { - return nil, err - } - return obj.NewStream(), nil -} - func (s *service) Name() (name string) { return CName } @@ -74,12 +62,39 @@ func (s *service) Run(ctx context.Context) (err error) { return nil } +func (s *service) NewStream() *Stream { + return &Stream{ + id: atomic.AddUint64(&s.lastStreamId, 1), + logIds: make(map[string]struct{}), + mb: mb.New(consensus.Log{}, 100), + s: s, + } +} + +func (s *service) AddStream(ctx context.Context, logId []byte, stream *Stream) (err error) { + obj, err := s.getObject(ctx, logId) + if err != nil { + return err + } + obj.AddStream(stream) + return +} + +func (s *service) RemoveStream(ctx context.Context, logId []byte, streamId uint64) (err error) { + obj, err := s.getObject(ctx, logId) + if err != nil { + return err + } + obj.RemoveStream(streamId) + return +} + func (s *service) loadLog(ctx context.Context, id string) (value ocache.Object, err error) { if ctxLog := ctx.Value(ctxLogKey); ctxLog != nil { return &object{ logId: ctxLog.(consensus.Log).Id, records: ctxLog.(consensus.Log).Records, - streams: make(map[uint32]*stream), + streams: make(map[uint64]*Stream), }, nil } logId := logIdFromString(id) @@ -90,7 +105,7 @@ func (s *service) loadLog(ctx context.Context, id string) (value ocache.Object, return &object{ logId: dbLog.Id, records: dbLog.Records, - streams: make(map[uint32]*stream), + streams: make(map[uint64]*Stream), }, nil } diff --git a/consensus/stream/service_test.go b/consensus/stream/service_test.go index 8acf865c..80643de4 100644 --- a/consensus/stream/service_test.go +++ b/consensus/stream/service_test.go @@ -13,11 +13,12 @@ import ( var ctx = context.Background() -func TestService_Subscribe(t *testing.T) { +func TestService_NewStream(t *testing.T) { fx := newFixture(t) defer fx.Finish(t) var expLogId = []byte("logId") + var preloadLogId = []byte("preloadId") fx.mockDB.fetchLog = func(ctx context.Context, logId []byte) (log consensus.Log, err error) { require.Equal(t, expLogId, logId) @@ -31,24 +32,7 @@ func TestService_Subscribe(t *testing.T) { }, nil } - st1, err := fx.Subscribe(ctx, expLogId) - require.NoError(t, err) - require.Equal(t, expLogId, st1.LogId()) - sr1 := readStream(st1) - assert.Equal(t, uint32(1), sr1.id) - - st2, err := fx.Subscribe(ctx, expLogId) - require.NoError(t, err) - require.Equal(t, expLogId, st2.LogId()) - sr2 := readStream(st2) - assert.Equal(t, uint32(2), sr2.id) - - fx.mockDB.receiver(expLogId, []consensus.Record{ - { - Id: []byte{'1'}, - }, - }) - fx.mockDB.receiver([]byte("other id"), []consensus.Record{ + fx.mockDB.receiver(preloadLogId, []consensus.Record{ { Id: []byte{'2'}, PrevId: []byte{'1'}, @@ -57,7 +41,38 @@ func TestService_Subscribe(t *testing.T) { Id: []byte{'1'}, }, }) + + st1 := fx.NewStream() + sr1 := readStream(st1) + assert.Equal(t, uint64(1), sr1.id) + st1.WatchIds(ctx, [][]byte{expLogId, preloadLogId}) + st1.UnwatchIds(ctx, [][]byte{preloadLogId}) + assert.Equal(t, [][]byte{expLogId}, st1.LogIds()) + + st2 := fx.NewStream() + sr2 := readStream(st2) + assert.Equal(t, uint64(2), sr2.id) + st2.WatchIds(ctx, [][]byte{expLogId, preloadLogId}) + fx.mockDB.receiver(expLogId, []consensus.Record{ + { + Id: []byte{'1'}, + }, + }) + fx.mockDB.receiver(expLogId, []consensus.Record{ + { + Id: []byte{'2'}, + PrevId: []byte{'1'}, + }, + { + Id: []byte{'1'}, + }, + }) + fx.mockDB.receiver(preloadLogId, []consensus.Record{ + { + Id: []byte{'3'}, + PrevId: []byte{'4'}, + }, { Id: []byte{'2'}, PrevId: []byte{'1'}, @@ -77,9 +92,15 @@ func TestService_Subscribe(t *testing.T) { } } - require.Equal(t, sr1.records, sr2.records) - require.Len(t, sr1.records, 1) - assert.Equal(t, []byte{'2'}, sr1.records[0].Id) + require.Len(t, sr1.logs, 2) + assert.Len(t, sr1.logs[string(expLogId)].Records, 2) + assert.Equal(t, []byte{'2'}, sr1.logs[string(expLogId)].Records[0].Id) + assert.Equal(t, []byte{'2'}, sr1.logs[string(preloadLogId)].Records[0].Id) + + require.Len(t, sr2.logs, 2) + assert.Len(t, sr2.logs[string(expLogId)].Records, 2) + assert.Equal(t, []byte{'2'}, sr2.logs[string(expLogId)].Records[0].Id) + assert.Equal(t, []byte{'3'}, sr2.logs[string(preloadLogId)].Records[0].Id) } func newFixture(t *testing.T) *fixture { @@ -104,10 +125,11 @@ func (fx *fixture) Finish(t *testing.T) { require.NoError(t, fx.a.Close(ctx)) } -func readStream(st Stream) *streamReader { +func readStream(st *Stream) *streamReader { sr := &streamReader{ - id: st.(*stream).id, + id: st.id, stream: st, + logs: map[string]consensus.Log{}, finished: make(chan struct{}), } go sr.read() @@ -115,21 +137,28 @@ func readStream(st Stream) *streamReader { } type streamReader struct { - id uint32 - stream Stream + id uint64 + stream *Stream - records []consensus.Record + logs map[string]consensus.Log finished chan struct{} } func (sr *streamReader) read() { defer close(sr.finished) for { - records := sr.stream.WaitRecords() - if len(records) == 0 { + logs := sr.stream.WaitLogs() + if len(logs) == 0 { return } - sr.records = append(sr.records, records...) + for _, l := range logs { + if el, ok := sr.logs[string(l.Id)]; !ok { + sr.logs[string(l.Id)] = l + } else { + el.Records = append(l.Records, el.Records...) + sr.logs[string(l.Id)] = el + } + } } } diff --git a/consensus/stream/stream.go b/consensus/stream/stream.go index 4f8f4b3e..bf3b1fd6 100644 --- a/consensus/stream/stream.go +++ b/consensus/stream/stream.go @@ -1,34 +1,74 @@ package stream import ( + "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/cheggaaa/mb/v2" + "go.uber.org/zap" + "sync" ) -type stream struct { - id uint32 - obj *object - records []consensus.Record - mb *mb.MB[consensus.Record] +type Stream struct { + id uint64 + logIds map[string]struct{} + mu sync.Mutex + mb *mb.MB[consensus.Log] + s *service } -func (s *stream) LogId() []byte { - return s.obj.logId +func (s *Stream) LogIds() [][]byte { + s.mu.Lock() + defer s.mu.Unlock() + logIds := make([][]byte, 0, len(s.logIds)) + for logId := range s.logIds { + logIds = append(logIds, []byte(logId)) + } + return logIds } -func (s *stream) AddRecords(records []consensus.Record) { - _ = s.mb.Add(records...) +func (s *Stream) AddRecords(logId []byte, records []consensus.Record) (err error) { + return s.mb.Add(consensus.Log{Id: logId, Records: records}) } -func (s *stream) Records() []consensus.Record { - return s.records -} - -func (s *stream) WaitRecords() []consensus.Record { +func (s *Stream) WaitLogs() []consensus.Log { return s.mb.Wait() } -func (s *stream) Close() { - _ = s.mb.Close() - s.obj.removeStream(s.id) +func (s *Stream) WatchIds(ctx context.Context, logIds [][]byte) { + s.mu.Lock() + defer s.mu.Unlock() + for _, logId := range logIds { + logIdKey := string(logId) + if _, ok := s.logIds[logIdKey]; !ok { + s.logIds[logIdKey] = struct{}{} + if addErr := s.s.AddStream(ctx, logId, s); addErr != nil { + log.Warn("can't add stream for log", zap.Binary("logId", logId), zap.Error(addErr)) + } + } + } + return +} + +func (s *Stream) UnwatchIds(ctx context.Context, logIds [][]byte) { + s.mu.Lock() + defer s.mu.Unlock() + for _, logId := range logIds { + logIdKey := string(logId) + if _, ok := s.logIds[logIdKey]; ok { + delete(s.logIds, logIdKey) + if remErr := s.s.RemoveStream(ctx, logId, s.id); remErr != nil { + log.Warn("can't remove stream for log", zap.Binary("logId", logId), zap.Error(remErr)) + } + } + } + return +} + +func (s *Stream) Close() { + _ = s.mb.Close() + s.mu.Lock() + defer s.mu.Unlock() + for logId := range s.logIds { + _ = s.s.RemoveStream(context.TODO(), []byte(logId), s.id) + } } From fd8ba951dc64eda2712c713bcd7046471f9f4045 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Fri, 7 Oct 2022 15:06:54 +0300 Subject: [PATCH 121/219] cleanup and comments --- .../testclient/consensustestclient.go | 6 +- consensus/consensusproto/consensus.pb.go | 101 ++++++------------ .../{consensuserrs => consensuserr}/errors.go | 2 +- .../consensusproto/protos/consensus.proto | 1 - consensus/consensusrpc/consensrpc.go | 1 + consensus/db/db.go | 19 ++-- consensus/db/db_test.go | 4 +- consensus/stream/object.go | 19 ++-- consensus/stream/service.go | 4 + consensus/stream/stream.go | 8 ++ 10 files changed, 78 insertions(+), 87 deletions(-) rename consensus/consensusproto/{consensuserrs => consensuserr}/errors.go (97%) diff --git a/cmd/consensusnode/testclient/consensustestclient.go b/cmd/consensusnode/testclient/consensustestclient.go index d362f03c..cbb239fd 100644 --- a/cmd/consensusnode/testclient/consensustestclient.go +++ b/cmd/consensusnode/testclient/consensustestclient.go @@ -14,7 +14,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserrs" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/account" "go.uber.org/zap" "gopkg.in/mgo.v2/bson" @@ -154,7 +154,7 @@ func testCreateLogAndRecord(service consensusclient.Service) (err error) { }, }, }) - if err != consensuserrs.ErrLogExists { + if err != consensuserr.ErrLogExists { return fmt.Errorf("unexpected error: '%v' want LogExists", zap.Error(err)) } err = nil @@ -181,7 +181,7 @@ func testCreateLogAndRecord(service consensusclient.Service) (err error) { PrevId: []byte(bson.NewObjectId()), CreatedUnix: uint64(time.Now().Unix()), }) - if err != consensuserrs.ErrConflict { + if err != consensuserr.ErrConflict { return fmt.Errorf("unexpected error: '%v' want Conflict", zap.Error(err)) } err = nil diff --git a/consensus/consensusproto/consensus.pb.go b/consensus/consensusproto/consensus.pb.go index a2327271..b8a52a16 100644 --- a/consensus/consensusproto/consensus.pb.go +++ b/consensus/consensusproto/consensus.pb.go @@ -57,9 +57,8 @@ func (ErrCodes) EnumDescriptor() ([]byte, []int) { } type Log struct { - Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Records []*Record `protobuf:"bytes,2,rep,name=records,proto3" json:"records,omitempty"` - CreatedUnix uint64 `protobuf:"varint,3,opt,name=createdUnix,proto3" json:"createdUnix,omitempty"` + Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Records []*Record `protobuf:"bytes,2,rep,name=records,proto3" json:"records,omitempty"` } func (m *Log) Reset() { *m = Log{} } @@ -109,13 +108,6 @@ func (m *Log) GetRecords() []*Record { return nil } -func (m *Log) GetCreatedUnix() uint64 { - if m != nil { - return m.CreatedUnix - } - return 0 -} - type Record struct { Id []byte `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` PrevId []byte `protobuf:"bytes,2,opt,name=prevId,proto3" json:"prevId,omitempty"` @@ -436,37 +428,37 @@ func init() { } var fileDescriptor_b8d7f1c16b400059 = []byte{ - // 480 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x41, 0x8b, 0xd3, 0x40, - 0x14, 0xee, 0x24, 0x6b, 0xb7, 0x7d, 0x69, 0xbb, 0xf1, 0xb1, 0x48, 0xe8, 0x62, 0x08, 0xf1, 0x12, - 0x44, 0xba, 0x52, 0x05, 0x4f, 0x1e, 0xd6, 0x52, 0xa1, 0x52, 0x2d, 0x04, 0xaa, 0xe0, 0xc9, 0x98, - 0x99, 0xc6, 0xb0, 0x21, 0x53, 0x67, 0xd2, 0xb5, 0xfb, 0x2f, 0xfc, 0x21, 0xfe, 0x10, 0x6f, 0xee, - 0xd1, 0xa3, 0xb4, 0x7f, 0x44, 0x3a, 0x69, 0x6a, 0xb2, 0xdd, 0x1e, 0xbc, 0x24, 0x79, 0xdf, 0x37, - 0xef, 0x7d, 0xdf, 0xbc, 0x8f, 0xc0, 0x79, 0xc8, 0x53, 0xc9, 0x52, 0xb9, 0x90, 0xff, 0xbe, 0xe6, - 0x82, 0x67, 0xfc, 0x5c, 0x3d, 0x4b, 0x68, 0x4f, 0x01, 0xd8, 0x0a, 0xd2, 0xeb, 0x41, 0x81, 0xb9, - 0x11, 0xe8, 0x63, 0x1e, 0x61, 0x07, 0xb4, 0x98, 0x5a, 0xc4, 0x21, 0x5e, 0xcb, 0xd7, 0x62, 0x8a, - 0x3d, 0x38, 0x16, 0x2c, 0xe4, 0x82, 0x4a, 0x4b, 0x73, 0x74, 0xcf, 0xe8, 0x9f, 0xf6, 0xca, 0x6d, - 0x3d, 0x5f, 0x91, 0x7e, 0x71, 0x08, 0x1d, 0x30, 0x42, 0xc1, 0x82, 0x8c, 0xd1, 0x69, 0x1a, 0x2f, - 0x2d, 0xdd, 0x21, 0xde, 0x91, 0x5f, 0x86, 0xdc, 0x04, 0xea, 0x79, 0xd3, 0x9e, 0xd6, 0x03, 0xa8, - 0xcf, 0x05, 0xbb, 0x1a, 0x51, 0x4b, 0x53, 0xd8, 0xb6, 0x42, 0x0b, 0x8e, 0xe7, 0xc1, 0x75, 0xc2, - 0x03, 0xaa, 0xe6, 0xb5, 0xfc, 0xa2, 0xbc, 0xad, 0x76, 0xb4, 0xaf, 0x76, 0x04, 0xda, 0xe4, 0xd2, - 0x7d, 0x0e, 0xed, 0x0b, 0x4a, 0xc7, 0x3c, 0xf2, 0xd9, 0xd7, 0x05, 0x93, 0x19, 0x3e, 0x02, 0x3d, - 0xe1, 0x91, 0xd2, 0x36, 0xfa, 0xf7, 0xab, 0x57, 0xda, 0x1c, 0xdb, 0xb0, 0xee, 0x7b, 0x30, 0x2f, - 0x28, 0xdd, 0xde, 0x70, 0xdb, 0x78, 0x0a, 0xf7, 0x12, 0x1e, 0x8d, 0x0a, 0xdb, 0x79, 0x81, 0x4f, - 0xa0, 0x9e, 0x2f, 0x40, 0x39, 0x3f, 0xb4, 0xa4, 0xed, 0x19, 0xf7, 0x2d, 0x9c, 0x7c, 0x08, 0xb2, - 0xf0, 0x4b, 0xc9, 0x4f, 0x17, 0x1a, 0xdf, 0x36, 0xd0, 0x88, 0x4a, 0x8b, 0x38, 0xba, 0xd7, 0xf2, - 0x77, 0x35, 0xda, 0x00, 0x8b, 0x74, 0xc7, 0x6a, 0x8a, 0x2d, 0x21, 0xee, 0x14, 0xda, 0xc5, 0xb8, - 0xe1, 0x15, 0x4b, 0x0f, 0x79, 0xfc, 0xcf, 0x24, 0x1f, 0x7f, 0x82, 0xc6, 0x50, 0x88, 0x01, 0xa7, - 0x4c, 0x62, 0x07, 0x60, 0x9a, 0xb2, 0xe5, 0x9c, 0x85, 0x19, 0xa3, 0x66, 0x0d, 0xdb, 0xd0, 0xdc, - 0xa8, 0x2d, 0x63, 0x99, 0x49, 0x93, 0xe0, 0x09, 0x18, 0x63, 0x1e, 0xbd, 0xe3, 0xd9, 0x6b, 0xbe, - 0x48, 0xa9, 0xa9, 0x21, 0x42, 0x27, 0x1f, 0x37, 0xe0, 0xe9, 0x2c, 0x89, 0xc3, 0xcc, 0xd4, 0xd1, - 0x04, 0x63, 0x28, 0x04, 0x17, 0x93, 0xd9, 0x4c, 0xb2, 0xcc, 0xfc, 0xa1, 0xf5, 0x7f, 0x11, 0x68, - 0xee, 0xf4, 0xf1, 0x05, 0xd4, 0xf3, 0x8c, 0xf0, 0xac, 0x6a, 0xac, 0x92, 0x5c, 0xd7, 0xac, 0x92, - 0x93, 0x4b, 0x7c, 0x09, 0xcd, 0x5d, 0x4c, 0x68, 0xef, 0xf5, 0x56, 0xf2, 0xbb, 0xa3, 0xfd, 0x0d, - 0x34, 0x8a, 0xf5, 0xe1, 0xc3, 0x2a, 0x7b, 0x2b, 0xa5, 0xee, 0xd9, 0xdd, 0xb4, 0xda, 0xba, 0x47, - 0x9e, 0x92, 0x57, 0xfd, 0x9f, 0x2b, 0x9b, 0xdc, 0xac, 0x6c, 0xf2, 0x67, 0x65, 0x93, 0xef, 0x6b, - 0xbb, 0x76, 0xb3, 0xb6, 0x6b, 0xbf, 0xd7, 0x76, 0xed, 0xa3, 0x75, 0xe8, 0xef, 0xfc, 0x5c, 0x57, - 0xaf, 0x67, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xc9, 0xa1, 0x1f, 0xc0, 0x03, 0x00, 0x00, + // 474 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x4f, 0x8b, 0xd3, 0x40, + 0x14, 0xef, 0x24, 0xb5, 0xdb, 0xbe, 0xb4, 0xdd, 0xf8, 0x58, 0x24, 0x74, 0x31, 0x84, 0x78, 0x09, + 0x22, 0x5d, 0xa9, 0x82, 0x27, 0x0f, 0x6b, 0xa9, 0x50, 0xa9, 0x16, 0x02, 0x55, 0xf0, 0x64, 0xcc, + 0x4c, 0x63, 0xd8, 0x90, 0xa9, 0x33, 0xe9, 0xda, 0xfd, 0x16, 0x7e, 0x10, 0x3f, 0x88, 0x37, 0xf7, + 0xe8, 0x51, 0xda, 0x2f, 0x22, 0x9d, 0x34, 0x35, 0x71, 0xb7, 0x87, 0xbd, 0x24, 0xf3, 0x7e, 0xbf, + 0xf7, 0xe7, 0x37, 0xef, 0xc7, 0xc0, 0x59, 0xc8, 0x53, 0xc9, 0x52, 0xb9, 0x94, 0xff, 0x4e, 0x0b, + 0xc1, 0x33, 0x7e, 0xa6, 0xbe, 0x25, 0xb4, 0xaf, 0x00, 0x6c, 0x07, 0xe9, 0xd5, 0xb0, 0xc0, 0xdc, + 0x11, 0xe8, 0x13, 0x1e, 0x61, 0x17, 0xb4, 0x98, 0x5a, 0xc4, 0x21, 0x5e, 0xdb, 0xd7, 0x62, 0x8a, + 0x7d, 0x38, 0x12, 0x2c, 0xe4, 0x82, 0x4a, 0x4b, 0x73, 0x74, 0xcf, 0x18, 0x9c, 0xf4, 0xcb, 0x65, + 0x7d, 0x5f, 0x91, 0x7e, 0x91, 0xe4, 0x26, 0xd0, 0xc8, 0xa1, 0x1b, 0x9d, 0x1e, 0x40, 0x63, 0x21, + 0xd8, 0xe5, 0x98, 0x5a, 0x9a, 0xc2, 0x76, 0x11, 0x5a, 0x70, 0xb4, 0x08, 0xae, 0x12, 0x1e, 0x50, + 0x4b, 0x57, 0x44, 0x11, 0xa2, 0x03, 0x46, 0x28, 0x58, 0x90, 0x31, 0x3a, 0x4b, 0xe3, 0x95, 0x55, + 0x77, 0x88, 0x57, 0xf7, 0xcb, 0x90, 0x5b, 0x07, 0x6d, 0x7a, 0xe1, 0x3e, 0x87, 0xce, 0x39, 0xa5, + 0x13, 0x1e, 0xf9, 0xec, 0xeb, 0x92, 0xc9, 0x0c, 0x1f, 0x81, 0x9e, 0xf0, 0x48, 0xcd, 0x36, 0x06, + 0xf7, 0xab, 0x82, 0xb7, 0x69, 0x5b, 0xd6, 0x7d, 0x0f, 0xe6, 0x39, 0xa5, 0x3b, 0xfd, 0xbb, 0xc2, + 0x13, 0xb8, 0x97, 0xf0, 0x68, 0x5c, 0xc8, 0xce, 0x03, 0x7c, 0x02, 0x8d, 0xfc, 0x7a, 0x4a, 0xf9, + 0xa1, 0x15, 0xec, 0x72, 0xdc, 0xb7, 0x70, 0xfc, 0x21, 0xc8, 0xc2, 0x2f, 0x25, 0x3d, 0x3d, 0x68, + 0x7e, 0xdb, 0x42, 0x63, 0x2a, 0x2d, 0xe2, 0xe8, 0x5e, 0xdb, 0xdf, 0xc7, 0x68, 0x03, 0x2c, 0xd3, + 0x3d, 0xab, 0x29, 0xb6, 0x84, 0xb8, 0x33, 0xe8, 0x14, 0xed, 0x46, 0x97, 0x2c, 0x3d, 0xa4, 0xf1, + 0x8e, 0x3e, 0x3d, 0xfe, 0x04, 0xcd, 0x91, 0x10, 0x43, 0x4e, 0x99, 0xc4, 0x2e, 0xc0, 0x2c, 0x65, + 0xab, 0x05, 0x0b, 0x33, 0x46, 0xcd, 0x1a, 0x76, 0xa0, 0xb5, 0x9d, 0xb6, 0x8a, 0x65, 0x26, 0x4d, + 0x82, 0xc7, 0x60, 0x4c, 0x78, 0xf4, 0x8e, 0x67, 0xaf, 0xf9, 0x32, 0xa5, 0xa6, 0x86, 0x08, 0xdd, + 0xbc, 0xdd, 0x90, 0xa7, 0xf3, 0x24, 0x0e, 0x33, 0x53, 0x47, 0x13, 0x8c, 0x91, 0x10, 0x5c, 0x4c, + 0xe7, 0x73, 0xc9, 0x32, 0xf3, 0x87, 0x36, 0xf8, 0x45, 0xa0, 0xb5, 0x9f, 0x8f, 0x2f, 0xa0, 0x91, + 0x7b, 0x84, 0xa7, 0x55, 0x61, 0x15, 0xe7, 0x7a, 0x66, 0x95, 0x9c, 0x5e, 0xe0, 0x4b, 0x68, 0xed, + 0x6d, 0x42, 0xfb, 0x46, 0x6d, 0xc5, 0xbf, 0x5b, 0xca, 0xdf, 0x40, 0xb3, 0x58, 0x1f, 0x3e, 0xac, + 0xb2, 0xff, 0xb9, 0xd4, 0x3b, 0xbd, 0x9d, 0x56, 0x5b, 0xf7, 0xc8, 0x53, 0xf2, 0x6a, 0xf0, 0x73, + 0x6d, 0x93, 0xeb, 0xb5, 0x4d, 0xfe, 0xac, 0x6d, 0xf2, 0x7d, 0x63, 0xd7, 0xae, 0x37, 0x76, 0xed, + 0xf7, 0xc6, 0xae, 0x7d, 0xb4, 0x0e, 0xbd, 0xbd, 0xcf, 0x0d, 0xf5, 0x7b, 0xf6, 0x37, 0x00, 0x00, + 0xff, 0xff, 0x9f, 0x6e, 0xb2, 0xf8, 0x9e, 0x03, 0x00, 0x00, } func (m *Log) Marshal() (dAtA []byte, err error) { @@ -489,11 +481,6 @@ func (m *Log) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.CreatedUnix != 0 { - i = encodeVarintConsensus(dAtA, i, uint64(m.CreatedUnix)) - i-- - dAtA[i] = 0x18 - } if len(m.Records) > 0 { for iNdEx := len(m.Records) - 1; iNdEx >= 0; iNdEx-- { { @@ -779,9 +766,6 @@ func (m *Log) Size() (n int) { n += 1 + l + sovConsensus(uint64(l)) } } - if m.CreatedUnix != 0 { - n += 1 + sovConsensus(uint64(m.CreatedUnix)) - } return n } @@ -991,25 +975,6 @@ func (m *Log) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CreatedUnix", wireType) - } - m.CreatedUnix = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowConsensus - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CreatedUnix |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipConsensus(dAtA[iNdEx:]) diff --git a/consensus/consensusproto/consensuserrs/errors.go b/consensus/consensusproto/consensuserr/errors.go similarity index 97% rename from consensus/consensusproto/consensuserrs/errors.go rename to consensus/consensusproto/consensuserr/errors.go index afe5ec10..f0ff33a6 100644 --- a/consensus/consensusproto/consensuserrs/errors.go +++ b/consensus/consensusproto/consensuserr/errors.go @@ -1,4 +1,4 @@ -package consensuserrs +package consensuserr import ( "fmt" diff --git a/consensus/consensusproto/protos/consensus.proto b/consensus/consensusproto/protos/consensus.proto index 58d6c185..7a840a83 100644 --- a/consensus/consensusproto/protos/consensus.proto +++ b/consensus/consensusproto/protos/consensus.proto @@ -15,7 +15,6 @@ enum ErrCodes { message Log { bytes id = 1; repeated Record records = 2; - uint64 createdUnix = 3; } message Record { diff --git a/consensus/consensusrpc/consensrpc.go b/consensus/consensusrpc/consensrpc.go index 5d18b34a..2c5d27c9 100644 --- a/consensus/consensusrpc/consensrpc.go +++ b/consensus/consensusrpc/consensrpc.go @@ -17,6 +17,7 @@ func New() app.Component { return &consensusRpc{} } +// consensusRpc implements consensus rpc server type consensusRpc struct { db db.Service stream stream.Service diff --git a/consensus/db/db.go b/consensus/db/db.go index d0f2ad10..638352f3 100644 --- a/consensus/db/db.go +++ b/consensus/db/db.go @@ -7,7 +7,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserrs" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.uber.org/zap" @@ -24,9 +24,14 @@ func New() Service { type ChangeReceiver func(logId []byte, records []consensus.Record) type Service interface { + // AddLog adds new log db AddLog(ctx context.Context, log consensus.Log) (err error) + // AddRecord adds new record to existing log + // returns consensuserr.ErrConflict if record didn't match or log not found AddRecord(ctx context.Context, logId []byte, record consensus.Record) (err error) + // FetchLog gets log by id FetchLog(ctx context.Context, logId []byte) (log consensus.Log, err error) + // SetChangeReceiver sets the receiver for updates, it must be called before app.Run stage SetChangeReceiver(receiver ChangeReceiver) (err error) app.ComponentRunnable } @@ -69,7 +74,7 @@ func (s *service) Run(ctx context.Context) (err error) { func (s *service) AddLog(ctx context.Context, l consensus.Log) (err error) { _, err = s.logColl.InsertOne(ctx, l) if mongo.IsDuplicateKeyError(err) { - return consensuserrs.ErrLogExists + return consensuserr.ErrLogExists } return } @@ -101,10 +106,10 @@ func (s *service) AddRecord(ctx context.Context, logId []byte, record consensus. }, upd) if err != nil { log.Error("addRecord update error", zap.Error(err)) - return consensuserrs.ErrUnexpected + return consensuserr.ErrUnexpected } if result.ModifiedCount == 0 { - return consensuserrs.ErrConflict + return consensuserr.ErrConflict } return } @@ -112,7 +117,7 @@ func (s *service) AddRecord(ctx context.Context, logId []byte, record consensus. func (s *service) FetchLog(ctx context.Context, logId []byte) (l consensus.Log, err error) { if err = s.logColl.FindOne(ctx, findLogQuery{Id: logId}).Decode(&l); err != nil { if err == mongo.ErrNoDocuments { - err = consensuserrs.ErrLogNotFound + err = consensuserr.ErrLogNotFound } return } @@ -162,7 +167,9 @@ func (s *service) streamListener(stream *mongo.ChangeStream) { for stream.Next(s.streamCtx) { var res streamResult if err := stream.Decode(&res); err != nil { - log.Error("stream decode error:", zap.Error(err)) + // mongo driver maintains connections and handles reconnects so that the stream will work as usual in these cases + // here we have an unexpected error and should stop any operations to avoid an inconsistent state between db and cache + log.Fatal("stream decode error:", zap.Error(err)) } s.changeReceiver(res.DocumentKey.Id, res.UpdateDescription.UpdateFields.Records) } diff --git a/consensus/db/db_test.go b/consensus/db/db_test.go index add2ca37..edbb3cfa 100644 --- a/consensus/db/db_test.go +++ b/consensus/db/db_test.go @@ -5,7 +5,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserrs" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" @@ -100,7 +100,7 @@ func TestService_FetchLog(t *testing.T) { defer fx.Finish(t) l, err := fx.FetchLog(ctx, []byte("not exists")) assert.Empty(t, l) - assert.ErrorIs(t, err, consensuserrs.ErrLogNotFound) + assert.ErrorIs(t, err, consensuserr.ErrLogNotFound) }) } diff --git a/consensus/stream/object.go b/consensus/stream/object.go index d2714dd9..22164911 100644 --- a/consensus/stream/object.go +++ b/consensus/stream/object.go @@ -5,6 +5,7 @@ import ( "sync" ) +// object is a cache entry that holds the actual log state and maintains added streams type object struct { logId []byte records []consensus.Record @@ -14,6 +15,8 @@ type object struct { mu sync.Mutex } +// AddRecords adds new records to the log and sends new records to streams +// The records source is db and called via stream.Service func (o *object) AddRecords(recs []consensus.Record) { o.mu.Lock() defer o.mu.Unlock() @@ -28,12 +31,14 @@ func (o *object) AddRecords(recs []consensus.Record) { } } +// Records returns all log records func (o *object) Records() []consensus.Record { o.mu.Lock() defer o.mu.Unlock() return o.records } +// AddStream adds stream to the object func (o *object) AddStream(s *Stream) { o.mu.Lock() defer o.mu.Unlock() @@ -42,18 +47,20 @@ func (o *object) AddStream(s *Stream) { return } -func (o *object) Locked() bool { - o.mu.Lock() - defer o.mu.Unlock() - return len(o.streams) > 0 -} - +// RemoveStream remove stream from object func (o *object) RemoveStream(id uint64) { o.mu.Lock() defer o.mu.Unlock() delete(o.streams, id) } +// Locked indicates that object can be garbage collected +func (o *object) Locked() bool { + o.mu.Lock() + defer o.mu.Unlock() + return len(o.streams) > 0 +} + func (o *object) Close() (err error) { return nil } diff --git a/consensus/stream/service.go b/consensus/stream/service.go index 854846c5..83ded807 100644 --- a/consensus/stream/service.go +++ b/consensus/stream/service.go @@ -32,7 +32,9 @@ func New() Service { return &service{} } +// Service maintains a cache for logs (receive updates from db) and creates new stream objects with able to subscribe/unsubscribe to log ids type Service interface { + // NewStream creates new stream with able to watch and unwatch log ids NewStream() *Stream app.ComponentRunnable } @@ -71,6 +73,7 @@ func (s *service) NewStream() *Stream { } } +// AddStream to object with given logId func (s *service) AddStream(ctx context.Context, logId []byte, stream *Stream) (err error) { obj, err := s.getObject(ctx, logId) if err != nil { @@ -80,6 +83,7 @@ func (s *service) AddStream(ctx context.Context, logId []byte, stream *Stream) ( return } +// RemoveStream from object with five logId func (s *service) RemoveStream(ctx context.Context, logId []byte, streamId uint64) (err error) { obj, err := s.getObject(ctx, logId) if err != nil { diff --git a/consensus/stream/stream.go b/consensus/stream/stream.go index bf3b1fd6..0c686290 100644 --- a/consensus/stream/stream.go +++ b/consensus/stream/stream.go @@ -8,6 +8,7 @@ import ( "sync" ) +// Stream is a buffer that receives updates from object and gives back to a client type Stream struct { id uint64 logIds map[string]struct{} @@ -16,6 +17,7 @@ type Stream struct { s *service } +// LogIds returns watched log ids func (s *Stream) LogIds() [][]byte { s.mu.Lock() defer s.mu.Unlock() @@ -26,14 +28,18 @@ func (s *Stream) LogIds() [][]byte { return logIds } +// AddRecords adds new records to stream, called by objects func (s *Stream) AddRecords(logId []byte, records []consensus.Record) (err error) { return s.mb.Add(consensus.Log{Id: logId, Records: records}) } +// WaitLogs wait for new log records +// empty returned slice means that stream is closed func (s *Stream) WaitLogs() []consensus.Log { return s.mb.Wait() } +// WatchIds adds given ids to subscription func (s *Stream) WatchIds(ctx context.Context, logIds [][]byte) { s.mu.Lock() defer s.mu.Unlock() @@ -49,6 +55,7 @@ func (s *Stream) WatchIds(ctx context.Context, logIds [][]byte) { return } +// UnwatchIds removes given ids from subscription func (s *Stream) UnwatchIds(ctx context.Context, logIds [][]byte) { s.mu.Lock() defer s.mu.Unlock() @@ -64,6 +71,7 @@ func (s *Stream) UnwatchIds(ctx context.Context, logIds [][]byte) { return } +// Close closes stream and unsubscribes all ids func (s *Stream) Close() { _ = s.mb.Close() s.mu.Lock() From 1676d02d8053a703395ac3bea3310f3394c02b03 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Sat, 8 Oct 2022 20:16:20 +0300 Subject: [PATCH 122/219] metric service, ocache and drpc handlers --- cmd/consensusnode/consensusnode.go | 4 +- .../testclient/consensustestclient.go | 2 +- common/metric/drpc.go | 20 + common/metric/metric.go | 70 +++ common/net/rpc/server/drpcserver.go | 15 +- config/config.go | 1 + config/metric.go | 5 + consensus/config/config.go | 5 + consensus/stream/service.go | 2 + etc/configs/cons1.yml | 2 + etc/configs/cons2.yml | 2 + etc/configs/cons3.yml | 2 + go.mod | 13 +- go.sum | 430 ++++++++++++++++++ pkg/ocache/metrics.go | 52 +++ pkg/ocache/ocache.go | 15 +- 16 files changed, 634 insertions(+), 6 deletions(-) create mode 100644 common/metric/drpc.go create mode 100644 common/metric/metric.go create mode 100644 config/metric.go create mode 100644 pkg/ocache/metrics.go diff --git a/cmd/consensusnode/consensusnode.go b/cmd/consensusnode/consensusnode.go index 2e804d35..c17166d8 100644 --- a/cmd/consensusnode/consensusnode.go +++ b/cmd/consensusnode/consensusnode.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config" @@ -86,7 +87,8 @@ func main() { } func Bootstrap(a *app.App) { - a.Register(account.New()). + a.Register(metric.New()). + Register(account.New()). Register(secure.New()). Register(server.New()). Register(db.New()). diff --git a/cmd/consensusnode/testclient/consensustestclient.go b/cmd/consensusnode/testclient/consensustestclient.go index cbb239fd..5539e430 100644 --- a/cmd/consensusnode/testclient/consensustestclient.go +++ b/cmd/consensusnode/testclient/consensustestclient.go @@ -310,7 +310,7 @@ func (b *bench) run() { defer b.stream.Close() sr := readStream(b.stream) var wg sync.WaitGroup - for i := 0; i < 100; i++ { + for i := 0; i < 1000; i++ { time.Sleep(time.Second / 100) wg.Add(1) go func() { diff --git a/common/metric/drpc.go b/common/metric/drpc.go new file mode 100644 index 00000000..78c77752 --- /dev/null +++ b/common/metric/drpc.go @@ -0,0 +1,20 @@ +package metric + +import ( + "github.com/prometheus/client_golang/prometheus" + "storj.io/drpc" + "time" +) + +type PrometheusDRPC struct { + drpc.Handler + HistogramVec *prometheus.HistogramVec +} + +func (ph *PrometheusDRPC) HandleRPC(stream drpc.Stream, rpc string) (err error) { + st := time.Now() + defer func() { + ph.HistogramVec.WithLabelValues(rpc).Observe(time.Since(st).Seconds()) + }() + return ph.Handler.HandleRPC(stream, rpc) +} diff --git a/common/metric/metric.go b/common/metric/metric.go new file mode 100644 index 00000000..1eed1579 --- /dev/null +++ b/common/metric/metric.go @@ -0,0 +1,70 @@ +package metric + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/collectors" + "github.com/prometheus/client_golang/prometheus/promhttp" + "net/http" + "time" +) + +const CName = "common.metric" + +func New() Metric { + return new(metric) +} + +type Metric interface { + Registry() *prometheus.Registry + app.ComponentRunnable +} + +type metric struct { + registry *prometheus.Registry + config config.Metric +} + +type configSource interface { + GetMetric() config.Metric +} + +func (m *metric) Init(a *app.App) (err error) { + m.registry = prometheus.NewRegistry() + m.config = a.MustComponent(config.CName).(configSource).GetMetric() + return nil +} + +func (m *metric) Name() string { + return CName +} + +func (m *metric) Run(ctx context.Context) (err error) { + if err = m.registry.Register(collectors.NewBuildInfoCollector()); err != nil { + return err + } + if err = m.registry.Register(collectors.NewGoCollector()); err != nil { + return err + } + if m.config.Addr != "" { + var errCh = make(chan error) + go func() { + errCh <- http.ListenAndServe(m.config.Addr, promhttp.HandlerFor(m.registry, promhttp.HandlerOpts{})) + }() + select { + case err = <-errCh: + case <-time.After(time.Second / 5): + } + } + return +} + +func (m *metric) Registry() *prometheus.Registry { + return m.registry +} + +func (m *metric) Close(ctx context.Context) (err error) { + return +} diff --git a/common/net/rpc/server/drpcserver.go b/common/net/rpc/server/drpcserver.go index 5ad27a3c..3219a831 100644 --- a/common/net/rpc/server/drpcserver.go +++ b/common/net/rpc/server/drpcserver.go @@ -4,8 +4,10 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" secure2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/prometheus/client_golang/prometheus" "github.com/zeebo/errs" "go.uber.org/zap" "io" @@ -38,6 +40,7 @@ type drpcServer struct { drpcServer *drpcserver.Server transport secure2.Service listeners []secure2.ContextListener + metric metric.Metric cancel func() *drpcmux.Mux } @@ -45,6 +48,7 @@ type drpcServer struct { func (s *drpcServer) Init(a *app.App) (err error) { s.config = a.MustComponent(config.CName).(configGetter).GetGRPCServer() s.transport = a.MustComponent(secure2.CName).(secure2.Service) + s.metric = a.MustComponent(metric.CName).(metric.Metric) return nil } @@ -53,7 +57,16 @@ func (s *drpcServer) Name() (name string) { } func (s *drpcServer) Run(ctx context.Context) (err error) { - s.drpcServer = drpcserver.New(s.Mux) + histVec := prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: "drpc", + Subsystem: "server", + Name: "method", + }, []string{"rpc"}) + s.drpcServer = drpcserver.New(&metric.PrometheusDRPC{ + Handler: s.Mux, + HistogramVec: histVec, + }) + s.metric.Registry().Register(histVec) ctx, s.cancel = context.WithCancel(ctx) for _, addr := range s.config.ListenAddrs { tcpList, err := net.Listen("tcp", addr) diff --git a/config/config.go b/config/config.go index 012a7da5..2894015a 100644 --- a/config/config.go +++ b/config/config.go @@ -29,6 +29,7 @@ type Config struct { APIServer APIServer `yaml:"apiServer"` Nodes []Node `yaml:"nodes"` Space Space `yaml:"space"` + Metric Metric `yaml:"metric"` } func (c *Config) Init(a *app.App) (err error) { diff --git a/config/metric.go b/config/metric.go new file mode 100644 index 00000000..8cc29227 --- /dev/null +++ b/config/metric.go @@ -0,0 +1,5 @@ +package config + +type Metric struct { + Addr string `yaml:"addr"` +} diff --git a/consensus/config/config.go b/consensus/config/config.go index 45a83a08..30bd4400 100644 --- a/consensus/config/config.go +++ b/consensus/config/config.go @@ -25,6 +25,7 @@ type Config struct { GrpcServer config.GrpcServer `yaml:"grpcServer"` Account config.Account `yaml:"account"` Mongo Mongo `yaml:"mongo"` + Metric config.Metric `yaml:"metric"` } func (c *Config) Init(a *app.App) (err error) { @@ -46,3 +47,7 @@ func (c Config) GetGRPCServer() config.GrpcServer { func (c Config) GetAccount() config.Account { return c.Account } + +func (c Config) GetMetric() config.Metric { + return c.Metric +} diff --git a/consensus/stream/service.go b/consensus/stream/service.go index 83ded807..2322c2f9 100644 --- a/consensus/stream/service.go +++ b/consensus/stream/service.go @@ -4,6 +4,7 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" @@ -51,6 +52,7 @@ func (s *service) Init(a *app.App) (err error) { ocache.WithTTL(cacheTTL), ocache.WithRefCounter(false), ocache.WithLogger(log.Named("cache").Sugar()), + ocache.WithPrometheus(a.MustComponent(metric.CName).(metric.Metric).Registry(), "consensus", "logcache"), ) return s.db.SetChangeReceiver(s.receiveChange) diff --git a/etc/configs/cons1.yml b/etc/configs/cons1.yml index f77921a0..19bb7fe4 100755 --- a/etc/configs/cons1.yml +++ b/etc/configs/cons1.yml @@ -10,3 +10,5 @@ mongo: connect: mongodb://localhost:27017/?w=majority database: consensus logCollection: log +metric: + addr: "127.0.0.1:4000" \ No newline at end of file diff --git a/etc/configs/cons2.yml b/etc/configs/cons2.yml index e1aad499..f9a8a69f 100755 --- a/etc/configs/cons2.yml +++ b/etc/configs/cons2.yml @@ -10,3 +10,5 @@ mongo: connect: mongodb://localhost:27017/?w=majority database: consensus logCollection: log +metric: + addr: "127.0.0.1:4001" \ No newline at end of file diff --git a/etc/configs/cons3.yml b/etc/configs/cons3.yml index e750b653..32667523 100755 --- a/etc/configs/cons3.yml +++ b/etc/configs/cons3.yml @@ -10,3 +10,5 @@ mongo: connect: mongodb://localhost:27017/?w=majority database: consensus logCollection: log +metric: + addr: "127.0.0.1:4002" \ No newline at end of file diff --git a/go.mod b/go.mod index 17ad3f10..956dd874 100644 --- a/go.mod +++ b/go.mod @@ -27,19 +27,23 @@ require ( require ( github.com/OneOfOne/xxhash v1.2.8 // indirect + github.com/beorn7/perks v1.0.1 // indirect github.com/btcsuite/btcd v0.22.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.1.3 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cheggaaa/mb/v2 v2.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.1 // indirect github.com/klauspost/compress v1.15.1 // indirect github.com/klauspost/cpuid/v2 v2.0.12 // indirect github.com/libp2p/go-buffer-pool v0.0.2 // indirect github.com/libp2p/go-openssl v0.0.7 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect github.com/mr-tron/base58 v1.2.0 // indirect @@ -50,6 +54,10 @@ require ( 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 + 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/xdg-go/pbkdf2 v1.0.0 // indirect @@ -60,9 +68,10 @@ require ( go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect + golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect golang.org/x/text v0.3.7 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.1.6 // indirect diff --git a/go.sum b/go.sum index bf139393..51da479c 100644 --- a/go.sum +++ b/go.sum @@ -1,24 +1,77 @@ +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/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +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-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/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab h1:+cdNqtOJWjvepyhxy23G7z7vmpYCoC65AP0nqi1f53s= github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +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/cheggaaa/mb v1.0.3 h1:03ksWum+6kHclB+kjwKMaBtgl5gtNYUwNpxsHQciKe8= github.com/cheggaaa/mb v1.0.3/go.mod h1:NUl0GBtFLlfg2o6iZwxzcG7Lslc2wV/ADTFbLXtVPE4= 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/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/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA= github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -28,26 +81,107 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +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/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +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/goccy/go-graphviz v0.0.9 h1:s/FMMJ1Joj6La3S5ApO3Jk2cwM4LpXECC2muFx3IPQQ= github.com/goccy/go-graphviz v0.0.9/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= +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/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +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/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.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/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/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.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +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/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/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= 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-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +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.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -57,6 +191,9 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.12 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +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= @@ -70,11 +207,18 @@ github.com/libp2p/go-libp2p-core v0.16.1 h1:bWoiEBqVkpJ13hbv/f69tHODp86t6mvc4fBN github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c= github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +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 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= 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= +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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= @@ -99,20 +243,54 @@ github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0Erjhoj github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= 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/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY= github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +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/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= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 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= @@ -130,7 +308,9 @@ github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCO github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +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/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= @@ -143,6 +323,11 @@ github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= go.mongodb.org/mongo-driver v1.10.2 h1:4Wk3cnqOrQCn0P92L3/mmurMxzdvWWs5J9jinAVKD+k= go.mongodb.org/mongo-driver v1.10.2/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8= +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.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -153,7 +338,10 @@ 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.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +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= @@ -162,49 +350,198 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= 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/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= golang.org/x/image v0.0.0-20200119044424-58c23975cae1/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/mod v0.4.2/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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/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/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/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/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-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-20190626221950-04f50cda93cb/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-20191026070338-33540a1f6037/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-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/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-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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= 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/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -212,21 +549,114 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T 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/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +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/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +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.2.8/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 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 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.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= lukechampine.com/blake3 v1.1.6/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= diff --git a/pkg/ocache/metrics.go b/pkg/ocache/metrics.go new file mode 100644 index 00000000..77bbfee3 --- /dev/null +++ b/pkg/ocache/metrics.go @@ -0,0 +1,52 @@ +package ocache + +import "github.com/prometheus/client_golang/prometheus" + +func WithPrometheus(reg *prometheus.Registry, namespace, subsystem string) Option { + if subsystem == "" { + subsystem = "cache" + } + return func(cache *oCache) { + cache.metrics = &metrics{ + hit: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "hit", + Help: "cache hit count", + }), + miss: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "miss", + Help: "cache miss count", + }), + gc: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "gc", + Help: "garbage collected count", + }), + size: prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "size", + Help: "cache size", + }, func() float64 { + return float64(cache.Len()) + }), + } + reg.MustRegister( + cache.metrics.hit, + cache.metrics.miss, + cache.metrics.gc, + cache.metrics.size, + ) + } +} + +type metrics struct { + hit prometheus.Counter + miss prometheus.Counter + gc prometheus.Counter + size prometheus.GaugeFunc +} diff --git a/pkg/ocache/ocache.go b/pkg/ocache/ocache.go index 44dc9d42..03e23ba7 100644 --- a/pkg/ocache/ocache.go +++ b/pkg/ocache/ocache.go @@ -12,7 +12,6 @@ import ( var ( ErrClosed = errors.New("object cache closed") ErrExists = errors.New("object exists") - ErrTimeout = errors.New("loading object timed out") ErrNotExists = errors.New("object not exists") ) @@ -139,6 +138,7 @@ type oCache struct { closed bool closeCh chan struct{} log *zap.SugaredLogger + metrics *metrics noRefCounter bool } @@ -170,6 +170,13 @@ func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) { if load { go c.load(ctx, id, e) } + if c.metrics != nil { + if load { + c.metrics.miss.Inc() + } else { + c.metrics.hit.Inc() + } + } select { case <-ctx.Done(): return nil, ctx.Err() @@ -185,6 +192,9 @@ func (c *oCache) Pick(ctx context.Context, id string) (value Object, err error) if !ok { return nil, ErrNotExists } + if c.metrics != nil { + c.metrics.hit.Inc() + } select { case <-ctx.Done(): return nil, ctx.Err() @@ -344,6 +354,9 @@ func (c *oCache) GC() { } } } + if len(toClose) > 0 && c.metrics != nil { + c.metrics.gc.Add(float64(len(toClose))) + } } func (c *oCache) Len() int { From 2999f2dcddd1da8662cbf8d1f89b20086af04040 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 9 Oct 2022 21:54:34 +0200 Subject: [PATCH 123/219] Add conf connector and change configuration logic --- common/commonspace/diffservice/diffservice.go | 4 +- common/commonspace/diffservice/diffsyncer.go | 8 +- .../diffservice/diffsyncer_test.go | 20 ++--- common/commonspace/service.go | 8 +- common/commonspace/syncservice/syncservice.go | 21 ++++-- common/nodeconf/confconnector.go | 54 ++++++++++++++ common/nodeconf/configuration.go | 47 +----------- .../nodeconf/mock_nodeconf/mock_nodeconf.go | 74 ++++++++++--------- common/nodeconf/service.go | 4 - go.mod | 3 + go.sum | 2 + 11 files changed, 136 insertions(+), 109 deletions(-) create mode 100644 common/nodeconf/confconnector.go diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index 15a9ff65..84b0d637 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -36,14 +36,14 @@ func NewDiffService( spaceId string, syncPeriod int, storage storage.SpaceStorage, - conf nodeconf.Configuration, + confConnector nodeconf.ConfConnector, cache cache.TreeCache, 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, conf, cache, storage, factory, l) + syncer := newDiffSyncer(spaceId, diff, confConnector, cache, storage, factory, l) periodicSync := newPeriodicSync(syncPeriod, syncer, l) return &diffService{ diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index 8e354294..fe1d5d93 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -21,17 +21,17 @@ type DiffSyncer interface { func newDiffSyncer( spaceId string, diff ldiff.Diff, - nconf nodeconf.Configuration, + confConnector nodeconf.ConfConnector, cache cache.TreeCache, storage storage.SpaceStorage, clientFactory spacesyncproto.ClientFactory, log *zap.Logger) DiffSyncer { return &diffSyncer{ diff: diff, - nconf: nconf, spaceId: spaceId, cache: cache, storage: storage, + confConnector: confConnector, clientFactory: clientFactory, log: log, } @@ -40,7 +40,7 @@ func newDiffSyncer( type diffSyncer struct { spaceId string diff ldiff.Diff - nconf nodeconf.Configuration + confConnector nodeconf.ConfConnector cache cache.TreeCache storage storage.SpaceStorage clientFactory spacesyncproto.ClientFactory @@ -50,7 +50,7 @@ type diffSyncer struct { func (d *diffSyncer) Sync(ctx context.Context) error { st := time.Now() // diffing with responsible peers according to configuration - peers, err := d.nconf.ResponsiblePeers(ctx, d.spaceId) + peers, err := d.confConnector.GetResponsiblePeers(ctx, d.spaceId) if err != nil { return err } diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index 041857e3..444b73fa 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -88,7 +88,7 @@ func TestDiffSyncer_Sync(t *testing.T) { defer ctrl.Finish() diffMock := mock_ldiff.NewMockDiff(ctrl) - nconfMock := mock_nodeconf.NewMockConfiguration(ctrl) + connectorMock := mock_nodeconf.NewMockConfConnector(ctrl) cacheMock := mock_cache.NewMockTreeCache(ctrl) stMock := mock_storage.NewMockSpaceStorage(ctrl) clientMock := mock_spacesyncproto.NewMockDRPCSpaceClient(ctrl) @@ -97,11 +97,11 @@ func TestDiffSyncer_Sync(t *testing.T) { }) spaceId := "spaceId" l := logger.NewNamed(spaceId) - diffSyncer := newDiffSyncer(spaceId, diffMock, nconfMock, cacheMock, stMock, factory, l) + diffSyncer := newDiffSyncer(spaceId, diffMock, connectorMock, cacheMock, stMock, factory, l) t.Run("diff syncer sync simple", func(t *testing.T) { - nconfMock.EXPECT(). - ResponsiblePeers(gomock.Any(), spaceId). + connectorMock.EXPECT(). + GetResponsiblePeers(gomock.Any(), spaceId). Return([]peer.Peer{mockPeer{}}, nil) diffMock.EXPECT(). Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). @@ -115,8 +115,8 @@ func TestDiffSyncer_Sync(t *testing.T) { }) t.Run("diff syncer sync conf error", func(t *testing.T) { - nconfMock.EXPECT(). - ResponsiblePeers(gomock.Any(), spaceId). + connectorMock.EXPECT(). + GetResponsiblePeers(gomock.Any(), spaceId). Return(nil, fmt.Errorf("some error")) require.Error(t, diffSyncer.Sync(ctx)) @@ -127,8 +127,8 @@ func TestDiffSyncer_Sync(t *testing.T) { aclRoot := &aclrecordproto.RawACLRecordWithId{} spaceHeader := &spacesyncproto.SpaceHeader{} - nconfMock.EXPECT(). - ResponsiblePeers(gomock.Any(), spaceId). + connectorMock.EXPECT(). + GetResponsiblePeers(gomock.Any(), spaceId). Return([]peer.Peer{mockPeer{}}, nil) diffMock.EXPECT(). Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). @@ -150,8 +150,8 @@ func TestDiffSyncer_Sync(t *testing.T) { }) t.Run("diff syncer sync other error", func(t *testing.T) { - nconfMock.EXPECT(). - ResponsiblePeers(gomock.Any(), spaceId). + connectorMock.EXPECT(). + GetResponsiblePeers(gomock.Any(), spaceId). Return([]peer.Peer{mockPeer{}}, nil) diffMock.EXPECT(). Diff(gomock.Any(), gomock.Eq(remotediff.NewRemoteDiff(spaceId, clientMock))). diff --git a/common/commonspace/service.go b/common/commonspace/service.go index ef287659..adefcf7f 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -8,6 +8,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice" "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/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" ) @@ -32,6 +33,7 @@ type service struct { configurationService nodeconf.Service storageProvider storage.SpaceStorageProvider cache cache.TreeCache + pool pool.Pool } func (s *service) Init(a *app.App) (err error) { @@ -39,6 +41,7 @@ func (s *service) Init(a *app.App) (err error) { s.storageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) s.cache = a.MustComponent(cache.CName).(cache.TreeCache) + s.pool = a.MustComponent(pool.CName).(pool.Pool) return nil } @@ -84,8 +87,9 @@ func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { return nil, err } lastConfiguration := s.configurationService.GetLast() - diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, lastConfiguration, s.cache, log) - syncService := syncservice.NewSyncService(id, diffService, s.cache, lastConfiguration) + confConnector := nodeconf.NewConfConnector(lastConfiguration, s.pool) + diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, confConnector, s.cache, log) + syncService := syncservice.NewSyncService(id, diffService, s.cache, lastConfiguration, confConnector) sp := &space{ id: id, syncService: syncService, diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index d065832a..ae4173b2 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -30,37 +30,42 @@ type syncService struct { spaceId string syncClient SyncClient - configuration nodeconf.Configuration clientFactory spacesyncproto.ClientFactory streamLoopCtx context.Context stopStreamLoop context.CancelFunc + connector nodeconf.ConfConnector streamLoopDone chan struct{} } -func NewSyncService(spaceId string, headNotifiable HeadNotifiable, cache cache.TreeCache, configuration nodeconf.Configuration) SyncService { +func NewSyncService( + spaceId string, + headNotifiable HeadNotifiable, + cache cache.TreeCache, + configuration nodeconf.Configuration, + confConnector nodeconf.ConfConnector) SyncService { var syncHandler SyncHandler - pool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { + streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { return syncHandler.HandleMessage(ctx, senderId, message) }) factory := newRequestFactory() - syncClient := newSyncClient(spaceId, pool, headNotifiable, factory, configuration) + syncClient := newSyncClient(spaceId, streamPool, headNotifiable, factory, configuration) syncHandler = newSyncHandler(spaceId, cache, syncClient) return newSyncService( spaceId, syncClient, spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient), - configuration) + confConnector) } func newSyncService( spaceId string, syncClient SyncClient, clientFactory spacesyncproto.ClientFactory, - configuration nodeconf.Configuration) *syncService { + connector nodeconf.ConfConnector) *syncService { return &syncService{ syncClient: syncClient, - configuration: configuration, + connector: connector, clientFactory: clientFactory, spaceId: spaceId, streamLoopDone: make(chan struct{}), @@ -81,7 +86,7 @@ func (s *syncService) Close() (err error) { func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { defer close(s.streamLoopDone) checkResponsiblePeers := func() { - respPeers, err := s.configuration.ResponsiblePeers(ctx, s.spaceId) + respPeers, err := s.connector.DialResponsiblePeers(ctx, s.spaceId) if err != nil { return } diff --git a/common/nodeconf/confconnector.go b/common/nodeconf/confconnector.go new file mode 100644 index 00000000..e62be926 --- /dev/null +++ b/common/nodeconf/confconnector.go @@ -0,0 +1,54 @@ +package nodeconf + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" +) + +type ConfConnector interface { + GetResponsiblePeers(ctx context.Context, spaceId string) ([]peer.Peer, error) + DialResponsiblePeers(ctx context.Context, spaceId string) ([]peer.Peer, error) +} + +type confConnector struct { + conf Configuration + pool pool.Pool +} + +func NewConfConnector(conf Configuration, pool pool.Pool) ConfConnector { + return &confConnector{conf: conf, pool: pool} +} + +func (s *confConnector) GetResponsiblePeers(ctx context.Context, spaceId string) ([]peer.Peer, error) { + return s.dialOrConnect(ctx, spaceId, s.pool.Get, s.pool.GetOneOf) +} + +func (s *confConnector) DialResponsiblePeers(ctx context.Context, spaceId string) ([]peer.Peer, error) { + return s.dialOrConnect(ctx, spaceId, s.pool.Dial, s.pool.DialOneOf) +} + +func (s *confConnector) dialOrConnect( + ctx context.Context, spaceId string, + connectOne func(context.Context, string) (peer.Peer, error), + connectOneOf func(context.Context, []string) (peer.Peer, error)) (peers []peer.Peer, err error) { + allNodes := s.conf.NodeIds(spaceId) + if !s.conf.IsResponsible(spaceId) { + for _, id := range allNodes { + var p peer.Peer + p, err = connectOne(ctx, id) + if err != nil { + continue + } + peers = append(peers, p) + } + } else { + var p peer.Peer + p, err = connectOneOf(ctx, allNodes) + if err != nil { + return + } + peers = []peer.Peer{p} + } + return +} diff --git a/common/nodeconf/configuration.go b/common/nodeconf/configuration.go index 8e50303b..add0647e 100644 --- a/common/nodeconf/configuration.go +++ b/common/nodeconf/configuration.go @@ -1,11 +1,7 @@ -//go:generate mockgen -destination mock_nodeconf/mock_nodeconf.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf Configuration +//go:generate mockgen -destination mock_nodeconf/mock_nodeconf.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf Configuration,ConfConnector package nodeconf import ( - "context" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-chash" ) @@ -16,12 +12,6 @@ func New() Service { type Configuration interface { // Id returns current nodeconf id Id() string - // AllPeers returns all peers by spaceId except current account - AllPeers(ctx context.Context, spaceId string) (peers []peer.Peer, err error) - // OnePeer returns one of peer for spaceId - OnePeer(ctx context.Context, spaceId string) (p peer.Peer, err error) - // ResponsiblePeers returns peers for the space id that are responsible for the space - ResponsiblePeers(ctx context.Context, spaceId string) (peers []peer.Peer, err error) // NodeIds returns list of peerId for given spaceId NodeIds(spaceId string) []string // IsResponsible checks if current account responsible for given spaceId @@ -31,7 +21,6 @@ type Configuration interface { type configuration struct { id string accountId string - pool pool.Pool chash chash.CHash } @@ -39,40 +28,6 @@ func (c *configuration) Id() string { return c.id } -func (c *configuration) AllPeers(ctx context.Context, spaceId string) (peers []peer.Peer, err error) { - nodeIds := c.NodeIds(spaceId) - peers = make([]peer.Peer, 0, len(nodeIds)) - for _, id := range nodeIds { - p, e := c.pool.Get(ctx, id) - if e == nil { - peers = append(peers, p) - } - } - if len(peers) == 0 { - return nil, fmt.Errorf("unable to connect to any node") - } - return -} - -func (c *configuration) ResponsiblePeers(ctx context.Context, spaceId string) (peers []peer.Peer, err error) { - if c.IsResponsible(spaceId) { - return c.AllPeers(ctx, spaceId) - } else { - var one peer.Peer - one, err = c.OnePeer(ctx, spaceId) - if err != nil { - return - } - peers = []peer.Peer{one} - return - } -} - -func (c *configuration) OnePeer(ctx context.Context, spaceId string) (p peer.Peer, err error) { - nodeIds := c.NodeIds(spaceId) - return c.pool.GetOneOf(ctx, nodeIds) -} - func (c *configuration) NodeIds(spaceId string) []string { members := c.chash.GetMembers(spaceId) res := make([]string, 0, len(members)) diff --git a/common/nodeconf/mock_nodeconf/mock_nodeconf.go b/common/nodeconf/mock_nodeconf/mock_nodeconf.go index e65895eb..a22e4a6e 100644 --- a/common/nodeconf/mock_nodeconf/mock_nodeconf.go +++ b/common/nodeconf/mock_nodeconf/mock_nodeconf.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf (interfaces: Configuration) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf (interfaces: Configuration,ConfConnector) // Package mock_nodeconf is a generated GoMock package. package mock_nodeconf @@ -35,21 +35,6 @@ func (m *MockConfiguration) EXPECT() *MockConfigurationMockRecorder { return m.recorder } -// AllPeers mocks base method. -func (m *MockConfiguration) AllPeers(arg0 context.Context, arg1 string) ([]peer.Peer, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AllPeers", arg0, arg1) - ret0, _ := ret[0].([]peer.Peer) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// AllPeers indicates an expected call of AllPeers. -func (mr *MockConfigurationMockRecorder) AllPeers(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllPeers", reflect.TypeOf((*MockConfiguration)(nil).AllPeers), arg0, arg1) -} - // Id mocks base method. func (m *MockConfiguration) Id() string { m.ctrl.T.Helper() @@ -92,32 +77,55 @@ func (mr *MockConfigurationMockRecorder) NodeIds(arg0 interface{}) *gomock.Call return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeIds", reflect.TypeOf((*MockConfiguration)(nil).NodeIds), arg0) } -// OnePeer mocks base method. -func (m *MockConfiguration) OnePeer(arg0 context.Context, arg1 string) (peer.Peer, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "OnePeer", arg0, arg1) - ret0, _ := ret[0].(peer.Peer) - ret1, _ := ret[1].(error) - return ret0, ret1 +// MockConfConnector is a mock of ConfConnector interface. +type MockConfConnector struct { + ctrl *gomock.Controller + recorder *MockConfConnectorMockRecorder } -// OnePeer indicates an expected call of OnePeer. -func (mr *MockConfigurationMockRecorder) OnePeer(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnePeer", reflect.TypeOf((*MockConfiguration)(nil).OnePeer), arg0, arg1) +// MockConfConnectorMockRecorder is the mock recorder for MockConfConnector. +type MockConfConnectorMockRecorder struct { + mock *MockConfConnector } -// ResponsiblePeers mocks base method. -func (m *MockConfiguration) ResponsiblePeers(arg0 context.Context, arg1 string) ([]peer.Peer, error) { +// NewMockConfConnector creates a new mock instance. +func NewMockConfConnector(ctrl *gomock.Controller) *MockConfConnector { + mock := &MockConfConnector{ctrl: ctrl} + mock.recorder = &MockConfConnectorMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockConfConnector) EXPECT() *MockConfConnectorMockRecorder { + return m.recorder +} + +// DialResponsiblePeers mocks base method. +func (m *MockConfConnector) DialResponsiblePeers(arg0 context.Context, arg1 string) ([]peer.Peer, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ResponsiblePeers", arg0, arg1) + ret := m.ctrl.Call(m, "DialResponsiblePeers", arg0, arg1) ret0, _ := ret[0].([]peer.Peer) ret1, _ := ret[1].(error) return ret0, ret1 } -// ResponsiblePeers indicates an expected call of ResponsiblePeers. -func (mr *MockConfigurationMockRecorder) ResponsiblePeers(arg0, arg1 interface{}) *gomock.Call { +// DialResponsiblePeers indicates an expected call of DialResponsiblePeers. +func (mr *MockConfConnectorMockRecorder) DialResponsiblePeers(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResponsiblePeers", reflect.TypeOf((*MockConfiguration)(nil).ResponsiblePeers), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DialResponsiblePeers", reflect.TypeOf((*MockConfConnector)(nil).DialResponsiblePeers), arg0, arg1) +} + +// GetResponsiblePeers mocks base method. +func (m *MockConfConnector) GetResponsiblePeers(arg0 context.Context, arg1 string) ([]peer.Peer, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetResponsiblePeers", arg0, arg1) + ret0, _ := ret[0].([]peer.Peer) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetResponsiblePeers indicates an expected call of GetResponsiblePeers. +func (mr *MockConfConnectorMockRecorder) GetResponsiblePeers(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResponsiblePeers", reflect.TypeOf((*MockConfConnector)(nil).GetResponsiblePeers), arg0, arg1) } diff --git a/common/nodeconf/service.go b/common/nodeconf/service.go index cc80e288..66f6b6b3 100644 --- a/common/nodeconf/service.go +++ b/common/nodeconf/service.go @@ -3,7 +3,6 @@ package nodeconf import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" @@ -29,7 +28,6 @@ type Service interface { type service struct { accountId string - pool pool.Pool consensusPeers []string last Configuration @@ -53,12 +51,10 @@ func (n *Node) Capacity() float64 { func (s *service) Init(a *app.App) (err error) { conf := a.MustComponent(config.CName).(*config.Config) s.accountId = conf.Account.PeerId - s.pool = a.MustComponent(pool.CName).(pool.Pool) config := &configuration{ id: "config", accountId: s.accountId, - pool: s.pool, } if config.chash, err = chash.New(chash.Config{ PartitionCount: partitionCount, diff --git a/go.mod b/go.mod index 48d2d5c4..c25e1b35 100644 --- a/go.mod +++ b/go.mod @@ -61,9 +61,12 @@ require ( go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect + golang.org/x/mod v0.4.2 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect golang.org/x/text v0.3.7 // indirect + golang.org/x/tools v0.1.5 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.1.6 // indirect diff --git a/go.sum b/go.sum index cf56905e..6805b56c 100644 --- a/go.sum +++ b/go.sum @@ -167,6 +167,7 @@ golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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= @@ -207,6 +208,7 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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= From c3d8273caad15a2d7fd1107143971a675e2e0a17 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 10 Oct 2022 09:10:47 +0200 Subject: [PATCH 124/219] SyncTree tests --- common/commonspace/synctree/synctree.go | 14 +- common/commonspace/synctree/synctree_test.go | 176 ++++++++++++++++++ .../mock_updatelistener.go | 59 ++++++ .../synctree/updatelistener/updatelistener.go | 1 + 4 files changed, 245 insertions(+), 5 deletions(-) create mode 100644 common/commonspace/synctree/synctree_test.go create mode 100644 common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 99c6014d..14e05a3e 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -17,6 +17,10 @@ type SyncTree struct { listener updatelistener.UpdateListener } +var createDerivedObjectTree = tree.CreateDerivedObjectTree +var createObjectTree = tree.CreateObjectTree +var buildObjectTree = tree.BuildObjectTree + func DeriveSyncTree( ctx context.Context, payload tree.ObjectTreeCreatePayload, @@ -24,7 +28,7 @@ func DeriveSyncTree( listener updatelistener.UpdateListener, aclList list.ACLList, createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { - t, err = tree.CreateDerivedObjectTree(payload, aclList, createStorage) + t, err = createDerivedObjectTree(payload, aclList, createStorage) if err != nil { return } @@ -46,7 +50,7 @@ func CreateSyncTree( listener updatelistener.UpdateListener, aclList list.ACLList, createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { - t, err = tree.CreateObjectTree(payload, aclList, createStorage) + t, err = createObjectTree(payload, aclList, createStorage) if err != nil { return } @@ -76,7 +80,7 @@ func buildSyncTree( treeStorage storage.TreeStorage, listener updatelistener.UpdateListener, aclList list.ACLList) (t tree.ObjectTree, err error) { - t, err = tree.BuildObjectTree(treeStorage, aclList) + t, err = buildObjectTree(treeStorage, aclList) if err != nil { return } @@ -93,7 +97,7 @@ func buildSyncTree( } func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeContent) (res tree.AddResult, err error) { - res, err = s.AddContent(ctx, content) + res, err = s.ObjectTree.AddContent(ctx, content) if err != nil { return } @@ -103,7 +107,7 @@ func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeCo } func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeproto.RawTreeChangeWithId) (res tree.AddResult, err error) { - res, err = s.AddRawChanges(ctx, changes...) + res, err = s.ObjectTree.AddRawChanges(ctx, changes...) if err != nil { return } diff --git a/common/commonspace/synctree/synctree_test.go b/common/commonspace/synctree/synctree_test.go new file mode 100644 index 00000000..ef1bd99f --- /dev/null +++ b/common/commonspace/synctree/synctree_test.go @@ -0,0 +1,176 @@ +package synctree + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/mock_syncservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener/mock_updatelistener" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list/mock_list" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage/mock_storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + mock_tree "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree/mock_objecttree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" + "testing" +) + +type syncTreeMatcher struct { + objTree tree.ObjectTree + client syncservice.SyncClient + listener updatelistener.UpdateListener +} + +func (s syncTreeMatcher) Matches(x interface{}) bool { + t, ok := x.(*SyncTree) + if !ok { + return false + } + return s.objTree == t.ObjectTree && t.syncClient == s.client && t.listener == s.listener +} + +func (s syncTreeMatcher) String() string { + return "" +} + +func Test_DeriveSyncTree(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl) + syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) + aclListMock := mock_list.NewMockACLList(ctrl) + createStorage := storage.TreeStorageCreatorFunc(func(payload storage.TreeStorageCreatePayload) (storage.TreeStorage, error) { + return nil, nil + }) + objTreeMock := mock_tree.NewMockObjectTree(ctrl) + createDerivedObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { + require.Equal(t, l, aclListMock) + return objTreeMock, nil + } + headUpdate := &spacesyncproto.ObjectSyncMessage{} + syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) + syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) + + _, err := DeriveSyncTree(ctx, tree.ObjectTreeCreatePayload{}, syncClientMock, updateListenerMock, aclListMock, createStorage) + require.NoError(t, err) +} + +func Test_CreateSyncTree(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl) + syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) + aclListMock := mock_list.NewMockACLList(ctrl) + createStorage := storage.TreeStorageCreatorFunc(func(payload storage.TreeStorageCreatePayload) (storage.TreeStorage, error) { + return nil, nil + }) + objTreeMock := mock_tree.NewMockObjectTree(ctrl) + createObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { + require.Equal(t, l, aclListMock) + return objTreeMock, nil + } + headUpdate := &spacesyncproto.ObjectSyncMessage{} + syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) + syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) + + _, err := CreateSyncTree(ctx, tree.ObjectTreeCreatePayload{}, syncClientMock, updateListenerMock, aclListMock, createStorage) + require.NoError(t, err) +} + +func Test_BuildSyncTree(t *testing.T) { + ctx := context.Background() + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl) + syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) + aclListMock := mock_list.NewMockACLList(ctrl) + storageMock := mock_storage.NewMockTreeStorage(ctrl) + objTreeMock := mock_tree.NewMockObjectTree(ctrl) + buildObjectTree = func(store storage.TreeStorage, l list.ACLList) (objTree tree.ObjectTree, err error) { + require.Equal(t, aclListMock, l) + require.Equal(t, store, storageMock) + return objTreeMock, nil + } + headUpdate := &spacesyncproto.ObjectSyncMessage{} + syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) + syncClientMock.EXPECT().BroadcastAsyncOrSendResponsible(gomock.Eq(headUpdate)).Return(nil) + + tr, err := BuildSyncTree(ctx, syncClientMock, storageMock, updateListenerMock, aclListMock) + require.NoError(t, err) + + t.Run("AddRawChanges update", func(t *testing.T) { + changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} + expectedRes := tree.AddResult{ + Added: changes, + Mode: tree.Append, + } + objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). + 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...) + require.NoError(t, err) + require.Equal(t, expectedRes, res) + }) + + t.Run("AddRawChanges rebuild", func(t *testing.T) { + changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} + expectedRes := tree.AddResult{ + Added: changes, + Mode: tree.Rebuild, + } + objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). + 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...) + require.NoError(t, err) + require.Equal(t, expectedRes, res) + }) + + t.Run("AddRawChanges nothing", func(t *testing.T) { + changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} + expectedRes := tree.AddResult{ + Added: changes, + Mode: tree.Nothing, + } + objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). + Return(expectedRes, nil) + + res, err := tr.AddRawChanges(ctx, changes...) + require.NoError(t, err) + require.Equal(t, expectedRes, res) + }) + + t.Run("AddContent", func(t *testing.T) { + changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} + content := tree.SignableChangeContent{ + Data: []byte("abcde"), + } + expectedRes := tree.AddResult{ + Mode: tree.Append, + Added: changes, + } + objTreeMock.EXPECT().AddContent(gomock.Any(), gomock.Eq(content)). + Return(expectedRes, nil) + + syncClientMock.EXPECT().CreateHeadUpdate(gomock.Eq(tr), gomock.Eq(changes)).Return(headUpdate) + syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) + res, err := tr.AddContent(ctx, content) + require.NoError(t, err) + require.Equal(t, expectedRes, res) + }) +} diff --git a/common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go b/common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go new file mode 100644 index 00000000..cb88dd6a --- /dev/null +++ b/common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go @@ -0,0 +1,59 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener (interfaces: UpdateListener) + +// Package mock_updatelistener is a generated GoMock package. +package mock_updatelistener + +import ( + reflect "reflect" + + tree "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + gomock "github.com/golang/mock/gomock" +) + +// MockUpdateListener is a mock of UpdateListener interface. +type MockUpdateListener struct { + ctrl *gomock.Controller + recorder *MockUpdateListenerMockRecorder +} + +// MockUpdateListenerMockRecorder is the mock recorder for MockUpdateListener. +type MockUpdateListenerMockRecorder struct { + mock *MockUpdateListener +} + +// NewMockUpdateListener creates a new mock instance. +func NewMockUpdateListener(ctrl *gomock.Controller) *MockUpdateListener { + mock := &MockUpdateListener{ctrl: ctrl} + mock.recorder = &MockUpdateListenerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockUpdateListener) EXPECT() *MockUpdateListenerMockRecorder { + return m.recorder +} + +// Rebuild mocks base method. +func (m *MockUpdateListener) Rebuild(arg0 tree.ObjectTree) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Rebuild", arg0) +} + +// Rebuild indicates an expected call of Rebuild. +func (mr *MockUpdateListenerMockRecorder) Rebuild(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Rebuild", reflect.TypeOf((*MockUpdateListener)(nil).Rebuild), arg0) +} + +// Update mocks base method. +func (m *MockUpdateListener) Update(arg0 tree.ObjectTree) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Update", arg0) +} + +// Update indicates an expected call of Update. +func (mr *MockUpdateListenerMockRecorder) Update(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockUpdateListener)(nil).Update), arg0) +} diff --git a/common/commonspace/synctree/updatelistener/updatelistener.go b/common/commonspace/synctree/updatelistener/updatelistener.go index 0a1a6659..49f6e0d5 100644 --- a/common/commonspace/synctree/updatelistener/updatelistener.go +++ b/common/commonspace/synctree/updatelistener/updatelistener.go @@ -1,3 +1,4 @@ +//go:generate mockgen -destination mock_updatelistener/mock_updatelistener.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener UpdateListener package updatelistener import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" From 01438d630d76615f0021736865b9412160f3b090 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Mon, 10 Oct 2022 11:38:25 +0300 Subject: [PATCH 125/219] fix --- consensus/db/db.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consensus/db/db.go b/consensus/db/db.go index 638352f3..f2c4540e 100644 --- a/consensus/db/db.go +++ b/consensus/db/db.go @@ -91,7 +91,7 @@ type findRecordQuery struct { type updateOp struct { Push struct { Records struct { - Each []consensus.Record `bson:"$each""` + Each []consensus.Record `bson:"$each"` Pos int `bson:"$position"` } `bson:"records"` } `bson:"$push"` From 46d5d464b6d022b13519868b54dcc92c42e6015a Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Mon, 10 Oct 2022 13:48:56 +0300 Subject: [PATCH 126/219] log config --- Makefile | 2 +- app/logger/log.go | 39 +++++++++++++++++++++++++---- cmd/consensusnode/consensusnode.go | 2 +- common/net/dialer/dialer.go | 2 +- common/net/pool/pool.go | 2 +- common/net/rpc/server/drpcserver.go | 2 +- common/net/secure/service.go | 2 +- config/config.go | 1 + config/log.go | 36 ++++++++++++++++++++++++++ consensus/config/config.go | 1 + etc/configs/cons1.yml | 6 ++++- 11 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 config/log.go diff --git a/Makefile b/Makefile index ad53dc00..ab3b8f33 100644 --- a/Makefile +++ b/Makefile @@ -39,4 +39,4 @@ build: build-consensus: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) - go build -v -o bin/consensus-node -ldflags "$(FLAGS)" cmd/consensusnode/consensusnode.go \ No newline at end of file + go build -v -o bin/consensus-node -ldflags "$(FLAGS)" cmd/consensusnode/consensusnode.go diff --git a/app/logger/log.go b/app/logger/log.go index a1ac3b35..a9f30252 100644 --- a/app/logger/log.go +++ b/app/logger/log.go @@ -1,21 +1,50 @@ package logger -import "go.uber.org/zap" +import ( + "go.uber.org/zap" + "sync" +) -var DefaultLogger *zap.Logger +var ( + mu sync.Mutex + defaultLogger *zap.Logger + levels = make(map[string]zap.AtomicLevel) + loggers = make(map[string]*zap.Logger) +) func init() { - DefaultLogger, _ = zap.NewDevelopment() + defaultLogger, _ = zap.NewDevelopment() + zap.NewProduction() +} + +func SetDefault(l *zap.Logger) { + mu.Lock() + defer mu.Unlock() + *defaultLogger = *l + for name, l := range loggers { + *l = *defaultLogger.Named(name) + } +} + +func SetNamedLevels(l map[string]zap.AtomicLevel) { + mu.Lock() + defer mu.Unlock() + levels = l } func Default() *zap.Logger { - return DefaultLogger + mu.Lock() + defer mu.Unlock() + return defaultLogger } func NewNamed(name string, fields ...zap.Field) *zap.Logger { - l := DefaultLogger.Named(name) + mu.Lock() + defer mu.Unlock() + l := defaultLogger.Named(name) if len(fields) > 0 { l = l.With(fields...) } + loggers[name] = l return l } diff --git a/cmd/consensusnode/consensusnode.go b/cmd/consensusnode/consensusnode.go index c17166d8..491d7ce9 100644 --- a/cmd/consensusnode/consensusnode.go +++ b/cmd/consensusnode/consensusnode.go @@ -58,7 +58,7 @@ func main() { if err != nil { log.Fatal("can't open config file", zap.Error(err)) } - + conf.Log.ApplyGlobal() // bootstrap components a.Register(conf) Bootstrap(a) diff --git a/common/net/dialer/dialer.go b/common/net/dialer/dialer.go index 80d0d6f2..9de13e31 100644 --- a/common/net/dialer/dialer.go +++ b/common/net/dialer/dialer.go @@ -16,7 +16,7 @@ import ( "sync" ) -const CName = "net/dialer" +const CName = "common.net.dialer" var ErrArrdsNotFound = errors.New("addrs for peer not found") diff --git a/common/net/pool/pool.go b/common/net/pool/pool.go index 4b7c4c45..dfd15e5d 100644 --- a/common/net/pool/pool.go +++ b/common/net/pool/pool.go @@ -13,7 +13,7 @@ import ( ) const ( - CName = "net.pool" + CName = "common.net.pool" ) var log = logger.NewNamed(CName) diff --git a/common/net/rpc/server/drpcserver.go b/common/net/rpc/server/drpcserver.go index 3219a831..76131f27 100644 --- a/common/net/rpc/server/drpcserver.go +++ b/common/net/rpc/server/drpcserver.go @@ -18,7 +18,7 @@ import ( "time" ) -const CName = "net/drpcserver" +const CName = "common.net.drpcserver" var log = logger.NewNamed(CName) diff --git a/common/net/secure/service.go b/common/net/secure/service.go index d8ade632..3e70521d 100644 --- a/common/net/secure/service.go +++ b/common/net/secure/service.go @@ -16,7 +16,7 @@ import ( type HandshakeError error -const CName = "net/secure" +const CName = "common.net.secure" var log = logger.NewNamed(CName) diff --git a/config/config.go b/config/config.go index 2894015a..7bfd1746 100644 --- a/config/config.go +++ b/config/config.go @@ -30,6 +30,7 @@ type Config struct { Nodes []Node `yaml:"nodes"` Space Space `yaml:"space"` Metric Metric `yaml:"metric"` + Log Log `yaml:"log"` } func (c *Config) Init(a *app.App) (err error) { diff --git a/config/log.go b/config/log.go new file mode 100644 index 00000000..a09a8597 --- /dev/null +++ b/config/log.go @@ -0,0 +1,36 @@ +package config + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "go.uber.org/zap" +) + +type Log struct { + Production bool `yaml:"production"` + DefaultLevel string `yaml:"defaultLevel"` + NamedLevels map[string]string `yaml:"namedLevels"` +} + +func (l Log) ApplyGlobal() { + var conf zap.Config + if l.Production { + conf = zap.NewProductionConfig() + } else { + conf = zap.NewDevelopmentConfig() + } + if defaultLevel, err := zap.ParseAtomicLevel(l.DefaultLevel); err == nil { + conf.Level = defaultLevel + } + var levels = make(map[string]zap.AtomicLevel) + for k, v := range l.NamedLevels { + if lev, err := zap.ParseAtomicLevel(v); err != nil { + levels[k] = lev + } + } + defaultLogger, err := conf.Build() + if err != nil { + logger.Default().Fatal("can't build logger", zap.Error(err)) + } + logger.SetDefault(defaultLogger) + logger.SetNamedLevels(levels) +} diff --git a/consensus/config/config.go b/consensus/config/config.go index 30bd4400..32ce5838 100644 --- a/consensus/config/config.go +++ b/consensus/config/config.go @@ -26,6 +26,7 @@ type Config struct { Account config.Account `yaml:"account"` Mongo Mongo `yaml:"mongo"` Metric config.Metric `yaml:"metric"` + Log config.Log `yaml:"log"` } func (c *Config) Init(a *app.App) (err error) { diff --git a/etc/configs/cons1.yml b/etc/configs/cons1.yml index 19bb7fe4..a3138c7f 100755 --- a/etc/configs/cons1.yml +++ b/etc/configs/cons1.yml @@ -11,4 +11,8 @@ mongo: database: consensus logCollection: log metric: - addr: "127.0.0.1:4000" \ No newline at end of file + addr: "127.0.0.1:4000" +log: + production: true + defaultLevel: debug + From d3acc71d957534881904c8b89d854239b7b3845b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 10 Oct 2022 20:10:47 +0200 Subject: [PATCH 127/219] Add some raw prototypes for storage --- common/commonspace/storage/storage.go | 1 + go.mod | 4 +- go.sum | 4 +- node/storage/keys.go | 37 +++++ node/storage/spacestorage.go | 136 +++++++++++++++ node/storage/storageservice.go | 27 +++ node/storage/treestorage.go | 157 ++++++++++++++++++ .../tree/mock_objecttree/mock_objecttree.go | 4 +- 8 files changed, 363 insertions(+), 7 deletions(-) create mode 100644 node/storage/keys.go create mode 100644 node/storage/spacestorage.go create mode 100644 node/storage/storageservice.go create mode 100644 node/storage/treestorage.go diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index fc1cfa8d..3a98da37 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -12,6 +12,7 @@ import ( const CName = "commonspace.storage" var ErrSpaceStorageExists = errors.New("space storage exists") +var ErrSpaceStorageMissing = errors.New("space storage missing") type SpaceStorage interface { storage.Provider diff --git a/go.mod b/go.mod index c25e1b35..8023dfa2 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments go 1.18 require ( + github.com/akrylysov/pogreb v0.10.1 github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab github.com/cespare/xxhash v1.1.0 @@ -61,12 +62,9 @@ require ( go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect - golang.org/x/mod v0.4.2 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect golang.org/x/text v0.3.7 // indirect - golang.org/x/tools v0.1.5 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.1.6 // indirect diff --git a/go.sum b/go.sum index 6805b56c..08295176 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,8 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/akrylysov/pogreb v0.10.1 h1:FqlR8VR7uCbJdfUob916tPM+idpKgeESDXOA1K0DK4w= +github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= 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/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab h1:+cdNqtOJWjvepyhxy23G7z7vmpYCoC65AP0nqi1f53s= @@ -167,7 +169,6 @@ golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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= @@ -208,7 +209,6 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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= diff --git a/node/storage/keys.go b/node/storage/keys.go new file mode 100644 index 00000000..dbfdf385 --- /dev/null +++ b/node/storage/keys.go @@ -0,0 +1,37 @@ +package storage + +import ( + "fmt" + "strings" +) + +type treeKeys struct { + id string +} + +func (t treeKeys) HeadsKey() string { + return fmt.Sprintf("%s/heads", t.id) +} + +func (t treeKeys) RootKey() string { + return fmt.Sprintf("t/%s", t.id) +} + +func (t treeKeys) RawChangeKey(id string) string { + return fmt.Sprintf("%s/%s", t.id, id) +} + +type spaceKeys struct { +} + +func (s spaceKeys) HeaderKey() string { + return "header" +} + +func (s spaceKeys) ACLKey() string { + return "acl" +} + +func isTreeKey(path string) bool { + return strings.HasPrefix(path, "t/") +} diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go new file mode 100644 index 00000000..66279f72 --- /dev/null +++ b/node/storage/spacestorage.go @@ -0,0 +1,136 @@ +package storage + +import ( + "github.com/akrylysov/pogreb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/gogo/protobuf/proto" + "path" + "sync" +) + +type spaceStorage struct { + objDb *pogreb.DB + keys spaceKeys + mx sync.Mutex +} + +func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceStorage, err error) { + dbPath := path.Join(rootPath, spaceId) + objDb, err := pogreb.Open(dbPath, nil) + if err != nil { + return + } + keys := spaceKeys{} + has, err := objDb.Has([]byte(keys.HeaderKey())) + if err != nil { + return + } + if !has { + err = spacestorage.ErrSpaceStorageMissing + return + } + + has, err = objDb.Has([]byte(keys.ACLKey())) + if err != nil { + return + } + if !has { + err = spacestorage.ErrSpaceStorageMissing + return + } + + store = &spaceStorage{ + objDb: objDb, + keys: keys, + } + return +} + +func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) { + dbPath := path.Join(rootPath, payload.Id) + db, err := pogreb.Open(dbPath, nil) + if err != nil { + return + } + + keys := spaceKeys{} + has, err := db.Has([]byte(keys.HeaderKey())) + if err != nil { + return + } + if has { + err = spacestorage.ErrSpaceStorageExists + return + } + + err = db.Put([]byte(payload.RecWithId.Id), payload.RecWithId.Payload) + if err != nil { + return + } + + marshalled, err := payload.SpaceHeader.Marshal() + if err != nil { + return + } + err = db.Put([]byte(payload.Id), marshalled) + if err != nil { + return + } + store = &spaceStorage{ + objDb: db, + keys: keys, + } + return +} + +func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) { + return newTreeStorage(s.objDb, id) +} + +func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { + s.mx.Lock() + defer s.mx.Unlock() + has, err := s.objDb.Has([]byte(payload.TreeId)) + if err != nil { + return + } + if has { + err = spacestorage.ErrSpaceStorageExists + return + } + return createTreeStorage(s.objDb, payload) +} + +func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) { + return nil, nil +} + +func (s *spaceStorage) SpaceHeader() (header *spacesyncproto.SpaceHeader, err error) { + res, err := s.objDb.Get([]byte(s.keys.HeaderKey())) + if err != nil { + return + } + + header = &spacesyncproto.SpaceHeader{} + err = proto.Unmarshal(res, header) + return +} + +func (s *spaceStorage) StoredIds() (ids []string, err error) { + index := s.objDb.Items() + _, value, err := index.Next() + for err == nil { + strVal := string(value) + if isTreeKey(strVal) { + ids = append(ids, string(value)) + } + _, value, err = index.Next() + } + if err != pogreb.ErrIterationDone { + return + } + err = nil + return +} diff --git a/node/storage/storageservice.go b/node/storage/storageservice.go new file mode 100644 index 00000000..802a4f47 --- /dev/null +++ b/node/storage/storageservice.go @@ -0,0 +1,27 @@ +package storage + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" +) + +type storageService struct { + rootPath string +} + +func (s *storageService) Init(a *app.App) (err error) { + //TODO implement me + panic("implement me") +} + +func (s *storageService) Name() (name string) { + return storage.CName +} + +func (s *storageService) SpaceStorage(id string) (storage.SpaceStorage, error) { + return newSpaceStorage(s.rootPath, id) +} + +func (s *storageService) CreateSpaceStorage(payload storage.SpaceStorageCreatePayload) (storage.SpaceStorage, error) { + return createSpaceStorage(s.rootPath, payload) +} diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go new file mode 100644 index 00000000..2512f565 --- /dev/null +++ b/node/storage/treestorage.go @@ -0,0 +1,157 @@ +package storage + +import ( + "bytes" + "context" + "github.com/akrylysov/pogreb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/gogo/protobuf/proto" + "strings" + "sync" +) + +type treeStorage struct { + db *pogreb.DB + path treeKeys + id string + rootPath []byte + headsPath []byte + heads []string + root *treechangeproto.RawTreeChangeWithId + headsMx sync.Mutex +} + +func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) { + path := treeKeys{treeId} + heads, err := db.Get([]byte(path.HeadsKey())) + if err != nil { + return + } + + res, err := db.Get([]byte(path.RootKey())) + if err != nil { + return + } + + root := &treechangeproto.RawTreeChangeWithId{} + err = proto.Unmarshal(res, root) + if err != nil { + return + } + + ts = &treeStorage{ + db: db, + path: path, + rootPath: []byte(path.RootKey()), + headsPath: []byte(path.HeadsKey()), + id: treeId, + heads: parseHeads(heads), + root: root, + } + return +} + +func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { + path := treeKeys{payload.TreeId} + heads := createHeadsPayload(payload.Heads) + + for _, ch := range payload.Changes { + err = db.Put([]byte(path.RawChangeKey(ch.Id)), ch.GetRawChange()) + if err != nil { + return + } + } + + err = db.Put([]byte(path.HeadsKey()), heads) + if err != nil { + return + } + + err = db.Put([]byte(path.RootKey()), payload.RootRawChange.GetRawChange()) + if err != nil { + return + } + + ts = &treeStorage{ + db: db, + path: path, + rootPath: []byte(path.RootKey()), + headsPath: []byte(path.HeadsKey()), + id: payload.TreeId, + heads: payload.Heads, + root: payload.RootRawChange, + } + return +} + +func (t *treeStorage) ID() (string, error) { + return t.id, nil +} + +func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err error) { + return t.root, nil +} + +func (t *treeStorage) Heads() ([]string, error) { + t.headsMx.Lock() + defer t.headsMx.Unlock() + return t.heads, nil +} + +func (t *treeStorage) SetHeads(heads []string) (err error) { + defer func() { + if err == nil { + t.headsMx.Lock() + t.heads = heads + t.headsMx.Unlock() + } + }() + payload := createHeadsPayload(heads) + return t.db.Put(t.headsPath, payload) +} + +func (t *treeStorage) AddRawChange(change *treechangeproto.RawTreeChangeWithId) (err error) { + return t.db.Put([]byte(change.Id), change.RawChange) +} + +func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treechangeproto.RawTreeChangeWithId, err error) { + res, err := t.db.Get([]byte(t.path.RawChangeKey(id))) + if err != nil { + return + } + + raw = &treechangeproto.RawTreeChangeWithId{ + RawChange: res, + Id: id, + } + return +} + +func (t *treeStorage) HasChange(ctx context.Context, id string) (bool, error) { + return t.db.Has([]byte(id)) +} + +func parseHeads(headsPayload []byte) []string { + return strings.Split(string(headsPayload), "/") +} + +func createHeadsPayload(heads []string) []byte { + var ( + b bytes.Buffer + totalLen int + ) + for _, s := range heads { + totalLen += len(s) + } + // adding separators + totalLen += len(heads) - 1 + b.Grow(totalLen) + for idx, s := range heads { + if idx > 0 { + b.WriteString("/") + } + b.WriteString(s) + } + return b.Bytes() +} diff --git a/pkg/acl/tree/mock_objecttree/mock_objecttree.go b/pkg/acl/tree/mock_objecttree/mock_objecttree.go index 70afa9d4..b739900c 100644 --- a/pkg/acl/tree/mock_objecttree/mock_objecttree.go +++ b/pkg/acl/tree/mock_objecttree/mock_objecttree.go @@ -137,7 +137,7 @@ func (mr *MockObjectTreeMockRecorder) HasChanges(arg0 ...interface{}) *gomock.Ca // Header mocks base method. func (m *MockObjectTree) Header() *treechangeproto.RawTreeChangeWithId { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Header") + ret := m.ctrl.Call(m, "HeaderKey") ret0, _ := ret[0].(*treechangeproto.RawTreeChangeWithId) return ret0 } @@ -145,7 +145,7 @@ func (m *MockObjectTree) Header() *treechangeproto.RawTreeChangeWithId { // Header indicates an expected call of Header. func (mr *MockObjectTreeMockRecorder) Header() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockObjectTree)(nil).Header)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeaderKey", reflect.TypeOf((*MockObjectTree)(nil).Header)) } // Heads mocks base method. From 526ddf12d5f8f1bda7b95c996785c60efb3df684 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 10 Oct 2022 23:08:44 +0200 Subject: [PATCH 128/219] WIP storage --- common/commonspace/diffservice/diffsyncer.go | 1 - .../diffservice/diffsyncer_test.go | 8 +- common/commonspace/payloads.go | 34 +- common/commonspace/service.go | 4 +- .../spacesyncproto/protos/spacesync.proto | 13 +- .../spacesyncproto/spacesync.pb.go | 626 ++++++++++++++---- .../storage/mock_storage/mock_storage.go | 4 +- common/commonspace/storage/storage.go | 7 +- node/nodespace/rpchandler.go | 7 +- node/storage/keys.go | 6 +- node/storage/spacestorage.go | 21 +- node/storage/treestorage.go | 37 +- pkg/acl/aclrecordproto/aclrecord.pb.go | 1 - .../testutils/testchanges/proto/test.pb.go | 1 - .../tree/mock_objecttree/mock_objecttree.go | 4 +- 15 files changed, 614 insertions(+), 160 deletions(-) diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index fe1d5d93..d5022323 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -107,7 +107,6 @@ func (d *diffSyncer) sendPushSpaceRequest(ctx context.Context, cl spacesyncproto } _, err = cl.PushSpace(ctx, &spacesyncproto.PushSpaceRequest{ - SpaceId: d.spaceId, SpaceHeader: header, AclRoot: root, }) diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index 444b73fa..47fa3c2d 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -25,7 +25,7 @@ import ( type pushSpaceRequestMatcher struct { spaceId string aclRoot *aclrecordproto.RawACLRecordWithId - spaceHeader *spacesyncproto.SpaceHeader + spaceHeader *spacesyncproto.RawSpaceHeaderWithId } func (p pushSpaceRequestMatcher) Matches(x interface{}) bool { @@ -34,7 +34,7 @@ func (p pushSpaceRequestMatcher) Matches(x interface{}) bool { return false } - return res.SpaceId == p.spaceId && res.AclRoot == p.aclRoot && res.SpaceHeader == p.spaceHeader + return res.AclRoot == p.aclRoot && res.SpaceHeader == p.spaceHeader } func (p pushSpaceRequestMatcher) String() string { @@ -73,7 +73,7 @@ func (m mockPeer) NewStream(ctx context.Context, rpc string, enc drpc.Encoding) func newPushSpaceRequestMatcher( spaceId string, aclRoot *aclrecordproto.RawACLRecordWithId, - spaceHeader *spacesyncproto.SpaceHeader) *pushSpaceRequestMatcher { + spaceHeader *spacesyncproto.RawSpaceHeaderWithId) *pushSpaceRequestMatcher { return &pushSpaceRequestMatcher{ spaceId: spaceId, aclRoot: aclRoot, @@ -125,7 +125,7 @@ func TestDiffSyncer_Sync(t *testing.T) { t.Run("diff syncer sync space missing", func(t *testing.T) { aclStorageMock := mock_aclstorage.NewMockListStorage(ctrl) aclRoot := &aclrecordproto.RawACLRecordWithId{} - spaceHeader := &spacesyncproto.SpaceHeader{} + spaceHeader := &spacesyncproto.RawSpaceHeaderWithId{} connectorMock.EXPECT(). GetResponsiblePeers(gomock.Any(), spaceId). diff --git a/common/commonspace/payloads.go b/common/commonspace/payloads.go index fae285ab..7c25884d 100644 --- a/common/commonspace/payloads.go +++ b/common/commonspace/payloads.go @@ -39,11 +39,21 @@ func storagePayloadForSpaceCreate(payload SpaceCreatePayload) (storagePayload st if err != nil { return } - id, err := cid.NewCIDFromBytes(marshalled) + signature, err := payload.SigningKey.Sign(marshalled) if err != nil { return } + rawHeader := &spacesyncproto.RawSpaceHeader{SpaceHeader: marshalled, Signature: signature} + marshalled, err = rawHeader.Marshal() + if err != nil { + return + } + id, err := cid.NewCIDFromBytes(marshalled) spaceId := NewSpaceId(id, payload.ReplicationKey) + rawHeaderWithId := &spacesyncproto.RawSpaceHeaderWithId{ + RawHeader: marshalled, + Id: spaceId, + } // encrypting read key hasher := fnv.New64() @@ -74,9 +84,8 @@ func storagePayloadForSpaceCreate(payload SpaceCreatePayload) (storagePayload st // creating storage storagePayload = storage.SpaceStorageCreatePayload{ - RecWithId: rawWithId, - SpaceHeader: header, - Id: id, + RecWithId: rawWithId, + SpaceHeaderWithId: rawHeaderWithId, } return } @@ -118,11 +127,21 @@ func storagePayloadForSpaceDerive(payload SpaceDerivePayload) (storagePayload st if err != nil { return } - id, err := cid.NewCIDFromBytes(marshalled) + signature, err := payload.SigningKey.Sign(marshalled) if err != nil { return } + rawHeader := &spacesyncproto.RawSpaceHeader{SpaceHeader: marshalled, Signature: signature} + marshalled, err = rawHeader.Marshal() + if err != nil { + return + } + id, err := cid.NewCIDFromBytes(marshalled) spaceId := NewSpaceId(id, repKey) + rawHeaderWithId := &spacesyncproto.RawSpaceHeaderWithId{ + RawHeader: marshalled, + Id: spaceId, + } // deriving and encrypting read key readKey, err := aclrecordproto.ACLReadKeyDerive(signPrivKey, encPrivKey) @@ -157,9 +176,8 @@ func storagePayloadForSpaceDerive(payload SpaceDerivePayload) (storagePayload st // creating storage storagePayload = storage.SpaceStorageCreatePayload{ - RecWithId: rawWithId, - SpaceHeader: header, - Id: id, + RecWithId: rawWithId, + SpaceHeaderWithId: rawHeaderWithId, } return } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index adefcf7f..dd0347a1 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -62,7 +62,7 @@ func (s *service) CreateSpace( return } - return s.GetSpace(ctx, storageCreate.Id) + return s.GetSpace(ctx, storageCreate.SpaceHeaderWithId.GetId()) } func (s *service) DeriveSpace( @@ -78,7 +78,7 @@ func (s *service) DeriveSpace( return } - return s.GetSpace(ctx, storageCreate.Id) + return s.GetSpace(ctx, storageCreate.SpaceHeaderWithId.GetId()) } func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index 2b45d366..20bb12fa 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -102,8 +102,7 @@ message ObjectErrorResponse { // PushSpaceRequest is a request to add space on a node containing only one acl record message PushSpaceRequest { - string spaceId = 1; - SpaceHeader spaceHeader = 2; + RawSpaceHeaderWithId spaceHeader = 2; aclrecord.RawACLRecordWithId aclRoot = 3; } @@ -118,3 +117,13 @@ message SpaceHeader { uint64 replicationKey = 4; bytes seed = 5; } + +message RawSpaceHeader { + bytes spaceHeader = 1; + bytes signature = 2; +} + +message RawSpaceHeaderWithId { + bytes rawHeader = 1; + string id = 2; +} diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 0c89fb20..2fe5cbc4 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -747,8 +747,7 @@ func (m *ObjectErrorResponse) GetError() string { // PushSpaceRequest is a request to add space on a node containing only one acl record type PushSpaceRequest struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - SpaceHeader *SpaceHeader `protobuf:"bytes,2,opt,name=spaceHeader,proto3" json:"spaceHeader,omitempty"` + SpaceHeader *RawSpaceHeaderWithId `protobuf:"bytes,2,opt,name=spaceHeader,proto3" json:"spaceHeader,omitempty"` AclRoot *aclrecordproto.RawACLRecordWithId `protobuf:"bytes,3,opt,name=aclRoot,proto3" json:"aclRoot,omitempty"` } @@ -785,14 +784,7 @@ func (m *PushSpaceRequest) XXX_DiscardUnknown() { var xxx_messageInfo_PushSpaceRequest proto.InternalMessageInfo -func (m *PushSpaceRequest) GetSpaceId() string { - if m != nil { - return m.SpaceId - } - return "" -} - -func (m *PushSpaceRequest) GetSpaceHeader() *SpaceHeader { +func (m *PushSpaceRequest) GetSpaceHeader() *RawSpaceHeaderWithId { if m != nil { return m.SpaceHeader } @@ -920,6 +912,110 @@ func (m *SpaceHeader) GetSeed() []byte { return nil } +type RawSpaceHeader struct { + SpaceHeader []byte `protobuf:"bytes,1,opt,name=spaceHeader,proto3" json:"spaceHeader,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` +} + +func (m *RawSpaceHeader) Reset() { *m = RawSpaceHeader{} } +func (m *RawSpaceHeader) String() string { return proto.CompactTextString(m) } +func (*RawSpaceHeader) ProtoMessage() {} +func (*RawSpaceHeader) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{14} +} +func (m *RawSpaceHeader) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RawSpaceHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RawSpaceHeader.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 *RawSpaceHeader) XXX_Merge(src proto.Message) { + xxx_messageInfo_RawSpaceHeader.Merge(m, src) +} +func (m *RawSpaceHeader) XXX_Size() int { + return m.Size() +} +func (m *RawSpaceHeader) XXX_DiscardUnknown() { + xxx_messageInfo_RawSpaceHeader.DiscardUnknown(m) +} + +var xxx_messageInfo_RawSpaceHeader proto.InternalMessageInfo + +func (m *RawSpaceHeader) GetSpaceHeader() []byte { + if m != nil { + return m.SpaceHeader + } + return nil +} + +func (m *RawSpaceHeader) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +type RawSpaceHeaderWithId struct { + RawHeader []byte `protobuf:"bytes,1,opt,name=rawHeader,proto3" json:"rawHeader,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *RawSpaceHeaderWithId) Reset() { *m = RawSpaceHeaderWithId{} } +func (m *RawSpaceHeaderWithId) String() string { return proto.CompactTextString(m) } +func (*RawSpaceHeaderWithId) ProtoMessage() {} +func (*RawSpaceHeaderWithId) Descriptor() ([]byte, []int) { + return fileDescriptor_5855f4ef9cf24cdb, []int{15} +} +func (m *RawSpaceHeaderWithId) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RawSpaceHeaderWithId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RawSpaceHeaderWithId.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 *RawSpaceHeaderWithId) XXX_Merge(src proto.Message) { + xxx_messageInfo_RawSpaceHeaderWithId.Merge(m, src) +} +func (m *RawSpaceHeaderWithId) XXX_Size() int { + return m.Size() +} +func (m *RawSpaceHeaderWithId) XXX_DiscardUnknown() { + xxx_messageInfo_RawSpaceHeaderWithId.DiscardUnknown(m) +} + +var xxx_messageInfo_RawSpaceHeaderWithId proto.InternalMessageInfo + +func (m *RawSpaceHeaderWithId) GetRawHeader() []byte { + if m != nil { + return m.RawHeader + } + return nil +} + +func (m *RawSpaceHeaderWithId) GetId() string { + if m != nil { + return m.Id + } + return "" +} + func init() { proto.RegisterEnum("anySpace.ErrCodes", ErrCodes_name, ErrCodes_value) proto.RegisterType((*HeadSyncRange)(nil), "anySpace.HeadSyncRange") @@ -936,6 +1032,8 @@ func init() { proto.RegisterType((*PushSpaceRequest)(nil), "anySpace.PushSpaceRequest") proto.RegisterType((*PushSpaceResponse)(nil), "anySpace.PushSpaceResponse") proto.RegisterType((*SpaceHeader)(nil), "anySpace.SpaceHeader") + proto.RegisterType((*RawSpaceHeader)(nil), "anySpace.RawSpaceHeader") + proto.RegisterType((*RawSpaceHeaderWithId)(nil), "anySpace.RawSpaceHeaderWithId") } func init() { @@ -943,65 +1041,68 @@ func init() { } var fileDescriptor_5855f4ef9cf24cdb = []byte{ - // 919 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xcd, 0x8e, 0x1b, 0x45, - 0x10, 0xf6, 0x78, 0xbd, 0x6b, 0xbb, 0xbc, 0x3f, 0x4e, 0x87, 0x0d, 0x83, 0x43, 0x1c, 0x33, 0x07, - 0xb4, 0x02, 0xb1, 0x46, 0xe6, 0x10, 0x60, 0x91, 0x50, 0xb2, 0x78, 0x65, 0x2b, 0xe4, 0x47, 0xbd, - 0x09, 0x48, 0x88, 0x4b, 0x67, 0xa6, 0xd6, 0x1e, 0x32, 0x9e, 0x1e, 0xa6, 0xdb, 0x6c, 0xfc, 0x04, - 0x5c, 0x40, 0xe2, 0x09, 0x90, 0x78, 0x16, 0x2e, 0x1c, 0x73, 0xcc, 0x11, 0xed, 0xbe, 0x08, 0xea, - 0x9a, 0x19, 0xcf, 0xd8, 0x4c, 0xb2, 0xc7, 0x5c, 0x3c, 0x5d, 0x55, 0x5f, 0x55, 0x7f, 0xf5, 0xd3, - 0xdd, 0x86, 0xcf, 0x5d, 0x39, 0x9b, 0xc9, 0xb0, 0x9f, 0x7c, 0x54, 0x24, 0x5c, 0xec, 0xd3, 0xaf, - 0x5a, 0x84, 0x6e, 0x14, 0x4b, 0x2d, 0xfb, 0xf4, 0xab, 0x72, 0xed, 0x21, 0x29, 0x58, 0x43, 0x84, - 0x8b, 0x53, 0xa3, 0xeb, 0xf4, 0xa3, 0xe7, 0x93, 0xbe, 0x70, 0x83, 0xbe, 0x8e, 0x11, 0xdd, 0xa9, - 0x08, 0x27, 0xb8, 0xe2, 0x99, 0xab, 0x13, 0xd7, 0xce, 0x27, 0x99, 0x83, 0x70, 0x83, 0x18, 0x5d, - 0x19, 0x7b, 0x2b, 0xf8, 0xa5, 0x36, 0x81, 0x3b, 0x63, 0xd8, 0x19, 0xa1, 0xf0, 0x4e, 0x17, 0xa1, - 0xcb, 0x4d, 0x14, 0xc6, 0xa0, 0x76, 0x16, 0xcb, 0x99, 0x6d, 0xf5, 0xac, 0x83, 0x1a, 0xa7, 0x35, - 0xdb, 0x85, 0xaa, 0x96, 0x76, 0x95, 0x34, 0x55, 0x2d, 0xd9, 0x3b, 0xb0, 0x19, 0xf8, 0x33, 0x5f, - 0xdb, 0x1b, 0x3d, 0xeb, 0x60, 0x87, 0x27, 0x82, 0x73, 0x0e, 0xbb, 0xcb, 0x50, 0xa8, 0xe6, 0x81, - 0x36, 0xb1, 0xa6, 0x42, 0x4d, 0x29, 0xd6, 0x36, 0xa7, 0x35, 0x3b, 0x82, 0x06, 0x06, 0x38, 0xc3, - 0x50, 0x2b, 0xbb, 0xda, 0xdb, 0x38, 0x68, 0x0d, 0x6e, 0x1f, 0x66, 0xd9, 0x1e, 0xae, 0xfa, 0x0f, - 0x13, 0x1c, 0x5f, 0x3a, 0x98, 0x8d, 0x5d, 0x39, 0x0f, 0x97, 0x1b, 0x93, 0xe0, 0x1c, 0xc1, 0x7e, - 0xa9, 0xa3, 0xe1, 0xed, 0x7b, 0xb4, 0x7b, 0x93, 0x57, 0x7d, 0x8f, 0xf8, 0xa0, 0xf0, 0x28, 0x93, - 0x26, 0xa7, 0xb5, 0xf3, 0x23, 0xec, 0xe5, 0xce, 0x3f, 0xcf, 0x51, 0x69, 0x66, 0x43, 0x9d, 0x1a, - 0x32, 0xce, 0x7c, 0x33, 0x91, 0xf5, 0x61, 0x2b, 0x36, 0x55, 0xca, 0xa8, 0xbf, 0x5b, 0x42, 0xdd, - 0xd8, 0x79, 0x0a, 0x73, 0x4e, 0xa0, 0x5d, 0xa0, 0x16, 0xc9, 0x50, 0x21, 0x1b, 0x40, 0x3d, 0x26, - 0x9a, 0xca, 0xb6, 0x28, 0x8a, 0xfd, 0xba, 0x02, 0xf0, 0x0c, 0xe8, 0x5c, 0x58, 0x70, 0xed, 0xd1, - 0xb3, 0x9f, 0xd0, 0xd5, 0xc6, 0xfa, 0x00, 0x95, 0x12, 0x13, 0x7c, 0x03, 0xd1, 0x2f, 0xa1, 0xee, - 0xca, 0x50, 0x63, 0xa8, 0x29, 0xd9, 0xd6, 0xa0, 0x97, 0xef, 0x91, 0xc7, 0x39, 0x4e, 0x20, 0xdf, - 0x89, 0x60, 0x8e, 0x3c, 0x73, 0x60, 0x5f, 0x03, 0xc4, 0x52, 0xea, 0x63, 0x9a, 0x2a, 0xaa, 0xb4, - 0xe9, 0x51, 0x61, 0xd0, 0xb8, 0x38, 0x7f, 0x12, 0x23, 0x26, 0x80, 0xef, 0x7d, 0x3d, 0x1d, 0x7b, - 0xbc, 0xe0, 0xc2, 0x6e, 0xc0, 0x96, 0x41, 0x8f, 0x3d, 0xbb, 0x46, 0xac, 0x52, 0x89, 0x75, 0x01, - 0x74, 0x2c, 0xdc, 0xe7, 0x7e, 0x38, 0x19, 0x7b, 0xf6, 0x26, 0xd9, 0x0a, 0x1a, 0xe7, 0xef, 0x2a, - 0xdc, 0x28, 0x27, 0xc7, 0xbe, 0x02, 0x30, 0xdd, 0x7a, 0x1a, 0x79, 0x42, 0x23, 0x25, 0xdb, 0x1a, - 0x74, 0xd6, 0x53, 0x1a, 0x2d, 0x11, 0xa3, 0x0a, 0x2f, 0xe0, 0xd9, 0x7d, 0xd8, 0x3b, 0x9b, 0x07, - 0x41, 0xa1, 0xc7, 0x69, 0x55, 0x6e, 0xaf, 0x87, 0x38, 0x59, 0x85, 0x8d, 0x2a, 0x7c, 0xdd, 0x93, - 0x3d, 0x84, 0x76, 0xae, 0x4a, 0x5a, 0x9a, 0x16, 0xa9, 0xf7, 0xfa, 0x68, 0x09, 0x6e, 0x54, 0xe1, - 0xff, 0xf3, 0x65, 0x43, 0xd8, 0xc1, 0x38, 0x96, 0xf1, 0x32, 0x58, 0x8d, 0x82, 0xdd, 0x5a, 0x0f, - 0x36, 0x2c, 0x82, 0x46, 0x15, 0xbe, 0xea, 0x75, 0xaf, 0x0e, 0x9b, 0xbf, 0x98, 0x52, 0x39, 0xbf, - 0x5a, 0xd0, 0x5e, 0xaf, 0x87, 0x39, 0x38, 0xa6, 0x1e, 0xc9, 0xc4, 0x35, 0x79, 0x22, 0xb0, 0x2f, - 0xa0, 0x9e, 0xb4, 0x34, 0x3f, 0x8a, 0x57, 0xb4, 0x39, 0xc3, 0x33, 0x07, 0xb6, 0x55, 0x28, 0x22, - 0x35, 0x95, 0xfa, 0xb1, 0xd0, 0x53, 0x7b, 0x83, 0xe2, 0xae, 0xe8, 0x9c, 0xdf, 0x2c, 0xd8, 0x2f, - 0x2d, 0xeb, 0xdb, 0xa1, 0xf3, 0xbb, 0x95, 0x8d, 0xd7, 0x7a, 0x5f, 0xde, 0x0e, 0x9f, 0x8f, 0xe1, - 0x7a, 0x49, 0x67, 0x0d, 0x17, 0xea, 0x6c, 0x7a, 0xa4, 0x13, 0xc1, 0xf9, 0xd3, 0x82, 0xf6, 0xe3, - 0xb9, 0x9a, 0xd2, 0x44, 0x5c, 0x7d, 0x51, 0xdd, 0x81, 0x16, 0x2d, 0xcd, 0x08, 0x60, 0x9c, 0x4e, - 0xfb, 0x7e, 0x3e, 0x52, 0xa7, 0xb9, 0x91, 0x17, 0x91, 0xec, 0x0e, 0xd4, 0x85, 0x1b, 0x70, 0x29, - 0x75, 0x3a, 0xd4, 0xb7, 0x0e, 0xf3, 0x27, 0x83, 0x8b, 0xf3, 0xbb, 0xc7, 0xdf, 0x72, 0x12, 0xb2, - 0x8c, 0x53, 0xb4, 0x73, 0x1d, 0xae, 0x15, 0xf8, 0x25, 0xb9, 0x38, 0x7f, 0x59, 0xd0, 0x2a, 0x6c, - 0xc5, 0x3a, 0xd0, 0xf0, 0x3d, 0x0c, 0xb5, 0xaf, 0x17, 0xe9, 0xa3, 0xb0, 0x94, 0xd9, 0xfb, 0xd0, - 0xd4, 0xfe, 0x0c, 0x95, 0x16, 0xb3, 0x88, 0x08, 0x6f, 0xf0, 0x5c, 0x61, 0xac, 0x44, 0xf3, 0xc9, - 0x22, 0x4a, 0x8e, 0x5b, 0x93, 0xe7, 0x0a, 0xf6, 0x21, 0xec, 0xc6, 0x18, 0x05, 0xbe, 0x2b, 0xb4, - 0x2f, 0xc3, 0xfb, 0xb8, 0xa0, 0x43, 0x54, 0xe3, 0x6b, 0x5a, 0xf3, 0x00, 0x28, 0xc4, 0xe4, 0xee, - 0xd9, 0xe6, 0xb4, 0xfe, 0xe8, 0x21, 0x34, 0x86, 0x71, 0x7c, 0x2c, 0x3d, 0x54, 0x6c, 0x17, 0xe0, - 0x69, 0x88, 0x2f, 0x22, 0x74, 0x35, 0x7a, 0xed, 0x0a, 0x6b, 0xc3, 0x36, 0xd1, 0x7f, 0xe0, 0x2b, - 0xe5, 0x87, 0x93, 0xb6, 0xc5, 0xf6, 0xd2, 0x84, 0x86, 0x2f, 0x7c, 0xa5, 0x55, 0xbb, 0x6a, 0x14, - 0xd4, 0xbf, 0x47, 0x67, 0x67, 0x0a, 0x75, 0xdb, 0x1b, 0xbc, 0xb2, 0x60, 0x93, 0x20, 0xec, 0x2e, - 0x34, 0xb2, 0xfb, 0x9c, 0xbd, 0x57, 0x76, 0xc7, 0x53, 0x17, 0x3b, 0x9d, 0xd2, 0xeb, 0x3f, 0x19, - 0x86, 0x6f, 0xa0, 0xb9, 0xac, 0x2a, 0x2b, 0x00, 0xd7, 0x47, 0xa1, 0x73, 0xb3, 0xd4, 0x96, 0x46, - 0x39, 0x81, 0xad, 0x53, 0x1d, 0xa3, 0x98, 0xb1, 0x9b, 0x65, 0xcf, 0x40, 0xfa, 0x9c, 0x74, 0xde, - 0x64, 0x3c, 0xb0, 0x3e, 0xb5, 0xee, 0x1d, 0xfd, 0x73, 0xd1, 0xb5, 0x5e, 0x5e, 0x74, 0xad, 0x7f, - 0x2f, 0xba, 0xd6, 0x1f, 0x97, 0xdd, 0xca, 0xcb, 0xcb, 0x6e, 0xe5, 0xd5, 0x65, 0xb7, 0xf2, 0xc3, - 0x07, 0x57, 0xfe, 0xd5, 0x79, 0xb6, 0x45, 0x9f, 0xcf, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xce, - 0x99, 0xdc, 0xc5, 0x16, 0x09, 0x00, 0x00, + // 965 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xcd, 0x92, 0xdb, 0x44, + 0x10, 0xb6, 0xbc, 0x3f, 0xb6, 0xdb, 0x5e, 0xaf, 0x33, 0xf9, 0x41, 0x38, 0xc4, 0x31, 0x3a, 0x50, + 0x5b, 0x50, 0xac, 0x29, 0x73, 0xe0, 0x67, 0xa9, 0x82, 0x64, 0xe3, 0x2d, 0xbb, 0x42, 0x92, 0xad, + 0xd9, 0x04, 0xaa, 0x28, 0x2e, 0x13, 0x69, 0xd6, 0x16, 0x91, 0x35, 0x62, 0x66, 0x8c, 0xe3, 0x27, + 0xe0, 0x02, 0x55, 0xbc, 0x02, 0xcf, 0xc2, 0x85, 0x63, 0x8e, 0x39, 0x52, 0xbb, 0x2f, 0x42, 0x4d, + 0x4b, 0xb2, 0x24, 0x47, 0x49, 0x8e, 0xb9, 0xd8, 0xd3, 0x3d, 0x5f, 0xf7, 0x7c, 0xf3, 0x75, 0x8f, + 0xdb, 0xf0, 0xa5, 0x2b, 0xe6, 0x73, 0x11, 0x0e, 0xe2, 0x2f, 0x15, 0x31, 0x97, 0x0f, 0xf0, 0x53, + 0xad, 0x42, 0x37, 0x92, 0x42, 0x8b, 0x01, 0x7e, 0xaa, 0xcc, 0x7b, 0x88, 0x0e, 0x52, 0x67, 0xe1, + 0xea, 0xcc, 0xf8, 0xba, 0x83, 0xe8, 0xd9, 0x74, 0xc0, 0xdc, 0x60, 0xa0, 0x25, 0xe7, 0xee, 0x8c, + 0x85, 0x53, 0x5e, 0x88, 0xcc, 0xdc, 0x71, 0x68, 0xf7, 0xd3, 0x34, 0x80, 0xb9, 0x81, 0xe4, 0xae, + 0x90, 0x5e, 0x01, 0xbf, 0xf6, 0xc6, 0x70, 0x67, 0x02, 0x7b, 0x63, 0xce, 0xbc, 0xb3, 0x55, 0xe8, + 0x52, 0x93, 0x85, 0x10, 0xd8, 0x3e, 0x97, 0x62, 0x6e, 0x5b, 0x7d, 0xeb, 0x60, 0x9b, 0xe2, 0x9a, + 0xb4, 0xa1, 0xaa, 0x85, 0x5d, 0x45, 0x4f, 0x55, 0x0b, 0x72, 0x0d, 0x76, 0x02, 0x7f, 0xee, 0x6b, + 0x7b, 0xab, 0x6f, 0x1d, 0xec, 0xd1, 0xd8, 0x70, 0x96, 0xd0, 0x5e, 0xa7, 0xe2, 0x6a, 0x11, 0x68, + 0x93, 0x6b, 0xc6, 0xd4, 0x0c, 0x73, 0xb5, 0x28, 0xae, 0xc9, 0x11, 0xd4, 0x79, 0xc0, 0xe7, 0x3c, + 0xd4, 0xca, 0xae, 0xf6, 0xb7, 0x0e, 0x9a, 0xc3, 0xdb, 0x87, 0xe9, 0x6d, 0x0f, 0x8b, 0xf1, 0xa3, + 0x18, 0x47, 0xd7, 0x01, 0xe6, 0x60, 0x57, 0x2c, 0xc2, 0xf5, 0xc1, 0x68, 0x38, 0x47, 0x70, 0xbd, + 0x34, 0xd0, 0xf0, 0xf6, 0x3d, 0x3c, 0xbd, 0x41, 0xab, 0xbe, 0x87, 0x7c, 0x38, 0xf3, 0xf0, 0x26, + 0x0d, 0x8a, 0x6b, 0xe7, 0x67, 0xd8, 0xcf, 0x82, 0x7f, 0x5d, 0x70, 0xa5, 0x89, 0x0d, 0x35, 0x2c, + 0xc8, 0x24, 0x8d, 0x4d, 0x4d, 0x32, 0x80, 0x5d, 0x69, 0x54, 0x4a, 0xa9, 0xbf, 0x57, 0x42, 0xdd, + 0xec, 0xd3, 0x04, 0xe6, 0x9c, 0x40, 0x27, 0x47, 0x2d, 0x12, 0xa1, 0xe2, 0x64, 0x08, 0x35, 0x89, + 0x34, 0x95, 0x6d, 0x61, 0x16, 0xfb, 0x75, 0x02, 0xd0, 0x14, 0xe8, 0x5c, 0x58, 0x70, 0xe5, 0xd1, + 0xd3, 0x5f, 0xb8, 0xab, 0xcd, 0xee, 0x03, 0xae, 0x14, 0x9b, 0xf2, 0x37, 0x10, 0xfd, 0x1a, 0x6a, + 0xae, 0x08, 0x35, 0x0f, 0x35, 0x5e, 0xb6, 0x39, 0xec, 0x67, 0x67, 0x64, 0x79, 0x8e, 0x63, 0xc8, + 0x0f, 0x2c, 0x58, 0x70, 0x9a, 0x06, 0x90, 0x6f, 0x01, 0xa4, 0x10, 0xfa, 0x18, 0xbb, 0x0a, 0x95, + 0x36, 0x35, 0xca, 0x35, 0x1a, 0x65, 0xcb, 0xc7, 0x92, 0xf3, 0x18, 0xf0, 0xa3, 0xaf, 0x67, 0x13, + 0x8f, 0xe6, 0x42, 0xc8, 0x0d, 0xd8, 0x35, 0xe8, 0x89, 0x67, 0x6f, 0x23, 0xab, 0xc4, 0x22, 0x3d, + 0x00, 0x2d, 0x99, 0xfb, 0xcc, 0x0f, 0xa7, 0x13, 0xcf, 0xde, 0xc1, 0xbd, 0x9c, 0xc7, 0xf9, 0xa7, + 0x0a, 0x37, 0xca, 0xc9, 0x91, 0x6f, 0x00, 0x4c, 0xb5, 0x9e, 0x44, 0x1e, 0xd3, 0x1c, 0x2f, 0xdb, + 0x1c, 0x76, 0x37, 0xaf, 0x34, 0x5e, 0x23, 0xc6, 0x15, 0x9a, 0xc3, 0x93, 0xfb, 0xb0, 0x7f, 0xbe, + 0x08, 0x82, 0x5c, 0x8d, 0x13, 0x55, 0x6e, 0x6f, 0xa6, 0x38, 0x29, 0xc2, 0xc6, 0x15, 0xba, 0x19, + 0x49, 0x1e, 0x42, 0x27, 0x73, 0xc5, 0x25, 0x4d, 0x44, 0xea, 0xbf, 0x3e, 0x5b, 0x8c, 0x1b, 0x57, + 0xe8, 0x2b, 0xb1, 0x64, 0x04, 0x7b, 0x5c, 0x4a, 0x21, 0xd7, 0xc9, 0xb6, 0x31, 0xd9, 0xad, 0xcd, + 0x64, 0xa3, 0x3c, 0x68, 0x5c, 0xa1, 0xc5, 0xa8, 0xbb, 0x35, 0xd8, 0xf9, 0xcd, 0x48, 0xe5, 0xfc, + 0x6e, 0x41, 0x67, 0x53, 0x0f, 0xf3, 0x70, 0x8c, 0x1e, 0x71, 0xc7, 0x35, 0x68, 0x6c, 0x90, 0xaf, + 0xa0, 0x16, 0x97, 0x34, 0x7b, 0x8a, 0x6f, 0x29, 0x73, 0x8a, 0x27, 0x0e, 0xb4, 0x54, 0xc8, 0x22, + 0x35, 0x13, 0xfa, 0x94, 0xe9, 0x99, 0xbd, 0x85, 0x79, 0x0b, 0x3e, 0xe7, 0x0f, 0x0b, 0xae, 0x97, + 0xca, 0xfa, 0x6e, 0xe8, 0xfc, 0x69, 0xa5, 0xed, 0xb5, 0x59, 0x97, 0x77, 0xc3, 0xe7, 0x13, 0xb8, + 0x5a, 0x52, 0x59, 0xc3, 0x05, 0x2b, 0x9b, 0x3c, 0xe9, 0xd8, 0x30, 0xe4, 0x3b, 0xa7, 0x0b, 0x35, + 0xc3, 0x8e, 0x48, 0x65, 0xfc, 0x0e, 0x9a, 0xf8, 0xe0, 0x4d, 0xa1, 0xb9, 0x4c, 0x7a, 0xba, 0x97, + 0x35, 0x0e, 0x65, 0xcb, 0xb3, 0x6c, 0x3f, 0xe1, 0x98, 0x0f, 0x21, 0x5f, 0x40, 0x8d, 0xb9, 0x01, + 0x15, 0x42, 0x27, 0x3d, 0x7c, 0xeb, 0x30, 0x9b, 0x10, 0x94, 0x2d, 0xef, 0x1c, 0x7f, 0x4f, 0xd1, + 0x48, 0x2f, 0x98, 0xa0, 0x9d, 0xab, 0x70, 0x25, 0x47, 0x27, 0xa6, 0xee, 0xfc, 0x6d, 0x41, 0x33, + 0x77, 0x20, 0xe9, 0x42, 0xdd, 0xf7, 0x78, 0xa8, 0x7d, 0xbd, 0x4a, 0x66, 0xc0, 0xda, 0x26, 0x1f, + 0x40, 0x43, 0xfb, 0x73, 0xae, 0x34, 0x9b, 0x47, 0xc8, 0x7c, 0x8b, 0x66, 0x0e, 0xb3, 0x8b, 0x34, + 0x1f, 0xaf, 0xa2, 0xf8, 0x75, 0x35, 0x68, 0xe6, 0x20, 0x1f, 0x41, 0x5b, 0xf2, 0x28, 0xf0, 0x5d, + 0xa6, 0x7d, 0x11, 0xde, 0xe7, 0x2b, 0x7c, 0x33, 0xdb, 0x74, 0xc3, 0x6b, 0x7e, 0xef, 0x15, 0xe7, + 0xf1, 0x4f, 0x4d, 0x8b, 0xe2, 0xda, 0x39, 0x85, 0x76, 0x51, 0x16, 0xd2, 0x2f, 0xaa, 0x18, 0x13, + 0x2d, 0xa8, 0x64, 0xd8, 0xf8, 0xd3, 0x90, 0xe9, 0x85, 0xe4, 0xc8, 0xb5, 0x45, 0x33, 0x87, 0x73, + 0x0f, 0xae, 0x95, 0x09, 0x6d, 0xa2, 0x24, 0x5b, 0x16, 0xb2, 0x66, 0x8e, 0x64, 0x36, 0x55, 0xd3, + 0xd9, 0xf4, 0xf1, 0x43, 0xa8, 0x8f, 0xa4, 0x3c, 0x16, 0x1e, 0x57, 0xa4, 0x0d, 0xf0, 0x24, 0xe4, + 0xcf, 0x23, 0xee, 0x6a, 0xee, 0x75, 0x2a, 0xa4, 0x03, 0x2d, 0x4c, 0xff, 0xc0, 0x57, 0xca, 0x0f, + 0xa7, 0x1d, 0x8b, 0xec, 0x27, 0x42, 0x8f, 0x9e, 0xfb, 0x4a, 0xab, 0x4e, 0xd5, 0x38, 0xb0, 0x8d, + 0x1e, 0x9d, 0x9f, 0x2b, 0xae, 0x3b, 0xde, 0xf0, 0xa5, 0x05, 0x3b, 0x08, 0x21, 0x77, 0xa0, 0x9e, + 0x8e, 0x15, 0xf2, 0x7e, 0xd9, 0xa8, 0xc1, 0x66, 0xea, 0x76, 0x4b, 0xa7, 0x50, 0xdc, 0x93, 0xf7, + 0xa0, 0xb1, 0xae, 0x36, 0xc9, 0x01, 0x37, 0x3b, 0xb2, 0x7b, 0xb3, 0x74, 0x2f, 0xc9, 0x72, 0x02, + 0xbb, 0x67, 0x5a, 0x72, 0x36, 0x27, 0x37, 0xcb, 0xa6, 0x51, 0x32, 0xd5, 0xba, 0x6f, 0xda, 0x3c, + 0xb0, 0x3e, 0xb3, 0xee, 0x1e, 0xfd, 0x7b, 0xd1, 0xb3, 0x5e, 0x5c, 0xf4, 0xac, 0xff, 0x2e, 0x7a, + 0xd6, 0x5f, 0x97, 0xbd, 0xca, 0x8b, 0xcb, 0x5e, 0xe5, 0xe5, 0x65, 0xaf, 0xf2, 0xd3, 0x87, 0x6f, + 0xfd, 0xc7, 0xf5, 0x74, 0x17, 0xbf, 0x3e, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x2e, 0x4f, 0xd9, + 0xa3, 0x9d, 0x09, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { @@ -1632,13 +1733,6 @@ func (m *PushSpaceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if len(m.SpaceId) > 0 { - i -= len(m.SpaceId) - copy(dAtA[i:], m.SpaceId) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SpaceId))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } @@ -1719,6 +1813,80 @@ func (m *SpaceHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *RawSpaceHeader) 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 *RawSpaceHeader) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RawSpaceHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signature) > 0 { + i -= len(m.Signature) + copy(dAtA[i:], m.Signature) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Signature))) + i-- + dAtA[i] = 0x12 + } + if len(m.SpaceHeader) > 0 { + i -= len(m.SpaceHeader) + copy(dAtA[i:], m.SpaceHeader) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SpaceHeader))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *RawSpaceHeaderWithId) 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 *RawSpaceHeaderWithId) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RawSpaceHeaderWithId) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.RawHeader) > 0 { + i -= len(m.RawHeader) + copy(dAtA[i:], m.RawHeader) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.RawHeader))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintSpacesync(dAtA []byte, offset int, v uint64) int { offset -= sovSpacesync(v) base := offset @@ -2010,10 +2178,6 @@ func (m *PushSpaceRequest) Size() (n int) { } var l int _ = l - l = len(m.SpaceId) - if l > 0 { - n += 1 + l + sovSpacesync(uint64(l)) - } if m.SpaceHeader != nil { l = m.SpaceHeader.Size() n += 1 + l + sovSpacesync(uint64(l)) @@ -2061,6 +2225,40 @@ func (m *SpaceHeader) Size() (n int) { return n } +func (m *RawSpaceHeader) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpaceHeader) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + l = len(m.Signature) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} + +func (m *RawSpaceHeaderWithId) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.RawHeader) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} + func sovSpacesync(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -3588,38 +3786,6 @@ func (m *PushSpaceRequest) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: PushSpaceRequest: 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 ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - 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 SpaceHeader", wireType) @@ -3650,7 +3816,7 @@ func (m *PushSpaceRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.SpaceHeader == nil { - m.SpaceHeader = &SpaceHeader{} + m.SpaceHeader = &RawSpaceHeaderWithId{} } if err := m.SpaceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3951,6 +4117,240 @@ func (m *SpaceHeader) Unmarshal(dAtA []byte) error { } return nil } +func (m *RawSpaceHeader) 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 ErrIntOverflowSpacesync + } + 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: RawSpaceHeader: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RawSpaceHeader: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceHeader", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpaceHeader = append(m.SpaceHeader[:0], dAtA[iNdEx:postIndex]...) + if m.SpaceHeader == nil { + m.SpaceHeader = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signature = append(m.Signature[:0], dAtA[iNdEx:postIndex]...) + if m.Signature == nil { + m.Signature = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RawSpaceHeaderWithId) 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 ErrIntOverflowSpacesync + } + 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: RawSpaceHeaderWithId: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RawSpaceHeaderWithId: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RawHeader", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RawHeader = append(m.RawHeader[:0], dAtA[iNdEx:postIndex]...) + if m.RawHeader == nil { + m.RawHeader = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipSpacesync(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/common/commonspace/storage/mock_storage/mock_storage.go b/common/commonspace/storage/mock_storage/mock_storage.go index 14b6003f..197e13bd 100644 --- a/common/commonspace/storage/mock_storage/mock_storage.go +++ b/common/commonspace/storage/mock_storage/mock_storage.go @@ -149,10 +149,10 @@ func (mr *MockSpaceStorageMockRecorder) CreateTreeStorage(arg0 interface{}) *gom } // SpaceHeader mocks base method. -func (m *MockSpaceStorage) SpaceHeader() (*spacesyncproto.SpaceHeader, error) { +func (m *MockSpaceStorage) SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SpaceHeader") - ret0, _ := ret[0].(*spacesyncproto.SpaceHeader) + ret0, _ := ret[0].(*spacesyncproto.RawSpaceHeaderWithId) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index 3a98da37..0dc9df99 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -17,14 +17,13 @@ var ErrSpaceStorageMissing = errors.New("space storage missing") type SpaceStorage interface { storage.Provider ACLStorage() (storage.ListStorage, error) - SpaceHeader() (*spacesyncproto.SpaceHeader, error) + SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) StoredIds() ([]string, error) } type SpaceStorageCreatePayload struct { - RecWithId *aclrecordproto.RawACLRecordWithId - SpaceHeader *spacesyncproto.SpaceHeader - Id string + RecWithId *aclrecordproto.RawACLRecordWithId + SpaceHeaderWithId *spacesyncproto.RawSpaceHeaderWithId } type SpaceStorageProvider interface { diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go index dd050fde..019c48af 100644 --- a/node/nodespace/rpchandler.go +++ b/node/nodespace/rpchandler.go @@ -12,7 +12,7 @@ type rpcHandler struct { } func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) { - _, err = r.s.GetSpace(ctx, req.SpaceId) + _, err = r.s.GetSpace(ctx, req.SpaceHeader.Id) if err == nil { err = spacesyncproto.ErrSpaceExists return @@ -23,9 +23,8 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac } payload := storage.SpaceStorageCreatePayload{ - RecWithId: req.AclRoot, - SpaceHeader: req.SpaceHeader, - Id: req.SpaceId, + RecWithId: req.AclRoot, + SpaceHeaderWithId: req.SpaceHeader, } _, err = r.s.spaceStorageProvider.CreateSpaceStorage(payload) if err != nil { diff --git a/node/storage/keys.go b/node/storage/keys.go index dbfdf385..de99e6e7 100644 --- a/node/storage/keys.go +++ b/node/storage/keys.go @@ -10,7 +10,7 @@ type treeKeys struct { } func (t treeKeys) HeadsKey() string { - return fmt.Sprintf("%s/heads", t.id) + return fmt.Sprintf("t/%s/heads", t.id) } func (t treeKeys) RootKey() string { @@ -18,7 +18,7 @@ func (t treeKeys) RootKey() string { } func (t treeKeys) RawChangeKey(id string) string { - return fmt.Sprintf("%s/%s", t.id, id) + return fmt.Sprintf("t/%s/%s", t.id, id) } type spaceKeys struct { @@ -33,5 +33,5 @@ func (s spaceKeys) ACLKey() string { } func isTreeKey(path string) bool { - return strings.HasPrefix(path, "t/") + return strings.HasPrefix(path, "t/") && len(strings.Split(path, "/")) > 2 } diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index 66279f72..8f775314 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -49,7 +49,8 @@ func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceS } func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) { - dbPath := path.Join(rootPath, payload.Id) + // TODO: add payload verification + dbPath := path.Join(rootPath, payload.SpaceHeaderWithId.Id) db, err := pogreb.Open(dbPath, nil) if err != nil { return @@ -65,19 +66,24 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate return } - err = db.Put([]byte(payload.RecWithId.Id), payload.RecWithId.Payload) + marshalledRec, err := payload.RecWithId.Marshal() + if err != nil { + return + } + err = db.Put([]byte(keys.ACLKey()), marshalledRec) if err != nil { return } - marshalled, err := payload.SpaceHeader.Marshal() + marshalledHeader, err := payload.SpaceHeaderWithId.Marshal() if err != nil { return } - err = db.Put([]byte(payload.Id), marshalled) + err = db.Put([]byte(keys.HeaderKey()), marshalledHeader) if err != nil { return } + store = &spaceStorage{ objDb: db, keys: keys, @@ -100,6 +106,7 @@ func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayloa err = spacestorage.ErrSpaceStorageExists return } + return createTreeStorage(s.objDb, payload) } @@ -107,19 +114,20 @@ func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) { return nil, nil } -func (s *spaceStorage) SpaceHeader() (header *spacesyncproto.SpaceHeader, err error) { +func (s *spaceStorage) SpaceHeader() (header *spacesyncproto.RawSpaceHeaderWithId, err error) { res, err := s.objDb.Get([]byte(s.keys.HeaderKey())) if err != nil { return } - header = &spacesyncproto.SpaceHeader{} + header = &spacesyncproto.RawSpaceHeaderWithId{} err = proto.Unmarshal(res, header) return } func (s *spaceStorage) StoredIds() (ids []string, err error) { index := s.objDb.Items() + _, value, err := index.Next() for err == nil { strVal := string(value) @@ -128,6 +136,7 @@ func (s *spaceStorage) StoredIds() (ids []string, err error) { } _, value, err = index.Next() } + if err != pogreb.ErrIterationDone { return } diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index 2512f565..1fdeef2d 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -28,11 +28,19 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err e if err != nil { return } + if heads == nil { + err = storage.ErrUnknownTreeId + return + } res, err := db.Get([]byte(path.RootKey())) if err != nil { return } + if res == nil { + err = storage.ErrUnknownTreeId + return + } root := &treechangeproto.RawTreeChangeWithId{} err = proto.Unmarshal(res, root) @@ -53,31 +61,46 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err e } func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { - path := treeKeys{payload.TreeId} + keys := treeKeys{id: payload.TreeId} + has, err := db.Has([]byte(keys.RootKey())) + if err != nil { + return + } + if !has { + err = storage.ErrUnknownTreeId + return + } + heads := createHeadsPayload(payload.Heads) for _, ch := range payload.Changes { - err = db.Put([]byte(path.RawChangeKey(ch.Id)), ch.GetRawChange()) + err = db.Put([]byte(keys.RawChangeKey(ch.Id)), ch.GetRawChange()) if err != nil { return } } - err = db.Put([]byte(path.HeadsKey()), heads) + err = db.Put([]byte(keys.HeadsKey()), heads) if err != nil { return } - err = db.Put([]byte(path.RootKey()), payload.RootRawChange.GetRawChange()) + // duplicating same change in raw changes + err = db.Put([]byte(keys.RawChangeKey(payload.TreeId)), payload.RootRawChange.GetRawChange()) + if err != nil { + return + } + + err = db.Put([]byte(keys.RootKey()), payload.RootRawChange.GetRawChange()) if err != nil { return } ts = &treeStorage{ db: db, - path: path, - rootPath: []byte(path.RootKey()), - headsPath: []byte(path.HeadsKey()), + path: keys, + rootPath: []byte(keys.RootKey()), + headsPath: []byte(keys.HeadsKey()), id: payload.TreeId, heads: payload.Heads, root: payload.RootRawChange, diff --git a/pkg/acl/aclrecordproto/aclrecord.pb.go b/pkg/acl/aclrecordproto/aclrecord.pb.go index e11f5209..158b70f5 100644 --- a/pkg/acl/aclrecordproto/aclrecord.pb.go +++ b/pkg/acl/aclrecordproto/aclrecord.pb.go @@ -324,7 +324,6 @@ func (m *ACLRoot) GetTimestamp() int64 { type ACLContentValue struct { // Types that are valid to be assigned to Value: - // // *ACLContentValue_UserAdd // *ACLContentValue_UserRemove // *ACLContentValue_UserPermissionChange diff --git a/pkg/acl/testutils/testchanges/proto/test.pb.go b/pkg/acl/testutils/testchanges/proto/test.pb.go index d99ba0b5..e8e43c54 100644 --- a/pkg/acl/testutils/testchanges/proto/test.pb.go +++ b/pkg/acl/testutils/testchanges/proto/test.pb.go @@ -60,7 +60,6 @@ var xxx_messageInfo_PlainTextChange proto.InternalMessageInfo type PlainTextChange_Content struct { // Types that are valid to be assigned to Value: - // // *PlainTextChange_Content_TextAppend Value isPlainTextChange_Content_Value `protobuf_oneof:"value"` } diff --git a/pkg/acl/tree/mock_objecttree/mock_objecttree.go b/pkg/acl/tree/mock_objecttree/mock_objecttree.go index b739900c..70afa9d4 100644 --- a/pkg/acl/tree/mock_objecttree/mock_objecttree.go +++ b/pkg/acl/tree/mock_objecttree/mock_objecttree.go @@ -137,7 +137,7 @@ func (mr *MockObjectTreeMockRecorder) HasChanges(arg0 ...interface{}) *gomock.Ca // Header mocks base method. func (m *MockObjectTree) Header() *treechangeproto.RawTreeChangeWithId { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HeaderKey") + ret := m.ctrl.Call(m, "Header") ret0, _ := ret[0].(*treechangeproto.RawTreeChangeWithId) return ret0 } @@ -145,7 +145,7 @@ func (m *MockObjectTree) Header() *treechangeproto.RawTreeChangeWithId { // Header indicates an expected call of Header. func (mr *MockObjectTreeMockRecorder) Header() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeaderKey", reflect.TypeOf((*MockObjectTree)(nil).Header)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockObjectTree)(nil).Header)) } // Heads mocks base method. From 79f5fc6908bcd0e7d52792cbb830e14655f3266a Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 11 Oct 2022 09:56:51 +0200 Subject: [PATCH 129/219] Fix incorrect storage key --- node/storage/spacestorage.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index 8f775314..b1d797c2 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -98,7 +98,9 @@ func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) { func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { s.mx.Lock() defer s.mx.Unlock() - has, err := s.objDb.Has([]byte(payload.TreeId)) + + treeKeys := treeKeys{payload.TreeId} + has, err := s.objDb.Has([]byte(treeKeys.RootKey())) if err != nil { return } From 03eb8834c1a1c2d8173eba5cef1c45b7191a8cc3 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 11 Oct 2022 10:25:29 +0200 Subject: [PATCH 130/219] Wire up node --- cmd/node/node.go | 5 +- cmd/nodesgen/gen.go | 1 + config/config.go | 1 + config/storage.go | 5 ++ etc/config.yml | 39 ++++++++++++---- etc/configs/cons1.yml | 6 +-- etc/configs/cons2.yml | 6 +-- etc/configs/cons3.yml | 6 +-- etc/configs/node1.yml | 44 +++++++++--------- etc/configs/node2.yml | 44 +++++++++--------- etc/configs/node3.yml | 44 +++++++++--------- node/nodespace/nodecache/treecache.go | 12 ++--- node/storage/keys.go | 27 ++++++----- node/storage/spacestorage.go | 16 +++---- node/storage/storageservice.go | 10 +++- node/storage/treestorage.go | 66 +++++++++++++-------------- 16 files changed, 189 insertions(+), 143 deletions(-) create mode 100644 config/storage.go diff --git a/cmd/node/node.go b/cmd/node/node.go index 47d0c3e5..bc277ebf 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -15,6 +15,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace/nodecache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/node/storage" "go.uber.org/zap" "net/http" _ "net/http/pprof" @@ -89,7 +91,8 @@ func main() { func Bootstrap(a *app.App) { a.Register(account.New()). - // TODO: add space storage provider from node side + Register(storage.New()). + Register(nodecache.New(200)). Register(nodeconf.New()). Register(secure.New()). Register(dialer.New()). diff --git a/cmd/nodesgen/gen.go b/cmd/nodesgen/gen.go index 51db1459..2a122295 100644 --- a/cmd/nodesgen/gen.go +++ b/cmd/nodesgen/gen.go @@ -156,6 +156,7 @@ func genNodeConfig(addresses []string, apiPort string) (config.Config, error) { ListenAddrs: addresses, TLS: false, }, + Storage: config.Storage{Path: "db"}, Account: config.Account{ PeerId: peerID.String(), SigningKey: encSignKey, diff --git a/config/config.go b/config/config.go index 012a7da5..8a17e89a 100644 --- a/config/config.go +++ b/config/config.go @@ -29,6 +29,7 @@ type Config struct { APIServer APIServer `yaml:"apiServer"` Nodes []Node `yaml:"nodes"` Space Space `yaml:"space"` + Storage Storage `yaml:"storage"` } func (c *Config) Init(a *app.App) (err error) { diff --git a/config/storage.go b/config/storage.go new file mode 100644 index 00000000..ebafe622 --- /dev/null +++ b/config/storage.go @@ -0,0 +1,5 @@ +package config + +type Storage struct { + Path string `yaml:"path"` +} diff --git a/etc/config.yml b/etc/config.yml index 8c829b5f..a95316f6 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -5,20 +5,41 @@ grpcServer: - 127.0.0.1:4430 tls: false account: - peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu - signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA== - encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg== + peerId: 12D3KooWNGRznbh4RCYY1hDnG1RLCtWviWwVnZGjKHtsXVgPckNk + signingKey: buHKTg4VF6lskoFWDdjtjWNj2c/fz0zAxKrOW05pRRu4+aw/tClrubW5wpeCOJxPSMHJBTj/8bJ8icwKfe7yMQ== + encryptionKey: MIIEpAIBAAKCAQEAtoc/5YBUSzPUISHv/COa2wTeWpsuxuLGOd+IYLXe8xXIry0GHCqCN7orZq5iz7BFs2i6o0ttK2PpRa5xz/GnKtTkQowmfDNwh/f+jIlMo+CcL54Qq4sURexChBCg6z3XbSQK1C9yGA4QaNFRDgSzAs1IC8BCRFf7XDbK06zxWw/As7D3Bo1V3TO0LWi/URkV1PBZdQxX6unt5VplhTQ92o22xczb15zfBQW59qEZYyPa2apwUfmhZgjoAbSOIQm96U7P+HrLa8va1h9q9o+eYefco2N7wv40MYsDXll09Tfc/VhDEfmuKfwmSe5AEnpsg1gD94fX/4KVt7Usb7u6gwIDAQABAoIBAC7POqS5p2Rt0z33/RqVavY2JmvoFjPtHlbjK49ZtOZ0NLYv/rwkbqap+M1pdW+7zfQ3rH2KL2IMSluTZB6m428Jj8w9MvVxH6/O+pnB8ESqqoNPrwi/LyDLeTdzKEGL535W2uwVitX+bVjkLTxCGkJisNJKqPPr+EtqxdNJK9BlJ9VdOLFLi67mOsu3F6AtDtBC3VFXZJa8Wbocu0A7hm8QWa23AL7+EZdV9kJ8Dw2qEYXyYRwmhExuZWNsPsnMvNhlCj8By9IPuICDzW87SfcsIQd7vjSg3y60mmGvl9WGxJbpEkSa+MxCA175k3E30KP1tYMOBQyhlCr7qRYWpdkCgYEA4a7CJGqtdMB8KByzrfGazm8koI0Y+qcriYaOWeoZayoxshwmemqJQTEP29D5SumxOcobKnKRHhKBhhlJenc5xNwppgMIgexZtLLAB2pZzLZ/bIy39T+lAEVOQWIEWDUQ0MwqaGNvaZ2bXyM1Xq6Bovurs8gSwmRIQspskeD/fy8CgYEAzwxpLa/W+BcRPH7VpLSkwSPgsAXW+TCoxWuCMj/W7MmCplyohW8a8wc42RFwKCH4ULpyNbv0VWdCM910/U1sf+0s7B3+IeW/0oMlLIPOd/Z39Legm+h0o1l3rD7deWdL7AMnaJIJsMBOUp0DRBSE5Bj6iUr1MnIEMX/3zFqdxO0CgYEAo4FSZMHpA3JFQWZyAy7M4o0Bc1RmaYrd7xhOX/RMECkUsh7U/dHbuSCLhc1kH5Mp9F1pyxoP60KrFnWRl6lzcB22CvGdo0uSPmlW2MiDYN5DeWiGCqfeqlCL/rC9xw5DLZMNkm2gFVu7anT+wKcbgvJlFq54cN/ovoMbn6DsWr8CgYEAgUVIbgP5fdA5LMIr9bfrncMeyAf9XnwpA4nKMkF1mUV/UwtLFHR4KQB7V9vxYL1E4nJmWHJPbPsZdHRyVKyAb6bPg2R+hP+DMpY7IX3x7ShvYNU9a9pI6Kw1cc+WS/RYjLSzaDC16CtJO39YyKrfBeMqmYm5aZOSVq2FM4voMUkCgYBudtWqqwKvA/Ig32hPBa/pqh+R11LeN8F/NsjrCA3geo8MlDqD0To+r9FTv14AksR7BsAfhoGglbvpddTL+CqHgtA4igNWp2/UCaomfnCgnFl/rvo+OGiVR5DgaC4ALw9onsdfeNgrQ5PkqCCi2crb3txdRWGA2QyGvsBmb1u8+A== apiServer: port: "8080" nodes: - - peerId: 12D3KooWSUx2LXPvoZGp72Dt7b7r1kPSmQ6zAUwKkHFyX64uiXRu + - peerId: 12D3KooWNGRznbh4RCYY1hDnG1RLCtWviWwVnZGjKHtsXVgPckNk address: 127.0.0.1:4430 - signingKey: 4QTrtkFLQe9wQcWT/cgFEwfMHB5pt4axInNmCIMCZaz3nVdyygRoO8/YH0V15X6Mnw1NQWsS1YIWiLS22hwepA== - encryptionKey: MIIEpAIBAAKCAQEAmqAAOPfR86po3m+zwSzbAlZGgMMF188v35Ulqf9Gb4KO8DZ9ifxrqpjlLZRxPKeXj3wSSQEXsJf3A82rZlDxddZSM0i7Mx5G2G0zRHWx9dC58PpX6o/fDuvSwcyXqOgIK55N/hyEuIbWQgp5Rk9uy2Zbrhv5ZL5CvceM0b9wSKt/hRvntxSbG+HRgXWaQvAReGuJrySVvkh6fhC3G0IwqyFbGNq2zqAJej6NBzZA3thHgTn5PoWD8O4cyukBxunKGu3HLE3vJtqEMFrkNFw5SMpdEtxyTLN6T1HIeYCY9RL+BFYfxIWg6pGtIoIJKUB0XapJr9ltzvXfT9KeSCU0VwIDAQABAoIBAAp/xsQXf7gN4CUKbKg3RX+5H/xqQaFPvi5uUCpk3QGBWfdRm+CctSrWSul3ZOD7eD0T7aHrYxJonysw8ex2no6jyN0WmS91ZNYZRBvn6feI/rcwKHwS3NCEjsD+BWZAqx1bGGyivxhQf4fociemCR3ii2MdHygKCzobrKIpX5RvhanI4j01dyLlxwqTsteuc/o5RR4jfg1eN0kldFjk3UcSNyzzEv5o5UhRsHCLJBTNTvYZBN4FpyaqcLT9gKS9aVBvQH63R+E5dyxo1+24tZZricW59h2bN3CFriqkwBo1y0gTnR6VQ22MBvIUxYUm82cxXs/Vr0YQTSAaEGThxFECgYEAxKQMRnM39WMzrNx1WDwpBERRj1T0TbLf1uq6viPiLdik2Tm2aCBZyr5j82Ey7fZ7OafKGfsM0I2AuYeoBdYDuYN6A7tE9kpnECubnWuIvUeYcL+1VzzMedVtdKwQXrYbhqKtyvnSJ9gQ6CusHtsDE1bQvTMxBX4KNBeBYllCUasCgYEAyU0RPUaj56CyLHKty8jNg6wl+06IZ0pUPIWZ//b1zeZrlHGYDp/InxS8huGFapzOg1sbQBS6j3j3YE3Ts6v6FNuIa4pcPQ91YuHiWWQdgVjrCZdleanFWGTjIx12+RGj9vx4voRhNQcHW1YeTvvyj4BN/ECR6GNaoS/ZjBKo1AUCgYEAj6AyxxJJARagG9Y6b2QhoVg1Kjem6UmJbPStyUt0XIAsh+07afqXGxrM7mtEQ8MQZiBD4Y4Y4gs4xkprUzfqKIn7iNYznKDjflAbrXNpwLaWhWPBFCL4RtS4ycsTedoRaNlRjzvBYBDU6H9djHvzVyDF/itx1s0krr+sZSVE51kCgYBxGRinecna+KFCccgNp6s34H+Se2QNzGgZfOKyOjmOTniA9XV+Oe3I2yi1C34fESzCBm0ACuVqeIdcFz3rQ6OFFnbGHP2H3OiR/uFiYepl4uRjBimgOm9DI6Ot9f8DHxMlUGIygEPxPBq5CWCL9egpEeg+4rRXgYLI7w5mMZGjVQKBgQDC4qyH7FK3lLv5JomoK6nNjpyPNBmr0Rt215oM/AWQaxDhFZH5un68ueZ7MfybwXxHHFQ4ZeSwYs006f1XGPNW6qrH6pi/3SCLFuGVfNnLVwCBkm3QaQrxFm3v9LmVCidTNta0l0DrUldZdK8/P31GBxKo/MmYF/f9LO/Mfm/uDg== - - peerId: 12D3KooWFnz9fYCxHAnf2rvPQ7iPZcCprEqyN8kCtVQfN2K1TfqK + signingKey: buHKTg4VF6lskoFWDdjtjWNj2c/fz0zAxKrOW05pRRu4+aw/tClrubW5wpeCOJxPSMHJBTj/8bJ8icwKfe7yMQ== + encryptionKey: MIIEpAIBAAKCAQEAtoc/5YBUSzPUISHv/COa2wTeWpsuxuLGOd+IYLXe8xXIry0GHCqCN7orZq5iz7BFs2i6o0ttK2PpRa5xz/GnKtTkQowmfDNwh/f+jIlMo+CcL54Qq4sURexChBCg6z3XbSQK1C9yGA4QaNFRDgSzAs1IC8BCRFf7XDbK06zxWw/As7D3Bo1V3TO0LWi/URkV1PBZdQxX6unt5VplhTQ92o22xczb15zfBQW59qEZYyPa2apwUfmhZgjoAbSOIQm96U7P+HrLa8va1h9q9o+eYefco2N7wv40MYsDXll09Tfc/VhDEfmuKfwmSe5AEnpsg1gD94fX/4KVt7Usb7u6gwIDAQABAoIBAC7POqS5p2Rt0z33/RqVavY2JmvoFjPtHlbjK49ZtOZ0NLYv/rwkbqap+M1pdW+7zfQ3rH2KL2IMSluTZB6m428Jj8w9MvVxH6/O+pnB8ESqqoNPrwi/LyDLeTdzKEGL535W2uwVitX+bVjkLTxCGkJisNJKqPPr+EtqxdNJK9BlJ9VdOLFLi67mOsu3F6AtDtBC3VFXZJa8Wbocu0A7hm8QWa23AL7+EZdV9kJ8Dw2qEYXyYRwmhExuZWNsPsnMvNhlCj8By9IPuICDzW87SfcsIQd7vjSg3y60mmGvl9WGxJbpEkSa+MxCA175k3E30KP1tYMOBQyhlCr7qRYWpdkCgYEA4a7CJGqtdMB8KByzrfGazm8koI0Y+qcriYaOWeoZayoxshwmemqJQTEP29D5SumxOcobKnKRHhKBhhlJenc5xNwppgMIgexZtLLAB2pZzLZ/bIy39T+lAEVOQWIEWDUQ0MwqaGNvaZ2bXyM1Xq6Bovurs8gSwmRIQspskeD/fy8CgYEAzwxpLa/W+BcRPH7VpLSkwSPgsAXW+TCoxWuCMj/W7MmCplyohW8a8wc42RFwKCH4ULpyNbv0VWdCM910/U1sf+0s7B3+IeW/0oMlLIPOd/Z39Legm+h0o1l3rD7deWdL7AMnaJIJsMBOUp0DRBSE5Bj6iUr1MnIEMX/3zFqdxO0CgYEAo4FSZMHpA3JFQWZyAy7M4o0Bc1RmaYrd7xhOX/RMECkUsh7U/dHbuSCLhc1kH5Mp9F1pyxoP60KrFnWRl6lzcB22CvGdo0uSPmlW2MiDYN5DeWiGCqfeqlCL/rC9xw5DLZMNkm2gFVu7anT+wKcbgvJlFq54cN/ovoMbn6DsWr8CgYEAgUVIbgP5fdA5LMIr9bfrncMeyAf9XnwpA4nKMkF1mUV/UwtLFHR4KQB7V9vxYL1E4nJmWHJPbPsZdHRyVKyAb6bPg2R+hP+DMpY7IX3x7ShvYNU9a9pI6Kw1cc+WS/RYjLSzaDC16CtJO39YyKrfBeMqmYm5aZOSVq2FM4voMUkCgYBudtWqqwKvA/Ig32hPBa/pqh+R11LeN8F/NsjrCA3geo8MlDqD0To+r9FTv14AksR7BsAfhoGglbvpddTL+CqHgtA4igNWp2/UCaomfnCgnFl/rvo+OGiVR5DgaC4ALw9onsdfeNgrQ5PkqCCi2crb3txdRWGA2QyGvsBmb1u8+A== + - peerId: 12D3KooWKtsepiMYrDtok7AU4itPcmHQaLuwzzfYYyjEW1KoLeXp address: 127.0.0.1:4431 - signingKey: IM0BTVQf4LKMUVRTAHxbBXmdz656+G2ssw4WdLc30pRYy6TsVVdh+n03pKXSCdg665tM/9AjQRCbzgvDf9riWg== - encryptionKey: MIIEpAIBAAKCAQEAm0HILjO7GRYYb0AvESmxdaj6ruIcSHEQIyqhPbfXZSmJNo9wIq89SaYYL4ZTwrF+ykPDJcBA8SjNHGXBPhZY+ejwCDzDyyv42FMs5lKw+/x94Yg++W72sxawtCLVi0RVY1g4UxOlCgAxl3YC9mVYoqQveXN3EsDd0YNK9fWiWP/Xl3KaJ4ErsfW3LZS9rD36dgDsKr9GqeVQf7lGkCkDmivCwHn3uaN/uzHaWvaZ7e7QWE/36vTmMsllTvi0Q9Y+v+HB5isIX9Jve1QmCS//DbDl9IMGdmyg/jlBs63Nk86Qwlw8ft3ttTWNldTpvD4Ycbgj3l59jT4rIvFJ88+5UwIDAQABAoIBAFfUn/1bMIYhlNMi+T15W7YXUTGsIpnstFdgn3T90rGdDM272ZEVl9NZTidck3f516NvMC/kEhkbnuVovyhzlgRS/a97SLxgdNdUPntR3mO/VCtJW27akl9//5j4d9vgXXnlB4AgBeahc2yey1A+xyTDQ0QuyPbn+tSytK5uNlioCeAqH4ruWxcg4t8MnwNQEOsnchrYHfXqJG+XxGn7m60U4oclbObGfxWxYZ85I0B6M5PW71VLkj/eKTvRJcW5ShDKLG5meiUM3KtwUdFRzv9Xi4aB9eTwEQ8ZV18KVmIF7baBy5anWDfGO4O9MvFSMmbMCe3EkrGaEaCp/gXenhkCgYEAw57dj7ewVHIAQxcNZ9SPRUNAY8g9yEYQ//30yTcpUjsGlqGNzua2OvALGL2ntFY304X9Iego+7Tzxs3T0x2FQ1N33NhoxwRcMqBdksMqmCb8Bm8UvnFIuvmsfPGkkzwa/8xNH81GZiz0p9zfi4lSKdZRfTQ4lBqvogExdnalSd0CgYEAyy2Mw4eeJQ0Y6QX3nad2/06oxWiS3++CITI6dAqiepAB6V7lnP90NKfLgzJcCJwzKlMhoVv7Lu4bDCXbvQ03ba+Dl+To8Jf5/9di8j8OfllqDWPnbqyueTHu5CUk+A2Gz3RhjmMXHpVgbFkUJTkJ1RDWPImNq0KzTYQ+ZwU8lO8CgYEAo1/0zuisnXowedew3HyLw17tUeiUoMTTwdiJLduh6Qle8UKvupK4svRzcBBFFbnEGiaXSFAqmj2AMxMHzBOljpsRSiJ7L2uWzLleLQpOcpBsf7sZ6guWoIGQ6zCtMEJMkkJAT0UTfJYjJmazVEg1lLdni1enwRmggX7ZnoRsewkCgYB2SpLF1FOSpsl2Ae9kbnettRI1vOimUD+nLCM0JGzshqNWR9XPTjtN3NN0EwHaUXbIkZXm6DKZ5C8DJ5eDvgojZihrau7kBNecyL3m5CeAEHbaTOwVV5xNG3FGiwm3EckHR271A2QWfkmhS0ubUFYVIrRYko1UxIS4AOKEAFyBKQKBgQCfIsGy4wOqRsKLzbun6fIVSz8X+sS3HclD7UZ6WKanOYyWZ420qnhLnfdDcNQjF/ApbzHdfwwTKVJSaZiK23kmReUVB9Cq2YAHMJYlp0ErgPzZstrRiRidtzJHm93owWc7GZinzd1M8EOYUSJ3+t8EZXZlbsD/oCTbX/BGqolo2w== + signingKey: bqnCY+BB93A2nTM59zyP1CGZg5seSIeoGM/ATCOMy4+VvIfB1kwEK2VM5QVx3ub8zV/kqND8xuuQCC2NIrAFxw== + encryptionKey: MIIEowIBAAKCAQEAxaNDIGlEwkYRtcw6eoM1wRReJJUgHbEPTGSazEHTIp9Vza0Ob5GqT0yTFbWQWec1+vfCCVj49Z0usKiIa78iViiZxN/EZtdbimM2b2LTOPPkHTBNM3KawuBtVd34CYOLyFFhc+m4dtquGTsOGC0q2YQlS/XF+vGNWO/j8LnriF47Vv3Vr2YDfYeLo3aMexjzLKDiL1TC8fxtcSHqwrJnhgkFEHV/BIadPBlCpVukTPPMusEaoMshHVViS2emStf7j7Iq6KDdbIMGRCTAKhLNMOnHDwmDlBo/RSS/iYtEXFEADDfiYPOeIKIExPnAfdbku5I1y3/IaxeSpk+jQDFfMQIDAQABAoIBACLEgsWL3z2x5+GsaMkuleE+fQVAeqLeiAtvU1AFcGgR0Z1aCUUVQfmrReC2zQsTwopA1ZChZ0KGATWwoDccK6UuhUZ9+uYAkqj4pRXZM8E8HnAIFDytt436vyEw6DZ8PrXhoxwqDHpUI/ZqTiNwpq4XMhx3wvlPTwdLRDUP7+BQK7EmmZLZPiU+oq7f8Fo3ag2gkRKakatPIjwKRDSXcLNW+Rz2YrxUOAdEir2KiK0CKYAkqmcZy/O1xBjQ0YgQpYgxgBXRHTgd5iIFjGG/bCIHsLyV+FkpMpgO7oFw0aJa6zISFeoZ3Zekpf0qqSQNrI+Tpc3uStSE8/95nIo+fxUCgYEAxuvt8VRl1W16ddYpGAFO7ytTdzFSg4e07rKPLvZbvQ4M21CASluNPPKn/S9KFaLZDagBM2jl2cjGYdHVfVlVu/fmM8nlTCIhxkjU9iHkyspJWXNxzUcnh12GEjcNb1i7Oc1QTof7HFjEG4TrsRmGdAee4ZjXYyIEPAHCgxAdc7sCgYEA/lkGdggdLfw6HkXceLaiuq8FA7asJ0JK7L5XCptAXZ9ci10oQuwC+58S8eFVkOUmnVwFovc7CF5EtWjUkSdI+AIL3WCnj2Xjm/S/ASNL1Urw7Q7A7QKu0kGawadUQ00/oSRApEC3f3XK0rdkRlryp8mj2WRfUyBEjh+NgLzgzAMCgYBHQK1Le3K6n2t1GBBCM/3FN9y+3iDzUkHiGn2lUcOMlaLPUCeT+vU9dqHr0+uSknFzLdG4S4PBneRJl7MEImLOYL7JoDENM1CryNzXiU59wTXC39JMuIcVOs/SaHvcfYka7EsuxhCRl84vGU6fckgx+aTUpD3KmZ2wrOSys6wJDwKBgC+VrjzE1di1mJXzUgUPfjBY8CI6uch6gZP7JEOqugcJ+oFkQ1UJ3KEAqMWx95UtGeVUwwUzJcsx/77ExwgFBoTHtTqMi6yrTkLuLhHjbZuQ8rQXD4cH+ncBqRdT29Lfj+jw5FsWdH4XJoP3pX34I++6LLpOKfteTRUd2BZev9vLAoGBAL24XaIkqAECCqdGLiID3PEIRLGacnjEoAqS7fT5A8CV0Cle1KKZzkJlJvxU/pzSgp5AjI1TwIiH4jYE/Xtc2+61Kx1C7jqK5tNK4lJ3BkHUY9d1Etr+HdnDZYKZ32XdGfh4nUU7dx+OI965oQJISsLVVmu2GBllsbg6sA+w3LnK + - peerId: 12D3KooWJ2259GQZxf1PBkLBR8J37QN4PMiLedBU9h5PNbUwfaXE + address: 127.0.0.1:4432 + signingKey: RHl/cHYoPtAGXgJl7F3upI2OAnD4hd9aJztiqo08w/V52b3qKvFr2TWnpbNvBlXSxeyXpo4WB1jH+pMslW0irQ== + encryptionKey: MIIEpAIBAAKCAQEA2vHQaQ5U/PzvNFTk3G9t/IMELaxM5OBFV0/HcjDnF3jtc/ADtqG4zsr/VCs7/tiXiEIxn5aMFrvS7APh2/EHLlAnyrjYLyyxvgwqUtV06Gf5K2V7HmFTLch7VFc5HckU4Zg1B61EYAtnWu5JTmsZAmP1v3afsnfpdwTA3LEH65oOyEAXqCeNUtrrwZXYnt77gk1zC0NSdtE4Hf25OJ5to0kckmQf+TMxj5seA5+u55Bg/Hd9sorFl0X0JrAkIxnVcWYt9lCNZk4frPHl1deX9BwOJ5KKrz1Af/617rl8b8H5F+KzkHXpgpJfxtMLWUnUuaX7qm+R3qe1HeMCIAmOLQIDAQABAoIBAGPVHT25/kC5KG1JRG3LFXCtYOtehFVceeG9C+liqQzH5CYYS+krxrPsVg5QBHRI2JeV70CgidIX5K4few4p0ido/yvtqw2fqJBKxcWtdTg/qJsEE+afZCkdIDct6mpNdQsEtzF/7QyKRp9sxdpO9UFkyPp7oYfkK31MmpBG3KCtb57dyIKqfBoIrp9E54X+MtHHQsqpVo7wgdSufUAWA5OtrebqrUGhWrZCRVT5l+BbPp5WliTN12jVU3jdA6rkUzrdyt5jyZQZ1eIm89mBi3wQod3arUx+DnXeICroyWW7eumXqvPdYO9Y2eaGpXY9sjXioGARi97vD/qCB9qB/sECgYEA8L169WaUBfPU6qlD+qZN1Be6PprjBqoTYu3clQikYhF1HGcXT4ri1/8CT8gf9QsUt2NHzNf0vkhyqJ3bD+mxG/c62C7ff4mhLRR2MRiDnqFaYKJL4snFG6eachD7IqgXEJ8Uw8s+LUqljhMa3NlXgDyCdrazVto/J3iDx6/B2/ECgYEA6NKniFEFrJBEVr7neEsMzKSuu8S7VT8bZGNY5yLIHM7+E1YeyJko1BtaQ2f+x9nnRzRPpjO5H+oVLeRWj496retGmvQ24K6VPCq8b7I9QUdYOvhzgo+go6sCM4dzfespIi932EAHGFA0frZ29o9W9a8rgFZUoigde9KAYxVLQf0CgYEAlfUBfZFLDTYoX4/WV3B2NHIfQlYKqqEQeGRALdl3Q9sp/uo8fADActlXIElBlsszOVSvaervegP44A2MYiood4oV7omsEG6zpjgDs2tYuVw6xszxxi/3BtXs/7aSKLFZxLHDJn8YmO/RlmFSL1V3CtsmTTpbFfPWuQh51c4mTJECgYBQEhqR9CN6bIdEOhWLNmxpeP2rEAbJU5HNHam2nCysU7fn2Idvv9Td1aZeZkamXtd+kowOAd3aDvxHsy7d4p9zbuXyZqj07rXeYmg6FdehOrMqXMYFEfZSM37nT981YAneeurBkYufHf5f0crqEvP6PMs+MPKcbiVtr0B+UxV11QKBgQCmNz/q1pPxEltFBOZmsyfmplKgeDyexB8nb0z1NNc00tpKtWL+hvLqGQwYnECJ7kcJDNetKM1J6rDCoLg6hObf/Ze6/BFXTZF8bM6Xqz1elQPYgHl5P+vlJ7yVI5FClVG8RgI73vxr67CZk+4zsZbvTLscaZ1ZPkPR9m+YMJWUrA== + - peerId: 12D3KooWNJdqtKLZAxT3szMrWoSLS1F1JkyKgJ4YQ1rAKfeVPMm6 + address: 127.0.0.1:4530 + signingKey: BwEWqy5XqOeEUy4BmMzv1WltI5TvLPfP2l2mtioxb+a5ijq4aSATKZSFfcm2hpbGDObWOzeyi06BarLOfQsTnQ== + encryptionKey: MIIEpQIBAAKCAQEA2sTIJSgwRRwPVINYyC5lHtZGsBth87wV+mwMVHkt1/Er8WVstudDFj7dvpO4wHE9vzOQi8+VobNT+xZSB1hlLbOuyBMDzdg+0vs1rMmYruKWb12VZ4+ir1xhnqpm5sKhPuPylZFp+m2GuyEeMHjUNnbQDgPSxkh9jNnTnlwG86h8r5BlhbiISZUs0Jh+IiAbgf55xTdYp0UmVREJYpmk8SBOQS4HfkWM7ih85zMrA0lzi6bfghN7CSABpAMYSgLJc9XeP3le8iMSKQsT+RRvXgUAniPT7ftbWg0tZMNjJ9CXF12Mp0ElC95UIwOnJJydgrLMLvQ0Lggie/WdN0PpCwIDAQABAoIBAQCvg37bqLGJUKjP8gzxlZ9VLS5LLbzZUgYEAlmmEA6CmB/cLLYay9Fb8JXwxw1Lf869Ln6CXMm8kGYJJPAsqnOKRgUsyWyc4igNFrQKazbO4EU3Fcq+6lLoA+Lh6+5gpre9AB5oduCipOqaCUjyNI51H79t7w1UPWZU8ZHBFC4TnpanTYTqyYwUThqDR/PExyV7mhYN5gEi3cg4W0cA7qlDaGgwaKBrMphRt2xwNlAlYAhdkwdgRmbnB/zrWb0FHqJAsz6biqqNh0N0EgIsF0ZMO0ZFGRt+Ou36500Z1cRpGurbO1zrpNV2R2Gg0Ssun2tfjoYJN22HqwwLY71s/xXRAoGBAOx5KeiD07zkRCUzfVa9oHd9CxFSpStz0mCauFDpW0nhzgonjSaOmEotGvVRLDF1eqbtji2QOx3WSPXdnNlncyYAsWFJMyupygqsxBxnVBX3yFFicOE6PCaZocwDVmdKNNfg/52U13qS4pxFFclUPHlVvEcovR1VAPP08MvyV4x5AoGBAOzVW7FmVgzAUc9E8ro6pXD4dFyNkE6Hasq5ApQzFbqcaHSUjbS2lF5dKhvur4OABy6XO/wgD78b/bC+vMryxC+yHm4FP+ANpQ+/DSrn+g2X80J0wqC2tIIVqYMOzn3L+gSfRnhW+28vEx5SSofa7aZl/NOoXtXD47amJELwYzijAoGAVH9vJDCG5oZCe3CMpwQXZNr/q272qjI2yGJA3likUCApuaMsYsytSkQXz/Tzb7Dk5OUZ2tog5aZ+Z6yKsXyvvrKcr4CykjWXhnz5jpS1jSv/HmWopDJk7/4RvI6svzfa7hDuBeb7oEcARorBIDHDci/amSrLeMG5F3M84AN2mTECgYEAvx+PV6JWXwP1AWeK2m7phDl87hPwGO9/ZwnW4vI23tnKEgqwMN4G7gARM2lzipOPODIj3luhWYClQjUq9jzjxfngRLlHyvA3/HUZkz6RtNajIUZIqpnHIhOJMJKKYUpzAbfnjsXjMt6ydw3Bx9ENZ/N2DPkbTzc+VO/O45ZK/DECgYEAvhovek7Jk4ZmC1OsxedqudrgQugNGTMnc6gFZR/CUXrtBs1vq4zKe003Nx5WPGaYooySVraSgBplamtsL+dUsVRqWjCyuUrSkuv7XtP6rdSuRJEHTs7vumnGsF2pp+I08W1Bg0zUFToGy0PqFX9pVeR1f63COI4Ca1Vy6+BIw1Q= + isConsensus: true + - peerId: 12D3KooWP2cwtzkokAGAr8UzdW1pmU4NS2D4dvHJtK2q75TBEeKq + address: 127.0.0.1:4531 + signingKey: RyKkgbAlAmo+suhJf1mYau3uneQD93XO9Dks/a8lpXDES5wfPb3dO/8oefEFllI+c/m3bTVkAYBdTHtCZq7lYA== + encryptionKey: MIIEowIBAAKCAQEA6Dhjs/8s/uiTFIopCjoYLTq8JGIM3otbUktYXSnqpBVVUU4TwSJonpyeRCgcYy9FlDWrUPfCNEv/kG6ruNUZQs2UuPbaOMZ1Z5TZRokwZF26rlkmaTlwJLKmKy0wwT9koZT/e5G4NkRO4rOLK/O4NyDlZ/HvWaZPxQtcC4en0CDaaIcDSSKaL5OMz0fcXayQlWKiOsuuP7cSUYlBDybbJPLSPMVYUjGjzIBqZkV6nBgjKGIIBGlknqZpRwX1mgq4vG0UYTfGCOFF1iHQ4TiLM2EiiZw203PVA4ifSyvkZOkMngItBfYcnD5MRYtLXlps2LWW6auN6olAkyUwFQeHLwIDAQABAoIBAGq7kEfo3xuCdieYoOhMb1RKjLMERfn7f0vByal4XJpyG7a09itszz0nqy6UaQfFcGuAh289kQtMavhNhav8dhHYP6UMAJzbypaDOaJL5+wZkHYWD6uJdNvJKMrriF8p7ey+ePaosUxv9PoJn8vhxye/fPFbp7FC2aMtZ279OMpVjyhbBekWlHfAnRbmDaFjMH+7wHfaAArpYsmRaOJ+/ckqhHSWSCXHO7dOyTcRNx4J0NoZ+192J6VsD1bbGxfHEgtVac/3+fj0Uia3mjkA+e9+oe7kfiGAheLs7G+kC0rEht1VLkviwjM0oCPd3zcu50HjqSrQ1q+i4vKJLrPWQFECgYEA8Uz+PlwghCWcJ7c+TYL1Y4UpYMXavRYi+XCHyn5x2PtxLDgK9j38CbLtIJFDY739RxEDLsOAkC3ba5p71EAx2ZF8i4ylmw0ekTe8BhEo/PHhCmLL+12zUrDbmUqsb1/NJBRDVZ9975nqWiT1KWqm3XKrwfBRTvgiP3+dC3XrtiMCgYEA9l3KBUK0oc6RWftNQTbehrwMuG0M4wv05peTHHqlMsYV0b5nKCr1FWU+gA4zhEDNPcs7PkZRl+HHMalkKH/aLpxeafN5a4PkMsQD6ZK5Mz88IENzXbFswBjCI8s5NyAAK+aI4JqXiRoia6fRnWVp+VrC4A1o2dvD6GaZAta3bYUCgYALFhF8RflMePnirT2UjBbAGsca5hw1ocW7lhr3B7YtVOgPMwf15kUlIO5aF7Jz66+uSy7NQDgw55p0KCXWS5i+uTtyoeSd6g1keJ4P3Uv3yxkexAlBJD3v56Y/NboUZ99h7/hj/67mijjFKXuGCpteAz227Faf/TB9oFxTwXgx5wKBgEMOeCRCacP445soSXjMpHjrylKQbAeIg5oX+5Su1TQismGqf41xU9AFBKP6OY9vy+1b2b4ziZXbgEpGHtrfIdW5/gC8onnfJkejDqWOqBYIyibF9Sq1VjJbCsyPTf1xGlrYnrzzlvdcQ64luWor5lJWn+A4Bif2JzakZlVdeAO5AoGBAMynKpkB8vqTLU31yt5SzBroQj8TgZKGbzB2apO1a+2XE8WfmtFOxnS1/iQ67sMkv6Rh/N5SUxMnBLXjsYJFpuNkKjvE+RqO9f4PzklTIJuT49pexheAMKBA9zWv5YPEmMV8xGbqXooSuEP0ixlM07DiqaC7aBzSyIfGdTOvI5w/ + isConsensus: true + - peerId: 12D3KooWMg5c9wHkuXQ48qyHVa72UKerKWAVZRC2dc1ibSadYxTQ + address: 127.0.0.1:4532 + signingKey: gSyxSnCL8NsewJmdFwgVpjQ2hDwDvrbZrLnA1007ymCwLN67/Xd/42q4vsvZAovsXBrv4PuWuoQUqmXhX7OJrw== + encryptionKey: MIIEowIBAAKCAQEAptyiobOzgLUuVfUQetYQD638+kOUAjf+V7uny+9Qhtt0LZM5v4lsJ8DK+NIbJU6fo9sMNJ8Mc2A7QNEZ6iyppI4zszUIMfF9Ixhew8g5zBlaDzieAf1XSGuEd89vj1ikM3Nhp8AXzxxoFOTsgUCMlnAzsHalcVyqXRzN/glAA1Ob6R0pIEIz4LchvMpnjhSLi5XEmBMy3b3XHu+T5nYyLzLxxMpO2fHH41/GpWmOEVrjoT1qP1JSv+ehuXiuMW0rM1833os6jMHCZijfDGh8blWI2nthjOLbr/KQKQhkIqOXKwdkVLY5x4/c78L8dV3eZ647SqurWC/N8kr5r4LvfwIDAQABAoIBABTPHSUHURJzBeVIW5bGDVi3PP5E4Tdpnjl4uJNRM/ytb46jdqcxTyCiBW4EXchIRtZbYelKEHZvANSzfwTaLwnLhh0KNwxrbkyrJF5MIREX9EhDqkjbPEBW0D1UzDfXORsFf5848H8urrg0WF5CG4ZDVd7i3P0HLmPQTMwqgSYo2pLexcj0LtiZZqJ6ta9kxAiJniZyoNshRJnAZMMnFYRhy/eDF+L6sJPHieYgwiQFU5e0CK9UgsLmmOQWCKWtPgvxOhqlbcTz1pJAqkyzOC0wK/ydJpVAh9RUqf46rEDFzL/l90ZOir3AMlYJIHf4PX0TWchXjFW7bbHn5Zvk1xECgYEAzpuGDfaerUl8QziD6F/OoIz1/EZwSumErCH2NXYMBcCyzKu4fBqVqj5tcLsNx42v6kAGaERAQqaC5ZZ9ZNhXiWasHAermQqv8DtlYVCUih4e87dX1/xTF5TzR8RhLwHPADd1rRafCKJMD9X6Qquer5LmSST8ej3mJ4mrflw837cCgYEAzsCoqFenGlCvAZoQrekxS1VmGJDCKBQ7LlbOwQaUkD4I23rjbAHG8J51jmaQQ4epm6lU0JLSma/LKp8dl9oDEP09vcgKj6xuHMZV+EmsA5c181zMrGoH+tSZiWQZjSmJVhd5T147vnbUunTbGKlOQByD0tWM913Dm2dqB3goXnkCgYBZax4dtPr/7KoHPdJ5I939xoQ/5wx6n454IUq54JlbdAbuZfO2Ypsbz2D2RT61ezEDpSogvklBj2dfjj4/AxL/uJwMlZVC60kyI8LA12syS88Bk/xE0kP0FNcl3GxjN9krMtWPUBcMWZGp2OYzLKvFOULJrWRIU7nkqsS6L5l5CQKBgBa/tg8HzfgkRo1LkWhBT041sE0lqGdWioh3vroYakJQwRK9O8bHj0cseEzZ1ifIBo59HDry3L9SS21+Inhx4YJ+CswV9auHUnpSDGWMXaPrgGEtpcuWwxgDSn2GiRUyK81QOeXUvYggdRmq/+x/vH9rY8nP+3nAVGSGBXGa8/4pAoGBAMB7EOk/RnsgQ+SotHbvgv18S0lbJuWsLYGnNp8EcuPxDIxz29fOFH94qzVOwAkk5cbHvAl3/5sl3SelmKM9LXhcOT+1zxoavyAYyVeAGZsrbBmbzj9yeZON0gHtpF3dMWxiguyWuiiHM/pL92gKzlyIXryC3andL/y8/6VpWbtt + isConsensus: true space: gcTTL: 60 syncPeriod: 10 +storage: + path: db diff --git a/etc/configs/cons1.yml b/etc/configs/cons1.yml index f77921a0..eb3a294c 100755 --- a/etc/configs/cons1.yml +++ b/etc/configs/cons1.yml @@ -3,9 +3,9 @@ grpcServer: - 127.0.0.1:4530 tls: false account: - peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo - signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg== - encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0= + peerId: 12D3KooWNJdqtKLZAxT3szMrWoSLS1F1JkyKgJ4YQ1rAKfeVPMm6 + signingKey: BwEWqy5XqOeEUy4BmMzv1WltI5TvLPfP2l2mtioxb+a5ijq4aSATKZSFfcm2hpbGDObWOzeyi06BarLOfQsTnQ== + encryptionKey: MIIEpQIBAAKCAQEA2sTIJSgwRRwPVINYyC5lHtZGsBth87wV+mwMVHkt1/Er8WVstudDFj7dvpO4wHE9vzOQi8+VobNT+xZSB1hlLbOuyBMDzdg+0vs1rMmYruKWb12VZ4+ir1xhnqpm5sKhPuPylZFp+m2GuyEeMHjUNnbQDgPSxkh9jNnTnlwG86h8r5BlhbiISZUs0Jh+IiAbgf55xTdYp0UmVREJYpmk8SBOQS4HfkWM7ih85zMrA0lzi6bfghN7CSABpAMYSgLJc9XeP3le8iMSKQsT+RRvXgUAniPT7ftbWg0tZMNjJ9CXF12Mp0ElC95UIwOnJJydgrLMLvQ0Lggie/WdN0PpCwIDAQABAoIBAQCvg37bqLGJUKjP8gzxlZ9VLS5LLbzZUgYEAlmmEA6CmB/cLLYay9Fb8JXwxw1Lf869Ln6CXMm8kGYJJPAsqnOKRgUsyWyc4igNFrQKazbO4EU3Fcq+6lLoA+Lh6+5gpre9AB5oduCipOqaCUjyNI51H79t7w1UPWZU8ZHBFC4TnpanTYTqyYwUThqDR/PExyV7mhYN5gEi3cg4W0cA7qlDaGgwaKBrMphRt2xwNlAlYAhdkwdgRmbnB/zrWb0FHqJAsz6biqqNh0N0EgIsF0ZMO0ZFGRt+Ou36500Z1cRpGurbO1zrpNV2R2Gg0Ssun2tfjoYJN22HqwwLY71s/xXRAoGBAOx5KeiD07zkRCUzfVa9oHd9CxFSpStz0mCauFDpW0nhzgonjSaOmEotGvVRLDF1eqbtji2QOx3WSPXdnNlncyYAsWFJMyupygqsxBxnVBX3yFFicOE6PCaZocwDVmdKNNfg/52U13qS4pxFFclUPHlVvEcovR1VAPP08MvyV4x5AoGBAOzVW7FmVgzAUc9E8ro6pXD4dFyNkE6Hasq5ApQzFbqcaHSUjbS2lF5dKhvur4OABy6XO/wgD78b/bC+vMryxC+yHm4FP+ANpQ+/DSrn+g2X80J0wqC2tIIVqYMOzn3L+gSfRnhW+28vEx5SSofa7aZl/NOoXtXD47amJELwYzijAoGAVH9vJDCG5oZCe3CMpwQXZNr/q272qjI2yGJA3likUCApuaMsYsytSkQXz/Tzb7Dk5OUZ2tog5aZ+Z6yKsXyvvrKcr4CykjWXhnz5jpS1jSv/HmWopDJk7/4RvI6svzfa7hDuBeb7oEcARorBIDHDci/amSrLeMG5F3M84AN2mTECgYEAvx+PV6JWXwP1AWeK2m7phDl87hPwGO9/ZwnW4vI23tnKEgqwMN4G7gARM2lzipOPODIj3luhWYClQjUq9jzjxfngRLlHyvA3/HUZkz6RtNajIUZIqpnHIhOJMJKKYUpzAbfnjsXjMt6ydw3Bx9ENZ/N2DPkbTzc+VO/O45ZK/DECgYEAvhovek7Jk4ZmC1OsxedqudrgQugNGTMnc6gFZR/CUXrtBs1vq4zKe003Nx5WPGaYooySVraSgBplamtsL+dUsVRqWjCyuUrSkuv7XtP6rdSuRJEHTs7vumnGsF2pp+I08W1Bg0zUFToGy0PqFX9pVeR1f63COI4Ca1Vy6+BIw1Q= mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/cons2.yml b/etc/configs/cons2.yml index e1aad499..fabf14ac 100755 --- a/etc/configs/cons2.yml +++ b/etc/configs/cons2.yml @@ -3,9 +3,9 @@ grpcServer: - 127.0.0.1:4531 tls: false account: - peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm - signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g== - encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi + peerId: 12D3KooWP2cwtzkokAGAr8UzdW1pmU4NS2D4dvHJtK2q75TBEeKq + signingKey: RyKkgbAlAmo+suhJf1mYau3uneQD93XO9Dks/a8lpXDES5wfPb3dO/8oefEFllI+c/m3bTVkAYBdTHtCZq7lYA== + encryptionKey: MIIEowIBAAKCAQEA6Dhjs/8s/uiTFIopCjoYLTq8JGIM3otbUktYXSnqpBVVUU4TwSJonpyeRCgcYy9FlDWrUPfCNEv/kG6ruNUZQs2UuPbaOMZ1Z5TZRokwZF26rlkmaTlwJLKmKy0wwT9koZT/e5G4NkRO4rOLK/O4NyDlZ/HvWaZPxQtcC4en0CDaaIcDSSKaL5OMz0fcXayQlWKiOsuuP7cSUYlBDybbJPLSPMVYUjGjzIBqZkV6nBgjKGIIBGlknqZpRwX1mgq4vG0UYTfGCOFF1iHQ4TiLM2EiiZw203PVA4ifSyvkZOkMngItBfYcnD5MRYtLXlps2LWW6auN6olAkyUwFQeHLwIDAQABAoIBAGq7kEfo3xuCdieYoOhMb1RKjLMERfn7f0vByal4XJpyG7a09itszz0nqy6UaQfFcGuAh289kQtMavhNhav8dhHYP6UMAJzbypaDOaJL5+wZkHYWD6uJdNvJKMrriF8p7ey+ePaosUxv9PoJn8vhxye/fPFbp7FC2aMtZ279OMpVjyhbBekWlHfAnRbmDaFjMH+7wHfaAArpYsmRaOJ+/ckqhHSWSCXHO7dOyTcRNx4J0NoZ+192J6VsD1bbGxfHEgtVac/3+fj0Uia3mjkA+e9+oe7kfiGAheLs7G+kC0rEht1VLkviwjM0oCPd3zcu50HjqSrQ1q+i4vKJLrPWQFECgYEA8Uz+PlwghCWcJ7c+TYL1Y4UpYMXavRYi+XCHyn5x2PtxLDgK9j38CbLtIJFDY739RxEDLsOAkC3ba5p71EAx2ZF8i4ylmw0ekTe8BhEo/PHhCmLL+12zUrDbmUqsb1/NJBRDVZ9975nqWiT1KWqm3XKrwfBRTvgiP3+dC3XrtiMCgYEA9l3KBUK0oc6RWftNQTbehrwMuG0M4wv05peTHHqlMsYV0b5nKCr1FWU+gA4zhEDNPcs7PkZRl+HHMalkKH/aLpxeafN5a4PkMsQD6ZK5Mz88IENzXbFswBjCI8s5NyAAK+aI4JqXiRoia6fRnWVp+VrC4A1o2dvD6GaZAta3bYUCgYALFhF8RflMePnirT2UjBbAGsca5hw1ocW7lhr3B7YtVOgPMwf15kUlIO5aF7Jz66+uSy7NQDgw55p0KCXWS5i+uTtyoeSd6g1keJ4P3Uv3yxkexAlBJD3v56Y/NboUZ99h7/hj/67mijjFKXuGCpteAz227Faf/TB9oFxTwXgx5wKBgEMOeCRCacP445soSXjMpHjrylKQbAeIg5oX+5Su1TQismGqf41xU9AFBKP6OY9vy+1b2b4ziZXbgEpGHtrfIdW5/gC8onnfJkejDqWOqBYIyibF9Sq1VjJbCsyPTf1xGlrYnrzzlvdcQ64luWor5lJWn+A4Bif2JzakZlVdeAO5AoGBAMynKpkB8vqTLU31yt5SzBroQj8TgZKGbzB2apO1a+2XE8WfmtFOxnS1/iQ67sMkv6Rh/N5SUxMnBLXjsYJFpuNkKjvE+RqO9f4PzklTIJuT49pexheAMKBA9zWv5YPEmMV8xGbqXooSuEP0ixlM07DiqaC7aBzSyIfGdTOvI5w/ mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/cons3.yml b/etc/configs/cons3.yml index e750b653..efae0bfc 100755 --- a/etc/configs/cons3.yml +++ b/etc/configs/cons3.yml @@ -3,9 +3,9 @@ grpcServer: - 127.0.0.1:4532 tls: false account: - peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS - signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ== - encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP + peerId: 12D3KooWMg5c9wHkuXQ48qyHVa72UKerKWAVZRC2dc1ibSadYxTQ + signingKey: gSyxSnCL8NsewJmdFwgVpjQ2hDwDvrbZrLnA1007ymCwLN67/Xd/42q4vsvZAovsXBrv4PuWuoQUqmXhX7OJrw== + encryptionKey: MIIEowIBAAKCAQEAptyiobOzgLUuVfUQetYQD638+kOUAjf+V7uny+9Qhtt0LZM5v4lsJ8DK+NIbJU6fo9sMNJ8Mc2A7QNEZ6iyppI4zszUIMfF9Ixhew8g5zBlaDzieAf1XSGuEd89vj1ikM3Nhp8AXzxxoFOTsgUCMlnAzsHalcVyqXRzN/glAA1Ob6R0pIEIz4LchvMpnjhSLi5XEmBMy3b3XHu+T5nYyLzLxxMpO2fHH41/GpWmOEVrjoT1qP1JSv+ehuXiuMW0rM1833os6jMHCZijfDGh8blWI2nthjOLbr/KQKQhkIqOXKwdkVLY5x4/c78L8dV3eZ647SqurWC/N8kr5r4LvfwIDAQABAoIBABTPHSUHURJzBeVIW5bGDVi3PP5E4Tdpnjl4uJNRM/ytb46jdqcxTyCiBW4EXchIRtZbYelKEHZvANSzfwTaLwnLhh0KNwxrbkyrJF5MIREX9EhDqkjbPEBW0D1UzDfXORsFf5848H8urrg0WF5CG4ZDVd7i3P0HLmPQTMwqgSYo2pLexcj0LtiZZqJ6ta9kxAiJniZyoNshRJnAZMMnFYRhy/eDF+L6sJPHieYgwiQFU5e0CK9UgsLmmOQWCKWtPgvxOhqlbcTz1pJAqkyzOC0wK/ydJpVAh9RUqf46rEDFzL/l90ZOir3AMlYJIHf4PX0TWchXjFW7bbHn5Zvk1xECgYEAzpuGDfaerUl8QziD6F/OoIz1/EZwSumErCH2NXYMBcCyzKu4fBqVqj5tcLsNx42v6kAGaERAQqaC5ZZ9ZNhXiWasHAermQqv8DtlYVCUih4e87dX1/xTF5TzR8RhLwHPADd1rRafCKJMD9X6Qquer5LmSST8ej3mJ4mrflw837cCgYEAzsCoqFenGlCvAZoQrekxS1VmGJDCKBQ7LlbOwQaUkD4I23rjbAHG8J51jmaQQ4epm6lU0JLSma/LKp8dl9oDEP09vcgKj6xuHMZV+EmsA5c181zMrGoH+tSZiWQZjSmJVhd5T147vnbUunTbGKlOQByD0tWM913Dm2dqB3goXnkCgYBZax4dtPr/7KoHPdJ5I939xoQ/5wx6n454IUq54JlbdAbuZfO2Ypsbz2D2RT61ezEDpSogvklBj2dfjj4/AxL/uJwMlZVC60kyI8LA12syS88Bk/xE0kP0FNcl3GxjN9krMtWPUBcMWZGp2OYzLKvFOULJrWRIU7nkqsS6L5l5CQKBgBa/tg8HzfgkRo1LkWhBT041sE0lqGdWioh3vroYakJQwRK9O8bHj0cseEzZ1ifIBo59HDry3L9SS21+Inhx4YJ+CswV9auHUnpSDGWMXaPrgGEtpcuWwxgDSn2GiRUyK81QOeXUvYggdRmq/+x/vH9rY8nP+3nAVGSGBXGa8/4pAoGBAMB7EOk/RnsgQ+SotHbvgv18S0lbJuWsLYGnNp8EcuPxDIxz29fOFH94qzVOwAkk5cbHvAl3/5sl3SelmKM9LXhcOT+1zxoavyAYyVeAGZsrbBmbzj9yeZON0gHtpF3dMWxiguyWuiiHM/pL92gKzlyIXryC3andL/y8/6VpWbtt mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/node1.yml b/etc/configs/node1.yml index 2d15529c..8dc5dd4b 100755 --- a/etc/configs/node1.yml +++ b/etc/configs/node1.yml @@ -5,39 +5,41 @@ grpcServer: - 127.0.0.1:4430 tls: false account: - peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN - signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw== - encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ== + peerId: 12D3KooWNGRznbh4RCYY1hDnG1RLCtWviWwVnZGjKHtsXVgPckNk + signingKey: buHKTg4VF6lskoFWDdjtjWNj2c/fz0zAxKrOW05pRRu4+aw/tClrubW5wpeCOJxPSMHJBTj/8bJ8icwKfe7yMQ== + encryptionKey: MIIEpAIBAAKCAQEAtoc/5YBUSzPUISHv/COa2wTeWpsuxuLGOd+IYLXe8xXIry0GHCqCN7orZq5iz7BFs2i6o0ttK2PpRa5xz/GnKtTkQowmfDNwh/f+jIlMo+CcL54Qq4sURexChBCg6z3XbSQK1C9yGA4QaNFRDgSzAs1IC8BCRFf7XDbK06zxWw/As7D3Bo1V3TO0LWi/URkV1PBZdQxX6unt5VplhTQ92o22xczb15zfBQW59qEZYyPa2apwUfmhZgjoAbSOIQm96U7P+HrLa8va1h9q9o+eYefco2N7wv40MYsDXll09Tfc/VhDEfmuKfwmSe5AEnpsg1gD94fX/4KVt7Usb7u6gwIDAQABAoIBAC7POqS5p2Rt0z33/RqVavY2JmvoFjPtHlbjK49ZtOZ0NLYv/rwkbqap+M1pdW+7zfQ3rH2KL2IMSluTZB6m428Jj8w9MvVxH6/O+pnB8ESqqoNPrwi/LyDLeTdzKEGL535W2uwVitX+bVjkLTxCGkJisNJKqPPr+EtqxdNJK9BlJ9VdOLFLi67mOsu3F6AtDtBC3VFXZJa8Wbocu0A7hm8QWa23AL7+EZdV9kJ8Dw2qEYXyYRwmhExuZWNsPsnMvNhlCj8By9IPuICDzW87SfcsIQd7vjSg3y60mmGvl9WGxJbpEkSa+MxCA175k3E30KP1tYMOBQyhlCr7qRYWpdkCgYEA4a7CJGqtdMB8KByzrfGazm8koI0Y+qcriYaOWeoZayoxshwmemqJQTEP29D5SumxOcobKnKRHhKBhhlJenc5xNwppgMIgexZtLLAB2pZzLZ/bIy39T+lAEVOQWIEWDUQ0MwqaGNvaZ2bXyM1Xq6Bovurs8gSwmRIQspskeD/fy8CgYEAzwxpLa/W+BcRPH7VpLSkwSPgsAXW+TCoxWuCMj/W7MmCplyohW8a8wc42RFwKCH4ULpyNbv0VWdCM910/U1sf+0s7B3+IeW/0oMlLIPOd/Z39Legm+h0o1l3rD7deWdL7AMnaJIJsMBOUp0DRBSE5Bj6iUr1MnIEMX/3zFqdxO0CgYEAo4FSZMHpA3JFQWZyAy7M4o0Bc1RmaYrd7xhOX/RMECkUsh7U/dHbuSCLhc1kH5Mp9F1pyxoP60KrFnWRl6lzcB22CvGdo0uSPmlW2MiDYN5DeWiGCqfeqlCL/rC9xw5DLZMNkm2gFVu7anT+wKcbgvJlFq54cN/ovoMbn6DsWr8CgYEAgUVIbgP5fdA5LMIr9bfrncMeyAf9XnwpA4nKMkF1mUV/UwtLFHR4KQB7V9vxYL1E4nJmWHJPbPsZdHRyVKyAb6bPg2R+hP+DMpY7IX3x7ShvYNU9a9pI6Kw1cc+WS/RYjLSzaDC16CtJO39YyKrfBeMqmYm5aZOSVq2FM4voMUkCgYBudtWqqwKvA/Ig32hPBa/pqh+R11LeN8F/NsjrCA3geo8MlDqD0To+r9FTv14AksR7BsAfhoGglbvpddTL+CqHgtA4igNWp2/UCaomfnCgnFl/rvo+OGiVR5DgaC4ALw9onsdfeNgrQ5PkqCCi2crb3txdRWGA2QyGvsBmb1u8+A== apiServer: port: "8080" nodes: - - peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN + - peerId: 12D3KooWNGRznbh4RCYY1hDnG1RLCtWviWwVnZGjKHtsXVgPckNk address: 127.0.0.1:4430 - signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw== - encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ== - - peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT + signingKey: buHKTg4VF6lskoFWDdjtjWNj2c/fz0zAxKrOW05pRRu4+aw/tClrubW5wpeCOJxPSMHJBTj/8bJ8icwKfe7yMQ== + encryptionKey: MIIEpAIBAAKCAQEAtoc/5YBUSzPUISHv/COa2wTeWpsuxuLGOd+IYLXe8xXIry0GHCqCN7orZq5iz7BFs2i6o0ttK2PpRa5xz/GnKtTkQowmfDNwh/f+jIlMo+CcL54Qq4sURexChBCg6z3XbSQK1C9yGA4QaNFRDgSzAs1IC8BCRFf7XDbK06zxWw/As7D3Bo1V3TO0LWi/URkV1PBZdQxX6unt5VplhTQ92o22xczb15zfBQW59qEZYyPa2apwUfmhZgjoAbSOIQm96U7P+HrLa8va1h9q9o+eYefco2N7wv40MYsDXll09Tfc/VhDEfmuKfwmSe5AEnpsg1gD94fX/4KVt7Usb7u6gwIDAQABAoIBAC7POqS5p2Rt0z33/RqVavY2JmvoFjPtHlbjK49ZtOZ0NLYv/rwkbqap+M1pdW+7zfQ3rH2KL2IMSluTZB6m428Jj8w9MvVxH6/O+pnB8ESqqoNPrwi/LyDLeTdzKEGL535W2uwVitX+bVjkLTxCGkJisNJKqPPr+EtqxdNJK9BlJ9VdOLFLi67mOsu3F6AtDtBC3VFXZJa8Wbocu0A7hm8QWa23AL7+EZdV9kJ8Dw2qEYXyYRwmhExuZWNsPsnMvNhlCj8By9IPuICDzW87SfcsIQd7vjSg3y60mmGvl9WGxJbpEkSa+MxCA175k3E30KP1tYMOBQyhlCr7qRYWpdkCgYEA4a7CJGqtdMB8KByzrfGazm8koI0Y+qcriYaOWeoZayoxshwmemqJQTEP29D5SumxOcobKnKRHhKBhhlJenc5xNwppgMIgexZtLLAB2pZzLZ/bIy39T+lAEVOQWIEWDUQ0MwqaGNvaZ2bXyM1Xq6Bovurs8gSwmRIQspskeD/fy8CgYEAzwxpLa/W+BcRPH7VpLSkwSPgsAXW+TCoxWuCMj/W7MmCplyohW8a8wc42RFwKCH4ULpyNbv0VWdCM910/U1sf+0s7B3+IeW/0oMlLIPOd/Z39Legm+h0o1l3rD7deWdL7AMnaJIJsMBOUp0DRBSE5Bj6iUr1MnIEMX/3zFqdxO0CgYEAo4FSZMHpA3JFQWZyAy7M4o0Bc1RmaYrd7xhOX/RMECkUsh7U/dHbuSCLhc1kH5Mp9F1pyxoP60KrFnWRl6lzcB22CvGdo0uSPmlW2MiDYN5DeWiGCqfeqlCL/rC9xw5DLZMNkm2gFVu7anT+wKcbgvJlFq54cN/ovoMbn6DsWr8CgYEAgUVIbgP5fdA5LMIr9bfrncMeyAf9XnwpA4nKMkF1mUV/UwtLFHR4KQB7V9vxYL1E4nJmWHJPbPsZdHRyVKyAb6bPg2R+hP+DMpY7IX3x7ShvYNU9a9pI6Kw1cc+WS/RYjLSzaDC16CtJO39YyKrfBeMqmYm5aZOSVq2FM4voMUkCgYBudtWqqwKvA/Ig32hPBa/pqh+R11LeN8F/NsjrCA3geo8MlDqD0To+r9FTv14AksR7BsAfhoGglbvpddTL+CqHgtA4igNWp2/UCaomfnCgnFl/rvo+OGiVR5DgaC4ALw9onsdfeNgrQ5PkqCCi2crb3txdRWGA2QyGvsBmb1u8+A== + - peerId: 12D3KooWKtsepiMYrDtok7AU4itPcmHQaLuwzzfYYyjEW1KoLeXp address: 127.0.0.1:4431 - signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA== - encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg== - - peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC + signingKey: bqnCY+BB93A2nTM59zyP1CGZg5seSIeoGM/ATCOMy4+VvIfB1kwEK2VM5QVx3ub8zV/kqND8xuuQCC2NIrAFxw== + encryptionKey: MIIEowIBAAKCAQEAxaNDIGlEwkYRtcw6eoM1wRReJJUgHbEPTGSazEHTIp9Vza0Ob5GqT0yTFbWQWec1+vfCCVj49Z0usKiIa78iViiZxN/EZtdbimM2b2LTOPPkHTBNM3KawuBtVd34CYOLyFFhc+m4dtquGTsOGC0q2YQlS/XF+vGNWO/j8LnriF47Vv3Vr2YDfYeLo3aMexjzLKDiL1TC8fxtcSHqwrJnhgkFEHV/BIadPBlCpVukTPPMusEaoMshHVViS2emStf7j7Iq6KDdbIMGRCTAKhLNMOnHDwmDlBo/RSS/iYtEXFEADDfiYPOeIKIExPnAfdbku5I1y3/IaxeSpk+jQDFfMQIDAQABAoIBACLEgsWL3z2x5+GsaMkuleE+fQVAeqLeiAtvU1AFcGgR0Z1aCUUVQfmrReC2zQsTwopA1ZChZ0KGATWwoDccK6UuhUZ9+uYAkqj4pRXZM8E8HnAIFDytt436vyEw6DZ8PrXhoxwqDHpUI/ZqTiNwpq4XMhx3wvlPTwdLRDUP7+BQK7EmmZLZPiU+oq7f8Fo3ag2gkRKakatPIjwKRDSXcLNW+Rz2YrxUOAdEir2KiK0CKYAkqmcZy/O1xBjQ0YgQpYgxgBXRHTgd5iIFjGG/bCIHsLyV+FkpMpgO7oFw0aJa6zISFeoZ3Zekpf0qqSQNrI+Tpc3uStSE8/95nIo+fxUCgYEAxuvt8VRl1W16ddYpGAFO7ytTdzFSg4e07rKPLvZbvQ4M21CASluNPPKn/S9KFaLZDagBM2jl2cjGYdHVfVlVu/fmM8nlTCIhxkjU9iHkyspJWXNxzUcnh12GEjcNb1i7Oc1QTof7HFjEG4TrsRmGdAee4ZjXYyIEPAHCgxAdc7sCgYEA/lkGdggdLfw6HkXceLaiuq8FA7asJ0JK7L5XCptAXZ9ci10oQuwC+58S8eFVkOUmnVwFovc7CF5EtWjUkSdI+AIL3WCnj2Xjm/S/ASNL1Urw7Q7A7QKu0kGawadUQ00/oSRApEC3f3XK0rdkRlryp8mj2WRfUyBEjh+NgLzgzAMCgYBHQK1Le3K6n2t1GBBCM/3FN9y+3iDzUkHiGn2lUcOMlaLPUCeT+vU9dqHr0+uSknFzLdG4S4PBneRJl7MEImLOYL7JoDENM1CryNzXiU59wTXC39JMuIcVOs/SaHvcfYka7EsuxhCRl84vGU6fckgx+aTUpD3KmZ2wrOSys6wJDwKBgC+VrjzE1di1mJXzUgUPfjBY8CI6uch6gZP7JEOqugcJ+oFkQ1UJ3KEAqMWx95UtGeVUwwUzJcsx/77ExwgFBoTHtTqMi6yrTkLuLhHjbZuQ8rQXD4cH+ncBqRdT29Lfj+jw5FsWdH4XJoP3pX34I++6LLpOKfteTRUd2BZev9vLAoGBAL24XaIkqAECCqdGLiID3PEIRLGacnjEoAqS7fT5A8CV0Cle1KKZzkJlJvxU/pzSgp5AjI1TwIiH4jYE/Xtc2+61Kx1C7jqK5tNK4lJ3BkHUY9d1Etr+HdnDZYKZ32XdGfh4nUU7dx+OI965oQJISsLVVmu2GBllsbg6sA+w3LnK + - peerId: 12D3KooWJ2259GQZxf1PBkLBR8J37QN4PMiLedBU9h5PNbUwfaXE address: 127.0.0.1:4432 - signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w== - encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm - - peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo + signingKey: RHl/cHYoPtAGXgJl7F3upI2OAnD4hd9aJztiqo08w/V52b3qKvFr2TWnpbNvBlXSxeyXpo4WB1jH+pMslW0irQ== + encryptionKey: MIIEpAIBAAKCAQEA2vHQaQ5U/PzvNFTk3G9t/IMELaxM5OBFV0/HcjDnF3jtc/ADtqG4zsr/VCs7/tiXiEIxn5aMFrvS7APh2/EHLlAnyrjYLyyxvgwqUtV06Gf5K2V7HmFTLch7VFc5HckU4Zg1B61EYAtnWu5JTmsZAmP1v3afsnfpdwTA3LEH65oOyEAXqCeNUtrrwZXYnt77gk1zC0NSdtE4Hf25OJ5to0kckmQf+TMxj5seA5+u55Bg/Hd9sorFl0X0JrAkIxnVcWYt9lCNZk4frPHl1deX9BwOJ5KKrz1Af/617rl8b8H5F+KzkHXpgpJfxtMLWUnUuaX7qm+R3qe1HeMCIAmOLQIDAQABAoIBAGPVHT25/kC5KG1JRG3LFXCtYOtehFVceeG9C+liqQzH5CYYS+krxrPsVg5QBHRI2JeV70CgidIX5K4few4p0ido/yvtqw2fqJBKxcWtdTg/qJsEE+afZCkdIDct6mpNdQsEtzF/7QyKRp9sxdpO9UFkyPp7oYfkK31MmpBG3KCtb57dyIKqfBoIrp9E54X+MtHHQsqpVo7wgdSufUAWA5OtrebqrUGhWrZCRVT5l+BbPp5WliTN12jVU3jdA6rkUzrdyt5jyZQZ1eIm89mBi3wQod3arUx+DnXeICroyWW7eumXqvPdYO9Y2eaGpXY9sjXioGARi97vD/qCB9qB/sECgYEA8L169WaUBfPU6qlD+qZN1Be6PprjBqoTYu3clQikYhF1HGcXT4ri1/8CT8gf9QsUt2NHzNf0vkhyqJ3bD+mxG/c62C7ff4mhLRR2MRiDnqFaYKJL4snFG6eachD7IqgXEJ8Uw8s+LUqljhMa3NlXgDyCdrazVto/J3iDx6/B2/ECgYEA6NKniFEFrJBEVr7neEsMzKSuu8S7VT8bZGNY5yLIHM7+E1YeyJko1BtaQ2f+x9nnRzRPpjO5H+oVLeRWj496retGmvQ24K6VPCq8b7I9QUdYOvhzgo+go6sCM4dzfespIi932EAHGFA0frZ29o9W9a8rgFZUoigde9KAYxVLQf0CgYEAlfUBfZFLDTYoX4/WV3B2NHIfQlYKqqEQeGRALdl3Q9sp/uo8fADActlXIElBlsszOVSvaervegP44A2MYiood4oV7omsEG6zpjgDs2tYuVw6xszxxi/3BtXs/7aSKLFZxLHDJn8YmO/RlmFSL1V3CtsmTTpbFfPWuQh51c4mTJECgYBQEhqR9CN6bIdEOhWLNmxpeP2rEAbJU5HNHam2nCysU7fn2Idvv9Td1aZeZkamXtd+kowOAd3aDvxHsy7d4p9zbuXyZqj07rXeYmg6FdehOrMqXMYFEfZSM37nT981YAneeurBkYufHf5f0crqEvP6PMs+MPKcbiVtr0B+UxV11QKBgQCmNz/q1pPxEltFBOZmsyfmplKgeDyexB8nb0z1NNc00tpKtWL+hvLqGQwYnECJ7kcJDNetKM1J6rDCoLg6hObf/Ze6/BFXTZF8bM6Xqz1elQPYgHl5P+vlJ7yVI5FClVG8RgI73vxr67CZk+4zsZbvTLscaZ1ZPkPR9m+YMJWUrA== + - peerId: 12D3KooWNJdqtKLZAxT3szMrWoSLS1F1JkyKgJ4YQ1rAKfeVPMm6 address: 127.0.0.1:4530 - signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg== - encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0= + signingKey: BwEWqy5XqOeEUy4BmMzv1WltI5TvLPfP2l2mtioxb+a5ijq4aSATKZSFfcm2hpbGDObWOzeyi06BarLOfQsTnQ== + encryptionKey: MIIEpQIBAAKCAQEA2sTIJSgwRRwPVINYyC5lHtZGsBth87wV+mwMVHkt1/Er8WVstudDFj7dvpO4wHE9vzOQi8+VobNT+xZSB1hlLbOuyBMDzdg+0vs1rMmYruKWb12VZ4+ir1xhnqpm5sKhPuPylZFp+m2GuyEeMHjUNnbQDgPSxkh9jNnTnlwG86h8r5BlhbiISZUs0Jh+IiAbgf55xTdYp0UmVREJYpmk8SBOQS4HfkWM7ih85zMrA0lzi6bfghN7CSABpAMYSgLJc9XeP3le8iMSKQsT+RRvXgUAniPT7ftbWg0tZMNjJ9CXF12Mp0ElC95UIwOnJJydgrLMLvQ0Lggie/WdN0PpCwIDAQABAoIBAQCvg37bqLGJUKjP8gzxlZ9VLS5LLbzZUgYEAlmmEA6CmB/cLLYay9Fb8JXwxw1Lf869Ln6CXMm8kGYJJPAsqnOKRgUsyWyc4igNFrQKazbO4EU3Fcq+6lLoA+Lh6+5gpre9AB5oduCipOqaCUjyNI51H79t7w1UPWZU8ZHBFC4TnpanTYTqyYwUThqDR/PExyV7mhYN5gEi3cg4W0cA7qlDaGgwaKBrMphRt2xwNlAlYAhdkwdgRmbnB/zrWb0FHqJAsz6biqqNh0N0EgIsF0ZMO0ZFGRt+Ou36500Z1cRpGurbO1zrpNV2R2Gg0Ssun2tfjoYJN22HqwwLY71s/xXRAoGBAOx5KeiD07zkRCUzfVa9oHd9CxFSpStz0mCauFDpW0nhzgonjSaOmEotGvVRLDF1eqbtji2QOx3WSPXdnNlncyYAsWFJMyupygqsxBxnVBX3yFFicOE6PCaZocwDVmdKNNfg/52U13qS4pxFFclUPHlVvEcovR1VAPP08MvyV4x5AoGBAOzVW7FmVgzAUc9E8ro6pXD4dFyNkE6Hasq5ApQzFbqcaHSUjbS2lF5dKhvur4OABy6XO/wgD78b/bC+vMryxC+yHm4FP+ANpQ+/DSrn+g2X80J0wqC2tIIVqYMOzn3L+gSfRnhW+28vEx5SSofa7aZl/NOoXtXD47amJELwYzijAoGAVH9vJDCG5oZCe3CMpwQXZNr/q272qjI2yGJA3likUCApuaMsYsytSkQXz/Tzb7Dk5OUZ2tog5aZ+Z6yKsXyvvrKcr4CykjWXhnz5jpS1jSv/HmWopDJk7/4RvI6svzfa7hDuBeb7oEcARorBIDHDci/amSrLeMG5F3M84AN2mTECgYEAvx+PV6JWXwP1AWeK2m7phDl87hPwGO9/ZwnW4vI23tnKEgqwMN4G7gARM2lzipOPODIj3luhWYClQjUq9jzjxfngRLlHyvA3/HUZkz6RtNajIUZIqpnHIhOJMJKKYUpzAbfnjsXjMt6ydw3Bx9ENZ/N2DPkbTzc+VO/O45ZK/DECgYEAvhovek7Jk4ZmC1OsxedqudrgQugNGTMnc6gFZR/CUXrtBs1vq4zKe003Nx5WPGaYooySVraSgBplamtsL+dUsVRqWjCyuUrSkuv7XtP6rdSuRJEHTs7vumnGsF2pp+I08W1Bg0zUFToGy0PqFX9pVeR1f63COI4Ca1Vy6+BIw1Q= isConsensus: true - - peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm + - peerId: 12D3KooWP2cwtzkokAGAr8UzdW1pmU4NS2D4dvHJtK2q75TBEeKq address: 127.0.0.1:4531 - signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g== - encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi + signingKey: RyKkgbAlAmo+suhJf1mYau3uneQD93XO9Dks/a8lpXDES5wfPb3dO/8oefEFllI+c/m3bTVkAYBdTHtCZq7lYA== + encryptionKey: MIIEowIBAAKCAQEA6Dhjs/8s/uiTFIopCjoYLTq8JGIM3otbUktYXSnqpBVVUU4TwSJonpyeRCgcYy9FlDWrUPfCNEv/kG6ruNUZQs2UuPbaOMZ1Z5TZRokwZF26rlkmaTlwJLKmKy0wwT9koZT/e5G4NkRO4rOLK/O4NyDlZ/HvWaZPxQtcC4en0CDaaIcDSSKaL5OMz0fcXayQlWKiOsuuP7cSUYlBDybbJPLSPMVYUjGjzIBqZkV6nBgjKGIIBGlknqZpRwX1mgq4vG0UYTfGCOFF1iHQ4TiLM2EiiZw203PVA4ifSyvkZOkMngItBfYcnD5MRYtLXlps2LWW6auN6olAkyUwFQeHLwIDAQABAoIBAGq7kEfo3xuCdieYoOhMb1RKjLMERfn7f0vByal4XJpyG7a09itszz0nqy6UaQfFcGuAh289kQtMavhNhav8dhHYP6UMAJzbypaDOaJL5+wZkHYWD6uJdNvJKMrriF8p7ey+ePaosUxv9PoJn8vhxye/fPFbp7FC2aMtZ279OMpVjyhbBekWlHfAnRbmDaFjMH+7wHfaAArpYsmRaOJ+/ckqhHSWSCXHO7dOyTcRNx4J0NoZ+192J6VsD1bbGxfHEgtVac/3+fj0Uia3mjkA+e9+oe7kfiGAheLs7G+kC0rEht1VLkviwjM0oCPd3zcu50HjqSrQ1q+i4vKJLrPWQFECgYEA8Uz+PlwghCWcJ7c+TYL1Y4UpYMXavRYi+XCHyn5x2PtxLDgK9j38CbLtIJFDY739RxEDLsOAkC3ba5p71EAx2ZF8i4ylmw0ekTe8BhEo/PHhCmLL+12zUrDbmUqsb1/NJBRDVZ9975nqWiT1KWqm3XKrwfBRTvgiP3+dC3XrtiMCgYEA9l3KBUK0oc6RWftNQTbehrwMuG0M4wv05peTHHqlMsYV0b5nKCr1FWU+gA4zhEDNPcs7PkZRl+HHMalkKH/aLpxeafN5a4PkMsQD6ZK5Mz88IENzXbFswBjCI8s5NyAAK+aI4JqXiRoia6fRnWVp+VrC4A1o2dvD6GaZAta3bYUCgYALFhF8RflMePnirT2UjBbAGsca5hw1ocW7lhr3B7YtVOgPMwf15kUlIO5aF7Jz66+uSy7NQDgw55p0KCXWS5i+uTtyoeSd6g1keJ4P3Uv3yxkexAlBJD3v56Y/NboUZ99h7/hj/67mijjFKXuGCpteAz227Faf/TB9oFxTwXgx5wKBgEMOeCRCacP445soSXjMpHjrylKQbAeIg5oX+5Su1TQismGqf41xU9AFBKP6OY9vy+1b2b4ziZXbgEpGHtrfIdW5/gC8onnfJkejDqWOqBYIyibF9Sq1VjJbCsyPTf1xGlrYnrzzlvdcQ64luWor5lJWn+A4Bif2JzakZlVdeAO5AoGBAMynKpkB8vqTLU31yt5SzBroQj8TgZKGbzB2apO1a+2XE8WfmtFOxnS1/iQ67sMkv6Rh/N5SUxMnBLXjsYJFpuNkKjvE+RqO9f4PzklTIJuT49pexheAMKBA9zWv5YPEmMV8xGbqXooSuEP0ixlM07DiqaC7aBzSyIfGdTOvI5w/ isConsensus: true - - peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS + - peerId: 12D3KooWMg5c9wHkuXQ48qyHVa72UKerKWAVZRC2dc1ibSadYxTQ address: 127.0.0.1:4532 - signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ== - encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP + signingKey: gSyxSnCL8NsewJmdFwgVpjQ2hDwDvrbZrLnA1007ymCwLN67/Xd/42q4vsvZAovsXBrv4PuWuoQUqmXhX7OJrw== + encryptionKey: MIIEowIBAAKCAQEAptyiobOzgLUuVfUQetYQD638+kOUAjf+V7uny+9Qhtt0LZM5v4lsJ8DK+NIbJU6fo9sMNJ8Mc2A7QNEZ6iyppI4zszUIMfF9Ixhew8g5zBlaDzieAf1XSGuEd89vj1ikM3Nhp8AXzxxoFOTsgUCMlnAzsHalcVyqXRzN/glAA1Ob6R0pIEIz4LchvMpnjhSLi5XEmBMy3b3XHu+T5nYyLzLxxMpO2fHH41/GpWmOEVrjoT1qP1JSv+ehuXiuMW0rM1833os6jMHCZijfDGh8blWI2nthjOLbr/KQKQhkIqOXKwdkVLY5x4/c78L8dV3eZ647SqurWC/N8kr5r4LvfwIDAQABAoIBABTPHSUHURJzBeVIW5bGDVi3PP5E4Tdpnjl4uJNRM/ytb46jdqcxTyCiBW4EXchIRtZbYelKEHZvANSzfwTaLwnLhh0KNwxrbkyrJF5MIREX9EhDqkjbPEBW0D1UzDfXORsFf5848H8urrg0WF5CG4ZDVd7i3P0HLmPQTMwqgSYo2pLexcj0LtiZZqJ6ta9kxAiJniZyoNshRJnAZMMnFYRhy/eDF+L6sJPHieYgwiQFU5e0CK9UgsLmmOQWCKWtPgvxOhqlbcTz1pJAqkyzOC0wK/ydJpVAh9RUqf46rEDFzL/l90ZOir3AMlYJIHf4PX0TWchXjFW7bbHn5Zvk1xECgYEAzpuGDfaerUl8QziD6F/OoIz1/EZwSumErCH2NXYMBcCyzKu4fBqVqj5tcLsNx42v6kAGaERAQqaC5ZZ9ZNhXiWasHAermQqv8DtlYVCUih4e87dX1/xTF5TzR8RhLwHPADd1rRafCKJMD9X6Qquer5LmSST8ej3mJ4mrflw837cCgYEAzsCoqFenGlCvAZoQrekxS1VmGJDCKBQ7LlbOwQaUkD4I23rjbAHG8J51jmaQQ4epm6lU0JLSma/LKp8dl9oDEP09vcgKj6xuHMZV+EmsA5c181zMrGoH+tSZiWQZjSmJVhd5T147vnbUunTbGKlOQByD0tWM913Dm2dqB3goXnkCgYBZax4dtPr/7KoHPdJ5I939xoQ/5wx6n454IUq54JlbdAbuZfO2Ypsbz2D2RT61ezEDpSogvklBj2dfjj4/AxL/uJwMlZVC60kyI8LA12syS88Bk/xE0kP0FNcl3GxjN9krMtWPUBcMWZGp2OYzLKvFOULJrWRIU7nkqsS6L5l5CQKBgBa/tg8HzfgkRo1LkWhBT041sE0lqGdWioh3vroYakJQwRK9O8bHj0cseEzZ1ifIBo59HDry3L9SS21+Inhx4YJ+CswV9auHUnpSDGWMXaPrgGEtpcuWwxgDSn2GiRUyK81QOeXUvYggdRmq/+x/vH9rY8nP+3nAVGSGBXGa8/4pAoGBAMB7EOk/RnsgQ+SotHbvgv18S0lbJuWsLYGnNp8EcuPxDIxz29fOFH94qzVOwAkk5cbHvAl3/5sl3SelmKM9LXhcOT+1zxoavyAYyVeAGZsrbBmbzj9yeZON0gHtpF3dMWxiguyWuiiHM/pL92gKzlyIXryC3andL/y8/6VpWbtt isConsensus: true space: gcTTL: 60 syncPeriod: 10 +storage: + path: db diff --git a/etc/configs/node2.yml b/etc/configs/node2.yml index 57318da5..5bb42612 100755 --- a/etc/configs/node2.yml +++ b/etc/configs/node2.yml @@ -5,39 +5,41 @@ grpcServer: - 127.0.0.1:4431 tls: false account: - peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT - signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA== - encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg== + peerId: 12D3KooWKtsepiMYrDtok7AU4itPcmHQaLuwzzfYYyjEW1KoLeXp + signingKey: bqnCY+BB93A2nTM59zyP1CGZg5seSIeoGM/ATCOMy4+VvIfB1kwEK2VM5QVx3ub8zV/kqND8xuuQCC2NIrAFxw== + encryptionKey: MIIEowIBAAKCAQEAxaNDIGlEwkYRtcw6eoM1wRReJJUgHbEPTGSazEHTIp9Vza0Ob5GqT0yTFbWQWec1+vfCCVj49Z0usKiIa78iViiZxN/EZtdbimM2b2LTOPPkHTBNM3KawuBtVd34CYOLyFFhc+m4dtquGTsOGC0q2YQlS/XF+vGNWO/j8LnriF47Vv3Vr2YDfYeLo3aMexjzLKDiL1TC8fxtcSHqwrJnhgkFEHV/BIadPBlCpVukTPPMusEaoMshHVViS2emStf7j7Iq6KDdbIMGRCTAKhLNMOnHDwmDlBo/RSS/iYtEXFEADDfiYPOeIKIExPnAfdbku5I1y3/IaxeSpk+jQDFfMQIDAQABAoIBACLEgsWL3z2x5+GsaMkuleE+fQVAeqLeiAtvU1AFcGgR0Z1aCUUVQfmrReC2zQsTwopA1ZChZ0KGATWwoDccK6UuhUZ9+uYAkqj4pRXZM8E8HnAIFDytt436vyEw6DZ8PrXhoxwqDHpUI/ZqTiNwpq4XMhx3wvlPTwdLRDUP7+BQK7EmmZLZPiU+oq7f8Fo3ag2gkRKakatPIjwKRDSXcLNW+Rz2YrxUOAdEir2KiK0CKYAkqmcZy/O1xBjQ0YgQpYgxgBXRHTgd5iIFjGG/bCIHsLyV+FkpMpgO7oFw0aJa6zISFeoZ3Zekpf0qqSQNrI+Tpc3uStSE8/95nIo+fxUCgYEAxuvt8VRl1W16ddYpGAFO7ytTdzFSg4e07rKPLvZbvQ4M21CASluNPPKn/S9KFaLZDagBM2jl2cjGYdHVfVlVu/fmM8nlTCIhxkjU9iHkyspJWXNxzUcnh12GEjcNb1i7Oc1QTof7HFjEG4TrsRmGdAee4ZjXYyIEPAHCgxAdc7sCgYEA/lkGdggdLfw6HkXceLaiuq8FA7asJ0JK7L5XCptAXZ9ci10oQuwC+58S8eFVkOUmnVwFovc7CF5EtWjUkSdI+AIL3WCnj2Xjm/S/ASNL1Urw7Q7A7QKu0kGawadUQ00/oSRApEC3f3XK0rdkRlryp8mj2WRfUyBEjh+NgLzgzAMCgYBHQK1Le3K6n2t1GBBCM/3FN9y+3iDzUkHiGn2lUcOMlaLPUCeT+vU9dqHr0+uSknFzLdG4S4PBneRJl7MEImLOYL7JoDENM1CryNzXiU59wTXC39JMuIcVOs/SaHvcfYka7EsuxhCRl84vGU6fckgx+aTUpD3KmZ2wrOSys6wJDwKBgC+VrjzE1di1mJXzUgUPfjBY8CI6uch6gZP7JEOqugcJ+oFkQ1UJ3KEAqMWx95UtGeVUwwUzJcsx/77ExwgFBoTHtTqMi6yrTkLuLhHjbZuQ8rQXD4cH+ncBqRdT29Lfj+jw5FsWdH4XJoP3pX34I++6LLpOKfteTRUd2BZev9vLAoGBAL24XaIkqAECCqdGLiID3PEIRLGacnjEoAqS7fT5A8CV0Cle1KKZzkJlJvxU/pzSgp5AjI1TwIiH4jYE/Xtc2+61Kx1C7jqK5tNK4lJ3BkHUY9d1Etr+HdnDZYKZ32XdGfh4nUU7dx+OI965oQJISsLVVmu2GBllsbg6sA+w3LnK apiServer: port: "8081" nodes: - - peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN + - peerId: 12D3KooWNGRznbh4RCYY1hDnG1RLCtWviWwVnZGjKHtsXVgPckNk address: 127.0.0.1:4430 - signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw== - encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ== - - peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT + signingKey: buHKTg4VF6lskoFWDdjtjWNj2c/fz0zAxKrOW05pRRu4+aw/tClrubW5wpeCOJxPSMHJBTj/8bJ8icwKfe7yMQ== + encryptionKey: MIIEpAIBAAKCAQEAtoc/5YBUSzPUISHv/COa2wTeWpsuxuLGOd+IYLXe8xXIry0GHCqCN7orZq5iz7BFs2i6o0ttK2PpRa5xz/GnKtTkQowmfDNwh/f+jIlMo+CcL54Qq4sURexChBCg6z3XbSQK1C9yGA4QaNFRDgSzAs1IC8BCRFf7XDbK06zxWw/As7D3Bo1V3TO0LWi/URkV1PBZdQxX6unt5VplhTQ92o22xczb15zfBQW59qEZYyPa2apwUfmhZgjoAbSOIQm96U7P+HrLa8va1h9q9o+eYefco2N7wv40MYsDXll09Tfc/VhDEfmuKfwmSe5AEnpsg1gD94fX/4KVt7Usb7u6gwIDAQABAoIBAC7POqS5p2Rt0z33/RqVavY2JmvoFjPtHlbjK49ZtOZ0NLYv/rwkbqap+M1pdW+7zfQ3rH2KL2IMSluTZB6m428Jj8w9MvVxH6/O+pnB8ESqqoNPrwi/LyDLeTdzKEGL535W2uwVitX+bVjkLTxCGkJisNJKqPPr+EtqxdNJK9BlJ9VdOLFLi67mOsu3F6AtDtBC3VFXZJa8Wbocu0A7hm8QWa23AL7+EZdV9kJ8Dw2qEYXyYRwmhExuZWNsPsnMvNhlCj8By9IPuICDzW87SfcsIQd7vjSg3y60mmGvl9WGxJbpEkSa+MxCA175k3E30KP1tYMOBQyhlCr7qRYWpdkCgYEA4a7CJGqtdMB8KByzrfGazm8koI0Y+qcriYaOWeoZayoxshwmemqJQTEP29D5SumxOcobKnKRHhKBhhlJenc5xNwppgMIgexZtLLAB2pZzLZ/bIy39T+lAEVOQWIEWDUQ0MwqaGNvaZ2bXyM1Xq6Bovurs8gSwmRIQspskeD/fy8CgYEAzwxpLa/W+BcRPH7VpLSkwSPgsAXW+TCoxWuCMj/W7MmCplyohW8a8wc42RFwKCH4ULpyNbv0VWdCM910/U1sf+0s7B3+IeW/0oMlLIPOd/Z39Legm+h0o1l3rD7deWdL7AMnaJIJsMBOUp0DRBSE5Bj6iUr1MnIEMX/3zFqdxO0CgYEAo4FSZMHpA3JFQWZyAy7M4o0Bc1RmaYrd7xhOX/RMECkUsh7U/dHbuSCLhc1kH5Mp9F1pyxoP60KrFnWRl6lzcB22CvGdo0uSPmlW2MiDYN5DeWiGCqfeqlCL/rC9xw5DLZMNkm2gFVu7anT+wKcbgvJlFq54cN/ovoMbn6DsWr8CgYEAgUVIbgP5fdA5LMIr9bfrncMeyAf9XnwpA4nKMkF1mUV/UwtLFHR4KQB7V9vxYL1E4nJmWHJPbPsZdHRyVKyAb6bPg2R+hP+DMpY7IX3x7ShvYNU9a9pI6Kw1cc+WS/RYjLSzaDC16CtJO39YyKrfBeMqmYm5aZOSVq2FM4voMUkCgYBudtWqqwKvA/Ig32hPBa/pqh+R11LeN8F/NsjrCA3geo8MlDqD0To+r9FTv14AksR7BsAfhoGglbvpddTL+CqHgtA4igNWp2/UCaomfnCgnFl/rvo+OGiVR5DgaC4ALw9onsdfeNgrQ5PkqCCi2crb3txdRWGA2QyGvsBmb1u8+A== + - peerId: 12D3KooWKtsepiMYrDtok7AU4itPcmHQaLuwzzfYYyjEW1KoLeXp address: 127.0.0.1:4431 - signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA== - encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg== - - peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC + signingKey: bqnCY+BB93A2nTM59zyP1CGZg5seSIeoGM/ATCOMy4+VvIfB1kwEK2VM5QVx3ub8zV/kqND8xuuQCC2NIrAFxw== + encryptionKey: MIIEowIBAAKCAQEAxaNDIGlEwkYRtcw6eoM1wRReJJUgHbEPTGSazEHTIp9Vza0Ob5GqT0yTFbWQWec1+vfCCVj49Z0usKiIa78iViiZxN/EZtdbimM2b2LTOPPkHTBNM3KawuBtVd34CYOLyFFhc+m4dtquGTsOGC0q2YQlS/XF+vGNWO/j8LnriF47Vv3Vr2YDfYeLo3aMexjzLKDiL1TC8fxtcSHqwrJnhgkFEHV/BIadPBlCpVukTPPMusEaoMshHVViS2emStf7j7Iq6KDdbIMGRCTAKhLNMOnHDwmDlBo/RSS/iYtEXFEADDfiYPOeIKIExPnAfdbku5I1y3/IaxeSpk+jQDFfMQIDAQABAoIBACLEgsWL3z2x5+GsaMkuleE+fQVAeqLeiAtvU1AFcGgR0Z1aCUUVQfmrReC2zQsTwopA1ZChZ0KGATWwoDccK6UuhUZ9+uYAkqj4pRXZM8E8HnAIFDytt436vyEw6DZ8PrXhoxwqDHpUI/ZqTiNwpq4XMhx3wvlPTwdLRDUP7+BQK7EmmZLZPiU+oq7f8Fo3ag2gkRKakatPIjwKRDSXcLNW+Rz2YrxUOAdEir2KiK0CKYAkqmcZy/O1xBjQ0YgQpYgxgBXRHTgd5iIFjGG/bCIHsLyV+FkpMpgO7oFw0aJa6zISFeoZ3Zekpf0qqSQNrI+Tpc3uStSE8/95nIo+fxUCgYEAxuvt8VRl1W16ddYpGAFO7ytTdzFSg4e07rKPLvZbvQ4M21CASluNPPKn/S9KFaLZDagBM2jl2cjGYdHVfVlVu/fmM8nlTCIhxkjU9iHkyspJWXNxzUcnh12GEjcNb1i7Oc1QTof7HFjEG4TrsRmGdAee4ZjXYyIEPAHCgxAdc7sCgYEA/lkGdggdLfw6HkXceLaiuq8FA7asJ0JK7L5XCptAXZ9ci10oQuwC+58S8eFVkOUmnVwFovc7CF5EtWjUkSdI+AIL3WCnj2Xjm/S/ASNL1Urw7Q7A7QKu0kGawadUQ00/oSRApEC3f3XK0rdkRlryp8mj2WRfUyBEjh+NgLzgzAMCgYBHQK1Le3K6n2t1GBBCM/3FN9y+3iDzUkHiGn2lUcOMlaLPUCeT+vU9dqHr0+uSknFzLdG4S4PBneRJl7MEImLOYL7JoDENM1CryNzXiU59wTXC39JMuIcVOs/SaHvcfYka7EsuxhCRl84vGU6fckgx+aTUpD3KmZ2wrOSys6wJDwKBgC+VrjzE1di1mJXzUgUPfjBY8CI6uch6gZP7JEOqugcJ+oFkQ1UJ3KEAqMWx95UtGeVUwwUzJcsx/77ExwgFBoTHtTqMi6yrTkLuLhHjbZuQ8rQXD4cH+ncBqRdT29Lfj+jw5FsWdH4XJoP3pX34I++6LLpOKfteTRUd2BZev9vLAoGBAL24XaIkqAECCqdGLiID3PEIRLGacnjEoAqS7fT5A8CV0Cle1KKZzkJlJvxU/pzSgp5AjI1TwIiH4jYE/Xtc2+61Kx1C7jqK5tNK4lJ3BkHUY9d1Etr+HdnDZYKZ32XdGfh4nUU7dx+OI965oQJISsLVVmu2GBllsbg6sA+w3LnK + - peerId: 12D3KooWJ2259GQZxf1PBkLBR8J37QN4PMiLedBU9h5PNbUwfaXE address: 127.0.0.1:4432 - signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w== - encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm - - peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo + signingKey: RHl/cHYoPtAGXgJl7F3upI2OAnD4hd9aJztiqo08w/V52b3qKvFr2TWnpbNvBlXSxeyXpo4WB1jH+pMslW0irQ== + encryptionKey: MIIEpAIBAAKCAQEA2vHQaQ5U/PzvNFTk3G9t/IMELaxM5OBFV0/HcjDnF3jtc/ADtqG4zsr/VCs7/tiXiEIxn5aMFrvS7APh2/EHLlAnyrjYLyyxvgwqUtV06Gf5K2V7HmFTLch7VFc5HckU4Zg1B61EYAtnWu5JTmsZAmP1v3afsnfpdwTA3LEH65oOyEAXqCeNUtrrwZXYnt77gk1zC0NSdtE4Hf25OJ5to0kckmQf+TMxj5seA5+u55Bg/Hd9sorFl0X0JrAkIxnVcWYt9lCNZk4frPHl1deX9BwOJ5KKrz1Af/617rl8b8H5F+KzkHXpgpJfxtMLWUnUuaX7qm+R3qe1HeMCIAmOLQIDAQABAoIBAGPVHT25/kC5KG1JRG3LFXCtYOtehFVceeG9C+liqQzH5CYYS+krxrPsVg5QBHRI2JeV70CgidIX5K4few4p0ido/yvtqw2fqJBKxcWtdTg/qJsEE+afZCkdIDct6mpNdQsEtzF/7QyKRp9sxdpO9UFkyPp7oYfkK31MmpBG3KCtb57dyIKqfBoIrp9E54X+MtHHQsqpVo7wgdSufUAWA5OtrebqrUGhWrZCRVT5l+BbPp5WliTN12jVU3jdA6rkUzrdyt5jyZQZ1eIm89mBi3wQod3arUx+DnXeICroyWW7eumXqvPdYO9Y2eaGpXY9sjXioGARi97vD/qCB9qB/sECgYEA8L169WaUBfPU6qlD+qZN1Be6PprjBqoTYu3clQikYhF1HGcXT4ri1/8CT8gf9QsUt2NHzNf0vkhyqJ3bD+mxG/c62C7ff4mhLRR2MRiDnqFaYKJL4snFG6eachD7IqgXEJ8Uw8s+LUqljhMa3NlXgDyCdrazVto/J3iDx6/B2/ECgYEA6NKniFEFrJBEVr7neEsMzKSuu8S7VT8bZGNY5yLIHM7+E1YeyJko1BtaQ2f+x9nnRzRPpjO5H+oVLeRWj496retGmvQ24K6VPCq8b7I9QUdYOvhzgo+go6sCM4dzfespIi932EAHGFA0frZ29o9W9a8rgFZUoigde9KAYxVLQf0CgYEAlfUBfZFLDTYoX4/WV3B2NHIfQlYKqqEQeGRALdl3Q9sp/uo8fADActlXIElBlsszOVSvaervegP44A2MYiood4oV7omsEG6zpjgDs2tYuVw6xszxxi/3BtXs/7aSKLFZxLHDJn8YmO/RlmFSL1V3CtsmTTpbFfPWuQh51c4mTJECgYBQEhqR9CN6bIdEOhWLNmxpeP2rEAbJU5HNHam2nCysU7fn2Idvv9Td1aZeZkamXtd+kowOAd3aDvxHsy7d4p9zbuXyZqj07rXeYmg6FdehOrMqXMYFEfZSM37nT981YAneeurBkYufHf5f0crqEvP6PMs+MPKcbiVtr0B+UxV11QKBgQCmNz/q1pPxEltFBOZmsyfmplKgeDyexB8nb0z1NNc00tpKtWL+hvLqGQwYnECJ7kcJDNetKM1J6rDCoLg6hObf/Ze6/BFXTZF8bM6Xqz1elQPYgHl5P+vlJ7yVI5FClVG8RgI73vxr67CZk+4zsZbvTLscaZ1ZPkPR9m+YMJWUrA== + - peerId: 12D3KooWNJdqtKLZAxT3szMrWoSLS1F1JkyKgJ4YQ1rAKfeVPMm6 address: 127.0.0.1:4530 - signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg== - encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0= + signingKey: BwEWqy5XqOeEUy4BmMzv1WltI5TvLPfP2l2mtioxb+a5ijq4aSATKZSFfcm2hpbGDObWOzeyi06BarLOfQsTnQ== + encryptionKey: MIIEpQIBAAKCAQEA2sTIJSgwRRwPVINYyC5lHtZGsBth87wV+mwMVHkt1/Er8WVstudDFj7dvpO4wHE9vzOQi8+VobNT+xZSB1hlLbOuyBMDzdg+0vs1rMmYruKWb12VZ4+ir1xhnqpm5sKhPuPylZFp+m2GuyEeMHjUNnbQDgPSxkh9jNnTnlwG86h8r5BlhbiISZUs0Jh+IiAbgf55xTdYp0UmVREJYpmk8SBOQS4HfkWM7ih85zMrA0lzi6bfghN7CSABpAMYSgLJc9XeP3le8iMSKQsT+RRvXgUAniPT7ftbWg0tZMNjJ9CXF12Mp0ElC95UIwOnJJydgrLMLvQ0Lggie/WdN0PpCwIDAQABAoIBAQCvg37bqLGJUKjP8gzxlZ9VLS5LLbzZUgYEAlmmEA6CmB/cLLYay9Fb8JXwxw1Lf869Ln6CXMm8kGYJJPAsqnOKRgUsyWyc4igNFrQKazbO4EU3Fcq+6lLoA+Lh6+5gpre9AB5oduCipOqaCUjyNI51H79t7w1UPWZU8ZHBFC4TnpanTYTqyYwUThqDR/PExyV7mhYN5gEi3cg4W0cA7qlDaGgwaKBrMphRt2xwNlAlYAhdkwdgRmbnB/zrWb0FHqJAsz6biqqNh0N0EgIsF0ZMO0ZFGRt+Ou36500Z1cRpGurbO1zrpNV2R2Gg0Ssun2tfjoYJN22HqwwLY71s/xXRAoGBAOx5KeiD07zkRCUzfVa9oHd9CxFSpStz0mCauFDpW0nhzgonjSaOmEotGvVRLDF1eqbtji2QOx3WSPXdnNlncyYAsWFJMyupygqsxBxnVBX3yFFicOE6PCaZocwDVmdKNNfg/52U13qS4pxFFclUPHlVvEcovR1VAPP08MvyV4x5AoGBAOzVW7FmVgzAUc9E8ro6pXD4dFyNkE6Hasq5ApQzFbqcaHSUjbS2lF5dKhvur4OABy6XO/wgD78b/bC+vMryxC+yHm4FP+ANpQ+/DSrn+g2X80J0wqC2tIIVqYMOzn3L+gSfRnhW+28vEx5SSofa7aZl/NOoXtXD47amJELwYzijAoGAVH9vJDCG5oZCe3CMpwQXZNr/q272qjI2yGJA3likUCApuaMsYsytSkQXz/Tzb7Dk5OUZ2tog5aZ+Z6yKsXyvvrKcr4CykjWXhnz5jpS1jSv/HmWopDJk7/4RvI6svzfa7hDuBeb7oEcARorBIDHDci/amSrLeMG5F3M84AN2mTECgYEAvx+PV6JWXwP1AWeK2m7phDl87hPwGO9/ZwnW4vI23tnKEgqwMN4G7gARM2lzipOPODIj3luhWYClQjUq9jzjxfngRLlHyvA3/HUZkz6RtNajIUZIqpnHIhOJMJKKYUpzAbfnjsXjMt6ydw3Bx9ENZ/N2DPkbTzc+VO/O45ZK/DECgYEAvhovek7Jk4ZmC1OsxedqudrgQugNGTMnc6gFZR/CUXrtBs1vq4zKe003Nx5WPGaYooySVraSgBplamtsL+dUsVRqWjCyuUrSkuv7XtP6rdSuRJEHTs7vumnGsF2pp+I08W1Bg0zUFToGy0PqFX9pVeR1f63COI4Ca1Vy6+BIw1Q= isConsensus: true - - peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm + - peerId: 12D3KooWP2cwtzkokAGAr8UzdW1pmU4NS2D4dvHJtK2q75TBEeKq address: 127.0.0.1:4531 - signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g== - encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi + signingKey: RyKkgbAlAmo+suhJf1mYau3uneQD93XO9Dks/a8lpXDES5wfPb3dO/8oefEFllI+c/m3bTVkAYBdTHtCZq7lYA== + encryptionKey: MIIEowIBAAKCAQEA6Dhjs/8s/uiTFIopCjoYLTq8JGIM3otbUktYXSnqpBVVUU4TwSJonpyeRCgcYy9FlDWrUPfCNEv/kG6ruNUZQs2UuPbaOMZ1Z5TZRokwZF26rlkmaTlwJLKmKy0wwT9koZT/e5G4NkRO4rOLK/O4NyDlZ/HvWaZPxQtcC4en0CDaaIcDSSKaL5OMz0fcXayQlWKiOsuuP7cSUYlBDybbJPLSPMVYUjGjzIBqZkV6nBgjKGIIBGlknqZpRwX1mgq4vG0UYTfGCOFF1iHQ4TiLM2EiiZw203PVA4ifSyvkZOkMngItBfYcnD5MRYtLXlps2LWW6auN6olAkyUwFQeHLwIDAQABAoIBAGq7kEfo3xuCdieYoOhMb1RKjLMERfn7f0vByal4XJpyG7a09itszz0nqy6UaQfFcGuAh289kQtMavhNhav8dhHYP6UMAJzbypaDOaJL5+wZkHYWD6uJdNvJKMrriF8p7ey+ePaosUxv9PoJn8vhxye/fPFbp7FC2aMtZ279OMpVjyhbBekWlHfAnRbmDaFjMH+7wHfaAArpYsmRaOJ+/ckqhHSWSCXHO7dOyTcRNx4J0NoZ+192J6VsD1bbGxfHEgtVac/3+fj0Uia3mjkA+e9+oe7kfiGAheLs7G+kC0rEht1VLkviwjM0oCPd3zcu50HjqSrQ1q+i4vKJLrPWQFECgYEA8Uz+PlwghCWcJ7c+TYL1Y4UpYMXavRYi+XCHyn5x2PtxLDgK9j38CbLtIJFDY739RxEDLsOAkC3ba5p71EAx2ZF8i4ylmw0ekTe8BhEo/PHhCmLL+12zUrDbmUqsb1/NJBRDVZ9975nqWiT1KWqm3XKrwfBRTvgiP3+dC3XrtiMCgYEA9l3KBUK0oc6RWftNQTbehrwMuG0M4wv05peTHHqlMsYV0b5nKCr1FWU+gA4zhEDNPcs7PkZRl+HHMalkKH/aLpxeafN5a4PkMsQD6ZK5Mz88IENzXbFswBjCI8s5NyAAK+aI4JqXiRoia6fRnWVp+VrC4A1o2dvD6GaZAta3bYUCgYALFhF8RflMePnirT2UjBbAGsca5hw1ocW7lhr3B7YtVOgPMwf15kUlIO5aF7Jz66+uSy7NQDgw55p0KCXWS5i+uTtyoeSd6g1keJ4P3Uv3yxkexAlBJD3v56Y/NboUZ99h7/hj/67mijjFKXuGCpteAz227Faf/TB9oFxTwXgx5wKBgEMOeCRCacP445soSXjMpHjrylKQbAeIg5oX+5Su1TQismGqf41xU9AFBKP6OY9vy+1b2b4ziZXbgEpGHtrfIdW5/gC8onnfJkejDqWOqBYIyibF9Sq1VjJbCsyPTf1xGlrYnrzzlvdcQ64luWor5lJWn+A4Bif2JzakZlVdeAO5AoGBAMynKpkB8vqTLU31yt5SzBroQj8TgZKGbzB2apO1a+2XE8WfmtFOxnS1/iQ67sMkv6Rh/N5SUxMnBLXjsYJFpuNkKjvE+RqO9f4PzklTIJuT49pexheAMKBA9zWv5YPEmMV8xGbqXooSuEP0ixlM07DiqaC7aBzSyIfGdTOvI5w/ isConsensus: true - - peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS + - peerId: 12D3KooWMg5c9wHkuXQ48qyHVa72UKerKWAVZRC2dc1ibSadYxTQ address: 127.0.0.1:4532 - signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ== - encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP + signingKey: gSyxSnCL8NsewJmdFwgVpjQ2hDwDvrbZrLnA1007ymCwLN67/Xd/42q4vsvZAovsXBrv4PuWuoQUqmXhX7OJrw== + encryptionKey: MIIEowIBAAKCAQEAptyiobOzgLUuVfUQetYQD638+kOUAjf+V7uny+9Qhtt0LZM5v4lsJ8DK+NIbJU6fo9sMNJ8Mc2A7QNEZ6iyppI4zszUIMfF9Ixhew8g5zBlaDzieAf1XSGuEd89vj1ikM3Nhp8AXzxxoFOTsgUCMlnAzsHalcVyqXRzN/glAA1Ob6R0pIEIz4LchvMpnjhSLi5XEmBMy3b3XHu+T5nYyLzLxxMpO2fHH41/GpWmOEVrjoT1qP1JSv+ehuXiuMW0rM1833os6jMHCZijfDGh8blWI2nthjOLbr/KQKQhkIqOXKwdkVLY5x4/c78L8dV3eZ647SqurWC/N8kr5r4LvfwIDAQABAoIBABTPHSUHURJzBeVIW5bGDVi3PP5E4Tdpnjl4uJNRM/ytb46jdqcxTyCiBW4EXchIRtZbYelKEHZvANSzfwTaLwnLhh0KNwxrbkyrJF5MIREX9EhDqkjbPEBW0D1UzDfXORsFf5848H8urrg0WF5CG4ZDVd7i3P0HLmPQTMwqgSYo2pLexcj0LtiZZqJ6ta9kxAiJniZyoNshRJnAZMMnFYRhy/eDF+L6sJPHieYgwiQFU5e0CK9UgsLmmOQWCKWtPgvxOhqlbcTz1pJAqkyzOC0wK/ydJpVAh9RUqf46rEDFzL/l90ZOir3AMlYJIHf4PX0TWchXjFW7bbHn5Zvk1xECgYEAzpuGDfaerUl8QziD6F/OoIz1/EZwSumErCH2NXYMBcCyzKu4fBqVqj5tcLsNx42v6kAGaERAQqaC5ZZ9ZNhXiWasHAermQqv8DtlYVCUih4e87dX1/xTF5TzR8RhLwHPADd1rRafCKJMD9X6Qquer5LmSST8ej3mJ4mrflw837cCgYEAzsCoqFenGlCvAZoQrekxS1VmGJDCKBQ7LlbOwQaUkD4I23rjbAHG8J51jmaQQ4epm6lU0JLSma/LKp8dl9oDEP09vcgKj6xuHMZV+EmsA5c181zMrGoH+tSZiWQZjSmJVhd5T147vnbUunTbGKlOQByD0tWM913Dm2dqB3goXnkCgYBZax4dtPr/7KoHPdJ5I939xoQ/5wx6n454IUq54JlbdAbuZfO2Ypsbz2D2RT61ezEDpSogvklBj2dfjj4/AxL/uJwMlZVC60kyI8LA12syS88Bk/xE0kP0FNcl3GxjN9krMtWPUBcMWZGp2OYzLKvFOULJrWRIU7nkqsS6L5l5CQKBgBa/tg8HzfgkRo1LkWhBT041sE0lqGdWioh3vroYakJQwRK9O8bHj0cseEzZ1ifIBo59HDry3L9SS21+Inhx4YJ+CswV9auHUnpSDGWMXaPrgGEtpcuWwxgDSn2GiRUyK81QOeXUvYggdRmq/+x/vH9rY8nP+3nAVGSGBXGa8/4pAoGBAMB7EOk/RnsgQ+SotHbvgv18S0lbJuWsLYGnNp8EcuPxDIxz29fOFH94qzVOwAkk5cbHvAl3/5sl3SelmKM9LXhcOT+1zxoavyAYyVeAGZsrbBmbzj9yeZON0gHtpF3dMWxiguyWuiiHM/pL92gKzlyIXryC3andL/y8/6VpWbtt isConsensus: true space: gcTTL: 60 syncPeriod: 10 +storage: + path: db diff --git a/etc/configs/node3.yml b/etc/configs/node3.yml index 3b77fd1d..9b19e294 100755 --- a/etc/configs/node3.yml +++ b/etc/configs/node3.yml @@ -5,39 +5,41 @@ grpcServer: - 127.0.0.1:4432 tls: false account: - peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC - signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w== - encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm + peerId: 12D3KooWJ2259GQZxf1PBkLBR8J37QN4PMiLedBU9h5PNbUwfaXE + signingKey: RHl/cHYoPtAGXgJl7F3upI2OAnD4hd9aJztiqo08w/V52b3qKvFr2TWnpbNvBlXSxeyXpo4WB1jH+pMslW0irQ== + encryptionKey: MIIEpAIBAAKCAQEA2vHQaQ5U/PzvNFTk3G9t/IMELaxM5OBFV0/HcjDnF3jtc/ADtqG4zsr/VCs7/tiXiEIxn5aMFrvS7APh2/EHLlAnyrjYLyyxvgwqUtV06Gf5K2V7HmFTLch7VFc5HckU4Zg1B61EYAtnWu5JTmsZAmP1v3afsnfpdwTA3LEH65oOyEAXqCeNUtrrwZXYnt77gk1zC0NSdtE4Hf25OJ5to0kckmQf+TMxj5seA5+u55Bg/Hd9sorFl0X0JrAkIxnVcWYt9lCNZk4frPHl1deX9BwOJ5KKrz1Af/617rl8b8H5F+KzkHXpgpJfxtMLWUnUuaX7qm+R3qe1HeMCIAmOLQIDAQABAoIBAGPVHT25/kC5KG1JRG3LFXCtYOtehFVceeG9C+liqQzH5CYYS+krxrPsVg5QBHRI2JeV70CgidIX5K4few4p0ido/yvtqw2fqJBKxcWtdTg/qJsEE+afZCkdIDct6mpNdQsEtzF/7QyKRp9sxdpO9UFkyPp7oYfkK31MmpBG3KCtb57dyIKqfBoIrp9E54X+MtHHQsqpVo7wgdSufUAWA5OtrebqrUGhWrZCRVT5l+BbPp5WliTN12jVU3jdA6rkUzrdyt5jyZQZ1eIm89mBi3wQod3arUx+DnXeICroyWW7eumXqvPdYO9Y2eaGpXY9sjXioGARi97vD/qCB9qB/sECgYEA8L169WaUBfPU6qlD+qZN1Be6PprjBqoTYu3clQikYhF1HGcXT4ri1/8CT8gf9QsUt2NHzNf0vkhyqJ3bD+mxG/c62C7ff4mhLRR2MRiDnqFaYKJL4snFG6eachD7IqgXEJ8Uw8s+LUqljhMa3NlXgDyCdrazVto/J3iDx6/B2/ECgYEA6NKniFEFrJBEVr7neEsMzKSuu8S7VT8bZGNY5yLIHM7+E1YeyJko1BtaQ2f+x9nnRzRPpjO5H+oVLeRWj496retGmvQ24K6VPCq8b7I9QUdYOvhzgo+go6sCM4dzfespIi932EAHGFA0frZ29o9W9a8rgFZUoigde9KAYxVLQf0CgYEAlfUBfZFLDTYoX4/WV3B2NHIfQlYKqqEQeGRALdl3Q9sp/uo8fADActlXIElBlsszOVSvaervegP44A2MYiood4oV7omsEG6zpjgDs2tYuVw6xszxxi/3BtXs/7aSKLFZxLHDJn8YmO/RlmFSL1V3CtsmTTpbFfPWuQh51c4mTJECgYBQEhqR9CN6bIdEOhWLNmxpeP2rEAbJU5HNHam2nCysU7fn2Idvv9Td1aZeZkamXtd+kowOAd3aDvxHsy7d4p9zbuXyZqj07rXeYmg6FdehOrMqXMYFEfZSM37nT981YAneeurBkYufHf5f0crqEvP6PMs+MPKcbiVtr0B+UxV11QKBgQCmNz/q1pPxEltFBOZmsyfmplKgeDyexB8nb0z1NNc00tpKtWL+hvLqGQwYnECJ7kcJDNetKM1J6rDCoLg6hObf/Ze6/BFXTZF8bM6Xqz1elQPYgHl5P+vlJ7yVI5FClVG8RgI73vxr67CZk+4zsZbvTLscaZ1ZPkPR9m+YMJWUrA== apiServer: port: "8082" nodes: - - peerId: 12D3KooWBZFSp1MrqdQgL2uWSZpybgskz7mjrJnmhkDjudSpTUAN + - peerId: 12D3KooWNGRznbh4RCYY1hDnG1RLCtWviWwVnZGjKHtsXVgPckNk address: 127.0.0.1:4430 - signingKey: JR142BFc9/KJIy0f0BCnfMeO4Yv9InErltCuGyhvs+4Z2A9c9cGi20ECMzthOvtr90N6bq4iyfLbmhNkVMxgiw== - encryptionKey: MIIEpAIBAAKCAQEAt9WEjnITHiG0IhGdn5sGBR32Bo8qwAEZSsPhutQZnvBfTegqQwvb5LxxpfYP4C2+Wy1335fzMGtjtWyv4r2bJHX++fTh0h8xWbuMuqDlbZI79IkAhu4HFfAl6a0Ay/po4DkaBBwqHFu1oPbzKceJpb1fXXXDNO4SIMBo1CYrrI9ipJrVb0NOIbmuDUUvS6c7W8xiIudLH+lrcClpsE4f6+rVaEK188cWESmFvTFwWd0LV+1B+qP28pVRGZDcqMEeV2CoICY0daKdI9P1efPD1XbQGmafU0LlJZyww1pXT5q0yKBSdKMjspZoRbScnUmTJuhZY29cBPfqPjRiEvznjQIDAQABAoIBAQCQlI4PVepxPUKltMMKHutKJPk0yW5u2a5hndMvk9aeqR/bbuemGXKU4Bxl0TNFNdTLcuQfZystfphJvLRMGKEmuOKTBaSBFGVE1Htm4Fnwph0fQoy2kgfimh/HO3gv9L588ovihaAc84fSk8ZEqpk4T8rr/01KmJ6LQahwiaC5sig3uZgQuCGIz11xjNgavHdpytzL3qGhUPLiQAJtCEKaiFuUAEmw+dg/KH0ZHw3+/yCJ/GESwR/8yP6rfuyuLyaR1n4vr/+eH56x4922ua2XtJuz6gdqzcbPjbf2y01Q2XnwEkf6cHO6rYs+ba8BWzM8NZUeTmvLH+qY4CAMWIvBAoGBAPHuResocGdoZEDNvjUpuZlWCCRKO7goTAjFH00z6DEG0Kv37pi53/4AHshaScHLd7kQUBSH8o6Fdtf+fyZaVKdQzfSKqNVt6NglPtVTd7JhI2ddJuU6iOMBKowRk+PYnjfxjETmXMNb6FpF9ZgMc/QC6YiWZwEjooFKrhgfZWvxAoGBAMKGVY1LAoLUFwdL7DsBSf+VndN0l/ApxVjCLhT4l73HrfOEqbts0GAGRTtOA6JO2xhAvtJkcUYbStQiKyz4iPC+zG9CwMm9XNaGRAflFfcxgy1VqMQ/2TnlrwXdCLi1y+oEGcJs69O8IQACBC1m6MfEMrOOsAa3YExkxG7VBMFdAoGAIAgBH9pxz28l3uKerWFB3ohieZOOhppnPr4Cn/Ega+VQGYSxBW2Ot42ChdpWa58p0cnUIHPDbJVFH+HlKcnJ7YEoU5lMMz3jF0MPJ6VucqKj0lql/LGcUBnmbTcikocqo5OKk9DANWlkwRcEJkZ3z7XW/6uSJbd3G5EsraryfbECgYEAnaa1i09xd4pgJ3+2spN233bodEmYIgIYeLjXFBPtFtfP+P5ZeRbVQh2S2l99vnteQaenf2f8Da9s08Plbgr3IPXhRYK6MEYSCaLDXAqj5LTx9TnpDzQX3z5wvLXIrbpYyw4LunEAJ5fevtzjedBfdBdkZ/WKX8caeo9oS9LEidkCgYA9Lf6XK52LDO3uidnX7CZB9piWIV5bzrdJB6ppbJ2ywAD60NF8yecRp7fnyFRg7VCQxGkbIbv5sR9Ua/PAsBo9UFlZQGanUXpAUJi8qnDIDG2Ly6uNTwjF7s3IHC6OIn1aOSvUcgY658sXF1KfDguXv0CUs75JZ5+1djdMQAtRiQ== - - peerId: 12D3KooWHTnHZgeyDdZJwrXweFHMrSF7YBXSuuAH9GsxhbzTvfcT + signingKey: buHKTg4VF6lskoFWDdjtjWNj2c/fz0zAxKrOW05pRRu4+aw/tClrubW5wpeCOJxPSMHJBTj/8bJ8icwKfe7yMQ== + encryptionKey: MIIEpAIBAAKCAQEAtoc/5YBUSzPUISHv/COa2wTeWpsuxuLGOd+IYLXe8xXIry0GHCqCN7orZq5iz7BFs2i6o0ttK2PpRa5xz/GnKtTkQowmfDNwh/f+jIlMo+CcL54Qq4sURexChBCg6z3XbSQK1C9yGA4QaNFRDgSzAs1IC8BCRFf7XDbK06zxWw/As7D3Bo1V3TO0LWi/URkV1PBZdQxX6unt5VplhTQ92o22xczb15zfBQW59qEZYyPa2apwUfmhZgjoAbSOIQm96U7P+HrLa8va1h9q9o+eYefco2N7wv40MYsDXll09Tfc/VhDEfmuKfwmSe5AEnpsg1gD94fX/4KVt7Usb7u6gwIDAQABAoIBAC7POqS5p2Rt0z33/RqVavY2JmvoFjPtHlbjK49ZtOZ0NLYv/rwkbqap+M1pdW+7zfQ3rH2KL2IMSluTZB6m428Jj8w9MvVxH6/O+pnB8ESqqoNPrwi/LyDLeTdzKEGL535W2uwVitX+bVjkLTxCGkJisNJKqPPr+EtqxdNJK9BlJ9VdOLFLi67mOsu3F6AtDtBC3VFXZJa8Wbocu0A7hm8QWa23AL7+EZdV9kJ8Dw2qEYXyYRwmhExuZWNsPsnMvNhlCj8By9IPuICDzW87SfcsIQd7vjSg3y60mmGvl9WGxJbpEkSa+MxCA175k3E30KP1tYMOBQyhlCr7qRYWpdkCgYEA4a7CJGqtdMB8KByzrfGazm8koI0Y+qcriYaOWeoZayoxshwmemqJQTEP29D5SumxOcobKnKRHhKBhhlJenc5xNwppgMIgexZtLLAB2pZzLZ/bIy39T+lAEVOQWIEWDUQ0MwqaGNvaZ2bXyM1Xq6Bovurs8gSwmRIQspskeD/fy8CgYEAzwxpLa/W+BcRPH7VpLSkwSPgsAXW+TCoxWuCMj/W7MmCplyohW8a8wc42RFwKCH4ULpyNbv0VWdCM910/U1sf+0s7B3+IeW/0oMlLIPOd/Z39Legm+h0o1l3rD7deWdL7AMnaJIJsMBOUp0DRBSE5Bj6iUr1MnIEMX/3zFqdxO0CgYEAo4FSZMHpA3JFQWZyAy7M4o0Bc1RmaYrd7xhOX/RMECkUsh7U/dHbuSCLhc1kH5Mp9F1pyxoP60KrFnWRl6lzcB22CvGdo0uSPmlW2MiDYN5DeWiGCqfeqlCL/rC9xw5DLZMNkm2gFVu7anT+wKcbgvJlFq54cN/ovoMbn6DsWr8CgYEAgUVIbgP5fdA5LMIr9bfrncMeyAf9XnwpA4nKMkF1mUV/UwtLFHR4KQB7V9vxYL1E4nJmWHJPbPsZdHRyVKyAb6bPg2R+hP+DMpY7IX3x7ShvYNU9a9pI6Kw1cc+WS/RYjLSzaDC16CtJO39YyKrfBeMqmYm5aZOSVq2FM4voMUkCgYBudtWqqwKvA/Ig32hPBa/pqh+R11LeN8F/NsjrCA3geo8MlDqD0To+r9FTv14AksR7BsAfhoGglbvpddTL+CqHgtA4igNWp2/UCaomfnCgnFl/rvo+OGiVR5DgaC4ALw9onsdfeNgrQ5PkqCCi2crb3txdRWGA2QyGvsBmb1u8+A== + - peerId: 12D3KooWKtsepiMYrDtok7AU4itPcmHQaLuwzzfYYyjEW1KoLeXp address: 127.0.0.1:4431 - signingKey: EVlWc7+UbqSKAvjSdBq5iZt2dpcCYhDJiWkSn2+9IrJxl5F5dTHw+eIKNV3MV/tL8ext3YPRkIue/8TvUUfpaA== - encryptionKey: MIIEpAIBAAKCAQEAwLhwWK4vZQooUjulblf4I2+f5/K9yES7/HW+1bz93ZOeeiMuKb5wmw1tVt+vrY2j5cFC/krhSWUdfRwqDvv6Z0q19v9mD7zIfad54KgVSyMcVGxWLt7haGVCr78VckO5JD+aktlEM8/12crzHOWRh+j3jgELmwSwA/LiXo2ZNH9x1Vftw5MHKksWTpvaAprFTkYUrPHvrjpiuSGzT5abGUYOgWUIzTtqZYra+zOMPzVqDAlMykmUYjVO/d/l01L3xgLZQogZ9B3NRgXpTpTJ5iF7UtUejjZSJ6fYGVNwM/TEMrIhKHD54I6FYkLmp+7Rsw2MmxVXHkQPQJ7khYY8ywIDAQABAoIBAQCv97idQG6GE4A9lbi3yBsKQCIB5+LhueDr45ccEjS63M8XNogwFXM8IEZ1zEjcbzf30T8accTC/1Ctq8m7ZNh+9/iuTwUh2X43PXRLbS4ELUrwyvrmURv/9nWtgwxSCQRD1M+OxlM/++K/uk/BUtxO/KkNQGcYZG9TK7MGIsSA6Ua0fNEo+hcTzqBsED3nGYXwmn7nX4zMjPqr6TtQfpxWdwtKYbBsDcvIoigwNPajnsdSbx2M4pZh3cwBuROKs9/HpUNOtSZvPc8BbRenJQOqXG2R+O6SMBGnYf5ycHpk7Wya+1TtGObOAcrgC7RV6y3KGzq0Thu7imWC1B7GvRQBAoGBAM9yA4EBjHSQ0sP5DTT4yD3H7ytQtR3oVZYcKiWg4lPETaFhwucFzbbhmh5gB6Xng71KiIuYuvJZi2XQeL2LcBBaZwoj9cpclJ53KuQ8LL5TPZ1zOn+xU/Iy2mumzVpaSyWcDq7ArlhuGq7JWubAEcrehBia7i26Ss9ro1HqbR+ZAoGBAO3UHnZz8gmkQrUyk6rTPJHivnow2O8nh2dWuK+o+wAN+WCF10VQVaRcUS2bC/khHeomTRNZh+kzs0woLdfEtLlxECA2+MHiIJmXkLat7/Bm8gByd9iWHRZ6d9ZRvb+DPwmbZV0mZoy+8SF5DJno0uFdq6g6tTGQKmQwu1xHeI4DAoGAOQubVxB79VoV+3ozXYvEVOj0Ji8tfynyzzKzjGFvm6Vxy508oZcA+PeVECFMOR0vJxCl9+1qC1cAdGEdstHzYSvbBfjZkGphHCqdCuJZU4VEflW/knnLIeFGGzBlbCFEZPVDPF8UEpFEmSgZ7TaILgd+v91q/fwqslthMBeNJpECgYEAzzNTyu1e/IlwWL8UqepZRdxfCMPP7CPrMtv6EYhODZEfJ7nTgB7qTkTjsLD5MHZqwpnV4rrIzyJs3jfPIMHOlhVr8DUUao5gyo+i05UciryVsFAKG9dExlWyXDVg9B4baHpLSGlxRMQB/qCgmuKd/xyFtg5X2DN6y0ktosrdvBMCgYABqwzMnDF2SPx1mZjXIOCsj/03Oya75E8ZTWGorkROhyarE1wWvES472IGsZSM7qchABmVVGxr09mL0nyNA5KIIEoIWtl59yplXKrunYYoodoXtaS0whTDraf62am98IQ1LAUdf4p1dGfkrAsf8stKuxbzYtEeXQH3EHzzLOzmNg== - - peerId: 12D3KooWE5VmEXLSksS31fWjwydNgoH9c1hMWdMdohKk1mHVVgwC + signingKey: bqnCY+BB93A2nTM59zyP1CGZg5seSIeoGM/ATCOMy4+VvIfB1kwEK2VM5QVx3ub8zV/kqND8xuuQCC2NIrAFxw== + encryptionKey: MIIEowIBAAKCAQEAxaNDIGlEwkYRtcw6eoM1wRReJJUgHbEPTGSazEHTIp9Vza0Ob5GqT0yTFbWQWec1+vfCCVj49Z0usKiIa78iViiZxN/EZtdbimM2b2LTOPPkHTBNM3KawuBtVd34CYOLyFFhc+m4dtquGTsOGC0q2YQlS/XF+vGNWO/j8LnriF47Vv3Vr2YDfYeLo3aMexjzLKDiL1TC8fxtcSHqwrJnhgkFEHV/BIadPBlCpVukTPPMusEaoMshHVViS2emStf7j7Iq6KDdbIMGRCTAKhLNMOnHDwmDlBo/RSS/iYtEXFEADDfiYPOeIKIExPnAfdbku5I1y3/IaxeSpk+jQDFfMQIDAQABAoIBACLEgsWL3z2x5+GsaMkuleE+fQVAeqLeiAtvU1AFcGgR0Z1aCUUVQfmrReC2zQsTwopA1ZChZ0KGATWwoDccK6UuhUZ9+uYAkqj4pRXZM8E8HnAIFDytt436vyEw6DZ8PrXhoxwqDHpUI/ZqTiNwpq4XMhx3wvlPTwdLRDUP7+BQK7EmmZLZPiU+oq7f8Fo3ag2gkRKakatPIjwKRDSXcLNW+Rz2YrxUOAdEir2KiK0CKYAkqmcZy/O1xBjQ0YgQpYgxgBXRHTgd5iIFjGG/bCIHsLyV+FkpMpgO7oFw0aJa6zISFeoZ3Zekpf0qqSQNrI+Tpc3uStSE8/95nIo+fxUCgYEAxuvt8VRl1W16ddYpGAFO7ytTdzFSg4e07rKPLvZbvQ4M21CASluNPPKn/S9KFaLZDagBM2jl2cjGYdHVfVlVu/fmM8nlTCIhxkjU9iHkyspJWXNxzUcnh12GEjcNb1i7Oc1QTof7HFjEG4TrsRmGdAee4ZjXYyIEPAHCgxAdc7sCgYEA/lkGdggdLfw6HkXceLaiuq8FA7asJ0JK7L5XCptAXZ9ci10oQuwC+58S8eFVkOUmnVwFovc7CF5EtWjUkSdI+AIL3WCnj2Xjm/S/ASNL1Urw7Q7A7QKu0kGawadUQ00/oSRApEC3f3XK0rdkRlryp8mj2WRfUyBEjh+NgLzgzAMCgYBHQK1Le3K6n2t1GBBCM/3FN9y+3iDzUkHiGn2lUcOMlaLPUCeT+vU9dqHr0+uSknFzLdG4S4PBneRJl7MEImLOYL7JoDENM1CryNzXiU59wTXC39JMuIcVOs/SaHvcfYka7EsuxhCRl84vGU6fckgx+aTUpD3KmZ2wrOSys6wJDwKBgC+VrjzE1di1mJXzUgUPfjBY8CI6uch6gZP7JEOqugcJ+oFkQ1UJ3KEAqMWx95UtGeVUwwUzJcsx/77ExwgFBoTHtTqMi6yrTkLuLhHjbZuQ8rQXD4cH+ncBqRdT29Lfj+jw5FsWdH4XJoP3pX34I++6LLpOKfteTRUd2BZev9vLAoGBAL24XaIkqAECCqdGLiID3PEIRLGacnjEoAqS7fT5A8CV0Cle1KKZzkJlJvxU/pzSgp5AjI1TwIiH4jYE/Xtc2+61Kx1C7jqK5tNK4lJ3BkHUY9d1Etr+HdnDZYKZ32XdGfh4nUU7dx+OI965oQJISsLVVmu2GBllsbg6sA+w3LnK + - peerId: 12D3KooWJ2259GQZxf1PBkLBR8J37QN4PMiLedBU9h5PNbUwfaXE address: 127.0.0.1:4432 - signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w== - encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm - - peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo + signingKey: RHl/cHYoPtAGXgJl7F3upI2OAnD4hd9aJztiqo08w/V52b3qKvFr2TWnpbNvBlXSxeyXpo4WB1jH+pMslW0irQ== + encryptionKey: MIIEpAIBAAKCAQEA2vHQaQ5U/PzvNFTk3G9t/IMELaxM5OBFV0/HcjDnF3jtc/ADtqG4zsr/VCs7/tiXiEIxn5aMFrvS7APh2/EHLlAnyrjYLyyxvgwqUtV06Gf5K2V7HmFTLch7VFc5HckU4Zg1B61EYAtnWu5JTmsZAmP1v3afsnfpdwTA3LEH65oOyEAXqCeNUtrrwZXYnt77gk1zC0NSdtE4Hf25OJ5to0kckmQf+TMxj5seA5+u55Bg/Hd9sorFl0X0JrAkIxnVcWYt9lCNZk4frPHl1deX9BwOJ5KKrz1Af/617rl8b8H5F+KzkHXpgpJfxtMLWUnUuaX7qm+R3qe1HeMCIAmOLQIDAQABAoIBAGPVHT25/kC5KG1JRG3LFXCtYOtehFVceeG9C+liqQzH5CYYS+krxrPsVg5QBHRI2JeV70CgidIX5K4few4p0ido/yvtqw2fqJBKxcWtdTg/qJsEE+afZCkdIDct6mpNdQsEtzF/7QyKRp9sxdpO9UFkyPp7oYfkK31MmpBG3KCtb57dyIKqfBoIrp9E54X+MtHHQsqpVo7wgdSufUAWA5OtrebqrUGhWrZCRVT5l+BbPp5WliTN12jVU3jdA6rkUzrdyt5jyZQZ1eIm89mBi3wQod3arUx+DnXeICroyWW7eumXqvPdYO9Y2eaGpXY9sjXioGARi97vD/qCB9qB/sECgYEA8L169WaUBfPU6qlD+qZN1Be6PprjBqoTYu3clQikYhF1HGcXT4ri1/8CT8gf9QsUt2NHzNf0vkhyqJ3bD+mxG/c62C7ff4mhLRR2MRiDnqFaYKJL4snFG6eachD7IqgXEJ8Uw8s+LUqljhMa3NlXgDyCdrazVto/J3iDx6/B2/ECgYEA6NKniFEFrJBEVr7neEsMzKSuu8S7VT8bZGNY5yLIHM7+E1YeyJko1BtaQ2f+x9nnRzRPpjO5H+oVLeRWj496retGmvQ24K6VPCq8b7I9QUdYOvhzgo+go6sCM4dzfespIi932EAHGFA0frZ29o9W9a8rgFZUoigde9KAYxVLQf0CgYEAlfUBfZFLDTYoX4/WV3B2NHIfQlYKqqEQeGRALdl3Q9sp/uo8fADActlXIElBlsszOVSvaervegP44A2MYiood4oV7omsEG6zpjgDs2tYuVw6xszxxi/3BtXs/7aSKLFZxLHDJn8YmO/RlmFSL1V3CtsmTTpbFfPWuQh51c4mTJECgYBQEhqR9CN6bIdEOhWLNmxpeP2rEAbJU5HNHam2nCysU7fn2Idvv9Td1aZeZkamXtd+kowOAd3aDvxHsy7d4p9zbuXyZqj07rXeYmg6FdehOrMqXMYFEfZSM37nT981YAneeurBkYufHf5f0crqEvP6PMs+MPKcbiVtr0B+UxV11QKBgQCmNz/q1pPxEltFBOZmsyfmplKgeDyexB8nb0z1NNc00tpKtWL+hvLqGQwYnECJ7kcJDNetKM1J6rDCoLg6hObf/Ze6/BFXTZF8bM6Xqz1elQPYgHl5P+vlJ7yVI5FClVG8RgI73vxr67CZk+4zsZbvTLscaZ1ZPkPR9m+YMJWUrA== + - peerId: 12D3KooWNJdqtKLZAxT3szMrWoSLS1F1JkyKgJ4YQ1rAKfeVPMm6 address: 127.0.0.1:4530 - signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg== - encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0= + signingKey: BwEWqy5XqOeEUy4BmMzv1WltI5TvLPfP2l2mtioxb+a5ijq4aSATKZSFfcm2hpbGDObWOzeyi06BarLOfQsTnQ== + encryptionKey: MIIEpQIBAAKCAQEA2sTIJSgwRRwPVINYyC5lHtZGsBth87wV+mwMVHkt1/Er8WVstudDFj7dvpO4wHE9vzOQi8+VobNT+xZSB1hlLbOuyBMDzdg+0vs1rMmYruKWb12VZ4+ir1xhnqpm5sKhPuPylZFp+m2GuyEeMHjUNnbQDgPSxkh9jNnTnlwG86h8r5BlhbiISZUs0Jh+IiAbgf55xTdYp0UmVREJYpmk8SBOQS4HfkWM7ih85zMrA0lzi6bfghN7CSABpAMYSgLJc9XeP3le8iMSKQsT+RRvXgUAniPT7ftbWg0tZMNjJ9CXF12Mp0ElC95UIwOnJJydgrLMLvQ0Lggie/WdN0PpCwIDAQABAoIBAQCvg37bqLGJUKjP8gzxlZ9VLS5LLbzZUgYEAlmmEA6CmB/cLLYay9Fb8JXwxw1Lf869Ln6CXMm8kGYJJPAsqnOKRgUsyWyc4igNFrQKazbO4EU3Fcq+6lLoA+Lh6+5gpre9AB5oduCipOqaCUjyNI51H79t7w1UPWZU8ZHBFC4TnpanTYTqyYwUThqDR/PExyV7mhYN5gEi3cg4W0cA7qlDaGgwaKBrMphRt2xwNlAlYAhdkwdgRmbnB/zrWb0FHqJAsz6biqqNh0N0EgIsF0ZMO0ZFGRt+Ou36500Z1cRpGurbO1zrpNV2R2Gg0Ssun2tfjoYJN22HqwwLY71s/xXRAoGBAOx5KeiD07zkRCUzfVa9oHd9CxFSpStz0mCauFDpW0nhzgonjSaOmEotGvVRLDF1eqbtji2QOx3WSPXdnNlncyYAsWFJMyupygqsxBxnVBX3yFFicOE6PCaZocwDVmdKNNfg/52U13qS4pxFFclUPHlVvEcovR1VAPP08MvyV4x5AoGBAOzVW7FmVgzAUc9E8ro6pXD4dFyNkE6Hasq5ApQzFbqcaHSUjbS2lF5dKhvur4OABy6XO/wgD78b/bC+vMryxC+yHm4FP+ANpQ+/DSrn+g2X80J0wqC2tIIVqYMOzn3L+gSfRnhW+28vEx5SSofa7aZl/NOoXtXD47amJELwYzijAoGAVH9vJDCG5oZCe3CMpwQXZNr/q272qjI2yGJA3likUCApuaMsYsytSkQXz/Tzb7Dk5OUZ2tog5aZ+Z6yKsXyvvrKcr4CykjWXhnz5jpS1jSv/HmWopDJk7/4RvI6svzfa7hDuBeb7oEcARorBIDHDci/amSrLeMG5F3M84AN2mTECgYEAvx+PV6JWXwP1AWeK2m7phDl87hPwGO9/ZwnW4vI23tnKEgqwMN4G7gARM2lzipOPODIj3luhWYClQjUq9jzjxfngRLlHyvA3/HUZkz6RtNajIUZIqpnHIhOJMJKKYUpzAbfnjsXjMt6ydw3Bx9ENZ/N2DPkbTzc+VO/O45ZK/DECgYEAvhovek7Jk4ZmC1OsxedqudrgQugNGTMnc6gFZR/CUXrtBs1vq4zKe003Nx5WPGaYooySVraSgBplamtsL+dUsVRqWjCyuUrSkuv7XtP6rdSuRJEHTs7vumnGsF2pp+I08W1Bg0zUFToGy0PqFX9pVeR1f63COI4Ca1Vy6+BIw1Q= isConsensus: true - - peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm + - peerId: 12D3KooWP2cwtzkokAGAr8UzdW1pmU4NS2D4dvHJtK2q75TBEeKq address: 127.0.0.1:4531 - signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g== - encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi + signingKey: RyKkgbAlAmo+suhJf1mYau3uneQD93XO9Dks/a8lpXDES5wfPb3dO/8oefEFllI+c/m3bTVkAYBdTHtCZq7lYA== + encryptionKey: MIIEowIBAAKCAQEA6Dhjs/8s/uiTFIopCjoYLTq8JGIM3otbUktYXSnqpBVVUU4TwSJonpyeRCgcYy9FlDWrUPfCNEv/kG6ruNUZQs2UuPbaOMZ1Z5TZRokwZF26rlkmaTlwJLKmKy0wwT9koZT/e5G4NkRO4rOLK/O4NyDlZ/HvWaZPxQtcC4en0CDaaIcDSSKaL5OMz0fcXayQlWKiOsuuP7cSUYlBDybbJPLSPMVYUjGjzIBqZkV6nBgjKGIIBGlknqZpRwX1mgq4vG0UYTfGCOFF1iHQ4TiLM2EiiZw203PVA4ifSyvkZOkMngItBfYcnD5MRYtLXlps2LWW6auN6olAkyUwFQeHLwIDAQABAoIBAGq7kEfo3xuCdieYoOhMb1RKjLMERfn7f0vByal4XJpyG7a09itszz0nqy6UaQfFcGuAh289kQtMavhNhav8dhHYP6UMAJzbypaDOaJL5+wZkHYWD6uJdNvJKMrriF8p7ey+ePaosUxv9PoJn8vhxye/fPFbp7FC2aMtZ279OMpVjyhbBekWlHfAnRbmDaFjMH+7wHfaAArpYsmRaOJ+/ckqhHSWSCXHO7dOyTcRNx4J0NoZ+192J6VsD1bbGxfHEgtVac/3+fj0Uia3mjkA+e9+oe7kfiGAheLs7G+kC0rEht1VLkviwjM0oCPd3zcu50HjqSrQ1q+i4vKJLrPWQFECgYEA8Uz+PlwghCWcJ7c+TYL1Y4UpYMXavRYi+XCHyn5x2PtxLDgK9j38CbLtIJFDY739RxEDLsOAkC3ba5p71EAx2ZF8i4ylmw0ekTe8BhEo/PHhCmLL+12zUrDbmUqsb1/NJBRDVZ9975nqWiT1KWqm3XKrwfBRTvgiP3+dC3XrtiMCgYEA9l3KBUK0oc6RWftNQTbehrwMuG0M4wv05peTHHqlMsYV0b5nKCr1FWU+gA4zhEDNPcs7PkZRl+HHMalkKH/aLpxeafN5a4PkMsQD6ZK5Mz88IENzXbFswBjCI8s5NyAAK+aI4JqXiRoia6fRnWVp+VrC4A1o2dvD6GaZAta3bYUCgYALFhF8RflMePnirT2UjBbAGsca5hw1ocW7lhr3B7YtVOgPMwf15kUlIO5aF7Jz66+uSy7NQDgw55p0KCXWS5i+uTtyoeSd6g1keJ4P3Uv3yxkexAlBJD3v56Y/NboUZ99h7/hj/67mijjFKXuGCpteAz227Faf/TB9oFxTwXgx5wKBgEMOeCRCacP445soSXjMpHjrylKQbAeIg5oX+5Su1TQismGqf41xU9AFBKP6OY9vy+1b2b4ziZXbgEpGHtrfIdW5/gC8onnfJkejDqWOqBYIyibF9Sq1VjJbCsyPTf1xGlrYnrzzlvdcQ64luWor5lJWn+A4Bif2JzakZlVdeAO5AoGBAMynKpkB8vqTLU31yt5SzBroQj8TgZKGbzB2apO1a+2XE8WfmtFOxnS1/iQ67sMkv6Rh/N5SUxMnBLXjsYJFpuNkKjvE+RqO9f4PzklTIJuT49pexheAMKBA9zWv5YPEmMV8xGbqXooSuEP0ixlM07DiqaC7aBzSyIfGdTOvI5w/ isConsensus: true - - peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS + - peerId: 12D3KooWMg5c9wHkuXQ48qyHVa72UKerKWAVZRC2dc1ibSadYxTQ address: 127.0.0.1:4532 - signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ== - encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP + signingKey: gSyxSnCL8NsewJmdFwgVpjQ2hDwDvrbZrLnA1007ymCwLN67/Xd/42q4vsvZAovsXBrv4PuWuoQUqmXhX7OJrw== + encryptionKey: MIIEowIBAAKCAQEAptyiobOzgLUuVfUQetYQD638+kOUAjf+V7uny+9Qhtt0LZM5v4lsJ8DK+NIbJU6fo9sMNJ8Mc2A7QNEZ6iyppI4zszUIMfF9Ixhew8g5zBlaDzieAf1XSGuEd89vj1ikM3Nhp8AXzxxoFOTsgUCMlnAzsHalcVyqXRzN/glAA1Ob6R0pIEIz4LchvMpnjhSLi5XEmBMy3b3XHu+T5nYyLzLxxMpO2fHH41/GpWmOEVrjoT1qP1JSv+ehuXiuMW0rM1833os6jMHCZijfDGh8blWI2nthjOLbr/KQKQhkIqOXKwdkVLY5x4/c78L8dV3eZ647SqurWC/N8kr5r4LvfwIDAQABAoIBABTPHSUHURJzBeVIW5bGDVi3PP5E4Tdpnjl4uJNRM/ytb46jdqcxTyCiBW4EXchIRtZbYelKEHZvANSzfwTaLwnLhh0KNwxrbkyrJF5MIREX9EhDqkjbPEBW0D1UzDfXORsFf5848H8urrg0WF5CG4ZDVd7i3P0HLmPQTMwqgSYo2pLexcj0LtiZZqJ6ta9kxAiJniZyoNshRJnAZMMnFYRhy/eDF+L6sJPHieYgwiQFU5e0CK9UgsLmmOQWCKWtPgvxOhqlbcTz1pJAqkyzOC0wK/ydJpVAh9RUqf46rEDFzL/l90ZOir3AMlYJIHf4PX0TWchXjFW7bbHn5Zvk1xECgYEAzpuGDfaerUl8QziD6F/OoIz1/EZwSumErCH2NXYMBcCyzKu4fBqVqj5tcLsNx42v6kAGaERAQqaC5ZZ9ZNhXiWasHAermQqv8DtlYVCUih4e87dX1/xTF5TzR8RhLwHPADd1rRafCKJMD9X6Qquer5LmSST8ej3mJ4mrflw837cCgYEAzsCoqFenGlCvAZoQrekxS1VmGJDCKBQ7LlbOwQaUkD4I23rjbAHG8J51jmaQQ4epm6lU0JLSma/LKp8dl9oDEP09vcgKj6xuHMZV+EmsA5c181zMrGoH+tSZiWQZjSmJVhd5T147vnbUunTbGKlOQByD0tWM913Dm2dqB3goXnkCgYBZax4dtPr/7KoHPdJ5I939xoQ/5wx6n454IUq54JlbdAbuZfO2Ypsbz2D2RT61ezEDpSogvklBj2dfjj4/AxL/uJwMlZVC60kyI8LA12syS88Bk/xE0kP0FNcl3GxjN9krMtWPUBcMWZGp2OYzLKvFOULJrWRIU7nkqsS6L5l5CQKBgBa/tg8HzfgkRo1LkWhBT041sE0lqGdWioh3vroYakJQwRK9O8bHj0cseEzZ1ifIBo59HDry3L9SS21+Inhx4YJ+CswV9auHUnpSDGWMXaPrgGEtpcuWwxgDSn2GiRUyK81QOeXUvYggdRmq/+x/vH9rY8nP+3nAVGSGBXGa8/4pAoGBAMB7EOk/RnsgQ+SotHbvgv18S0lbJuWsLYGnNp8EcuPxDIxz29fOFH94qzVOwAkk5cbHvAl3/5sl3SelmKM9LXhcOT+1zxoavyAYyVeAGZsrbBmbzj9yeZON0gHtpF3dMWxiguyWuiiHM/pL92gKzlyIXryC3andL/y8/6VpWbtt isConsensus: true space: gcTTL: 60 syncPeriod: 10 +storage: + path: db diff --git a/node/nodespace/nodecache/treecache.go b/node/nodespace/nodecache/treecache.go index e0238528..0b9446a3 100644 --- a/node/nodespace/nodecache/treecache.go +++ b/node/nodespace/nodecache/treecache.go @@ -24,6 +24,12 @@ type treeCache struct { nodeService nodespace.Service } +func New(ttl int) cache.TreeCache { + return &treeCache{ + gcttl: ttl, + } +} + func (c *treeCache) Run(ctx context.Context) (err error) { return nil } @@ -55,12 +61,6 @@ func (c *treeCache) Name() (name string) { return cache.CName } -func NewNodeCache(ttl int) cache.TreeCache { - return &treeCache{ - gcttl: ttl, - } -} - func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (res cache.TreeResult, err error) { var cacheRes ocache.Object ctx = context.WithValue(ctx, spaceKey, spaceId) diff --git a/node/storage/keys.go b/node/storage/keys.go index de99e6e7..b3782d8b 100644 --- a/node/storage/keys.go +++ b/node/storage/keys.go @@ -9,29 +9,32 @@ type treeKeys struct { id string } -func (t treeKeys) HeadsKey() string { - return fmt.Sprintf("t/%s/heads", t.id) +func (t treeKeys) HeadsKey() []byte { + return []byte(fmt.Sprintf("t/%s/heads", t.id)) } -func (t treeKeys) RootKey() string { - return fmt.Sprintf("t/%s", t.id) +func (t treeKeys) RootKey() []byte { + return []byte(fmt.Sprintf("t/%s", t.id)) } -func (t treeKeys) RawChangeKey(id string) string { - return fmt.Sprintf("t/%s/%s", t.id, id) +func (t treeKeys) RawChangeKey(id string) []byte { + return []byte(fmt.Sprintf("t/%s/%s", t.id, id)) } type spaceKeys struct { } -func (s spaceKeys) HeaderKey() string { - return "header" +var headerKey = []byte("header") +var aclKey = []byte("acl") + +func (s spaceKeys) HeaderKey() []byte { + return headerKey } -func (s spaceKeys) ACLKey() string { - return "acl" +func (s spaceKeys) ACLKey() []byte { + return aclKey } -func isTreeKey(path string) bool { - return strings.HasPrefix(path, "t/") && len(strings.Split(path, "/")) > 2 +func isRootKey(key string) bool { + return strings.HasPrefix(key, "t/") && len(strings.Split(key, "/")) == 2 } diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index b1d797c2..52a4b52f 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -23,7 +23,7 @@ func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceS return } keys := spaceKeys{} - has, err := objDb.Has([]byte(keys.HeaderKey())) + has, err := objDb.Has(keys.HeaderKey()) if err != nil { return } @@ -32,7 +32,7 @@ func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceS return } - has, err = objDb.Has([]byte(keys.ACLKey())) + has, err = objDb.Has(keys.ACLKey()) if err != nil { return } @@ -57,7 +57,7 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate } keys := spaceKeys{} - has, err := db.Has([]byte(keys.HeaderKey())) + has, err := db.Has(keys.HeaderKey()) if err != nil { return } @@ -70,7 +70,7 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate if err != nil { return } - err = db.Put([]byte(keys.ACLKey()), marshalledRec) + err = db.Put(keys.ACLKey(), marshalledRec) if err != nil { return } @@ -79,7 +79,7 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate if err != nil { return } - err = db.Put([]byte(keys.HeaderKey()), marshalledHeader) + err = db.Put(keys.HeaderKey(), marshalledHeader) if err != nil { return } @@ -100,7 +100,7 @@ func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayloa defer s.mx.Unlock() treeKeys := treeKeys{payload.TreeId} - has, err := s.objDb.Has([]byte(treeKeys.RootKey())) + has, err := s.objDb.Has(treeKeys.RootKey()) if err != nil { return } @@ -117,7 +117,7 @@ func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) { } func (s *spaceStorage) SpaceHeader() (header *spacesyncproto.RawSpaceHeaderWithId, err error) { - res, err := s.objDb.Get([]byte(s.keys.HeaderKey())) + res, err := s.objDb.Get(s.keys.HeaderKey()) if err != nil { return } @@ -133,7 +133,7 @@ func (s *spaceStorage) StoredIds() (ids []string, err error) { _, value, err := index.Next() for err == nil { strVal := string(value) - if isTreeKey(strVal) { + if isRootKey(strVal) { ids = append(ids, string(value)) } _, value, err = index.Next() diff --git a/node/storage/storageservice.go b/node/storage/storageservice.go index 802a4f47..92927595 100644 --- a/node/storage/storageservice.go +++ b/node/storage/storageservice.go @@ -3,15 +3,21 @@ package storage import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" ) type storageService struct { rootPath string } +func New() storage.SpaceStorageProvider { + return &storageService{} +} + func (s *storageService) Init(a *app.App) (err error) { - //TODO implement me - panic("implement me") + cfg := a.MustComponent(config.CName).(*config.Config) + s.rootPath = cfg.Storage.Path + return nil } func (s *storageService) Name() (name string) { diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index 1fdeef2d..68e88bfd 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -12,19 +12,19 @@ import ( ) type treeStorage struct { - db *pogreb.DB - path treeKeys - id string - rootPath []byte - headsPath []byte - heads []string - root *treechangeproto.RawTreeChangeWithId - headsMx sync.Mutex + db *pogreb.DB + keys treeKeys + id string + rootKey []byte + headsKey []byte + heads []string + root *treechangeproto.RawTreeChangeWithId + headsMx sync.Mutex } func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) { - path := treeKeys{treeId} - heads, err := db.Get([]byte(path.HeadsKey())) + keys := treeKeys{treeId} + heads, err := db.Get(keys.HeadsKey()) if err != nil { return } @@ -33,7 +33,7 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err e return } - res, err := db.Get([]byte(path.RootKey())) + res, err := db.Get(keys.RootKey()) if err != nil { return } @@ -49,20 +49,20 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err e } ts = &treeStorage{ - db: db, - path: path, - rootPath: []byte(path.RootKey()), - headsPath: []byte(path.HeadsKey()), - id: treeId, - heads: parseHeads(heads), - root: root, + db: db, + keys: keys, + rootKey: keys.RootKey(), + headsKey: keys.HeadsKey(), + id: treeId, + heads: parseHeads(heads), + root: root, } return } func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { keys := treeKeys{id: payload.TreeId} - has, err := db.Has([]byte(keys.RootKey())) + has, err := db.Has(keys.RootKey()) if err != nil { return } @@ -74,36 +74,36 @@ func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) heads := createHeadsPayload(payload.Heads) for _, ch := range payload.Changes { - err = db.Put([]byte(keys.RawChangeKey(ch.Id)), ch.GetRawChange()) + err = db.Put(keys.RawChangeKey(ch.Id), ch.GetRawChange()) if err != nil { return } } - err = db.Put([]byte(keys.HeadsKey()), heads) + err = db.Put(keys.HeadsKey(), heads) if err != nil { return } // duplicating same change in raw changes - err = db.Put([]byte(keys.RawChangeKey(payload.TreeId)), payload.RootRawChange.GetRawChange()) + err = db.Put(keys.RawChangeKey(payload.TreeId), payload.RootRawChange.GetRawChange()) if err != nil { return } - err = db.Put([]byte(keys.RootKey()), payload.RootRawChange.GetRawChange()) + err = db.Put(keys.RootKey(), payload.RootRawChange.GetRawChange()) if err != nil { return } ts = &treeStorage{ - db: db, - path: keys, - rootPath: []byte(keys.RootKey()), - headsPath: []byte(keys.HeadsKey()), - id: payload.TreeId, - heads: payload.Heads, - root: payload.RootRawChange, + db: db, + keys: keys, + rootKey: keys.RootKey(), + headsKey: keys.HeadsKey(), + id: payload.TreeId, + heads: payload.Heads, + root: payload.RootRawChange, } return } @@ -131,7 +131,7 @@ func (t *treeStorage) SetHeads(heads []string) (err error) { } }() payload := createHeadsPayload(heads) - return t.db.Put(t.headsPath, payload) + return t.db.Put(t.headsKey, payload) } func (t *treeStorage) AddRawChange(change *treechangeproto.RawTreeChangeWithId) (err error) { @@ -139,7 +139,7 @@ func (t *treeStorage) AddRawChange(change *treechangeproto.RawTreeChangeWithId) } func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treechangeproto.RawTreeChangeWithId, err error) { - res, err := t.db.Get([]byte(t.path.RawChangeKey(id))) + res, err := t.db.Get(t.keys.RawChangeKey(id)) if err != nil { return } @@ -152,7 +152,7 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha } func (t *treeStorage) HasChange(ctx context.Context, id string) (bool, error) { - return t.db.Has([]byte(id)) + return t.db.Has(t.keys.RawChangeKey(id)) } func parseHeads(headsPayload []byte) []string { From 3695a29b3273de3f04239b2f6454ec622591897c Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Tue, 11 Oct 2022 12:13:31 +0300 Subject: [PATCH 131/219] drpc metrics to quantile --- Makefile | 2 +- cmd/consensusnode/consensusnode.go | 4 ++++ common/metric/drpc.go | 4 ++-- common/net/rpc/server/drpcserver.go | 18 +++++++++++++----- etc/configs/node1.yml | 6 +++--- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index ab3b8f33..ca30b47c 100644 --- a/Makefile +++ b/Makefile @@ -39,4 +39,4 @@ build: build-consensus: @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) - go build -v -o bin/consensus-node -ldflags "$(FLAGS)" cmd/consensusnode/consensusnode.go + go build -v -o bin/consensus-node -ldflags "$(FLAGS)" github.com/anytypeio/go-anytype-infrastructure-experiments/cmd/consensusnode diff --git a/cmd/consensusnode/consensusnode.go b/cmd/consensusnode/consensusnode.go index 491d7ce9..45d668ad 100644 --- a/cmd/consensusnode/consensusnode.go +++ b/cmd/consensusnode/consensusnode.go @@ -23,6 +23,10 @@ import ( "time" ) +var ( + Version = app.Version() +) + var log = logger.NewNamed("main") var ( diff --git a/common/metric/drpc.go b/common/metric/drpc.go index 78c77752..97c01f8a 100644 --- a/common/metric/drpc.go +++ b/common/metric/drpc.go @@ -8,13 +8,13 @@ import ( type PrometheusDRPC struct { drpc.Handler - HistogramVec *prometheus.HistogramVec + SummaryVec *prometheus.SummaryVec } func (ph *PrometheusDRPC) HandleRPC(stream drpc.Stream, rpc string) (err error) { st := time.Now() defer func() { - ph.HistogramVec.WithLabelValues(rpc).Observe(time.Since(st).Seconds()) + ph.SummaryVec.WithLabelValues(rpc).Observe(time.Since(st).Seconds()) }() return ph.Handler.HandleRPC(stream, rpc) } diff --git a/common/net/rpc/server/drpcserver.go b/common/net/rpc/server/drpcserver.go index 76131f27..bdb44007 100644 --- a/common/net/rpc/server/drpcserver.go +++ b/common/net/rpc/server/drpcserver.go @@ -57,16 +57,24 @@ func (s *drpcServer) Name() (name string) { } func (s *drpcServer) Run(ctx context.Context) (err error) { - histVec := prometheus.NewHistogramVec(prometheus.HistogramOpts{ + histVec := prometheus.NewSummaryVec(prometheus.SummaryOpts{ Namespace: "drpc", Subsystem: "server", - Name: "method", + Name: "duration", + Objectives: map[float64]float64{ + 0.5: 0.5, + 0.85: 0.01, + 0.95: 0.0005, + 0.99: 0.0001, + }, }, []string{"rpc"}) s.drpcServer = drpcserver.New(&metric.PrometheusDRPC{ - Handler: s.Mux, - HistogramVec: histVec, + Handler: s.Mux, + SummaryVec: histVec, }) - s.metric.Registry().Register(histVec) + if err = s.metric.Registry().Register(histVec); err != nil { + return + } ctx, s.cancel = context.WithCancel(ctx) for _, addr := range s.config.ListenAddrs { tcpList, err := net.Listen("tcp", addr) diff --git a/etc/configs/node1.yml b/etc/configs/node1.yml index 2d15529c..bb75286e 100755 --- a/etc/configs/node1.yml +++ b/etc/configs/node1.yml @@ -24,17 +24,17 @@ nodes: signingKey: BI+SqqwurrTaNCHtc9+DeItlNPh6/6gH9CrJwNXS6Ug/TwwRHloM7siXqOWvJVRUiJ8UCraYjuAnB4huLdby4w== encryptionKey: MIIEowIBAAKCAQEAtyliO0Y/M1RHRNCRl5D+x337CVbv/Yhn5bF0+Ib5h72JDtewRLKWcqCxmNa0RhmSbUHIlO7itf9a9k8FBlQOg6SlVgRk5xET1FpGioS+yHsaiwx+KbCgP6QeDSMNLVKW/+WPXItvvZxoQV9m9TywGJzzMBF9QY3rWhMGV1s58S0PvIjficyORbMTZL2aKlcPjf8Mh/Yzo0eiPTR8+sKvguxonhUdEGfpts1Wn0rIr+BQhk9hto8okOeQkEy1LO8cHyVpk0Zm2jIq643CRd0qcfpOYGm+xz9nzEjCWZJdc/Bq5Vok03mi5050fv6nA/HcopBUnk5Jk5jLQEa/0rEXuwIDAQABAoIBADZuYfbjhVynqxZUNTApss1uLvAzmdZqdxXXir9gvT8NoHF8v7FqsTMXdi/JfoFmkBFP/1/jLhSP8mRIT2H2EOomP8w0OhhBBveQbG41zMyfaN/xsnyJNNY024lj5UKWzLD3c4c5GNfsZz8mLt6qTlrCKbMbP3H/zvVRugyz26BEFzXnXVsRo57MXwGPHzhMS2bdYsixuNz6Hwlu3brJkIgzQA740ABVzVG75DRwvdJ1w+kIskrlCa7tFnHl/mVaBQ0plFaY4Urjk3fOI6JzHA8I92FBWYinKPlBXBBeXp/vjsfsp60d5zi1/bdNqvMFL7HbwQO7yJd37UR0bV+1lIECgYEA1XhV18EICpxHQwm0svmvnE8MVUHEzzSlpXYZujQis6x0tXOdXEVqfh8EzSmBlJLj64ndIG13gVVeBIJszXTBLCgoUxrH1JXtECu47jIB2X9QPEaicfpnUlXcbNFS7RQIbyS1yvbKKmK9lJOA6TMtjMVmQ8zpAtivqhsc4LDI6RECgYEA26c4t/CHiqYb31CYsUDNQeL6yor1K6pfyshJ7xO2fvFj3+7H5Q5sVk4bN0btS2pird/WDlfgH7AroCbyxtCEcsnXr3gOywA5I27Jy2UAFmajC9CUvIBINdhKuEAG4Pckn0aDBamBuU/DG145NA2mXBMQQ9MsObNioGC2LVA91AsCgYAIjbPS21c5JZ3tX7wv17Vjq/8wg1wheViR0rOhNGmXjXd3tdQ+WEG2IAQPPHSGwYQEche8Lua09fi4cYluihkbbdh/y/jp2cAP/9B/Kt3MGz/ZynLD4ma1c99LNO//s+fKnEv0gAMFw8MY6vglX/mZRGeem91SUeBoDoIPtsW2IQKBgQCPAk/GSn8lAUNSYNoZRbSduhdIubIoTNPzZfXlB3OhMK6zBHb3Ji3Y/x9vHOmwWUKILBzk18ffOccdjV4xnV8ukUWxQ7x15N5OuHn/x/GHpClxrsq389mP3RPA5EbWP3KDlNgHXrZMHadM8UrTHjP67JqBXkMECkwjWPQjioPGwwKBgGBWi7axhF2Sk+SPSWKVQTTOwbpRhyDj/qzLDB836u9fCo5xYmlbXp/YtiHlk37FbRNfw90qN35tqD10dOKDmGbvm+tJxoRZpmH0w1ExGVr1KBXIp4D2jTyjHPaHEdvJEsWG5wNJcOd8gFuki/m4bafFh7iJMizvYkM8bVNV2Ctm - peerId: 12D3KooWB2Xvsa8RrmdhcBTJMoogqPu43tWZ3XUwXMowcCuMjHjo - address: 127.0.0.1:4530 + address: ec2-18-159-132-180.eu-central-1.compute.amazonaws.com:4530 signingKey: zsY2jhPHbfMKIKfXGh+PsNBhCLD//dmJtBNMhG3m1OIR+bF4a7B5Wid8eBRm6vtCbOJzoxhJZjRYk1vEHuhmgg== encryptionKey: MIIEpQIBAAKCAQEA4mbDvFUlpfiRkfnW22C0XvpAfB0m1G7vGcDWfNfgMmf8xD1rknWAGNZi2Ek3rjt9uVuL3DnlLEjGf0HrhsNm/VUI3nId72zgqTZd8fHbA+6h2ba9wP1t+IUf456k41bgljD09HxpvEKtHO1OWQGnVFMc5gqMeM7uovZS+NbXvG5RJoVgG/Ugw6BgEmj0e0LDmvvn2FRvmzst77EPQKlp43J4Vl0n7OtvBypLd/KA0dtB3Nl5rjcewFpSbUadhzJMnw38mtj/jwJsvvwUnzKuv6O6ZK1uqW8bFXKN5OmP8gw+EkZo/GX5IuyHdQwjYWKTAuWn/bYXbwsXAqYEtEW+XQIDAQABAoIBADCbC27FgP2u7eG/F6eljVPOukVrJMj6wA5xXhsTZaistpGS9iNNYqDydeolXfTkBMvkoZQ4QcFOJn9vsZcPIG9G8E6BhXe/kkQBzg2BdRnVA55wIzDpt9BhFEWT66Z7ImBcRlqu0yx9zBinwehN+JSb+1pP7XSKSKVn6MxPo6VqSlP4xRN8rQrq8sVvIt1eVH01rxhGBRM/gpoPtIXlf9cYRoa/49c1/Hk3YmE+oYG+oWzoBIsIDS8qEKfEzIrHTB8d0DmLW38xInTqwNgcp6GpoK9mDBhPcb6vZpd0uWx8pwqJ4cYQTJ/ksOrq67T6yyMaJn8WRJflg1taFD9ONoECgYEA9B7LsEXHRMzEAM1YKqxoiOm8UVfv+qdsLUBoeJb81fdgb8YjXq0KhD7+hGhfCogIWuCygXOYCd8srzZxlkSCK3S2F6R5xlsZY7TwSd2LvH4821T8dX/h+mYoe7dbrE2PjWuZL9PwSOLGfEYS7BS7vwl3Qd58sF5/hVX2Rg9V4tECgYEA7Ws7CEt3ic3i7YuzAdaw22WOHGETwb9cV5cwKRnvbhpIcU9fQa291+kIhgV6TaJuAmUJbnB3jwRYG3wEurRodlh8g6HYyCFzB9ZjKuG4av1wlLw8pTSMngH7Vlsy+OiItQhUSB14AUAD9+d4mq5P2uPm0aqw8qbU8Z4tZ6Xyjc0CgYEA4ULRfdTFrcytSHgzVR1GUKAt73mPreFzxsXaIPxiTiY4zKsu1Bwkyic+wHt2x8cCvqj8zssVjnZrSzqX0ath2iuWI3bYD5rccM7zs5VFbiemjFV9qAbbRS2jSZXGd9YSEtMoxaNx5C+uK9qVd1cib4OSkit1L2HjleveloNsIyECgYEA25APR9yC8C43bveC1HB3nm6MvjII02TlQRvQrjIN+wTTefatYVAMAWDBQTBPqvxMQGqwDjJ0Xw7lbIWE2iV9dfTfMdy7XlmQx+68Ryv4IPnA48wxSZcPdBDhHzu4J/jkdIb/arHWCVHqWZj3MBWERCn/jGcOvVkMFWbzFqehaQECgYEAl9saSHtsYYbhEX/PMLbecJtJU2WEOkML0QpyZyzF3Y0FnWpjlY4HV5RUsEOksAjbaAxbF7Xk8NZCjmqdR6+WdHt+3CQl+964vkvBIGWYXyo5/zso5HxzTpZTN8I03Xk09nMfn72lPKq6dWRD1EVBPX0TfOzg1xL7ftng7BR+bx0= isConsensus: true - peerId: 12D3KooWHSSHxDymTrGQjTHSATFxWnnz4incxYazKukgBia3xPAm - address: 127.0.0.1:4531 + address: ec2-18-192-21-226.eu-central-1.compute.amazonaws.com:4530 signingKey: uN55hCvFWVBlFcptEca/PlCJBVvMPmCvB9WnWHHGMftxP2GGPEVntjpeS2aRrcHvfvf0WfjAP47CQdr+V8yD5g== encryptionKey: MIIEowIBAAKCAQEAuQvwreiIbcoASka0Be0nvdQfU/ZGzIjONzfHCaGWqIfxjqsIG2I55X+3j8kIZZBl+oMIGzk3amZq1KWNGKsRhuDdsHKSaSAnFqPIYYfiAkp5evsBCFzWkMaB2xelDkNzYGAyTemvsnjyp3wlJjrdoJrwW5kNojz84B0NQZjn81O8BH1HOibzXIoO65oBduWGwj5zaqboEe33VFowxRJxXG+RHnOCY4XRoZ40wx32t4LefsDcMbfaNaYEt7av5uzkh/+X9AWNw6VmYKimVv2KAyYwJ5Q+ZkCyASPO9ShBdMfaiR1hETQExVPtBQB3876e0IzW/+j5o1WGu1KPk1t2kwIDAQABAoIBAHvnHM61hrRMr4kMcnoNY7DdmeR0YM+PQtUCSgmO4vwRmpK2voTnbnDW5agnKbInz8C/f+wKkapyzVF5UFKWKPQxGP+Ol65AUyv7mq6Dd7ek+lZ4PybEUv85i7WRzXkRfO2pO8WjlXthNMkkfRNuEvv5AruybciWIZRGn5uusJDh+rMI382z6b00/U7r0igj4g5o1KqT1wYxba2VT4CaSeqNEMbdOcGWDjHx7zIanHvMrRtRG4DgYIY11ohnARU8UUI/wL5WG9iVaeuepq8T1G3vLt+096UwE/GYIhwQ0UUf+HS4HviACcMWJeXbKas64twtUA0Pf0JFCxPnM/QTBtECgYEA0Zpurv8M2P/atqODGG2teKseJqz4nB9vYLbAQfpziv0OyvRQ26r72pjtBwIDxv67fVSL3/HlViBGElMGycrA/XZ1cTiXY2LAcfpnu2P/Q7vUE/n5NBg4C1Cqjgb7D4dFXOTOM182HFL5SSQiUv5jMRvqxZTX5NcxBj3wbuHt0v0CgYEA4gH1755EWtS6q8+UUdLNAM+TL1SKaMcfiGAMdMWL5uSJBQ28fFPZIZv14gTzaU+Zji3AsGXiBpgtwor4rEugmX+nL7FATIaS0rh15hjXEvczg0SyZBkiXygo9WSQFQ/1AuHmQ8dNgNHXuSv9VbQeu52xhr74saii2tCzTOfyDM8CgYBQHA4hpCls5pzZITWBqKmcbQphDcsXIIyZEj/495ghjwaQW0BsNLV9nuU4wHRhIgrWo/Gx7eoRONSPPFxj07JfLV9FnrN9sMiMx3/OBzIQ2UD9QZUVbAw/ht0o21IpZTIFhw2oZMNxn+TXJ5BW2BNhOaJJUdISDI0YLaQvPPqAoQKBgQCBXY/xtYz41PV47NvALkKL6UUdfW2wZfIltJzMplrbMgtAKkmufKw3sbb/xceyiw6hNI0sK1VCYw8mYTfQH4Xw9wGyqendI9ac6VsK90L8pyUESWk3JK/o+erf880JUVX0bWvJdiZlyzeI1aYvzWceCziXoW5m+tklGPrY1ZdWPwKBgEYm3cThyIi1MScjR7lBKPKUKfkmN88ZoNnzfcn1Mgzwpo9alTycyT9otC/wBGIf4WhRmDoCYE7htIA0C0j8YlmYhd8+gEuRnWFn8Gx8ecpSmUIIpZINeV/t9YFSbod6OnYJosxwLJGzHpb6FN4ojpO5lq7iPWN4v/dtd/p/Bfoi isConsensus: true - peerId: 12D3KooWCm6fXRReUtpD4bQyy3EnzEe7htRGCAvzHw5yewb1SbRS - address: 127.0.0.1:4532 + address: ec2-3-124-115-217.eu-central-1.compute.amazonaws.com:4530 signingKey: 31nl1dejInkuEbwBf7NyEp7t6adkMOyCMMzq9ub+XQgrvMnFxeIOso/c38RWo08lSMpZLltC2yS88/EkNIWveQ== encryptionKey: MIIEowIBAAKCAQEA3dSgJsWNz3zusneGYIjufkXe4byl+RGZNE2dUWEwPqlsjyFXLFmBQwU6UMAOvgEGLuNY2HWVLKzWsqccLqkMjEo3ZQSTft1kf3x3TFlFpPFtGI0lL59b37K3zJ6sdY65PPskhXqy4ru/oTjJh4F13qE40x9bVSrmVnllrEzlyG2kR7KOiHWmufChtvTHA6Nv4x8sevsKzwIXOMMdbKb67aw6jWic94gI8lf+KN7UHYAMKA5MvwwvvH4hadUubMH810jtpiD720dkKRYkgLviLuxhOhRn+s2UY+Dl9vDplBO5tfn0ZnU77q0OrF1qAhwPiuy0yq08ykhL4NrKiLjGdwIDAQABAoIBAHQjxlWGSODBABfgDDKufm8OFcsKAbuNQzDnEd5xi9jCy1uEkSdfFRYJvqZYZ1+DGcGitfleVmO1ehK++zpSt4cbtDTnWHGrZ9p3R95pPtVEsWGRRE7SmD9eSmyPBqvltYX/1vcrbkzXD1VRbfHMDfIpZp7iY+cLNt0/YcP73rI3+4U+4DXsPmaf4jtCBpUH0ru59aCJTJWvYFiVsapWdJY+BcAerpV7QH74dVQ3XNIWRCxsG4+S9cfi5uuenHqM3MmCz8jOpTQeepg64aSNmFsTVEeoNXfQ+78ELUIXEWBpDoWWNVTQxoy3edPThuDgEbw0KHP+z6C63ztP552kB0ECgYEA9pKCvigZyrbn/gmFha0FVEfGWkv8SGHkm3LctnOHj3fyfezKmp1bq44bBFhw+p12qN6NmpZIpMh91X/vDcmNJTAQz9ty14pB0Dlq/egV/AffjtUjYb4UzxiV3EmH97BB9rK9B4VkSdPY1FbOtAEyt6cWoYTUwwrHKzTbhOhAn2sCgYEA5k/wU0uN57BwXrcDNP10zkjxbpsoNEINBj+eGpKjZaKXU7XkgoezgzeGa04Ym6crLxmhlXtSojXFkqeLdhn5hJSKPJ+JsAZD9gM0iZ9Hb8l9/opzlSEJzMFLyCdCeu+9Hipq3OuGkJgRemn9h9UMih1zUTo2RwRdfpLvUEUANCUCgYB90AQmQw/l/64gUXtv2fj+KCFtsZfo1wpuxw0Xi5t/+RQibNB0VBaSUtA2R2pedjo1sFlQp54pdqO+bKjtwAnlD8GETdUrZcBvHt0Y8XNGRj4sA1UqanLzuPe+j0Zxe94soscRL18czJu2vRR7hKD8VKWXhM+LNdSqly3rgxZ2QQKBgFJ6okhSMHmeuD9TLzTU5/XQLZY8voMofF2WftppVVbaiXMTGsicLG97fQoEp89maJKvjSxpQ8iPlTfWBJ3A45jVUUQwpjCBrej2cOQwRHcGI7b6gjYP5OCNAMSnOqmoHYQmEKsZNdGmg+vg9UilxZ3YuimGvVVlfM4NdOK8Mzx5AoGBAKKtLvw/rpL+ZLSlO5CTycjBlY8Uy0/SkTI9T/gvwPm7zMdZW0AN7HShsus6SKATba7ZXIySY+tBWfuq9oEACzvC20Qw9tQUTS90g8mwHwTcj4H58cnvmbtOFg75RYMUYvcOjpbPLvcGKsYrobjzqv9MrrL41fgMXw8DVIomqQbP isConsensus: true From 46f562e91d86e5aaf7c637926f4772acc982e57a Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 11 Oct 2022 11:15:46 +0200 Subject: [PATCH 132/219] Change mutex logic --- node/storage/treestorage.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index 68e88bfd..224cf292 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -123,11 +123,11 @@ func (t *treeStorage) Heads() ([]string, error) { } func (t *treeStorage) SetHeads(heads []string) (err error) { + t.headsMx.Lock() + defer t.headsMx.Unlock() defer func() { if err == nil { - t.headsMx.Lock() t.heads = heads - t.headsMx.Unlock() } }() payload := createHeadsPayload(heads) From 8970730ec98c7c5533df772ba13c9d4605ecc9eb Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Tue, 11 Oct 2022 12:36:05 +0300 Subject: [PATCH 133/219] fix --- cmd/consensusnode/consensusnode.go | 4 ---- common/net/rpc/server/drpcserver.go | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/cmd/consensusnode/consensusnode.go b/cmd/consensusnode/consensusnode.go index 45d668ad..491d7ce9 100644 --- a/cmd/consensusnode/consensusnode.go +++ b/cmd/consensusnode/consensusnode.go @@ -23,10 +23,6 @@ import ( "time" ) -var ( - Version = app.Version() -) - var log = logger.NewNamed("main") var ( diff --git a/common/net/rpc/server/drpcserver.go b/common/net/rpc/server/drpcserver.go index bdb44007..de466e88 100644 --- a/common/net/rpc/server/drpcserver.go +++ b/common/net/rpc/server/drpcserver.go @@ -60,7 +60,7 @@ func (s *drpcServer) Run(ctx context.Context) (err error) { histVec := prometheus.NewSummaryVec(prometheus.SummaryOpts{ Namespace: "drpc", Subsystem: "server", - Name: "duration", + Name: "duration_seconds", Objectives: map[float64]float64{ 0.5: 0.5, 0.85: 0.01, From d2b64fb272bc785f5f43e9d509fe7023b8b6220b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 11 Oct 2022 21:30:06 +0200 Subject: [PATCH 134/219] Add wip benchmarks --- cmd/benchmarks/db/badger.go | 116 ++++++++++++++++++++++++++++++++ cmd/benchmarks/db/common.go | 22 +++++++ cmd/benchmarks/db/pogreb.go | 79 ++++++++++++++++++++++ cmd/benchmarks/dbbench.go | 127 ++++++++++++++++++++++++++++++++++++ go.mod | 13 +++- go.sum | 85 ++++++++++++++++++++++++ 6 files changed, 441 insertions(+), 1 deletion(-) create mode 100644 cmd/benchmarks/db/badger.go create mode 100644 cmd/benchmarks/db/common.go create mode 100644 cmd/benchmarks/db/pogreb.go create mode 100644 cmd/benchmarks/dbbench.go diff --git a/cmd/benchmarks/db/badger.go b/cmd/benchmarks/db/badger.go new file mode 100644 index 00000000..7ddfa6ce --- /dev/null +++ b/cmd/benchmarks/db/badger.go @@ -0,0 +1,116 @@ +package db + +import ( + "fmt" + "github.com/dgraph-io/badger/v3" +) + +type badgerTree struct { + id string + spaceId string + db *badger.DB +} + +func (b *badgerTree) Id() string { + return b.id +} + +func (b *badgerTree) UpdateHead(head string) (err error) { + key := fmt.Sprintf("space/%s/tree/%s/heads", b.spaceId, b.id) + return b.db.Update(func(txn *badger.Txn) error { + return txn.Set([]byte(key), []byte(head)) + }) +} + +func (b *badgerTree) AddChange(key string, value []byte) (err error) { + badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key) + return b.db.Update(func(txn *badger.Txn) error { + return txn.Set([]byte(badgerKey), value) + }) +} + +type badgerSpace struct { + id string + db *badger.DB +} + +func (b *badgerSpace) Id() string { + return b.id +} + +func (b *badgerSpace) CreateTree(id string) (Tree, error) { + key := fmt.Sprintf("space/%s/tree/%s", b.id, id) + err := b.db.Update(func(txn *badger.Txn) error { + return txn.Set([]byte(key), []byte("exists")) + }) + if err != nil { + return nil, err + } + return &badgerTree{ + id: id, + spaceId: b.id, + db: b.db, + }, nil +} + +func (b *badgerSpace) GetTree(id string) (Tree, error) { + //TODO implement me + panic("implement me") +} + +func (b *badgerSpace) Close() error { + return nil +} + +type badgerSpaceCreator struct { + rootPath string + db *badger.DB +} + +func (b *badgerSpaceCreator) CreateSpace(id string) (Space, error) { + key := fmt.Sprintf("space/%s", id) + err := b.db.Update(func(txn *badger.Txn) error { + return txn.Set([]byte(key), []byte("exists")) + }) + if err != nil { + return nil, err + } + return &badgerSpace{ + id: id, + db: b.db, + }, nil +} + +func (b *badgerSpaceCreator) GetSpace(id string) (Space, error) { + key := fmt.Sprintf("space/%s", id) + err := b.db.Update(func(txn *badger.Txn) error { + _, err := txn.Get([]byte(key)) + if err != nil { + return err + } + return nil + }) + if err != nil { + return nil, err + } + return &badgerSpace{ + id: id, + db: b.db, + }, nil +} + +func (b *badgerSpaceCreator) Close() error { + return b.db.Close() +} + +func NewBadgerSpaceCreator() SpaceCreator { + rootPath := "badger.db.test" + db, err := badger.Open(badger.DefaultOptions(rootPath)) + if err != nil { + panic(err) + } + return &badgerSpaceCreator{ + rootPath: rootPath, + db: db, + } +} diff --git a/cmd/benchmarks/db/common.go b/cmd/benchmarks/db/common.go new file mode 100644 index 00000000..12f611aa --- /dev/null +++ b/cmd/benchmarks/db/common.go @@ -0,0 +1,22 @@ +package db + +type Tree interface { + Id() string + UpdateHead(head string) (err error) + AddChange(key string, value []byte) (err error) +} + +type Space interface { + Id() string + CreateTree(id string) (Tree, error) + GetTree(id string) (Tree, error) + Close() error +} + +type SpaceCreator interface { + CreateSpace(id string) (Space, error) + GetSpace(id string) (Space, error) + Close() error +} + +type SpaceCreatorFactory func() SpaceCreator diff --git a/cmd/benchmarks/db/pogreb.go b/cmd/benchmarks/db/pogreb.go new file mode 100644 index 00000000..7bdf3f0b --- /dev/null +++ b/cmd/benchmarks/db/pogreb.go @@ -0,0 +1,79 @@ +package db + +import ( + "fmt" + "github.com/akrylysov/pogreb" + "path" +) + +type pogrebTree struct { + id string + db *pogreb.DB +} + +func (p *pogrebTree) Id() string { + return p.id +} + +func (p *pogrebTree) UpdateHead(head string) (err error) { + return p.db.Put([]byte(fmt.Sprintf("t/%s/heads", p.id)), []byte(head)) +} + +func (p *pogrebTree) AddChange(key string, value []byte) (err error) { + return p.db.Put([]byte(fmt.Sprintf("t/%s/%s", p.id, key)), value) +} + +type pogrebSpace struct { + id string + db *pogreb.DB +} + +func (p *pogrebSpace) Id() string { + return p.id +} + +func (p *pogrebSpace) CreateTree(id string) (Tree, error) { + return &pogrebTree{ + id: id, + db: p.db, + }, nil +} + +func (p *pogrebSpace) GetTree(id string) (Tree, error) { + return p.CreateTree(id) +} + +func (p *pogrebSpace) Close() error { + return p.db.Close() +} + +type pogrebSpaceCreator struct { + rootPath string +} + +func (p *pogrebSpaceCreator) CreateSpace(id string) (Space, error) { + dbPath := path.Join(p.rootPath, id) + db, err := pogreb.Open(dbPath, &pogreb.Options{ + BackgroundSyncInterval: 0, + BackgroundCompactionInterval: 20000, + }) + if err != nil { + return nil, err + } + return &pogrebSpace{ + id: id, + db: db, + }, nil +} + +func (p *pogrebSpaceCreator) GetSpace(id string) (Space, error) { + return p.CreateSpace(id) +} + +func (p *pogrebSpaceCreator) Close() error { + return nil +} + +func NewPogrebSpaceCreator() SpaceCreator { + return &pogrebSpaceCreator{rootPath: "db.test"} +} diff --git a/cmd/benchmarks/dbbench.go b/cmd/benchmarks/dbbench.go new file mode 100644 index 00000000..66314d31 --- /dev/null +++ b/cmd/benchmarks/dbbench.go @@ -0,0 +1,127 @@ +package main + +import ( + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/cmd/benchmarks/db" + "os" + "os/signal" + "syscall" + "time" +) + +func main() { + //bench(db.NewPogrebSpaceCreator, options{ + // numSpaces: 100, + // numEntriesInSpace: 100, + // numChangesInTree: 10, + // numHeadUpdates: 100, + // defValueSize: 1000, + // lenHeadUpdate: 10, + //}) + bench(db.NewPogrebSpaceCreator, options{ + numSpaces: 1000, + numEntriesInSpace: 100, + numChangesInTree: 10, + numHeadUpdates: 100, + defValueSize: 1000, + lenHeadUpdate: 10, + }) +} + +type options struct { + numSpaces int + numEntriesInSpace int + numChangesInTree int + numHeadUpdates int + defValueSize int + lenHeadUpdate int +} + +func bench(factory db.SpaceCreatorFactory, opts options) { + spaceIdGetter := func(n int) string { + return fmt.Sprintf("space%d", n) + } + treeIdGetter := func(n int) string { + return fmt.Sprintf("tree%d", n) + } + changeIdGetter := func(n int) string { + return fmt.Sprintf("change%d", n) + } + + var byteSlice []byte + for i := 0; i < opts.defValueSize; i++ { + byteSlice = append(byteSlice, byte('a')) + } + + var headUpdate string + for i := 0; i < opts.lenHeadUpdate; i++ { + headUpdate += "a" + } + + creator := factory() + // creating spaces + now := time.Now() + var spaces []db.Space + for i := 0; i < opts.numSpaces; i++ { + sp, err := creator.CreateSpace(spaceIdGetter(i)) + if err != nil { + panic(err) + } + err = sp.Close() + if err != nil { + panic(err) + } + } + fmt.Println(opts.numSpaces, "spaces creation, spent ms", time.Now().Sub(now).Milliseconds()) + now = time.Now() + // creating trees + var trees []db.Tree + for i := 0; i < opts.numSpaces; i++ { + space, err := creator.GetSpace(spaceIdGetter(i)) + if err != nil { + panic(err) + } + spaces = append(spaces, space) + for j := 0; j < opts.numEntriesInSpace; j++ { + tr, err := space.CreateTree(treeIdGetter(j)) + if err != nil { + panic(err) + } + trees = append(trees, tr) + } + } + fmt.Println(opts.numSpaces*opts.numEntriesInSpace, "trees creation, spent ms", time.Now().Sub(now).Milliseconds()) + now = time.Now() + + // filling entries and updating heads + for _, t := range trees { + for i := 0; i < opts.numChangesInTree; i++ { + err := t.AddChange(changeIdGetter(i), byteSlice) + if err != nil { + panic(err) + } + } + for i := 0; i < opts.numHeadUpdates; i++ { + err := t.UpdateHead(headUpdate) + if err != nil { + panic(err) + } + } + } + fmt.Println(opts.numSpaces*opts.numEntriesInSpace*opts.numChangesInTree, "changes creation, spent ms", time.Now().Sub(now).Milliseconds()) + + exit := make(chan os.Signal, 1) + signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT) + sig := <-exit + for _, sp := range spaces { + err := sp.Close() + if err != nil { + panic(err) + } + } + err := creator.Close() + if err != nil { + panic(err) + } + fmt.Println(sig) +} diff --git a/go.mod b/go.mod index 8023dfa2..49dbf9e1 100644 --- a/go.mod +++ b/go.mod @@ -34,11 +34,19 @@ require ( github.com/btcsuite/btcd v0.22.1 // indirect github.com/btcsuite/btcd/btcec/v2 v2.1.3 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/dgraph-io/badger/v3 v3.2103.2 // indirect + github.com/dgraph-io/ristretto v0.1.0 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect github.com/fogleman/gg v1.3.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/golang/snappy v0.0.1 // indirect + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect + 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/klauspost/compress v1.15.1 // indirect github.com/klauspost/cpuid/v2 v2.0.12 // indirect github.com/libp2p/go-buffer-pool v0.0.2 // indirect @@ -58,13 +66,16 @@ require ( github.com/xdg-go/scram v1.1.1 // indirect github.com/xdg-go/stringprep v1.0.3 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + go.opencensus.io v0.22.5 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect + golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect golang.org/x/text v0.3.7 // indirect + google.golang.org/protobuf v1.27.1 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.1.6 // indirect diff --git a/go.sum b/go.sum index 08295176..03ccc1fe 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= @@ -5,6 +7,7 @@ github.com/akrylysov/pogreb v0.10.1 h1:FqlR8VR7uCbJdfUob916tPM+idpKgeESDXOA1K0DK github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= 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= github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab h1:+cdNqtOJWjvepyhxy23G7z7vmpYCoC65AP0nqi1f53s= github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -17,10 +20,18 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOF github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= 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/cheggaaa/mb/v2 v2.0.1 h1:gn0khbEbKlw3i5VOYi0VnHEHayjZKfUDOyGSpHAybBs= github.com/cheggaaa/mb/v2 v2.0.1/go.mod h1:XGeZw20Iqgjky26KL0mvCwk3+4NyZCUbshSo6ALne+c= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +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/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA= github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= 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= @@ -28,30 +39,58 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/dgraph-io/badger/v3 v3.2103.2 h1:dpyM5eCJAtQCBcMCZcT4UBZchuTJgCywerHHgmxfxM8= +github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/goccy/go-graphviz v0.0.9 h1:s/FMMJ1Joj6La3S5ApO3Jk2cwM4LpXECC2muFx3IPQQ= github.com/goccy/go-graphviz v0.0.9/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +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 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +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.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.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +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/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.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 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= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -72,11 +111,14 @@ github.com/libp2p/go-libp2p-core v0.16.1 h1:bWoiEBqVkpJ13hbv/f69tHODp86t6mvc4fBN github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c= github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= 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/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= @@ -103,18 +145,27 @@ github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2 github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY= github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 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/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= 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= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +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/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/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.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= @@ -124,12 +175,14 @@ github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PK github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -145,6 +198,8 @@ github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= go.mongodb.org/mongo-driver v1.10.2 h1:4Wk3cnqOrQCn0P92L3/mmurMxzdvWWs5J9jinAVKD+k= go.mongodb.org/mongo-driver v1.10.2/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8= +go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -155,6 +210,7 @@ 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.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -164,12 +220,19 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= 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/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= golang.org/x/image v0.0.0-20200119044424-58c23975cae1/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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/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-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-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -177,18 +240,27 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +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-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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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-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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -204,6 +276,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -215,6 +289,16 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T 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/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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +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/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.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 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= @@ -229,6 +313,7 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C 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= lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= storj.io/drpc v0.0.32 h1:5p5ZwsK/VOgapaCu+oxaPVwO6UwIs+iwdMiD50+R4PI= From 85d83ed9ba8af6d41141f617dd80f927052d785c Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 11 Oct 2022 23:01:41 +0200 Subject: [PATCH 135/219] Add checks for bench --- cmd/benchmarks/db/badger.go | 29 ++++++++++++++++++++++++++++ cmd/benchmarks/db/common.go | 2 ++ cmd/benchmarks/db/pogreb.go | 16 +++++++++++++--- cmd/benchmarks/dbbench.go | 38 ++++++++++++++++++++++++++++++++++++- 4 files changed, 81 insertions(+), 4 deletions(-) diff --git a/cmd/benchmarks/db/badger.go b/cmd/benchmarks/db/badger.go index 7ddfa6ce..1487aafc 100644 --- a/cmd/benchmarks/db/badger.go +++ b/cmd/benchmarks/db/badger.go @@ -29,6 +29,35 @@ func (b *badgerTree) AddChange(key string, value []byte) (err error) { }) } +func (b *badgerTree) GetChange(key string) (val []byte, err error) { + badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key) + err = b.db.View(func(txn *badger.Txn) error { + item, err := txn.Get([]byte(badgerKey)) + if err != nil { + return err + } + val, err = item.ValueCopy(val) + if err != nil { + return err + } + return nil + }) + return +} + +func (b *badgerTree) HasChange(key string) (has bool, err error) { + badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key) + err = b.db.View(func(txn *badger.Txn) error { + _, err := txn.Get([]byte(badgerKey)) + return err + }) + if err != nil { + return + } + has = true + return +} + type badgerSpace struct { id string db *badger.DB diff --git a/cmd/benchmarks/db/common.go b/cmd/benchmarks/db/common.go index 12f611aa..d690473c 100644 --- a/cmd/benchmarks/db/common.go +++ b/cmd/benchmarks/db/common.go @@ -4,6 +4,8 @@ type Tree interface { Id() string UpdateHead(head string) (err error) AddChange(key string, value []byte) (err error) + GetChange(key string) ([]byte, error) + HasChange(key string) (has bool, err error) } type Space interface { diff --git a/cmd/benchmarks/db/pogreb.go b/cmd/benchmarks/db/pogreb.go index 7bdf3f0b..6cdde374 100644 --- a/cmd/benchmarks/db/pogreb.go +++ b/cmd/benchmarks/db/pogreb.go @@ -20,7 +20,18 @@ func (p *pogrebTree) UpdateHead(head string) (err error) { } func (p *pogrebTree) AddChange(key string, value []byte) (err error) { - return p.db.Put([]byte(fmt.Sprintf("t/%s/%s", p.id, key)), value) + changeKey := fmt.Sprintf("t/%s/%s", p.id, key) + return p.db.Put([]byte(changeKey), value) +} + +func (p *pogrebTree) GetChange(key string) (val []byte, err error) { + changeKey := fmt.Sprintf("t/%s/%s", p.id, key) + return p.db.Get([]byte(changeKey)) +} + +func (p *pogrebTree) HasChange(key string) (has bool, err error) { + changeKey := fmt.Sprintf("t/%s/%s", p.id, key) + return p.db.Has([]byte(changeKey)) } type pogrebSpace struct { @@ -54,8 +65,7 @@ type pogrebSpaceCreator struct { func (p *pogrebSpaceCreator) CreateSpace(id string) (Space, error) { dbPath := path.Join(p.rootPath, id) db, err := pogreb.Open(dbPath, &pogreb.Options{ - BackgroundSyncInterval: 0, - BackgroundCompactionInterval: 20000, + BackgroundCompactionInterval: 200000, }) if err != nil { return nil, err diff --git a/cmd/benchmarks/dbbench.go b/cmd/benchmarks/dbbench.go index 66314d31..f377c664 100644 --- a/cmd/benchmarks/dbbench.go +++ b/cmd/benchmarks/dbbench.go @@ -3,6 +3,8 @@ package main import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/cmd/benchmarks/db" + "net/http" + _ "net/http/pprof" "os" "os/signal" "syscall" @@ -18,6 +20,9 @@ func main() { // defValueSize: 1000, // lenHeadUpdate: 10, //}) + go func() { + fmt.Println(http.ListenAndServe("localhost:6060", nil)) + }() bench(db.NewPogrebSpaceCreator, options{ numSpaces: 1000, numEntriesInSpace: 100, @@ -108,7 +113,38 @@ func bench(factory db.SpaceCreatorFactory, opts options) { } } } - fmt.Println(opts.numSpaces*opts.numEntriesInSpace*opts.numChangesInTree, "changes creation, spent ms", time.Now().Sub(now).Milliseconds()) + total := opts.numSpaces * opts.numEntriesInSpace * opts.numChangesInTree + fmt.Println(total, "changes creation, spent ms", time.Now().Sub(now).Milliseconds()) + now = time.Now() + + // getting some values from tree + for _, t := range trees { + for i := 0; i < opts.numChangesInTree; i++ { + res, err := t.GetChange(changeIdGetter(i)) + if err != nil { + panic(err) + } + if res == nil { + panic("shouldn't be empty") + } + } + } + fmt.Println(total, "changes getting, spent ms", time.Now().Sub(now).Milliseconds()) + now = time.Now() + + // getting some values from tree + for _, t := range trees { + for i := 0; i < opts.numChangesInTree; i++ { + b, err := t.HasChange(changeIdGetter(i)) + if err != nil { + panic(err) + } + if !b { + panic("should be able to check with has") + } + } + } + fmt.Println(total, "changes checking, spent ms", time.Now().Sub(now).Milliseconds()) exit := make(chan os.Signal, 1) signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT) From 296d9a86d043869fd6c5580e09c9ee3d63b33ba4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 11 Oct 2022 23:11:17 +0200 Subject: [PATCH 136/219] Naming fixes --- cmd/benchmarks/dbbench.go | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/cmd/benchmarks/dbbench.go b/cmd/benchmarks/dbbench.go index f377c664..0c37302d 100644 --- a/cmd/benchmarks/dbbench.go +++ b/cmd/benchmarks/dbbench.go @@ -12,17 +12,10 @@ import ( ) func main() { - //bench(db.NewPogrebSpaceCreator, options{ - // numSpaces: 100, - // numEntriesInSpace: 100, - // numChangesInTree: 10, - // numHeadUpdates: 100, - // defValueSize: 1000, - // lenHeadUpdate: 10, - //}) go func() { fmt.Println(http.ListenAndServe("localhost:6060", nil)) }() + //bench(db.NewBadgerSpaceCreator, options{ bench(db.NewPogrebSpaceCreator, options{ numSpaces: 1000, numEntriesInSpace: 100, @@ -43,13 +36,13 @@ type options struct { } func bench(factory db.SpaceCreatorFactory, opts options) { - spaceIdGetter := func(n int) string { + spaceIdKey := func(n int) string { return fmt.Sprintf("space%d", n) } - treeIdGetter := func(n int) string { + treeIdKey := func(n int) string { return fmt.Sprintf("tree%d", n) } - changeIdGetter := func(n int) string { + changeIdKey := func(n int) string { return fmt.Sprintf("change%d", n) } @@ -68,7 +61,7 @@ func bench(factory db.SpaceCreatorFactory, opts options) { now := time.Now() var spaces []db.Space for i := 0; i < opts.numSpaces; i++ { - sp, err := creator.CreateSpace(spaceIdGetter(i)) + sp, err := creator.CreateSpace(spaceIdKey(i)) if err != nil { panic(err) } @@ -82,13 +75,13 @@ func bench(factory db.SpaceCreatorFactory, opts options) { // creating trees var trees []db.Tree for i := 0; i < opts.numSpaces; i++ { - space, err := creator.GetSpace(spaceIdGetter(i)) + space, err := creator.GetSpace(spaceIdKey(i)) if err != nil { panic(err) } spaces = append(spaces, space) for j := 0; j < opts.numEntriesInSpace; j++ { - tr, err := space.CreateTree(treeIdGetter(j)) + tr, err := space.CreateTree(treeIdKey(j)) if err != nil { panic(err) } @@ -101,7 +94,7 @@ func bench(factory db.SpaceCreatorFactory, opts options) { // filling entries and updating heads for _, t := range trees { for i := 0; i < opts.numChangesInTree; i++ { - err := t.AddChange(changeIdGetter(i), byteSlice) + err := t.AddChange(changeIdKey(i), byteSlice) if err != nil { panic(err) } @@ -120,7 +113,7 @@ func bench(factory db.SpaceCreatorFactory, opts options) { // getting some values from tree for _, t := range trees { for i := 0; i < opts.numChangesInTree; i++ { - res, err := t.GetChange(changeIdGetter(i)) + res, err := t.GetChange(changeIdKey(i)) if err != nil { panic(err) } @@ -135,7 +128,7 @@ func bench(factory db.SpaceCreatorFactory, opts options) { // getting some values from tree for _, t := range trees { for i := 0; i < opts.numChangesInTree; i++ { - b, err := t.HasChange(changeIdGetter(i)) + b, err := t.HasChange(changeIdKey(i)) if err != nil { panic(err) } From 5e2a6778f0d84fd3a2092e5de28b11d834327c27 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Wed, 12 Oct 2022 15:14:19 +0300 Subject: [PATCH 137/219] change copaction interval --- cmd/benchmarks/db/pogreb.go | 4 +++- cmd/benchmarks/dbbench.go | 30 ++++++++++++++++++------------ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/cmd/benchmarks/db/pogreb.go b/cmd/benchmarks/db/pogreb.go index 6cdde374..7cc9759a 100644 --- a/cmd/benchmarks/db/pogreb.go +++ b/cmd/benchmarks/db/pogreb.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/akrylysov/pogreb" "path" + "time" ) type pogrebTree struct { @@ -65,7 +66,8 @@ type pogrebSpaceCreator struct { func (p *pogrebSpaceCreator) CreateSpace(id string) (Space, error) { dbPath := path.Join(p.rootPath, id) db, err := pogreb.Open(dbPath, &pogreb.Options{ - BackgroundCompactionInterval: 200000, + BackgroundSyncInterval: time.Second * 30, + BackgroundCompactionInterval: time.Minute * 2, }) if err != nil { return nil, err diff --git a/cmd/benchmarks/dbbench.go b/cmd/benchmarks/dbbench.go index 0c37302d..c3db3601 100644 --- a/cmd/benchmarks/dbbench.go +++ b/cmd/benchmarks/dbbench.go @@ -3,6 +3,7 @@ package main import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/cmd/benchmarks/db" + "math/rand" "net/http" _ "net/http/pprof" "os" @@ -15,15 +16,18 @@ func main() { go func() { fmt.Println(http.ListenAndServe("localhost:6060", nil)) }() - //bench(db.NewBadgerSpaceCreator, options{ - bench(db.NewPogrebSpaceCreator, options{ + opts := options{ numSpaces: 1000, numEntriesInSpace: 100, numChangesInTree: 10, numHeadUpdates: 100, defValueSize: 1000, - lenHeadUpdate: 10, - }) + lenHeadUpdate: 1000, + } + fmt.Println("badger") + bench(db.NewBadgerSpaceCreator, opts) + fmt.Println("pogreb") + bench(db.NewPogrebSpaceCreator, opts) } type options struct { @@ -46,14 +50,16 @@ func bench(factory db.SpaceCreatorFactory, opts options) { return fmt.Sprintf("change%d", n) } - var byteSlice []byte - for i := 0; i < opts.defValueSize; i++ { - byteSlice = append(byteSlice, byte('a')) + var byteSlice = func() []byte { + var buf = make([]byte, opts.defValueSize) + rand.Read(buf) + return buf } - var headUpdate string - for i := 0; i < opts.lenHeadUpdate; i++ { - headUpdate += "a" + var headUpdate = func() []byte { + var buf = make([]byte, opts.lenHeadUpdate) + rand.Read(buf) + return buf } creator := factory() @@ -94,13 +100,13 @@ func bench(factory db.SpaceCreatorFactory, opts options) { // filling entries and updating heads for _, t := range trees { for i := 0; i < opts.numChangesInTree; i++ { - err := t.AddChange(changeIdKey(i), byteSlice) + err := t.AddChange(changeIdKey(i), byteSlice()) if err != nil { panic(err) } } for i := 0; i < opts.numHeadUpdates; i++ { - err := t.UpdateHead(headUpdate) + err := t.UpdateHead(string(headUpdate())) if err != nil { panic(err) } From ad021e5758a6519eb22c51175799409fd791ea24 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 12 Oct 2022 21:36:16 +0200 Subject: [PATCH 138/219] Add close waiter and close logic for db --- common/commonspace/space.go | 3 +- common/commonspace/storage/storage.go | 1 + node/nodespace/service.go | 8 +++- node/storage/spacestorage.go | 19 ++++++++- pkg/ocache/closewaiter.go | 60 +++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 pkg/ocache/closewaiter.go diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 8111895a..aa255f51 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -146,5 +146,6 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene func (s *space) Close() error { s.diffService.Close() - return s.syncService.Close() + s.syncService.Close() + return s.storage.Close() } diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index 0dc9df99..eada36f7 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -19,6 +19,7 @@ type SpaceStorage interface { ACLStorage() (storage.ListStorage, error) SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) StoredIds() ([]string, error) + Close() error } type SpaceStorageCreatePayload struct { diff --git a/node/nodespace/service.go b/node/nodespace/service.go index 0920ef42..2bb60781 100644 --- a/node/nodespace/service.go +++ b/node/nodespace/service.go @@ -29,17 +29,21 @@ type Service interface { type service struct { conf config.Space spaceCache ocache.OCache + closeWaiter *ocache.CloseWaiter commonSpace commonspace.Service spaceStorageProvider storage.SpaceStorageProvider } func (s *service) Init(a *app.App) (err error) { + s.closeWaiter = ocache.NewCloseWaiter(func(ctx context.Context, id string) (value ocache.Object, err error) { + return s.commonSpace.GetSpace(ctx, id) + }) s.conf = a.MustComponent(config.CName).(*config.Config).Space s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service) s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.spaceCache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { - return s.commonSpace.GetSpace(ctx, id) + return s.closeWaiter.Load(ctx, id) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), @@ -66,7 +70,7 @@ func (s *service) GetSpace(ctx context.Context, id string) (commonspace.Space, e if err != nil { return nil, err } - return v.(commonspace.Space), nil + return v.(*ocache.CloseWrapper).Value.(commonspace.Space), nil } func (s *service) Close(ctx context.Context) (err error) { diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index 52a4b52f..4f0d0a49 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -8,8 +8,13 @@ import ( "github.com/gogo/protobuf/proto" "path" "sync" + "time" ) +var defPogrebOptions = &pogreb.Options{ + BackgroundCompactionInterval: time.Minute * 5, +} + type spaceStorage struct { objDb *pogreb.DB keys spaceKeys @@ -18,7 +23,7 @@ type spaceStorage struct { func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceStorage, err error) { dbPath := path.Join(rootPath, spaceId) - objDb, err := pogreb.Open(dbPath, nil) + objDb, err := pogreb.Open(dbPath, defPogrebOptions) if err != nil { return } @@ -51,11 +56,17 @@ func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceS func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) { // TODO: add payload verification dbPath := path.Join(rootPath, payload.SpaceHeaderWithId.Id) - db, err := pogreb.Open(dbPath, nil) + db, err := pogreb.Open(dbPath, defPogrebOptions) if err != nil { return } + defer func() { + if err != nil { + db.Close() + } + }() + keys := spaceKeys{} has, err := db.Has(keys.HeaderKey()) if err != nil { @@ -145,3 +156,7 @@ func (s *spaceStorage) StoredIds() (ids []string, err error) { err = nil return } + +func (s *spaceStorage) Close() (err error) { + return s.objDb.Close() +} diff --git a/pkg/ocache/closewaiter.go b/pkg/ocache/closewaiter.go new file mode 100644 index 00000000..52043c70 --- /dev/null +++ b/pkg/ocache/closewaiter.go @@ -0,0 +1,60 @@ +package ocache + +import ( + "context" + "sync" +) + +type CloseWrapper struct { + Value Object + ch chan struct{} +} + +func (c *CloseWrapper) Close() (err error) { + err = c.Value.Close() + close(c.ch) + return err +} + +type CloseWaiter struct { + load func(ctx context.Context, id string) (value Object, err error) + + mx sync.Mutex + closeMap map[string]chan struct{} +} + +func NewCloseWaiter(load func(ctx context.Context, id string) (value Object, err error)) *CloseWaiter { + return &CloseWaiter{ + load: load, + closeMap: make(map[string]chan struct{}), + } +} + +func (l *CloseWaiter) Load(ctx context.Context, id string) (value Object, err error) { + // this uses assumption of ocache, that for each id load function cannot be called simultaneously + var ch chan struct{} + l.mx.Lock() + if c, exists := l.closeMap[id]; exists { + ch = c + } + l.mx.Unlock() + if ch != nil { + <-ch + } + + value, err = l.load(ctx, id) + if err != nil { + return + } + + ch = make(chan struct{}) + l.mx.Lock() + l.closeMap[id] = ch + l.mx.Unlock() + + value = &CloseWrapper{ + Value: value, + ch: ch, + } + return +} From 980357509d4f55894c7d5640b032cbc1b7b137d5 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 13 Oct 2022 13:27:18 +0200 Subject: [PATCH 139/219] Change ocache to include wait for closing --- pkg/ocache/ocache.go | 72 +++++++++++++++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/pkg/ocache/ocache.go b/pkg/ocache/ocache.go index 44dc9d42..998faf6d 100644 --- a/pkg/ocache/ocache.go +++ b/pkg/ocache/ocache.go @@ -89,6 +89,8 @@ type entry struct { load chan struct{} loadErr error value Object + isClosing bool + close chan struct{} } func (e *entry) locked() bool { @@ -148,6 +150,7 @@ func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) { ok bool load bool ) +Load: c.mu.Lock() if c.closed { c.mu.Unlock() @@ -161,11 +164,18 @@ func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) { } c.data[id] = e } - e.lastUsage = c.timeNow() - if !c.noRefCounter { - e.refCount++ + closing := e.isClosing + if !e.isClosing { + e.lastUsage = c.timeNow() + if !c.noRefCounter { + e.refCount++ + } } c.mu.Unlock() + if closing { + <-e.close + goto Load + } if load { go c.load(ctx, id, e) @@ -181,17 +191,18 @@ func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) { func (c *oCache) Pick(ctx context.Context, id string) (value Object, err error) { c.mu.Lock() val, ok := c.data[id] - c.mu.Unlock() - if !ok { + if !ok || val.isClosing { + c.mu.Unlock() return nil, ErrNotExists } + c.mu.Unlock() + select { case <-ctx.Done(): return nil, ctx.Err() case <-val.load: + return val.value, val.loadErr } - <-val.load - return val.value, val.loadErr } func (c *oCache) load(ctx context.Context, id string, e *entry) { @@ -238,17 +249,30 @@ func (c *oCache) Reset(id string) bool { func (c *oCache) Remove(id string) (ok bool, err error) { c.mu.Lock() - e, ok := c.data[id] - if ok { - delete(c.data, id) + if c.closed { + c.mu.Unlock() + err = ErrClosed + return } + var e *entry + e, ok = c.data[id] + if !ok || e.isClosing { + c.mu.Unlock() + return + } + e.isClosing = true + e.close = make(chan struct{}) c.mu.Unlock() - if ok { - <-e.load - if e.value != nil { - err = e.value.Close() - } + + <-e.load + if e.value != nil { + err = e.value.Close() } + c.mu.Lock() + close(e.close) + delete(c.data, e.id) + c.mu.Unlock() + return } @@ -288,7 +312,7 @@ func (c *oCache) ForEach(f func(obj Object) (isContinue bool)) { for _, v := range c.data { select { case <-v.load: - if v.value != nil { + if v.value != nil && !v.isClosing { objects = append(objects, v.value) } default: @@ -323,18 +347,23 @@ func (c *oCache) GC() { } deadline := c.timeNow().Add(-c.ttl) var toClose []*entry - for k, e := range c.data { + for _, e := range c.data { + if e.isClosing { + continue + } lu := e.lastUsage if lug, ok := e.value.(ObjectLastUsage); ok { lu = lug.LastUsage() } if !e.locked() && e.refCount <= 0 && lu.Before(deadline) { - delete(c.data, k) + e.isClosing = true + e.close = make(chan struct{}) toClose = append(toClose, e) } } size := len(c.data) c.mu.Unlock() + c.log.Infof("GC: removed %d; cache size: %d", len(toClose), size) for _, e := range toClose { <-e.load @@ -344,6 +373,13 @@ func (c *oCache) GC() { } } } + + c.mu.Lock() + for _, e := range toClose { + close(e.close) + delete(c.data, e.id) + } + c.mu.Unlock() } func (c *oCache) Len() int { From e7602a164a4fcce86fbdfa81160681603c34e8a9 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 13 Oct 2022 17:00:51 +0300 Subject: [PATCH 140/219] prometheus handle metrics --- cmd/consensusnode/testclient/consensustestclient.go | 2 +- common/metric/metric.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/consensusnode/testclient/consensustestclient.go b/cmd/consensusnode/testclient/consensustestclient.go index 5539e430..d0dc7b69 100644 --- a/cmd/consensusnode/testclient/consensustestclient.go +++ b/cmd/consensusnode/testclient/consensustestclient.go @@ -38,7 +38,7 @@ var ( func main() { flag.Parse() - + rand.Seed(time.Now().UnixNano()) if *flagVersion { fmt.Println(app.VersionDescription()) return diff --git a/common/metric/metric.go b/common/metric/metric.go index 1eed1579..522aaa06 100644 --- a/common/metric/metric.go +++ b/common/metric/metric.go @@ -50,8 +50,9 @@ func (m *metric) Run(ctx context.Context) (err error) { } if m.config.Addr != "" { var errCh = make(chan error) + http.Handle("/metrics", promhttp.HandlerFor(m.registry, promhttp.HandlerOpts{})) go func() { - errCh <- http.ListenAndServe(m.config.Addr, promhttp.HandlerFor(m.registry, promhttp.HandlerOpts{})) + errCh <- http.ListenAndServe(m.config.Addr, nil) }() select { case err = <-errCh: From 401402021afeb073818682eeb4dc373576b426bf Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 14 Oct 2022 12:37:45 +0200 Subject: [PATCH 141/219] Add tests for ocache --- pkg/ocache/ocache.go | 2 +- pkg/ocache/ocache_test.go | 106 +++++++++++++++++++++++++++++++++----- 2 files changed, 93 insertions(+), 15 deletions(-) diff --git a/pkg/ocache/ocache.go b/pkg/ocache/ocache.go index 998faf6d..c19c398c 100644 --- a/pkg/ocache/ocache.go +++ b/pkg/ocache/ocache.go @@ -86,10 +86,10 @@ type entry struct { id string lastUsage time.Time refCount uint32 + isClosing bool load chan struct{} loadErr error value Object - isClosing bool close chan struct{} } diff --git a/pkg/ocache/ocache_test.go b/pkg/ocache/ocache_test.go index 55bf2e95..cebed09a 100644 --- a/pkg/ocache/ocache_test.go +++ b/pkg/ocache/ocache_test.go @@ -14,16 +14,23 @@ import ( type testObject struct { name string closeErr error + closeCh chan struct{} +} + +func NewTestObject(name string, closeCh chan struct{}) *testObject { + return &testObject{ + name: name, + closeCh: closeCh, + } } func (t *testObject) Close() (err error) { + if t.closeCh != nil { + <-t.closeCh + } return t.closeErr } -func (t *testObject) ShouldClose() bool { - return true -} - func TestOCache_Get(t *testing.T) { t.Run("successful", func(t *testing.T) { c := New(func(ctx context.Context, id string) (value Object, err error) { @@ -109,20 +116,91 @@ func TestOCache_Get(t *testing.T) { } func TestOCache_GC(t *testing.T) { + t.Run("test without close wait", func(t *testing.T) { + c := New(func(ctx context.Context, id string) (value Object, err error) { + return &testObject{name: id}, nil + }, WithTTL(time.Millisecond*10)) + val, err := c.Get(context.TODO(), "id") + require.NoError(t, err) + require.NotNil(t, val) + assert.Equal(t, 1, c.Len()) + c.GC() + assert.Equal(t, 1, c.Len()) + time.Sleep(time.Millisecond * 30) + c.GC() + assert.Equal(t, 1, c.Len()) + assert.True(t, c.Release("id")) + c.GC() + assert.Equal(t, 0, c.Len()) + assert.False(t, c.Release("id")) + }) + t.Run("test with close wait", func(t *testing.T) { + closeCh := make(chan struct{}) + getCh := make(chan struct{}) + + c := New(func(ctx context.Context, id string) (value Object, err error) { + return NewTestObject(id, closeCh), nil + }, WithTTL(time.Millisecond*10)) + val, err := c.Get(context.TODO(), "id") + require.NoError(t, err) + require.NotNil(t, val) + assert.Equal(t, 1, c.Len()) + assert.True(t, c.Release("id")) + // making ttl pass + time.Sleep(time.Millisecond * 40) + // first gc will be run after 20 secs, so calling it manually + go c.GC() + // waiting until all objects are marked as closing + time.Sleep(time.Millisecond * 40) + var events []string + go func() { + _, err := c.Get(context.TODO(), "id") + require.NoError(t, err) + require.NotNil(t, val) + events = append(events, "get") + close(getCh) + }() + events = append(events, "close") + // sleeping to make sure that Get is called + time.Sleep(time.Millisecond * 40) + close(closeCh) + + <-getCh + require.Equal(t, []string{"close", "get"}, events) + }) +} + +func Test_OCache_Remove(t *testing.T) { + closeCh := make(chan struct{}) + getCh := make(chan struct{}) + c := New(func(ctx context.Context, id string) (value Object, err error) { - return &testObject{name: id}, nil + return NewTestObject(id, closeCh), nil }, WithTTL(time.Millisecond*10)) val, err := c.Get(context.TODO(), "id") require.NoError(t, err) require.NotNil(t, val) assert.Equal(t, 1, c.Len()) - c.GC() - assert.Equal(t, 1, c.Len()) - time.Sleep(time.Millisecond * 30) - c.GC() - assert.Equal(t, 1, c.Len()) - assert.True(t, c.Release("id")) - c.GC() - assert.Equal(t, 0, c.Len()) - assert.False(t, c.Release("id")) + // removing the object, so we will wait on closing + go func() { + _, err := c.Remove("id") + require.NoError(t, err) + }() + time.Sleep(time.Millisecond * 40) + + var events []string + go func() { + _, err := c.Get(context.TODO(), "id") + require.NoError(t, err) + require.NotNil(t, val) + events = append(events, "get") + close(getCh) + }() + events = append(events, "close") + // sleeping to make sure that Get is called + time.Sleep(time.Millisecond * 40) + close(closeCh) + + <-getCh + require.Equal(t, []string{"close", "get"}, events) } From a1aacbffed0eef8f056755a957892a80a343440a Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 14 Oct 2022 13:32:40 +0200 Subject: [PATCH 142/219] Fix keys and remove close waiter --- node/nodespace/service.go | 8 ++--- node/storage/keys.go | 30 +++++++++++++++--- node/storage/spacestorage.go | 1 - pkg/ocache/closewaiter.go | 60 ------------------------------------ 4 files changed, 27 insertions(+), 72 deletions(-) delete mode 100644 pkg/ocache/closewaiter.go diff --git a/node/nodespace/service.go b/node/nodespace/service.go index 2bb60781..0920ef42 100644 --- a/node/nodespace/service.go +++ b/node/nodespace/service.go @@ -29,21 +29,17 @@ type Service interface { type service struct { conf config.Space spaceCache ocache.OCache - closeWaiter *ocache.CloseWaiter commonSpace commonspace.Service spaceStorageProvider storage.SpaceStorageProvider } func (s *service) Init(a *app.App) (err error) { - s.closeWaiter = ocache.NewCloseWaiter(func(ctx context.Context, id string) (value ocache.Object, err error) { - return s.commonSpace.GetSpace(ctx, id) - }) s.conf = a.MustComponent(config.CName).(*config.Config).Space s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service) s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.spaceCache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { - return s.closeWaiter.Load(ctx, id) + return s.commonSpace.GetSpace(ctx, id) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), @@ -70,7 +66,7 @@ func (s *service) GetSpace(ctx context.Context, id string) (commonspace.Space, e if err != nil { return nil, err } - return v.(*ocache.CloseWrapper).Value.(commonspace.Space), nil + return v.(commonspace.Space), nil } func (s *service) Close(ctx context.Context) (err error) { diff --git a/node/storage/keys.go b/node/storage/keys.go index b3782d8b..0d4b8de5 100644 --- a/node/storage/keys.go +++ b/node/storage/keys.go @@ -1,7 +1,7 @@ package storage import ( - "fmt" + "bytes" "strings" ) @@ -10,15 +10,15 @@ type treeKeys struct { } func (t treeKeys) HeadsKey() []byte { - return []byte(fmt.Sprintf("t/%s/heads", t.id)) + return joinStringsToBytes("t", t.id, "heads") } func (t treeKeys) RootKey() []byte { - return []byte(fmt.Sprintf("t/%s", t.id)) + return joinStringsToBytes("t", t.id) } func (t treeKeys) RawChangeKey(id string) []byte { - return []byte(fmt.Sprintf("t/%s/%s", t.id, id)) + return joinStringsToBytes("t", t.id, id) } type spaceKeys struct { @@ -36,5 +36,25 @@ func (s spaceKeys) ACLKey() []byte { } func isRootKey(key string) bool { - return strings.HasPrefix(key, "t/") && len(strings.Split(key, "/")) == 2 + return strings.HasPrefix(key, "t/") && strings.Count(key, "/") == 2 +} + +func joinStringsToBytes(strs ...string) []byte { + var ( + b bytes.Buffer + totalLen int + ) + for _, s := range strs { + totalLen += len(s) + } + // adding separators + totalLen += len(strs) - 1 + b.Grow(totalLen) + for idx, s := range strs { + if idx > 0 { + b.WriteString("/") + } + b.WriteString(s) + } + return b.Bytes() } diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index 4f0d0a49..c2faab6c 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -54,7 +54,6 @@ func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceS } func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) { - // TODO: add payload verification dbPath := path.Join(rootPath, payload.SpaceHeaderWithId.Id) db, err := pogreb.Open(dbPath, defPogrebOptions) if err != nil { diff --git a/pkg/ocache/closewaiter.go b/pkg/ocache/closewaiter.go deleted file mode 100644 index 52043c70..00000000 --- a/pkg/ocache/closewaiter.go +++ /dev/null @@ -1,60 +0,0 @@ -package ocache - -import ( - "context" - "sync" -) - -type CloseWrapper struct { - Value Object - ch chan struct{} -} - -func (c *CloseWrapper) Close() (err error) { - err = c.Value.Close() - close(c.ch) - return err -} - -type CloseWaiter struct { - load func(ctx context.Context, id string) (value Object, err error) - - mx sync.Mutex - closeMap map[string]chan struct{} -} - -func NewCloseWaiter(load func(ctx context.Context, id string) (value Object, err error)) *CloseWaiter { - return &CloseWaiter{ - load: load, - closeMap: make(map[string]chan struct{}), - } -} - -func (l *CloseWaiter) Load(ctx context.Context, id string) (value Object, err error) { - // this uses assumption of ocache, that for each id load function cannot be called simultaneously - var ch chan struct{} - l.mx.Lock() - if c, exists := l.closeMap[id]; exists { - ch = c - } - l.mx.Unlock() - if ch != nil { - <-ch - } - - value, err = l.load(ctx, id) - if err != nil { - return - } - - ch = make(chan struct{}) - l.mx.Lock() - l.closeMap[id] = ch - l.mx.Unlock() - - value = &CloseWrapper{ - Value: value, - ch: ch, - } - return -} From 3facea9a06500f856fdefa939b7508a651fd5475 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 15 Oct 2022 16:26:03 +0200 Subject: [PATCH 143/219] Change pogreb implementation --- .../storage/mock_storage/mock_storage.go | 14 ++ node/storage/keys.go | 44 ++++-- node/storage/liststorage.go | 135 ++++++++++++++++++ node/storage/spacestorage.go | 89 ++++++------ node/storage/treestorage.go | 76 +++++----- pkg/acl/list/list.go | 8 +- pkg/acl/storage/inmemory.go | 4 +- pkg/acl/storage/liststorage.go | 7 +- pkg/acl/storage/mock_storage/mock_storage.go | 4 +- pkg/acl/storage/provider.go | 2 + .../acllistbuilder/liststoragebuilder.go | 6 +- 11 files changed, 289 insertions(+), 100 deletions(-) create mode 100644 node/storage/liststorage.go diff --git a/common/commonspace/storage/mock_storage/mock_storage.go b/common/commonspace/storage/mock_storage/mock_storage.go index 197e13bd..4cca0580 100644 --- a/common/commonspace/storage/mock_storage/mock_storage.go +++ b/common/commonspace/storage/mock_storage/mock_storage.go @@ -133,6 +133,20 @@ func (mr *MockSpaceStorageMockRecorder) ACLStorage() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ACLStorage", reflect.TypeOf((*MockSpaceStorage)(nil).ACLStorage)) } +// Close mocks base method. +func (m *MockSpaceStorage) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close. +func (mr *MockSpaceStorageMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSpaceStorage)(nil).Close)) +} + // CreateTreeStorage mocks base method. func (m *MockSpaceStorage) CreateTreeStorage(arg0 storage0.TreeStorageCreatePayload) (storage0.TreeStorage, error) { m.ctrl.T.Helper() diff --git a/node/storage/keys.go b/node/storage/keys.go index 0d4b8de5..9f5597ab 100644 --- a/node/storage/keys.go +++ b/node/storage/keys.go @@ -5,6 +5,24 @@ import ( "strings" ) +type aclKeys struct { +} + +var aclHeadIdKey = []byte("a/headId") +var aclRootIdKey = []byte("a/rootId") + +func (a aclKeys) HeadIdKey() []byte { + return aclHeadIdKey +} + +func (a aclKeys) RootIdKey() []byte { + return aclRootIdKey +} + +func (a aclKeys) RawRecordKey(id string) []byte { + return joinStringsToBytes("a", id) +} + type treeKeys struct { id string } @@ -13,8 +31,8 @@ func (t treeKeys) HeadsKey() []byte { return joinStringsToBytes("t", t.id, "heads") } -func (t treeKeys) RootKey() []byte { - return joinStringsToBytes("t", t.id) +func (t treeKeys) RootIdKey() []byte { + return joinStringsToBytes("t", t.id, "rootId") } func (t treeKeys) RawChangeKey(id string) []byte { @@ -22,21 +40,25 @@ func (t treeKeys) RawChangeKey(id string) []byte { } type spaceKeys struct { + headerKey []byte } -var headerKey = []byte("header") -var aclKey = []byte("acl") +func newSpaceKeys(spaceId string) spaceKeys { + return spaceKeys{headerKey: joinStringsToBytes("s", spaceId)} +} + +var spaceIdKey = []byte("spaceId") + +func (s spaceKeys) SpaceIdKey() []byte { + return spaceIdKey +} func (s spaceKeys) HeaderKey() []byte { - return headerKey + return s.headerKey } -func (s spaceKeys) ACLKey() []byte { - return aclKey -} - -func isRootKey(key string) bool { - return strings.HasPrefix(key, "t/") && strings.Count(key, "/") == 2 +func isRootIdKey(key string) bool { + return strings.HasPrefix(key, "t/") && strings.HasSuffix(key, "rootId") } func joinStringsToBytes(strs ...string) []byte { diff --git a/node/storage/liststorage.go b/node/storage/liststorage.go new file mode 100644 index 00000000..989791b6 --- /dev/null +++ b/node/storage/liststorage.go @@ -0,0 +1,135 @@ +package storage + +import ( + "context" + "github.com/akrylysov/pogreb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" +) + +type listStorage struct { + db *pogreb.DB + keys aclKeys + id string + root *aclrecordproto.RawACLRecordWithId +} + +func newListStorage(db *pogreb.DB) (ls storage.ListStorage, err error) { + keys := aclKeys{} + head, err := db.Get(keys.HeadIdKey()) + if err != nil { + return + } + if head == nil { + err = storage.ErrUnknownACLId + return + } + + rootId, err := db.Get(keys.RootIdKey()) + if err != nil { + return + } + if rootId == nil { + err = storage.ErrUnknownACLId + return + } + + root, err := db.Get(keys.RawRecordKey(string(rootId))) + if err != nil { + return + } + if root == nil { + err = storage.ErrUnknownACLId + return + } + + rootWithId := &aclrecordproto.RawACLRecordWithId{ + Payload: root, + Id: string(rootId), + } + + ls = &listStorage{ + db: db, + keys: aclKeys{}, + id: string(rootId), + root: rootWithId, + } + return +} + +func createListStorage(db *pogreb.DB, root *aclrecordproto.RawACLRecordWithId) (ls storage.ListStorage, err error) { + keys := aclKeys{} + has, err := db.Has(keys.RootIdKey()) + if err != nil { + return + } + if has { + err = storage.ErrACLExists + return + } + + err = db.Put(keys.HeadIdKey(), []byte(root.Id)) + if err != nil { + return + } + + err = db.Put(keys.RawRecordKey(root.Id), root.Payload) + if err != nil { + return + } + + err = db.Put(keys.RootIdKey(), []byte(root.Id)) + if err != nil { + return + } + + ls = &listStorage{ + db: db, + keys: aclKeys{}, + id: root.Id, + root: root, + } + return +} + +func (l *listStorage) ID() (string, error) { + return l.id, nil +} + +func (l *listStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { + return l.root, nil +} + +func (l *listStorage) Head() (head string, err error) { + bytes, err := l.db.Get(l.keys.HeadIdKey()) + if err != nil { + return + } + if bytes == nil { + err = storage.ErrUnknownACLId + return + } + head = string(bytes) + return +} + +func (l *listStorage) GetRawRecord(ctx context.Context, id string) (raw *aclrecordproto.RawACLRecordWithId, err error) { + res, err := l.db.Get(l.keys.RawRecordKey(id)) + if err != nil { + return + } + if res == nil { + err = storage.ErrUnknownRecord + return + } + + raw = &aclrecordproto.RawACLRecordWithId{ + Payload: res, + Id: id, + } + return +} + +func (l *listStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { + return l.db.Put([]byte(rec.Id), rec.Payload) +} diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index c2faab6c..12b15534 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -5,7 +5,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/gogo/protobuf/proto" "path" "sync" "time" @@ -16,9 +15,11 @@ var defPogrebOptions = &pogreb.Options{ } type spaceStorage struct { - objDb *pogreb.DB - keys spaceKeys - mx sync.Mutex + objDb *pogreb.DB + keys spaceKeys + aclStorage storage.ListStorage + header *spacesyncproto.RawSpaceHeaderWithId + mx sync.Mutex } func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceStorage, err error) { @@ -27,8 +28,15 @@ func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceS if err != nil { return } - keys := spaceKeys{} - has, err := objDb.Has(keys.HeaderKey()) + + defer func() { + if err != nil { + objDb.Close() + } + }() + + keys := newSpaceKeys(spaceId) + has, err := objDb.Has(keys.SpaceIdKey()) if err != nil { return } @@ -37,18 +45,28 @@ func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceS return } - has, err = objDb.Has(keys.ACLKey()) + header, err := objDb.Get(keys.HeaderKey()) if err != nil { return } - if !has { + if header == nil { err = spacestorage.ErrSpaceStorageMissing return } + aclStorage, err := newListStorage(objDb) + if err != nil { + return + } + store = &spaceStorage{ objDb: objDb, keys: keys, + header: &spacesyncproto.RawSpaceHeaderWithId{ + RawHeader: header, + Id: spaceId, + }, + aclStorage: aclStorage, } return } @@ -66,37 +84,36 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate } }() - keys := spaceKeys{} - has, err := db.Has(keys.HeaderKey()) + keys := newSpaceKeys(payload.SpaceHeaderWithId.Id) + has, err := db.Has(keys.SpaceIdKey()) if err != nil { return } if has { - err = spacestorage.ErrSpaceStorageExists + err = spacesyncproto.ErrSpaceExists return } - marshalledRec, err := payload.RecWithId.Marshal() - if err != nil { - return - } - err = db.Put(keys.ACLKey(), marshalledRec) + aclStorage, err := createListStorage(db, payload.RecWithId) if err != nil { return } - marshalledHeader, err := payload.SpaceHeaderWithId.Marshal() + err = db.Put(keys.HeaderKey(), payload.SpaceHeaderWithId.RawHeader) if err != nil { return } - err = db.Put(keys.HeaderKey(), marshalledHeader) + + err = db.Put(keys.SpaceIdKey(), []byte(payload.SpaceHeaderWithId.Id)) if err != nil { return } store = &spaceStorage{ - objDb: db, - keys: keys, + objDb: db, + keys: keys, + aclStorage: aclStorage, + header: payload.SpaceHeaderWithId, } return } @@ -106,47 +123,31 @@ func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) { } func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { + // we have mutex here, so we prevent overwriting the heads of a tree on concurrent creation s.mx.Lock() defer s.mx.Unlock() - treeKeys := treeKeys{payload.TreeId} - has, err := s.objDb.Has(treeKeys.RootKey()) - if err != nil { - return - } - if has { - err = spacestorage.ErrSpaceStorageExists - return - } - return createTreeStorage(s.objDb, payload) } func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) { - return nil, nil + return s.aclStorage, nil } func (s *spaceStorage) SpaceHeader() (header *spacesyncproto.RawSpaceHeaderWithId, err error) { - res, err := s.objDb.Get(s.keys.HeaderKey()) - if err != nil { - return - } - - header = &spacesyncproto.RawSpaceHeaderWithId{} - err = proto.Unmarshal(res, header) - return + return s.header, nil } func (s *spaceStorage) StoredIds() (ids []string, err error) { index := s.objDb.Items() - _, value, err := index.Next() + key, val, err := index.Next() for err == nil { - strVal := string(value) - if isRootKey(strVal) { - ids = append(ids, string(value)) + strKey := string(key) + if isRootIdKey(strKey) { + ids = append(ids, string(val)) } - _, value, err = index.Next() + key, val, err = index.Next() } if err != pogreb.ErrIterationDone { diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index 224cf292..4bc24c62 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -6,24 +6,28 @@ import ( "github.com/akrylysov/pogreb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" - "github.com/gogo/protobuf/proto" "strings" - "sync" ) type treeStorage struct { db *pogreb.DB keys treeKeys id string - rootKey []byte headsKey []byte - heads []string root *treechangeproto.RawTreeChangeWithId - headsMx sync.Mutex } func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) { keys := treeKeys{treeId} + has, err := db.Has(keys.RootIdKey()) + if err != nil { + return + } + if !has { + err = storage.ErrUnknownTreeId + return + } + heads, err := db.Get(keys.HeadsKey()) if err != nil { return @@ -33,17 +37,19 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err e return } - res, err := db.Get(keys.RootKey()) + root, err := db.Get(keys.RawChangeKey(treeId)) if err != nil { return } - if res == nil { + if root == nil { err = storage.ErrUnknownTreeId return } - root := &treechangeproto.RawTreeChangeWithId{} - err = proto.Unmarshal(res, root) + rootWithId := &treechangeproto.RawTreeChangeWithId{ + RawChange: root, + Id: treeId, + } if err != nil { return } @@ -51,23 +57,21 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err e ts = &treeStorage{ db: db, keys: keys, - rootKey: keys.RootKey(), headsKey: keys.HeadsKey(), id: treeId, - heads: parseHeads(heads), - root: root, + root: rootWithId, } return } func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { keys := treeKeys{id: payload.TreeId} - has, err := db.Has(keys.RootKey()) + has, err := db.Has(keys.RootIdKey()) if err != nil { return } - if !has { - err = storage.ErrUnknownTreeId + if has { + err = storage.ErrTreeExists return } @@ -80,18 +84,17 @@ func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) } } + err = db.Put(keys.RawChangeKey(payload.RootRawChange.Id), payload.RootRawChange.GetRawChange()) + if err != nil { + return + } + err = db.Put(keys.HeadsKey(), heads) if err != nil { return } - // duplicating same change in raw changes - err = db.Put(keys.RawChangeKey(payload.TreeId), payload.RootRawChange.GetRawChange()) - if err != nil { - return - } - - err = db.Put(keys.RootKey(), payload.RootRawChange.GetRawChange()) + err = db.Put(keys.RootIdKey(), []byte(payload.RootRawChange.Id)) if err != nil { return } @@ -99,10 +102,8 @@ func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) ts = &treeStorage{ db: db, keys: keys, - rootKey: keys.RootKey(), headsKey: keys.HeadsKey(), - id: payload.TreeId, - heads: payload.Heads, + id: payload.RootRawChange.Id, root: payload.RootRawChange, } return @@ -116,20 +117,20 @@ func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err erro return t.root, nil } -func (t *treeStorage) Heads() ([]string, error) { - t.headsMx.Lock() - defer t.headsMx.Unlock() - return t.heads, nil +func (t *treeStorage) Heads() (heads []string, err error) { + headsBytes, err := t.db.Get(t.keys.HeadsKey()) + if err != nil { + return + } + if heads == nil { + err = storage.ErrUnknownTreeId + return + } + heads = parseHeads(headsBytes) + return } func (t *treeStorage) SetHeads(heads []string) (err error) { - t.headsMx.Lock() - defer t.headsMx.Unlock() - defer func() { - if err == nil { - t.heads = heads - } - }() payload := createHeadsPayload(heads) return t.db.Put(t.headsKey, payload) } @@ -143,6 +144,9 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha if err != nil { return } + if res == nil { + err = storage.ErrUnkownChange + } raw = &treechangeproto.RawTreeChangeWithId{ RawChange: res, diff --git a/pkg/acl/list/list.go b/pkg/acl/list/list.go index dae887e6..382ecf4e 100644 --- a/pkg/acl/list/list.go +++ b/pkg/acl/list/list.go @@ -67,6 +67,7 @@ func BuildACLList(storage storage.ListStorage) (ACLList, error) { } func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage storage.ListStorage) (list ACLList, err error) { + // TODO: need to add context here rootWithId, err := storage.Root() if err != nil { return @@ -76,7 +77,12 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder return } - rawRecordWithId, err := storage.Head() + head, err := storage.Head() + if err != nil { + return + } + + rawRecordWithId, err := storage.GetRawRecord(context.Background(), head) if err != nil { return } diff --git a/pkg/acl/storage/inmemory.go b/pkg/acl/storage/inmemory.go index 487caa04..b9948c3e 100644 --- a/pkg/acl/storage/inmemory.go +++ b/pkg/acl/storage/inmemory.go @@ -31,10 +31,10 @@ func (i *inMemoryACLListStorage) Root() (*aclrecordproto.RawACLRecordWithId, err return i.records[0], nil } -func (i *inMemoryACLListStorage) Head() (*aclrecordproto.RawACLRecordWithId, error) { +func (i *inMemoryACLListStorage) Head() (string, error) { i.RLock() defer i.RUnlock() - return i.records[len(i.records)-1], nil + return i.records[len(i.records)-1].Id, nil } func (i *inMemoryACLListStorage) GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error) { diff --git a/pkg/acl/storage/liststorage.go b/pkg/acl/storage/liststorage.go index 222fd8d8..ad61a7fa 100644 --- a/pkg/acl/storage/liststorage.go +++ b/pkg/acl/storage/liststorage.go @@ -3,13 +3,18 @@ package storage import ( "context" + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" ) +var ErrUnknownACLId = errors.New("acl does not exist") +var ErrACLExists = errors.New("acl already exists") +var ErrUnknownRecord = errors.New("record doesn't exist") + type ListStorage interface { Storage Root() (*aclrecordproto.RawACLRecordWithId, error) - Head() (*aclrecordproto.RawACLRecordWithId, error) + Head() (string, error) GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error diff --git a/pkg/acl/storage/mock_storage/mock_storage.go b/pkg/acl/storage/mock_storage/mock_storage.go index f20bf468..c4cf8800 100644 --- a/pkg/acl/storage/mock_storage/mock_storage.go +++ b/pkg/acl/storage/mock_storage/mock_storage.go @@ -66,10 +66,10 @@ func (mr *MockListStorageMockRecorder) GetRawRecord(arg0, arg1 interface{}) *gom } // Head mocks base method. -func (m *MockListStorage) Head() (*aclrecordproto.RawACLRecordWithId, error) { +func (m *MockListStorage) Head() (string, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Head") - ret0, _ := ret[0].(*aclrecordproto.RawACLRecordWithId) + ret0, _ := ret[0].(string) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/pkg/acl/storage/provider.go b/pkg/acl/storage/provider.go index 4e738b28..1d40cb30 100644 --- a/pkg/acl/storage/provider.go +++ b/pkg/acl/storage/provider.go @@ -6,6 +6,8 @@ import ( ) var ErrUnknownTreeId = errors.New("tree does not exist") +var ErrTreeExists = errors.New("tree already exists") +var ErrUnkownChange = errors.New("change doesn't exist") type TreeStorageCreatePayload struct { TreeId string diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index d855ac99..206550a5 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -89,12 +89,12 @@ func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) } } -func (t *ACLListStorageBuilder) Head() (*aclrecordproto.RawACLRecordWithId, error) { +func (t *ACLListStorageBuilder) Head() (string, error) { l := len(t.records) if l > 0 { - return t.rawRecords[l-1], nil + return t.rawRecords[l-1].Id, nil } - return t.rawRoot, nil + return t.rawRoot.Id, nil } func (t *ACLListStorageBuilder) Root() (*aclrecordproto.RawACLRecordWithId, error) { From e6d6cae35c308da37f1b060d1ce46ad0703888fa Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 15 Oct 2022 17:09:25 +0200 Subject: [PATCH 144/219] Change tree keys logic --- node/storage/keys.go | 16 +++++++++++++--- node/storage/treestorage.go | 33 +++++++++++++++------------------ 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/node/storage/keys.go b/node/storage/keys.go index 9f5597ab..853cfdd8 100644 --- a/node/storage/keys.go +++ b/node/storage/keys.go @@ -24,15 +24,25 @@ func (a aclKeys) RawRecordKey(id string) []byte { } type treeKeys struct { - id string + id string + headsKey []byte + rootKey []byte +} + +func newTreeKeys(id string) treeKeys { + return treeKeys{ + id: id, + headsKey: joinStringsToBytes("t", id, "heads"), + rootKey: joinStringsToBytes("t", id, "rootId"), + } } func (t treeKeys) HeadsKey() []byte { - return joinStringsToBytes("t", t.id, "heads") + return t.headsKey } func (t treeKeys) RootIdKey() []byte { - return joinStringsToBytes("t", t.id, "rootId") + return t.rootKey } func (t treeKeys) RawChangeKey(id string) []byte { diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index 4bc24c62..6c6c0d57 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -10,15 +10,14 @@ import ( ) type treeStorage struct { - db *pogreb.DB - keys treeKeys - id string - headsKey []byte - root *treechangeproto.RawTreeChangeWithId + db *pogreb.DB + keys treeKeys + id string + root *treechangeproto.RawTreeChangeWithId } func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) { - keys := treeKeys{treeId} + keys := newTreeKeys(treeId) has, err := db.Has(keys.RootIdKey()) if err != nil { return @@ -55,17 +54,16 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err e } ts = &treeStorage{ - db: db, - keys: keys, - headsKey: keys.HeadsKey(), - id: treeId, - root: rootWithId, + db: db, + keys: keys, + id: treeId, + root: rootWithId, } return } func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { - keys := treeKeys{id: payload.TreeId} + keys := newTreeKeys(payload.TreeId) has, err := db.Has(keys.RootIdKey()) if err != nil { return @@ -100,11 +98,10 @@ func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) } ts = &treeStorage{ - db: db, - keys: keys, - headsKey: keys.HeadsKey(), - id: payload.RootRawChange.Id, - root: payload.RootRawChange, + db: db, + keys: keys, + id: payload.RootRawChange.Id, + root: payload.RootRawChange, } return } @@ -132,7 +129,7 @@ func (t *treeStorage) Heads() (heads []string, err error) { func (t *treeStorage) SetHeads(heads []string) (err error) { payload := createHeadsPayload(heads) - return t.db.Put(t.headsKey, payload) + return t.db.Put(t.keys.HeadsKey(), payload) } func (t *treeStorage) AddRawChange(change *treechangeproto.RawTreeChangeWithId) (err error) { From baa275b05bcf39c46a16fe43bbf77930f8abec31 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 15 Oct 2022 21:43:01 +0200 Subject: [PATCH 145/219] Client badger WIP --- client/account/service.go | 62 ++++++ client/badgerprovider/helpers.go | 76 ++++++++ client/badgerprovider/service.go | 41 ++++ client/clientspace/clientcache/treecache.go | 86 +++++++++ client/clientspace/rpchandler.go | 58 ++++++ client/clientspace/service.go | 74 +++++++ client/storage/keys.go | 91 +++++++++ client/storage/liststorage.go | 131 +++++++++++++ client/storage/spacestorage.go | 159 +++++++++++++++ client/storage/storageservice.go | 34 ++++ client/storage/treestorage.go | 181 ++++++++++++++++++ go.mod | 3 + go.sum | 2 + node/storage/keys.go | 6 - node/storage/liststorage.go | 9 - node/storage/treestorage.go | 16 +- pkg/acl/aclrecordproto/protos/aclrecord.proto | 9 + 17 files changed, 1008 insertions(+), 30 deletions(-) create mode 100644 client/account/service.go create mode 100644 client/badgerprovider/helpers.go create mode 100644 client/badgerprovider/service.go create mode 100644 client/clientspace/clientcache/treecache.go create mode 100644 client/clientspace/rpchandler.go create mode 100644 client/clientspace/service.go create mode 100644 client/storage/keys.go create mode 100644 client/storage/liststorage.go create mode 100644 client/storage/spacestorage.go create mode 100644 client/storage/storageservice.go create mode 100644 client/storage/treestorage.go diff --git a/client/account/service.go b/client/account/service.go new file mode 100644 index 00000000..3181f9bd --- /dev/null +++ b/client/account/service.go @@ -0,0 +1,62 @@ +package account + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" +) + +type service struct { + accountData *account.AccountData + peerId string +} + +func (s *service) Account() *account.AccountData { + return s.accountData +} + +func New() app.Component { + return &service{} +} + +func (s *service) Init(a *app.App) (err error) { + acc := a.MustComponent(config.CName).(commonaccount.ConfigGetter).GetAccount() + + decodedEncryptionKey, err := keys.DecodeKeyFromString( + acc.EncryptionKey, + encryptionkey.NewEncryptionRsaPrivKeyFromBytes, + nil) + if err != nil { + return err + } + + decodedSigningKey, err := keys.DecodeKeyFromString( + acc.SigningKey, + signingkey.NewSigningEd25519PrivKeyFromBytes, + nil) + if err != nil { + return err + } + + identity, err := decodedSigningKey.GetPublic().Raw() + if err != nil { + return err + } + + s.accountData = &account.AccountData{ + Identity: identity, + SignKey: decodedSigningKey, + EncKey: decodedEncryptionKey, + } + s.peerId = acc.PeerId + + return nil +} + +func (s *service) Name() (name string) { + return commonaccount.CName +} diff --git a/client/badgerprovider/helpers.go b/client/badgerprovider/helpers.go new file mode 100644 index 00000000..96ed8acf --- /dev/null +++ b/client/badgerprovider/helpers.go @@ -0,0 +1,76 @@ +package badgerprovider + +import ( + "errors" + "github.com/dgraph-io/badger/v3" +) + +var ErrIncorrectKey = errors.New("the key is incorrect") + +func Has(db *badger.DB, key []byte) (has bool, err error) { + err = db.View(func(txn *badger.Txn) error { + _, err := txn.Get(key) + return err + }) + if err != nil { + return + } + has = true + return +} + +func Put(db *badger.DB, key, value []byte) (err error) { + return db.Update(func(txn *badger.Txn) error { + return txn.Set(key, value) + }) +} + +func Get(db *badger.DB, key []byte) (value []byte, err error) { + err = db.View(func(txn *badger.Txn) error { + item, err := txn.Get(key) + if err != nil { + return err + } + value, err = item.ValueCopy(value) + if err != nil { + return err + } + return err + }) + return +} + +func GetKeySuffix(txn *badger.Txn, keyPrefix []byte) (suffix []byte, err error) { + iter := txn.NewIterator(badger.IteratorOptions{Prefix: keyPrefix}) + iter.Next() + if !iter.Valid() { + err = badger.ErrKeyNotFound + return + } + + suffix = iter.Item().Key() + if len(suffix) <= len(keyPrefix)+1 { + err = ErrIncorrectKey + return + } + suffix = suffix[len(keyPrefix)+1:] + return +} + +func GetKeySuffixAndValue(txn *badger.Txn, keyPrefix []byte) (suffix []byte, value []byte, err error) { + iter := txn.NewIterator(badger.IteratorOptions{Prefix: keyPrefix}) + iter.Next() + if !iter.Valid() { + err = badger.ErrKeyNotFound + return + } + + suffix = iter.Item().Key() + if len(suffix) <= len(keyPrefix)+1 { + err = ErrIncorrectKey + return + } + suffix = suffix[len(keyPrefix)+1:] + value, err = iter.Item().ValueCopy(value) + return +} diff --git a/client/badgerprovider/service.go b/client/badgerprovider/service.go new file mode 100644 index 00000000..2fb8a9c0 --- /dev/null +++ b/client/badgerprovider/service.go @@ -0,0 +1,41 @@ +package badgerprovider + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/dgraph-io/badger/v3" +) + +type BadgerProvider interface { + app.ComponentRunnable + Badger() *badger.DB +} + +var CName = "client.badgerprovider" + +type service struct { + db *badger.DB +} + +func (s *service) Init(a *app.App) (err error) { + cfg := a.MustComponent(config.CName).(*config.Config) + s.db, err = badger.Open(badger.DefaultOptions(cfg.Storage.Path)) + return +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Badger() *badger.DB { + return s.db +} + +func (s *service) Run(ctx context.Context) (err error) { + return +} + +func (s *service) Close(ctx context.Context) (err error) { + return s.db.Close() +} diff --git a/client/clientspace/clientcache/treecache.go b/client/clientspace/clientcache/treecache.go new file mode 100644 index 00000000..eee57452 --- /dev/null +++ b/client/clientspace/clientcache/treecache.go @@ -0,0 +1,86 @@ +package clientcache + +import ( + "context" + "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "time" +) + +var log = logger.NewNamed("treecache") +var ErrCacheObjectWithoutTree = errors.New("cache object contains no tree") + +type ctxKey int + +const spaceKey ctxKey = 0 + +type treeCache struct { + gcttl int + cache ocache.OCache + clientService clientspace.Service +} + +func New(ttl int) cache.TreeCache { + return &treeCache{ + gcttl: ttl, + } +} + +func (c *treeCache) Run(ctx context.Context) (err error) { + return nil +} + +func (c *treeCache) Close(ctx context.Context) (err error) { + return c.cache.Close() +} + +func (c *treeCache) Init(a *app.App) (err error) { + c.clientService = a.MustComponent(nodespace.CName).(nodespace.Service) + c.cache = ocache.New( + func(ctx context.Context, id string) (value ocache.Object, err error) { + spaceId := ctx.Value(spaceKey).(string) + space, err := c.clientService.GetSpace(ctx, spaceId) + if err != nil { + return + } + return space.BuildTree(ctx, id, nil) + }, + ocache.WithLogger(log.Sugar()), + ocache.WithGCPeriod(time.Minute), + ocache.WithTTL(time.Duration(c.gcttl)*time.Second), + ocache.WithRefCounter(false), + ) + return nil +} + +func (c *treeCache) Name() (name string) { + return cache.CName +} + +func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (res cache.TreeResult, err error) { + var cacheRes ocache.Object + ctx = context.WithValue(ctx, spaceKey, spaceId) + cacheRes, err = c.cache.Get(ctx, id) + if err != nil { + return cache.TreeResult{}, err + } + + treeContainer, ok := cacheRes.(cache.TreeContainer) + if !ok { + err = ErrCacheObjectWithoutTree + return + } + + res = cache.TreeResult{ + Release: func() { + c.cache.Release(id) + }, + TreeContainer: treeContainer, + } + return +} diff --git a/client/clientspace/rpchandler.go b/client/clientspace/rpchandler.go new file mode 100644 index 00000000..3a76454c --- /dev/null +++ b/client/clientspace/rpchandler.go @@ -0,0 +1,58 @@ +package clientspace + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" +) + +type rpcHandler struct { + s *service +} + +func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) { + _, err = r.s.GetSpace(ctx, req.SpaceHeader.Id) + if err == nil { + err = spacesyncproto.ErrSpaceExists + return + } + if err != cache.ErrSpaceNotFound { + err = spacesyncproto.ErrUnexpected + return + } + + payload := storage.SpaceStorageCreatePayload{ + RecWithId: req.AclRoot, + SpaceHeaderWithId: req.SpaceHeader, + } + _, err = r.s.spaceStorageProvider.CreateSpaceStorage(payload) + if err != nil { + err = spacesyncproto.ErrUnexpected + if err == storage.ErrSpaceStorageExists { + err = spacesyncproto.ErrSpaceExists + } + return + } + return +} + +func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) { + sp, err := r.s.GetSpace(ctx, req.SpaceId) + if err != nil { + return nil, spacesyncproto.ErrSpaceMissing + } + return sp.SpaceSyncRpc().HeadSync(ctx, req) +} + +func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) error { + msg, err := stream.Recv() + if err != nil { + return err + } + sp, err := r.s.GetSpace(stream.Context(), msg.SpaceId) + if err != nil { + return spacesyncproto.ErrSpaceMissing + } + return sp.SpaceSyncRpc().Stream(stream) +} diff --git a/client/clientspace/service.go b/client/clientspace/service.go new file mode 100644 index 00000000..3fcebc1b --- /dev/null +++ b/client/clientspace/service.go @@ -0,0 +1,74 @@ +package clientspace + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" + "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "time" +) + +const CName = "client.clientspace" + +var log = logger.NewNamed(CName) + +func New() Service { + return &service{} +} + +type Service interface { + GetSpace(ctx context.Context, id string) (commonspace.Space, error) + app.ComponentRunnable +} + +type service struct { + conf config.Space + spaceCache ocache.OCache + commonSpace commonspace.Service + spaceStorageProvider storage.SpaceStorageProvider +} + +func (s *service) Init(a *app.App) (err error) { + s.conf = a.MustComponent(config.CName).(*config.Config).Space + s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service) + s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) + s.spaceCache = ocache.New( + func(ctx context.Context, id string) (value ocache.Object, err error) { + return s.commonSpace.GetSpace(ctx, id) + }, + ocache.WithLogger(log.Sugar()), + ocache.WithGCPeriod(time.Minute), + ocache.WithTTL(time.Duration(s.conf.GCTTL)*time.Second), + ocache.WithRefCounter(false), + ) + return spacesyncproto.DRPCRegisterSpace(a.MustComponent(server.CName).(server.DRPCServer), &rpcHandler{s}) +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + go func() { + time.Sleep(time.Second * 5) + _, _ = s.GetSpace(ctx, "testDSpace") + }() + return +} + +func (s *service) GetSpace(ctx context.Context, id string) (commonspace.Space, error) { + v, err := s.spaceCache.Get(ctx, id) + if err != nil { + return nil, err + } + return v.(commonspace.Space), nil +} + +func (s *service) Close(ctx context.Context) (err error) { + return s.spaceCache.Close() +} diff --git a/client/storage/keys.go b/client/storage/keys.go new file mode 100644 index 00000000..5ee5958f --- /dev/null +++ b/client/storage/keys.go @@ -0,0 +1,91 @@ +package storage + +import ( + "bytes" +) + +type aclKeys struct { + spaceId string + rootKey []byte + headKey []byte +} + +func newACLKeys(spaceId string) aclKeys { + return aclKeys{ + spaceId: spaceId, + rootKey: joinStringsToBytes("space", spaceId, "a", "rootId"), + headKey: joinStringsToBytes("space", spaceId, "a", "headId"), + } +} + +func (a aclKeys) HeadIdKey() []byte { + return a.headKey +} + +func (a aclKeys) RootIdKey() []byte { + return a.rootKey +} + +func (a aclKeys) RawRecordKey(id string) []byte { + return joinStringsToBytes("space", a.spaceId, "a", id) +} + +type treeKeys struct { + id string + spaceId string + headsKey []byte + rootKey []byte +} + +func newTreeKeys(spaceId, id string) treeKeys { + return treeKeys{ + id: id, + spaceId: spaceId, + headsKey: joinStringsToBytes("space", spaceId, "t", id, "heads"), + rootKey: joinStringsToBytes("space", spaceId, "t", id), + } +} + +func (t treeKeys) HeadsKey() []byte { + return t.headsKey +} + +func (t treeKeys) RootIdKey() []byte { + return t.rootKey +} + +func (t treeKeys) RawChangeKey(id string) []byte { + return joinStringsToBytes("space", t.spaceId, "t", t.id, id) +} + +type spaceKeys struct { + headerKey []byte +} + +func newSpaceKeys(spaceId string) spaceKeys { + return spaceKeys{headerKey: joinStringsToBytes("space", spaceId)} +} + +func (s spaceKeys) HeaderKey() []byte { + return s.headerKey +} + +func joinStringsToBytes(strs ...string) []byte { + var ( + b bytes.Buffer + totalLen int + ) + for _, s := range strs { + totalLen += len(s) + } + // adding separators + totalLen += len(strs) - 1 + b.Grow(totalLen) + for idx, s := range strs { + if idx > 0 { + b.WriteString("/") + } + b.WriteString(s) + } + return b.Bytes() +} diff --git a/client/storage/liststorage.go b/client/storage/liststorage.go new file mode 100644 index 00000000..30910d65 --- /dev/null +++ b/client/storage/liststorage.go @@ -0,0 +1,131 @@ +package storage + +import ( + "context" + "errors" + provider "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/dgraph-io/badger/v3" +) + +var ErrIncorrectKey = errors.New("key format is incorrect") + +type listStorage struct { + db *badger.DB + keys aclKeys + id string + root *aclrecordproto.RawACLRecordWithId +} + +func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls storage.ListStorage, err error) { + keys := newACLKeys(spaceId) + rootId, err := provider.GetKeySuffix(txn, keys.RootIdKey()) + if err != nil { + if err == badger.ErrKeyNotFound { + err = storage.ErrUnknownACLId + } + return + } + stringId := string(rootId) + rootItem, err := txn.Get(keys.RawRecordKey(stringId)) + if err != nil { + if err == badger.ErrKeyNotFound { + err = storage.ErrUnknownACLId + } + return + } + var value []byte + value, err = rootItem.ValueCopy(value) + if err != nil { + return + } + + rootWithId := &aclrecordproto.RawACLRecordWithId{ + Payload: value, + Id: stringId, + } + + ls = &listStorage{ + db: db, + keys: aclKeys{}, + id: stringId, + root: rootWithId, + } + return +} + +func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *aclrecordproto.RawACLRecordWithId) (ls storage.ListStorage, err error) { + keys := newACLKeys(spaceId) + _, err = provider.GetKeySuffix(txn, keys.RootIdKey()) + if err != nil && err != badger.ErrKeyNotFound { + return + } + if err == nil { + err = storage.ErrACLExists + return + } + aclRootKey := append(keys.RootIdKey(), '/') + aclRootKey = append(aclRootKey, []byte(root.Id)...) + + err = txn.Set(aclRootKey, nil) + if err != nil { + return + } + + err = txn.Set(keys.HeadIdKey(), []byte(root.Id)) + if err != nil { + return + } + + err = txn.Set(keys.RawRecordKey(root.Id), root.Payload) + if err != nil { + return + } + + ls = &listStorage{ + db: db, + keys: aclKeys{}, + id: root.Id, + root: root, + } + return +} + +func (l *listStorage) ID() (string, error) { + return l.id, nil +} + +func (l *listStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { + return l.root, nil +} + +func (l *listStorage) Head() (head string, err error) { + bytes, err := provider.Get(l.db, l.keys.HeadIdKey()) + if err != nil { + return + } + head = string(bytes) + return +} + +func (l *listStorage) GetRawRecord(ctx context.Context, id string) (raw *aclrecordproto.RawACLRecordWithId, err error) { + res, err := l.db.Get(l.keys.RawRecordKey(id)) + if err != nil { + return + } + if res == nil { + err = storage.ErrUnknownRecord + return + } + + raw = &aclrecordproto.RawACLRecordWithId{ + Payload: res, + Id: id, + } + return +} + +func (l *listStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { + return l.db.Put([]byte(rec.Id), rec.Payload) +} diff --git a/client/storage/spacestorage.go b/client/storage/spacestorage.go new file mode 100644 index 00000000..1affdc14 --- /dev/null +++ b/client/storage/spacestorage.go @@ -0,0 +1,159 @@ +package storage + +import ( + "github.com/akrylysov/pogreb" + provider "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/dgraph-io/badger/v3" + "path" + "sync" + "time" +) + +var defPogrebOptions = &pogreb.Options{ + BackgroundCompactionInterval: time.Minute * 5, +} + +type spaceStorage struct { + objDb *pogreb.DB + keys spaceKeys + aclStorage storage.ListStorage + header *spacesyncproto.RawSpaceHeaderWithId + mx sync.Mutex +} + +func newSpaceStorage(objDb *badger.DB, spaceId string) (store spacestorage.SpaceStorage, err error) { + keys := newSpaceKeys(spaceId) + err = objDb.Update(func(txn *badger.Txn) error { + header, err := txn.Get(keys.HeaderKey()) + if err != nil { + return err + } + + }) + has, err := provider.Has(obj) + if err != nil { + return + } + if !has { + err = spacestorage.ErrSpaceStorageMissing + return + } + + header, err := objDb.Get(keys.HeaderKey()) + if err != nil { + return + } + if header == nil { + err = spacestorage.ErrSpaceStorageMissing + return + } + + aclStorage, err := newListStorage(objDb) + if err != nil { + return + } + + store = &spaceStorage{ + objDb: objDb, + keys: keys, + header: &spacesyncproto.RawSpaceHeaderWithId{ + RawHeader: header, + Id: spaceId, + }, + aclStorage: aclStorage, + } + return +} + +func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) { + dbPath := path.Join(rootPath, payload.SpaceHeaderWithId.Id) + db, err := pogreb.Open(dbPath, defPogrebOptions) + if err != nil { + return + } + + defer func() { + if err != nil { + db.Close() + } + }() + + keys := newSpaceKeys(payload.SpaceHeaderWithId.Id) + has, err := db.Has(keys.SpaceIdKey()) + if err != nil { + return + } + if has { + err = spacesyncproto.ErrSpaceExists + return + } + + aclStorage, err := createListStorage(db, payload.RecWithId) + if err != nil { + return + } + + err = db.Put(keys.HeaderKey(), payload.SpaceHeaderWithId.RawHeader) + if err != nil { + return + } + + err = db.Put(keys.SpaceIdKey(), []byte(payload.SpaceHeaderWithId.Id)) + if err != nil { + return + } + + store = &spaceStorage{ + objDb: db, + keys: keys, + aclStorage: aclStorage, + header: payload.SpaceHeaderWithId, + } + return +} + +func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) { + return newTreeStorage(s.objDb, id) +} + +func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { + // we have mutex here, so we prevent overwriting the heads of a tree on concurrent creation + s.mx.Lock() + defer s.mx.Unlock() + + return createTreeStorage(s.objDb, payload) +} + +func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) { + return s.aclStorage, nil +} + +func (s *spaceStorage) SpaceHeader() (header *spacesyncproto.RawSpaceHeaderWithId, err error) { + return s.header, nil +} + +func (s *spaceStorage) StoredIds() (ids []string, err error) { + index := s.objDb.Items() + + key, val, err := index.Next() + for err == nil { + strKey := string(key) + if isRootIdKey(strKey) { + ids = append(ids, string(val)) + } + key, val, err = index.Next() + } + + if err != pogreb.ErrIterationDone { + return + } + err = nil + return +} + +func (s *spaceStorage) Close() (err error) { + return s.objDb.Close() +} diff --git a/client/storage/storageservice.go b/client/storage/storageservice.go new file mode 100644 index 00000000..ba9de309 --- /dev/null +++ b/client/storage/storageservice.go @@ -0,0 +1,34 @@ +package storage + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/dgraph-io/badger/v3" +) + +type storageService struct { + db *badger.DB +} + +func New() storage.SpaceStorageProvider { + return &storageService{} +} + +func (s *storageService) Init(a *app.App) (err error) { + provider := a.MustComponent(badgerprovider.CName).(badgerprovider.BadgerProvider) + s.db = provider.Badger() + return +} + +func (s *storageService) Name() (name string) { + return storage.CName +} + +func (s *storageService) SpaceStorage(id string) (storage.SpaceStorage, error) { + return newSpaceStorage(s.rootPath, id) +} + +func (s *storageService) CreateSpaceStorage(payload storage.SpaceStorageCreatePayload) (storage.SpaceStorage, error) { + return createSpaceStorage(s.rootPath, payload) +} diff --git a/client/storage/treestorage.go b/client/storage/treestorage.go new file mode 100644 index 00000000..6c6c0d57 --- /dev/null +++ b/client/storage/treestorage.go @@ -0,0 +1,181 @@ +package storage + +import ( + "bytes" + "context" + "github.com/akrylysov/pogreb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "strings" +) + +type treeStorage struct { + db *pogreb.DB + keys treeKeys + id string + root *treechangeproto.RawTreeChangeWithId +} + +func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) { + keys := newTreeKeys(treeId) + has, err := db.Has(keys.RootIdKey()) + if err != nil { + return + } + if !has { + err = storage.ErrUnknownTreeId + return + } + + heads, err := db.Get(keys.HeadsKey()) + if err != nil { + return + } + if heads == nil { + err = storage.ErrUnknownTreeId + return + } + + root, err := db.Get(keys.RawChangeKey(treeId)) + if err != nil { + return + } + if root == nil { + err = storage.ErrUnknownTreeId + return + } + + rootWithId := &treechangeproto.RawTreeChangeWithId{ + RawChange: root, + Id: treeId, + } + if err != nil { + return + } + + ts = &treeStorage{ + db: db, + keys: keys, + id: treeId, + root: rootWithId, + } + return +} + +func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { + keys := newTreeKeys(payload.TreeId) + has, err := db.Has(keys.RootIdKey()) + if err != nil { + return + } + if has { + err = storage.ErrTreeExists + return + } + + heads := createHeadsPayload(payload.Heads) + + for _, ch := range payload.Changes { + err = db.Put(keys.RawChangeKey(ch.Id), ch.GetRawChange()) + if err != nil { + return + } + } + + err = db.Put(keys.RawChangeKey(payload.RootRawChange.Id), payload.RootRawChange.GetRawChange()) + if err != nil { + return + } + + err = db.Put(keys.HeadsKey(), heads) + if err != nil { + return + } + + err = db.Put(keys.RootIdKey(), []byte(payload.RootRawChange.Id)) + if err != nil { + return + } + + ts = &treeStorage{ + db: db, + keys: keys, + id: payload.RootRawChange.Id, + root: payload.RootRawChange, + } + return +} + +func (t *treeStorage) ID() (string, error) { + return t.id, nil +} + +func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err error) { + return t.root, nil +} + +func (t *treeStorage) Heads() (heads []string, err error) { + headsBytes, err := t.db.Get(t.keys.HeadsKey()) + if err != nil { + return + } + if heads == nil { + err = storage.ErrUnknownTreeId + return + } + heads = parseHeads(headsBytes) + return +} + +func (t *treeStorage) SetHeads(heads []string) (err error) { + payload := createHeadsPayload(heads) + return t.db.Put(t.keys.HeadsKey(), payload) +} + +func (t *treeStorage) AddRawChange(change *treechangeproto.RawTreeChangeWithId) (err error) { + return t.db.Put([]byte(change.Id), change.RawChange) +} + +func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treechangeproto.RawTreeChangeWithId, err error) { + res, err := t.db.Get(t.keys.RawChangeKey(id)) + if err != nil { + return + } + if res == nil { + err = storage.ErrUnkownChange + } + + raw = &treechangeproto.RawTreeChangeWithId{ + RawChange: res, + Id: id, + } + return +} + +func (t *treeStorage) HasChange(ctx context.Context, id string) (bool, error) { + return t.db.Has(t.keys.RawChangeKey(id)) +} + +func parseHeads(headsPayload []byte) []string { + return strings.Split(string(headsPayload), "/") +} + +func createHeadsPayload(heads []string) []byte { + var ( + b bytes.Buffer + totalLen int + ) + for _, s := range heads { + totalLen += len(s) + } + // adding separators + totalLen += len(heads) - 1 + b.Grow(totalLen) + for idx, s := range heads { + if idx > 0 { + b.WriteString("/") + } + b.WriteString(s) + } + return b.Bytes() +} diff --git a/go.mod b/go.mod index 49dbf9e1..b234e89d 100644 --- a/go.mod +++ b/go.mod @@ -71,10 +71,13 @@ require ( go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect + golang.org/x/mod v0.4.2 // indirect golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect golang.org/x/text v0.3.7 // indirect + golang.org/x/tools v0.1.5 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 03ccc1fe..8af8e42b 100644 --- a/go.sum +++ b/go.sum @@ -229,6 +229,7 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/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= @@ -283,6 +284,7 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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= diff --git a/node/storage/keys.go b/node/storage/keys.go index 853cfdd8..7840334e 100644 --- a/node/storage/keys.go +++ b/node/storage/keys.go @@ -26,14 +26,12 @@ func (a aclKeys) RawRecordKey(id string) []byte { type treeKeys struct { id string headsKey []byte - rootKey []byte } func newTreeKeys(id string) treeKeys { return treeKeys{ id: id, headsKey: joinStringsToBytes("t", id, "heads"), - rootKey: joinStringsToBytes("t", id, "rootId"), } } @@ -41,10 +39,6 @@ func (t treeKeys) HeadsKey() []byte { return t.headsKey } -func (t treeKeys) RootIdKey() []byte { - return t.rootKey -} - func (t treeKeys) RawChangeKey(id string) []byte { return joinStringsToBytes("t", t.id, id) } diff --git a/node/storage/liststorage.go b/node/storage/liststorage.go index 989791b6..e4d99add 100644 --- a/node/storage/liststorage.go +++ b/node/storage/liststorage.go @@ -16,15 +16,6 @@ type listStorage struct { func newListStorage(db *pogreb.DB) (ls storage.ListStorage, err error) { keys := aclKeys{} - head, err := db.Get(keys.HeadIdKey()) - if err != nil { - return - } - if head == nil { - err = storage.ErrUnknownACLId - return - } - rootId, err := db.Get(keys.RootIdKey()) if err != nil { return diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index 6c6c0d57..a1253492 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -18,15 +18,6 @@ type treeStorage struct { func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) { keys := newTreeKeys(treeId) - has, err := db.Has(keys.RootIdKey()) - if err != nil { - return - } - if !has { - err = storage.ErrUnknownTreeId - return - } - heads, err := db.Get(keys.HeadsKey()) if err != nil { return @@ -64,7 +55,7 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err e func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { keys := newTreeKeys(payload.TreeId) - has, err := db.Has(keys.RootIdKey()) + has, err := db.Has(keys.HeadsKey()) if err != nil { return } @@ -92,11 +83,6 @@ func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) return } - err = db.Put(keys.RootIdKey(), []byte(payload.RootRawChange.Id)) - if err != nil { - return - } - ts = &treeStorage{ db: db, keys: keys, diff --git a/pkg/acl/aclrecordproto/protos/aclrecord.proto b/pkg/acl/aclrecordproto/protos/aclrecord.proto index 4d2a969a..0da3b260 100644 --- a/pkg/acl/aclrecordproto/protos/aclrecord.proto +++ b/pkg/acl/aclrecordproto/protos/aclrecord.proto @@ -63,6 +63,15 @@ message ACLUserAdd { ACLUserPermissions permissions = 4; } +// signing accept key +// rsa encryption key -> read keys + +// accept key, encrypt key, invite id +// GetSpace(id) -> ... (space header + acl root) -> diff +// Join(ACLJoinRecord) -> Ok + +// + message ACLUserInvite { bytes acceptPublicKey = 1; bytes encryptPublicKey = 2; From 700e04cc14235f51210708e11c567796984b55ed Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 16 Oct 2022 10:13:17 +0200 Subject: [PATCH 146/219] Add transaction benchmarks for badger --- cmd/benchmarks/db/badger.go | 27 +++++++++++++++++++++++++++ cmd/benchmarks/db/common.go | 6 ++++++ cmd/benchmarks/db/pogreb.go | 4 ++++ cmd/benchmarks/dbbench.go | 32 ++++++++++++++++++++++++++++++-- 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/cmd/benchmarks/db/badger.go b/cmd/benchmarks/db/badger.go index 1487aafc..87bc01a2 100644 --- a/cmd/benchmarks/db/badger.go +++ b/cmd/benchmarks/db/badger.go @@ -11,6 +11,33 @@ type badgerTree struct { db *badger.DB } +type badgerTransaction struct { + spaceId string + id string + txn *badger.Txn +} + +func (b *badgerTransaction) AddChange(key string, value []byte) (err error) { + badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key) + return b.txn.Set([]byte(badgerKey), value) +} + +func (b *badgerTransaction) GetChange(key string) (val []byte, err error) { + badgerKey := fmt.Sprintf("space/%s/tree/%s/change/%s", b.spaceId, b.id, key) + it, err := b.txn.Get([]byte(badgerKey)) + if err != nil { + return + } + return it.ValueCopy(val) +} + +func (b *badgerTree) Perform(f func(txn Transaction) error) error { + return b.db.Update(func(txn *badger.Txn) error { + bTxn := &badgerTransaction{b.spaceId, b.id, txn} + return f(bTxn) + }) +} + func (b *badgerTree) Id() string { return b.id } diff --git a/cmd/benchmarks/db/common.go b/cmd/benchmarks/db/common.go index d690473c..0443e3f6 100644 --- a/cmd/benchmarks/db/common.go +++ b/cmd/benchmarks/db/common.go @@ -1,11 +1,17 @@ package db +type Transaction interface { + AddChange(key string, value []byte) (err error) + GetChange(key string) ([]byte, error) +} + type Tree interface { Id() string UpdateHead(head string) (err error) AddChange(key string, value []byte) (err error) GetChange(key string) ([]byte, error) HasChange(key string) (has bool, err error) + Perform(func(txn Transaction) error) error } type Space interface { diff --git a/cmd/benchmarks/db/pogreb.go b/cmd/benchmarks/db/pogreb.go index 7cc9759a..2edca852 100644 --- a/cmd/benchmarks/db/pogreb.go +++ b/cmd/benchmarks/db/pogreb.go @@ -12,6 +12,10 @@ type pogrebTree struct { db *pogreb.DB } +func (p *pogrebTree) Perform(f func(txn Transaction) error) error { + return f(p) +} + func (p *pogrebTree) Id() string { return p.id } diff --git a/cmd/benchmarks/dbbench.go b/cmd/benchmarks/dbbench.go index c3db3601..faa06943 100644 --- a/cmd/benchmarks/dbbench.go +++ b/cmd/benchmarks/dbbench.go @@ -17,9 +17,9 @@ func main() { fmt.Println(http.ListenAndServe("localhost:6060", nil)) }() opts := options{ - numSpaces: 1000, + numSpaces: 10, numEntriesInSpace: 100, - numChangesInTree: 10, + numChangesInTree: 1000, numHeadUpdates: 100, defValueSize: 1000, lenHeadUpdate: 1000, @@ -105,6 +105,15 @@ func bench(factory db.SpaceCreatorFactory, opts options) { panic(err) } } + //t.Perform(func(txn db.Transaction) error { + // for i := 0; i < opts.numChangesInTree; i++ { + // err := t.AddChange(changeIdKey(i), byteSlice()) + // if err != nil { + // panic(err) + // } + // } + // return nil + //}) for i := 0; i < opts.numHeadUpdates; i++ { err := t.UpdateHead(string(headUpdate())) if err != nil { @@ -116,6 +125,25 @@ func bench(factory db.SpaceCreatorFactory, opts options) { fmt.Println(total, "changes creation, spent ms", time.Now().Sub(now).Milliseconds()) now = time.Now() + // getting some values from tree + for _, t := range trees { + err := t.Perform(func(txn db.Transaction) error { + for i := 0; i < opts.numChangesInTree; i++ { + _, err := t.GetChange(changeIdKey(i)) + if err != nil { + return err + } + } + return nil + }) + if err != nil { + panic(err) + } + } + + fmt.Println(total, "changes getting perform, spent ms", time.Now().Sub(now).Milliseconds()) + now = time.Now() + // getting some values from tree for _, t := range trees { for i := 0; i < opts.numChangesInTree; i++ { From a2d2c61f1e560281db15167d4da2912a35dd0fba Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 16 Oct 2022 16:41:01 +0200 Subject: [PATCH 147/219] Further wip badger --- client/badgerprovider/helpers.go | 46 ++------ client/storage/keys.go | 42 +++---- client/storage/liststorage.go | 49 +++------ client/storage/spacestorage.go | 155 +++++++++++--------------- client/storage/storageservice.go | 4 +- client/storage/treestorage.go | 183 ++++++++++++------------------- node/storage/keys.go | 30 +---- node/storage/liststorage.go | 3 +- node/storage/treestorage.go | 38 +------ pkg/acl/storage/helpers.go | 34 ++++++ 10 files changed, 215 insertions(+), 369 deletions(-) create mode 100644 pkg/acl/storage/helpers.go diff --git a/client/badgerprovider/helpers.go b/client/badgerprovider/helpers.go index 96ed8acf..afaf5da4 100644 --- a/client/badgerprovider/helpers.go +++ b/client/badgerprovider/helpers.go @@ -7,16 +7,11 @@ import ( var ErrIncorrectKey = errors.New("the key is incorrect") -func Has(db *badger.DB, key []byte) (has bool, err error) { - err = db.View(func(txn *badger.Txn) error { +func Has(db *badger.DB, key []byte) bool { + return db.View(func(txn *badger.Txn) error { _, err := txn.Get(key) return err - }) - if err != nil { - return - } - has = true - return + }) == nil } func Put(db *badger.DB, key, value []byte) (err error) { @@ -40,37 +35,10 @@ func Get(db *badger.DB, key []byte) (value []byte, err error) { return } -func GetKeySuffix(txn *badger.Txn, keyPrefix []byte) (suffix []byte, err error) { - iter := txn.NewIterator(badger.IteratorOptions{Prefix: keyPrefix}) - iter.Next() - if !iter.Valid() { - err = badger.ErrKeyNotFound +func GetAndCopy(txn *badger.Txn, key []byte) (value []byte, err error) { + item, err := txn.Get(key) + if err != nil { return } - - suffix = iter.Item().Key() - if len(suffix) <= len(keyPrefix)+1 { - err = ErrIncorrectKey - return - } - suffix = suffix[len(keyPrefix)+1:] - return -} - -func GetKeySuffixAndValue(txn *badger.Txn, keyPrefix []byte) (suffix []byte, value []byte, err error) { - iter := txn.NewIterator(badger.IteratorOptions{Prefix: keyPrefix}) - iter.Next() - if !iter.Valid() { - err = badger.ErrKeyNotFound - return - } - - suffix = iter.Item().Key() - if len(suffix) <= len(keyPrefix)+1 { - err = ErrIncorrectKey - return - } - suffix = suffix[len(keyPrefix)+1:] - value, err = iter.Item().ValueCopy(value) - return + return item.ValueCopy(value) } diff --git a/client/storage/keys.go b/client/storage/keys.go index 5ee5958f..08749a89 100644 --- a/client/storage/keys.go +++ b/client/storage/keys.go @@ -1,7 +1,7 @@ package storage import ( - "bytes" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" ) type aclKeys struct { @@ -13,8 +13,8 @@ type aclKeys struct { func newACLKeys(spaceId string) aclKeys { return aclKeys{ spaceId: spaceId, - rootKey: joinStringsToBytes("space", spaceId, "a", "rootId"), - headKey: joinStringsToBytes("space", spaceId, "a", "headId"), + rootKey: storage.JoinStringsToBytes("space", spaceId, "a", "rootId"), + headKey: storage.JoinStringsToBytes("space", spaceId, "a", "headId"), } } @@ -27,7 +27,7 @@ func (a aclKeys) RootIdKey() []byte { } func (a aclKeys) RawRecordKey(id string) []byte { - return joinStringsToBytes("space", a.spaceId, "a", id) + return storage.JoinStringsToBytes("space", a.spaceId, "a", id) } type treeKeys struct { @@ -41,8 +41,8 @@ func newTreeKeys(spaceId, id string) treeKeys { return treeKeys{ id: id, spaceId: spaceId, - headsKey: joinStringsToBytes("space", spaceId, "t", id, "heads"), - rootKey: joinStringsToBytes("space", spaceId, "t", id), + headsKey: storage.JoinStringsToBytes("space", spaceId, "t", id, "heads"), + rootKey: storage.JoinStringsToBytes("space", spaceId, "t", "rootId", id), } } @@ -55,37 +55,25 @@ func (t treeKeys) RootIdKey() []byte { } func (t treeKeys) RawChangeKey(id string) []byte { - return joinStringsToBytes("space", t.spaceId, "t", t.id, id) + return storage.JoinStringsToBytes("space", t.spaceId, "t", t.id, id) } type spaceKeys struct { - headerKey []byte + headerKey []byte + treePrefixKey []byte } func newSpaceKeys(spaceId string) spaceKeys { - return spaceKeys{headerKey: joinStringsToBytes("space", spaceId)} + return spaceKeys{ + headerKey: storage.JoinStringsToBytes("space", spaceId), + treePrefixKey: storage.JoinStringsToBytes("space", spaceId, "t", "rootId"), + } } func (s spaceKeys) HeaderKey() []byte { return s.headerKey } -func joinStringsToBytes(strs ...string) []byte { - var ( - b bytes.Buffer - totalLen int - ) - for _, s := range strs { - totalLen += len(s) - } - // adding separators - totalLen += len(strs) - 1 - b.Grow(totalLen) - for idx, s := range strs { - if idx > 0 { - b.WriteString("/") - } - b.WriteString(s) - } - return b.Bytes() +func (s spaceKeys) TreeRootPrefix() []byte { + return s.treePrefixKey } diff --git a/client/storage/liststorage.go b/client/storage/liststorage.go index 30910d65..edb9a17d 100644 --- a/client/storage/liststorage.go +++ b/client/storage/liststorage.go @@ -20,23 +20,13 @@ type listStorage struct { func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls storage.ListStorage, err error) { keys := newACLKeys(spaceId) - rootId, err := provider.GetKeySuffix(txn, keys.RootIdKey()) + rootId, err := provider.GetAndCopy(txn, keys.RootIdKey()) if err != nil { - if err == badger.ErrKeyNotFound { - err = storage.ErrUnknownACLId - } return } + stringId := string(rootId) - rootItem, err := txn.Get(keys.RawRecordKey(stringId)) - if err != nil { - if err == badger.ErrKeyNotFound { - err = storage.ErrUnknownACLId - } - return - } - var value []byte - value, err = rootItem.ValueCopy(value) + value, err := provider.GetAndCopy(txn, keys.RawRecordKey(stringId)) if err != nil { return } @@ -57,19 +47,11 @@ func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls storage. func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *aclrecordproto.RawACLRecordWithId) (ls storage.ListStorage, err error) { keys := newACLKeys(spaceId) - _, err = provider.GetKeySuffix(txn, keys.RootIdKey()) - if err != nil && err != badger.ErrKeyNotFound { - return - } - if err == nil { - err = storage.ErrACLExists - return - } - aclRootKey := append(keys.RootIdKey(), '/') - aclRootKey = append(aclRootKey, []byte(root.Id)...) - - err = txn.Set(aclRootKey, nil) - if err != nil { + _, err = provider.GetAndCopy(txn, keys.RootIdKey()) + if err != badger.ErrKeyNotFound { + if err == nil { + return newListStorage(spaceId, db, txn) + } return } @@ -82,6 +64,10 @@ func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *acl if err != nil { return } + err = txn.Set(keys.RootIdKey(), []byte(root.Id)) + if err != nil { + return + } ls = &listStorage{ db: db, @@ -110,12 +96,11 @@ func (l *listStorage) Head() (head string, err error) { } func (l *listStorage) GetRawRecord(ctx context.Context, id string) (raw *aclrecordproto.RawACLRecordWithId, err error) { - res, err := l.db.Get(l.keys.RawRecordKey(id)) + res, err := provider.Get(l.db, l.keys.RawRecordKey(id)) if err != nil { - return - } - if res == nil { - err = storage.ErrUnknownRecord + if err == badger.ErrKeyNotFound { + err = storage.ErrUnknownRecord + } return } @@ -127,5 +112,5 @@ func (l *listStorage) GetRawRecord(ctx context.Context, id string) (raw *aclreco } func (l *listStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { - return l.db.Put([]byte(rec.Id), rec.Payload) + return provider.Put(l.db, []byte(rec.Id), rec.Payload) } diff --git a/client/storage/spacestorage.go b/client/storage/spacestorage.go index 1affdc14..5fb03f72 100644 --- a/client/storage/spacestorage.go +++ b/client/storage/spacestorage.go @@ -1,23 +1,17 @@ package storage import ( - "github.com/akrylysov/pogreb" provider "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/dgraph-io/badger/v3" - "path" "sync" - "time" ) -var defPogrebOptions = &pogreb.Options{ - BackgroundCompactionInterval: time.Minute * 5, -} - type spaceStorage struct { - objDb *pogreb.DB + spaceId string + objDb *badger.DB keys spaceKeys aclStorage storage.ListStorage header *spacesyncproto.RawSpaceHeaderWithId @@ -26,97 +20,66 @@ type spaceStorage struct { func newSpaceStorage(objDb *badger.DB, spaceId string) (store spacestorage.SpaceStorage, err error) { keys := newSpaceKeys(spaceId) - err = objDb.Update(func(txn *badger.Txn) error { - header, err := txn.Get(keys.HeaderKey()) + err = objDb.View(func(txn *badger.Txn) error { + header, err := provider.GetAndCopy(txn, keys.HeaderKey()) if err != nil { return err } + aclStorage, err := newListStorage(spaceId, objDb, txn) + if err != nil { + return err + } + + store = &spaceStorage{ + spaceId: spaceId, + objDb: objDb, + keys: keys, + header: &spacesyncproto.RawSpaceHeaderWithId{ + RawHeader: header, + Id: spaceId, + }, + aclStorage: aclStorage, + } + return nil }) - has, err := provider.Has(obj) - if err != nil { - return - } - if !has { - err = spacestorage.ErrSpaceStorageMissing - return - } - - header, err := objDb.Get(keys.HeaderKey()) - if err != nil { - return - } - if header == nil { - err = spacestorage.ErrSpaceStorageMissing - return - } - - aclStorage, err := newListStorage(objDb) - if err != nil { - return - } - - store = &spaceStorage{ - objDb: objDb, - keys: keys, - header: &spacesyncproto.RawSpaceHeaderWithId{ - RawHeader: header, - Id: spaceId, - }, - aclStorage: aclStorage, + if err == badger.ErrKeyNotFound { + err = spacesyncproto.ErrSpaceMissing } return } -func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) { - dbPath := path.Join(rootPath, payload.SpaceHeaderWithId.Id) - db, err := pogreb.Open(dbPath, defPogrebOptions) - if err != nil { - return - } - - defer func() { - if err != nil { - db.Close() - } - }() - +func createSpaceStorage(db *badger.DB, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) { keys := newSpaceKeys(payload.SpaceHeaderWithId.Id) - has, err := db.Has(keys.SpaceIdKey()) - if err != nil { - return - } - if has { + if provider.Has(db, keys.HeaderKey()) { err = spacesyncproto.ErrSpaceExists return } + err = db.Update(func(txn *badger.Txn) error { + aclStorage, err := createListStorage(payload.SpaceHeaderWithId.Id, db, txn, payload.RecWithId) + if err != nil { + return err + } - aclStorage, err := createListStorage(db, payload.RecWithId) - if err != nil { - return - } + err = txn.Set(keys.HeaderKey(), payload.SpaceHeaderWithId.RawHeader) + if err != nil { + return err + } - err = db.Put(keys.HeaderKey(), payload.SpaceHeaderWithId.RawHeader) - if err != nil { - return - } - - err = db.Put(keys.SpaceIdKey(), []byte(payload.SpaceHeaderWithId.Id)) - if err != nil { - return - } - - store = &spaceStorage{ - objDb: db, - keys: keys, - aclStorage: aclStorage, - header: payload.SpaceHeaderWithId, - } + store = &spaceStorage{ + spaceId: payload.SpaceHeaderWithId.Id, + objDb: db, + keys: keys, + aclStorage: aclStorage, + header: payload.SpaceHeaderWithId, + } + return nil + }) return } func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) { - return newTreeStorage(s.objDb, id) + return newTreeStorage(s.objDb, s.spaceId, id) } func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { @@ -124,7 +87,7 @@ func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayloa s.mx.Lock() defer s.mx.Unlock() - return createTreeStorage(s.objDb, payload) + return createTreeStorage(s.objDb, s.spaceId, payload) } func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) { @@ -136,21 +99,25 @@ func (s *spaceStorage) SpaceHeader() (header *spacesyncproto.RawSpaceHeaderWithI } func (s *spaceStorage) StoredIds() (ids []string, err error) { - index := s.objDb.Items() + err = s.objDb.View(func(txn *badger.Txn) error { + opts := badger.DefaultIteratorOptions + opts.PrefetchValues = false + opts.Prefix = s.keys.TreeRootPrefix() - key, val, err := index.Next() - for err == nil { - strKey := string(key) - if isRootIdKey(strKey) { - ids = append(ids, string(val)) + it := txn.NewIterator(opts) + defer it.Close() + + for it.Rewind(); it.Valid(); it.Next() { + item := it.Item() + id := item.Key() + if len(id) <= len(s.keys.TreeRootPrefix())+1 { + continue + } + id = id[len(s.keys.TreeRootPrefix())+1:] + ids = append(ids, string(id)) } - key, val, err = index.Next() - } - - if err != pogreb.ErrIterationDone { - return - } - err = nil + return nil + }) return } diff --git a/client/storage/storageservice.go b/client/storage/storageservice.go index ba9de309..0cc9250e 100644 --- a/client/storage/storageservice.go +++ b/client/storage/storageservice.go @@ -26,9 +26,9 @@ func (s *storageService) Name() (name string) { } func (s *storageService) SpaceStorage(id string) (storage.SpaceStorage, error) { - return newSpaceStorage(s.rootPath, id) + return newSpaceStorage(s.db, id) } func (s *storageService) CreateSpaceStorage(payload storage.SpaceStorageCreatePayload) (storage.SpaceStorage, error) { - return createSpaceStorage(s.rootPath, payload) + return createSpaceStorage(s.db, payload) } diff --git a/client/storage/treestorage.go b/client/storage/treestorage.go index 6c6c0d57..aea492ac 100644 --- a/client/storage/treestorage.go +++ b/client/storage/treestorage.go @@ -1,108 +1,88 @@ package storage import ( - "bytes" "context" - "github.com/akrylysov/pogreb" + provider "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" - "strings" + "github.com/dgraph-io/badger/v3" ) type treeStorage struct { - db *pogreb.DB + db *badger.DB keys treeKeys id string root *treechangeproto.RawTreeChangeWithId } -func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) { - keys := newTreeKeys(treeId) - has, err := db.Has(keys.RootIdKey()) - if err != nil { - return - } - if !has { - err = storage.ErrUnknownTreeId - return - } +func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStorage, err error) { + keys := newTreeKeys(spaceId, treeId) + err = db.View(func(txn *badger.Txn) error { + _, err := txn.Get(keys.RootIdKey()) + if err != nil { + return err + } - heads, err := db.Get(keys.HeadsKey()) - if err != nil { - return - } - if heads == nil { - err = storage.ErrUnknownTreeId - return - } + root, err := provider.GetAndCopy(txn, keys.RawChangeKey(treeId)) + if err != nil { + return err + } - root, err := db.Get(keys.RawChangeKey(treeId)) - if err != nil { - return - } - if root == nil { - err = storage.ErrUnknownTreeId - return - } + rootWithId := &treechangeproto.RawTreeChangeWithId{ + RawChange: root, + Id: treeId, + } - rootWithId := &treechangeproto.RawTreeChangeWithId{ - RawChange: root, - Id: treeId, - } - if err != nil { - return - } - - ts = &treeStorage{ - db: db, - keys: keys, - id: treeId, - root: rootWithId, - } + ts = &treeStorage{ + db: db, + keys: keys, + id: treeId, + root: rootWithId, + } + return nil + }) return } -func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { - keys := newTreeKeys(payload.TreeId) - has, err := db.Has(keys.RootIdKey()) - if err != nil { - return - } - if has { +func createTreeStorage(db *badger.DB, spaceId string, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { + keys := newTreeKeys(spaceId, payload.TreeId) + if provider.Has(db, keys.RootIdKey()) { err = storage.ErrTreeExists return } + err = db.Update(func(txn *badger.Txn) error { + heads := storage.CreateHeadsPayload(payload.Heads) - heads := createHeadsPayload(payload.Heads) - - for _, ch := range payload.Changes { - err = db.Put(keys.RawChangeKey(ch.Id), ch.GetRawChange()) - if err != nil { - return + for _, ch := range payload.Changes { + err = txn.Set(keys.RawChangeKey(ch.Id), ch.GetRawChange()) + if err != nil { + return err + } } - } - err = db.Put(keys.RawChangeKey(payload.RootRawChange.Id), payload.RootRawChange.GetRawChange()) - if err != nil { - return - } + err = txn.Set(keys.RawChangeKey(payload.RootRawChange.Id), payload.RootRawChange.GetRawChange()) + if err != nil { + return err + } - err = db.Put(keys.HeadsKey(), heads) - if err != nil { - return - } + err = txn.Set(keys.HeadsKey(), heads) + if err != nil { + return err + } - err = db.Put(keys.RootIdKey(), []byte(payload.RootRawChange.Id)) - if err != nil { - return - } + err = txn.Set(keys.RootIdKey(), nil) + if err != nil { + return err + } - ts = &treeStorage{ - db: db, - keys: keys, - id: payload.RootRawChange.Id, - root: payload.RootRawChange, - } + ts = &treeStorage{ + db: db, + keys: keys, + id: payload.RootRawChange.Id, + root: payload.RootRawChange, + } + return nil + }) return } @@ -115,35 +95,34 @@ func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err erro } func (t *treeStorage) Heads() (heads []string, err error) { - headsBytes, err := t.db.Get(t.keys.HeadsKey()) + headsBytes, err := provider.Get(t.db, t.keys.HeadsKey()) if err != nil { + if err == badger.ErrKeyNotFound { + err = storage.ErrUnknownTreeId + } return } - if heads == nil { - err = storage.ErrUnknownTreeId - return - } - heads = parseHeads(headsBytes) + heads = storage.ParseHeads(headsBytes) return } func (t *treeStorage) SetHeads(heads []string) (err error) { - payload := createHeadsPayload(heads) - return t.db.Put(t.keys.HeadsKey(), payload) + payload := storage.CreateHeadsPayload(heads) + return provider.Put(t.db, t.keys.HeadsKey(), payload) } func (t *treeStorage) AddRawChange(change *treechangeproto.RawTreeChangeWithId) (err error) { - return t.db.Put([]byte(change.Id), change.RawChange) + return provider.Put(t.db, t.keys.RawChangeKey(change.Id), change.RawChange) } func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treechangeproto.RawTreeChangeWithId, err error) { - res, err := t.db.Get(t.keys.RawChangeKey(id)) + res, err := provider.Get(t.db, t.keys.RawChangeKey(id)) if err != nil { + if err == badger.ErrKeyNotFound { + err = storage.ErrUnknownTreeId + } return } - if res == nil { - err = storage.ErrUnkownChange - } raw = &treechangeproto.RawTreeChangeWithId{ RawChange: res, @@ -153,29 +132,5 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha } func (t *treeStorage) HasChange(ctx context.Context, id string) (bool, error) { - return t.db.Has(t.keys.RawChangeKey(id)) -} - -func parseHeads(headsPayload []byte) []string { - return strings.Split(string(headsPayload), "/") -} - -func createHeadsPayload(heads []string) []byte { - var ( - b bytes.Buffer - totalLen int - ) - for _, s := range heads { - totalLen += len(s) - } - // adding separators - totalLen += len(heads) - 1 - b.Grow(totalLen) - for idx, s := range heads { - if idx > 0 { - b.WriteString("/") - } - b.WriteString(s) - } - return b.Bytes() + return provider.Has(t.db, t.keys.RawChangeKey(id)), nil } diff --git a/node/storage/keys.go b/node/storage/keys.go index 7840334e..fe12046a 100644 --- a/node/storage/keys.go +++ b/node/storage/keys.go @@ -1,7 +1,7 @@ package storage import ( - "bytes" + "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "strings" ) @@ -20,7 +20,7 @@ func (a aclKeys) RootIdKey() []byte { } func (a aclKeys) RawRecordKey(id string) []byte { - return joinStringsToBytes("a", id) + return storage.JoinStringsToBytes("a", id) } type treeKeys struct { @@ -31,7 +31,7 @@ type treeKeys struct { func newTreeKeys(id string) treeKeys { return treeKeys{ id: id, - headsKey: joinStringsToBytes("t", id, "heads"), + headsKey: storage.JoinStringsToBytes("t", id, "heads"), } } @@ -40,7 +40,7 @@ func (t treeKeys) HeadsKey() []byte { } func (t treeKeys) RawChangeKey(id string) []byte { - return joinStringsToBytes("t", t.id, id) + return storage.JoinStringsToBytes("t", t.id, id) } type spaceKeys struct { @@ -48,7 +48,7 @@ type spaceKeys struct { } func newSpaceKeys(spaceId string) spaceKeys { - return spaceKeys{headerKey: joinStringsToBytes("s", spaceId)} + return spaceKeys{headerKey: storage.JoinStringsToBytes("s", spaceId)} } var spaceIdKey = []byte("spaceId") @@ -64,23 +64,3 @@ func (s spaceKeys) HeaderKey() []byte { func isRootIdKey(key string) bool { return strings.HasPrefix(key, "t/") && strings.HasSuffix(key, "rootId") } - -func joinStringsToBytes(strs ...string) []byte { - var ( - b bytes.Buffer - totalLen int - ) - for _, s := range strs { - totalLen += len(s) - } - // adding separators - totalLen += len(strs) - 1 - b.Grow(totalLen) - for idx, s := range strs { - if idx > 0 { - b.WriteString("/") - } - b.WriteString(s) - } - return b.Bytes() -} diff --git a/node/storage/liststorage.go b/node/storage/liststorage.go index e4d99add..966f3fe0 100644 --- a/node/storage/liststorage.go +++ b/node/storage/liststorage.go @@ -55,8 +55,7 @@ func createListStorage(db *pogreb.DB, root *aclrecordproto.RawACLRecordWithId) ( return } if has { - err = storage.ErrACLExists - return + return newListStorage(db) } err = db.Put(keys.HeadIdKey(), []byte(root.Id)) diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index a1253492..f600b6a2 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -1,12 +1,10 @@ package storage import ( - "bytes" "context" "github.com/akrylysov/pogreb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" - "strings" ) type treeStorage struct { @@ -40,10 +38,6 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err e RawChange: root, Id: treeId, } - if err != nil { - return - } - ts = &treeStorage{ db: db, keys: keys, @@ -64,7 +58,7 @@ func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) return } - heads := createHeadsPayload(payload.Heads) + heads := storage.CreateHeadsPayload(payload.Heads) for _, ch := range payload.Changes { err = db.Put(keys.RawChangeKey(ch.Id), ch.GetRawChange()) @@ -109,17 +103,17 @@ func (t *treeStorage) Heads() (heads []string, err error) { err = storage.ErrUnknownTreeId return } - heads = parseHeads(headsBytes) + heads = storage.ParseHeads(headsBytes) return } func (t *treeStorage) SetHeads(heads []string) (err error) { - payload := createHeadsPayload(heads) + payload := storage.CreateHeadsPayload(heads) return t.db.Put(t.keys.HeadsKey(), payload) } func (t *treeStorage) AddRawChange(change *treechangeproto.RawTreeChangeWithId) (err error) { - return t.db.Put([]byte(change.Id), change.RawChange) + return t.db.Put(t.keys.RawChangeKey(change.Id), change.RawChange) } func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treechangeproto.RawTreeChangeWithId, err error) { @@ -141,27 +135,3 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha func (t *treeStorage) HasChange(ctx context.Context, id string) (bool, error) { return t.db.Has(t.keys.RawChangeKey(id)) } - -func parseHeads(headsPayload []byte) []string { - return strings.Split(string(headsPayload), "/") -} - -func createHeadsPayload(heads []string) []byte { - var ( - b bytes.Buffer - totalLen int - ) - for _, s := range heads { - totalLen += len(s) - } - // adding separators - totalLen += len(heads) - 1 - b.Grow(totalLen) - for idx, s := range heads { - if idx > 0 { - b.WriteString("/") - } - b.WriteString(s) - } - return b.Bytes() -} diff --git a/pkg/acl/storage/helpers.go b/pkg/acl/storage/helpers.go new file mode 100644 index 00000000..7796a15f --- /dev/null +++ b/pkg/acl/storage/helpers.go @@ -0,0 +1,34 @@ +package storage + +import ( + "bytes" + "strings" +) + +func ParseHeads(headsPayload []byte) []string { + return strings.Split(string(headsPayload), "/") +} + +func CreateHeadsPayload(heads []string) []byte { + return JoinStringsToBytes(heads...) +} + +func JoinStringsToBytes(strs ...string) []byte { + var ( + b bytes.Buffer + totalLen int + ) + for _, s := range strs { + totalLen += len(s) + } + // adding separators + totalLen += len(strs) - 1 + b.Grow(totalLen) + for idx, s := range strs { + if idx > 0 { + b.WriteString("/") + } + b.WriteString(s) + } + return b.Bytes() +} From 0013f64c6190b34abe11dce67d8635bf0621fe5b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 16 Oct 2022 17:59:16 +0200 Subject: [PATCH 148/219] Add preliminary API and fix space service methods --- client/api/controller.go | 18 ++++++++++++++++++ common/commonspace/service.go | 6 ++---- 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 client/api/controller.go diff --git a/client/api/controller.go b/client/api/controller.go new file mode 100644 index 00000000..e39e3fc4 --- /dev/null +++ b/client/api/controller.go @@ -0,0 +1,18 @@ +package api + +type Controller interface { + CreateDerivedSpace() (id string, err error) + CreateSpace() (id string, err error) + GetAllSpacesIds() (ids []string, err error) + // LoadSpace asks node to load a particular space + LoadSpace(id string) (err error) + + CreateDocument(spaceId string) (id string, err error) + GetAllDocumentIds(spaceId string) (ids []string, err error) + AddText(documentId, text string) (err error) + DumpDocumentTree(documentId string) (err error) + + GetValidInvites(spaceId string) (invites []string, err error) + GenerateInvite(spaceId string) (invite string, err error) + JoinSpace(invite string) (err error) +} diff --git a/common/commonspace/service.go b/common/commonspace/service.go index dd0347a1..c7c27081 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -22,8 +22,8 @@ func New() Service { } type Service interface { - CreateSpace(ctx context.Context, cache cache.TreeCache, payload SpaceCreatePayload) (Space, error) - DeriveSpace(ctx context.Context, cache cache.TreeCache, payload SpaceDerivePayload) (Space, error) + DeriveSpace(ctx context.Context, payload SpaceDerivePayload) (Space, error) + CreateSpace(ctx context.Context, payload SpaceCreatePayload) (Space, error) GetSpace(ctx context.Context, id string) (sp Space, err error) app.Component } @@ -51,7 +51,6 @@ func (s *service) Name() (name string) { func (s *service) CreateSpace( ctx context.Context, - cache cache.TreeCache, payload SpaceCreatePayload) (sp Space, err error) { storageCreate, err := storagePayloadForSpaceCreate(payload) if err != nil { @@ -67,7 +66,6 @@ func (s *service) CreateSpace( func (s *service) DeriveSpace( ctx context.Context, - cache cache.TreeCache, payload SpaceDerivePayload) (sp Space, err error) { storageCreate, err := storagePayloadForSpaceDerive(payload) if err != nil { From d80986e6d0c0df665433611285983a9fa26bdf24 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 17 Oct 2022 12:40:55 +0200 Subject: [PATCH 149/219] Change space service methods and change list storage --- client/api/controller.go | 4 ++- client/clientspace/clientcache/treecache.go | 3 +- client/clientspace/service.go | 28 +++++++++++++++++++ client/document/service.go | 13 +++++++++ client/{badgerprovider => storage}/helpers.go | 13 ++++----- client/storage/liststorage.go | 19 +++++++------ client/storage/spacestorage.go | 9 ++++-- client/storage/treestorage.go | 15 +++++----- common/commonspace/service.go | 16 +++++------ common/commonspace/space.go | 13 ++++++--- .../storage/mock_storage/mock_storage.go | 15 ++++++++++ common/commonspace/storage/storage.go | 1 + node/storage/liststorage.go | 8 ++++-- node/storage/spacestorage.go | 11 ++++++-- pkg/acl/storage/inmemory.go | 4 +++ pkg/acl/storage/liststorage.go | 1 + pkg/acl/storage/mock_storage/mock_storage.go | 14 ++++++++++ .../acllistbuilder/liststoragebuilder.go | 4 +++ 18 files changed, 145 insertions(+), 46 deletions(-) create mode 100644 client/document/service.go rename client/{badgerprovider => storage}/helpers.go (61%) diff --git a/client/api/controller.go b/client/api/controller.go index e39e3fc4..51629007 100644 --- a/client/api/controller.go +++ b/client/api/controller.go @@ -1,7 +1,9 @@ package api type Controller interface { - CreateDerivedSpace() (id string, err error) + // DeriveSpace derives the space from current account + DeriveSpace() (id string, err error) + // CreateSpace creates new space with random data CreateSpace() (id string, err error) GetAllSpacesIds() (ids []string, err error) // LoadSpace asks node to load a particular space diff --git a/client/clientspace/clientcache/treecache.go b/client/clientspace/clientcache/treecache.go index eee57452..01e230b2 100644 --- a/client/clientspace/clientcache/treecache.go +++ b/client/clientspace/clientcache/treecache.go @@ -7,7 +7,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "time" ) @@ -40,7 +39,7 @@ func (c *treeCache) Close(ctx context.Context) (err error) { } func (c *treeCache) Init(a *app.App) (err error) { - c.clientService = a.MustComponent(nodespace.CName).(nodespace.Service) + c.clientService = a.MustComponent(clientspace.CName).(clientspace.Service) c.cache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { spaceId := ctx.Value(spaceKey).(string) diff --git a/client/clientspace/service.go b/client/clientspace/service.go index 3fcebc1b..4da8b2e8 100644 --- a/client/clientspace/service.go +++ b/client/clientspace/service.go @@ -23,6 +23,8 @@ func New() Service { type Service interface { GetSpace(ctx context.Context, id string) (commonspace.Space, error) + CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (commonspace.Space, error) + DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (commonspace.Space, error) app.ComponentRunnable } @@ -61,6 +63,32 @@ func (s *service) Run(ctx context.Context) (err error) { return } +func (s *service) CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (space commonspace.Space, err error) { + id, err := s.commonSpace.CreateSpace(ctx, payload) + if err != nil { + return + } + + obj, err := s.commonSpace.GetSpace(ctx, id) + if err != nil { + return + } + return obj.(commonspace.Space), nil +} + +func (s *service) DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (space commonspace.Space, err error) { + id, err := s.commonSpace.DeriveSpace(ctx, payload) + if err != nil { + return + } + + obj, err := s.commonSpace.GetSpace(ctx, id) + if err != nil { + return + } + return obj.(commonspace.Space), nil +} + func (s *service) GetSpace(ctx context.Context, id string) (commonspace.Space, error) { v, err := s.spaceCache.Get(ctx, id) if err != nil { diff --git a/client/document/service.go b/client/document/service.go new file mode 100644 index 00000000..afd16366 --- /dev/null +++ b/client/document/service.go @@ -0,0 +1,13 @@ +package document + +import "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + +type Service interface { + app.Component + CreateDocument(spaceId string) (id string, err error) + GetAllDocumentIds(spaceId string) (ids []string, err error) + AddText(documentId, text string) (err error) + DumpDocumentTree(documentId string) (err error) +} + +const CName = "client.document" diff --git a/client/badgerprovider/helpers.go b/client/storage/helpers.go similarity index 61% rename from client/badgerprovider/helpers.go rename to client/storage/helpers.go index afaf5da4..d1d5915a 100644 --- a/client/badgerprovider/helpers.go +++ b/client/storage/helpers.go @@ -1,26 +1,23 @@ -package badgerprovider +package storage import ( - "errors" "github.com/dgraph-io/badger/v3" ) -var ErrIncorrectKey = errors.New("the key is incorrect") - -func Has(db *badger.DB, key []byte) bool { +func hasDB(db *badger.DB, key []byte) bool { return db.View(func(txn *badger.Txn) error { _, err := txn.Get(key) return err }) == nil } -func Put(db *badger.DB, key, value []byte) (err error) { +func putDB(db *badger.DB, key, value []byte) (err error) { return db.Update(func(txn *badger.Txn) error { return txn.Set(key, value) }) } -func Get(db *badger.DB, key []byte) (value []byte, err error) { +func getDB(db *badger.DB, key []byte) (value []byte, err error) { err = db.View(func(txn *badger.Txn) error { item, err := txn.Get(key) if err != nil { @@ -35,7 +32,7 @@ func Get(db *badger.DB, key []byte) (value []byte, err error) { return } -func GetAndCopy(txn *badger.Txn, key []byte) (value []byte, err error) { +func getTxn(txn *badger.Txn, key []byte) (value []byte, err error) { item, err := txn.Get(key) if err != nil { return diff --git a/client/storage/liststorage.go b/client/storage/liststorage.go index edb9a17d..bf68b602 100644 --- a/client/storage/liststorage.go +++ b/client/storage/liststorage.go @@ -3,7 +3,6 @@ package storage import ( "context" "errors" - provider "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/dgraph-io/badger/v3" @@ -20,13 +19,13 @@ type listStorage struct { func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls storage.ListStorage, err error) { keys := newACLKeys(spaceId) - rootId, err := provider.GetAndCopy(txn, keys.RootIdKey()) + rootId, err := getTxn(txn, keys.RootIdKey()) if err != nil { return } stringId := string(rootId) - value, err := provider.GetAndCopy(txn, keys.RawRecordKey(stringId)) + value, err := getTxn(txn, keys.RawRecordKey(stringId)) if err != nil { return } @@ -47,7 +46,7 @@ func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls storage. func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *aclrecordproto.RawACLRecordWithId) (ls storage.ListStorage, err error) { keys := newACLKeys(spaceId) - _, err = provider.GetAndCopy(txn, keys.RootIdKey()) + _, err = getTxn(txn, keys.RootIdKey()) if err != badger.ErrKeyNotFound { if err == nil { return newListStorage(spaceId, db, txn) @@ -87,7 +86,7 @@ func (l *listStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { } func (l *listStorage) Head() (head string, err error) { - bytes, err := provider.Get(l.db, l.keys.HeadIdKey()) + bytes, err := getDB(l.db, l.keys.HeadIdKey()) if err != nil { return } @@ -96,7 +95,7 @@ func (l *listStorage) Head() (head string, err error) { } func (l *listStorage) GetRawRecord(ctx context.Context, id string) (raw *aclrecordproto.RawACLRecordWithId, err error) { - res, err := provider.Get(l.db, l.keys.RawRecordKey(id)) + res, err := getDB(l.db, l.keys.RawRecordKey(id)) if err != nil { if err == badger.ErrKeyNotFound { err = storage.ErrUnknownRecord @@ -111,6 +110,10 @@ func (l *listStorage) GetRawRecord(ctx context.Context, id string) (raw *aclreco return } -func (l *listStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { - return provider.Put(l.db, []byte(rec.Id), rec.Payload) +func (l *listStorage) SetHead(headId string) (err error) { + return putDB(l.db, l.keys.HeadIdKey(), []byte(headId)) +} + +func (l *listStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { + return putDB(l.db, l.keys.RawRecordKey(rec.Id), rec.Payload) } diff --git a/client/storage/spacestorage.go b/client/storage/spacestorage.go index 5fb03f72..e05efa99 100644 --- a/client/storage/spacestorage.go +++ b/client/storage/spacestorage.go @@ -1,7 +1,6 @@ package storage import ( - provider "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" @@ -21,7 +20,7 @@ type spaceStorage struct { func newSpaceStorage(objDb *badger.DB, spaceId string) (store spacestorage.SpaceStorage, err error) { keys := newSpaceKeys(spaceId) err = objDb.View(func(txn *badger.Txn) error { - header, err := provider.GetAndCopy(txn, keys.HeaderKey()) + header, err := getTxn(txn, keys.HeaderKey()) if err != nil { return err } @@ -51,7 +50,7 @@ func newSpaceStorage(objDb *badger.DB, spaceId string) (store spacestorage.Space func createSpaceStorage(db *badger.DB, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) { keys := newSpaceKeys(payload.SpaceHeaderWithId.Id) - if provider.Has(db, keys.HeaderKey()) { + if hasDB(db, keys.HeaderKey()) { err = spacesyncproto.ErrSpaceExists return } @@ -78,6 +77,10 @@ func createSpaceStorage(db *badger.DB, payload spacestorage.SpaceStorageCreatePa return } +func (s *spaceStorage) ID() (string, error) { + return s.spaceId, nil +} + func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) { return newTreeStorage(s.objDb, s.spaceId, id) } diff --git a/client/storage/treestorage.go b/client/storage/treestorage.go index aea492ac..39fbe8e2 100644 --- a/client/storage/treestorage.go +++ b/client/storage/treestorage.go @@ -2,7 +2,6 @@ package storage import ( "context" - provider "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" "github.com/dgraph-io/badger/v3" @@ -23,7 +22,7 @@ func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStora return err } - root, err := provider.GetAndCopy(txn, keys.RawChangeKey(treeId)) + root, err := getTxn(txn, keys.RawChangeKey(treeId)) if err != nil { return err } @@ -46,7 +45,7 @@ func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStora func createTreeStorage(db *badger.DB, spaceId string, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { keys := newTreeKeys(spaceId, payload.TreeId) - if provider.Has(db, keys.RootIdKey()) { + if hasDB(db, keys.RootIdKey()) { err = storage.ErrTreeExists return } @@ -95,7 +94,7 @@ func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err erro } func (t *treeStorage) Heads() (heads []string, err error) { - headsBytes, err := provider.Get(t.db, t.keys.HeadsKey()) + headsBytes, err := getDB(t.db, t.keys.HeadsKey()) if err != nil { if err == badger.ErrKeyNotFound { err = storage.ErrUnknownTreeId @@ -108,15 +107,15 @@ func (t *treeStorage) Heads() (heads []string, err error) { func (t *treeStorage) SetHeads(heads []string) (err error) { payload := storage.CreateHeadsPayload(heads) - return provider.Put(t.db, t.keys.HeadsKey(), payload) + return putDB(t.db, t.keys.HeadsKey(), payload) } func (t *treeStorage) AddRawChange(change *treechangeproto.RawTreeChangeWithId) (err error) { - return provider.Put(t.db, t.keys.RawChangeKey(change.Id), change.RawChange) + return putDB(t.db, t.keys.RawChangeKey(change.Id), change.RawChange) } func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treechangeproto.RawTreeChangeWithId, err error) { - res, err := provider.Get(t.db, t.keys.RawChangeKey(id)) + res, err := getDB(t.db, t.keys.RawChangeKey(id)) if err != nil { if err == badger.ErrKeyNotFound { err = storage.ErrUnknownTreeId @@ -132,5 +131,5 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha } func (t *treeStorage) HasChange(ctx context.Context, id string) (bool, error) { - return provider.Has(t.db, t.keys.RawChangeKey(id)), nil + return hasDB(t.db, t.keys.RawChangeKey(id)), nil } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index c7c27081..2b5f2404 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -22,8 +22,8 @@ func New() Service { } type Service interface { - DeriveSpace(ctx context.Context, payload SpaceDerivePayload) (Space, error) - CreateSpace(ctx context.Context, payload SpaceCreatePayload) (Space, error) + DeriveSpace(ctx context.Context, payload SpaceDerivePayload) (string, error) + CreateSpace(ctx context.Context, payload SpaceCreatePayload) (string, error) GetSpace(ctx context.Context, id string) (sp Space, err error) app.Component } @@ -51,32 +51,32 @@ func (s *service) Name() (name string) { func (s *service) CreateSpace( ctx context.Context, - payload SpaceCreatePayload) (sp Space, err error) { + payload SpaceCreatePayload) (id string, err error) { storageCreate, err := storagePayloadForSpaceCreate(payload) if err != nil { return } - _, err = s.storageProvider.CreateSpaceStorage(storageCreate) + store, err := s.storageProvider.CreateSpaceStorage(storageCreate) if err != nil { return } - return s.GetSpace(ctx, storageCreate.SpaceHeaderWithId.GetId()) + return store.ID() } func (s *service) DeriveSpace( ctx context.Context, - payload SpaceDerivePayload) (sp Space, err error) { + payload SpaceDerivePayload) (id string, err error) { storageCreate, err := storagePayloadForSpaceDerive(payload) if err != nil { return } - _, err = s.storageProvider.CreateSpaceStorage(storageCreate) + store, err := s.storageProvider.CreateSpaceStorage(storageCreate) if err != nil { return } - return s.GetSpace(ctx, storageCreate.SpaceHeaderWithId.GetId()) + return store.ID() } func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { diff --git a/common/commonspace/space.go b/common/commonspace/space.go index aa255f51..fca752ab 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -19,10 +19,15 @@ import ( ) type SpaceCreatePayload struct { - SigningKey signingkey.PrivKey - EncryptionKey encryptionkey.PrivKey - SpaceType string - ReadKey []byte + // SigningKey is the signing key of the owner + SigningKey signingkey.PrivKey + // EncryptionKey is the encryption key of the owner + EncryptionKey encryptionkey.PrivKey + // SpaceType is an arbitrary string + SpaceType string + // ReadKey is a first symmetric encryption key for a space + ReadKey []byte + // ReplicationKey is a key which is to be used to determine the node where the space should be held ReplicationKey uint64 } diff --git a/common/commonspace/storage/mock_storage/mock_storage.go b/common/commonspace/storage/mock_storage/mock_storage.go index 4cca0580..d1fd5934 100644 --- a/common/commonspace/storage/mock_storage/mock_storage.go +++ b/common/commonspace/storage/mock_storage/mock_storage.go @@ -162,6 +162,21 @@ func (mr *MockSpaceStorageMockRecorder) CreateTreeStorage(arg0 interface{}) *gom return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTreeStorage", reflect.TypeOf((*MockSpaceStorage)(nil).CreateTreeStorage), arg0) } +// ID mocks base method. +func (m *MockSpaceStorage) ID() (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ID indicates an expected call of ID. +func (mr *MockSpaceStorageMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockSpaceStorage)(nil).ID)) +} + // SpaceHeader mocks base method. func (m *MockSpaceStorage) SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) { m.ctrl.T.Helper() diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index eada36f7..1189ede2 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -15,6 +15,7 @@ var ErrSpaceStorageExists = errors.New("space storage exists") var ErrSpaceStorageMissing = errors.New("space storage missing") type SpaceStorage interface { + storage.Storage storage.Provider ACLStorage() (storage.ListStorage, error) SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) diff --git a/node/storage/liststorage.go b/node/storage/liststorage.go index 966f3fe0..142e175b 100644 --- a/node/storage/liststorage.go +++ b/node/storage/liststorage.go @@ -120,6 +120,10 @@ func (l *listStorage) GetRawRecord(ctx context.Context, id string) (raw *aclreco return } -func (l *listStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { - return l.db.Put([]byte(rec.Id), rec.Payload) +func (l *listStorage) SetHead(headId string) (err error) { + return l.db.Put(l.keys.HeadIdKey(), []byte(headId)) +} + +func (l *listStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { + return l.db.Put(l.keys.RawRecordKey(rec.Id), rec.Payload) } diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index 12b15534..3bf41085 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -15,6 +15,7 @@ var defPogrebOptions = &pogreb.Options{ } type spaceStorage struct { + spaceId string objDb *pogreb.DB keys spaceKeys aclStorage storage.ListStorage @@ -60,8 +61,9 @@ func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceS } store = &spaceStorage{ - objDb: objDb, - keys: keys, + spaceId: spaceId, + objDb: objDb, + keys: keys, header: &spacesyncproto.RawSpaceHeaderWithId{ RawHeader: header, Id: spaceId, @@ -110,6 +112,7 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate } store = &spaceStorage{ + spaceId: payload.SpaceHeaderWithId.Id, objDb: db, keys: keys, aclStorage: aclStorage, @@ -118,6 +121,10 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate return } +func (s *spaceStorage) ID() (string, error) { + return s.spaceId, nil +} + func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) { return newTreeStorage(s.objDb, id) } diff --git a/pkg/acl/storage/inmemory.go b/pkg/acl/storage/inmemory.go index b9948c3e..a992e84a 100644 --- a/pkg/acl/storage/inmemory.go +++ b/pkg/acl/storage/inmemory.go @@ -31,6 +31,10 @@ func (i *inMemoryACLListStorage) Root() (*aclrecordproto.RawACLRecordWithId, err return i.records[0], nil } +func (i *inMemoryACLListStorage) SetHead(headId string) error { + panic("implement me") +} + func (i *inMemoryACLListStorage) Head() (string, error) { i.RLock() defer i.RUnlock() diff --git a/pkg/acl/storage/liststorage.go b/pkg/acl/storage/liststorage.go index ad61a7fa..4ce5f814 100644 --- a/pkg/acl/storage/liststorage.go +++ b/pkg/acl/storage/liststorage.go @@ -15,6 +15,7 @@ type ListStorage interface { Storage Root() (*aclrecordproto.RawACLRecordWithId, error) Head() (string, error) + SetHead(headId string) error GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error diff --git a/pkg/acl/storage/mock_storage/mock_storage.go b/pkg/acl/storage/mock_storage/mock_storage.go index c4cf8800..0bfa22e8 100644 --- a/pkg/acl/storage/mock_storage/mock_storage.go +++ b/pkg/acl/storage/mock_storage/mock_storage.go @@ -110,6 +110,20 @@ func (mr *MockListStorageMockRecorder) Root() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Root", reflect.TypeOf((*MockListStorage)(nil).Root)) } +// SetHead mocks base method. +func (m *MockListStorage) SetHead(arg0 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHead", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetHead indicates an expected call of SetHead. +func (mr *MockListStorageMockRecorder) SetHead(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHead", reflect.TypeOf((*MockListStorage)(nil).SetHead), arg0) +} + // MockTreeStorage is a mock of TreeStorage interface. type MockTreeStorage struct { ctrl *gomock.Controller diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index 206550a5..7c0f4565 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -97,6 +97,10 @@ func (t *ACLListStorageBuilder) Head() (string, error) { return t.rawRoot.Id, nil } +func (t *ACLListStorageBuilder) SetHead(headId string) error { + panic("SetHead is not implemented") +} + func (t *ACLListStorageBuilder) Root() (*aclrecordproto.RawACLRecordWithId, error) { return t.rawRoot, nil } From 754808235596bcd4ed8864a3ccc892369121fbd9 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Mon, 17 Oct 2022 14:11:55 +0300 Subject: [PATCH 150/219] move pkgs --- Makefile | 4 +- client/account/service.go | 12 +-- client/badgerprovider/service.go | 4 +- client/clientspace/clientcache/treecache.go | 6 +- client/clientspace/service.go | 12 +-- client/document/service.go | 2 +- client/storage/keys.go | 2 +- client/storage/liststorage.go | 4 +- client/storage/spacestorage.go | 10 +- client/storage/storageservice.go | 2 +- client/storage/treestorage.go | 20 ++-- cmd/consensusnode/consensusnode.go | 4 +- .../testclient/consensustestclient.go | 6 +- cmd/node/node.go | 6 +- cmd/nodesgen/gen.go | 48 +++++----- common/account/service.go | 6 +- {app => common/app}/app.go | 2 +- {app => common/app}/app_test.go | 0 {app => common/app}/logger/log.go | 0 .../cache/mock_cache/mock_cache.go | 2 +- common/commonspace/cache/treecache.go | 4 +- common/commonspace/diffservice/diffservice.go | 2 +- .../diffservice/diffservice_test.go | 8 +- common/commonspace/diffservice/diffsyncer.go | 2 +- .../diffservice/diffsyncer_test.go | 8 +- .../diffservice/periodicsync_test.go | 2 +- common/commonspace/payloads.go | 18 ++-- common/commonspace/remotediff/remotediff.go | 2 +- .../commonspace/remotediff/remotediff_test.go | 2 +- common/commonspace/service.go | 10 +- common/commonspace/space.go | 32 +++---- .../commonspace/spacesyncproto/spacesync.go | 2 +- .../spacesyncproto/spacesync.pb.go | 4 +- .../storage/mock_storage/mock_storage.go | 16 ++-- common/commonspace/storage/storage.go | 12 +-- .../mock_syncservice/mock_syncservice.go | 4 +- .../commonspace/syncservice/requestfactory.go | 6 +- common/commonspace/syncservice/synchandler.go | 4 +- .../syncservice/synchandler_test.go | 6 +- common/commonspace/syncservice/syncservice.go | 2 +- common/commonspace/synctree/synctree.go | 40 ++++---- common/commonspace/synctree/synctree_test.go | 48 +++++----- .../mock_updatelistener.go | 2 +- .../synctree/updatelistener/updatelistener.go | 4 +- {config => common/config}/account.go | 0 {config => common/config}/anytype.go | 0 {config => common/config}/api.go | 0 {config => common/config}/config.go | 4 +- {config => common/config}/grpc.go | 0 {config => common/config}/log.go | 2 +- {config => common/config}/metric.go | 0 {config => common/config}/nodes.go | 0 {config => common/config}/peer.go | 0 {config => common/config}/space.go | 0 {config => common/config}/storage.go | 0 common/metric/metric.go | 10 +- common/net/dialer/dialer.go | 6 +- common/net/pool/pool.go | 6 +- common/net/pool/pool_test.go | 2 +- common/net/rpc/server/drpcserver.go | 12 +-- common/net/secure/service.go | 8 +- common/nodeconf/service.go | 24 ++--- common/pkg/acl/account/accountdata.go | 12 +++ .../acl/aclrecordproto/aclreadkeyderive.go | 4 +- .../pkg}/acl/aclrecordproto/aclrecord.pb.go | 0 .../acl/aclrecordproto/protos/aclrecord.proto | 0 common/pkg/acl/common/keychain.go | 28 ++++++ .../pkg}/acl/list/aclrecordbuilder.go | 6 +- {pkg => common/pkg}/acl/list/aclstate.go | 78 +++++++-------- .../pkg}/acl/list/aclstatebuilder.go | 6 +- {pkg => common/pkg}/acl/list/list.go | 8 +- {pkg => common/pkg}/acl/list/list_test.go | 4 +- .../pkg}/acl/list/mock_list/mock_list.go | 24 ++--- {pkg => common/pkg}/acl/list/record.go | 0 {pkg => common/pkg}/acl/storage/helpers.go | 0 {pkg => common/pkg}/acl/storage/inmemory.go | 4 +- .../pkg}/acl/storage/liststorage.go | 2 +- .../acl/storage/mock_storage/mock_storage.go | 4 +- {pkg => common/pkg}/acl/storage/provider.go | 2 +- {pkg => common/pkg}/acl/storage/storage.go | 0 .../pkg}/acl/storage/treestorage.go | 2 +- .../acl/testutils/acllistbuilder/keychain.go | 37 ++++---- .../acllistbuilder/liststoragebuilder.go | 94 +++++++++---------- .../acllistbuilder/liststoragebuildergraph.go | 0 .../liststoragebuildergraph_nix.go | 3 +- .../testutils/acllistbuilder/ymlentities.go | 0 .../testutils/testchanges/proto/test.pb.go | 0 .../testutils/testchanges/proto/test.proto | 0 .../pkg}/acl/testutils/yamltests/path.go | 0 .../testutils/yamltests/userjoinexample.yml | 0 .../testutils/yamltests/userremoveexample.yml | 0 {pkg => common/pkg}/acl/tree/change.go | 2 +- {pkg => common/pkg}/acl/tree/changebuilder.go | 10 +- .../pkg}/acl/tree/changevalidator.go | 18 ++-- .../pkg}/acl/tree/descriptionparser.go | 0 .../tree/mock_objecttree/mock_objecttree.go | 22 ++--- {pkg => common/pkg}/acl/tree/objecttree.go | 18 ++-- .../pkg}/acl/tree/objecttree_test.go | 14 +-- .../pkg}/acl/tree/objecttreefactory.go | 22 ++--- {pkg => common/pkg}/acl/tree/rawloader.go | 4 +- common/pkg/acl/tree/rawtreevalidator.go | 17 ++++ .../pkg}/acl/tree/signablecontent.go | 2 +- {pkg => common/pkg}/acl/tree/tree.go | 0 {pkg => common/pkg}/acl/tree/tree_test.go | 0 {pkg => common/pkg}/acl/tree/treebuilder.go | 6 +- {pkg => common/pkg}/acl/tree/treegraph.go | 0 {pkg => common/pkg}/acl/tree/treegraph_nix.go | 0 {pkg => common/pkg}/acl/tree/treeiterator.go | 0 {pkg => common/pkg}/acl/tree/treereduce.go | 0 {pkg => common/pkg}/acl/tree/util.go | 0 .../treechangeproto/protos/treechange.proto | 0 .../pkg}/acl/treechangeproto/treechange.pb.go | 0 {pkg => common/pkg}/ldiff/diff.go | 0 {pkg => common/pkg}/ldiff/diff_test.go | 0 .../pkg}/ldiff/mock_ldiff/mock_ldiff.go | 2 +- {pkg => common/pkg}/ocache/metrics.go | 0 {pkg => common/pkg}/ocache/ocache.go | 2 +- {pkg => common/pkg}/ocache/ocache_test.go | 0 {util => common/util}/cid/cid.go | 0 .../asymmetric/encryptionkey/encryptionkey.go | 4 +- .../keys/asymmetric/encryptionkey/rsa.go | 2 +- .../keys/asymmetric/signingkey/ed25519.go | 2 +- .../keys/asymmetric/signingkey/signingkey.go | 4 +- {util => common/util}/keys/decode.go | 0 {util => common/util}/keys/key.go | 0 .../util}/keys/symmetric/symmetric.go | 0 {util => common/util}/peer/peer.go | 2 +- {util => common/util}/slice/slice.go | 0 consensus/config/config.go | 20 ++-- consensus/consensusclient/client.go | 4 +- consensus/consensusrpc/consensrpc.go | 2 +- consensus/db/db.go | 4 +- consensus/db/db_test.go | 2 +- consensus/stream/service.go | 22 ++--- consensus/stream/service_test.go | 2 +- node/account/service.go | 12 +-- node/nodespace/nodecache/treecache.go | 6 +- node/nodespace/service.go | 12 +-- node/storage/keys.go | 2 +- node/storage/liststorage.go | 4 +- node/storage/spacestorage.go | 10 +- node/storage/storageservice.go | 4 +- node/storage/treestorage.go | 24 ++--- pkg/acl/account/accountdata.go | 12 --- pkg/acl/common/keychain.go | 28 ------ pkg/acl/tree/rawtreevalidator.go | 17 ---- 146 files changed, 565 insertions(+), 559 deletions(-) rename {app => common/app}/app.go (98%) rename {app => common/app}/app_test.go (100%) rename {app => common/app}/logger/log.go (100%) rename {config => common/config}/account.go (100%) rename {config => common/config}/anytype.go (100%) rename {config => common/config}/api.go (100%) rename {config => common/config}/config.go (87%) rename {config => common/config}/grpc.go (100%) rename {config => common/config}/log.go (91%) rename {config => common/config}/metric.go (100%) rename {config => common/config}/nodes.go (100%) rename {config => common/config}/peer.go (100%) rename {config => common/config}/space.go (100%) rename {config => common/config}/storage.go (100%) create mode 100644 common/pkg/acl/account/accountdata.go rename {pkg => common/pkg}/acl/aclrecordproto/aclreadkeyderive.go (73%) rename {pkg => common/pkg}/acl/aclrecordproto/aclrecord.pb.go (100%) rename {pkg => common/pkg}/acl/aclrecordproto/protos/aclrecord.proto (100%) create mode 100644 common/pkg/acl/common/keychain.go rename {pkg => common/pkg}/acl/list/aclrecordbuilder.go (89%) rename {pkg => common/pkg}/acl/list/aclstate.go (75%) rename {pkg => common/pkg}/acl/list/aclstatebuilder.go (75%) rename {pkg => common/pkg}/acl/list/list.go (92%) rename {pkg => common/pkg}/acl/list/list_test.go (94%) rename {pkg => common/pkg}/acl/list/mock_list/mock_list.go (89%) rename {pkg => common/pkg}/acl/list/record.go (100%) rename {pkg => common/pkg}/acl/storage/helpers.go (100%) rename {pkg => common/pkg}/acl/storage/inmemory.go (95%) rename {pkg => common/pkg}/acl/storage/liststorage.go (88%) rename {pkg => common/pkg}/acl/storage/mock_storage/mock_storage.go (97%) rename {pkg => common/pkg}/acl/storage/provider.go (85%) rename {pkg => common/pkg}/acl/storage/storage.go (100%) rename {pkg => common/pkg}/acl/storage/treestorage.go (84%) rename {pkg => common/pkg}/acl/testutils/acllistbuilder/keychain.go (75%) rename {pkg => common/pkg}/acl/testutils/acllistbuilder/liststoragebuilder.go (74%) rename {pkg => common/pkg}/acl/testutils/acllistbuilder/liststoragebuildergraph.go (100%) rename {pkg => common/pkg}/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go (96%) rename {pkg => common/pkg}/acl/testutils/acllistbuilder/ymlentities.go (100%) rename {pkg => common/pkg}/acl/testutils/testchanges/proto/test.pb.go (100%) rename {pkg => common/pkg}/acl/testutils/testchanges/proto/test.proto (100%) rename {pkg => common/pkg}/acl/testutils/yamltests/path.go (100%) rename {pkg => common/pkg}/acl/testutils/yamltests/userjoinexample.yml (100%) rename {pkg => common/pkg}/acl/testutils/yamltests/userremoveexample.yml (100%) rename {pkg => common/pkg}/acl/tree/change.go (93%) rename {pkg => common/pkg}/acl/tree/changebuilder.go (93%) rename {pkg => common/pkg}/acl/tree/changevalidator.go (75%) rename {pkg => common/pkg}/acl/tree/descriptionparser.go (100%) rename {pkg => common/pkg}/acl/tree/mock_objecttree/mock_objecttree.go (93%) rename {pkg => common/pkg}/acl/tree/objecttree.go (96%) rename {pkg => common/pkg}/acl/tree/objecttree_test.go (96%) rename {pkg => common/pkg}/acl/tree/objecttreefactory.go (77%) rename {pkg => common/pkg}/acl/tree/rawloader.go (96%) create mode 100644 common/pkg/acl/tree/rawtreevalidator.go rename {pkg => common/pkg}/acl/tree/signablecontent.go (59%) rename {pkg => common/pkg}/acl/tree/tree.go (100%) rename {pkg => common/pkg}/acl/tree/tree_test.go (100%) rename {pkg => common/pkg}/acl/tree/treebuilder.go (96%) rename {pkg => common/pkg}/acl/tree/treegraph.go (100%) rename {pkg => common/pkg}/acl/tree/treegraph_nix.go (100%) rename {pkg => common/pkg}/acl/tree/treeiterator.go (100%) rename {pkg => common/pkg}/acl/tree/treereduce.go (100%) rename {pkg => common/pkg}/acl/tree/util.go (100%) rename {pkg => common/pkg}/acl/treechangeproto/protos/treechange.proto (100%) rename {pkg => common/pkg}/acl/treechangeproto/treechange.pb.go (100%) rename {pkg => common/pkg}/ldiff/diff.go (100%) rename {pkg => common/pkg}/ldiff/diff_test.go (100%) rename {pkg => common/pkg}/ldiff/mock_ldiff/mock_ldiff.go (98%) rename {pkg => common/pkg}/ocache/metrics.go (100%) rename {pkg => common/pkg}/ocache/ocache.go (99%) rename {pkg => common/pkg}/ocache/ocache_test.go (100%) rename {util => common/util}/cid/cid.go (100%) rename {util => common/util}/keys/asymmetric/encryptionkey/encryptionkey.go (67%) rename {util => common/util}/keys/asymmetric/encryptionkey/rsa.go (97%) rename {util => common/util}/keys/asymmetric/signingkey/ed25519.go (97%) rename {util => common/util}/keys/asymmetric/signingkey/signingkey.go (68%) rename {util => common/util}/keys/decode.go (100%) rename {util => common/util}/keys/key.go (100%) rename {util => common/util}/keys/symmetric/symmetric.go (100%) rename {util => common/util}/peer/peer.go (79%) rename {util => common/util}/slice/slice.go (100%) delete mode 100644 pkg/acl/account/accountdata.go delete mode 100644 pkg/acl/common/keychain.go delete mode 100644 pkg/acl/tree/rawtreevalidator.go diff --git a/Makefile b/Makefile index 714af1ab..c233777c 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ proto: $(GOGO_START) protoc --gogofaster_out=:. --go-drpc_out=protolib=github.com/gogo/protobuf:. consensus/consensusproto/protos/*.proto build: - @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) + @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/common/app)) go build -v -o bin/anytype-node -ldflags "$(FLAGS)" cmd/node/node.go test-deps: @@ -41,5 +41,5 @@ test-deps: @go generate ./... build-consensus: - @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/app)) + @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/common/app)) go build -v -o bin/consensus-node -ldflags "$(FLAGS)" github.com/anytypeio/go-anytype-infrastructure-experiments/cmd/consensusnode diff --git a/client/account/service.go b/client/account/service.go index 3181f9bd..6f81b4fe 100644 --- a/client/account/service.go +++ b/client/account/service.go @@ -1,13 +1,13 @@ package account import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" ) type service struct { diff --git a/client/badgerprovider/service.go b/client/badgerprovider/service.go index 2fb8a9c0..ed06f91e 100644 --- a/client/badgerprovider/service.go +++ b/client/badgerprovider/service.go @@ -2,8 +2,8 @@ package badgerprovider import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/dgraph-io/badger/v3" ) diff --git a/client/clientspace/clientcache/treecache.go b/client/clientspace/clientcache/treecache.go index 01e230b2..ad150438 100644 --- a/client/clientspace/clientcache/treecache.go +++ b/client/clientspace/clientcache/treecache.go @@ -3,11 +3,11 @@ package clientcache import ( "context" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "time" ) diff --git a/client/clientspace/service.go b/client/clientspace/service.go index 4da8b2e8..2bfb425a 100644 --- a/client/clientspace/service.go +++ b/client/clientspace/service.go @@ -2,14 +2,14 @@ package clientspace import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "time" ) @@ -29,14 +29,14 @@ type Service interface { } type service struct { - conf config.Space + conf config2.Space spaceCache ocache.OCache commonSpace commonspace.Service spaceStorageProvider storage.SpaceStorageProvider } func (s *service) Init(a *app.App) (err error) { - s.conf = a.MustComponent(config.CName).(*config.Config).Space + s.conf = a.MustComponent(config2.CName).(*config2.Config).Space s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service) s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.spaceCache = ocache.New( diff --git a/client/document/service.go b/client/document/service.go index afd16366..c48a373f 100644 --- a/client/document/service.go +++ b/client/document/service.go @@ -1,6 +1,6 @@ package document -import "github.com/anytypeio/go-anytype-infrastructure-experiments/app" +import "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" type Service interface { app.Component diff --git a/client/storage/keys.go b/client/storage/keys.go index 08749a89..81ee43c6 100644 --- a/client/storage/keys.go +++ b/client/storage/keys.go @@ -1,7 +1,7 @@ package storage import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" ) type aclKeys struct { diff --git a/client/storage/liststorage.go b/client/storage/liststorage.go index bf68b602..3061eafd 100644 --- a/client/storage/liststorage.go +++ b/client/storage/liststorage.go @@ -3,8 +3,8 @@ package storage import ( "context" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/dgraph-io/badger/v3" ) diff --git a/client/storage/spacestorage.go b/client/storage/spacestorage.go index e05efa99..c11f1846 100644 --- a/client/storage/spacestorage.go +++ b/client/storage/spacestorage.go @@ -3,7 +3,7 @@ package storage import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/dgraph-io/badger/v3" "sync" ) @@ -12,7 +12,7 @@ type spaceStorage struct { spaceId string objDb *badger.DB keys spaceKeys - aclStorage storage.ListStorage + aclStorage storage2.ListStorage header *spacesyncproto.RawSpaceHeaderWithId mx sync.Mutex } @@ -81,11 +81,11 @@ func (s *spaceStorage) ID() (string, error) { return s.spaceId, nil } -func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) { +func (s *spaceStorage) TreeStorage(id string) (storage2.TreeStorage, error) { return newTreeStorage(s.objDb, s.spaceId, id) } -func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { +func (s *spaceStorage) CreateTreeStorage(payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { // we have mutex here, so we prevent overwriting the heads of a tree on concurrent creation s.mx.Lock() defer s.mx.Unlock() @@ -93,7 +93,7 @@ func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayloa return createTreeStorage(s.objDb, s.spaceId, payload) } -func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) { +func (s *spaceStorage) ACLStorage() (storage2.ListStorage, error) { return s.aclStorage, nil } diff --git a/client/storage/storageservice.go b/client/storage/storageservice.go index 0cc9250e..29082c92 100644 --- a/client/storage/storageservice.go +++ b/client/storage/storageservice.go @@ -1,7 +1,7 @@ package storage import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/dgraph-io/badger/v3" diff --git a/client/storage/treestorage.go b/client/storage/treestorage.go index 39fbe8e2..bede0bc5 100644 --- a/client/storage/treestorage.go +++ b/client/storage/treestorage.go @@ -2,8 +2,8 @@ package storage import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/dgraph-io/badger/v3" ) @@ -14,7 +14,7 @@ type treeStorage struct { root *treechangeproto.RawTreeChangeWithId } -func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStorage, err error) { +func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage2.TreeStorage, err error) { keys := newTreeKeys(spaceId, treeId) err = db.View(func(txn *badger.Txn) error { _, err := txn.Get(keys.RootIdKey()) @@ -43,14 +43,14 @@ func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStora return } -func createTreeStorage(db *badger.DB, spaceId string, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { +func createTreeStorage(db *badger.DB, spaceId string, payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { keys := newTreeKeys(spaceId, payload.TreeId) if hasDB(db, keys.RootIdKey()) { - err = storage.ErrTreeExists + err = storage2.ErrTreeExists return } err = db.Update(func(txn *badger.Txn) error { - heads := storage.CreateHeadsPayload(payload.Heads) + heads := storage2.CreateHeadsPayload(payload.Heads) for _, ch := range payload.Changes { err = txn.Set(keys.RawChangeKey(ch.Id), ch.GetRawChange()) @@ -97,16 +97,16 @@ func (t *treeStorage) Heads() (heads []string, err error) { headsBytes, err := getDB(t.db, t.keys.HeadsKey()) if err != nil { if err == badger.ErrKeyNotFound { - err = storage.ErrUnknownTreeId + err = storage2.ErrUnknownTreeId } return } - heads = storage.ParseHeads(headsBytes) + heads = storage2.ParseHeads(headsBytes) return } func (t *treeStorage) SetHeads(heads []string) (err error) { - payload := storage.CreateHeadsPayload(heads) + payload := storage2.CreateHeadsPayload(heads) return putDB(t.db, t.keys.HeadsKey(), payload) } @@ -118,7 +118,7 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha res, err := getDB(t.db, t.keys.RawChangeKey(id)) if err != nil { if err == badger.ErrKeyNotFound { - err = storage.ErrUnknownTreeId + err = storage2.ErrUnknownTreeId } return } diff --git a/cmd/consensusnode/consensusnode.go b/cmd/consensusnode/consensusnode.go index 491d7ce9..b073aa6e 100644 --- a/cmd/consensusnode/consensusnode.go +++ b/cmd/consensusnode/consensusnode.go @@ -4,8 +4,8 @@ import ( "context" "flag" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" diff --git a/cmd/consensusnode/testclient/consensustestclient.go b/cmd/consensusnode/testclient/consensustestclient.go index d0dc7b69..6f8ee914 100644 --- a/cmd/consensusnode/testclient/consensustestclient.go +++ b/cmd/consensusnode/testclient/consensustestclient.go @@ -5,13 +5,13 @@ import ( "context" "flag" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" diff --git a/cmd/node/node.go b/cmd/node/node.go index bc277ebf..6ac28724 100644 --- a/cmd/node/node.go +++ b/cmd/node/node.go @@ -4,15 +4,15 @@ import ( "context" "flag" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace/nodecache" diff --git a/cmd/nodesgen/gen.go b/cmd/nodesgen/gen.go index 2a122295..6d69ba1e 100644 --- a/cmd/nodesgen/gen.go +++ b/cmd/nodesgen/gen.go @@ -3,12 +3,12 @@ package main import ( "flag" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/peer" cconfig "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/peer" "gopkg.in/yaml.v3" "io/ioutil" "os" @@ -42,8 +42,8 @@ func main() { } flag.Parse() - var configs []config.Config - var nodes []config.Node + var configs []config2.Config + var nodes []config2.Node for _, n := range nodesMap.Nodes { cfg, err := genNodeConfig(n.Addresses, n.APIPort) if err != nil { @@ -51,7 +51,7 @@ func main() { } configs = append(configs, cfg) - node := config.Node{ + node := config2.Node{ PeerId: cfg.Account.PeerId, Address: cfg.GrpcServer.ListenAddrs[0], SigningKey: cfg.Account.SigningKey, @@ -68,7 +68,7 @@ func main() { } consConfigs = append(consConfigs, cfg) - node := config.Node{ + node := config2.Node{ PeerId: cfg.Account.PeerId, Address: cfg.GrpcServer.ListenAddrs[0], SigningKey: cfg.Account.SigningKey, @@ -124,48 +124,48 @@ func main() { } } -func genNodeConfig(addresses []string, apiPort string) (config.Config, error) { +func genNodeConfig(addresses []string, apiPort string) (config2.Config, error) { encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) if err != nil { - return config.Config{}, err + return config2.Config{}, err } signKey, _, err := signingkey.GenerateRandomEd25519KeyPair() if err != nil { - return config.Config{}, err + return config2.Config{}, err } encEncKey, err := keys.EncodeKeyToString(encKey) if err != nil { - return config.Config{}, err + return config2.Config{}, err } encSignKey, err := keys.EncodeKeyToString(signKey) if err != nil { - return config.Config{}, err + return config2.Config{}, err } peerID, err := peer.IDFromSigningPubKey(signKey.GetPublic()) if err != nil { - return config.Config{}, err + return config2.Config{}, err } - return config.Config{ - Anytype: config.Anytype{SwarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec"}, - GrpcServer: config.GrpcServer{ + return config2.Config{ + Anytype: config2.Anytype{SwarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec"}, + GrpcServer: config2.GrpcServer{ ListenAddrs: addresses, TLS: false, }, - Storage: config.Storage{Path: "db"}, - Account: config.Account{ + Storage: config2.Storage{Path: "db"}, + Account: config2.Account{ PeerId: peerID.String(), SigningKey: encSignKey, EncryptionKey: encEncKey, }, - APIServer: config.APIServer{ + APIServer: config2.APIServer{ Port: apiPort, }, - Space: config.Space{ + Space: config2.Space{ GCTTL: 60, SyncPeriod: 10, }, @@ -199,11 +199,11 @@ func genConsensusConfig(addresses []string) (cconfig.Config, error) { } return cconfig.Config{ - GrpcServer: config.GrpcServer{ + GrpcServer: config2.GrpcServer{ ListenAddrs: addresses, TLS: false, }, - Account: config.Account{ + Account: config2.Account{ PeerId: peerID.String(), SigningKey: encSignKey, EncryptionKey: encEncKey, diff --git a/common/account/service.go b/common/account/service.go index 16c62bff..ab009a51 100644 --- a/common/account/service.go +++ b/common/account/service.go @@ -1,9 +1,9 @@ package account import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account" ) const CName = "common.account" diff --git a/app/app.go b/common/app/app.go similarity index 98% rename from app/app.go rename to common/app/app.go index 718b24b6..9e2e3fa0 100644 --- a/app/app.go +++ b/common/app/app.go @@ -4,7 +4,7 @@ import ( "context" "errors" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "go.uber.org/zap" "os" "runtime" diff --git a/app/app_test.go b/common/app/app_test.go similarity index 100% rename from app/app_test.go rename to common/app/app_test.go diff --git a/app/logger/log.go b/common/app/logger/log.go similarity index 100% rename from app/logger/log.go rename to common/app/logger/log.go diff --git a/common/commonspace/cache/mock_cache/mock_cache.go b/common/commonspace/cache/mock_cache/mock_cache.go index 84822cdb..fa2ed66c 100644 --- a/common/commonspace/cache/mock_cache/mock_cache.go +++ b/common/commonspace/cache/mock_cache/mock_cache.go @@ -8,7 +8,7 @@ import ( context "context" reflect "reflect" - app "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" cache "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" gomock "github.com/golang/mock/gomock" ) diff --git a/common/commonspace/cache/treecache.go b/common/commonspace/cache/treecache.go index 274f044a..64c5cb28 100644 --- a/common/commonspace/cache/treecache.go +++ b/common/commonspace/cache/treecache.go @@ -4,9 +4,9 @@ package cache import ( "context" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" ) const CName = "commonspace.cache" diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index 84b0d637..2ed2f33a 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -8,7 +8,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" "go.uber.org/zap" "strings" ) diff --git a/common/commonspace/diffservice/diffservice_test.go b/common/commonspace/diffservice/diffservice_test.go index 27b4da3b..9df40e46 100644 --- a/common/commonspace/diffservice/diffservice_test.go +++ b/common/commonspace/diffservice/diffservice_test.go @@ -1,12 +1,12 @@ package diffservice import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice/mock_diffservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage" - mock_storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage/mock_storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff/mock_ldiff" + mock_storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage/mock_storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff/mock_ldiff" "github.com/golang/mock/gomock" "testing" ) diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index d5022323..dded0e64 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -9,7 +9,7 @@ import ( "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" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" "go.uber.org/zap" "time" ) diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index 47fa3c2d..a83999a4 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -3,7 +3,7 @@ package diffservice import ( "context" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache/mock_cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" @@ -12,9 +12,9 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf/mock_nodeconf" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - mock_aclstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage/mock_storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff/mock_ldiff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + mock_aclstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage/mock_storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff/mock_ldiff" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" "storj.io/drpc" diff --git a/common/commonspace/diffservice/periodicsync_test.go b/common/commonspace/diffservice/periodicsync_test.go index 56d855f2..068da366 100644 --- a/common/commonspace/diffservice/periodicsync_test.go +++ b/common/commonspace/diffservice/periodicsync_test.go @@ -1,7 +1,7 @@ package diffservice import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice/mock_diffservice" "github.com/golang/mock/gomock" "testing" diff --git a/common/commonspace/payloads.go b/common/commonspace/payloads.go index 7c25884d..66d257ec 100644 --- a/common/commonspace/payloads.go +++ b/common/commonspace/payloads.go @@ -3,9 +3,9 @@ package commonspace import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + aclrecordproto2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "hash/fnv" "math/rand" "time" @@ -68,7 +68,7 @@ func storagePayloadForSpaceCreate(payload SpaceCreatePayload) (storagePayload st } // preparing acl - aclRoot := &aclrecordproto.ACLRoot{ + aclRoot := &aclrecordproto2.ACLRoot{ Identity: identity, EncryptionKey: encPubKey, SpaceId: spaceId, @@ -144,7 +144,7 @@ func storagePayloadForSpaceDerive(payload SpaceDerivePayload) (storagePayload st } // deriving and encrypting read key - readKey, err := aclrecordproto.ACLReadKeyDerive(signPrivKey, encPrivKey) + readKey, err := aclrecordproto2.ACLReadKeyDerive(signPrivKey, encPrivKey) if err != nil { return } @@ -160,7 +160,7 @@ func storagePayloadForSpaceDerive(payload SpaceDerivePayload) (storagePayload st } // preparing acl - aclRoot := &aclrecordproto.ACLRoot{ + aclRoot := &aclrecordproto2.ACLRoot{ Identity: identity, EncryptionKey: encPubKey, SpaceId: spaceId, @@ -182,7 +182,7 @@ func storagePayloadForSpaceDerive(payload SpaceDerivePayload) (storagePayload st return } -func marshalACLRoot(aclRoot *aclrecordproto.ACLRoot, key signingkey.PrivKey) (rawWithId *aclrecordproto.RawACLRecordWithId, err error) { +func marshalACLRoot(aclRoot *aclrecordproto2.ACLRoot, key signingkey.PrivKey) (rawWithId *aclrecordproto2.RawACLRecordWithId, err error) { marshalledRoot, err := aclRoot.Marshal() if err != nil { return @@ -191,7 +191,7 @@ func marshalACLRoot(aclRoot *aclrecordproto.ACLRoot, key signingkey.PrivKey) (ra if err != nil { return } - raw := &aclrecordproto.RawACLRecord{ + raw := &aclrecordproto2.RawACLRecord{ Payload: marshalledRoot, Signature: signature, } @@ -203,7 +203,7 @@ func marshalACLRoot(aclRoot *aclrecordproto.ACLRoot, key signingkey.PrivKey) (ra if err != nil { return } - rawWithId = &aclrecordproto.RawACLRecordWithId{ + rawWithId = &aclrecordproto2.RawACLRecordWithId{ Payload: marshalledRaw, Id: aclHeadId, } diff --git a/common/commonspace/remotediff/remotediff.go b/common/commonspace/remotediff/remotediff.go index 8121b1c1..e11606ec 100644 --- a/common/commonspace/remotediff/remotediff.go +++ b/common/commonspace/remotediff/remotediff.go @@ -3,7 +3,7 @@ package remotediff import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" ) type Client interface { diff --git a/common/commonspace/remotediff/remotediff_test.go b/common/commonspace/remotediff/remotediff_test.go index f6b3e7e5..11473aeb 100644 --- a/common/commonspace/remotediff/remotediff_test.go +++ b/common/commonspace/remotediff/remotediff_test.go @@ -4,7 +4,7 @@ import ( "context" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 2b5f2404..8d94a29e 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -2,15 +2,15 @@ package commonspace import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" + config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" ) const CName = "common.commonspace" @@ -29,7 +29,7 @@ type Service interface { } type service struct { - config config.Space + config config2.Space configurationService nodeconf.Service storageProvider storage.SpaceStorageProvider cache cache.TreeCache @@ -37,7 +37,7 @@ type service struct { } func (s *service) Init(a *app.App) (err error) { - s.config = a.MustComponent(config.CName).(*config.Config).Space + s.config = a.MustComponent(config2.CName).(*config2.Config).Space s.storageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) s.cache = a.MustComponent(cache.CName).(cache.TreeCache) diff --git a/common/commonspace/space.go b/common/commonspace/space.go index fca752ab..d56b6e1d 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -10,11 +10,11 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" + storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + tree2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "sync" ) @@ -47,9 +47,9 @@ type Space interface { SpaceSyncRpc() RpcHandler - DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) - CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) - BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree.ObjectTree, error) + DeriveTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree2.ObjectTree, error) + CreateTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree2.ObjectTree, error) + BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree2.ObjectTree, error) Close() error } @@ -94,15 +94,15 @@ func (s *space) DiffService() diffservice.DiffService { return s.diffService } -func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) { +func (s *space) DeriveTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree2.ObjectTree, error) { return synctree.DeriveSyncTree(ctx, payload, s.syncService.SyncClient(), listener, s.aclList, s.storage.CreateTreeStorage) } -func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) { +func (s *space) CreateTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree2.ObjectTree, error) { return synctree.CreateSyncTree(ctx, payload, s.syncService.SyncClient(), listener, s.aclList, s.storage.CreateTreeStorage) } -func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t tree.ObjectTree, err error) { +func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t tree2.ObjectTree, err error) { getTreeRemote := func() (*spacesyncproto.ObjectSyncMessage, error) { // TODO: add empty context handling (when this is not happening due to head update) peerId, err := syncservice.GetPeerIdFromStreamContext(ctx) @@ -116,11 +116,11 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene } store, err := s.storage.TreeStorage(id) - if err != nil && err != treestorage.ErrUnknownTreeId { + if err != nil && err != storage2.ErrUnknownTreeId { return } - if err == treestorage.ErrUnknownTreeId { + if err == storage2.ErrUnknownTreeId { var resp *spacesyncproto.ObjectSyncMessage resp, err = getTreeRemote() if err != nil { @@ -128,7 +128,7 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene } fullSyncResp := resp.GetContent().GetFullSyncResponse() - payload := treestorage.TreeStorageCreatePayload{ + payload := storage2.TreeStorageCreatePayload{ TreeId: resp.TreeId, RootRawChange: resp.RootChange, Changes: fullSyncResp.Changes, @@ -136,7 +136,7 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene } // basically building tree with inmemory storage and validating that it was without errors - err = tree.ValidateRawTree(payload, s.aclList) + err = tree2.ValidateRawTree(payload, s.aclList) if err != nil { return } @@ -146,7 +146,7 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene return } } - return synctree.BuildSyncTree(ctx, s.syncService.SyncClient(), store.(treestorage.TreeStorage), listener, s.aclList) + return synctree.BuildSyncTree(ctx, s.syncService.SyncClient(), store.(storage2.TreeStorage), listener, s.aclList) } func (s *space) Close() error { diff --git a/common/commonspace/spacesyncproto/spacesync.go b/common/commonspace/spacesyncproto/spacesync.go index 068642fe..75eb3bca 100644 --- a/common/commonspace/spacesyncproto/spacesync.go +++ b/common/commonspace/spacesyncproto/spacesync.go @@ -2,7 +2,7 @@ package spacesyncproto import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "storj.io/drpc" ) diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 2fe5cbc4..4e965e55 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -5,8 +5,8 @@ package spacesyncproto import ( fmt "fmt" - aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" diff --git a/common/commonspace/storage/mock_storage/mock_storage.go b/common/commonspace/storage/mock_storage/mock_storage.go index d1fd5934..d18cd24d 100644 --- a/common/commonspace/storage/mock_storage/mock_storage.go +++ b/common/commonspace/storage/mock_storage/mock_storage.go @@ -5,12 +5,12 @@ package mock_storage import ( + storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" reflect "reflect" - app "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" - storage0 "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" gomock "github.com/golang/mock/gomock" ) @@ -119,10 +119,10 @@ func (m *MockSpaceStorage) EXPECT() *MockSpaceStorageMockRecorder { } // ACLStorage mocks base method. -func (m *MockSpaceStorage) ACLStorage() (storage0.ListStorage, error) { +func (m *MockSpaceStorage) ACLStorage() (storage2.ListStorage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ACLStorage") - ret0, _ := ret[0].(storage0.ListStorage) + ret0, _ := ret[0].(storage2.ListStorage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -148,10 +148,10 @@ func (mr *MockSpaceStorageMockRecorder) Close() *gomock.Call { } // CreateTreeStorage mocks base method. -func (m *MockSpaceStorage) CreateTreeStorage(arg0 storage0.TreeStorageCreatePayload) (storage0.TreeStorage, error) { +func (m *MockSpaceStorage) CreateTreeStorage(arg0 storage2.TreeStorageCreatePayload) (storage2.TreeStorage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateTreeStorage", arg0) - ret0, _ := ret[0].(storage0.TreeStorage) + ret0, _ := ret[0].(storage2.TreeStorage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -208,10 +208,10 @@ func (mr *MockSpaceStorageMockRecorder) StoredIds() *gomock.Call { } // TreeStorage mocks base method. -func (m *MockSpaceStorage) TreeStorage(arg0 string) (storage0.TreeStorage, error) { +func (m *MockSpaceStorage) TreeStorage(arg0 string) (storage2.TreeStorage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "TreeStorage", arg0) - ret0, _ := ret[0].(storage0.TreeStorage) + ret0, _ := ret[0].(storage2.TreeStorage) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index 1189ede2..eeee74a2 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -3,10 +3,10 @@ package storage import ( "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" ) const CName = "commonspace.storage" @@ -15,9 +15,9 @@ var ErrSpaceStorageExists = errors.New("space storage exists") var ErrSpaceStorageMissing = errors.New("space storage missing") type SpaceStorage interface { - storage.Storage - storage.Provider - ACLStorage() (storage.ListStorage, error) + storage2.Storage + storage2.Provider + ACLStorage() (storage2.ListStorage, error) SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) StoredIds() ([]string, error) Close() error diff --git a/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go b/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go index 6f1a272b..064ebf50 100644 --- a/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go +++ b/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go @@ -5,11 +5,11 @@ package mock_syncservice import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" reflect "reflect" spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - tree "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" gomock "github.com/golang/mock/gomock" ) diff --git a/common/commonspace/syncservice/requestfactory.go b/common/commonspace/syncservice/requestfactory.go index 1237653b..08332751 100644 --- a/common/commonspace/syncservice/requestfactory.go +++ b/common/commonspace/syncservice/requestfactory.go @@ -3,9 +3,9 @@ package syncservice import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" + "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" ) type RequestFactory interface { diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index d74645c4..6ac153b1 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -4,8 +4,8 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice" ) type syncHandler struct { diff --git a/common/commonspace/syncservice/synchandler_test.go b/common/commonspace/syncservice/synchandler_test.go index 3b16725e..a3d7a0dc 100644 --- a/common/commonspace/syncservice/synchandler_test.go +++ b/common/commonspace/syncservice/synchandler_test.go @@ -7,9 +7,9 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache/mock_cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/mock_syncservice" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - mock_tree "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree/mock_objecttree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree/mock_objecttree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" "sync" diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index ae4173b2..daa065b0 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -3,7 +3,7 @@ package syncservice import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpcerr" diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 14e05a3e..2623ea89 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -4,30 +4,30 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + tree2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" ) // SyncTree sends head updates to sync service and also sends new changes to update listener type SyncTree struct { - tree.ObjectTree + tree2.ObjectTree syncClient syncservice.SyncClient listener updatelistener.UpdateListener } -var createDerivedObjectTree = tree.CreateDerivedObjectTree -var createObjectTree = tree.CreateObjectTree -var buildObjectTree = tree.BuildObjectTree +var createDerivedObjectTree = tree2.CreateDerivedObjectTree +var createObjectTree = tree2.CreateObjectTree +var buildObjectTree = tree2.BuildObjectTree func DeriveSyncTree( ctx context.Context, - payload tree.ObjectTreeCreatePayload, + payload tree2.ObjectTreeCreatePayload, syncClient syncservice.SyncClient, listener updatelistener.UpdateListener, aclList list.ACLList, - createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { + createStorage storage.TreeStorageCreatorFunc) (t tree2.ObjectTree, err error) { t, err = createDerivedObjectTree(payload, aclList, createStorage) if err != nil { return @@ -45,11 +45,11 @@ func DeriveSyncTree( func CreateSyncTree( ctx context.Context, - payload tree.ObjectTreeCreatePayload, + payload tree2.ObjectTreeCreatePayload, syncClient syncservice.SyncClient, listener updatelistener.UpdateListener, aclList list.ACLList, - createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { + createStorage storage.TreeStorageCreatorFunc) (t tree2.ObjectTree, err error) { t, err = createObjectTree(payload, aclList, createStorage) if err != nil { return @@ -70,7 +70,7 @@ func BuildSyncTree( syncClient syncservice.SyncClient, treeStorage storage.TreeStorage, listener updatelistener.UpdateListener, - aclList list.ACLList) (t tree.ObjectTree, err error) { + aclList list.ACLList) (t tree2.ObjectTree, err error) { return buildSyncTree(ctx, syncClient, treeStorage, listener, aclList) } @@ -79,7 +79,7 @@ func buildSyncTree( syncClient syncservice.SyncClient, treeStorage storage.TreeStorage, listener updatelistener.UpdateListener, - aclList list.ACLList) (t tree.ObjectTree, err error) { + aclList list.ACLList) (t tree2.ObjectTree, err error) { t, err = buildObjectTree(treeStorage, aclList) if err != nil { return @@ -96,7 +96,7 @@ func buildSyncTree( return } -func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeContent) (res tree.AddResult, err error) { +func (s *SyncTree) AddContent(ctx context.Context, content tree2.SignableChangeContent) (res tree2.AddResult, err error) { res, err = s.ObjectTree.AddContent(ctx, content) if err != nil { return @@ -106,17 +106,17 @@ func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeCo return } -func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeproto.RawTreeChangeWithId) (res tree.AddResult, err error) { +func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeproto.RawTreeChangeWithId) (res tree2.AddResult, err error) { res, err = s.ObjectTree.AddRawChanges(ctx, changes...) if err != nil { return } switch res.Mode { - case tree.Nothing: + case tree2.Nothing: return - case tree.Append: + case tree2.Append: s.listener.Update(s) - case tree.Rebuild: + case tree2.Rebuild: s.listener.Rebuild(s) } @@ -125,6 +125,6 @@ func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeprot return } -func (s *SyncTree) Tree() tree.ObjectTree { +func (s *SyncTree) Tree() tree2.ObjectTree { return s } diff --git a/common/commonspace/synctree/synctree_test.go b/common/commonspace/synctree/synctree_test.go index ef1bd99f..04ec069d 100644 --- a/common/commonspace/synctree/synctree_test.go +++ b/common/commonspace/synctree/synctree_test.go @@ -7,20 +7,20 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/mock_syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener/mock_updatelistener" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list/mock_list" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage/mock_storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - mock_tree "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree/mock_objecttree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list/mock_list" + storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage/mock_storage" + tree2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree/mock_objecttree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" "testing" ) type syncTreeMatcher struct { - objTree tree.ObjectTree + objTree tree2.ObjectTree client syncservice.SyncClient listener updatelistener.UpdateListener } @@ -45,11 +45,11 @@ func Test_DeriveSyncTree(t *testing.T) { updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl) syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) aclListMock := mock_list.NewMockACLList(ctrl) - createStorage := storage.TreeStorageCreatorFunc(func(payload storage.TreeStorageCreatePayload) (storage.TreeStorage, error) { + createStorage := storage2.TreeStorageCreatorFunc(func(payload storage2.TreeStorageCreatePayload) (storage2.TreeStorage, error) { return nil, nil }) objTreeMock := mock_tree.NewMockObjectTree(ctrl) - createDerivedObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { + createDerivedObjectTree = func(payload tree2.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree2.ObjectTree, err error) { require.Equal(t, l, aclListMock) return objTreeMock, nil } @@ -57,7 +57,7 @@ func Test_DeriveSyncTree(t *testing.T) { syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) - _, err := DeriveSyncTree(ctx, tree.ObjectTreeCreatePayload{}, syncClientMock, updateListenerMock, aclListMock, createStorage) + _, err := DeriveSyncTree(ctx, tree2.ObjectTreeCreatePayload{}, syncClientMock, updateListenerMock, aclListMock, createStorage) require.NoError(t, err) } @@ -69,11 +69,11 @@ func Test_CreateSyncTree(t *testing.T) { updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl) syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) aclListMock := mock_list.NewMockACLList(ctrl) - createStorage := storage.TreeStorageCreatorFunc(func(payload storage.TreeStorageCreatePayload) (storage.TreeStorage, error) { + createStorage := storage2.TreeStorageCreatorFunc(func(payload storage2.TreeStorageCreatePayload) (storage2.TreeStorage, error) { return nil, nil }) objTreeMock := mock_tree.NewMockObjectTree(ctrl) - createObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { + createObjectTree = func(payload tree2.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree2.ObjectTree, err error) { require.Equal(t, l, aclListMock) return objTreeMock, nil } @@ -81,7 +81,7 @@ func Test_CreateSyncTree(t *testing.T) { syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) - _, err := CreateSyncTree(ctx, tree.ObjectTreeCreatePayload{}, syncClientMock, updateListenerMock, aclListMock, createStorage) + _, err := CreateSyncTree(ctx, tree2.ObjectTreeCreatePayload{}, syncClientMock, updateListenerMock, aclListMock, createStorage) require.NoError(t, err) } @@ -95,7 +95,7 @@ func Test_BuildSyncTree(t *testing.T) { aclListMock := mock_list.NewMockACLList(ctrl) storageMock := mock_storage.NewMockTreeStorage(ctrl) objTreeMock := mock_tree.NewMockObjectTree(ctrl) - buildObjectTree = func(store storage.TreeStorage, l list.ACLList) (objTree tree.ObjectTree, err error) { + buildObjectTree = func(store storage2.TreeStorage, l list.ACLList) (objTree tree2.ObjectTree, err error) { require.Equal(t, aclListMock, l) require.Equal(t, store, storageMock) return objTreeMock, nil @@ -109,9 +109,9 @@ func Test_BuildSyncTree(t *testing.T) { t.Run("AddRawChanges update", func(t *testing.T) { changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} - expectedRes := tree.AddResult{ + expectedRes := tree2.AddResult{ Added: changes, - Mode: tree.Append, + Mode: tree2.Append, } objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). Return(expectedRes, nil) @@ -126,9 +126,9 @@ func Test_BuildSyncTree(t *testing.T) { t.Run("AddRawChanges rebuild", func(t *testing.T) { changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} - expectedRes := tree.AddResult{ + expectedRes := tree2.AddResult{ Added: changes, - Mode: tree.Rebuild, + Mode: tree2.Rebuild, } objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). Return(expectedRes, nil) @@ -143,9 +143,9 @@ func Test_BuildSyncTree(t *testing.T) { t.Run("AddRawChanges nothing", func(t *testing.T) { changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} - expectedRes := tree.AddResult{ + expectedRes := tree2.AddResult{ Added: changes, - Mode: tree.Nothing, + Mode: tree2.Nothing, } objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). Return(expectedRes, nil) @@ -157,11 +157,11 @@ func Test_BuildSyncTree(t *testing.T) { t.Run("AddContent", func(t *testing.T) { changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} - content := tree.SignableChangeContent{ + content := tree2.SignableChangeContent{ Data: []byte("abcde"), } - expectedRes := tree.AddResult{ - Mode: tree.Append, + expectedRes := tree2.AddResult{ + Mode: tree2.Append, Added: changes, } objTreeMock.EXPECT().AddContent(gomock.Any(), gomock.Eq(content)). diff --git a/common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go b/common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go index cb88dd6a..d9c8c9b9 100644 --- a/common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go +++ b/common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go @@ -5,9 +5,9 @@ package mock_updatelistener import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" reflect "reflect" - tree "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" gomock "github.com/golang/mock/gomock" ) diff --git a/common/commonspace/synctree/updatelistener/updatelistener.go b/common/commonspace/synctree/updatelistener/updatelistener.go index 49f6e0d5..5d8f6e2f 100644 --- a/common/commonspace/synctree/updatelistener/updatelistener.go +++ b/common/commonspace/synctree/updatelistener/updatelistener.go @@ -1,7 +1,9 @@ //go:generate mockgen -destination mock_updatelistener/mock_updatelistener.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener UpdateListener package updatelistener -import "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" +) type UpdateListener interface { Update(tree tree.ObjectTree) diff --git a/config/account.go b/common/config/account.go similarity index 100% rename from config/account.go rename to common/config/account.go diff --git a/config/anytype.go b/common/config/anytype.go similarity index 100% rename from config/anytype.go rename to common/config/anytype.go diff --git a/config/api.go b/common/config/api.go similarity index 100% rename from config/api.go rename to common/config/api.go diff --git a/config/config.go b/common/config/config.go similarity index 87% rename from config/config.go rename to common/config/config.go index 4ac56519..cbd6b757 100644 --- a/config/config.go +++ b/common/config/config.go @@ -2,8 +2,8 @@ package config import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "gopkg.in/yaml.v3" "io/ioutil" ) diff --git a/config/grpc.go b/common/config/grpc.go similarity index 100% rename from config/grpc.go rename to common/config/grpc.go diff --git a/config/log.go b/common/config/log.go similarity index 91% rename from config/log.go rename to common/config/log.go index a09a8597..ca7bffea 100644 --- a/config/log.go +++ b/common/config/log.go @@ -1,7 +1,7 @@ package config import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "go.uber.org/zap" ) diff --git a/config/metric.go b/common/config/metric.go similarity index 100% rename from config/metric.go rename to common/config/metric.go diff --git a/config/nodes.go b/common/config/nodes.go similarity index 100% rename from config/nodes.go rename to common/config/nodes.go diff --git a/config/peer.go b/common/config/peer.go similarity index 100% rename from config/peer.go rename to common/config/peer.go diff --git a/config/space.go b/common/config/space.go similarity index 100% rename from config/space.go rename to common/config/space.go diff --git a/config/storage.go b/common/config/storage.go similarity index 100% rename from config/storage.go rename to common/config/storage.go diff --git a/common/metric/metric.go b/common/metric/metric.go index 522aaa06..64ecbd84 100644 --- a/common/metric/metric.go +++ b/common/metric/metric.go @@ -2,8 +2,8 @@ package metric import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" @@ -24,16 +24,16 @@ type Metric interface { type metric struct { registry *prometheus.Registry - config config.Metric + config config2.Metric } type configSource interface { - GetMetric() config.Metric + GetMetric() config2.Metric } func (m *metric) Init(a *app.App) (err error) { m.registry = prometheus.NewRegistry() - m.config = a.MustComponent(config.CName).(configSource).GetMetric() + m.config = a.MustComponent(config2.CName).(configSource).GetMetric() return nil } diff --git a/common/net/dialer/dialer.go b/common/net/dialer/dialer.go index 9de13e31..10de1176 100644 --- a/common/net/dialer/dialer.go +++ b/common/net/dialer/dialer.go @@ -3,11 +3,11 @@ package dialer import ( "context" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + "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/config" "github.com/libp2p/go-libp2p-core/sec" "go.uber.org/zap" "net" diff --git a/common/net/pool/pool.go b/common/net/pool/pool.go index dfd15e5d..c0cd6305 100644 --- a/common/net/pool/pool.go +++ b/common/net/pool/pool.go @@ -3,11 +3,11 @@ package pool import ( "context" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "math/rand" "time" ) diff --git a/common/net/pool/pool_test.go b/common/net/pool/pool_test.go index a7f4a528..2a9dce82 100644 --- a/common/net/pool/pool_test.go +++ b/common/net/pool/pool_test.go @@ -4,7 +4,7 @@ import ( "context" "errors" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/stretchr/testify/assert" diff --git a/common/net/rpc/server/drpcserver.go b/common/net/rpc/server/drpcserver.go index de466e88..74a41c0e 100644 --- a/common/net/rpc/server/drpcserver.go +++ b/common/net/rpc/server/drpcserver.go @@ -2,11 +2,11 @@ package server import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" secure2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" "github.com/prometheus/client_golang/prometheus" "github.com/zeebo/errs" "go.uber.org/zap" @@ -32,11 +32,11 @@ type DRPCServer interface { } type configGetter interface { - GetGRPCServer() config.GrpcServer + GetGRPCServer() config2.GrpcServer } type drpcServer struct { - config config.GrpcServer + config config2.GrpcServer drpcServer *drpcserver.Server transport secure2.Service listeners []secure2.ContextListener @@ -46,7 +46,7 @@ type drpcServer struct { } func (s *drpcServer) Init(a *app.App) (err error) { - s.config = a.MustComponent(config.CName).(configGetter).GetGRPCServer() + s.config = a.MustComponent(config2.CName).(configGetter).GetGRPCServer() s.transport = a.MustComponent(secure2.CName).(secure2.Service) s.metric = a.MustComponent(metric.CName).(metric.Metric) return nil diff --git a/common/net/secure/service.go b/common/net/secure/service.go index 3e70521d..51a92c0e 100644 --- a/common/net/secure/service.go +++ b/common/net/secure/service.go @@ -2,11 +2,11 @@ package secure import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/sec" libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls" diff --git a/common/nodeconf/service.go b/common/nodeconf/service.go index 66f6b6b3..6684b571 100644 --- a/common/nodeconf/service.go +++ b/common/nodeconf/service.go @@ -1,12 +1,12 @@ package nodeconf import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" + encryptionkey2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + signingkey2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-chash" ) @@ -36,8 +36,8 @@ type service struct { type Node struct { Address string PeerId string - SigningKey signingkey.PubKey - EncryptionKey encryptionkey.PubKey + SigningKey signingkey2.PubKey + EncryptionKey encryptionkey2.PubKey } func (n *Node) Id() string { @@ -49,7 +49,7 @@ func (n *Node) Capacity() float64 { } func (s *service) Init(a *app.App) (err error) { - conf := a.MustComponent(config.CName).(*config.Config) + conf := a.MustComponent(config2.CName).(*config2.Config) s.accountId = conf.Account.PeerId config := &configuration{ @@ -100,10 +100,10 @@ func (s *service) ConsensusPeers() []string { } func nodeFromConfigNode( - n config.Node) (*Node, error) { + n config2.Node) (*Node, error) { decodedSigningKey, err := keys.DecodeKeyFromString( n.SigningKey, - signingkey.UnmarshalEd25519PrivateKey, + signingkey2.UnmarshalEd25519PrivateKey, nil) if err != nil { return nil, err @@ -111,7 +111,7 @@ func nodeFromConfigNode( decodedEncryptionKey, err := keys.DecodeKeyFromString( n.EncryptionKey, - encryptionkey.NewEncryptionRsaPrivKeyFromBytes, + encryptionkey2.NewEncryptionRsaPrivKeyFromBytes, nil) if err != nil { return nil, err diff --git a/common/pkg/acl/account/accountdata.go b/common/pkg/acl/account/accountdata.go new file mode 100644 index 00000000..eea9d2f0 --- /dev/null +++ b/common/pkg/acl/account/accountdata.go @@ -0,0 +1,12 @@ +package account + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" +) + +type AccountData struct { // TODO: create a convenient constructor for this + Identity []byte // public key + SignKey signingkey.PrivKey + EncKey encryptionkey.PrivKey +} diff --git a/pkg/acl/aclrecordproto/aclreadkeyderive.go b/common/pkg/acl/aclrecordproto/aclreadkeyderive.go similarity index 73% rename from pkg/acl/aclrecordproto/aclreadkeyderive.go rename to common/pkg/acl/aclrecordproto/aclreadkeyderive.go index a09ba6ce..40acc8ec 100644 --- a/pkg/acl/aclrecordproto/aclreadkeyderive.go +++ b/common/pkg/acl/aclrecordproto/aclreadkeyderive.go @@ -1,6 +1,8 @@ package aclrecordproto -import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" +) func ACLReadKeyDerive(signKey []byte, encKey []byte) (*symmetric.Key, error) { concBuf := make([]byte, 0, len(signKey)+len(encKey)) diff --git a/pkg/acl/aclrecordproto/aclrecord.pb.go b/common/pkg/acl/aclrecordproto/aclrecord.pb.go similarity index 100% rename from pkg/acl/aclrecordproto/aclrecord.pb.go rename to common/pkg/acl/aclrecordproto/aclrecord.pb.go diff --git a/pkg/acl/aclrecordproto/protos/aclrecord.proto b/common/pkg/acl/aclrecordproto/protos/aclrecord.proto similarity index 100% rename from pkg/acl/aclrecordproto/protos/aclrecord.proto rename to common/pkg/acl/aclrecordproto/protos/aclrecord.proto diff --git a/common/pkg/acl/common/keychain.go b/common/pkg/acl/common/keychain.go new file mode 100644 index 00000000..b6de00b2 --- /dev/null +++ b/common/pkg/acl/common/keychain.go @@ -0,0 +1,28 @@ +package common + +import ( + signingkey2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" +) + +type Keychain struct { + keys map[string]signingkey2.PubKey +} + +func NewKeychain() *Keychain { + return &Keychain{ + keys: make(map[string]signingkey2.PubKey), + } +} + +func (k *Keychain) GetOrAdd(identity string) (signingkey2.PubKey, error) { + if key, exists := k.keys[identity]; exists { + return key, nil + } + res, err := signingkey2.NewSigningEd25519PubKeyFromBytes([]byte(identity)) + if err != nil { + return nil, err + } + + k.keys[identity] = res.(signingkey2.PubKey) + return res.(signingkey2.PubKey), nil +} diff --git a/pkg/acl/list/aclrecordbuilder.go b/common/pkg/acl/list/aclrecordbuilder.go similarity index 89% rename from pkg/acl/list/aclrecordbuilder.go rename to common/pkg/acl/list/aclrecordbuilder.go index 26c9e08f..64013f4a 100644 --- a/pkg/acl/list/aclrecordbuilder.go +++ b/common/pkg/acl/list/aclrecordbuilder.go @@ -1,9 +1,9 @@ package list import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid" "github.com/gogo/protobuf/proto" ) diff --git a/pkg/acl/list/aclstate.go b/common/pkg/acl/list/aclstate.go similarity index 75% rename from pkg/acl/list/aclstate.go rename to common/pkg/acl/list/aclstate.go index a8df8c53..8e9930db 100644 --- a/pkg/acl/list/aclstate.go +++ b/common/pkg/acl/list/aclstate.go @@ -4,12 +4,12 @@ import ( "bytes" "errors" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + aclrecordproto2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + signingkey2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" "github.com/gogo/protobuf/proto" "go.uber.org/zap" "hash/fnv" @@ -30,17 +30,17 @@ var ErrIncorrectRoot = errors.New("incorrect root") type UserPermissionPair struct { Identity string - Permission aclrecordproto.ACLUserPermissions + Permission aclrecordproto2.ACLUserPermissions } type ACLState struct { id string currentReadKeyHash uint64 userReadKeys map[uint64]*symmetric.Key - userStates map[string]*aclrecordproto.ACLUserState - userInvites map[string]*aclrecordproto.ACLUserInvite + userStates map[string]*aclrecordproto2.ACLUserState + userInvites map[string]*aclrecordproto2.ACLUserInvite encryptionKey encryptionkey.PrivKey - signingKey signingkey.PrivKey + signingKey signingkey2.PrivKey identity string permissionsAtRecord map[string][]UserPermissionPair @@ -50,7 +50,7 @@ type ACLState struct { func newACLStateWithKeys( id string, - signingKey signingkey.PrivKey, + signingKey signingkey2.PrivKey, encryptionKey encryptionkey.PrivKey) (*ACLState, error) { identity, err := signingKey.Raw() if err != nil { @@ -62,8 +62,8 @@ func newACLStateWithKeys( signingKey: signingKey, encryptionKey: encryptionKey, userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclrecordproto.ACLUserState), - userInvites: make(map[string]*aclrecordproto.ACLUserInvite), + userStates: make(map[string]*aclrecordproto2.ACLUserState), + userInvites: make(map[string]*aclrecordproto2.ACLUserInvite), permissionsAtRecord: make(map[string][]UserPermissionPair), }, nil } @@ -72,8 +72,8 @@ func newACLState(id string) *ACLState { return &ACLState{ id: id, userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclrecordproto.ACLUserState), - userInvites: make(map[string]*aclrecordproto.ACLUserInvite), + userStates: make(map[string]*aclrecordproto2.ACLUserState), + userInvites: make(map[string]*aclrecordproto2.ACLUserInvite), permissionsAtRecord: make(map[string][]UserPermissionPair), } } @@ -111,16 +111,16 @@ func (st *ACLState) PermissionsAtRecord(id string, identity string) (UserPermiss func (st *ACLState) applyRecord(record *ACLRecord) (err error) { if record.Id == st.id { - root, ok := record.Model.(*aclrecordproto.ACLRoot) + root, ok := record.Model.(*aclrecordproto2.ACLRoot) if !ok { return ErrIncorrectRoot } return st.applyRoot(root) } - aclData := &aclrecordproto.ACLData{} + aclData := &aclrecordproto2.ACLData{} if record.Model != nil { - aclData = record.Model.(*aclrecordproto.ACLData) + aclData = record.Model.(*aclrecordproto2.ACLData) } else { err = proto.Unmarshal(record.Data, aclData) if err != nil { @@ -148,7 +148,7 @@ func (st *ACLState) applyRecord(record *ACLRecord) (err error) { return nil } -func (st *ACLState) applyRoot(root *aclrecordproto.ACLRoot) (err error) { +func (st *ACLState) applyRoot(root *aclrecordproto2.ACLRoot) (err error) { if st.signingKey != nil && st.encryptionKey != nil { err = st.saveReadKeyFromRoot(root) if err != nil { @@ -157,16 +157,16 @@ func (st *ACLState) applyRoot(root *aclrecordproto.ACLRoot) (err error) { } // adding user to the list - userState := &aclrecordproto.ACLUserState{ + userState := &aclrecordproto2.ACLUserState{ Identity: root.Identity, EncryptionKey: root.EncryptionKey, - Permissions: aclrecordproto.ACLUserPermissions_Admin, + Permissions: aclrecordproto2.ACLUserPermissions_Admin, } st.userStates[string(root.Identity)] = userState return } -func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error) { +func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto2.ACLRoot) (err error) { var readKey *symmetric.Key if len(root.GetDerivationScheme()) != 0 { var encPubKey []byte @@ -175,7 +175,7 @@ func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error return } - readKey, err = aclrecordproto.ACLReadKeyDerive([]byte(st.identity), encPubKey) + readKey, err = aclrecordproto2.ACLReadKeyDerive([]byte(st.identity), encPubKey) if err != nil { return } @@ -199,7 +199,7 @@ func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error return } -func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uint64, identity []byte) (err error) { +func (st *ACLState) applyChangeData(changeData *aclrecordproto2.ACLData, hash uint64, identity []byte) (err error) { defer func() { if err != nil { return @@ -214,7 +214,7 @@ func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uin return } - if !st.hasPermission(identity, aclrecordproto.ACLUserPermissions_Admin) { + if !st.hasPermission(identity, aclrecordproto2.ACLUserPermissions_Admin) { err = fmt.Errorf("user %s must have admin permissions", identity) return } @@ -230,7 +230,7 @@ func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uin return nil } -func (st *ACLState) applyChangeContent(ch *aclrecordproto.ACLContentValue) error { +func (st *ACLState) applyChangeContent(ch *aclrecordproto2.ACLContentValue) error { switch { case ch.GetUserPermissionChange() != nil: return st.applyUserPermissionChange(ch.GetUserPermissionChange()) @@ -247,7 +247,7 @@ func (st *ACLState) applyChangeContent(ch *aclrecordproto.ACLContentValue) error } } -func (st *ACLState) applyUserPermissionChange(ch *aclrecordproto.ACLUserPermissionChange) error { +func (st *ACLState) applyUserPermissionChange(ch *aclrecordproto2.ACLUserPermissionChange) error { chIdentity := string(ch.Identity) state, exists := st.userStates[chIdentity] if !exists { @@ -258,12 +258,12 @@ func (st *ACLState) applyUserPermissionChange(ch *aclrecordproto.ACLUserPermissi return nil } -func (st *ACLState) applyUserInvite(ch *aclrecordproto.ACLUserInvite) error { +func (st *ACLState) applyUserInvite(ch *aclrecordproto2.ACLUserInvite) error { st.userInvites[ch.InviteId] = ch return nil } -func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error { +func (st *ACLState) applyUserJoin(ch *aclrecordproto2.ACLUserJoin) error { invite, exists := st.userInvites[ch.InviteId] if !exists { return fmt.Errorf("no such invite with id %s", ch.InviteId) @@ -276,12 +276,12 @@ func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error { // validating signature signature := ch.GetAcceptSignature() - verificationKey, err := signingkey.NewSigningEd25519PubKeyFromBytes(invite.AcceptPublicKey) + verificationKey, err := signingkey2.NewSigningEd25519PubKeyFromBytes(invite.AcceptPublicKey) if err != nil { return fmt.Errorf("public key verifying invite accepts is given in incorrect format: %v", err) } - res, err := verificationKey.(signingkey.PubKey).Verify(ch.Identity, signature) + res, err := verificationKey.(signingkey2.PubKey).Verify(ch.Identity, signature) if err != nil { return fmt.Errorf("verification returned error: %w", err) } @@ -302,7 +302,7 @@ func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error { } // adding user to the list - userState := &aclrecordproto.ACLUserState{ + userState := &aclrecordproto2.ACLUserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, Permissions: invite.Permissions, @@ -311,13 +311,13 @@ func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error { return nil } -func (st *ACLState) applyUserAdd(ch *aclrecordproto.ACLUserAdd) error { +func (st *ACLState) applyUserAdd(ch *aclrecordproto2.ACLUserAdd) error { chIdentity := string(ch.Identity) if _, exists := st.userStates[chIdentity]; exists { return ErrUserAlreadyExists } - st.userStates[chIdentity] = &aclrecordproto.ACLUserState{ + st.userStates[chIdentity] = &aclrecordproto2.ACLUserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, Permissions: ch.Permissions, @@ -337,7 +337,7 @@ func (st *ACLState) applyUserAdd(ch *aclrecordproto.ACLUserAdd) error { return nil } -func (st *ACLState) applyUserRemove(ch *aclrecordproto.ACLUserRemove) error { +func (st *ACLState) applyUserRemove(ch *aclrecordproto2.ACLUserRemove) error { chIdentity := string(ch.Identity) if chIdentity == st.identity { return ErrDocumentForbidden @@ -381,7 +381,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 aclrecordproto2.ACLUserPermissions) bool { state, exists := st.userStates[string(identity)] if !exists { return false @@ -390,17 +390,17 @@ func (st *ACLState) hasPermission(identity []byte, permission aclrecordproto.ACL return state.Permissions == permission } -func (st *ACLState) isUserJoin(data *aclrecordproto.ACLData) bool { +func (st *ACLState) isUserJoin(data *aclrecordproto2.ACLData) bool { // if we have a UserJoin, then it should always be the first one applied return data.GetAclContent() != nil && data.GetAclContent()[0].GetUserJoin() != nil } -func (st *ACLState) isUserAdd(data *aclrecordproto.ACLData, identity []byte) bool { +func (st *ACLState) isUserAdd(data *aclrecordproto2.ACLData, identity []byte) bool { // if we have a UserAdd, then it should always be the first one applied userAdd := data.GetAclContent()[0].GetUserAdd() return data.GetAclContent() != nil && userAdd != nil && bytes.Compare(userAdd.GetIdentity(), identity) == 0 } -func (st *ACLState) GetUserStates() map[string]*aclrecordproto.ACLUserState { +func (st *ACLState) GetUserStates() map[string]*aclrecordproto2.ACLUserState { return st.userStates } diff --git a/pkg/acl/list/aclstatebuilder.go b/common/pkg/acl/list/aclstatebuilder.go similarity index 75% rename from pkg/acl/list/aclstatebuilder.go rename to common/pkg/acl/list/aclstatebuilder.go index 75b606af..1b847865 100644 --- a/pkg/acl/list/aclstatebuilder.go +++ b/common/pkg/acl/list/aclstatebuilder.go @@ -1,9 +1,9 @@ package list import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" ) type aclStateBuilder struct { diff --git a/pkg/acl/list/list.go b/common/pkg/acl/list/list.go similarity index 92% rename from pkg/acl/list/list.go rename to common/pkg/acl/list/list.go index 382ecf4e..3e6794ff 100644 --- a/pkg/acl/list/list.go +++ b/common/pkg/acl/list/list.go @@ -5,10 +5,10 @@ import ( "context" "errors" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "sync" ) diff --git a/pkg/acl/list/list_test.go b/common/pkg/acl/list/list_test.go similarity index 94% rename from pkg/acl/list/list_test.go rename to common/pkg/acl/list/list_test.go index 13019b21..668c2d5f 100644 --- a/pkg/acl/list/list_test.go +++ b/common/pkg/acl/list/list_test.go @@ -1,8 +1,8 @@ package list import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/acllistbuilder" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" diff --git a/pkg/acl/list/mock_list/mock_list.go b/common/pkg/acl/list/mock_list/mock_list.go similarity index 89% rename from pkg/acl/list/mock_list/mock_list.go rename to common/pkg/acl/list/mock_list/mock_list.go index e4c7cc6e..a28edf2b 100644 --- a/pkg/acl/list/mock_list/mock_list.go +++ b/common/pkg/acl/list/mock_list/mock_list.go @@ -5,10 +5,10 @@ package mock_list import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + list2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" reflect "reflect" - aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - list "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" gomock "github.com/golang/mock/gomock" ) @@ -36,10 +36,10 @@ func (m *MockACLList) EXPECT() *MockACLListMockRecorder { } // ACLState mocks base method. -func (m *MockACLList) ACLState() *list.ACLState { +func (m *MockACLList) ACLState() *list2.ACLState { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ACLState") - ret0, _ := ret[0].(*list.ACLState) + ret0, _ := ret[0].(*list2.ACLState) return ret0 } @@ -64,10 +64,10 @@ func (mr *MockACLListMockRecorder) Close() *gomock.Call { } // Get mocks base method. -func (m *MockACLList) Get(arg0 string) (*list.ACLRecord, error) { +func (m *MockACLList) Get(arg0 string) (*list2.ACLRecord, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Get", arg0) - ret0, _ := ret[0].(*list.ACLRecord) + ret0, _ := ret[0].(*list2.ACLRecord) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -79,10 +79,10 @@ func (mr *MockACLListMockRecorder) Get(arg0 interface{}) *gomock.Call { } // Head mocks base method. -func (m *MockACLList) Head() *list.ACLRecord { +func (m *MockACLList) Head() *list2.ACLRecord { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Head") - ret0, _ := ret[0].(*list.ACLRecord) + ret0, _ := ret[0].(*list2.ACLRecord) return ret0 } @@ -122,7 +122,7 @@ func (mr *MockACLListMockRecorder) IsAfter(arg0, arg1 interface{}) *gomock.Call } // Iterate mocks base method. -func (m *MockACLList) Iterate(arg0 func(*list.ACLRecord) bool) { +func (m *MockACLList) Iterate(arg0 func(*list2.ACLRecord) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "Iterate", arg0) } @@ -134,7 +134,7 @@ func (mr *MockACLListMockRecorder) Iterate(arg0 interface{}) *gomock.Call { } // IterateFrom mocks base method. -func (m *MockACLList) IterateFrom(arg0 string, arg1 func(*list.ACLRecord) bool) { +func (m *MockACLList) IterateFrom(arg0 string, arg1 func(*list2.ACLRecord) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "IterateFrom", arg0, arg1) } @@ -182,10 +182,10 @@ func (mr *MockACLListMockRecorder) RUnlock() *gomock.Call { } // Records mocks base method. -func (m *MockACLList) Records() []*list.ACLRecord { +func (m *MockACLList) Records() []*list2.ACLRecord { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Records") - ret0, _ := ret[0].([]*list.ACLRecord) + ret0, _ := ret[0].([]*list2.ACLRecord) return ret0 } diff --git a/pkg/acl/list/record.go b/common/pkg/acl/list/record.go similarity index 100% rename from pkg/acl/list/record.go rename to common/pkg/acl/list/record.go diff --git a/pkg/acl/storage/helpers.go b/common/pkg/acl/storage/helpers.go similarity index 100% rename from pkg/acl/storage/helpers.go rename to common/pkg/acl/storage/helpers.go diff --git a/pkg/acl/storage/inmemory.go b/common/pkg/acl/storage/inmemory.go similarity index 95% rename from pkg/acl/storage/inmemory.go rename to common/pkg/acl/storage/inmemory.go index a992e84a..11843de7 100644 --- a/pkg/acl/storage/inmemory.go +++ b/common/pkg/acl/storage/inmemory.go @@ -3,8 +3,8 @@ package storage import ( "context" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "sync" ) diff --git a/pkg/acl/storage/liststorage.go b/common/pkg/acl/storage/liststorage.go similarity index 88% rename from pkg/acl/storage/liststorage.go rename to common/pkg/acl/storage/liststorage.go index 4ce5f814..02fd7ca3 100644 --- a/pkg/acl/storage/liststorage.go +++ b/common/pkg/acl/storage/liststorage.go @@ -4,7 +4,7 @@ package storage import ( "context" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" ) var ErrUnknownACLId = errors.New("acl does not exist") diff --git a/pkg/acl/storage/mock_storage/mock_storage.go b/common/pkg/acl/storage/mock_storage/mock_storage.go similarity index 97% rename from pkg/acl/storage/mock_storage/mock_storage.go rename to common/pkg/acl/storage/mock_storage/mock_storage.go index 0bfa22e8..4c1a298c 100644 --- a/pkg/acl/storage/mock_storage/mock_storage.go +++ b/common/pkg/acl/storage/mock_storage/mock_storage.go @@ -6,10 +6,10 @@ package mock_storage import ( context "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" reflect "reflect" - aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" gomock "github.com/golang/mock/gomock" ) diff --git a/pkg/acl/storage/provider.go b/common/pkg/acl/storage/provider.go similarity index 85% rename from pkg/acl/storage/provider.go rename to common/pkg/acl/storage/provider.go index 1d40cb30..da46ab41 100644 --- a/pkg/acl/storage/provider.go +++ b/common/pkg/acl/storage/provider.go @@ -2,7 +2,7 @@ package storage import ( "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" ) var ErrUnknownTreeId = errors.New("tree does not exist") diff --git a/pkg/acl/storage/storage.go b/common/pkg/acl/storage/storage.go similarity index 100% rename from pkg/acl/storage/storage.go rename to common/pkg/acl/storage/storage.go diff --git a/pkg/acl/storage/treestorage.go b/common/pkg/acl/storage/treestorage.go similarity index 84% rename from pkg/acl/storage/treestorage.go rename to common/pkg/acl/storage/treestorage.go index 25b91e46..76332399 100644 --- a/pkg/acl/storage/treestorage.go +++ b/common/pkg/acl/storage/treestorage.go @@ -2,7 +2,7 @@ package storage import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" ) type TreeStorage interface { diff --git a/pkg/acl/testutils/acllistbuilder/keychain.go b/common/pkg/acl/testutils/acllistbuilder/keychain.go similarity index 75% rename from pkg/acl/testutils/acllistbuilder/keychain.go rename to common/pkg/acl/testutils/acllistbuilder/keychain.go index c893a665..db7fb0a6 100644 --- a/pkg/acl/testutils/acllistbuilder/keychain.go +++ b/common/pkg/acl/testutils/acllistbuilder/keychain.go @@ -1,14 +1,13 @@ package acllistbuilder import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" + encryptionkey2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + signingkey2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" "hash/fnv" "strings" - - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" ) type SymKey struct { @@ -17,9 +16,9 @@ type SymKey struct { } type YAMLKeychain struct { - SigningKeysByYAMLIdentity map[string]signingkey.PrivKey - SigningKeysByRealIdentity map[string]signingkey.PrivKey - EncryptionKeysByYAMLIdentity map[string]encryptionkey.PrivKey + SigningKeysByYAMLIdentity map[string]signingkey2.PrivKey + SigningKeysByRealIdentity map[string]signingkey2.PrivKey + EncryptionKeysByYAMLIdentity map[string]encryptionkey2.PrivKey ReadKeysByYAMLIdentity map[string]*SymKey ReadKeysByHash map[uint64]*SymKey GeneratedIdentities map[string]string @@ -28,9 +27,9 @@ type YAMLKeychain struct { func NewKeychain() *YAMLKeychain { return &YAMLKeychain{ - SigningKeysByYAMLIdentity: map[string]signingkey.PrivKey{}, - SigningKeysByRealIdentity: map[string]signingkey.PrivKey{}, - EncryptionKeysByYAMLIdentity: map[string]encryptionkey.PrivKey{}, + SigningKeysByYAMLIdentity: map[string]signingkey2.PrivKey{}, + SigningKeysByRealIdentity: map[string]signingkey2.PrivKey{}, + EncryptionKeysByYAMLIdentity: map[string]encryptionkey2.PrivKey{}, GeneratedIdentities: map[string]string{}, ReadKeysByYAMLIdentity: map[string]*SymKey{}, ReadKeysByHash: map[uint64]*SymKey{}, @@ -57,16 +56,16 @@ func (k *YAMLKeychain) AddEncryptionKey(key *Key) { return } var ( - newPrivKey encryptionkey.PrivKey + newPrivKey encryptionkey2.PrivKey err error ) if key.Value == "generated" { - newPrivKey, _, err = encryptionkey.GenerateRandomRSAKeyPair(2048) + newPrivKey, _, err = encryptionkey2.GenerateRandomRSAKeyPair(2048) if err != nil { panic(err) } } else { - newPrivKey, err = keys.DecodeKeyFromString(key.Value, encryptionkey.NewEncryptionRsaPrivKeyFromBytes, nil) + newPrivKey, err = keys.DecodeKeyFromString(key.Value, encryptionkey2.NewEncryptionRsaPrivKeyFromBytes, nil) if err != nil { panic(err) } @@ -79,17 +78,17 @@ func (k *YAMLKeychain) AddSigningKey(key *Key) { return } var ( - newPrivKey signingkey.PrivKey - pubKey signingkey.PubKey + newPrivKey signingkey2.PrivKey + pubKey signingkey2.PubKey err error ) if key.Value == "generated" { - newPrivKey, pubKey, err = signingkey.GenerateRandomEd25519KeyPair() + newPrivKey, pubKey, err = signingkey2.GenerateRandomEd25519KeyPair() if err != nil { panic(err) } } else { - newPrivKey, err = keys.DecodeKeyFromString(key.Value, signingkey.NewSigningEd25519PrivKeyFromBytes, nil) + newPrivKey, err = keys.DecodeKeyFromString(key.Value, signingkey2.NewSigningEd25519PrivKeyFromBytes, nil) if err != nil { panic(err) } diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go similarity index 74% rename from pkg/acl/testutils/acllistbuilder/liststoragebuilder.go rename to common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index 7c0f4565..cf515bfd 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -3,12 +3,12 @@ package acllistbuilder import ( "context" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/yamltests" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + aclrecordproto2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/yamltests" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "hash/fnv" "io/ioutil" "path" @@ -20,18 +20,18 @@ import ( type ACLListStorageBuilder struct { aclList string - records []*aclrecordproto.ACLRecord - rawRecords []*aclrecordproto.RawACLRecordWithId + records []*aclrecordproto2.ACLRecord + rawRecords []*aclrecordproto2.RawACLRecordWithId indexes map[string]int keychain *YAMLKeychain - rawRoot *aclrecordproto.RawACLRecordWithId - root *aclrecordproto.ACLRoot + rawRoot *aclrecordproto2.RawACLRecordWithId + root *aclrecordproto2.ACLRoot id string } func NewACLListStorageBuilder(keychain *YAMLKeychain) *ACLListStorageBuilder { return &ACLListStorageBuilder{ - records: make([]*aclrecordproto.ACLRecord, 0), + records: make([]*aclrecordproto2.ACLRecord, 0), indexes: make(map[string]int), keychain: keychain, } @@ -60,7 +60,7 @@ func NewACLListStorageBuilderFromFile(file string) (*ACLListStorageBuilder, erro return tb, nil } -func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) *aclrecordproto.RawACLRecordWithId { +func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) *aclrecordproto2.RawACLRecordWithId { protoMarshalled, err := rec.Marshal() if err != nil { panic("should be able to marshal final acl message!") @@ -71,7 +71,7 @@ func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) panic("should be able to sign final acl message!") } - rawRec := &aclrecordproto.RawACLRecord{ + rawRec := &aclrecordproto2.RawACLRecord{ Payload: protoMarshalled, Signature: signature, } @@ -83,7 +83,7 @@ func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) id, _ := cid.NewCIDFromBytes(rawMarshalled) - return &aclrecordproto.RawACLRecordWithId{ + return &aclrecordproto2.RawACLRecordWithId{ Payload: rawMarshalled, Id: id, } @@ -101,11 +101,11 @@ func (t *ACLListStorageBuilder) SetHead(headId string) error { panic("SetHead is not implemented") } -func (t *ACLListStorageBuilder) Root() (*aclrecordproto.RawACLRecordWithId, error) { +func (t *ACLListStorageBuilder) Root() (*aclrecordproto2.RawACLRecordWithId, error) { return t.rawRoot, nil } -func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error) { +func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*aclrecordproto2.RawACLRecordWithId, error) { recIdx, ok := t.indexes[id] if !ok { if id == t.rawRoot.Id { @@ -116,7 +116,7 @@ func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*a return t.rawRecords[recIdx], nil } -func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { +func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclrecordproto2.RawACLRecordWithId) error { panic("implement me") } @@ -124,7 +124,7 @@ func (t *ACLListStorageBuilder) ID() (string, error) { return t.id, nil } -func (t *ACLListStorageBuilder) GetRawRecords() []*aclrecordproto.RawACLRecordWithId { +func (t *ACLListStorageBuilder) GetRawRecords() []*aclrecordproto2.RawACLRecordWithId { return t.rawRecords } @@ -149,19 +149,19 @@ func (t *ACLListStorageBuilder) Parse(tree *YMLList) { } } -func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclrecordproto.ACLRecord { +func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclrecordproto2.ACLRecord { k := t.keychain.GetKey(rec.ReadKey).(*SymKey) - var aclChangeContents []*aclrecordproto.ACLContentValue + var aclChangeContents []*aclrecordproto2.ACLContentValue for _, ch := range rec.AclChanges { aclChangeContent := t.parseACLChange(ch) aclChangeContents = append(aclChangeContents, aclChangeContent) } - data := &aclrecordproto.ACLData{ + data := &aclrecordproto2.ACLData{ AclContent: aclChangeContents, } bytes, _ := data.Marshal() - return &aclrecordproto.ACLRecord{ + return &aclrecordproto2.ACLRecord{ PrevId: prevId, Identity: []byte(t.keychain.GetIdentity(rec.Identity)), Data: bytes, @@ -170,7 +170,7 @@ func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclreco } } -func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecordproto.ACLContentValue) { +func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecordproto2.ACLContentValue) { switch { case ch.UserAdd != nil: add := ch.UserAdd @@ -178,9 +178,9 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord encKey := t.keychain.GetKey(add.EncryptionKey).(encryptionkey.PrivKey) rawKey, _ := encKey.GetPublic().Raw() - convCh = &aclrecordproto.ACLContentValue{ - Value: &aclrecordproto.ACLContentValue_UserAdd{ - UserAdd: &aclrecordproto.ACLUserAdd{ + convCh = &aclrecordproto2.ACLContentValue{ + Value: &aclrecordproto2.ACLContentValue_UserAdd{ + UserAdd: &aclrecordproto2.ACLUserAdd{ Identity: []byte(t.keychain.GetIdentity(add.Identity)), EncryptionKey: rawKey, EncryptedReadKeys: t.encryptReadKeys(add.EncryptedReadKeys, encKey), @@ -202,9 +202,9 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord panic(err) } - convCh = &aclrecordproto.ACLContentValue{ - Value: &aclrecordproto.ACLContentValue_UserJoin{ - UserJoin: &aclrecordproto.ACLUserJoin{ + convCh = &aclrecordproto2.ACLContentValue{ + Value: &aclrecordproto2.ACLContentValue_UserJoin{ + UserJoin: &aclrecordproto2.ACLUserJoin{ Identity: []byte(t.keychain.GetIdentity(join.Identity)), EncryptionKey: rawKey, AcceptSignature: signature, @@ -220,9 +220,9 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord GetKey(invite.EncryptionKey).(encryptionkey.PrivKey) rawEncKey, _ := encKey.GetPublic().Raw() - convCh = &aclrecordproto.ACLContentValue{ - Value: &aclrecordproto.ACLContentValue_UserInvite{ - UserInvite: &aclrecordproto.ACLUserInvite{ + convCh = &aclrecordproto2.ACLContentValue{ + Value: &aclrecordproto2.ACLContentValue_UserInvite{ + UserInvite: &aclrecordproto2.ACLUserInvite{ AcceptPublicKey: rawAcceptKey, EncryptPublicKey: rawEncKey, EncryptedReadKeys: t.encryptReadKeys(invite.EncryptedReadKeys, encKey), @@ -234,9 +234,9 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord case ch.UserPermissionChange != nil: permissionChange := ch.UserPermissionChange - convCh = &aclrecordproto.ACLContentValue{ - Value: &aclrecordproto.ACLContentValue_UserPermissionChange{ - UserPermissionChange: &aclrecordproto.ACLUserPermissionChange{ + convCh = &aclrecordproto2.ACLContentValue{ + Value: &aclrecordproto2.ACLContentValue_UserPermissionChange{ + UserPermissionChange: &aclrecordproto2.ACLUserPermissionChange{ Identity: []byte(t.keychain.GetIdentity(permissionChange.Identity)), Permissions: t.convertPermission(permissionChange.Permission), }, @@ -247,7 +247,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord newReadKey := t.keychain.GetKey(remove.NewReadKey).(*SymKey) - var replaces []*aclrecordproto.ACLReadKeyReplace + var replaces []*aclrecordproto2.ACLReadKeyReplace for _, id := range remove.IdentitiesLeft { encKey := t.keychain.EncryptionKeysByYAMLIdentity[id] rawEncKey, _ := encKey.GetPublic().Raw() @@ -255,16 +255,16 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord if err != nil { panic(err) } - replaces = append(replaces, &aclrecordproto.ACLReadKeyReplace{ + replaces = append(replaces, &aclrecordproto2.ACLReadKeyReplace{ Identity: []byte(t.keychain.GetIdentity(id)), EncryptionKey: rawEncKey, EncryptedReadKey: encReadKey, }) } - convCh = &aclrecordproto.ACLContentValue{ - Value: &aclrecordproto.ACLContentValue_UserRemove{ - UserRemove: &aclrecordproto.ACLUserRemove{ + convCh = &aclrecordproto2.ACLContentValue{ + Value: &aclrecordproto2.ACLContentValue_UserRemove{ + UserRemove: &aclrecordproto2.ACLUserRemove{ Identity: []byte(t.keychain.GetIdentity(remove.RemovedIdentity)), ReadKeyReplaces: replaces, }, @@ -291,20 +291,20 @@ func (t *ACLListStorageBuilder) encryptReadKeys(keys []string, encKey encryption return } -func (t *ACLListStorageBuilder) convertPermission(perm string) aclrecordproto.ACLUserPermissions { +func (t *ACLListStorageBuilder) convertPermission(perm string) aclrecordproto2.ACLUserPermissions { switch perm { case "admin": - return aclrecordproto.ACLUserPermissions_Admin + return aclrecordproto2.ACLUserPermissions_Admin case "writer": - return aclrecordproto.ACLUserPermissions_Writer + return aclrecordproto2.ACLUserPermissions_Writer case "reader": - return aclrecordproto.ACLUserPermissions_Reader + return aclrecordproto2.ACLUserPermissions_Reader default: panic(fmt.Sprintf("incorrect permission: %s", perm)) } } -func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclrecordproto.ACLRecord, id string) error) (err error) { +func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclrecordproto2.ACLRecord, id string) error) (err error) { for i := len(t.records) - 1; i >= 0; i-- { err = f(t.records[i], t.rawRecords[i].Id) if err != nil { @@ -317,10 +317,10 @@ func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclrecordproto.ACLR func (t *ACLListStorageBuilder) parseRoot(root *Root) { rawSignKey, _ := t.keychain.SigningKeysByYAMLIdentity[root.Identity].GetPublic().Raw() rawEncKey, _ := t.keychain.EncryptionKeysByYAMLIdentity[root.Identity].GetPublic().Raw() - readKey, _ := aclrecordproto.ACLReadKeyDerive(rawSignKey, rawEncKey) + readKey, _ := aclrecordproto2.ACLReadKeyDerive(rawSignKey, rawEncKey) hasher := fnv.New64() hasher.Write(readKey.Bytes()) - t.root = &aclrecordproto.ACLRoot{ + t.root = &aclrecordproto2.ACLRoot{ Identity: rawSignKey, EncryptionKey: rawEncKey, SpaceId: root.SpaceId, diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph.go b/common/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph.go similarity index 100% rename from pkg/acl/testutils/acllistbuilder/liststoragebuildergraph.go rename to common/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph.go diff --git a/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go b/common/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go similarity index 96% rename from pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go rename to common/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go index 34b6fc92..ba2679f3 100644 --- a/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go +++ b/common/pkg/acl/testutils/acllistbuilder/liststoragebuildergraph_nix.go @@ -9,8 +9,7 @@ package acllistbuilder import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" "github.com/gogo/protobuf/proto" "strings" "unicode" diff --git a/pkg/acl/testutils/acllistbuilder/ymlentities.go b/common/pkg/acl/testutils/acllistbuilder/ymlentities.go similarity index 100% rename from pkg/acl/testutils/acllistbuilder/ymlentities.go rename to common/pkg/acl/testutils/acllistbuilder/ymlentities.go diff --git a/pkg/acl/testutils/testchanges/proto/test.pb.go b/common/pkg/acl/testutils/testchanges/proto/test.pb.go similarity index 100% rename from pkg/acl/testutils/testchanges/proto/test.pb.go rename to common/pkg/acl/testutils/testchanges/proto/test.pb.go diff --git a/pkg/acl/testutils/testchanges/proto/test.proto b/common/pkg/acl/testutils/testchanges/proto/test.proto similarity index 100% rename from pkg/acl/testutils/testchanges/proto/test.proto rename to common/pkg/acl/testutils/testchanges/proto/test.proto diff --git a/pkg/acl/testutils/yamltests/path.go b/common/pkg/acl/testutils/yamltests/path.go similarity index 100% rename from pkg/acl/testutils/yamltests/path.go rename to common/pkg/acl/testutils/yamltests/path.go diff --git a/pkg/acl/testutils/yamltests/userjoinexample.yml b/common/pkg/acl/testutils/yamltests/userjoinexample.yml similarity index 100% rename from pkg/acl/testutils/yamltests/userjoinexample.yml rename to common/pkg/acl/testutils/yamltests/userjoinexample.yml diff --git a/pkg/acl/testutils/yamltests/userremoveexample.yml b/common/pkg/acl/testutils/yamltests/userremoveexample.yml similarity index 100% rename from pkg/acl/testutils/yamltests/userremoveexample.yml rename to common/pkg/acl/testutils/yamltests/userremoveexample.yml diff --git a/pkg/acl/tree/change.go b/common/pkg/acl/tree/change.go similarity index 93% rename from pkg/acl/tree/change.go rename to common/pkg/acl/tree/change.go index 43e9f654..308ee958 100644 --- a/pkg/acl/tree/change.go +++ b/common/pkg/acl/tree/change.go @@ -2,7 +2,7 @@ package tree import ( "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" ) var ( diff --git a/pkg/acl/tree/changebuilder.go b/common/pkg/acl/tree/changebuilder.go similarity index 93% rename from pkg/acl/tree/changebuilder.go rename to common/pkg/acl/tree/changebuilder.go index 885dff34..9fd5c106 100644 --- a/pkg/acl/tree/changebuilder.go +++ b/common/pkg/acl/tree/changebuilder.go @@ -2,11 +2,11 @@ package tree import ( "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" "github.com/gogo/protobuf/proto" "time" ) diff --git a/pkg/acl/tree/changevalidator.go b/common/pkg/acl/tree/changevalidator.go similarity index 75% rename from pkg/acl/tree/changevalidator.go rename to common/pkg/acl/tree/changevalidator.go index 220eccb3..cd0b1234 100644 --- a/pkg/acl/tree/changevalidator.go +++ b/common/pkg/acl/tree/changevalidator.go @@ -2,15 +2,15 @@ package tree import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + list2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" ) type ObjectTreeValidator interface { // ValidateFullTree should always be entered while holding a read lock on ACLList - ValidateFullTree(tree *Tree, aclList list.ACLList) error + ValidateFullTree(tree *Tree, aclList list2.ACLList) error // ValidateNewChanges should always be entered while holding a read lock on ACLList - ValidateNewChanges(tree *Tree, aclList list.ACLList, newChanges []*Change) error + ValidateNewChanges(tree *Tree, aclList list2.ACLList, newChanges []*Change) error } type objectTreeValidator struct{} @@ -19,7 +19,7 @@ func newTreeValidator() ObjectTreeValidator { return &objectTreeValidator{} } -func (v *objectTreeValidator) ValidateFullTree(tree *Tree, aclList list.ACLList) (err error) { +func (v *objectTreeValidator) ValidateFullTree(tree *Tree, aclList list2.ACLList) (err error) { tree.Iterate(tree.RootId(), func(c *Change) (isContinue bool) { err = v.validateChange(tree, aclList, c) return err == nil @@ -27,7 +27,7 @@ func (v *objectTreeValidator) ValidateFullTree(tree *Tree, aclList list.ACLList) return err } -func (v *objectTreeValidator) ValidateNewChanges(tree *Tree, aclList list.ACLList, newChanges []*Change) (err error) { +func (v *objectTreeValidator) ValidateNewChanges(tree *Tree, aclList list2.ACLList, newChanges []*Change) (err error) { for _, c := range newChanges { err = v.validateChange(tree, aclList, c) if err != nil { @@ -37,9 +37,9 @@ func (v *objectTreeValidator) ValidateNewChanges(tree *Tree, aclList list.ACLLis return } -func (v *objectTreeValidator) validateChange(tree *Tree, aclList list.ACLList, c *Change) (err error) { +func (v *objectTreeValidator) validateChange(tree *Tree, aclList list2.ACLList, c *Change) (err error) { var ( - perm list.UserPermissionPair + perm list2.UserPermissionPair state = aclList.ACLState() ) // checking if the user could write @@ -49,7 +49,7 @@ func (v *objectTreeValidator) validateChange(tree *Tree, aclList list.ACLList, c } if perm.Permission != aclrecordproto.ACLUserPermissions_Writer && perm.Permission != aclrecordproto.ACLUserPermissions_Admin { - err = list.ErrInsufficientPermissions + err = list2.ErrInsufficientPermissions return } diff --git a/pkg/acl/tree/descriptionparser.go b/common/pkg/acl/tree/descriptionparser.go similarity index 100% rename from pkg/acl/tree/descriptionparser.go rename to common/pkg/acl/tree/descriptionparser.go diff --git a/pkg/acl/tree/mock_objecttree/mock_objecttree.go b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go similarity index 93% rename from pkg/acl/tree/mock_objecttree/mock_objecttree.go rename to common/pkg/acl/tree/mock_objecttree/mock_objecttree.go index 70afa9d4..60935b3a 100644 --- a/pkg/acl/tree/mock_objecttree/mock_objecttree.go +++ b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go @@ -6,11 +6,11 @@ package mock_tree import ( context "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + tree2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" reflect "reflect" - storage "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - tree "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" - treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" gomock "github.com/golang/mock/gomock" ) @@ -38,10 +38,10 @@ func (m *MockObjectTree) EXPECT() *MockObjectTreeMockRecorder { } // AddContent mocks base method. -func (m *MockObjectTree) AddContent(arg0 context.Context, arg1 tree.SignableChangeContent) (tree.AddResult, error) { +func (m *MockObjectTree) AddContent(arg0 context.Context, arg1 tree2.SignableChangeContent) (tree2.AddResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AddContent", arg0, arg1) - ret0, _ := ret[0].(tree.AddResult) + ret0, _ := ret[0].(tree2.AddResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -53,14 +53,14 @@ 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 ...*treechangeproto.RawTreeChangeWithId) (tree2.AddResult, error) { m.ctrl.T.Helper() varargs := []interface{}{arg0} for _, a := range arg1 { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "AddRawChanges", varargs...) - ret0, _ := ret[0].(tree.AddResult) + ret0, _ := ret[0].(tree2.AddResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -177,7 +177,7 @@ func (mr *MockObjectTreeMockRecorder) ID() *gomock.Call { } // Iterate mocks base method. -func (m *MockObjectTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*tree.Change) bool) error { +func (m *MockObjectTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*tree2.Change) bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Iterate", arg0, arg1) ret0, _ := ret[0].(error) @@ -191,7 +191,7 @@ func (mr *MockObjectTreeMockRecorder) Iterate(arg0, arg1 interface{}) *gomock.Ca } // IterateFrom mocks base method. -func (m *MockObjectTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*tree.Change) bool) error { +func (m *MockObjectTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*tree2.Change) bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IterateFrom", arg0, arg1, arg2) ret0, _ := ret[0].(error) @@ -241,10 +241,10 @@ func (mr *MockObjectTreeMockRecorder) RUnlock() *gomock.Call { } // Root mocks base method. -func (m *MockObjectTree) Root() *tree.Change { +func (m *MockObjectTree) Root() *tree2.Change { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Root") - ret0, _ := ret[0].(*tree.Change) + ret0, _ := ret[0].(*tree2.Change) return ret0 } diff --git a/pkg/acl/tree/objecttree.go b/common/pkg/acl/tree/objecttree.go similarity index 96% rename from pkg/acl/tree/objecttree.go rename to common/pkg/acl/tree/objecttree.go index 9e6323aa..e11e33ac 100644 --- a/pkg/acl/tree/objecttree.go +++ b/common/pkg/acl/tree/objecttree.go @@ -4,11 +4,11 @@ package tree import ( "context" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/common" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" + list2 "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" "sync" ) @@ -66,7 +66,7 @@ type objectTree struct { validator ObjectTreeValidator rawChangeLoader *rawChangeLoader treeBuilder *treeBuilder - aclList list.ACLList + aclList list2.ACLList id string root *treechangeproto.RawTreeChangeWithId @@ -91,13 +91,13 @@ type objectTreeDeps struct { treeStorage storage.TreeStorage validator ObjectTreeValidator rawChangeLoader *rawChangeLoader - aclList list.ACLList + aclList list2.ACLList } func defaultObjectTreeDeps( rootChange *treechangeproto.RawTreeChangeWithId, treeStorage storage.TreeStorage, - aclList list.ACLList) objectTreeDeps { + aclList list2.ACLList) objectTreeDeps { keychain := common.NewKeychain() changeBuilder := newChangeBuilder(keychain, rootChange) @@ -449,7 +449,7 @@ func (ot *objectTree) IterateFrom(id string, convert ChangeConvertFunc, iterate } readKey, exists := ot.keys[c.ReadKeyHash] if !exists { - err = list.ErrNoReadKey + err = list2.ErrNoReadKey return false } diff --git a/pkg/acl/tree/objecttree_test.go b/common/pkg/acl/tree/objecttree_test.go similarity index 96% rename from pkg/acl/tree/objecttree_test.go rename to common/pkg/acl/tree/objecttree_test.go index fcfab7e7..e2a2b028 100644 --- a/pkg/acl/tree/objecttree_test.go +++ b/common/pkg/acl/tree/objecttree_test.go @@ -2,10 +2,10 @@ package tree import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/acllistbuilder" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" + storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/acllistbuilder" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "testing" @@ -53,9 +53,9 @@ func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot b } } -func (c *mockChangeCreator) createNewTreeStorage(treeId, aclHeadId string) storage.TreeStorage { +func (c *mockChangeCreator) createNewTreeStorage(treeId, aclHeadId string) storage2.TreeStorage { root := c.createRoot(treeId, aclHeadId) - treeStorage, _ := storage.NewInMemoryTreeStorage(treeId, root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root}) + treeStorage, _ := storage2.NewInMemoryTreeStorage(treeId, root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root}) return treeStorage } @@ -95,7 +95,7 @@ func (m *mockChangeValidator) ValidateFullTree(tree *Tree, aclList list.ACLList) type testTreeContext struct { aclList list.ACLList - treeStorage storage.TreeStorage + treeStorage storage2.TreeStorage changeBuilder *mockChangeBuilder changeCreator *mockChangeCreator objTree ObjectTree diff --git a/pkg/acl/tree/objecttreefactory.go b/common/pkg/acl/tree/objecttreefactory.go similarity index 77% rename from pkg/acl/tree/objecttreefactory.go rename to common/pkg/acl/tree/objecttreefactory.go index 1db77908..72371327 100644 --- a/pkg/acl/tree/objecttreefactory.go +++ b/common/pkg/acl/tree/objecttreefactory.go @@ -1,12 +1,12 @@ package tree import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" + storage2 "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/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice" "go.uber.org/zap" "math/rand" "time" @@ -19,7 +19,7 @@ type ObjectTreeCreatePayload struct { Identity []byte } -func BuildObjectTree(treeStorage storage.TreeStorage, aclList list.ACLList) (ObjectTree, error) { +func BuildObjectTree(treeStorage storage2.TreeStorage, aclList list.ACLList) (ObjectTree, error) { rootChange, err := treeStorage.Root() if err != nil { return nil, err @@ -31,14 +31,14 @@ func BuildObjectTree(treeStorage storage.TreeStorage, aclList list.ACLList) (Obj func CreateDerivedObjectTree( payload ObjectTreeCreatePayload, aclList list.ACLList, - createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { return createObjectTree(payload, 0, nil, aclList, createStorage) } func CreateObjectTree( payload ObjectTreeCreatePayload, aclList list.ACLList, - createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { bytes := make([]byte, 32) _, err = rand.Read(bytes) if err != nil { @@ -52,7 +52,7 @@ func createObjectTree( timestamp int64, seed []byte, aclList list.ACLList, - createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { aclList.RLock() var ( deps = defaultObjectTreeDeps(nil, nil, aclList) @@ -80,7 +80,7 @@ func createObjectTree( deps.changeBuilder.SetRootRawChange(raw) // create storage - st, err := createStorage(storage.TreeStorageCreatePayload{ + st, err := createStorage(storage2.TreeStorageCreatePayload{ TreeId: raw.Id, RootRawChange: raw, Changes: []*treechangeproto.RawTreeChangeWithId{raw}, diff --git a/pkg/acl/tree/rawloader.go b/common/pkg/acl/tree/rawloader.go similarity index 96% rename from pkg/acl/tree/rawloader.go rename to common/pkg/acl/tree/rawloader.go index 6f6c8539..bc39688c 100644 --- a/pkg/acl/tree/rawloader.go +++ b/common/pkg/acl/tree/rawloader.go @@ -2,8 +2,8 @@ package tree import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "time" ) diff --git a/common/pkg/acl/tree/rawtreevalidator.go b/common/pkg/acl/tree/rawtreevalidator.go new file mode 100644 index 00000000..aac7dd99 --- /dev/null +++ b/common/pkg/acl/tree/rawtreevalidator.go @@ -0,0 +1,17 @@ +package tree + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" + storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" +) + +func ValidateRawTree(payload storage2.TreeStorageCreatePayload, aclList list.ACLList) (err error) { + provider := storage2.NewInMemoryTreeStorageProvider() + treeStorage, err := provider.CreateTreeStorage(payload) + if err != nil { + return + } + + _, err = BuildObjectTree(treeStorage, aclList) + return +} diff --git a/pkg/acl/tree/signablecontent.go b/common/pkg/acl/tree/signablecontent.go similarity index 59% rename from pkg/acl/tree/signablecontent.go rename to common/pkg/acl/tree/signablecontent.go index 4774c2fb..086d1b06 100644 --- a/pkg/acl/tree/signablecontent.go +++ b/common/pkg/acl/tree/signablecontent.go @@ -1,7 +1,7 @@ package tree import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" ) type SignableChangeContent struct { diff --git a/pkg/acl/tree/tree.go b/common/pkg/acl/tree/tree.go similarity index 100% rename from pkg/acl/tree/tree.go rename to common/pkg/acl/tree/tree.go diff --git a/pkg/acl/tree/tree_test.go b/common/pkg/acl/tree/tree_test.go similarity index 100% rename from pkg/acl/tree/tree_test.go rename to common/pkg/acl/tree/tree_test.go diff --git a/pkg/acl/tree/treebuilder.go b/common/pkg/acl/tree/treebuilder.go similarity index 96% rename from pkg/acl/tree/treebuilder.go rename to common/pkg/acl/tree/treebuilder.go index d7249d28..1250bfdc 100644 --- a/pkg/acl/tree/treebuilder.go +++ b/common/pkg/acl/tree/treebuilder.go @@ -4,9 +4,9 @@ import ( "context" "errors" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice" "go.uber.org/zap" "time" ) diff --git a/pkg/acl/tree/treegraph.go b/common/pkg/acl/tree/treegraph.go similarity index 100% rename from pkg/acl/tree/treegraph.go rename to common/pkg/acl/tree/treegraph.go diff --git a/pkg/acl/tree/treegraph_nix.go b/common/pkg/acl/tree/treegraph_nix.go similarity index 100% rename from pkg/acl/tree/treegraph_nix.go rename to common/pkg/acl/tree/treegraph_nix.go diff --git a/pkg/acl/tree/treeiterator.go b/common/pkg/acl/tree/treeiterator.go similarity index 100% rename from pkg/acl/tree/treeiterator.go rename to common/pkg/acl/tree/treeiterator.go diff --git a/pkg/acl/tree/treereduce.go b/common/pkg/acl/tree/treereduce.go similarity index 100% rename from pkg/acl/tree/treereduce.go rename to common/pkg/acl/tree/treereduce.go diff --git a/pkg/acl/tree/util.go b/common/pkg/acl/tree/util.go similarity index 100% rename from pkg/acl/tree/util.go rename to common/pkg/acl/tree/util.go diff --git a/pkg/acl/treechangeproto/protos/treechange.proto b/common/pkg/acl/treechangeproto/protos/treechange.proto similarity index 100% rename from pkg/acl/treechangeproto/protos/treechange.proto rename to common/pkg/acl/treechangeproto/protos/treechange.proto diff --git a/pkg/acl/treechangeproto/treechange.pb.go b/common/pkg/acl/treechangeproto/treechange.pb.go similarity index 100% rename from pkg/acl/treechangeproto/treechange.pb.go rename to common/pkg/acl/treechangeproto/treechange.pb.go diff --git a/pkg/ldiff/diff.go b/common/pkg/ldiff/diff.go similarity index 100% rename from pkg/ldiff/diff.go rename to common/pkg/ldiff/diff.go diff --git a/pkg/ldiff/diff_test.go b/common/pkg/ldiff/diff_test.go similarity index 100% rename from pkg/ldiff/diff_test.go rename to common/pkg/ldiff/diff_test.go diff --git a/pkg/ldiff/mock_ldiff/mock_ldiff.go b/common/pkg/ldiff/mock_ldiff/mock_ldiff.go similarity index 98% rename from pkg/ldiff/mock_ldiff/mock_ldiff.go rename to common/pkg/ldiff/mock_ldiff/mock_ldiff.go index 183e7bef..e90d6812 100644 --- a/pkg/ldiff/mock_ldiff/mock_ldiff.go +++ b/common/pkg/ldiff/mock_ldiff/mock_ldiff.go @@ -6,9 +6,9 @@ package mock_ldiff import ( context "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" reflect "reflect" - ldiff "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff" gomock "github.com/golang/mock/gomock" ) diff --git a/pkg/ocache/metrics.go b/common/pkg/ocache/metrics.go similarity index 100% rename from pkg/ocache/metrics.go rename to common/pkg/ocache/metrics.go diff --git a/pkg/ocache/ocache.go b/common/pkg/ocache/ocache.go similarity index 99% rename from pkg/ocache/ocache.go rename to common/pkg/ocache/ocache.go index 5ad6014d..0f69529d 100644 --- a/pkg/ocache/ocache.go +++ b/common/pkg/ocache/ocache.go @@ -3,7 +3,7 @@ package ocache import ( "context" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "go.uber.org/zap" "sync" "time" diff --git a/pkg/ocache/ocache_test.go b/common/pkg/ocache/ocache_test.go similarity index 100% rename from pkg/ocache/ocache_test.go rename to common/pkg/ocache/ocache_test.go diff --git a/util/cid/cid.go b/common/util/cid/cid.go similarity index 100% rename from util/cid/cid.go rename to common/util/cid/cid.go diff --git a/util/keys/asymmetric/encryptionkey/encryptionkey.go b/common/util/keys/asymmetric/encryptionkey/encryptionkey.go similarity index 67% rename from util/keys/asymmetric/encryptionkey/encryptionkey.go rename to common/util/keys/asymmetric/encryptionkey/encryptionkey.go index 970fcfdd..76e2f21f 100644 --- a/util/keys/asymmetric/encryptionkey/encryptionkey.go +++ b/common/util/keys/asymmetric/encryptionkey/encryptionkey.go @@ -1,6 +1,8 @@ package encryptionkey -import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" +) type PrivKey interface { keys.Key diff --git a/util/keys/asymmetric/encryptionkey/rsa.go b/common/util/keys/asymmetric/encryptionkey/rsa.go similarity index 97% rename from util/keys/asymmetric/encryptionkey/rsa.go rename to common/util/keys/asymmetric/encryptionkey/rsa.go index 6c733488..a1afc2bb 100644 --- a/util/keys/asymmetric/encryptionkey/rsa.go +++ b/common/util/keys/asymmetric/encryptionkey/rsa.go @@ -7,7 +7,7 @@ import ( "crypto/subtle" "crypto/x509" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" "io" ) diff --git a/util/keys/asymmetric/signingkey/ed25519.go b/common/util/keys/asymmetric/signingkey/ed25519.go similarity index 97% rename from util/keys/asymmetric/signingkey/ed25519.go rename to common/util/keys/asymmetric/signingkey/ed25519.go index beb4b6ed..3df2cd3d 100644 --- a/util/keys/asymmetric/signingkey/ed25519.go +++ b/common/util/keys/asymmetric/signingkey/ed25519.go @@ -7,7 +7,7 @@ import ( "crypto/subtle" "errors" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" "io" ) diff --git a/util/keys/asymmetric/signingkey/signingkey.go b/common/util/keys/asymmetric/signingkey/signingkey.go similarity index 68% rename from util/keys/asymmetric/signingkey/signingkey.go rename to common/util/keys/asymmetric/signingkey/signingkey.go index 07576a67..c5d09011 100644 --- a/util/keys/asymmetric/signingkey/signingkey.go +++ b/common/util/keys/asymmetric/signingkey/signingkey.go @@ -1,6 +1,8 @@ package signingkey -import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" +) type PrivKey interface { keys.Key diff --git a/util/keys/decode.go b/common/util/keys/decode.go similarity index 100% rename from util/keys/decode.go rename to common/util/keys/decode.go diff --git a/util/keys/key.go b/common/util/keys/key.go similarity index 100% rename from util/keys/key.go rename to common/util/keys/key.go diff --git a/util/keys/symmetric/symmetric.go b/common/util/keys/symmetric/symmetric.go similarity index 100% rename from util/keys/symmetric/symmetric.go rename to common/util/keys/symmetric/symmetric.go diff --git a/util/peer/peer.go b/common/util/peer/peer.go similarity index 79% rename from util/peer/peer.go rename to common/util/peer/peer.go index dfa03282..00f5d5c3 100644 --- a/util/peer/peer.go +++ b/common/util/peer/peer.go @@ -1,7 +1,7 @@ package peer import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" ) diff --git a/util/slice/slice.go b/common/util/slice/slice.go similarity index 100% rename from util/slice/slice.go rename to common/util/slice/slice.go diff --git a/consensus/config/config.go b/consensus/config/config.go index 32ce5838..e50d92d5 100644 --- a/consensus/config/config.go +++ b/consensus/config/config.go @@ -1,8 +1,8 @@ package config import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "gopkg.in/yaml.v3" "io/ioutil" ) @@ -22,11 +22,11 @@ func NewFromFile(path string) (c *Config, err error) { } type Config struct { - GrpcServer config.GrpcServer `yaml:"grpcServer"` - Account config.Account `yaml:"account"` - Mongo Mongo `yaml:"mongo"` - Metric config.Metric `yaml:"metric"` - Log config.Log `yaml:"log"` + GrpcServer config2.GrpcServer `yaml:"grpcServer"` + Account config2.Account `yaml:"account"` + Mongo Mongo `yaml:"mongo"` + Metric config2.Metric `yaml:"metric"` + Log config2.Log `yaml:"log"` } func (c *Config) Init(a *app.App) (err error) { @@ -41,14 +41,14 @@ func (c Config) GetMongo() Mongo { return c.Mongo } -func (c Config) GetGRPCServer() config.GrpcServer { +func (c Config) GetGRPCServer() config2.GrpcServer { return c.GrpcServer } -func (c Config) GetAccount() config.Account { +func (c Config) GetAccount() config2.Account { return c.Account } -func (c Config) GetMetric() config.Metric { +func (c Config) GetMetric() config2.Metric { return c.Metric } diff --git a/consensus/consensusclient/client.go b/consensus/consensusclient/client.go index 39a1bcf4..0df9fbdb 100644 --- a/consensus/consensusclient/client.go +++ b/consensus/consensusclient/client.go @@ -2,8 +2,8 @@ package consensusclient import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpcerr" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" diff --git a/consensus/consensusrpc/consensrpc.go b/consensus/consensusrpc/consensrpc.go index 2c5d27c9..f1cafe1e 100644 --- a/consensus/consensusrpc/consensrpc.go +++ b/consensus/consensusrpc/consensrpc.go @@ -2,7 +2,7 @@ package consensusrpc import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" diff --git a/consensus/db/db.go b/consensus/db/db.go index f2c4540e..ac34d6a8 100644 --- a/consensus/db/db.go +++ b/consensus/db/db.go @@ -3,8 +3,8 @@ package db import ( "context" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" diff --git a/consensus/db/db_test.go b/consensus/db/db_test.go index edbb3cfa..58acfef7 100644 --- a/consensus/db/db_test.go +++ b/consensus/db/db_test.go @@ -2,7 +2,7 @@ package db import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" diff --git a/consensus/stream/service.go b/consensus/stream/service.go index 8d475355..0aa407f1 100644 --- a/consensus/stream/service.go +++ b/consensus/stream/service.go @@ -2,12 +2,12 @@ package stream import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" + ocache2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "github.com/cheggaaa/mb/v2" "github.com/mr-tron/base58" "go.uber.org/zap" @@ -42,22 +42,22 @@ type Service interface { type service struct { db db.Service - cache ocache.OCache + cache ocache2.OCache lastStreamId uint64 } func (s *service) Init(a *app.App) (err error) { s.db = a.MustComponent(db.CName).(db.Service) - cacheOpts := []ocache.Option{ - ocache.WithTTL(cacheTTL), - ocache.WithRefCounter(false), - ocache.WithLogger(log.Named("cache").Sugar()), + cacheOpts := []ocache2.Option{ + ocache2.WithTTL(cacheTTL), + ocache2.WithRefCounter(false), + ocache2.WithLogger(log.Named("cache").Sugar()), } if ms := a.Component(metric.CName); ms != nil { - cacheOpts = append(cacheOpts, ocache.WithPrometheus(ms.(metric.Metric).Registry(), "consensus", "logcache")) + cacheOpts = append(cacheOpts, ocache2.WithPrometheus(ms.(metric.Metric).Registry(), "consensus", "logcache")) } - s.cache = ocache.New(s.loadLog, cacheOpts...) + s.cache = ocache2.New(s.loadLog, cacheOpts...) return s.db.SetChangeReceiver(s.receiveChange) } @@ -99,7 +99,7 @@ func (s *service) RemoveStream(ctx context.Context, logId []byte, streamId uint6 return } -func (s *service) loadLog(ctx context.Context, id string) (value ocache.Object, err error) { +func (s *service) loadLog(ctx context.Context, id string) (value ocache2.Object, err error) { if ctxLog := ctx.Value(ctxLogKey); ctxLog != nil { return &object{ logId: ctxLog.(consensus.Log).Id, diff --git a/consensus/stream/service_test.go b/consensus/stream/service_test.go index 80643de4..8b3498a9 100644 --- a/consensus/stream/service_test.go +++ b/consensus/stream/service_test.go @@ -2,7 +2,7 @@ package stream import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" "github.com/stretchr/testify/assert" diff --git a/node/account/service.go b/node/account/service.go index 3181f9bd..66b2cb0a 100644 --- a/node/account/service.go +++ b/node/account/service.go @@ -1,13 +1,13 @@ package account import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" ) type service struct { diff --git a/node/nodespace/nodecache/treecache.go b/node/nodespace/nodecache/treecache.go index 0b9446a3..5b72d1e2 100644 --- a/node/nodespace/nodecache/treecache.go +++ b/node/nodespace/nodecache/treecache.go @@ -3,11 +3,11 @@ package nodecache import ( "context" "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" "time" ) diff --git a/node/nodespace/service.go b/node/nodespace/service.go index 0920ef42..69d07917 100644 --- a/node/nodespace/service.go +++ b/node/nodespace/service.go @@ -2,14 +2,14 @@ package nodespace import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "time" ) @@ -27,14 +27,14 @@ type Service interface { } type service struct { - conf config.Space + conf config2.Space spaceCache ocache.OCache commonSpace commonspace.Service spaceStorageProvider storage.SpaceStorageProvider } func (s *service) Init(a *app.App) (err error) { - s.conf = a.MustComponent(config.CName).(*config.Config).Space + s.conf = a.MustComponent(config2.CName).(*config2.Config).Space s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service) s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.spaceCache = ocache.New( diff --git a/node/storage/keys.go b/node/storage/keys.go index fe12046a..8792929a 100644 --- a/node/storage/keys.go +++ b/node/storage/keys.go @@ -1,7 +1,7 @@ package storage import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "strings" ) diff --git a/node/storage/liststorage.go b/node/storage/liststorage.go index 142e175b..c3ba4f92 100644 --- a/node/storage/liststorage.go +++ b/node/storage/liststorage.go @@ -3,8 +3,8 @@ package storage import ( "context" "github.com/akrylysov/pogreb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" ) type listStorage struct { diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index 3bf41085..9ac3bfbb 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -4,7 +4,7 @@ import ( "github.com/akrylysov/pogreb" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" + storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "path" "sync" "time" @@ -18,7 +18,7 @@ type spaceStorage struct { spaceId string objDb *pogreb.DB keys spaceKeys - aclStorage storage.ListStorage + aclStorage storage2.ListStorage header *spacesyncproto.RawSpaceHeaderWithId mx sync.Mutex } @@ -125,11 +125,11 @@ func (s *spaceStorage) ID() (string, error) { return s.spaceId, nil } -func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) { +func (s *spaceStorage) TreeStorage(id string) (storage2.TreeStorage, error) { return newTreeStorage(s.objDb, id) } -func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { +func (s *spaceStorage) CreateTreeStorage(payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { // we have mutex here, so we prevent overwriting the heads of a tree on concurrent creation s.mx.Lock() defer s.mx.Unlock() @@ -137,7 +137,7 @@ func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayloa return createTreeStorage(s.objDb, payload) } -func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) { +func (s *spaceStorage) ACLStorage() (storage2.ListStorage, error) { return s.aclStorage, nil } diff --git a/node/storage/storageservice.go b/node/storage/storageservice.go index 92927595..9b703cd8 100644 --- a/node/storage/storageservice.go +++ b/node/storage/storageservice.go @@ -1,9 +1,9 @@ package storage import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" ) type storageService struct { diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index f600b6a2..919f2140 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -3,8 +3,8 @@ package storage import ( "context" "github.com/akrylysov/pogreb" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treechangeproto" + storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" ) type treeStorage struct { @@ -14,14 +14,14 @@ type treeStorage struct { root *treechangeproto.RawTreeChangeWithId } -func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) { +func newTreeStorage(db *pogreb.DB, treeId string) (ts storage2.TreeStorage, err error) { keys := newTreeKeys(treeId) heads, err := db.Get(keys.HeadsKey()) if err != nil { return } if heads == nil { - err = storage.ErrUnknownTreeId + err = storage2.ErrUnknownTreeId return } @@ -30,7 +30,7 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err e return } if root == nil { - err = storage.ErrUnknownTreeId + err = storage2.ErrUnknownTreeId return } @@ -47,18 +47,18 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err e return } -func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { +func createTreeStorage(db *pogreb.DB, payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { keys := newTreeKeys(payload.TreeId) has, err := db.Has(keys.HeadsKey()) if err != nil { return } if has { - err = storage.ErrTreeExists + err = storage2.ErrTreeExists return } - heads := storage.CreateHeadsPayload(payload.Heads) + heads := storage2.CreateHeadsPayload(payload.Heads) for _, ch := range payload.Changes { err = db.Put(keys.RawChangeKey(ch.Id), ch.GetRawChange()) @@ -100,15 +100,15 @@ func (t *treeStorage) Heads() (heads []string, err error) { return } if heads == nil { - err = storage.ErrUnknownTreeId + err = storage2.ErrUnknownTreeId return } - heads = storage.ParseHeads(headsBytes) + heads = storage2.ParseHeads(headsBytes) return } func (t *treeStorage) SetHeads(heads []string) (err error) { - payload := storage.CreateHeadsPayload(heads) + payload := storage2.CreateHeadsPayload(heads) return t.db.Put(t.keys.HeadsKey(), payload) } @@ -122,7 +122,7 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha return } if res == nil { - err = storage.ErrUnkownChange + err = storage2.ErrUnkownChange } raw = &treechangeproto.RawTreeChangeWithId{ diff --git a/pkg/acl/account/accountdata.go b/pkg/acl/account/accountdata.go deleted file mode 100644 index 3d3fdf28..00000000 --- a/pkg/acl/account/accountdata.go +++ /dev/null @@ -1,12 +0,0 @@ -package account - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey" - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" -) - -type AccountData struct { // TODO: create a convenient constructor for this - Identity []byte // public key - SignKey signingkey.PrivKey - EncKey encryptionkey.PrivKey -} diff --git a/pkg/acl/common/keychain.go b/pkg/acl/common/keychain.go deleted file mode 100644 index b9fc0fb6..00000000 --- a/pkg/acl/common/keychain.go +++ /dev/null @@ -1,28 +0,0 @@ -package common - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey" -) - -type Keychain struct { - keys map[string]signingkey.PubKey -} - -func NewKeychain() *Keychain { - return &Keychain{ - keys: make(map[string]signingkey.PubKey), - } -} - -func (k *Keychain) GetOrAdd(identity string) (signingkey.PubKey, error) { - if key, exists := k.keys[identity]; exists { - return key, nil - } - res, err := signingkey.NewSigningEd25519PubKeyFromBytes([]byte(identity)) - if err != nil { - return nil, err - } - - k.keys[identity] = res.(signingkey.PubKey) - return res.(signingkey.PubKey), nil -} diff --git a/pkg/acl/tree/rawtreevalidator.go b/pkg/acl/tree/rawtreevalidator.go deleted file mode 100644 index 01cb1105..00000000 --- a/pkg/acl/tree/rawtreevalidator.go +++ /dev/null @@ -1,17 +0,0 @@ -package tree - -import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list" - "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage" -) - -func ValidateRawTree(payload storage.TreeStorageCreatePayload, aclList list.ACLList) (err error) { - provider := storage.NewInMemoryTreeStorageProvider() - treeStorage, err := provider.CreateTreeStorage(payload) - if err != nil { - return - } - - _, err = BuildObjectTree(treeStorage, aclList) - return -} From 5a17320c44fa7eafe10b754e01ea06ed0786061d Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Mon, 17 Oct 2022 15:31:09 +0300 Subject: [PATCH 151/219] go workspaces --- Makefile | 35 +- client/go.mod | 69 ++ go.sum => client/go.sum | 167 ++--- common/Makefile | 22 + .../spacesyncproto/protos/spacesync.proto | 2 +- .../spacesyncproto/spacesync.pb.go | 168 ++--- .../spacesyncproto/spacesync_drpc.pb.go | 40 +- common/go.mod | 64 ++ common/go.sum | 617 ++++++++++++++++++ common/pkg/acl/aclrecordproto/aclrecord.pb.go | 1 + common/pkg/acl/list/list.go | 2 +- common/pkg/acl/list/mock_list/mock_list.go | 2 +- common/pkg/acl/storage/liststorage.go | 2 +- .../acl/storage/mock_storage/mock_storage.go | 2 +- .../testutils/testchanges/proto/test.pb.go | 1 + .../tree/mock_objecttree/mock_objecttree.go | 2 +- common/pkg/acl/tree/objecttree.go | 2 +- common/pkg/ldiff/diff.go | 2 +- common/pkg/ldiff/mock_ldiff/mock_ldiff.go | 2 +- consensus/Makefile | 12 + consensus/account/service.go | 62 ++ .../cmd}/consensusnode.go | 2 +- .../cmd}/testclient/consensustestclient.go | 2 +- consensus/consensusproto/consensus.pb.go | 84 +-- consensus/consensusproto/consensus_drpc.pb.go | 40 +- .../consensusproto/protos/consensus.proto | 2 +- consensus/go.mod | 68 ++ consensus/go.sum | 615 +++++++++++++++++ go.mod | 86 --- go.work | 9 + go.work.sum | 7 + node/Makefile | 9 + node/account/service.go | 2 +- {cmd/node => node/cmd}/node.go | 0 node/go.mod | 60 ++ node/go.sum | 611 +++++++++++++++++ {cmd => util/cmd}/benchmarks/db/badger.go | 0 {cmd => util/cmd}/benchmarks/db/common.go | 0 {cmd => util/cmd}/benchmarks/db/pogreb.go | 0 {cmd => util/cmd}/benchmarks/dbbench.go | 2 +- {cmd => util/cmd}/nodesgen/gen.go | 0 {cmd => util/cmd}/nodesgen/nodemap.yml | 0 util/go.mod | 54 ++ util/go.sum | 254 +++++++ 44 files changed, 2786 insertions(+), 397 deletions(-) create mode 100644 client/go.mod rename go.sum => client/go.sum (85%) create mode 100644 common/Makefile create mode 100644 common/go.mod create mode 100644 common/go.sum create mode 100644 consensus/Makefile create mode 100644 consensus/account/service.go rename {cmd/consensusnode => consensus/cmd}/consensusnode.go (96%) rename {cmd/consensusnode => consensus/cmd}/testclient/consensustestclient.go (99%) create mode 100644 consensus/go.mod create mode 100644 consensus/go.sum delete mode 100644 go.mod create mode 100644 go.work create mode 100644 go.work.sum create mode 100644 node/Makefile rename {cmd/node => node/cmd}/node.go (100%) create mode 100644 node/go.mod create mode 100644 node/go.sum rename {cmd => util/cmd}/benchmarks/db/badger.go (100%) rename {cmd => util/cmd}/benchmarks/db/common.go (100%) rename {cmd => util/cmd}/benchmarks/db/pogreb.go (100%) rename {cmd => util/cmd}/benchmarks/dbbench.go (98%) rename {cmd => util/cmd}/nodesgen/gen.go (100%) rename {cmd => util/cmd}/nodesgen/nodemap.yml (100%) create mode 100644 util/go.mod create mode 100644 util/go.sum diff --git a/Makefile b/Makefile index c233777c..75f43ddc 100644 --- a/Makefile +++ b/Makefile @@ -13,33 +13,14 @@ endif export PATH=$(GOPATH)/bin:$(shell echo $$PATH) proto: - @echo 'Generating protobuf packages (Go)...' -# Uncomment if needed - @$(eval ROOT_PKG := pkg) - @$(eval GOGO_START := GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1) - @$(eval P_ACL_RECORDS_PATH_PB := $(ROOT_PKG)/acl/aclrecordproto) - @$(eval P_TREE_CHANGES_PATH_PB := $(ROOT_PKG)/acl/treechangeproto) - @$(eval P_SYNC_CHANGES_PATH_PB := syncproto) - @$(eval P_TEST_CHANGES_PATH_PB := $(ROOT_PKG)/acl/testutils/testchanges) - @$(eval P_ACL_RECORDS := M$(P_ACL_RECORDS_PATH_PB)/protos/aclrecord.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_ACL_RECORDS_PATH_PB)) - @$(eval P_TREE_CHANGES := M$(P_TREE_CHANGES_PATH_PB)/protos/treechange.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/$(P_TREE_CHANGES_PATH_PB)) - - $(GOGO_START) protoc --gogofaster_out=:. $(P_ACL_RECORDS_PATH_PB)/protos/*.proto - $(GOGO_START) protoc --gogofaster_out=:. $(P_TREE_CHANGES_PATH_PB)/protos/*.proto - $(GOGO_START) protoc --gogofaster_out=:. $(P_TEST_CHANGES_PATH_PB)/proto/*.proto - $(eval PKGMAP := $$(P_TREE_CHANGES),$$(P_ACL_RECORDS)) - $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. --go-drpc_out=protolib=github.com/gogo/protobuf:. common/commonspace/spacesyncproto/protos/*.proto - $(GOGO_START) protoc --gogofaster_out=:. --go-drpc_out=protolib=github.com/gogo/protobuf:. consensus/consensusproto/protos/*.proto + $(MAKE) -C common proto + $(MAKE) -C consensus proto build: - @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/common/app)) - go build -v -o bin/anytype-node -ldflags "$(FLAGS)" cmd/node/node.go + $(MAKE) -C node build + $(MAKE) -C consensus build -test-deps: - @echo 'Generating test mocks...' - @go install github.com/golang/mock/mockgen - @go generate ./... - -build-consensus: - @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/common/app)) - go build -v -o bin/consensus-node -ldflags "$(FLAGS)" github.com/anytypeio/go-anytype-infrastructure-experiments/cmd/consensusnode +test: + $(MAKE) -C node test + $(MAKE) -C consensus test + $(MAKE) -C common test \ No newline at end of file diff --git a/client/go.mod b/client/go.mod new file mode 100644 index 00000000..f03c0542 --- /dev/null +++ b/client/go.mod @@ -0,0 +1,69 @@ +module github.com/anytypeio/go-anytype-infrastructure-experiments/client + +go 1.19 + +require ( + github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 + github.com/dgraph-io/badger/v3 v3.2103.3 +) + +require ( + 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/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 + 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/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect + 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/huandu/skiplist v1.2.0 // indirect + github.com/ipfs/go-cid v0.3.2 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // 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-isatty v0.0.16 // 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 + github.com/multiformats/go-base36 v0.1.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/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/zeebo/blake3 v0.2.3 // indirect + github.com/zeebo/errs v1.3.0 // 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-20220525230936-793ad666bf5e // 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/go.sum b/client/go.sum similarity index 85% rename from go.sum rename to client/go.sum index 3ccaa17e..b91db95f 100644 --- a/go.sum +++ b/client/go.sum @@ -33,11 +33,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 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/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= -github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -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= @@ -46,28 +43,19 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 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= -github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab h1:+cdNqtOJWjvepyhxy23G7z7vmpYCoC65AP0nqi1f53s= -github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= +github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= -github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= -github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= 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/cheggaaa/mb/v2 v2.0.1 h1:gn0khbEbKlw3i5VOYi0VnHEHayjZKfUDOyGSpHAybBs= -github.com/cheggaaa/mb/v2 v2.0.1/go.mod h1:XGeZw20Iqgjky26KL0mvCwk3+4NyZCUbshSo6ALne+c= 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= @@ -83,13 +71,12 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/dgraph-io/badger/v3 v3.2103.2 h1:dpyM5eCJAtQCBcMCZcT4UBZchuTJgCywerHHgmxfxM8= -github.com/dgraph-io/badger/v3 v3.2103.2/go.mod h1:RHo4/GmYcKKh5Lxu63wLEMHJ70Pac2JqZRYGhlyAo2M= -github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= -github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/dgraph-io/badger/v3 v3.2103.3 h1:s63J1pisDhKpzWslXFe+ChuthuZptpwTE6qEKoczPb4= +github.com/dgraph-io/badger/v3 v3.2103.3/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5jsE0PPFzRiKjtcdw= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= @@ -134,7 +121,6 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt 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/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= 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= @@ -152,7 +138,6 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw 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.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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= @@ -166,7 +151,7 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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.2/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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= @@ -181,6 +166,7 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf 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= @@ -192,9 +178,10 @@ 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/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= -github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= +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-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= 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= @@ -208,13 +195,13 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8 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= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.1 h1:y9FcTHGyrebwfP0ZZqFiaxTaiDnUrGkJkI+f583BL1A= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.10 h1:Ai8UzuomSCDw90e1qNMtb15msBXsNpH6gzkkENQNcJo= +github.com/klauspost/compress v1.15.10/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= 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 h1:p9dKCg8i4gmOxtv35DvrYoWqYzQrvEVdjQ762Y0OqZE= 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/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= @@ -223,20 +210,22 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= -github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= -github.com/libp2p/go-libp2p v0.20.3 h1:tjjDNfp7FqdI/7v1rXtB/BtELaPlAThL2uzlj18kcrw= -github.com/libp2p/go-libp2p v0.20.3/go.mod h1:I+vndVanE/p/SjFbnA+BEmmfAUEpWxrdXZeyQ1Dus5c= -github.com/libp2p/go-libp2p-core v0.16.1 h1:bWoiEBqVkpJ13hbv/f69tHODp86t6mvc4fBN4DkK73M= -github.com/libp2p/go-libp2p-core v0.16.1/go.mod h1:O3i/7y+LqUb0N+qhzXjBjjpchgptWAVMG1Voegk7b4c= -github.com/libp2p/go-openssl v0.0.7 h1:eCAzdLejcNVBzP/iZM9vqHnQm+XyCEbSSIheIPRGNsw= -github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +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-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +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/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= -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/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -246,28 +235,20 @@ 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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -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 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= -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-multiaddr v0.5.0 h1:i/JuOoVg4szYQ4YEzDGtb2h0o8M7CG/Yq6cGlcjWZpM= -github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= -github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= -github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= -github.com/multiformats/go-multicodec v0.4.1 h1:BSJbf+zpghcZMZrwTYBGwy0CPcVZGWiC72Cp8bBd4R4= -github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -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.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= -github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= -github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +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.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.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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -324,27 +305,14 @@ 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/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= 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= @@ -358,38 +326,35 @@ github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= -go.mongodb.org/mongo-driver v1.10.2 h1:4Wk3cnqOrQCn0P92L3/mmurMxzdvWWs5J9jinAVKD+k= -go.mongodb.org/mongo-driver v1.10.2/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8= 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 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= 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= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +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/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +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= 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-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-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/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= @@ -452,13 +417,13 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R 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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/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 h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= 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= @@ -477,8 +442,6 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ 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/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/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= @@ -491,10 +454,8 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w 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-20190626221950-04f50cda93cb/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-20191026070338-33540a1f6037/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= @@ -516,17 +477,18 @@ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7w 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-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20210630005230-0f9fa26af87c/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-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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= @@ -535,7 +497,6 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= 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= @@ -582,7 +543,6 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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= @@ -651,6 +611,7 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa 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= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -672,14 +633,12 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR 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/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= -gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= 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.2.8/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 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 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= @@ -692,8 +651,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh 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.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= -lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +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= diff --git a/common/Makefile b/common/Makefile new file mode 100644 index 00000000..6773d454 --- /dev/null +++ b/common/Makefile @@ -0,0 +1,22 @@ +.PHONY: proto test +export GOPRIVATE=github.com/anytypeio + +proto: + @echo 'Generating protobuf packages (Go)...' +# Uncomment if needed + @$(eval GOGO_START := GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1) + @$(eval P_ACL_RECORDS_PATH_PB := pkg/acl/aclrecordproto) + @$(eval P_TREE_CHANGES_PATH_PB := pkg/acl/treechangeproto) + @$(eval P_SYNC_CHANGES_PATH_PB := syncproto) + @$(eval P_TEST_CHANGES_PATH_PB := pkg/acl/testutils/testchanges) + @$(eval P_ACL_RECORDS := M$(P_ACL_RECORDS_PATH_PB)/protos/aclrecord.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/common/$(P_ACL_RECORDS_PATH_PB)) + @$(eval P_TREE_CHANGES := M$(P_TREE_CHANGES_PATH_PB)/protos/treechange.proto=github.com/anytypeio/go-anytype-infrastructure-experiments/common/$(P_TREE_CHANGES_PATH_PB)) + + $(GOGO_START) protoc --gogofaster_out=:. $(P_ACL_RECORDS_PATH_PB)/protos/*.proto + $(GOGO_START) protoc --gogofaster_out=:. $(P_TREE_CHANGES_PATH_PB)/protos/*.proto + $(GOGO_START) protoc --gogofaster_out=:. $(P_TEST_CHANGES_PATH_PB)/proto/*.proto + $(eval PKGMAP := $$(P_TREE_CHANGES),$$(P_ACL_RECORDS)) + $(GOGO_START) protoc --gogofaster_out=$(PKGMAP):. --go-drpc_out=protolib=github.com/gogo/protobuf:. commonspace/spacesyncproto/protos/*.proto + +test: + go test ./... --cover \ No newline at end of file diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index 20bb12fa..c218b1a9 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package anySpace; -option go_package = "common/commonspace/spacesyncproto"; +option go_package = "commonspace/spacesyncproto"; import "pkg/acl/treechangeproto/protos/treechange.proto"; import "pkg/acl/aclrecordproto/protos/aclrecord.proto"; diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 4e965e55..1764e6e3 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -1,12 +1,12 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: common/commonspace/spacesyncproto/protos/spacesync.proto +// source: commonspace/spacesyncproto/protos/spacesync.proto package spacesyncproto import ( fmt "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" + aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -52,7 +52,7 @@ func (x ErrCodes) String() string { } func (ErrCodes) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{0} + return fileDescriptor_80e49f1f4ac27799, []int{0} } // HeadSyncRange presenting a request for one range @@ -66,7 +66,7 @@ func (m *HeadSyncRange) Reset() { *m = HeadSyncRange{} } func (m *HeadSyncRange) String() string { return proto.CompactTextString(m) } func (*HeadSyncRange) ProtoMessage() {} func (*HeadSyncRange) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{0} + return fileDescriptor_80e49f1f4ac27799, []int{0} } func (m *HeadSyncRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -127,7 +127,7 @@ func (m *HeadSyncResult) Reset() { *m = HeadSyncResult{} } func (m *HeadSyncResult) String() string { return proto.CompactTextString(m) } func (*HeadSyncResult) ProtoMessage() {} func (*HeadSyncResult) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{1} + return fileDescriptor_80e49f1f4ac27799, []int{1} } func (m *HeadSyncResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -187,7 +187,7 @@ func (m *HeadSyncResultElement) Reset() { *m = HeadSyncResultElement{} } func (m *HeadSyncResultElement) String() string { return proto.CompactTextString(m) } func (*HeadSyncResultElement) ProtoMessage() {} func (*HeadSyncResultElement) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{2} + return fileDescriptor_80e49f1f4ac27799, []int{2} } func (m *HeadSyncResultElement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -240,7 +240,7 @@ func (m *HeadSyncRequest) Reset() { *m = HeadSyncRequest{} } func (m *HeadSyncRequest) String() string { return proto.CompactTextString(m) } func (*HeadSyncRequest) ProtoMessage() {} func (*HeadSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{3} + return fileDescriptor_80e49f1f4ac27799, []int{3} } func (m *HeadSyncRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -292,7 +292,7 @@ func (m *HeadSyncResponse) Reset() { *m = HeadSyncResponse{} } func (m *HeadSyncResponse) String() string { return proto.CompactTextString(m) } func (*HeadSyncResponse) ProtoMessage() {} func (*HeadSyncResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{4} + return fileDescriptor_80e49f1f4ac27799, []int{4} } func (m *HeadSyncResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -341,7 +341,7 @@ func (m *ObjectSyncMessage) Reset() { *m = ObjectSyncMessage{} } func (m *ObjectSyncMessage) String() string { return proto.CompactTextString(m) } func (*ObjectSyncMessage) ProtoMessage() {} func (*ObjectSyncMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{5} + return fileDescriptor_80e49f1f4ac27799, []int{5} } func (m *ObjectSyncMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -419,7 +419,7 @@ func (m *ObjectSyncContentValue) Reset() { *m = ObjectSyncContentValue{} func (m *ObjectSyncContentValue) String() string { return proto.CompactTextString(m) } func (*ObjectSyncContentValue) ProtoMessage() {} func (*ObjectSyncContentValue) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{6} + return fileDescriptor_80e49f1f4ac27799, []int{6} } func (m *ObjectSyncContentValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -528,7 +528,7 @@ func (m *ObjectHeadUpdate) Reset() { *m = ObjectHeadUpdate{} } func (m *ObjectHeadUpdate) String() string { return proto.CompactTextString(m) } func (*ObjectHeadUpdate) ProtoMessage() {} func (*ObjectHeadUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{7} + return fileDescriptor_80e49f1f4ac27799, []int{7} } func (m *ObjectHeadUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -589,7 +589,7 @@ func (m *ObjectFullSyncRequest) Reset() { *m = ObjectFullSyncRequest{} } func (m *ObjectFullSyncRequest) String() string { return proto.CompactTextString(m) } func (*ObjectFullSyncRequest) ProtoMessage() {} func (*ObjectFullSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{8} + return fileDescriptor_80e49f1f4ac27799, []int{8} } func (m *ObjectFullSyncRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -650,7 +650,7 @@ func (m *ObjectFullSyncResponse) Reset() { *m = ObjectFullSyncResponse{} func (m *ObjectFullSyncResponse) String() string { return proto.CompactTextString(m) } func (*ObjectFullSyncResponse) ProtoMessage() {} func (*ObjectFullSyncResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{9} + return fileDescriptor_80e49f1f4ac27799, []int{9} } func (m *ObjectFullSyncResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -709,7 +709,7 @@ func (m *ObjectErrorResponse) Reset() { *m = ObjectErrorResponse{} } func (m *ObjectErrorResponse) String() string { return proto.CompactTextString(m) } func (*ObjectErrorResponse) ProtoMessage() {} func (*ObjectErrorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{10} + return fileDescriptor_80e49f1f4ac27799, []int{10} } func (m *ObjectErrorResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -755,7 +755,7 @@ func (m *PushSpaceRequest) Reset() { *m = PushSpaceRequest{} } func (m *PushSpaceRequest) String() string { return proto.CompactTextString(m) } func (*PushSpaceRequest) ProtoMessage() {} func (*PushSpaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{11} + return fileDescriptor_80e49f1f4ac27799, []int{11} } func (m *PushSpaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -806,7 +806,7 @@ func (m *PushSpaceResponse) Reset() { *m = PushSpaceResponse{} } func (m *PushSpaceResponse) String() string { return proto.CompactTextString(m) } func (*PushSpaceResponse) ProtoMessage() {} func (*PushSpaceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{12} + return fileDescriptor_80e49f1f4ac27799, []int{12} } func (m *PushSpaceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -848,7 +848,7 @@ func (m *SpaceHeader) Reset() { *m = SpaceHeader{} } func (m *SpaceHeader) String() string { return proto.CompactTextString(m) } func (*SpaceHeader) ProtoMessage() {} func (*SpaceHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{13} + return fileDescriptor_80e49f1f4ac27799, []int{13} } func (m *SpaceHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -921,7 +921,7 @@ func (m *RawSpaceHeader) Reset() { *m = RawSpaceHeader{} } func (m *RawSpaceHeader) String() string { return proto.CompactTextString(m) } func (*RawSpaceHeader) ProtoMessage() {} func (*RawSpaceHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{14} + return fileDescriptor_80e49f1f4ac27799, []int{14} } func (m *RawSpaceHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -973,7 +973,7 @@ func (m *RawSpaceHeaderWithId) Reset() { *m = RawSpaceHeaderWithId{} } func (m *RawSpaceHeaderWithId) String() string { return proto.CompactTextString(m) } func (*RawSpaceHeaderWithId) ProtoMessage() {} func (*RawSpaceHeaderWithId) Descriptor() ([]byte, []int) { - return fileDescriptor_5855f4ef9cf24cdb, []int{15} + return fileDescriptor_80e49f1f4ac27799, []int{15} } func (m *RawSpaceHeaderWithId) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1037,72 +1037,72 @@ func init() { } func init() { - proto.RegisterFile("common/commonspace/spacesyncproto/protos/spacesync.proto", fileDescriptor_5855f4ef9cf24cdb) + proto.RegisterFile("commonspace/spacesyncproto/protos/spacesync.proto", fileDescriptor_80e49f1f4ac27799) } -var fileDescriptor_5855f4ef9cf24cdb = []byte{ - // 965 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xcd, 0x92, 0xdb, 0x44, - 0x10, 0xb6, 0xbc, 0x3f, 0xb6, 0xdb, 0x5e, 0xaf, 0x33, 0xf9, 0x41, 0x38, 0xc4, 0x31, 0x3a, 0x50, - 0x5b, 0x50, 0xac, 0x29, 0x73, 0xe0, 0x67, 0xa9, 0x82, 0x64, 0xe3, 0x2d, 0xbb, 0x42, 0x92, 0xad, - 0xd9, 0x04, 0xaa, 0x28, 0x2e, 0x13, 0x69, 0xd6, 0x16, 0x91, 0x35, 0x62, 0x66, 0x8c, 0xe3, 0x27, - 0xe0, 0x02, 0x55, 0xbc, 0x02, 0xcf, 0xc2, 0x85, 0x63, 0x8e, 0x39, 0x52, 0xbb, 0x2f, 0x42, 0x4d, - 0x4b, 0xb2, 0x24, 0x47, 0x49, 0x8e, 0xb9, 0xd8, 0xd3, 0x3d, 0x5f, 0xf7, 0x7c, 0xf3, 0x75, 0x8f, - 0xdb, 0xf0, 0xa5, 0x2b, 0xe6, 0x73, 0x11, 0x0e, 0xe2, 0x2f, 0x15, 0x31, 0x97, 0x0f, 0xf0, 0x53, - 0xad, 0x42, 0x37, 0x92, 0x42, 0x8b, 0x01, 0x7e, 0xaa, 0xcc, 0x7b, 0x88, 0x0e, 0x52, 0x67, 0xe1, - 0xea, 0xcc, 0xf8, 0xba, 0x83, 0xe8, 0xd9, 0x74, 0xc0, 0xdc, 0x60, 0xa0, 0x25, 0xe7, 0xee, 0x8c, - 0x85, 0x53, 0x5e, 0x88, 0xcc, 0xdc, 0x71, 0x68, 0xf7, 0xd3, 0x34, 0x80, 0xb9, 0x81, 0xe4, 0xae, - 0x90, 0x5e, 0x01, 0xbf, 0xf6, 0xc6, 0x70, 0x67, 0x02, 0x7b, 0x63, 0xce, 0xbc, 0xb3, 0x55, 0xe8, - 0x52, 0x93, 0x85, 0x10, 0xd8, 0x3e, 0x97, 0x62, 0x6e, 0x5b, 0x7d, 0xeb, 0x60, 0x9b, 0xe2, 0x9a, - 0xb4, 0xa1, 0xaa, 0x85, 0x5d, 0x45, 0x4f, 0x55, 0x0b, 0x72, 0x0d, 0x76, 0x02, 0x7f, 0xee, 0x6b, - 0x7b, 0xab, 0x6f, 0x1d, 0xec, 0xd1, 0xd8, 0x70, 0x96, 0xd0, 0x5e, 0xa7, 0xe2, 0x6a, 0x11, 0x68, - 0x93, 0x6b, 0xc6, 0xd4, 0x0c, 0x73, 0xb5, 0x28, 0xae, 0xc9, 0x11, 0xd4, 0x79, 0xc0, 0xe7, 0x3c, - 0xd4, 0xca, 0xae, 0xf6, 0xb7, 0x0e, 0x9a, 0xc3, 0xdb, 0x87, 0xe9, 0x6d, 0x0f, 0x8b, 0xf1, 0xa3, - 0x18, 0x47, 0xd7, 0x01, 0xe6, 0x60, 0x57, 0x2c, 0xc2, 0xf5, 0xc1, 0x68, 0x38, 0x47, 0x70, 0xbd, - 0x34, 0xd0, 0xf0, 0xf6, 0x3d, 0x3c, 0xbd, 0x41, 0xab, 0xbe, 0x87, 0x7c, 0x38, 0xf3, 0xf0, 0x26, - 0x0d, 0x8a, 0x6b, 0xe7, 0x67, 0xd8, 0xcf, 0x82, 0x7f, 0x5d, 0x70, 0xa5, 0x89, 0x0d, 0x35, 0x2c, - 0xc8, 0x24, 0x8d, 0x4d, 0x4d, 0x32, 0x80, 0x5d, 0x69, 0x54, 0x4a, 0xa9, 0xbf, 0x57, 0x42, 0xdd, - 0xec, 0xd3, 0x04, 0xe6, 0x9c, 0x40, 0x27, 0x47, 0x2d, 0x12, 0xa1, 0xe2, 0x64, 0x08, 0x35, 0x89, - 0x34, 0x95, 0x6d, 0x61, 0x16, 0xfb, 0x75, 0x02, 0xd0, 0x14, 0xe8, 0x5c, 0x58, 0x70, 0xe5, 0xd1, - 0xd3, 0x5f, 0xb8, 0xab, 0xcd, 0xee, 0x03, 0xae, 0x14, 0x9b, 0xf2, 0x37, 0x10, 0xfd, 0x1a, 0x6a, - 0xae, 0x08, 0x35, 0x0f, 0x35, 0x5e, 0xb6, 0x39, 0xec, 0x67, 0x67, 0x64, 0x79, 0x8e, 0x63, 0xc8, - 0x0f, 0x2c, 0x58, 0x70, 0x9a, 0x06, 0x90, 0x6f, 0x01, 0xa4, 0x10, 0xfa, 0x18, 0xbb, 0x0a, 0x95, - 0x36, 0x35, 0xca, 0x35, 0x1a, 0x65, 0xcb, 0xc7, 0x92, 0xf3, 0x18, 0xf0, 0xa3, 0xaf, 0x67, 0x13, - 0x8f, 0xe6, 0x42, 0xc8, 0x0d, 0xd8, 0x35, 0xe8, 0x89, 0x67, 0x6f, 0x23, 0xab, 0xc4, 0x22, 0x3d, - 0x00, 0x2d, 0x99, 0xfb, 0xcc, 0x0f, 0xa7, 0x13, 0xcf, 0xde, 0xc1, 0xbd, 0x9c, 0xc7, 0xf9, 0xa7, - 0x0a, 0x37, 0xca, 0xc9, 0x91, 0x6f, 0x00, 0x4c, 0xb5, 0x9e, 0x44, 0x1e, 0xd3, 0x1c, 0x2f, 0xdb, - 0x1c, 0x76, 0x37, 0xaf, 0x34, 0x5e, 0x23, 0xc6, 0x15, 0x9a, 0xc3, 0x93, 0xfb, 0xb0, 0x7f, 0xbe, - 0x08, 0x82, 0x5c, 0x8d, 0x13, 0x55, 0x6e, 0x6f, 0xa6, 0x38, 0x29, 0xc2, 0xc6, 0x15, 0xba, 0x19, - 0x49, 0x1e, 0x42, 0x27, 0x73, 0xc5, 0x25, 0x4d, 0x44, 0xea, 0xbf, 0x3e, 0x5b, 0x8c, 0x1b, 0x57, - 0xe8, 0x2b, 0xb1, 0x64, 0x04, 0x7b, 0x5c, 0x4a, 0x21, 0xd7, 0xc9, 0xb6, 0x31, 0xd9, 0xad, 0xcd, - 0x64, 0xa3, 0x3c, 0x68, 0x5c, 0xa1, 0xc5, 0xa8, 0xbb, 0x35, 0xd8, 0xf9, 0xcd, 0x48, 0xe5, 0xfc, - 0x6e, 0x41, 0x67, 0x53, 0x0f, 0xf3, 0x70, 0x8c, 0x1e, 0x71, 0xc7, 0x35, 0x68, 0x6c, 0x90, 0xaf, - 0xa0, 0x16, 0x97, 0x34, 0x7b, 0x8a, 0x6f, 0x29, 0x73, 0x8a, 0x27, 0x0e, 0xb4, 0x54, 0xc8, 0x22, - 0x35, 0x13, 0xfa, 0x94, 0xe9, 0x99, 0xbd, 0x85, 0x79, 0x0b, 0x3e, 0xe7, 0x0f, 0x0b, 0xae, 0x97, - 0xca, 0xfa, 0x6e, 0xe8, 0xfc, 0x69, 0xa5, 0xed, 0xb5, 0x59, 0x97, 0x77, 0xc3, 0xe7, 0x13, 0xb8, - 0x5a, 0x52, 0x59, 0xc3, 0x05, 0x2b, 0x9b, 0x3c, 0xe9, 0xd8, 0x30, 0xe4, 0x3b, 0xa7, 0x0b, 0x35, - 0xc3, 0x8e, 0x48, 0x65, 0xfc, 0x0e, 0x9a, 0xf8, 0xe0, 0x4d, 0xa1, 0xb9, 0x4c, 0x7a, 0xba, 0x97, - 0x35, 0x0e, 0x65, 0xcb, 0xb3, 0x6c, 0x3f, 0xe1, 0x98, 0x0f, 0x21, 0x5f, 0x40, 0x8d, 0xb9, 0x01, - 0x15, 0x42, 0x27, 0x3d, 0x7c, 0xeb, 0x30, 0x9b, 0x10, 0x94, 0x2d, 0xef, 0x1c, 0x7f, 0x4f, 0xd1, - 0x48, 0x2f, 0x98, 0xa0, 0x9d, 0xab, 0x70, 0x25, 0x47, 0x27, 0xa6, 0xee, 0xfc, 0x6d, 0x41, 0x33, - 0x77, 0x20, 0xe9, 0x42, 0xdd, 0xf7, 0x78, 0xa8, 0x7d, 0xbd, 0x4a, 0x66, 0xc0, 0xda, 0x26, 0x1f, - 0x40, 0x43, 0xfb, 0x73, 0xae, 0x34, 0x9b, 0x47, 0xc8, 0x7c, 0x8b, 0x66, 0x0e, 0xb3, 0x8b, 0x34, - 0x1f, 0xaf, 0xa2, 0xf8, 0x75, 0x35, 0x68, 0xe6, 0x20, 0x1f, 0x41, 0x5b, 0xf2, 0x28, 0xf0, 0x5d, - 0xa6, 0x7d, 0x11, 0xde, 0xe7, 0x2b, 0x7c, 0x33, 0xdb, 0x74, 0xc3, 0x6b, 0x7e, 0xef, 0x15, 0xe7, - 0xf1, 0x4f, 0x4d, 0x8b, 0xe2, 0xda, 0x39, 0x85, 0x76, 0x51, 0x16, 0xd2, 0x2f, 0xaa, 0x18, 0x13, - 0x2d, 0xa8, 0x64, 0xd8, 0xf8, 0xd3, 0x90, 0xe9, 0x85, 0xe4, 0xc8, 0xb5, 0x45, 0x33, 0x87, 0x73, - 0x0f, 0xae, 0x95, 0x09, 0x6d, 0xa2, 0x24, 0x5b, 0x16, 0xb2, 0x66, 0x8e, 0x64, 0x36, 0x55, 0xd3, - 0xd9, 0xf4, 0xf1, 0x43, 0xa8, 0x8f, 0xa4, 0x3c, 0x16, 0x1e, 0x57, 0xa4, 0x0d, 0xf0, 0x24, 0xe4, - 0xcf, 0x23, 0xee, 0x6a, 0xee, 0x75, 0x2a, 0xa4, 0x03, 0x2d, 0x4c, 0xff, 0xc0, 0x57, 0xca, 0x0f, - 0xa7, 0x1d, 0x8b, 0xec, 0x27, 0x42, 0x8f, 0x9e, 0xfb, 0x4a, 0xab, 0x4e, 0xd5, 0x38, 0xb0, 0x8d, - 0x1e, 0x9d, 0x9f, 0x2b, 0xae, 0x3b, 0xde, 0xf0, 0xa5, 0x05, 0x3b, 0x08, 0x21, 0x77, 0xa0, 0x9e, - 0x8e, 0x15, 0xf2, 0x7e, 0xd9, 0xa8, 0xc1, 0x66, 0xea, 0x76, 0x4b, 0xa7, 0x50, 0xdc, 0x93, 0xf7, - 0xa0, 0xb1, 0xae, 0x36, 0xc9, 0x01, 0x37, 0x3b, 0xb2, 0x7b, 0xb3, 0x74, 0x2f, 0xc9, 0x72, 0x02, - 0xbb, 0x67, 0x5a, 0x72, 0x36, 0x27, 0x37, 0xcb, 0xa6, 0x51, 0x32, 0xd5, 0xba, 0x6f, 0xda, 0x3c, - 0xb0, 0x3e, 0xb3, 0xee, 0x1e, 0xfd, 0x7b, 0xd1, 0xb3, 0x5e, 0x5c, 0xf4, 0xac, 0xff, 0x2e, 0x7a, - 0xd6, 0x5f, 0x97, 0xbd, 0xca, 0x8b, 0xcb, 0x5e, 0xe5, 0xe5, 0x65, 0xaf, 0xf2, 0xd3, 0x87, 0x6f, - 0xfd, 0xc7, 0xf5, 0x74, 0x17, 0xbf, 0x3e, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x2e, 0x4f, 0xd9, - 0xa3, 0x9d, 0x09, 0x00, 0x00, +var fileDescriptor_80e49f1f4ac27799 = []byte{ + // 963 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0x4f, 0x8f, 0xdb, 0x44, + 0x14, 0x8f, 0xb3, 0xd9, 0x4d, 0xf2, 0x92, 0x66, 0xd3, 0xe9, 0x1f, 0x4c, 0x4a, 0xd3, 0xc8, 0x07, + 0xb4, 0x02, 0xb1, 0x81, 0x80, 0x84, 0xa0, 0x48, 0xd0, 0x6e, 0xb3, 0x4a, 0x54, 0xda, 0xae, 0x66, + 0x5b, 0x90, 0x10, 0x97, 0xa9, 0x3d, 0x9b, 0x98, 0x3a, 0x1e, 0x33, 0x33, 0x21, 0xcd, 0x27, 0xe0, + 0x02, 0x12, 0x5f, 0x81, 0xcf, 0xc2, 0x85, 0x63, 0x8f, 0x3d, 0xa2, 0xdd, 0x2f, 0x82, 0xe6, 0xd9, + 0x8e, 0xed, 0xe0, 0x2d, 0xc7, 0x5e, 0xb2, 0xf3, 0xde, 0xfc, 0xde, 0x9b, 0xdf, 0xfc, 0xde, 0x1b, + 0xbf, 0x85, 0x4f, 0x5c, 0xb1, 0x58, 0x88, 0x50, 0x45, 0xcc, 0xe5, 0x43, 0xfc, 0x55, 0xeb, 0xd0, + 0x8d, 0xa4, 0xd0, 0x62, 0x88, 0xbf, 0x2a, 0xf3, 0x1e, 0xa2, 0x83, 0x34, 0x58, 0xb8, 0x3e, 0x35, + 0xbe, 0xde, 0x30, 0x7a, 0x31, 0x1b, 0x32, 0x37, 0x18, 0x6a, 0xc9, 0xb9, 0x3b, 0x67, 0xe1, 0x8c, + 0x17, 0x22, 0x33, 0x77, 0x1c, 0xda, 0xfb, 0x28, 0x0d, 0x60, 0x6e, 0x20, 0xb9, 0x2b, 0xa4, 0x57, + 0xc0, 0x6f, 0xbc, 0x31, 0xdc, 0x99, 0xc2, 0x95, 0x09, 0x67, 0xde, 0xe9, 0x3a, 0x74, 0xa9, 0xc9, + 0x42, 0x08, 0xd4, 0xce, 0xa4, 0x58, 0xd8, 0xd6, 0xc0, 0x3a, 0xa8, 0x51, 0x5c, 0x93, 0x0e, 0x54, + 0xb5, 0xb0, 0xab, 0xe8, 0xa9, 0x6a, 0x41, 0xae, 0xc3, 0x6e, 0xe0, 0x2f, 0x7c, 0x6d, 0xef, 0x0c, + 0xac, 0x83, 0x2b, 0x34, 0x36, 0x9c, 0x15, 0x74, 0x36, 0xa9, 0xb8, 0x5a, 0x06, 0xda, 0xe4, 0x9a, + 0x33, 0x35, 0xc7, 0x5c, 0x6d, 0x8a, 0x6b, 0x72, 0x17, 0x1a, 0x3c, 0xe0, 0x0b, 0x1e, 0x6a, 0x65, + 0x57, 0x07, 0x3b, 0x07, 0xad, 0xd1, 0x9d, 0xc3, 0xf4, 0xb6, 0x87, 0xc5, 0xf8, 0x71, 0x8c, 0xa3, + 0x9b, 0x00, 0x73, 0xb0, 0x2b, 0x96, 0xe1, 0xe6, 0x60, 0x34, 0x9c, 0xbb, 0x70, 0xa3, 0x34, 0xd0, + 0xf0, 0xf6, 0x3d, 0x3c, 0xbd, 0x49, 0xab, 0xbe, 0x87, 0x7c, 0x38, 0xf3, 0xf0, 0x26, 0x4d, 0x8a, + 0x6b, 0xe7, 0x47, 0xd8, 0xcf, 0x82, 0x7f, 0x5e, 0x72, 0xa5, 0x89, 0x0d, 0x75, 0x2c, 0xc8, 0x34, + 0x8d, 0x4d, 0x4d, 0x32, 0x84, 0x3d, 0x69, 0x54, 0x4a, 0xa9, 0xbf, 0x53, 0x42, 0xdd, 0xec, 0xd3, + 0x04, 0xe6, 0x1c, 0x43, 0x37, 0x47, 0x2d, 0x12, 0xa1, 0xe2, 0x64, 0x04, 0x75, 0x89, 0x34, 0x95, + 0x6d, 0x61, 0x16, 0xfb, 0x32, 0x01, 0x68, 0x0a, 0x74, 0xce, 0x2d, 0xb8, 0xfa, 0xe4, 0xf9, 0x4f, + 0xdc, 0xd5, 0x66, 0xf7, 0x11, 0x57, 0x8a, 0xcd, 0xf8, 0x1b, 0x88, 0x7e, 0x09, 0x75, 0x57, 0x84, + 0x9a, 0x87, 0x1a, 0x2f, 0xdb, 0x1a, 0x0d, 0xb2, 0x33, 0xb2, 0x3c, 0x47, 0x31, 0xe4, 0x3b, 0x16, + 0x2c, 0x39, 0x4d, 0x03, 0xc8, 0xd7, 0x00, 0x52, 0x08, 0x7d, 0x84, 0x5d, 0x85, 0x4a, 0x9b, 0x1a, + 0xe5, 0x1a, 0x8d, 0xb2, 0xd5, 0x53, 0xc9, 0x79, 0x0c, 0xf8, 0xde, 0xd7, 0xf3, 0xa9, 0x47, 0x73, + 0x21, 0xe4, 0x26, 0xec, 0x19, 0xf4, 0xd4, 0xb3, 0x6b, 0xc8, 0x2a, 0xb1, 0x48, 0x1f, 0x40, 0x4b, + 0xe6, 0xbe, 0xf0, 0xc3, 0xd9, 0xd4, 0xb3, 0x77, 0x71, 0x2f, 0xe7, 0x71, 0xfe, 0xaa, 0xc2, 0xcd, + 0x72, 0x72, 0xe4, 0x2b, 0x00, 0x53, 0xad, 0x67, 0x91, 0xc7, 0x34, 0xc7, 0xcb, 0xb6, 0x46, 0xbd, + 0xed, 0x2b, 0x4d, 0x36, 0x88, 0x49, 0x85, 0xe6, 0xf0, 0xe4, 0x21, 0xec, 0x9f, 0x2d, 0x83, 0x20, + 0x57, 0xe3, 0x44, 0x95, 0x3b, 0xdb, 0x29, 0x8e, 0x8b, 0xb0, 0x49, 0x85, 0x6e, 0x47, 0x92, 0xc7, + 0xd0, 0xcd, 0x5c, 0x71, 0x49, 0x13, 0x91, 0x06, 0x97, 0x67, 0x8b, 0x71, 0x93, 0x0a, 0xfd, 0x4f, + 0x2c, 0x19, 0xc3, 0x15, 0x2e, 0xa5, 0x90, 0x9b, 0x64, 0x35, 0x4c, 0x76, 0x7b, 0x3b, 0xd9, 0x38, + 0x0f, 0x9a, 0x54, 0x68, 0x31, 0xea, 0x7e, 0x1d, 0x76, 0x7f, 0x31, 0x52, 0x39, 0xbf, 0x5a, 0xd0, + 0xdd, 0xd6, 0xc3, 0x3c, 0x1c, 0xa3, 0x47, 0xdc, 0x71, 0x4d, 0x1a, 0x1b, 0xe4, 0x0b, 0xa8, 0xc7, + 0x25, 0xcd, 0x9e, 0xe2, 0xff, 0x94, 0x39, 0xc5, 0x13, 0x07, 0xda, 0x2a, 0x64, 0x91, 0x9a, 0x0b, + 0x7d, 0xc2, 0xf4, 0xdc, 0xde, 0xc1, 0xbc, 0x05, 0x9f, 0xf3, 0x9b, 0x05, 0x37, 0x4a, 0x65, 0x7d, + 0x3b, 0x74, 0x7e, 0xb7, 0xd2, 0xf6, 0xda, 0xae, 0xcb, 0xdb, 0xe1, 0xf3, 0x21, 0x5c, 0x2b, 0xa9, + 0xac, 0xe1, 0x82, 0x95, 0x4d, 0x9e, 0x74, 0x6c, 0x18, 0xf2, 0xdd, 0x93, 0xa5, 0x9a, 0x63, 0x47, + 0xa4, 0x32, 0x7e, 0x03, 0x2d, 0x7c, 0xf0, 0xa6, 0xd0, 0x5c, 0x26, 0x3d, 0xdd, 0xcf, 0x1a, 0x87, + 0xb2, 0xd5, 0x69, 0xb6, 0x9f, 0x70, 0xcc, 0x87, 0x90, 0xcf, 0xa1, 0xce, 0xdc, 0x80, 0x0a, 0xa1, + 0x93, 0x1e, 0xbe, 0x7d, 0x98, 0x4d, 0x08, 0xca, 0x56, 0xf7, 0x8e, 0xbe, 0xa5, 0x68, 0xa4, 0x17, + 0x4c, 0xd0, 0xce, 0x35, 0xb8, 0x9a, 0xa3, 0x13, 0x53, 0x77, 0xfe, 0xb4, 0xa0, 0x95, 0x3b, 0x90, + 0xf4, 0xa0, 0xe1, 0x7b, 0x3c, 0xd4, 0xbe, 0x5e, 0x27, 0x33, 0x60, 0x63, 0x93, 0xf7, 0xa0, 0xa9, + 0xfd, 0x05, 0x57, 0x9a, 0x2d, 0x22, 0x64, 0xbe, 0x43, 0x33, 0x87, 0xd9, 0x45, 0x9a, 0x4f, 0xd7, + 0x51, 0xfc, 0xba, 0x9a, 0x34, 0x73, 0x90, 0xf7, 0xa1, 0x23, 0x79, 0x14, 0xf8, 0x2e, 0xd3, 0xbe, + 0x08, 0x1f, 0xf2, 0x35, 0xbe, 0x99, 0x1a, 0xdd, 0xf2, 0x9a, 0xef, 0xbd, 0xe2, 0x3c, 0xfe, 0xd4, + 0xb4, 0x29, 0xae, 0x9d, 0x13, 0xe8, 0x14, 0x65, 0x21, 0x83, 0xa2, 0x8a, 0x31, 0xd1, 0x82, 0x4a, + 0x86, 0x8d, 0x3f, 0x0b, 0x99, 0x5e, 0x4a, 0x8e, 0x5c, 0xdb, 0x34, 0x73, 0x38, 0x0f, 0xe0, 0x7a, + 0x99, 0xd0, 0x26, 0x4a, 0xb2, 0x55, 0x21, 0x6b, 0xe6, 0x48, 0x66, 0x53, 0x35, 0x9d, 0x4d, 0x1f, + 0x3c, 0x86, 0xc6, 0x58, 0xca, 0x23, 0xe1, 0x71, 0x45, 0x3a, 0x00, 0xcf, 0x42, 0xfe, 0x32, 0xe2, + 0xae, 0xe6, 0x5e, 0xb7, 0x42, 0xba, 0xd0, 0xc6, 0xf4, 0x8f, 0x7c, 0xa5, 0xfc, 0x70, 0xd6, 0xb5, + 0xc8, 0x7e, 0x22, 0xf4, 0xf8, 0xa5, 0xaf, 0xb4, 0xea, 0x56, 0x8d, 0x03, 0xdb, 0xe8, 0xc9, 0xd9, + 0x99, 0xe2, 0xba, 0xeb, 0x8d, 0x5e, 0x5b, 0xb0, 0x8b, 0x10, 0x72, 0x0f, 0x1a, 0xe9, 0x58, 0x21, + 0xef, 0x96, 0x8d, 0x1a, 0x6c, 0xa6, 0x5e, 0xaf, 0x74, 0x0a, 0xc5, 0x3d, 0xf9, 0x00, 0x9a, 0x9b, + 0x6a, 0x93, 0x1c, 0x70, 0xbb, 0x23, 0x7b, 0xb7, 0x4a, 0xf7, 0x92, 0x2c, 0xc7, 0xb0, 0x77, 0xaa, + 0x25, 0x67, 0x0b, 0x72, 0xab, 0x6c, 0x1a, 0x25, 0x53, 0xad, 0xf7, 0xa6, 0xcd, 0x03, 0xeb, 0x63, + 0xeb, 0xfe, 0x67, 0x7f, 0x9f, 0xf7, 0xad, 0x57, 0xe7, 0x7d, 0xeb, 0x9f, 0xf3, 0xbe, 0xf5, 0xc7, + 0x45, 0xbf, 0xf2, 0xea, 0xa2, 0x5f, 0x79, 0x7d, 0xd1, 0xaf, 0xfc, 0xd0, 0xbb, 0xfc, 0x5f, 0xad, + 0xe7, 0x7b, 0xf8, 0xe7, 0xd3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x39, 0x40, 0xba, 0x5d, 0x8f, + 0x09, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { diff --git a/common/commonspace/spacesyncproto/spacesync_drpc.pb.go b/common/commonspace/spacesyncproto/spacesync_drpc.pb.go index d17223ae..c5af9cef 100644 --- a/common/commonspace/spacesyncproto/spacesync_drpc.pb.go +++ b/common/commonspace/spacesyncproto/spacesync_drpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-drpc. DO NOT EDIT. // protoc-gen-go-drpc version: v0.0.32 -// source: common/commonspace/spacesyncproto/protos/spacesync.proto +// source: commonspace/spacesyncproto/protos/spacesync.proto package spacesyncproto @@ -14,17 +14,17 @@ import ( drpcerr "storj.io/drpc/drpcerr" ) -type drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto struct{} +type drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto struct{} -func (drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto) Marshal(msg drpc.Message) ([]byte, error) { +func (drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto) Marshal(msg drpc.Message) ([]byte, error) { return proto.Marshal(msg.(proto.Message)) } -func (drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto) Unmarshal(buf []byte, msg drpc.Message) error { +func (drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto) Unmarshal(buf []byte, msg drpc.Message) error { return proto.Unmarshal(buf, msg.(proto.Message)) } -func (drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto) JSONMarshal(msg drpc.Message) ([]byte, error) { +func (drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto) JSONMarshal(msg drpc.Message) ([]byte, error) { var buf bytes.Buffer err := new(jsonpb.Marshaler).Marshal(&buf, msg.(proto.Message)) if err != nil { @@ -33,7 +33,7 @@ func (drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto return buf.Bytes(), nil } -func (drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error { +func (drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error { return jsonpb.Unmarshal(bytes.NewReader(buf), msg.(proto.Message)) } @@ -57,7 +57,7 @@ func (c *drpcSpaceClient) DRPCConn() drpc.Conn { return c.cc } func (c *drpcSpaceClient) HeadSync(ctx context.Context, in *HeadSyncRequest) (*HeadSyncResponse, error) { out := new(HeadSyncResponse) - err := c.cc.Invoke(ctx, "/anySpace.Space/HeadSync", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}, in, out) + err := c.cc.Invoke(ctx, "/anySpace.Space/HeadSync", drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}, in, out) if err != nil { return nil, err } @@ -66,7 +66,7 @@ func (c *drpcSpaceClient) HeadSync(ctx context.Context, in *HeadSyncRequest) (*H func (c *drpcSpaceClient) PushSpace(ctx context.Context, in *PushSpaceRequest) (*PushSpaceResponse, error) { out := new(PushSpaceResponse) - err := c.cc.Invoke(ctx, "/anySpace.Space/PushSpace", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}, in, out) + err := c.cc.Invoke(ctx, "/anySpace.Space/PushSpace", drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}, in, out) if err != nil { return nil, err } @@ -74,7 +74,7 @@ func (c *drpcSpaceClient) PushSpace(ctx context.Context, in *PushSpaceRequest) ( } func (c *drpcSpaceClient) Stream(ctx context.Context) (DRPCSpace_StreamClient, error) { - stream, err := c.cc.NewStream(ctx, "/anySpace.Space/Stream", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) + stream, err := c.cc.NewStream(ctx, "/anySpace.Space/Stream", drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}) if err != nil { return nil, err } @@ -93,19 +93,19 @@ type drpcSpace_StreamClient struct { } func (x *drpcSpace_StreamClient) Send(m *ObjectSyncMessage) error { - return x.MsgSend(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) + return x.MsgSend(m, drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}) } func (x *drpcSpace_StreamClient) Recv() (*ObjectSyncMessage, error) { m := new(ObjectSyncMessage) - if err := x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { + if err := x.MsgRecv(m, drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { return nil, err } return m, nil } func (x *drpcSpace_StreamClient) RecvMsg(m *ObjectSyncMessage) error { - return x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) + return x.MsgRecv(m, drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}) } type DRPCSpaceServer interface { @@ -135,7 +135,7 @@ func (DRPCSpaceDescription) NumMethods() int { return 3 } func (DRPCSpaceDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { switch n { case 0: - return "/anySpace.Space/HeadSync", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}, + return "/anySpace.Space/HeadSync", drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}, func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { return srv.(DRPCSpaceServer). HeadSync( @@ -144,7 +144,7 @@ func (DRPCSpaceDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, ) }, DRPCSpaceServer.HeadSync, true case 1: - return "/anySpace.Space/PushSpace", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}, + return "/anySpace.Space/PushSpace", drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}, func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { return srv.(DRPCSpaceServer). PushSpace( @@ -153,7 +153,7 @@ func (DRPCSpaceDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, ) }, DRPCSpaceServer.PushSpace, true case 2: - return "/anySpace.Space/Stream", drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}, + return "/anySpace.Space/Stream", drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}, func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { return nil, srv.(DRPCSpaceServer). Stream( @@ -179,7 +179,7 @@ type drpcSpace_HeadSyncStream struct { } func (x *drpcSpace_HeadSyncStream) SendAndClose(m *HeadSyncResponse) error { - if err := x.MsgSend(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { + if err := x.MsgSend(m, drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { return err } return x.CloseSend() @@ -195,7 +195,7 @@ type drpcSpace_PushSpaceStream struct { } func (x *drpcSpace_PushSpaceStream) SendAndClose(m *PushSpaceResponse) error { - if err := x.MsgSend(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { + if err := x.MsgSend(m, drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { return err } return x.CloseSend() @@ -212,17 +212,17 @@ type drpcSpace_StreamStream struct { } func (x *drpcSpace_StreamStream) Send(m *ObjectSyncMessage) error { - return x.MsgSend(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) + return x.MsgSend(m, drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}) } func (x *drpcSpace_StreamStream) Recv() (*ObjectSyncMessage, error) { m := new(ObjectSyncMessage) - if err := x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { + if err := x.MsgRecv(m, drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { return nil, err } return m, nil } func (x *drpcSpace_StreamStream) RecvMsg(m *ObjectSyncMessage) error { - return x.MsgRecv(m, drpcEncoding_File_common_commonspace_spacesyncproto_protos_spacesync_proto{}) + return x.MsgRecv(m, drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}) } diff --git a/common/go.mod b/common/go.mod new file mode 100644 index 00000000..c80a866c --- /dev/null +++ b/common/go.mod @@ -0,0 +1,64 @@ +module github.com/anytypeio/go-anytype-infrastructure-experiments/common + +go 1.19 + +require ( + github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 + github.com/awalterschulze/gographviz v2.0.3+incompatible + github.com/cespare/xxhash v1.1.0 + github.com/goccy/go-graphviz v0.0.9 + github.com/gogo/protobuf v1.3.2 + github.com/golang/mock v1.6.0 + github.com/huandu/skiplist v1.2.0 + github.com/ipfs/go-cid v0.3.2 + github.com/libp2p/go-libp2p v0.23.2 + github.com/libp2p/go-libp2p-core v0.20.1 + github.com/minio/sha256-simd v1.0.0 + github.com/multiformats/go-multibase v0.1.1 + github.com/multiformats/go-multihash v0.2.1 + github.com/prometheus/client_golang v1.13.0 + github.com/stretchr/testify v1.8.0 + github.com/zeebo/blake3 v0.2.3 + github.com/zeebo/errs v1.3.0 + go.uber.org/zap v1.23.0 + gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 + 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/v2 v2.1.2 // 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/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/klauspost/cpuid/v2 v2.1.1 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/libp2p/go-openssl v0.1.0 // indirect + github.com/mattn/go-isatty v0.0.16 // indirect + github.com/mattn/go-pointer v0.0.1 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // 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-multiaddr v0.7.0 // indirect + github.com/multiformats/go-multicodec v0.6.0 // 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_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 + 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/image v0.0.0-20200119044424-58c23975cae1 // indirect + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect + google.golang.org/protobuf v1.28.1 // indirect + lukechampine.com/blake3 v1.1.7 // indirect +) diff --git a/common/go.sum b/common/go.sum new file mode 100644 index 00000000..3f5b91c2 --- /dev/null +++ b/common/go.sum @@ -0,0 +1,617 @@ +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/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-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/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= +github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +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/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA= +github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= +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= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +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/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +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/goccy/go-graphviz v0.0.9 h1:s/FMMJ1Joj6La3S5ApO3Jk2cwM4LpXECC2muFx3IPQQ= +github.com/goccy/go-graphviz v0.0.9/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= +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/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +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/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/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +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/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/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.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/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/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +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-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-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= +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/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/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= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +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/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +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/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= +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-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.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.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/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= +github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +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/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= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +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.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/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/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= +github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= +github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= +github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= +github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= +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.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +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/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= +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-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/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/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/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/mod v0.4.2/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +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/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/sync v0.0.0-20210220032951-036812b2e83c/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-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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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-20210630005230-0f9fa26af87c/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-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +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/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/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +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/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +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.2.8/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 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +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= diff --git a/common/pkg/acl/aclrecordproto/aclrecord.pb.go b/common/pkg/acl/aclrecordproto/aclrecord.pb.go index 158b70f5..e11f5209 100644 --- a/common/pkg/acl/aclrecordproto/aclrecord.pb.go +++ b/common/pkg/acl/aclrecordproto/aclrecord.pb.go @@ -324,6 +324,7 @@ func (m *ACLRoot) GetTimestamp() int64 { type ACLContentValue struct { // Types that are valid to be assigned to Value: + // // *ACLContentValue_UserAdd // *ACLContentValue_UserRemove // *ACLContentValue_UserPermissionChange diff --git a/common/pkg/acl/list/list.go b/common/pkg/acl/list/list.go index 3e6794ff..a86b2bc8 100644 --- a/common/pkg/acl/list/list.go +++ b/common/pkg/acl/list/list.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination mock_list/mock_list.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list ACLList +//go:generate mockgen -destination mock_list/mock_list.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list ACLList package list import ( diff --git a/common/pkg/acl/list/mock_list/mock_list.go b/common/pkg/acl/list/mock_list/mock_list.go index a28edf2b..e897882c 100644 --- a/common/pkg/acl/list/mock_list/mock_list.go +++ b/common/pkg/acl/list/mock_list/mock_list.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list (interfaces: ACLList) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list (interfaces: ACLList) // Package mock_list is a generated GoMock package. package mock_list diff --git a/common/pkg/acl/storage/liststorage.go b/common/pkg/acl/storage/liststorage.go index 02fd7ca3..42f80110 100644 --- a/common/pkg/acl/storage/liststorage.go +++ b/common/pkg/acl/storage/liststorage.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination mock_storage/mock_storage.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage ListStorage,TreeStorage +//go:generate mockgen -destination mock_storage/mock_storage.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage ListStorage,TreeStorage package storage import ( diff --git a/common/pkg/acl/storage/mock_storage/mock_storage.go b/common/pkg/acl/storage/mock_storage/mock_storage.go index 4c1a298c..5e8f3b6a 100644 --- a/common/pkg/acl/storage/mock_storage/mock_storage.go +++ b/common/pkg/acl/storage/mock_storage/mock_storage.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage (interfaces: ListStorage,TreeStorage) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage (interfaces: ListStorage,TreeStorage) // Package mock_storage is a generated GoMock package. package mock_storage diff --git a/common/pkg/acl/testutils/testchanges/proto/test.pb.go b/common/pkg/acl/testutils/testchanges/proto/test.pb.go index e8e43c54..d99ba0b5 100644 --- a/common/pkg/acl/testutils/testchanges/proto/test.pb.go +++ b/common/pkg/acl/testutils/testchanges/proto/test.pb.go @@ -60,6 +60,7 @@ var xxx_messageInfo_PlainTextChange proto.InternalMessageInfo type PlainTextChange_Content struct { // Types that are valid to be assigned to Value: + // // *PlainTextChange_Content_TextAppend Value isPlainTextChange_Content_Value `protobuf_oneof:"value"` } diff --git a/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go index 60935b3a..5d254a80 100644 --- a/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go +++ b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree (interfaces: ObjectTree) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree (interfaces: ObjectTree) // Package mock_tree is a generated GoMock package. package mock_tree diff --git a/common/pkg/acl/tree/objecttree.go b/common/pkg/acl/tree/objecttree.go index e11e33ac..b7a15e0a 100644 --- a/common/pkg/acl/tree/objecttree.go +++ b/common/pkg/acl/tree/objecttree.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination mock_objecttree/mock_objecttree.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree ObjectTree +//go:generate mockgen -destination mock_objecttree/mock_objecttree.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree ObjectTree package tree import ( diff --git a/common/pkg/ldiff/diff.go b/common/pkg/ldiff/diff.go index 2f9a5161..95ad70df 100644 --- a/common/pkg/ldiff/diff.go +++ b/common/pkg/ldiff/diff.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination mock_ldiff/mock_ldiff.go github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff Diff,Remote +//go:generate mockgen -destination mock_ldiff/mock_ldiff.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff Diff,Remote // Package ldiff provides a container of elements with fixed id and changeable content. // Diff can calculate the difference with another diff container (you can make it remote) with minimum hops and traffic. package ldiff diff --git a/common/pkg/ldiff/mock_ldiff/mock_ldiff.go b/common/pkg/ldiff/mock_ldiff/mock_ldiff.go index e90d6812..ae16314f 100644 --- a/common/pkg/ldiff/mock_ldiff/mock_ldiff.go +++ b/common/pkg/ldiff/mock_ldiff/mock_ldiff.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ldiff (interfaces: Diff,Remote) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff (interfaces: Diff,Remote) // Package mock_ldiff is a generated GoMock package. package mock_ldiff diff --git a/consensus/Makefile b/consensus/Makefile new file mode 100644 index 00000000..f48adb7e --- /dev/null +++ b/consensus/Makefile @@ -0,0 +1,12 @@ +.PHONY: proto build test +export GOPRIVATE=github.com/anytypeio + +proto: + protoc --gogofaster_out=:. --go-drpc_out=protolib=github.com/gogo/protobuf:. consensusproto/protos/*.proto + +build: + @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/consensus)) + go build -v -o ../bin/consensus-node -ldflags "$(FLAGS)" github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/cmd + +test: + go test ./... --cover \ No newline at end of file diff --git a/consensus/account/service.go b/consensus/account/service.go new file mode 100644 index 00000000..6f81b4fe --- /dev/null +++ b/consensus/account/service.go @@ -0,0 +1,62 @@ +package account + +import ( + commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" +) + +type service struct { + accountData *account.AccountData + peerId string +} + +func (s *service) Account() *account.AccountData { + return s.accountData +} + +func New() app.Component { + return &service{} +} + +func (s *service) Init(a *app.App) (err error) { + acc := a.MustComponent(config.CName).(commonaccount.ConfigGetter).GetAccount() + + decodedEncryptionKey, err := keys.DecodeKeyFromString( + acc.EncryptionKey, + encryptionkey.NewEncryptionRsaPrivKeyFromBytes, + nil) + if err != nil { + return err + } + + decodedSigningKey, err := keys.DecodeKeyFromString( + acc.SigningKey, + signingkey.NewSigningEd25519PrivKeyFromBytes, + nil) + if err != nil { + return err + } + + identity, err := decodedSigningKey.GetPublic().Raw() + if err != nil { + return err + } + + s.accountData = &account.AccountData{ + Identity: identity, + SignKey: decodedSigningKey, + EncKey: decodedEncryptionKey, + } + s.peerId = acc.PeerId + + return nil +} + +func (s *service) Name() (name string) { + return commonaccount.CName +} diff --git a/cmd/consensusnode/consensusnode.go b/consensus/cmd/consensusnode.go similarity index 96% rename from cmd/consensusnode/consensusnode.go rename to consensus/cmd/consensusnode.go index b073aa6e..136f2af9 100644 --- a/cmd/consensusnode/consensusnode.go +++ b/consensus/cmd/consensusnode.go @@ -9,11 +9,11 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusrpc" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/stream" - "github.com/anytypeio/go-anytype-infrastructure-experiments/node/account" "go.uber.org/zap" "net/http" _ "net/http/pprof" diff --git a/cmd/consensusnode/testclient/consensustestclient.go b/consensus/cmd/testclient/consensustestclient.go similarity index 99% rename from cmd/consensusnode/testclient/consensustestclient.go rename to consensus/cmd/testclient/consensustestclient.go index 6f8ee914..45d31152 100644 --- a/cmd/consensusnode/testclient/consensustestclient.go +++ b/consensus/cmd/testclient/consensustestclient.go @@ -12,10 +12,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" - "github.com/anytypeio/go-anytype-infrastructure-experiments/node/account" "go.uber.org/zap" "gopkg.in/mgo.v2/bson" "math/rand" diff --git a/consensus/consensusproto/consensus.pb.go b/consensus/consensusproto/consensus.pb.go index b8a52a16..a9aa1bb3 100644 --- a/consensus/consensusproto/consensus.pb.go +++ b/consensus/consensusproto/consensus.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: consensus/consensusproto/protos/consensus.proto +// source: consensusproto/protos/consensus.proto package consensusproto @@ -53,7 +53,7 @@ func (x ErrCodes) String() string { } func (ErrCodes) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_b8d7f1c16b400059, []int{0} + return fileDescriptor_6b92aaf7feaf5a54, []int{0} } type Log struct { @@ -65,7 +65,7 @@ func (m *Log) Reset() { *m = Log{} } func (m *Log) String() string { return proto.CompactTextString(m) } func (*Log) ProtoMessage() {} func (*Log) Descriptor() ([]byte, []int) { - return fileDescriptor_b8d7f1c16b400059, []int{0} + return fileDescriptor_6b92aaf7feaf5a54, []int{0} } func (m *Log) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -119,7 +119,7 @@ func (m *Record) Reset() { *m = Record{} } func (m *Record) String() string { return proto.CompactTextString(m) } func (*Record) ProtoMessage() {} func (*Record) Descriptor() ([]byte, []int) { - return fileDescriptor_b8d7f1c16b400059, []int{1} + return fileDescriptor_6b92aaf7feaf5a54, []int{1} } func (m *Record) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -183,7 +183,7 @@ func (m *Ok) Reset() { *m = Ok{} } func (m *Ok) String() string { return proto.CompactTextString(m) } func (*Ok) ProtoMessage() {} func (*Ok) Descriptor() ([]byte, []int) { - return fileDescriptor_b8d7f1c16b400059, []int{2} + return fileDescriptor_6b92aaf7feaf5a54, []int{2} } func (m *Ok) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -220,7 +220,7 @@ func (m *AddLogRequest) Reset() { *m = AddLogRequest{} } func (m *AddLogRequest) String() string { return proto.CompactTextString(m) } func (*AddLogRequest) ProtoMessage() {} func (*AddLogRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8d7f1c16b400059, []int{3} + return fileDescriptor_6b92aaf7feaf5a54, []int{3} } func (m *AddLogRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -265,7 +265,7 @@ func (m *AddRecordRequest) Reset() { *m = AddRecordRequest{} } func (m *AddRecordRequest) String() string { return proto.CompactTextString(m) } func (*AddRecordRequest) ProtoMessage() {} func (*AddRecordRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8d7f1c16b400059, []int{4} + return fileDescriptor_6b92aaf7feaf5a54, []int{4} } func (m *AddRecordRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -317,7 +317,7 @@ func (m *WatchLogRequest) Reset() { *m = WatchLogRequest{} } func (m *WatchLogRequest) String() string { return proto.CompactTextString(m) } func (*WatchLogRequest) ProtoMessage() {} func (*WatchLogRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_b8d7f1c16b400059, []int{5} + return fileDescriptor_6b92aaf7feaf5a54, []int{5} } func (m *WatchLogRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -369,7 +369,7 @@ func (m *WatchLogEvent) Reset() { *m = WatchLogEvent{} } func (m *WatchLogEvent) String() string { return proto.CompactTextString(m) } func (*WatchLogEvent) ProtoMessage() {} func (*WatchLogEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_b8d7f1c16b400059, []int{6} + return fileDescriptor_6b92aaf7feaf5a54, []int{6} } func (m *WatchLogEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -424,41 +424,41 @@ func init() { } func init() { - proto.RegisterFile("consensus/consensusproto/protos/consensus.proto", fileDescriptor_b8d7f1c16b400059) + proto.RegisterFile("consensusproto/protos/consensus.proto", fileDescriptor_6b92aaf7feaf5a54) } -var fileDescriptor_b8d7f1c16b400059 = []byte{ - // 474 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x4f, 0x8b, 0xd3, 0x40, - 0x14, 0xef, 0x24, 0xb5, 0xdb, 0xbe, 0xb4, 0xdd, 0xf8, 0x58, 0x24, 0x74, 0x31, 0x84, 0x78, 0x09, - 0x22, 0x5d, 0xa9, 0x82, 0x27, 0x0f, 0x6b, 0xa9, 0x50, 0xa9, 0x16, 0x02, 0x55, 0xf0, 0x64, 0xcc, - 0x4c, 0x63, 0xd8, 0x90, 0xa9, 0x33, 0xe9, 0xda, 0xfd, 0x16, 0x7e, 0x10, 0x3f, 0x88, 0x37, 0xf7, - 0xe8, 0x51, 0xda, 0x2f, 0x22, 0x9d, 0x34, 0x35, 0x71, 0xb7, 0x87, 0xbd, 0x24, 0xf3, 0x7e, 0xbf, - 0xf7, 0xe7, 0x37, 0xef, 0xc7, 0xc0, 0x59, 0xc8, 0x53, 0xc9, 0x52, 0xb9, 0x94, 0xff, 0x4e, 0x0b, - 0xc1, 0x33, 0x7e, 0xa6, 0xbe, 0x25, 0xb4, 0xaf, 0x00, 0x6c, 0x07, 0xe9, 0xd5, 0xb0, 0xc0, 0xdc, - 0x11, 0xe8, 0x13, 0x1e, 0x61, 0x17, 0xb4, 0x98, 0x5a, 0xc4, 0x21, 0x5e, 0xdb, 0xd7, 0x62, 0x8a, - 0x7d, 0x38, 0x12, 0x2c, 0xe4, 0x82, 0x4a, 0x4b, 0x73, 0x74, 0xcf, 0x18, 0x9c, 0xf4, 0xcb, 0x65, - 0x7d, 0x5f, 0x91, 0x7e, 0x91, 0xe4, 0x26, 0xd0, 0xc8, 0xa1, 0x1b, 0x9d, 0x1e, 0x40, 0x63, 0x21, - 0xd8, 0xe5, 0x98, 0x5a, 0x9a, 0xc2, 0x76, 0x11, 0x5a, 0x70, 0xb4, 0x08, 0xae, 0x12, 0x1e, 0x50, - 0x4b, 0x57, 0x44, 0x11, 0xa2, 0x03, 0x46, 0x28, 0x58, 0x90, 0x31, 0x3a, 0x4b, 0xe3, 0x95, 0x55, - 0x77, 0x88, 0x57, 0xf7, 0xcb, 0x90, 0x5b, 0x07, 0x6d, 0x7a, 0xe1, 0x3e, 0x87, 0xce, 0x39, 0xa5, - 0x13, 0x1e, 0xf9, 0xec, 0xeb, 0x92, 0xc9, 0x0c, 0x1f, 0x81, 0x9e, 0xf0, 0x48, 0xcd, 0x36, 0x06, - 0xf7, 0xab, 0x82, 0xb7, 0x69, 0x5b, 0xd6, 0x7d, 0x0f, 0xe6, 0x39, 0xa5, 0x3b, 0xfd, 0xbb, 0xc2, - 0x13, 0xb8, 0x97, 0xf0, 0x68, 0x5c, 0xc8, 0xce, 0x03, 0x7c, 0x02, 0x8d, 0xfc, 0x7a, 0x4a, 0xf9, - 0xa1, 0x15, 0xec, 0x72, 0xdc, 0xb7, 0x70, 0xfc, 0x21, 0xc8, 0xc2, 0x2f, 0x25, 0x3d, 0x3d, 0x68, - 0x7e, 0xdb, 0x42, 0x63, 0x2a, 0x2d, 0xe2, 0xe8, 0x5e, 0xdb, 0xdf, 0xc7, 0x68, 0x03, 0x2c, 0xd3, - 0x3d, 0xab, 0x29, 0xb6, 0x84, 0xb8, 0x33, 0xe8, 0x14, 0xed, 0x46, 0x97, 0x2c, 0x3d, 0xa4, 0xf1, - 0x8e, 0x3e, 0x3d, 0xfe, 0x04, 0xcd, 0x91, 0x10, 0x43, 0x4e, 0x99, 0xc4, 0x2e, 0xc0, 0x2c, 0x65, - 0xab, 0x05, 0x0b, 0x33, 0x46, 0xcd, 0x1a, 0x76, 0xa0, 0xb5, 0x9d, 0xb6, 0x8a, 0x65, 0x26, 0x4d, - 0x82, 0xc7, 0x60, 0x4c, 0x78, 0xf4, 0x8e, 0x67, 0xaf, 0xf9, 0x32, 0xa5, 0xa6, 0x86, 0x08, 0xdd, - 0xbc, 0xdd, 0x90, 0xa7, 0xf3, 0x24, 0x0e, 0x33, 0x53, 0x47, 0x13, 0x8c, 0x91, 0x10, 0x5c, 0x4c, - 0xe7, 0x73, 0xc9, 0x32, 0xf3, 0x87, 0x36, 0xf8, 0x45, 0xa0, 0xb5, 0x9f, 0x8f, 0x2f, 0xa0, 0x91, - 0x7b, 0x84, 0xa7, 0x55, 0x61, 0x15, 0xe7, 0x7a, 0x66, 0x95, 0x9c, 0x5e, 0xe0, 0x4b, 0x68, 0xed, - 0x6d, 0x42, 0xfb, 0x46, 0x6d, 0xc5, 0xbf, 0x5b, 0xca, 0xdf, 0x40, 0xb3, 0x58, 0x1f, 0x3e, 0xac, - 0xb2, 0xff, 0xb9, 0xd4, 0x3b, 0xbd, 0x9d, 0x56, 0x5b, 0xf7, 0xc8, 0x53, 0xf2, 0x6a, 0xf0, 0x73, - 0x6d, 0x93, 0xeb, 0xb5, 0x4d, 0xfe, 0xac, 0x6d, 0xf2, 0x7d, 0x63, 0xd7, 0xae, 0x37, 0x76, 0xed, - 0xf7, 0xc6, 0xae, 0x7d, 0xb4, 0x0e, 0xbd, 0xbd, 0xcf, 0x0d, 0xf5, 0x7b, 0xf6, 0x37, 0x00, 0x00, - 0xff, 0xff, 0x9f, 0x6e, 0xb2, 0xf8, 0x9e, 0x03, 0x00, 0x00, +var fileDescriptor_6b92aaf7feaf5a54 = []byte{ + // 475 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x4d, 0x8b, 0xd3, 0x50, + 0x14, 0xed, 0x4b, 0xc6, 0x4e, 0x7b, 0xd3, 0x8f, 0x78, 0x19, 0x24, 0x74, 0x30, 0x84, 0x88, 0x10, + 0x45, 0x5a, 0xa9, 0x82, 0x2b, 0x17, 0x63, 0xa9, 0x50, 0xa9, 0x16, 0x02, 0x55, 0x70, 0x65, 0xcc, + 0x7b, 0x8d, 0x61, 0x42, 0x5e, 0x7d, 0x2f, 0x1d, 0x3b, 0xff, 0xc2, 0x1f, 0xe2, 0x0f, 0x71, 0xe7, + 0x2c, 0x5d, 0x4a, 0xfb, 0x47, 0xa4, 0x2f, 0x4d, 0x68, 0x9c, 0x99, 0x85, 0x9b, 0x84, 0x7b, 0xce, + 0x3d, 0xf7, 0x9e, 0xdc, 0x43, 0xe0, 0x61, 0xc8, 0x53, 0xc9, 0x52, 0xb9, 0x92, 0x4b, 0xc1, 0x33, + 0x3e, 0x50, 0x4f, 0x39, 0x28, 0xd1, 0xbe, 0x02, 0xb0, 0x15, 0xa4, 0x97, 0xa3, 0x02, 0x73, 0xc7, + 0xa0, 0x4f, 0x79, 0x84, 0x1d, 0xd0, 0x62, 0x6a, 0x11, 0x87, 0x78, 0x2d, 0x5f, 0x8b, 0x29, 0xf6, + 0xe1, 0x58, 0xb0, 0x90, 0x0b, 0x2a, 0x2d, 0xcd, 0xd1, 0x3d, 0x63, 0x78, 0xd2, 0x3f, 0x94, 0xf5, + 0x7d, 0x45, 0xfa, 0x45, 0x93, 0x9b, 0x40, 0x3d, 0x87, 0xae, 0x4d, 0xba, 0x07, 0xf5, 0xa5, 0x60, + 0x17, 0x13, 0x6a, 0x69, 0x0a, 0xdb, 0x57, 0x68, 0xc1, 0xf1, 0x32, 0xb8, 0x4c, 0x78, 0x40, 0x2d, + 0x5d, 0x11, 0x45, 0x89, 0x0e, 0x18, 0xa1, 0x60, 0x41, 0xc6, 0xe8, 0x3c, 0x8d, 0xd7, 0xd6, 0x91, + 0x43, 0xbc, 0x23, 0xff, 0x10, 0x72, 0x8f, 0x40, 0x9b, 0x9d, 0xbb, 0xcf, 0xa1, 0x7d, 0x46, 0xe9, + 0x94, 0x47, 0x3e, 0xfb, 0xba, 0x62, 0x32, 0xc3, 0x07, 0xa0, 0x27, 0x3c, 0x52, 0xbb, 0x8d, 0xe1, + 0xdd, 0xaa, 0xe1, 0x5d, 0xdb, 0x8e, 0x75, 0xdf, 0x83, 0x79, 0x46, 0xe9, 0xde, 0xff, 0x5e, 0x78, + 0x02, 0x77, 0x12, 0x1e, 0x4d, 0x0a, 0xdb, 0x79, 0x81, 0x4f, 0xa0, 0x9e, 0x7f, 0x9e, 0x72, 0x7e, + 0xdb, 0x09, 0xf6, 0x3d, 0xee, 0x5b, 0xe8, 0x7e, 0x08, 0xb2, 0xf0, 0xcb, 0x81, 0x9f, 0x1e, 0x34, + 0xbe, 0xed, 0xa0, 0x09, 0x95, 0x16, 0x71, 0x74, 0xaf, 0xe5, 0x97, 0x35, 0xda, 0x00, 0xab, 0xb4, + 0x64, 0x35, 0xc5, 0x1e, 0x20, 0xee, 0x1c, 0xda, 0xc5, 0xb8, 0xf1, 0x05, 0x4b, 0x6f, 0xf3, 0xf8, + 0x9f, 0x39, 0x3d, 0xfe, 0x04, 0x8d, 0xb1, 0x10, 0x23, 0x4e, 0x99, 0xc4, 0x0e, 0xc0, 0x3c, 0x65, + 0xeb, 0x25, 0x0b, 0x33, 0x46, 0xcd, 0x1a, 0xb6, 0xa1, 0xb9, 0xdb, 0xb6, 0x8e, 0x65, 0x26, 0x4d, + 0x82, 0x5d, 0x30, 0xa6, 0x3c, 0x7a, 0xc7, 0xb3, 0xd7, 0x7c, 0x95, 0x52, 0x53, 0x43, 0x84, 0x4e, + 0x3e, 0x6e, 0xc4, 0xd3, 0x45, 0x12, 0x87, 0x99, 0xa9, 0xa3, 0x09, 0xc6, 0x58, 0x08, 0x2e, 0x66, + 0x8b, 0x85, 0x64, 0x99, 0xf9, 0x43, 0x1b, 0xfe, 0x22, 0xd0, 0x2c, 0xf7, 0xe3, 0x0b, 0xa8, 0xe7, + 0x19, 0xe1, 0x69, 0xd5, 0x58, 0x25, 0xb9, 0x9e, 0x59, 0x25, 0x67, 0xe7, 0xf8, 0x12, 0x9a, 0x65, + 0x4c, 0x68, 0x5f, 0xd3, 0x56, 0xf2, 0xbb, 0x41, 0xfe, 0x06, 0x1a, 0xc5, 0xf9, 0xf0, 0x7e, 0x95, + 0xfd, 0x27, 0xa5, 0xde, 0xe9, 0xcd, 0xb4, 0xba, 0xba, 0x47, 0x9e, 0x92, 0x57, 0x8f, 0x7e, 0x6e, + 0x6c, 0x72, 0xb5, 0xb1, 0xc9, 0x9f, 0x8d, 0x4d, 0xbe, 0x6f, 0xed, 0xda, 0xd5, 0xd6, 0xae, 0xfd, + 0xde, 0xda, 0xb5, 0x8f, 0xdd, 0x41, 0xf5, 0x97, 0xfb, 0x5c, 0x57, 0xaf, 0x67, 0x7f, 0x03, 0x00, + 0x00, 0xff, 0xff, 0x40, 0xd0, 0xc6, 0x8e, 0x8b, 0x03, 0x00, 0x00, } func (m *Log) Marshal() (dAtA []byte, err error) { diff --git a/consensus/consensusproto/consensus_drpc.pb.go b/consensus/consensusproto/consensus_drpc.pb.go index ccdf5bc9..c5ee4056 100644 --- a/consensus/consensusproto/consensus_drpc.pb.go +++ b/consensus/consensusproto/consensus_drpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-drpc. DO NOT EDIT. // protoc-gen-go-drpc version: v0.0.32 -// source: consensus/consensusproto/protos/consensus.proto +// source: consensusproto/protos/consensus.proto package consensusproto @@ -14,17 +14,17 @@ import ( drpcerr "storj.io/drpc/drpcerr" ) -type drpcEncoding_File_consensus_consensusproto_protos_consensus_proto struct{} +type drpcEncoding_File_consensusproto_protos_consensus_proto struct{} -func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) Marshal(msg drpc.Message) ([]byte, error) { +func (drpcEncoding_File_consensusproto_protos_consensus_proto) Marshal(msg drpc.Message) ([]byte, error) { return proto.Marshal(msg.(proto.Message)) } -func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) Unmarshal(buf []byte, msg drpc.Message) error { +func (drpcEncoding_File_consensusproto_protos_consensus_proto) Unmarshal(buf []byte, msg drpc.Message) error { return proto.Unmarshal(buf, msg.(proto.Message)) } -func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) JSONMarshal(msg drpc.Message) ([]byte, error) { +func (drpcEncoding_File_consensusproto_protos_consensus_proto) JSONMarshal(msg drpc.Message) ([]byte, error) { var buf bytes.Buffer err := new(jsonpb.Marshaler).Marshal(&buf, msg.(proto.Message)) if err != nil { @@ -33,7 +33,7 @@ func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) JSONMar return buf.Bytes(), nil } -func (drpcEncoding_File_consensus_consensusproto_protos_consensus_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error { +func (drpcEncoding_File_consensusproto_protos_consensus_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error { return jsonpb.Unmarshal(bytes.NewReader(buf), msg.(proto.Message)) } @@ -57,7 +57,7 @@ func (c *drpcConsensusClient) DRPCConn() drpc.Conn { return c.cc } func (c *drpcConsensusClient) AddLog(ctx context.Context, in *AddLogRequest) (*Ok, error) { out := new(Ok) - err := c.cc.Invoke(ctx, "/anyConsensus.Consensus/AddLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, in, out) + err := c.cc.Invoke(ctx, "/anyConsensus.Consensus/AddLog", drpcEncoding_File_consensusproto_protos_consensus_proto{}, in, out) if err != nil { return nil, err } @@ -66,7 +66,7 @@ func (c *drpcConsensusClient) AddLog(ctx context.Context, in *AddLogRequest) (*O func (c *drpcConsensusClient) AddRecord(ctx context.Context, in *AddRecordRequest) (*Ok, error) { out := new(Ok) - err := c.cc.Invoke(ctx, "/anyConsensus.Consensus/AddRecord", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, in, out) + err := c.cc.Invoke(ctx, "/anyConsensus.Consensus/AddRecord", drpcEncoding_File_consensusproto_protos_consensus_proto{}, in, out) if err != nil { return nil, err } @@ -74,7 +74,7 @@ func (c *drpcConsensusClient) AddRecord(ctx context.Context, in *AddRecordReques } func (c *drpcConsensusClient) WatchLog(ctx context.Context) (DRPCConsensus_WatchLogClient, error) { - stream, err := c.cc.NewStream(ctx, "/anyConsensus.Consensus/WatchLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) + stream, err := c.cc.NewStream(ctx, "/anyConsensus.Consensus/WatchLog", drpcEncoding_File_consensusproto_protos_consensus_proto{}) if err != nil { return nil, err } @@ -93,19 +93,19 @@ type drpcConsensus_WatchLogClient struct { } func (x *drpcConsensus_WatchLogClient) Send(m *WatchLogRequest) error { - return x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) + return x.MsgSend(m, drpcEncoding_File_consensusproto_protos_consensus_proto{}) } func (x *drpcConsensus_WatchLogClient) Recv() (*WatchLogEvent, error) { m := new(WatchLogEvent) - if err := x.MsgRecv(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil { + if err := x.MsgRecv(m, drpcEncoding_File_consensusproto_protos_consensus_proto{}); err != nil { return nil, err } return m, nil } func (x *drpcConsensus_WatchLogClient) RecvMsg(m *WatchLogEvent) error { - return x.MsgRecv(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) + return x.MsgRecv(m, drpcEncoding_File_consensusproto_protos_consensus_proto{}) } type DRPCConsensusServer interface { @@ -135,7 +135,7 @@ func (DRPCConsensusDescription) NumMethods() int { return 3 } func (DRPCConsensusDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { switch n { case 0: - return "/anyConsensus.Consensus/AddLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, + return "/anyConsensus.Consensus/AddLog", drpcEncoding_File_consensusproto_protos_consensus_proto{}, func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { return srv.(DRPCConsensusServer). AddLog( @@ -144,7 +144,7 @@ func (DRPCConsensusDescription) Method(n int) (string, drpc.Encoding, drpc.Recei ) }, DRPCConsensusServer.AddLog, true case 1: - return "/anyConsensus.Consensus/AddRecord", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, + return "/anyConsensus.Consensus/AddRecord", drpcEncoding_File_consensusproto_protos_consensus_proto{}, func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { return srv.(DRPCConsensusServer). AddRecord( @@ -153,7 +153,7 @@ func (DRPCConsensusDescription) Method(n int) (string, drpc.Encoding, drpc.Recei ) }, DRPCConsensusServer.AddRecord, true case 2: - return "/anyConsensus.Consensus/WatchLog", drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}, + return "/anyConsensus.Consensus/WatchLog", drpcEncoding_File_consensusproto_protos_consensus_proto{}, func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { return nil, srv.(DRPCConsensusServer). WatchLog( @@ -179,7 +179,7 @@ type drpcConsensus_AddLogStream struct { } func (x *drpcConsensus_AddLogStream) SendAndClose(m *Ok) error { - if err := x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil { + if err := x.MsgSend(m, drpcEncoding_File_consensusproto_protos_consensus_proto{}); err != nil { return err } return x.CloseSend() @@ -195,7 +195,7 @@ type drpcConsensus_AddRecordStream struct { } func (x *drpcConsensus_AddRecordStream) SendAndClose(m *Ok) error { - if err := x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil { + if err := x.MsgSend(m, drpcEncoding_File_consensusproto_protos_consensus_proto{}); err != nil { return err } return x.CloseSend() @@ -212,17 +212,17 @@ type drpcConsensus_WatchLogStream struct { } func (x *drpcConsensus_WatchLogStream) Send(m *WatchLogEvent) error { - return x.MsgSend(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) + return x.MsgSend(m, drpcEncoding_File_consensusproto_protos_consensus_proto{}) } func (x *drpcConsensus_WatchLogStream) Recv() (*WatchLogRequest, error) { m := new(WatchLogRequest) - if err := x.MsgRecv(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}); err != nil { + if err := x.MsgRecv(m, drpcEncoding_File_consensusproto_protos_consensus_proto{}); err != nil { return nil, err } return m, nil } func (x *drpcConsensus_WatchLogStream) RecvMsg(m *WatchLogRequest) error { - return x.MsgRecv(m, drpcEncoding_File_consensus_consensusproto_protos_consensus_proto{}) + return x.MsgRecv(m, drpcEncoding_File_consensusproto_protos_consensus_proto{}) } diff --git a/consensus/consensusproto/protos/consensus.proto b/consensus/consensusproto/protos/consensus.proto index 7a840a83..e15dac05 100644 --- a/consensus/consensusproto/protos/consensus.proto +++ b/consensus/consensusproto/protos/consensus.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package anyConsensus; -option go_package = "consensus/consensusproto"; +option go_package = "/consensusproto"; enum ErrCodes { Unexpected = 0; diff --git a/consensus/go.mod b/consensus/go.mod new file mode 100644 index 00000000..05b55f94 --- /dev/null +++ b/consensus/go.mod @@ -0,0 +1,68 @@ +module github.com/anytypeio/go-anytype-infrastructure-experiments/consensus + +go 1.19 + +require ( + github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 + github.com/cheggaaa/mb/v2 v2.0.1 + github.com/gogo/protobuf v1.3.2 + github.com/mr-tron/base58 v1.2.0 + github.com/stretchr/testify v1.8.0 + go.mongodb.org/mongo-driver v1.10.3 + go.uber.org/zap v1.23.0 + gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 + gopkg.in/yaml.v3 v3.0.1 + storj.io/drpc v0.0.32 +) + +require ( + 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/davecgh/go-spew v1.1.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/snappy v0.0.1 // indirect + github.com/ipfs/go-cid v0.3.2 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // 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-isatty v0.0.16 // 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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect + github.com/multiformats/go-base32 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.1.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/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 + 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/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.1 // indirect + github.com/xdg-go/stringprep v1.0.3 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // 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 + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect + golang.org/x/text v0.3.7 // indirect + google.golang.org/protobuf v1.28.1 // indirect + lukechampine.com/blake3 v1.1.7 // indirect +) diff --git a/consensus/go.sum b/consensus/go.sum new file mode 100644 index 00000000..acf2b037 --- /dev/null +++ b/consensus/go.sum @@ -0,0 +1,615 @@ +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/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-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/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +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/cheggaaa/mb/v2 v2.0.1 h1:gn0khbEbKlw3i5VOYi0VnHEHayjZKfUDOyGSpHAybBs= +github.com/cheggaaa/mb/v2 v2.0.1/go.mod h1:XGeZw20Iqgjky26KL0mvCwk3+4NyZCUbshSo6ALne+c= +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/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= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +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/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/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/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.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/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/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.2/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/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/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/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +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-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= +github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= +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.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.10 h1:Ai8UzuomSCDw90e1qNMtb15msBXsNpH6gzkkENQNcJo= +github.com/klauspost/compress v1.15.10/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +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.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= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +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/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +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/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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +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= +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-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.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.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/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/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/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= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +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/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +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/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +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.mongodb.org/mongo-driver v1.10.3 h1:XDQEvmh6z1EUsXuIkXE9TaVeqHw6SwS1uf93jFs0HBA= +go.mongodb.org/mongo-driver v1.10.3/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8= +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.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +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/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= +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-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/mod v0.4.2/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/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/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/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/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-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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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-20210630005230-0f9fa26af87c/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-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +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/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +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/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/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +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/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +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.2.8/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 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +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= diff --git a/go.mod b/go.mod deleted file mode 100644 index 9d775add..00000000 --- a/go.mod +++ /dev/null @@ -1,86 +0,0 @@ -module github.com/anytypeio/go-anytype-infrastructure-experiments - -go 1.18 - -require ( - github.com/akrylysov/pogreb v0.10.1 - github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 - github.com/awalterschulze/gographviz v0.0.0-20190522210029-fa59802746ab - github.com/cespare/xxhash v1.1.0 - github.com/cheggaaa/mb/v2 v2.0.1 - github.com/dgraph-io/badger/v3 v3.2103.2 - github.com/goccy/go-graphviz v0.0.9 - github.com/gogo/protobuf v1.3.2 - github.com/golang/mock v1.6.0 - github.com/huandu/skiplist v1.2.0 - github.com/ipfs/go-cid v0.1.0 - github.com/libp2p/go-libp2p v0.20.3 - github.com/libp2p/go-libp2p-core v0.16.1 - github.com/minio/sha256-simd v1.0.0 - github.com/mr-tron/base58 v1.2.0 - github.com/multiformats/go-multibase v0.0.3 - github.com/multiformats/go-multihash v0.1.0 - github.com/prometheus/client_golang v1.13.0 - github.com/stretchr/testify v1.8.0 - github.com/zeebo/blake3 v0.2.3 - github.com/zeebo/errs v1.3.0 - go.mongodb.org/mongo-driver v1.10.2 - go.uber.org/zap v1.21.0 - gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 - gopkg.in/yaml.v3 v3.0.1 - storj.io/drpc v0.0.32 -) - -require ( - github.com/OneOfOne/xxhash v1.2.8 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/btcsuite/btcd v0.22.1 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.1.3 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect - github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/dustin/go-humanize v1.0.0 // indirect - github.com/fogleman/gg v1.3.0 // indirect - github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect - github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - 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/klauspost/compress v1.15.1 // indirect - github.com/klauspost/cpuid/v2 v2.0.12 // indirect - github.com/libp2p/go-buffer-pool v0.0.2 // indirect - github.com/libp2p/go-openssl v0.0.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect - github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect - github.com/multiformats/go-base32 v0.0.3 // indirect - github.com/multiformats/go-base36 v0.1.0 // indirect - github.com/multiformats/go-multiaddr v0.5.0 // indirect - github.com/multiformats/go-multicodec v0.4.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_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/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.1 // indirect - github.com/xdg-go/stringprep v1.0.3 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.opencensus.io v0.22.5 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect - golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect - golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect - golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect - golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect - golang.org/x/text v0.3.7 // indirect - google.golang.org/protobuf v1.28.1 // indirect - lukechampine.com/blake3 v1.1.6 // indirect -) diff --git a/go.work b/go.work new file mode 100644 index 00000000..70bb12fa --- /dev/null +++ b/go.work @@ -0,0 +1,9 @@ +go 1.19 + +use ( + ./common + ./consensus + ./node + ./client + ./util +) diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 00000000..fee33121 --- /dev/null +++ b/go.work.sum @@ -0,0 +1,7 @@ +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +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/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/node/Makefile b/node/Makefile new file mode 100644 index 00000000..e33e5c6e --- /dev/null +++ b/node/Makefile @@ -0,0 +1,9 @@ +.PHONY: proto build test +export GOPRIVATE=github.com/anytypeio + +build: + @$(eval FLAGS := $$(shell govvv -flags -pkg github.com/anytypeio/go-anytype-infrastructure-experiments/node)) + go build -v -o ../bin/anytype-node -ldflags "$(FLAGS)" github.com/anytypeio/go-anytype-infrastructure-experiments/node/cmd + +test: + go test ./... --cover \ No newline at end of file diff --git a/node/account/service.go b/node/account/service.go index 66b2cb0a..6f81b4fe 100644 --- a/node/account/service.go +++ b/node/account/service.go @@ -1,8 +1,8 @@ package account import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" diff --git a/cmd/node/node.go b/node/cmd/node.go similarity index 100% rename from cmd/node/node.go rename to node/cmd/node.go diff --git a/node/go.mod b/node/go.mod new file mode 100644 index 00000000..08027894 --- /dev/null +++ b/node/go.mod @@ -0,0 +1,60 @@ +module github.com/anytypeio/go-anytype-infrastructure-experiments/node + +go 1.19 + +require ( + github.com/akrylysov/pogreb v0.10.1 + github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 + go.uber.org/zap v1.23.0 +) + +require ( + 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/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-cid v0.3.2 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // indirect + github.com/klauspost/cpuid/v2 v2.1.1 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/libp2p/go-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 + 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 + github.com/multiformats/go-base36 v0.1.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/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/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-20220525230936-793ad666bf5e // indirect + golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // 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 new file mode 100644 index 00000000..4cbd9bb1 --- /dev/null +++ b/node/go.sum @@ -0,0 +1,611 @@ +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-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/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +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/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA= +github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= +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= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +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/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +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/goccy/go-graphviz v0.0.9 h1:s/FMMJ1Joj6La3S5ApO3Jk2cwM4LpXECC2muFx3IPQQ= +github.com/goccy/go-graphviz v0.0.9/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= +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/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +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/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/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +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/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/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.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/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/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +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-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-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= +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/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/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= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +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/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +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/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= +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-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.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.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/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= +github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +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/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= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +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= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +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/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= +github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= +github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= +github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= +github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= +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.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +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/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= +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-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/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/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/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/mod v0.4.2/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +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/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/sync v0.0.0-20210220032951-036812b2e83c/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-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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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-20210630005230-0f9fa26af87c/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-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +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/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/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +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/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= +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.2.8/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= diff --git a/cmd/benchmarks/db/badger.go b/util/cmd/benchmarks/db/badger.go similarity index 100% rename from cmd/benchmarks/db/badger.go rename to util/cmd/benchmarks/db/badger.go diff --git a/cmd/benchmarks/db/common.go b/util/cmd/benchmarks/db/common.go similarity index 100% rename from cmd/benchmarks/db/common.go rename to util/cmd/benchmarks/db/common.go diff --git a/cmd/benchmarks/db/pogreb.go b/util/cmd/benchmarks/db/pogreb.go similarity index 100% rename from cmd/benchmarks/db/pogreb.go rename to util/cmd/benchmarks/db/pogreb.go diff --git a/cmd/benchmarks/dbbench.go b/util/cmd/benchmarks/dbbench.go similarity index 98% rename from cmd/benchmarks/dbbench.go rename to util/cmd/benchmarks/dbbench.go index faa06943..e5ff849a 100644 --- a/cmd/benchmarks/dbbench.go +++ b/util/cmd/benchmarks/dbbench.go @@ -2,7 +2,7 @@ package main import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/cmd/benchmarks/db" + "github.com/anytypeio/go-anytype-infrastructure-experiments/util/cmd/benchmarks/db" "math/rand" "net/http" _ "net/http/pprof" diff --git a/cmd/nodesgen/gen.go b/util/cmd/nodesgen/gen.go similarity index 100% rename from cmd/nodesgen/gen.go rename to util/cmd/nodesgen/gen.go diff --git a/cmd/nodesgen/nodemap.yml b/util/cmd/nodesgen/nodemap.yml similarity index 100% rename from cmd/nodesgen/nodemap.yml rename to util/cmd/nodesgen/nodemap.yml diff --git a/util/go.mod b/util/go.mod new file mode 100644 index 00000000..a8a10ff3 --- /dev/null +++ b/util/go.mod @@ -0,0 +1,54 @@ +module github.com/anytypeio/go-anytype-infrastructure-experiments/util + +go 1.19 + +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/dgraph-io/badger/v3 v3.2103.3 + gopkg.in/yaml.v3 v3.0.1 +) + +require ( + 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 + github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect + 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/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/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-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/pkg/errors v0.9.1 // indirect + github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect + github.com/spaolacci/murmur3 v1.1.0 // 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 + google.golang.org/protobuf v1.28.1 // indirect + lukechampine.com/blake3 v1.1.7 // indirect +) diff --git a/util/go.sum b/util/go.sum new file mode 100644 index 00000000..cf3d6d42 --- /dev/null +++ b/util/go.sum @@ -0,0 +1,254 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +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/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +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/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/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= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/dgraph-io/badger/v3 v3.2103.3 h1:s63J1pisDhKpzWslXFe+ChuthuZptpwTE6qEKoczPb4= +github.com/dgraph-io/badger/v3 v3.2103.3/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5jsE0PPFzRiKjtcdw= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +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/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-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/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.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.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/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.5.0/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/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +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/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= +github.com/klauspost/compress v1.15.10 h1:Ai8UzuomSCDw90e1qNMtb15msBXsNpH6gzkkENQNcJo= +github.com/klauspost/compress v1.15.10/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +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.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0= +github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +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= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +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/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/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= +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-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.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.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/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +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_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +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= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +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/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/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/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.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.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +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= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +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-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-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/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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +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-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-20190620200207-3b0461eec859/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-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-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/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-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-20201020160332-67f06af15bc9/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-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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +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/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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +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.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +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= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +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.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/check.v1 v0.0.0-20161208181325-20d25e280405/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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +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-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= +lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= From 22074a5fbdaddb4b532d0cd1818b1a17c4d37a09 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Mon, 17 Oct 2022 17:05:42 +0300 Subject: [PATCH 152/219] mod replace --- client/go.mod | 64 +---- common/go.mod | 2 +- common/go.sum | 4 +- consensus/go.mod | 5 +- consensus/go.sum | 4 +- go.work.sum | 146 ++++++++++- node/go.mod | 4 +- node/go.sum | 611 ----------------------------------------------- util/go.mod | 4 + 9 files changed, 163 insertions(+), 681 deletions(-) delete mode 100644 node/go.sum diff --git a/client/go.mod b/client/go.mod index f03c0542..949bcd38 100644 --- a/client/go.mod +++ b/client/go.mod @@ -1,69 +1,11 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/client +replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common + + go 1.19 require ( github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 github.com/dgraph-io/badger/v3 v3.2103.3 ) - -require ( - 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/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 - 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/glog v0.0.0-20160126235308-23def4e6c14b // indirect - github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - 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/huandu/skiplist v1.2.0 // indirect - github.com/ipfs/go-cid v0.3.2 // indirect - github.com/ipfs/go-log/v2 v2.5.1 // 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-isatty v0.0.16 // 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 - github.com/multiformats/go-base36 v0.1.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/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/zeebo/blake3 v0.2.3 // indirect - github.com/zeebo/errs v1.3.0 // 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-20220525230936-793ad666bf5e // 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/common/go.mod b/common/go.mod index c80a866c..31b8013f 100644 --- a/common/go.mod +++ b/common/go.mod @@ -3,7 +3,7 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/common go 1.19 require ( - github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 + github.com/anytypeio/go-chash v1.0.0 github.com/awalterschulze/gographviz v2.0.3+incompatible github.com/cespare/xxhash v1.1.0 github.com/goccy/go-graphviz v0.0.9 diff --git a/common/go.sum b/common/go.sum index 3f5b91c2..35264aba 100644 --- a/common/go.sum +++ b/common/go.sum @@ -40,8 +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-chash v0.0.0-20220629194632-4ad1154fe232 h1:kMPPZYmJgbs4AJfodbg2OCXg5cp+9LPAJcLZJqmcghk= -github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232/go.mod h1:+PeHBAWp7gUh/yw6uAauKc5ku0w4cFNg6DUddGxoGq0= +github.com/anytypeio/go-chash v1.0.0 h1:43BDDEP4OHD/od0vbB54wn8CCX7OUr5lh33/USso/q0= +github.com/anytypeio/go-chash v1.0.0/go.mod h1:+PeHBAWp7gUh/yw6uAauKc5ku0w4cFNg6DUddGxoGq0= github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= diff --git a/consensus/go.mod b/consensus/go.mod index 05b55f94..66776e1e 100644 --- a/consensus/go.mod +++ b/consensus/go.mod @@ -2,8 +2,9 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/consensus go 1.19 +replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common + require ( - github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 github.com/cheggaaa/mb/v2 v2.0.1 github.com/gogo/protobuf v1.3.2 github.com/mr-tron/base58 v1.2.0 @@ -16,7 +17,7 @@ require ( ) require ( - github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 // indirect + github.com/anytypeio/go-chash v1.0.0 // 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 diff --git a/consensus/go.sum b/consensus/go.sum index acf2b037..10b84441 100644 --- a/consensus/go.sum +++ b/consensus/go.sum @@ -40,8 +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-chash v0.0.0-20220629194632-4ad1154fe232 h1:kMPPZYmJgbs4AJfodbg2OCXg5cp+9LPAJcLZJqmcghk= -github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232/go.mod h1:+PeHBAWp7gUh/yw6uAauKc5ku0w4cFNg6DUddGxoGq0= +github.com/anytypeio/go-chash v1.0.0 h1:43BDDEP4OHD/od0vbB54wn8CCX7OUr5lh33/USso/q0= +github.com/anytypeio/go-chash v1.0.0/go.mod h1:+PeHBAWp7gUh/yw6uAauKc5ku0w4cFNg6DUddGxoGq0= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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= diff --git a/go.work.sum b/go.work.sum index fee33121..b033a6bd 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,7 +1,151 @@ +cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= +cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= +cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= +cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= +cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= +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-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= +github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU= +github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= +github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= +github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= +github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= +github.com/coreos/go-systemd/v22 v22.4.0 h1:y9YHcjnjynCd/DVbg5j9L/33jQM3MxJlbj/zWskzfGU= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= +github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= +github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELBIYWeBVh6wn+E= +github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= +github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= +github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= +github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 h1:Ak8CrdlwwXwAZxzS66vgPt4U8yUZX7JwLvVR58FN5jM= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 h1:UDMh68UUwekSh5iP2OMhRRZJiiBccgV7axzUG8vi56c= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= +github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= +github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= +github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/koron/go-ssdp v0.0.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= +github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= +github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= +github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= +github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= +github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= +github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY= +github.com/libp2p/go-msgio v0.2.0 h1:W6shmB+FeynDrUVl2dgFQvzfBZcXiyqY4VmpQLu9FqU= +github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= +github.com/libp2p/go-netroute v0.2.0 h1:0FpsbsvuSnAhXFnCY0VLFbJOzaK0VnP0r1QT/o4nWRE= +github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= +github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ= +github.com/libp2p/zeroconf/v2 v2.2.0 h1:Cup06Jv6u81HLhIj1KasuNM/RHHrJ8T7wOTS4+Tv53Q= +github.com/lucas-clemente/quic-go v0.29.1 h1:Z+WMJ++qMLhvpFkRZA+jl3BTxUjm415YBmWanXB8zP0= +github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= +github.com/marten-seemann/qpack v0.2.1 h1:jvTsT/HpCn2UZJdP+UUB53FfUUgeOyG5K1ns0OJOGVs= +github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM= +github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK5df3GufyYYU= +github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= +github.com/marten-seemann/webtransport-go v0.1.1 h1:TnyKp3pEXcDooTaNn4s9dYpMJ7kMnTp7k5h+SgYP/mc= +github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= +github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= +github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= +github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= +github.com/multiformats/go-multistream v0.3.3 h1:d5PZpjwRgVlbwfdTDjife7XszfZd8KYWfROYFlGcR8o= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= +github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/testify v1.7.3/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/exp v0.0.0-20220916125017-b168a2c6b86b h1:SCE/18RnFsLrjydh/R/s5EVvHoZprqEQUuoxK8q2Pc4= +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 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= 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-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +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= +google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= +rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= +rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= +rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= diff --git a/node/go.mod b/node/go.mod index 08027894..af80d9ae 100644 --- a/node/go.mod +++ b/node/go.mod @@ -2,6 +2,8 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/node go 1.19 +replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common + require ( github.com/akrylysov/pogreb v0.10.1 github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 @@ -9,7 +11,7 @@ require ( ) require ( - github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 // indirect + github.com/anytypeio/go-chash v1.0.0 // 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 diff --git a/node/go.sum b/node/go.sum deleted file mode 100644 index 4cbd9bb1..00000000 --- a/node/go.sum +++ /dev/null @@ -1,611 +0,0 @@ -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-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/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -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/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA= -github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= -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= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -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/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -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/goccy/go-graphviz v0.0.9 h1:s/FMMJ1Joj6La3S5ApO3Jk2cwM4LpXECC2muFx3IPQQ= -github.com/goccy/go-graphviz v0.0.9/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= -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/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -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/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/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -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/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/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.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/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/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= -github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= -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-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-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= -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/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/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= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -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/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -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/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= -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-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.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.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/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= -github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -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/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= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -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= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -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/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= -github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= -github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= -github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= -github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= -github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= -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.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -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/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= -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-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/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/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/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/mod v0.4.2/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -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/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/sync v0.0.0-20210220032951-036812b2e83c/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-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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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-20210630005230-0f9fa26af87c/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-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -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/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/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -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/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= -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.2.8/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= diff --git a/util/go.mod b/util/go.mod index a8a10ff3..917d8ea2 100644 --- a/util/go.mod +++ b/util/go.mod @@ -2,6 +2,10 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/util go 1.19 +replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common + +replace github.com/anytypeio/go-anytype-infrastructure-experiments/consensus => ../consensus + require ( github.com/akrylysov/pogreb v0.10.1 github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 From 09e3eb3e548ded2da6ee2f650405062375a277b6 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Mon, 17 Oct 2022 18:11:00 +0300 Subject: [PATCH 153/219] go mod fixes --- common/go.mod | 2 +- common/go.sum | 4 +- consensus/go.mod | 1 - consensus/go.sum | 2 - node/go.mod | 2 +- node/go.sum | 611 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 615 insertions(+), 7 deletions(-) create mode 100644 node/go.sum diff --git a/common/go.mod b/common/go.mod index 31b8013f..c80a866c 100644 --- a/common/go.mod +++ b/common/go.mod @@ -3,7 +3,7 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/common go 1.19 require ( - github.com/anytypeio/go-chash v1.0.0 + github.com/anytypeio/go-chash v0.0.0-20220629194632-4ad1154fe232 github.com/awalterschulze/gographviz v2.0.3+incompatible github.com/cespare/xxhash v1.1.0 github.com/goccy/go-graphviz v0.0.9 diff --git a/common/go.sum b/common/go.sum index 35264aba..3f5b91c2 100644 --- a/common/go.sum +++ b/common/go.sum @@ -40,8 +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-chash v1.0.0 h1:43BDDEP4OHD/od0vbB54wn8CCX7OUr5lh33/USso/q0= -github.com/anytypeio/go-chash v1.0.0/go.mod h1:+PeHBAWp7gUh/yw6uAauKc5ku0w4cFNg6DUddGxoGq0= +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/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= diff --git a/consensus/go.mod b/consensus/go.mod index 66776e1e..9889f33e 100644 --- a/consensus/go.mod +++ b/consensus/go.mod @@ -17,7 +17,6 @@ require ( ) require ( - github.com/anytypeio/go-chash v1.0.0 // 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 diff --git a/consensus/go.sum b/consensus/go.sum index 10b84441..69f2f44a 100644 --- a/consensus/go.sum +++ b/consensus/go.sum @@ -40,8 +40,6 @@ 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-chash v1.0.0 h1:43BDDEP4OHD/od0vbB54wn8CCX7OUr5lh33/USso/q0= -github.com/anytypeio/go-chash v1.0.0/go.mod h1:+PeHBAWp7gUh/yw6uAauKc5ku0w4cFNg6DUddGxoGq0= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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= diff --git a/node/go.mod b/node/go.mod index af80d9ae..a4bd1708 100644 --- a/node/go.mod +++ b/node/go.mod @@ -11,7 +11,7 @@ require ( ) require ( - github.com/anytypeio/go-chash v1.0.0 // 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 diff --git a/node/go.sum b/node/go.sum new file mode 100644 index 00000000..4cbd9bb1 --- /dev/null +++ b/node/go.sum @@ -0,0 +1,611 @@ +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-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/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +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/corona10/goimagehash v1.0.2 h1:pUfB0LnsJASMPGEZLj7tGY251vF+qLGqOgEP4rUs6kA= +github.com/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= +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= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +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/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +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/goccy/go-graphviz v0.0.9 h1:s/FMMJ1Joj6La3S5ApO3Jk2cwM4LpXECC2muFx3IPQQ= +github.com/goccy/go-graphviz v0.0.9/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= +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/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +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/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/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +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/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/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.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/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/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +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-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-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= +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/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/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= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +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/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +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/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= +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-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.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.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/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= +github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +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/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= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +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= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +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/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= +github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= +github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= +github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= +github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= +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.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +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/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= +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-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/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/image v0.0.0-20200119044424-58c23975cae1 h1:5h3ngYt7+vXCDZCup/HkCQgW5XwmSvR/nA2JmJ0RErg= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/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/mod v0.4.2/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +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/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/sync v0.0.0-20210220032951-036812b2e83c/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-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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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-20210630005230-0f9fa26af87c/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-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +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/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/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +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/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= +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.2.8/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= From 440d63ade0d68226344af7f2c2c6bde866e4ba89 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 18 Oct 2022 11:17:15 +0200 Subject: [PATCH 154/219] Push main go remove replace --- client/go.mod | 3 --- consensus/go.mod | 2 -- node/go.mod | 4 +--- node/go.sum | 2 ++ util/go.mod | 4 ---- 5 files changed, 3 insertions(+), 12 deletions(-) diff --git a/client/go.mod b/client/go.mod index 949bcd38..337dd0fd 100644 --- a/client/go.mod +++ b/client/go.mod @@ -1,8 +1,5 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/client -replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common - - go 1.19 require ( diff --git a/consensus/go.mod b/consensus/go.mod index 9889f33e..20f74a6c 100644 --- a/consensus/go.mod +++ b/consensus/go.mod @@ -2,8 +2,6 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/consensus go 1.19 -replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common - require ( github.com/cheggaaa/mb/v2 v2.0.1 github.com/gogo/protobuf v1.3.2 diff --git a/node/go.mod b/node/go.mod index a4bd1708..2f7fbf87 100644 --- a/node/go.mod +++ b/node/go.mod @@ -2,11 +2,9 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/node go 1.19 -replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common - 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/common v0.0.0-20221017151100-09e3eb3e548d go.uber.org/zap v1.23.0 ) diff --git a/node/go.sum b/node/go.sum index 4cbd9bb1..7f6ad456 100644 --- a/node/go.sum +++ b/node/go.sum @@ -42,6 +42,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/common v0.0.0-20221017151100-09e3eb3e548d h1:m/dvM+rMsFDxoTHP6sF537m9AOeVsclYXsai6rC2Dg0= +github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-20221017151100-09e3eb3e548d/go.mod h1:K8qY7wHmuMa9KN9aPpiM+1ij7v2jJID2eKguj5gB/EM= 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/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= diff --git a/util/go.mod b/util/go.mod index 917d8ea2..a8a10ff3 100644 --- a/util/go.mod +++ b/util/go.mod @@ -2,10 +2,6 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/util go 1.19 -replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common - -replace github.com/anytypeio/go-anytype-infrastructure-experiments/consensus => ../consensus - require ( github.com/akrylysov/pogreb v0.10.1 github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 From 9f1735110c4de9f3ad47e4daae7f5c07ad06cdef Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 18 Oct 2022 11:17:57 +0200 Subject: [PATCH 155/219] Revert "Push main go remove replace" This reverts commit 440d63ade0d68226344af7f2c2c6bde866e4ba89. --- client/go.mod | 3 +++ consensus/go.mod | 2 ++ node/go.mod | 4 +++- node/go.sum | 2 -- util/go.mod | 4 ++++ 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/client/go.mod b/client/go.mod index 337dd0fd..949bcd38 100644 --- a/client/go.mod +++ b/client/go.mod @@ -1,5 +1,8 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/client +replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common + + go 1.19 require ( diff --git a/consensus/go.mod b/consensus/go.mod index 20f74a6c..9889f33e 100644 --- a/consensus/go.mod +++ b/consensus/go.mod @@ -2,6 +2,8 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/consensus go 1.19 +replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common + require ( github.com/cheggaaa/mb/v2 v2.0.1 github.com/gogo/protobuf v1.3.2 diff --git a/node/go.mod b/node/go.mod index 2f7fbf87..a4bd1708 100644 --- a/node/go.mod +++ b/node/go.mod @@ -2,9 +2,11 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/node go 1.19 +replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common + require ( github.com/akrylysov/pogreb v0.10.1 - github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-20221017151100-09e3eb3e548d + github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 go.uber.org/zap v1.23.0 ) diff --git a/node/go.sum b/node/go.sum index 7f6ad456..4cbd9bb1 100644 --- a/node/go.sum +++ b/node/go.sum @@ -42,8 +42,6 @@ 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/common v0.0.0-20221017151100-09e3eb3e548d h1:m/dvM+rMsFDxoTHP6sF537m9AOeVsclYXsai6rC2Dg0= -github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-20221017151100-09e3eb3e548d/go.mod h1:K8qY7wHmuMa9KN9aPpiM+1ij7v2jJID2eKguj5gB/EM= 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/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= diff --git a/util/go.mod b/util/go.mod index a8a10ff3..917d8ea2 100644 --- a/util/go.mod +++ b/util/go.mod @@ -2,6 +2,10 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/util go 1.19 +replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common + +replace github.com/anytypeio/go-anytype-infrastructure-experiments/consensus => ../consensus + require ( github.com/akrylysov/pogreb v0.10.1 github.com/anytypeio/go-anytype-infrastructure-experiments/common v0.0.0-00010101000000-000000000000 From 6201951e3b01bef5404b4f46dddca8e909052d86 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 18 Oct 2022 14:17:49 +0200 Subject: [PATCH 156/219] Add space and document creation logic for client --- .fleet/settings.json | 4 + client/clientspace/clientcache/treecache.go | 10 +- client/clientspace/service.go | 40 +- client/document/service.go | 90 ++++- client/document/textdocument.go | 114 ++++++ client/go.mod | 62 ++- client/util/releasecontainer.go | 6 + common/commonspace/diffservice/diffservice.go | 5 + common/commonspace/space.go | 5 + .../spacesyncproto/spacesync.pb.go | 80 ++-- common/pkg/acl/aclrecordproto/aclrecord.pb.go | 99 +++-- .../testutils/testchanges/proto/test.pb.go | 379 ++++++------------ .../testutils/testchanges/proto/test.proto | 30 +- common/pkg/ldiff/diff.go | 35 +- 14 files changed, 583 insertions(+), 376 deletions(-) create mode 100644 .fleet/settings.json create mode 100644 client/document/textdocument.go create mode 100644 client/util/releasecontainer.go diff --git a/.fleet/settings.json b/.fleet/settings.json new file mode 100644 index 00000000..963a3020 --- /dev/null +++ b/.fleet/settings.json @@ -0,0 +1,4 @@ +{ + "toolchains": [], + "editor.guides": [] +} \ No newline at end of file diff --git a/client/clientspace/clientcache/treecache.go b/client/clientspace/clientcache/treecache.go index ad150438..9a80f9f7 100644 --- a/client/clientspace/clientcache/treecache.go +++ b/client/clientspace/clientcache/treecache.go @@ -3,9 +3,10 @@ package clientcache import ( "context" "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "time" @@ -21,6 +22,7 @@ const spaceKey ctxKey = 0 type treeCache struct { gcttl int cache ocache.OCache + docService document.Service clientService clientspace.Service } @@ -40,14 +42,16 @@ func (c *treeCache) Close(ctx context.Context) (err error) { func (c *treeCache) Init(a *app.App) (err error) { c.clientService = a.MustComponent(clientspace.CName).(clientspace.Service) + c.docService = a.MustComponent(document.CName).(document.Service) c.cache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { spaceId := ctx.Value(spaceKey).(string) - space, err := c.clientService.GetSpace(ctx, spaceId) + container, err := c.clientService.GetSpace(ctx, spaceId) if err != nil { return } - return space.BuildTree(ctx, id, nil) + defer container.Release() + return document.NewTextDocument(context.Background(), container.Object, id, c.docService) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), diff --git a/client/clientspace/service.go b/client/clientspace/service.go index 2bfb425a..9bf7bd31 100644 --- a/client/clientspace/service.go +++ b/client/clientspace/service.go @@ -2,6 +2,7 @@ package clientspace import ( "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/util" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" @@ -22,9 +23,9 @@ func New() Service { } type Service interface { - GetSpace(ctx context.Context, id string) (commonspace.Space, error) - CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (commonspace.Space, error) - DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (commonspace.Space, error) + GetSpace(ctx context.Context, id string) (util.ReleaseContainer[commonspace.Space], error) + CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (util.ReleaseContainer[commonspace.Space], error) + DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (util.ReleaseContainer[commonspace.Space], error) app.ComponentRunnable } @@ -63,38 +64,53 @@ func (s *service) Run(ctx context.Context) (err error) { return } -func (s *service) CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (space commonspace.Space, err error) { +func (s *service) CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (container util.ReleaseContainer[commonspace.Space], err error) { id, err := s.commonSpace.CreateSpace(ctx, payload) if err != nil { return } - obj, err := s.commonSpace.GetSpace(ctx, id) + obj, err := s.spaceCache.Get(ctx, id) if err != nil { return } - return obj.(commonspace.Space), nil + return util.ReleaseContainer[commonspace.Space]{ + Object: obj.(commonspace.Space), + Release: func() { + s.spaceCache.Release(id) + }, + }, nil } -func (s *service) DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (space commonspace.Space, err error) { +func (s *service) DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (container util.ReleaseContainer[commonspace.Space], err error) { id, err := s.commonSpace.DeriveSpace(ctx, payload) if err != nil { return } - obj, err := s.commonSpace.GetSpace(ctx, id) + obj, err := s.spaceCache.Get(ctx, id) if err != nil { return } - return obj.(commonspace.Space), nil + return util.ReleaseContainer[commonspace.Space]{ + Object: obj.(commonspace.Space), + Release: func() { + s.spaceCache.Release(id) + }, + }, nil } -func (s *service) GetSpace(ctx context.Context, id string) (commonspace.Space, error) { +func (s *service) GetSpace(ctx context.Context, id string) (container util.ReleaseContainer[commonspace.Space], err error) { v, err := s.spaceCache.Get(ctx, id) if err != nil { - return nil, err + return } - return v.(commonspace.Space), nil + return util.ReleaseContainer[commonspace.Space]{ + Object: v.(commonspace.Space), + Release: func() { + s.spaceCache.Release(id) + }, + }, nil } func (s *service) Close(ctx context.Context) (err error) { diff --git a/client/document/service.go b/client/document/service.go index c48a373f..ef7c4c82 100644 --- a/client/document/service.go +++ b/client/document/service.go @@ -1,13 +1,97 @@ package document -import "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" +) type Service interface { app.Component + updatelistener.UpdateListener CreateDocument(spaceId string) (id string, err error) GetAllDocumentIds(spaceId string) (ids []string, err error) - AddText(documentId, text string) (err error) - DumpDocumentTree(documentId string) (err error) + AddText(spaceId, documentId, text string) (err error) + DumpDocumentTree(spaceId, documentId string) (dump string, err error) } const CName = "client.document" + +var log = logger.NewNamed(CName) + +type service struct { + account account.Service + spaceService clientspace.Service + cache cache.TreeCache +} + +func New() Service { + return &service{} +} + +func (s *service) Init(a *app.App) (err error) { + s.account = a.MustComponent(account.CName).(account.Service) + s.spaceService = a.MustComponent(clientspace.CName).(clientspace.Service) + s.cache = a.MustComponent(cache.CName).(cache.TreeCache) + return +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) CreateDocument(spaceId string) (id string, err error) { + spaceRef, err := s.spaceService.GetSpace(context.Background(), spaceId) + if err != nil { + return + } + defer spaceRef.Release() + doc, err := createTextDocument(context.Background(), spaceRef.Object, s.account, s) + if err != nil { + return + } + id = doc.Tree().ID() + return +} + +func (s *service) GetAllDocumentIds(spaceId string) (ids []string, err error) { + spaceRef, err := s.spaceService.GetSpace(context.Background(), spaceId) + if err != nil { + return + } + defer spaceRef.Release() + ids = spaceRef.Object.StoredIds() + return +} + +func (s *service) AddText(spaceId, documentId, text string) (err error) { + doc, err := s.cache.GetTree(context.Background(), spaceId, documentId) + if err != nil { + return + } + defer doc.Release() + return doc.TreeContainer.(TextDocument).AddText(text) +} + +func (s *service) DumpDocumentTree(spaceId, documentId string) (dump string, err error) { + doc, err := s.cache.GetTree(context.Background(), spaceId, documentId) + if err != nil { + return + } + defer doc.Release() + return doc.TreeContainer.Tree().DebugDump() +} + +func (s *service) Update(tree tree.ObjectTree) { + +} + +func (s *service) Rebuild(tree tree.ObjectTree) { + //TODO implement me + panic("implement me") +} diff --git a/client/document/textdocument.go b/client/document/textdocument.go new file mode 100644 index 00000000..5314a9c1 --- /dev/null +++ b/client/document/textdocument.go @@ -0,0 +1,114 @@ +package document + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" + testchanges "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/testchanges/proto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + "github.com/gogo/protobuf/proto" +) + +type TextDocument interface { + cache.TreeContainer + AddText(text string) error + Text() (string, error) + TreeDump() string + Close() error +} + +type textDocument struct { + objTree tree.ObjectTree + account account.Service +} + +func createTextDocument( + ctx context.Context, + space commonspace.Space, + account account.Service, + listener updatelistener.UpdateListener) (doc TextDocument, err error) { + payload := tree.ObjectTreeCreatePayload{ + SignKey: account.Account().SignKey, + SpaceId: space.Id(), + Identity: account.Account().Identity, + } + t, err := space.CreateTree(ctx, payload, listener) + if err != nil { + return + } + + return &textDocument{ + objTree: t, + }, nil +} + +func NewTextDocument(ctx context.Context, space commonspace.Space, id string, listener updatelistener.UpdateListener) (doc TextDocument, err error) { + t, err := space.BuildTree(ctx, id, listener) + if err != nil { + return + } + return &textDocument{ + objTree: t, + }, nil +} + +func (t *textDocument) Tree() tree.ObjectTree { + return t.objTree +} + +func (t *textDocument) AddText(text string) (err error) { + content := &testchanges.TextContentValueOfTextAppend{ + TextAppend: &testchanges.TextAppend{Text: text}, + } + change := &testchanges.TextData{ + Content: []*testchanges.TextContent{ + {content}, + }, + Snapshot: nil, + } + res, err := change.Marshal() + if err != nil { + return + } + + _, err = t.objTree.AddContent(context.Background(), tree.SignableChangeContent{ + Data: res, + Key: t.account.Account().SignKey, + Identity: t.account.Account().Identity, + IsSnapshot: false, + }) + return +} + +func (t *textDocument) Text() (text string, err error) { + t.objTree.RLock() + defer t.objTree.RUnlock() + + err = t.objTree.Iterate( + func(decrypted []byte) (any, error) { + textChange := &testchanges.TextData{} + err = proto.Unmarshal(decrypted, textChange) + if err != nil { + return nil, err + } + for _, cnt := range textChange.Content { + if cnt.GetTextAppend() != nil { + text += cnt.GetTextAppend().Text + } + } + return textChange, nil + }, func(change *tree.Change) bool { + return true + }) + return +} + +func (t *textDocument) TreeDump() string { + return t.TreeDump() +} + +func (t *textDocument) Close() error { + return nil +} diff --git a/client/go.mod b/client/go.mod index 949bcd38..5a2355fa 100644 --- a/client/go.mod +++ b/client/go.mod @@ -2,10 +2,70 @@ module github.com/anytypeio/go-anytype-infrastructure-experiments/client replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common - go 1.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 +) + +require ( + 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/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 + github.com/fogleman/gg v1.3.0 // indirect + github.com/goccy/go-graphviz v0.0.9 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect + 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/huandu/skiplist v1.2.0 // indirect + github.com/ipfs/go-cid v0.3.2 // indirect + github.com/ipfs/go-log/v2 v2.5.1 // 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-isatty v0.0.16 // 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 + github.com/multiformats/go-base36 v0.1.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/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/zeebo/blake3 v0.2.3 // indirect + github.com/zeebo/errs v1.3.0 // 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-20220525230936-793ad666bf5e // 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/util/releasecontainer.go b/client/util/releasecontainer.go new file mode 100644 index 00000000..ef8bbc1b --- /dev/null +++ b/client/util/releasecontainer.go @@ -0,0 +1,6 @@ +package util + +type ReleaseContainer[T any] struct { + Object T + Release func() +} diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index 2ed2f33a..c452f19c 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -17,6 +17,7 @@ type DiffService interface { HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) UpdateHeads(id string, heads []string) RemoveObject(id string) + AllIds() []string Init(objectIds []string) Close() (err error) @@ -72,6 +73,10 @@ func (d *diffService) UpdateHeads(id string, heads []string) { }) } +func (d *diffService) AllIds() []string { + return d.diff.Ids() +} + func (d *diffService) RemoveObject(id string) { // TODO: add space document to remove ids d.diff.RemoveId(id) diff --git a/common/commonspace/space.go b/common/commonspace/space.go index d56b6e1d..fb815a67 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -44,6 +44,7 @@ func NewSpaceId(id string, repKey uint64) string { type Space interface { Id() string + StoredIds() []string SpaceSyncRpc() RpcHandler @@ -94,6 +95,10 @@ func (s *space) DiffService() diffservice.DiffService { return s.diffService } +func (s *space) StoredIds() []string { + return s.diffService.AllIds() +} + func (s *space) DeriveTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree2.ObjectTree, error) { return synctree.DeriveSyncTree(ctx, payload, s.syncService.SyncClient(), listener, s.aclList, s.storage.CreateTreeStorage) } diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 1764e6e3..cf9d4e93 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -408,11 +408,11 @@ func (m *ObjectSyncMessage) GetTrackingId() string { // ObjectSyncContentValue provides different types for object sync type ObjectSyncContentValue struct { // Types that are valid to be assigned to Value: - // *ObjectSyncContentValue_HeadUpdate - // *ObjectSyncContentValue_FullSyncRequest - // *ObjectSyncContentValue_FullSyncResponse - // *ObjectSyncContentValue_ErrorResponse - Value isObjectSyncContentValue_Value `protobuf_oneof:"value"` + // *ObjectSyncContentValueValueOfHeadUpdate + // *ObjectSyncContentValueValueOfFullSyncRequest + // *ObjectSyncContentValueValueOfFullSyncResponse + // *ObjectSyncContentValueValueOfErrorResponse + Value IsObjectSyncContentValueValue `protobuf_oneof:"value"` } func (m *ObjectSyncContentValue) Reset() { *m = ObjectSyncContentValue{} } @@ -448,31 +448,31 @@ func (m *ObjectSyncContentValue) XXX_DiscardUnknown() { var xxx_messageInfo_ObjectSyncContentValue proto.InternalMessageInfo -type isObjectSyncContentValue_Value interface { - isObjectSyncContentValue_Value() +type IsObjectSyncContentValueValue interface { + IsObjectSyncContentValueValue() MarshalTo([]byte) (int, error) Size() int } -type ObjectSyncContentValue_HeadUpdate struct { +type ObjectSyncContentValueValueOfHeadUpdate struct { HeadUpdate *ObjectHeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` } -type ObjectSyncContentValue_FullSyncRequest struct { +type ObjectSyncContentValueValueOfFullSyncRequest struct { FullSyncRequest *ObjectFullSyncRequest `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` } -type ObjectSyncContentValue_FullSyncResponse struct { +type ObjectSyncContentValueValueOfFullSyncResponse struct { FullSyncResponse *ObjectFullSyncResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` } -type ObjectSyncContentValue_ErrorResponse struct { +type ObjectSyncContentValueValueOfErrorResponse struct { ErrorResponse *ObjectErrorResponse `protobuf:"bytes,4,opt,name=errorResponse,proto3,oneof" json:"errorResponse,omitempty"` } -func (*ObjectSyncContentValue_HeadUpdate) isObjectSyncContentValue_Value() {} -func (*ObjectSyncContentValue_FullSyncRequest) isObjectSyncContentValue_Value() {} -func (*ObjectSyncContentValue_FullSyncResponse) isObjectSyncContentValue_Value() {} -func (*ObjectSyncContentValue_ErrorResponse) isObjectSyncContentValue_Value() {} +func (*ObjectSyncContentValueValueOfHeadUpdate) IsObjectSyncContentValueValue() {} +func (*ObjectSyncContentValueValueOfFullSyncRequest) IsObjectSyncContentValueValue() {} +func (*ObjectSyncContentValueValueOfFullSyncResponse) IsObjectSyncContentValueValue() {} +func (*ObjectSyncContentValueValueOfErrorResponse) IsObjectSyncContentValueValue() {} -func (m *ObjectSyncContentValue) GetValue() isObjectSyncContentValue_Value { +func (m *ObjectSyncContentValue) GetValue() IsObjectSyncContentValueValue { if m != nil { return m.Value } @@ -480,28 +480,28 @@ func (m *ObjectSyncContentValue) GetValue() isObjectSyncContentValue_Value { } func (m *ObjectSyncContentValue) GetHeadUpdate() *ObjectHeadUpdate { - if x, ok := m.GetValue().(*ObjectSyncContentValue_HeadUpdate); ok { + if x, ok := m.GetValue().(*ObjectSyncContentValueValueOfHeadUpdate); ok { return x.HeadUpdate } return nil } func (m *ObjectSyncContentValue) GetFullSyncRequest() *ObjectFullSyncRequest { - if x, ok := m.GetValue().(*ObjectSyncContentValue_FullSyncRequest); ok { + if x, ok := m.GetValue().(*ObjectSyncContentValueValueOfFullSyncRequest); ok { return x.FullSyncRequest } return nil } func (m *ObjectSyncContentValue) GetFullSyncResponse() *ObjectFullSyncResponse { - if x, ok := m.GetValue().(*ObjectSyncContentValue_FullSyncResponse); ok { + if x, ok := m.GetValue().(*ObjectSyncContentValueValueOfFullSyncResponse); ok { return x.FullSyncResponse } return nil } func (m *ObjectSyncContentValue) GetErrorResponse() *ObjectErrorResponse { - if x, ok := m.GetValue().(*ObjectSyncContentValue_ErrorResponse); ok { + if x, ok := m.GetValue().(*ObjectSyncContentValueValueOfErrorResponse); ok { return x.ErrorResponse } return nil @@ -510,10 +510,10 @@ func (m *ObjectSyncContentValue) GetErrorResponse() *ObjectErrorResponse { // XXX_OneofWrappers is for the internal use of the proto package. func (*ObjectSyncContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*ObjectSyncContentValue_HeadUpdate)(nil), - (*ObjectSyncContentValue_FullSyncRequest)(nil), - (*ObjectSyncContentValue_FullSyncResponse)(nil), - (*ObjectSyncContentValue_ErrorResponse)(nil), + (*ObjectSyncContentValueValueOfHeadUpdate)(nil), + (*ObjectSyncContentValueValueOfFullSyncRequest)(nil), + (*ObjectSyncContentValueValueOfFullSyncResponse)(nil), + (*ObjectSyncContentValueValueOfErrorResponse)(nil), } } @@ -1410,12 +1410,12 @@ func (m *ObjectSyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *ObjectSyncContentValue_HeadUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValueValueOfHeadUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ObjectSyncContentValue_HeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValueValueOfHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.HeadUpdate != nil { { @@ -1431,12 +1431,12 @@ func (m *ObjectSyncContentValue_HeadUpdate) MarshalToSizedBuffer(dAtA []byte) (i } return len(dAtA) - i, nil } -func (m *ObjectSyncContentValue_FullSyncRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValueValueOfFullSyncRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ObjectSyncContentValue_FullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValueValueOfFullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.FullSyncRequest != nil { { @@ -1452,12 +1452,12 @@ func (m *ObjectSyncContentValue_FullSyncRequest) MarshalToSizedBuffer(dAtA []byt } return len(dAtA) - i, nil } -func (m *ObjectSyncContentValue_FullSyncResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValueValueOfFullSyncResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ObjectSyncContentValue_FullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValueValueOfFullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.FullSyncResponse != nil { { @@ -1473,12 +1473,12 @@ func (m *ObjectSyncContentValue_FullSyncResponse) MarshalToSizedBuffer(dAtA []by } return len(dAtA) - i, nil } -func (m *ObjectSyncContentValue_ErrorResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValueValueOfErrorResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ObjectSyncContentValue_ErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValueValueOfErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.ErrorResponse != nil { { @@ -2030,7 +2030,7 @@ func (m *ObjectSyncContentValue) Size() (n int) { return n } -func (m *ObjectSyncContentValue_HeadUpdate) Size() (n int) { +func (m *ObjectSyncContentValueValueOfHeadUpdate) Size() (n int) { if m == nil { return 0 } @@ -2042,7 +2042,7 @@ func (m *ObjectSyncContentValue_HeadUpdate) Size() (n int) { } return n } -func (m *ObjectSyncContentValue_FullSyncRequest) Size() (n int) { +func (m *ObjectSyncContentValueValueOfFullSyncRequest) Size() (n int) { if m == nil { return 0 } @@ -2054,7 +2054,7 @@ func (m *ObjectSyncContentValue_FullSyncRequest) Size() (n int) { } return n } -func (m *ObjectSyncContentValue_FullSyncResponse) Size() (n int) { +func (m *ObjectSyncContentValueValueOfFullSyncResponse) Size() (n int) { if m == nil { return 0 } @@ -2066,7 +2066,7 @@ func (m *ObjectSyncContentValue_FullSyncResponse) Size() (n int) { } return n } -func (m *ObjectSyncContentValue_ErrorResponse) Size() (n int) { +func (m *ObjectSyncContentValueValueOfErrorResponse) Size() (n int) { if m == nil { return 0 } @@ -3103,7 +3103,7 @@ func (m *ObjectSyncContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ObjectSyncContentValue_HeadUpdate{v} + m.Value = &ObjectSyncContentValueValueOfHeadUpdate{v} iNdEx = postIndex case 2: if wireType != 2 { @@ -3138,7 +3138,7 @@ func (m *ObjectSyncContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ObjectSyncContentValue_FullSyncRequest{v} + m.Value = &ObjectSyncContentValueValueOfFullSyncRequest{v} iNdEx = postIndex case 3: if wireType != 2 { @@ -3173,7 +3173,7 @@ func (m *ObjectSyncContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ObjectSyncContentValue_FullSyncResponse{v} + m.Value = &ObjectSyncContentValueValueOfFullSyncResponse{v} iNdEx = postIndex case 4: if wireType != 2 { @@ -3208,7 +3208,7 @@ func (m *ObjectSyncContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ObjectSyncContentValue_ErrorResponse{v} + m.Value = &ObjectSyncContentValueValueOfErrorResponse{v} iNdEx = postIndex default: iNdEx = preIndex diff --git a/common/pkg/acl/aclrecordproto/aclrecord.pb.go b/common/pkg/acl/aclrecordproto/aclrecord.pb.go index e11f5209..00b89319 100644 --- a/common/pkg/acl/aclrecordproto/aclrecord.pb.go +++ b/common/pkg/acl/aclrecordproto/aclrecord.pb.go @@ -324,13 +324,12 @@ func (m *ACLRoot) GetTimestamp() int64 { type ACLContentValue struct { // Types that are valid to be assigned to Value: - // - // *ACLContentValue_UserAdd - // *ACLContentValue_UserRemove - // *ACLContentValue_UserPermissionChange - // *ACLContentValue_UserInvite - // *ACLContentValue_UserJoin - Value isACLContentValue_Value `protobuf_oneof:"value"` + // *ACLContentValueValueOfUserAdd + // *ACLContentValueValueOfUserRemove + // *ACLContentValueValueOfUserPermissionChange + // *ACLContentValueValueOfUserInvite + // *ACLContentValueValueOfUserJoin + Value IsACLContentValueValue `protobuf_oneof:"value"` } func (m *ACLContentValue) Reset() { *m = ACLContentValue{} } @@ -366,35 +365,35 @@ func (m *ACLContentValue) XXX_DiscardUnknown() { var xxx_messageInfo_ACLContentValue proto.InternalMessageInfo -type isACLContentValue_Value interface { - isACLContentValue_Value() +type IsACLContentValueValue interface { + IsACLContentValueValue() MarshalTo([]byte) (int, error) Size() int } -type ACLContentValue_UserAdd struct { +type ACLContentValueValueOfUserAdd struct { UserAdd *ACLUserAdd `protobuf:"bytes,1,opt,name=userAdd,proto3,oneof" json:"userAdd,omitempty"` } -type ACLContentValue_UserRemove struct { +type ACLContentValueValueOfUserRemove struct { UserRemove *ACLUserRemove `protobuf:"bytes,2,opt,name=userRemove,proto3,oneof" json:"userRemove,omitempty"` } -type ACLContentValue_UserPermissionChange struct { +type ACLContentValueValueOfUserPermissionChange struct { UserPermissionChange *ACLUserPermissionChange `protobuf:"bytes,3,opt,name=userPermissionChange,proto3,oneof" json:"userPermissionChange,omitempty"` } -type ACLContentValue_UserInvite struct { +type ACLContentValueValueOfUserInvite struct { UserInvite *ACLUserInvite `protobuf:"bytes,4,opt,name=userInvite,proto3,oneof" json:"userInvite,omitempty"` } -type ACLContentValue_UserJoin struct { +type ACLContentValueValueOfUserJoin struct { UserJoin *ACLUserJoin `protobuf:"bytes,5,opt,name=userJoin,proto3,oneof" json:"userJoin,omitempty"` } -func (*ACLContentValue_UserAdd) isACLContentValue_Value() {} -func (*ACLContentValue_UserRemove) isACLContentValue_Value() {} -func (*ACLContentValue_UserPermissionChange) isACLContentValue_Value() {} -func (*ACLContentValue_UserInvite) isACLContentValue_Value() {} -func (*ACLContentValue_UserJoin) isACLContentValue_Value() {} +func (*ACLContentValueValueOfUserAdd) IsACLContentValueValue() {} +func (*ACLContentValueValueOfUserRemove) IsACLContentValueValue() {} +func (*ACLContentValueValueOfUserPermissionChange) IsACLContentValueValue() {} +func (*ACLContentValueValueOfUserInvite) IsACLContentValueValue() {} +func (*ACLContentValueValueOfUserJoin) IsACLContentValueValue() {} -func (m *ACLContentValue) GetValue() isACLContentValue_Value { +func (m *ACLContentValue) GetValue() IsACLContentValueValue { if m != nil { return m.Value } @@ -402,35 +401,35 @@ func (m *ACLContentValue) GetValue() isACLContentValue_Value { } func (m *ACLContentValue) GetUserAdd() *ACLUserAdd { - if x, ok := m.GetValue().(*ACLContentValue_UserAdd); ok { + if x, ok := m.GetValue().(*ACLContentValueValueOfUserAdd); ok { return x.UserAdd } return nil } func (m *ACLContentValue) GetUserRemove() *ACLUserRemove { - if x, ok := m.GetValue().(*ACLContentValue_UserRemove); ok { + if x, ok := m.GetValue().(*ACLContentValueValueOfUserRemove); ok { return x.UserRemove } return nil } func (m *ACLContentValue) GetUserPermissionChange() *ACLUserPermissionChange { - if x, ok := m.GetValue().(*ACLContentValue_UserPermissionChange); ok { + if x, ok := m.GetValue().(*ACLContentValueValueOfUserPermissionChange); ok { return x.UserPermissionChange } return nil } func (m *ACLContentValue) GetUserInvite() *ACLUserInvite { - if x, ok := m.GetValue().(*ACLContentValue_UserInvite); ok { + if x, ok := m.GetValue().(*ACLContentValueValueOfUserInvite); ok { return x.UserInvite } return nil } func (m *ACLContentValue) GetUserJoin() *ACLUserJoin { - if x, ok := m.GetValue().(*ACLContentValue_UserJoin); ok { + if x, ok := m.GetValue().(*ACLContentValueValueOfUserJoin); ok { return x.UserJoin } return nil @@ -439,11 +438,11 @@ func (m *ACLContentValue) GetUserJoin() *ACLUserJoin { // XXX_OneofWrappers is for the internal use of the proto package. func (*ACLContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*ACLContentValue_UserAdd)(nil), - (*ACLContentValue_UserRemove)(nil), - (*ACLContentValue_UserPermissionChange)(nil), - (*ACLContentValue_UserInvite)(nil), - (*ACLContentValue_UserJoin)(nil), + (*ACLContentValueValueOfUserAdd)(nil), + (*ACLContentValueValueOfUserRemove)(nil), + (*ACLContentValueValueOfUserPermissionChange)(nil), + (*ACLContentValueValueOfUserInvite)(nil), + (*ACLContentValueValueOfUserJoin)(nil), } } @@ -1304,12 +1303,12 @@ func (m *ACLContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLContentValue_UserAdd) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValueValueOfUserAdd) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLContentValue_UserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValueValueOfUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserAdd != nil { { @@ -1325,12 +1324,12 @@ func (m *ACLContentValue_UserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } -func (m *ACLContentValue_UserRemove) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValueValueOfUserRemove) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLContentValue_UserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValueValueOfUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserRemove != nil { { @@ -1346,12 +1345,12 @@ func (m *ACLContentValue_UserRemove) MarshalToSizedBuffer(dAtA []byte) (int, err } return len(dAtA) - i, nil } -func (m *ACLContentValue_UserPermissionChange) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValueValueOfUserPermissionChange) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLContentValue_UserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValueValueOfUserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserPermissionChange != nil { { @@ -1367,12 +1366,12 @@ func (m *ACLContentValue_UserPermissionChange) MarshalToSizedBuffer(dAtA []byte) } return len(dAtA) - i, nil } -func (m *ACLContentValue_UserInvite) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValueValueOfUserInvite) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLContentValue_UserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValueValueOfUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserInvite != nil { { @@ -1388,12 +1387,12 @@ func (m *ACLContentValue_UserInvite) MarshalToSizedBuffer(dAtA []byte) (int, err } return len(dAtA) - i, nil } -func (m *ACLContentValue_UserJoin) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValueValueOfUserJoin) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLContentValue_UserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValueValueOfUserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserJoin != nil { { @@ -1980,7 +1979,7 @@ func (m *ACLContentValue) Size() (n int) { return n } -func (m *ACLContentValue_UserAdd) Size() (n int) { +func (m *ACLContentValueValueOfUserAdd) Size() (n int) { if m == nil { return 0 } @@ -1992,7 +1991,7 @@ func (m *ACLContentValue_UserAdd) Size() (n int) { } return n } -func (m *ACLContentValue_UserRemove) Size() (n int) { +func (m *ACLContentValueValueOfUserRemove) Size() (n int) { if m == nil { return 0 } @@ -2004,7 +2003,7 @@ func (m *ACLContentValue_UserRemove) Size() (n int) { } return n } -func (m *ACLContentValue_UserPermissionChange) Size() (n int) { +func (m *ACLContentValueValueOfUserPermissionChange) Size() (n int) { if m == nil { return 0 } @@ -2016,7 +2015,7 @@ func (m *ACLContentValue_UserPermissionChange) Size() (n int) { } return n } -func (m *ACLContentValue_UserInvite) Size() (n int) { +func (m *ACLContentValueValueOfUserInvite) Size() (n int) { if m == nil { return 0 } @@ -2028,7 +2027,7 @@ func (m *ACLContentValue_UserInvite) Size() (n int) { } return n } -func (m *ACLContentValue_UserJoin) Size() (n int) { +func (m *ACLContentValueValueOfUserJoin) Size() (n int) { if m == nil { return 0 } @@ -2997,7 +2996,7 @@ func (m *ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLContentValue_UserAdd{v} + m.Value = &ACLContentValueValueOfUserAdd{v} iNdEx = postIndex case 2: if wireType != 2 { @@ -3032,7 +3031,7 @@ func (m *ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLContentValue_UserRemove{v} + m.Value = &ACLContentValueValueOfUserRemove{v} iNdEx = postIndex case 3: if wireType != 2 { @@ -3067,7 +3066,7 @@ func (m *ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLContentValue_UserPermissionChange{v} + m.Value = &ACLContentValueValueOfUserPermissionChange{v} iNdEx = postIndex case 4: if wireType != 2 { @@ -3102,7 +3101,7 @@ func (m *ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLContentValue_UserInvite{v} + m.Value = &ACLContentValueValueOfUserInvite{v} iNdEx = postIndex case 5: if wireType != 2 { @@ -3137,7 +3136,7 @@ func (m *ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLContentValue_UserJoin{v} + m.Value = &ACLContentValueValueOfUserJoin{v} iNdEx = postIndex default: iNdEx = preIndex diff --git a/common/pkg/acl/testutils/testchanges/proto/test.pb.go b/common/pkg/acl/testutils/testchanges/proto/test.pb.go index d99ba0b5..efe931aa 100644 --- a/common/pkg/acl/testutils/testchanges/proto/test.pb.go +++ b/common/pkg/acl/testutils/testchanges/proto/test.pb.go @@ -22,21 +22,24 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -type PlainTextChange struct { +type TextContent struct { + // Types that are valid to be assigned to Value: + // *TextContentValueOfTextAppend + Value IsTextContentValue `protobuf_oneof:"value"` } -func (m *PlainTextChange) Reset() { *m = PlainTextChange{} } -func (m *PlainTextChange) String() string { return proto.CompactTextString(m) } -func (*PlainTextChange) ProtoMessage() {} -func (*PlainTextChange) Descriptor() ([]byte, []int) { +func (m *TextContent) Reset() { *m = TextContent{} } +func (m *TextContent) String() string { return proto.CompactTextString(m) } +func (*TextContent) ProtoMessage() {} +func (*TextContent) Descriptor() ([]byte, []int) { return fileDescriptor_37f33c266ada4318, []int{0} } -func (m *PlainTextChange) XXX_Unmarshal(b []byte) error { +func (m *TextContent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TextContent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChange.Marshal(b, m, deterministic) + return xxx_messageInfo_TextContent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -46,107 +49,67 @@ func (m *PlainTextChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *PlainTextChange) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChange.Merge(m, src) +func (m *TextContent) XXX_Merge(src proto.Message) { + xxx_messageInfo_TextContent.Merge(m, src) } -func (m *PlainTextChange) XXX_Size() int { +func (m *TextContent) XXX_Size() int { return m.Size() } -func (m *PlainTextChange) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChange.DiscardUnknown(m) +func (m *TextContent) XXX_DiscardUnknown() { + xxx_messageInfo_TextContent.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChange proto.InternalMessageInfo +var xxx_messageInfo_TextContent proto.InternalMessageInfo -type PlainTextChange_Content struct { - // Types that are valid to be assigned to Value: - // - // *PlainTextChange_Content_TextAppend - Value isPlainTextChange_Content_Value `protobuf_oneof:"value"` -} - -func (m *PlainTextChange_Content) Reset() { *m = PlainTextChange_Content{} } -func (m *PlainTextChange_Content) String() string { return proto.CompactTextString(m) } -func (*PlainTextChange_Content) ProtoMessage() {} -func (*PlainTextChange_Content) Descriptor() ([]byte, []int) { - return fileDescriptor_37f33c266ada4318, []int{0, 0} -} -func (m *PlainTextChange_Content) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PlainTextChange_Content) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PlainTextChange_Content.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 *PlainTextChange_Content) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChange_Content.Merge(m, src) -} -func (m *PlainTextChange_Content) XXX_Size() int { - return m.Size() -} -func (m *PlainTextChange_Content) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChange_Content.DiscardUnknown(m) -} - -var xxx_messageInfo_PlainTextChange_Content proto.InternalMessageInfo - -type isPlainTextChange_Content_Value interface { - isPlainTextChange_Content_Value() +type IsTextContentValue interface { + IsTextContentValue() MarshalTo([]byte) (int, error) Size() int } -type PlainTextChange_Content_TextAppend struct { - TextAppend *PlainTextChange_TextAppend `protobuf:"bytes,1,opt,name=textAppend,proto3,oneof" json:"textAppend,omitempty"` +type TextContentValueOfTextAppend struct { + TextAppend *TextAppend `protobuf:"bytes,1,opt,name=textAppend,proto3,oneof" json:"textAppend,omitempty"` } -func (*PlainTextChange_Content_TextAppend) isPlainTextChange_Content_Value() {} +func (*TextContentValueOfTextAppend) IsTextContentValue() {} -func (m *PlainTextChange_Content) GetValue() isPlainTextChange_Content_Value { +func (m *TextContent) GetValue() IsTextContentValue { if m != nil { return m.Value } return nil } -func (m *PlainTextChange_Content) GetTextAppend() *PlainTextChange_TextAppend { - if x, ok := m.GetValue().(*PlainTextChange_Content_TextAppend); ok { +func (m *TextContent) GetTextAppend() *TextAppend { + if x, ok := m.GetValue().(*TextContentValueOfTextAppend); ok { return x.TextAppend } return nil } // XXX_OneofWrappers is for the internal use of the proto package. -func (*PlainTextChange_Content) XXX_OneofWrappers() []interface{} { +func (*TextContent) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*PlainTextChange_Content_TextAppend)(nil), + (*TextContentValueOfTextAppend)(nil), } } -type PlainTextChange_TextAppend struct { +type TextAppend struct { Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` } -func (m *PlainTextChange_TextAppend) Reset() { *m = PlainTextChange_TextAppend{} } -func (m *PlainTextChange_TextAppend) String() string { return proto.CompactTextString(m) } -func (*PlainTextChange_TextAppend) ProtoMessage() {} -func (*PlainTextChange_TextAppend) Descriptor() ([]byte, []int) { - return fileDescriptor_37f33c266ada4318, []int{0, 1} +func (m *TextAppend) Reset() { *m = TextAppend{} } +func (m *TextAppend) String() string { return proto.CompactTextString(m) } +func (*TextAppend) ProtoMessage() {} +func (*TextAppend) Descriptor() ([]byte, []int) { + return fileDescriptor_37f33c266ada4318, []int{1} } -func (m *PlainTextChange_TextAppend) XXX_Unmarshal(b []byte) error { +func (m *TextAppend) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChange_TextAppend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TextAppend) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChange_TextAppend.Marshal(b, m, deterministic) + return xxx_messageInfo_TextAppend.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -156,41 +119,41 @@ func (m *PlainTextChange_TextAppend) XXX_Marshal(b []byte, deterministic bool) ( return b[:n], nil } } -func (m *PlainTextChange_TextAppend) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChange_TextAppend.Merge(m, src) +func (m *TextAppend) XXX_Merge(src proto.Message) { + xxx_messageInfo_TextAppend.Merge(m, src) } -func (m *PlainTextChange_TextAppend) XXX_Size() int { +func (m *TextAppend) XXX_Size() int { return m.Size() } -func (m *PlainTextChange_TextAppend) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChange_TextAppend.DiscardUnknown(m) +func (m *TextAppend) XXX_DiscardUnknown() { + xxx_messageInfo_TextAppend.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChange_TextAppend proto.InternalMessageInfo +var xxx_messageInfo_TextAppend proto.InternalMessageInfo -func (m *PlainTextChange_TextAppend) GetText() string { +func (m *TextAppend) GetText() string { if m != nil { return m.Text } return "" } -type PlainTextChange_Snapshot struct { +type TextSnapshot struct { Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` } -func (m *PlainTextChange_Snapshot) Reset() { *m = PlainTextChange_Snapshot{} } -func (m *PlainTextChange_Snapshot) String() string { return proto.CompactTextString(m) } -func (*PlainTextChange_Snapshot) ProtoMessage() {} -func (*PlainTextChange_Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_37f33c266ada4318, []int{0, 2} +func (m *TextSnapshot) Reset() { *m = TextSnapshot{} } +func (m *TextSnapshot) String() string { return proto.CompactTextString(m) } +func (*TextSnapshot) ProtoMessage() {} +func (*TextSnapshot) Descriptor() ([]byte, []int) { + return fileDescriptor_37f33c266ada4318, []int{2} } -func (m *PlainTextChange_Snapshot) XXX_Unmarshal(b []byte) error { +func (m *TextSnapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChange_Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TextSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChange_Snapshot.Marshal(b, m, deterministic) + return xxx_messageInfo_TextSnapshot.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -200,42 +163,42 @@ func (m *PlainTextChange_Snapshot) XXX_Marshal(b []byte, deterministic bool) ([] return b[:n], nil } } -func (m *PlainTextChange_Snapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChange_Snapshot.Merge(m, src) +func (m *TextSnapshot) XXX_Merge(src proto.Message) { + xxx_messageInfo_TextSnapshot.Merge(m, src) } -func (m *PlainTextChange_Snapshot) XXX_Size() int { +func (m *TextSnapshot) XXX_Size() int { return m.Size() } -func (m *PlainTextChange_Snapshot) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChange_Snapshot.DiscardUnknown(m) +func (m *TextSnapshot) XXX_DiscardUnknown() { + xxx_messageInfo_TextSnapshot.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChange_Snapshot proto.InternalMessageInfo +var xxx_messageInfo_TextSnapshot proto.InternalMessageInfo -func (m *PlainTextChange_Snapshot) GetText() string { +func (m *TextSnapshot) GetText() string { if m != nil { return m.Text } return "" } -type PlainTextChange_Data struct { - Content []*PlainTextChange_Content `protobuf:"bytes,1,rep,name=content,proto3" json:"content,omitempty"` - Snapshot *PlainTextChange_Snapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` +type TextData struct { + Content []*TextContent `protobuf:"bytes,1,rep,name=content,proto3" json:"content,omitempty"` + Snapshot *TextSnapshot `protobuf:"bytes,2,opt,name=snapshot,proto3" json:"snapshot,omitempty"` } -func (m *PlainTextChange_Data) Reset() { *m = PlainTextChange_Data{} } -func (m *PlainTextChange_Data) String() string { return proto.CompactTextString(m) } -func (*PlainTextChange_Data) ProtoMessage() {} -func (*PlainTextChange_Data) Descriptor() ([]byte, []int) { - return fileDescriptor_37f33c266ada4318, []int{0, 3} +func (m *TextData) Reset() { *m = TextData{} } +func (m *TextData) String() string { return proto.CompactTextString(m) } +func (*TextData) ProtoMessage() {} +func (*TextData) Descriptor() ([]byte, []int) { + return fileDescriptor_37f33c266ada4318, []int{3} } -func (m *PlainTextChange_Data) XXX_Unmarshal(b []byte) error { +func (m *TextData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *PlainTextChange_Data) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TextData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_PlainTextChange_Data.Marshal(b, m, deterministic) + return xxx_messageInfo_TextData.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -245,26 +208,26 @@ func (m *PlainTextChange_Data) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *PlainTextChange_Data) XXX_Merge(src proto.Message) { - xxx_messageInfo_PlainTextChange_Data.Merge(m, src) +func (m *TextData) XXX_Merge(src proto.Message) { + xxx_messageInfo_TextData.Merge(m, src) } -func (m *PlainTextChange_Data) XXX_Size() int { +func (m *TextData) XXX_Size() int { return m.Size() } -func (m *PlainTextChange_Data) XXX_DiscardUnknown() { - xxx_messageInfo_PlainTextChange_Data.DiscardUnknown(m) +func (m *TextData) XXX_DiscardUnknown() { + xxx_messageInfo_TextData.DiscardUnknown(m) } -var xxx_messageInfo_PlainTextChange_Data proto.InternalMessageInfo +var xxx_messageInfo_TextData proto.InternalMessageInfo -func (m *PlainTextChange_Data) GetContent() []*PlainTextChange_Content { +func (m *TextData) GetContent() []*TextContent { if m != nil { return m.Content } return nil } -func (m *PlainTextChange_Data) GetSnapshot() *PlainTextChange_Snapshot { +func (m *TextData) GetSnapshot() *TextSnapshot { if m != nil { return m.Snapshot } @@ -272,11 +235,10 @@ func (m *PlainTextChange_Data) GetSnapshot() *PlainTextChange_Snapshot { } func init() { - proto.RegisterType((*PlainTextChange)(nil), "anytype.PlainTextChange") - proto.RegisterType((*PlainTextChange_Content)(nil), "anytype.PlainTextChange.Content") - proto.RegisterType((*PlainTextChange_TextAppend)(nil), "anytype.PlainTextChange.TextAppend") - proto.RegisterType((*PlainTextChange_Snapshot)(nil), "anytype.PlainTextChange.Snapshot") - proto.RegisterType((*PlainTextChange_Data)(nil), "anytype.PlainTextChange.Data") + proto.RegisterType((*TextContent)(nil), "anytype.TextContent") + proto.RegisterType((*TextAppend)(nil), "anytype.TextAppend") + proto.RegisterType((*TextSnapshot)(nil), "anytype.TextSnapshot") + proto.RegisterType((*TextData)(nil), "anytype.TextData") } func init() { @@ -284,27 +246,26 @@ func init() { } var fileDescriptor_37f33c266ada4318 = []byte{ - // 266 bytes of a gzipped FileDescriptorProto + // 252 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x2b, 0xc8, 0x4e, 0xd7, 0x4f, 0x4c, 0xce, 0xd1, 0x2f, 0x49, 0x2d, 0x2e, 0x29, 0x2d, 0xc9, 0xcc, 0x29, 0x06, 0xb3, 0x92, 0x33, 0x12, 0xf3, 0xd2, 0x53, 0x8b, 0xf5, 0x0b, 0x8a, 0xf2, 0x4b, 0xf2, 0xc1, 0x22, 0x7a, 0x60, - 0xa6, 0x10, 0x7b, 0x62, 0x5e, 0x65, 0x49, 0x65, 0x41, 0xaa, 0xd2, 0x26, 0x26, 0x2e, 0xfe, 0x80, - 0x9c, 0xc4, 0xcc, 0xbc, 0x90, 0xd4, 0x8a, 0x12, 0x67, 0xb0, 0x72, 0xa9, 0x48, 0x2e, 0x76, 0xe7, - 0xfc, 0xbc, 0x92, 0xd4, 0xbc, 0x12, 0x21, 0x57, 0x2e, 0xae, 0x92, 0xd4, 0x8a, 0x12, 0xc7, 0x82, - 0x82, 0xd4, 0xbc, 0x14, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x6e, 0x23, 0x65, 0x3d, 0xa8, 0x66, 0x3d, - 0x34, 0x8d, 0x7a, 0x21, 0x70, 0xa5, 0x1e, 0x0c, 0x41, 0x48, 0x1a, 0x9d, 0xd8, 0xb9, 0x58, 0xcb, - 0x12, 0x73, 0x4a, 0x53, 0xa5, 0x14, 0xb8, 0xb8, 0x10, 0x8a, 0x84, 0x84, 0xb8, 0x58, 0x40, 0x8a, - 0xc0, 0xe6, 0x72, 0x06, 0x81, 0xd9, 0x52, 0x72, 0x5c, 0x1c, 0xc1, 0x79, 0x89, 0x05, 0xc5, 0x19, - 0xf9, 0x25, 0x58, 0xe5, 0x1b, 0x19, 0xb9, 0x58, 0x5c, 0x12, 0x4b, 0x12, 0x85, 0xac, 0xb8, 0xd8, - 0x93, 0x21, 0xae, 0x94, 0x60, 0x54, 0x60, 0xd6, 0xe0, 0x36, 0x52, 0xc0, 0xe9, 0x2e, 0xa8, 0x6f, - 0x82, 0x60, 0x1a, 0x84, 0x6c, 0xb9, 0x38, 0x8a, 0xa1, 0x96, 0x48, 0x30, 0x81, 0x3d, 0xa5, 0x88, - 0x53, 0x33, 0xcc, 0x35, 0x41, 0x70, 0x2d, 0x4e, 0xaa, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, - 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, - 0x2c, 0xc7, 0x10, 0xc5, 0x8d, 0x14, 0xea, 0x49, 0x6c, 0xe0, 0xb0, 0x36, 0x06, 0x04, 0x00, 0x00, - 0xff, 0xff, 0xf8, 0x8c, 0x6a, 0x1d, 0x9d, 0x01, 0x00, 0x00, + 0xa6, 0x10, 0x7b, 0x62, 0x5e, 0x65, 0x49, 0x65, 0x41, 0xaa, 0x92, 0x2f, 0x17, 0x77, 0x48, 0x6a, + 0x45, 0x89, 0x73, 0x7e, 0x5e, 0x49, 0x6a, 0x5e, 0x89, 0x90, 0x29, 0x17, 0x57, 0x49, 0x6a, 0x45, + 0x89, 0x63, 0x41, 0x41, 0x6a, 0x5e, 0x8a, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xb7, 0x91, 0xb0, 0x1e, + 0x54, 0xb1, 0x5e, 0x08, 0x5c, 0xca, 0x83, 0x21, 0x08, 0x49, 0xa1, 0x13, 0x3b, 0x17, 0x6b, 0x59, + 0x62, 0x4e, 0x69, 0xaa, 0x92, 0x02, 0x17, 0x17, 0x42, 0x91, 0x90, 0x10, 0x17, 0x0b, 0x48, 0x11, + 0xd8, 0x1c, 0xce, 0x20, 0x30, 0x5b, 0x49, 0x89, 0x8b, 0x07, 0xa4, 0x22, 0x38, 0x2f, 0xb1, 0xa0, + 0x38, 0x23, 0xbf, 0x04, 0xab, 0x9a, 0x5c, 0x2e, 0x0e, 0x90, 0x1a, 0x97, 0xc4, 0x92, 0x44, 0x21, + 0x3d, 0x2e, 0xf6, 0x64, 0x88, 0xe3, 0x24, 0x18, 0x15, 0x98, 0x35, 0xb8, 0x8d, 0x44, 0x50, 0x9c, + 0x03, 0x75, 0x78, 0x10, 0x4c, 0x91, 0x90, 0x21, 0x17, 0x47, 0x31, 0xd4, 0x6c, 0x09, 0x26, 0xb0, + 0xfb, 0x45, 0x51, 0x34, 0xc0, 0x2c, 0x0e, 0x82, 0x2b, 0x73, 0x52, 0x3d, 0xf1, 0x48, 0x8e, 0xf1, + 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, + 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0x6e, 0xa4, 0x40, 0x4c, 0x62, 0x03, 0x07, 0x9d, 0x31, 0x20, + 0x00, 0x00, 0xff, 0xff, 0xdc, 0xbf, 0x78, 0xe5, 0x6c, 0x01, 0x00, 0x00, } -func (m *PlainTextChange) Marshal() (dAtA []byte, err error) { +func (m *TextContent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -314,35 +275,12 @@ func (m *PlainTextChange) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChange) MarshalTo(dAtA []byte) (int, error) { +func (m *TextContent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *PlainTextChange_Content) 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 *PlainTextChange_Content) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PlainTextChange_Content) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TextContent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -359,12 +297,12 @@ func (m *PlainTextChange_Content) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *PlainTextChange_Content_TextAppend) MarshalTo(dAtA []byte) (int, error) { +func (m *TextContentValueOfTextAppend) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChange_Content_TextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TextContentValueOfTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.TextAppend != nil { { @@ -380,7 +318,7 @@ func (m *PlainTextChange_Content_TextAppend) MarshalToSizedBuffer(dAtA []byte) ( } return len(dAtA) - i, nil } -func (m *PlainTextChange_TextAppend) Marshal() (dAtA []byte, err error) { +func (m *TextAppend) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -390,12 +328,12 @@ func (m *PlainTextChange_TextAppend) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChange_TextAppend) MarshalTo(dAtA []byte) (int, error) { +func (m *TextAppend) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChange_TextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -410,7 +348,7 @@ func (m *PlainTextChange_TextAppend) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } -func (m *PlainTextChange_Snapshot) Marshal() (dAtA []byte, err error) { +func (m *TextSnapshot) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -420,12 +358,12 @@ func (m *PlainTextChange_Snapshot) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChange_Snapshot) MarshalTo(dAtA []byte) (int, error) { +func (m *TextSnapshot) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChange_Snapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TextSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -440,7 +378,7 @@ func (m *PlainTextChange_Snapshot) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *PlainTextChange_Data) Marshal() (dAtA []byte, err error) { +func (m *TextData) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -450,12 +388,12 @@ func (m *PlainTextChange_Data) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *PlainTextChange_Data) MarshalTo(dAtA []byte) (int, error) { +func (m *TextData) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PlainTextChange_Data) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TextData) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -500,16 +438,7 @@ func encodeVarintTest(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *PlainTextChange) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *PlainTextChange_Content) Size() (n int) { +func (m *TextContent) Size() (n int) { if m == nil { return 0 } @@ -521,7 +450,7 @@ func (m *PlainTextChange_Content) Size() (n int) { return n } -func (m *PlainTextChange_Content_TextAppend) Size() (n int) { +func (m *TextContentValueOfTextAppend) Size() (n int) { if m == nil { return 0 } @@ -533,7 +462,7 @@ func (m *PlainTextChange_Content_TextAppend) Size() (n int) { } return n } -func (m *PlainTextChange_TextAppend) Size() (n int) { +func (m *TextAppend) Size() (n int) { if m == nil { return 0 } @@ -546,7 +475,7 @@ func (m *PlainTextChange_TextAppend) Size() (n int) { return n } -func (m *PlainTextChange_Snapshot) Size() (n int) { +func (m *TextSnapshot) Size() (n int) { if m == nil { return 0 } @@ -559,7 +488,7 @@ func (m *PlainTextChange_Snapshot) Size() (n int) { return n } -func (m *PlainTextChange_Data) Size() (n int) { +func (m *TextData) Size() (n int) { if m == nil { return 0 } @@ -584,7 +513,7 @@ func sovTest(x uint64) (n int) { func sozTest(x uint64) (n int) { return sovTest(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *PlainTextChange) Unmarshal(dAtA []byte) error { +func (m *TextContent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -607,60 +536,10 @@ func (m *PlainTextChange) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PlainTextChange: wiretype end group for non-group") + return fmt.Errorf("proto: TextContent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PlainTextChange: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTest(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTest - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PlainTextChange_Content) 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 ErrIntOverflowTest - } - 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: Content: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Content: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TextContent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -692,11 +571,11 @@ func (m *PlainTextChange_Content) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &PlainTextChange_TextAppend{} + v := &TextAppend{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &PlainTextChange_Content_TextAppend{v} + m.Value = &TextContentValueOfTextAppend{v} iNdEx = postIndex default: iNdEx = preIndex @@ -719,7 +598,7 @@ func (m *PlainTextChange_Content) Unmarshal(dAtA []byte) error { } return nil } -func (m *PlainTextChange_TextAppend) Unmarshal(dAtA []byte) error { +func (m *TextAppend) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -801,7 +680,7 @@ func (m *PlainTextChange_TextAppend) Unmarshal(dAtA []byte) error { } return nil } -func (m *PlainTextChange_Snapshot) Unmarshal(dAtA []byte) error { +func (m *TextSnapshot) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -824,10 +703,10 @@ func (m *PlainTextChange_Snapshot) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Snapshot: wiretype end group for non-group") + return fmt.Errorf("proto: TextSnapshot: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Snapshot: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TextSnapshot: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -883,7 +762,7 @@ func (m *PlainTextChange_Snapshot) Unmarshal(dAtA []byte) error { } return nil } -func (m *PlainTextChange_Data) Unmarshal(dAtA []byte) error { +func (m *TextData) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -906,10 +785,10 @@ func (m *PlainTextChange_Data) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Data: wiretype end group for non-group") + return fmt.Errorf("proto: TextData: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Data: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TextData: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -941,7 +820,7 @@ func (m *PlainTextChange_Data) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Content = append(m.Content, &PlainTextChange_Content{}) + m.Content = append(m.Content, &TextContent{}) if err := m.Content[len(m.Content)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -976,7 +855,7 @@ func (m *PlainTextChange_Data) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Snapshot == nil { - m.Snapshot = &PlainTextChange_Snapshot{} + m.Snapshot = &TextSnapshot{} } if err := m.Snapshot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/common/pkg/acl/testutils/testchanges/proto/test.proto b/common/pkg/acl/testutils/testchanges/proto/test.proto index b861050e..2c9d5f66 100644 --- a/common/pkg/acl/testutils/testchanges/proto/test.proto +++ b/common/pkg/acl/testutils/testchanges/proto/test.proto @@ -2,23 +2,21 @@ syntax = "proto3"; package anytype; option go_package = "testchanges"; -message PlainTextChange { - message Content { - oneof value { - TextAppend textAppend = 1; - } +message TextContent { + oneof value { + TextAppend textAppend = 1; } +} - message TextAppend { - string text = 1; - } +message TextAppend { + string text = 1; +} - message Snapshot { - string text = 1; - } +message TextSnapshot { + string text = 1; +} - message Data { - repeated Content content = 1; - Snapshot snapshot = 2; - } -} \ No newline at end of file +message TextData { + repeated TextContent content = 1; + TextSnapshot snapshot = 2; +} diff --git a/common/pkg/ldiff/diff.go b/common/pkg/ldiff/diff.go index 95ad70df..495f6388 100644 --- a/common/pkg/ldiff/diff.go +++ b/common/pkg/ldiff/diff.go @@ -1,6 +1,7 @@ -//go:generate mockgen -destination mock_ldiff/mock_ldiff.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff Diff,Remote // Package ldiff provides a container of elements with fixed id and changeable content. // Diff can calculate the difference with another diff container (you can make it remote) with minimum hops and traffic. +// +//go:generate mockgen -destination mock_ldiff/mock_ldiff.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff Diff,Remote package ldiff import ( @@ -84,6 +85,10 @@ type Diff interface { RemoveId(id string) error // Diff makes diff with remote container Diff(ctx context.Context, dl Remote) (newIds, changedIds, removedIds []string, err error) + // Elements retrieves all elements in the Diff + Elements() []Element + // Ids retrieves ids of all elements in the Diff + Ids() []string } // Remote interface for using in the Diff @@ -134,6 +139,34 @@ func (d *diff) Set(elements ...Element) { } } +func (d *diff) Ids() (ids []string) { + d.mu.RLock() + defer d.mu.RUnlock() + + ids = make([]string, 0, d.sl.Len()) + + cur := d.sl.Front() + for cur != nil { + el := cur.Key().(*element).Element + ids = append(ids, el.Id) + } + return +} + +func (d *diff) Elements() (elements []Element) { + d.mu.RLock() + defer d.mu.RUnlock() + + elements = make([]Element, 0, d.sl.Len()) + + cur := d.sl.Front() + for cur != nil { + el := cur.Key().(*element).Element + elements = append(elements, el) + } + return +} + // RemoveId removes element by id func (d *diff) RemoveId(id string) error { d.mu.Lock() From 04fd072ae92ffe2b5c2019fc4f4c53cfdf49e87d Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 18 Oct 2022 15:16:06 +0200 Subject: [PATCH 157/219] Add client cmd --- client/badgerprovider/service.go | 4 ++ client/cmd/client.go | 105 +++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 client/cmd/client.go diff --git a/client/badgerprovider/service.go b/client/badgerprovider/service.go index ed06f91e..64f80c2d 100644 --- a/client/badgerprovider/service.go +++ b/client/badgerprovider/service.go @@ -18,6 +18,10 @@ type service struct { db *badger.DB } +func New() BadgerProvider { + return &service{} +} + func (s *service) Init(a *app.App) (err error) { cfg := a.MustComponent(config.CName).(*config.Config) s.db, err = badger.Open(badger.DefaultOptions(cfg.Storage.Path)) diff --git a/client/cmd/client.go b/client/cmd/client.go new file mode 100644 index 00000000..b21214ce --- /dev/null +++ b/client/cmd/client.go @@ -0,0 +1,105 @@ +package main + +import ( + "context" + "flag" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" + "go.uber.org/zap" + "net/http" + _ "net/http/pprof" + "os" + "os/signal" + "syscall" + "time" +) + +var log = logger.NewNamed("main") + +var ( + flagConfigFile = flag.String("c", "etc/config.yml", "path to config file") + flagVersion = flag.Bool("v", false, "show version and exit") + flagHelp = flag.Bool("h", false, "show help and exit") +) + +func main() { + flag.Parse() + + if *flagVersion { + fmt.Println(app.VersionDescription()) + return + } + if *flagHelp { + flag.PrintDefaults() + return + } + + if debug, ok := os.LookupEnv("ANYPROF"); ok && debug != "" { + go func() { + http.ListenAndServe(debug, nil) + }() + } + + // create app + ctx := context.Background() + a := new(app.App) + + // open config file + conf, err := config.NewFromFile(*flagConfigFile) + if err != nil { + log.Fatal("can't open config file", zap.Error(err)) + } + + // bootstrap components + a.Register(conf) + Bootstrap(a) + + // start app + if err := a.Start(ctx); err != nil { + log.Fatal("can't start app", zap.Error(err)) + } + log.Info("app started", zap.String("version", a.Version())) + + // wait exit signal + exit := make(chan os.Signal, 1) + signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT) + sig := <-exit + log.Info("received exit signal, stop app...", zap.String("signal", fmt.Sprint(sig))) + + // close app + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + if err := a.Close(ctx); err != nil { + log.Fatal("close error", zap.Error(err)) + } else { + log.Info("goodbye!") + } + time.Sleep(time.Second / 3) +} + +func Bootstrap(a *app.App) { + a.Register(account.New()). + Register(badgerprovider.New()). + Register(storage.New()). + Register(clientcache.New(200)). + Register(secure.New()). + Register(dialer.New()). + Register(pool.New()). + Register(commonspace.New()). + Register(clientspace.New()). + Register(server.New()). + Register(document.New()) +} From 95cb91ffad999b4f2f83d1f9c9977a1f457d07ca Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 19 Oct 2022 12:20:24 +0200 Subject: [PATCH 158/219] Add space and tree close logic and fix some related tests --- client/api/controller.go | 58 +++++++++++ client/clientspace/clientcache/treecache.go | 46 ++++----- client/clientspace/rpchandler.go | 4 +- client/clientspace/service.go | 35 ++----- client/document/service.go | 39 ++++---- client/document/textdocument.go | 3 +- client/util/releasecontainer.go | 6 -- common/commonspace/cache/treecache.go | 30 ------ common/commonspace/diffservice/diffservice.go | 4 +- common/commonspace/diffservice/diffsyncer.go | 6 +- .../diffservice/diffsyncer_test.go | 7 +- common/commonspace/service.go | 6 +- common/commonspace/space.go | 34 ++++++- .../spacesyncproto/spacesync.pb.go | 80 +++++++-------- .../storage/mock_storage/mock_storage.go | 14 +-- .../mock_syncservice/mock_syncservice.go | 19 +++- common/commonspace/syncservice/streampool.go | 22 ++++- common/commonspace/syncservice/syncclient.go | 7 ++ common/commonspace/syncservice/synchandler.go | 18 ++-- .../syncservice/synchandler_test.go | 61 +++--------- common/commonspace/syncservice/syncservice.go | 10 +- common/commonspace/synctree/synctree.go | 23 +++++ .../mock_updatelistener.go | 2 +- .../mock_treegetter/mock_treegetter.go} | 62 ++++++------ common/commonspace/treegetter/treecache.go | 18 ++++ common/net/pool/pool.go | 1 - common/pkg/acl/aclrecordproto/aclrecord.pb.go | 99 ++++++++++--------- common/pkg/acl/list/mock_list/mock_list.go | 24 ++--- .../acl/storage/mock_storage/mock_storage.go | 4 +- .../testutils/testchanges/proto/test.pb.go | 27 ++--- .../tree/mock_objecttree/mock_objecttree.go | 22 ++--- common/pkg/ldiff/mock_ldiff/mock_ldiff.go | 30 +++++- common/pkg/ocache/ocache.go | 28 +++--- consensus/stream/service.go | 1 - node/nodespace/nodecache/treecache.go | 27 ++--- node/nodespace/rpchandler.go | 4 +- node/nodespace/service.go | 1 - 37 files changed, 486 insertions(+), 396 deletions(-) delete mode 100644 client/util/releasecontainer.go delete mode 100644 common/commonspace/cache/treecache.go rename common/commonspace/{cache/mock_cache/mock_cache.go => treegetter/mock_treegetter/mock_treegetter.go} (50%) create mode 100644 common/commonspace/treegetter/treecache.go diff --git a/client/api/controller.go b/client/api/controller.go index 51629007..7df3e356 100644 --- a/client/api/controller.go +++ b/client/api/controller.go @@ -18,3 +18,61 @@ type Controller interface { GenerateInvite(spaceId string) (invite string, err error) JoinSpace(invite string) (err error) } + +type controller struct { +} + +func (c *controller) DeriveSpace() (id string, err error) { + //TODO implement me + panic("implement me") +} + +func (c *controller) CreateSpace() (id string, err error) { + //TODO implement me + panic("implement me") +} + +func (c *controller) GetAllSpacesIds() (ids []string, err error) { + //TODO implement me + panic("implement me") +} + +func (c *controller) LoadSpace(id string) (err error) { + //TODO implement me + panic("implement me") +} + +func (c *controller) CreateDocument(spaceId string) (id string, err error) { + //TODO implement me + panic("implement me") +} + +func (c *controller) GetAllDocumentIds(spaceId string) (ids []string, err error) { + //TODO implement me + panic("implement me") +} + +func (c *controller) AddText(documentId, text string) (err error) { + //TODO implement me + panic("implement me") +} + +func (c *controller) DumpDocumentTree(documentId string) (err error) { + //TODO implement me + panic("implement me") +} + +func (c *controller) GetValidInvites(spaceId string) (invites []string, err error) { + //TODO implement me + panic("implement me") +} + +func (c *controller) GenerateInvite(spaceId string) (invite string, err error) { + //TODO implement me + panic("implement me") +} + +func (c *controller) JoinSpace(invite string) (err error) { + //TODO implement me + panic("implement me") +} diff --git a/client/clientspace/clientcache/treecache.go b/client/clientspace/clientcache/treecache.go index 9a80f9f7..1a5f4df8 100644 --- a/client/clientspace/clientcache/treecache.go +++ b/client/clientspace/clientcache/treecache.go @@ -7,7 +7,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "time" ) @@ -26,7 +27,12 @@ type treeCache struct { clientService clientspace.Service } -func New(ttl int) cache.TreeCache { +type TreeCache interface { + treegetter.TreeGetter + GetDocument(ctx context.Context, spaceId, id string) (doc document.TextDocument, err error) +} + +func New(ttl int) TreeCache { return &treeCache{ gcttl: ttl, } @@ -46,44 +52,38 @@ func (c *treeCache) Init(a *app.App) (err error) { c.cache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { spaceId := ctx.Value(spaceKey).(string) - container, err := c.clientService.GetSpace(ctx, spaceId) + space, err := c.clientService.GetSpace(ctx, spaceId) if err != nil { return } - defer container.Release() - return document.NewTextDocument(context.Background(), container.Object, id, c.docService) + return document.NewTextDocument(context.Background(), space, id, c.docService) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), ocache.WithTTL(time.Duration(c.gcttl)*time.Second), - ocache.WithRefCounter(false), ) return nil } func (c *treeCache) Name() (name string) { - return cache.CName + return treegetter.CName } -func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (res cache.TreeResult, err error) { - var cacheRes ocache.Object +func (c *treeCache) GetDocument(ctx context.Context, spaceId, id string) (doc document.TextDocument, err error) { ctx = context.WithValue(ctx, spaceKey, spaceId) - cacheRes, err = c.cache.Get(ctx, id) + v, err := c.cache.Get(ctx, id) if err != nil { - return cache.TreeResult{}, err - } - - treeContainer, ok := cacheRes.(cache.TreeContainer) - if !ok { - err = ErrCacheObjectWithoutTree return } - - res = cache.TreeResult{ - Release: func() { - c.cache.Release(id) - }, - TreeContainer: treeContainer, - } + doc = v.(document.TextDocument) + return +} + +func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (tr tree.ObjectTree, err error) { + doc, err := c.GetDocument(ctx, spaceId, id) + if err != nil { + return + } + tr = doc.Tree() return } diff --git a/client/clientspace/rpchandler.go b/client/clientspace/rpchandler.go index 3a76454c..8f291eaa 100644 --- a/client/clientspace/rpchandler.go +++ b/client/clientspace/rpchandler.go @@ -2,9 +2,9 @@ package clientspace import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" ) type rpcHandler struct { @@ -17,7 +17,7 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac err = spacesyncproto.ErrSpaceExists return } - if err != cache.ErrSpaceNotFound { + if err != treegetter.ErrSpaceNotFound { err = spacesyncproto.ErrUnexpected return } diff --git a/client/clientspace/service.go b/client/clientspace/service.go index 9bf7bd31..bb0bd1b3 100644 --- a/client/clientspace/service.go +++ b/client/clientspace/service.go @@ -2,7 +2,6 @@ package clientspace import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/client/util" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" @@ -23,9 +22,9 @@ func New() Service { } type Service interface { - GetSpace(ctx context.Context, id string) (util.ReleaseContainer[commonspace.Space], error) - CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (util.ReleaseContainer[commonspace.Space], error) - DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (util.ReleaseContainer[commonspace.Space], error) + GetSpace(ctx context.Context, id string) (commonspace.Space, error) + CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (commonspace.Space, error) + DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (commonspace.Space, error) app.ComponentRunnable } @@ -47,7 +46,6 @@ func (s *service) Init(a *app.App) (err error) { ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), ocache.WithTTL(time.Duration(s.conf.GCTTL)*time.Second), - ocache.WithRefCounter(false), ) return spacesyncproto.DRPCRegisterSpace(a.MustComponent(server.CName).(server.DRPCServer), &rpcHandler{s}) } @@ -64,7 +62,7 @@ func (s *service) Run(ctx context.Context) (err error) { return } -func (s *service) CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (container util.ReleaseContainer[commonspace.Space], err error) { +func (s *service) CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (container commonspace.Space, err error) { id, err := s.commonSpace.CreateSpace(ctx, payload) if err != nil { return @@ -74,15 +72,10 @@ func (s *service) CreateSpace(ctx context.Context, payload commonspace.SpaceCrea if err != nil { return } - return util.ReleaseContainer[commonspace.Space]{ - Object: obj.(commonspace.Space), - Release: func() { - s.spaceCache.Release(id) - }, - }, nil + return obj.(commonspace.Space), nil } -func (s *service) DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (container util.ReleaseContainer[commonspace.Space], err error) { +func (s *service) DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (container commonspace.Space, err error) { id, err := s.commonSpace.DeriveSpace(ctx, payload) if err != nil { return @@ -92,25 +85,15 @@ func (s *service) DeriveSpace(ctx context.Context, payload commonspace.SpaceDeri if err != nil { return } - return util.ReleaseContainer[commonspace.Space]{ - Object: obj.(commonspace.Space), - Release: func() { - s.spaceCache.Release(id) - }, - }, nil + return obj.(commonspace.Space), nil } -func (s *service) GetSpace(ctx context.Context, id string) (container util.ReleaseContainer[commonspace.Space], err error) { +func (s *service) GetSpace(ctx context.Context, id string) (container commonspace.Space, err error) { v, err := s.spaceCache.Get(ctx, id) if err != nil { return } - return util.ReleaseContainer[commonspace.Space]{ - Object: v.(commonspace.Space), - Release: func() { - s.spaceCache.Release(id) - }, - }, nil + return v.(commonspace.Space), nil } func (s *service) Close(ctx context.Context) (err error) { diff --git a/client/document/service.go b/client/document/service.go index ef7c4c82..514bac94 100644 --- a/client/document/service.go +++ b/client/document/service.go @@ -3,12 +3,14 @@ package document import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + "go.uber.org/zap" ) type Service interface { @@ -27,7 +29,7 @@ var log = logger.NewNamed(CName) type service struct { account account.Service spaceService clientspace.Service - cache cache.TreeCache + cache clientcache.TreeCache } func New() Service { @@ -37,7 +39,7 @@ func New() Service { func (s *service) Init(a *app.App) (err error) { s.account = a.MustComponent(account.CName).(account.Service) s.spaceService = a.MustComponent(clientspace.CName).(clientspace.Service) - s.cache = a.MustComponent(cache.CName).(cache.TreeCache) + s.cache = a.MustComponent(treegetter.CName).(clientcache.TreeCache) return } @@ -46,12 +48,11 @@ func (s *service) Name() (name string) { } func (s *service) CreateDocument(spaceId string) (id string, err error) { - spaceRef, err := s.spaceService.GetSpace(context.Background(), spaceId) + space, err := s.spaceService.GetSpace(context.Background(), spaceId) if err != nil { return } - defer spaceRef.Release() - doc, err := createTextDocument(context.Background(), spaceRef.Object, s.account, s) + doc, err := createTextDocument(context.Background(), space, s.account, s) if err != nil { return } @@ -60,38 +61,40 @@ func (s *service) CreateDocument(spaceId string) (id string, err error) { } func (s *service) GetAllDocumentIds(spaceId string) (ids []string, err error) { - spaceRef, err := s.spaceService.GetSpace(context.Background(), spaceId) + space, err := s.spaceService.GetSpace(context.Background(), spaceId) if err != nil { return } - defer spaceRef.Release() - ids = spaceRef.Object.StoredIds() + ids = space.StoredIds() return } func (s *service) AddText(spaceId, documentId, text string) (err error) { - doc, err := s.cache.GetTree(context.Background(), spaceId, documentId) + doc, err := s.cache.GetDocument(context.Background(), spaceId, documentId) if err != nil { return } - defer doc.Release() - return doc.TreeContainer.(TextDocument).AddText(text) + return doc.AddText(text) } func (s *service) DumpDocumentTree(spaceId, documentId string) (dump string, err error) { - doc, err := s.cache.GetTree(context.Background(), spaceId, documentId) + doc, err := s.cache.GetDocument(context.Background(), spaceId, documentId) if err != nil { return } - defer doc.Release() - return doc.TreeContainer.Tree().DebugDump() + return doc.Tree().DebugDump() } func (s *service) Update(tree tree.ObjectTree) { - + log.With( + zap.Strings("heads", tree.Heads()), + zap.String("tree id", tree.ID())). + Debug("updating tree") } func (s *service) Rebuild(tree tree.ObjectTree) { - //TODO implement me - panic("implement me") + log.With( + zap.Strings("heads", tree.Heads()), + zap.String("tree id", tree.ID())). + Debug("rebuilding tree") } diff --git a/client/document/textdocument.go b/client/document/textdocument.go index 5314a9c1..8f8633f3 100644 --- a/client/document/textdocument.go +++ b/client/document/textdocument.go @@ -4,7 +4,6 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" testchanges "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/testchanges/proto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" @@ -12,7 +11,7 @@ import ( ) type TextDocument interface { - cache.TreeContainer + Tree() tree.ObjectTree AddText(text string) error Text() (string, error) TreeDump() string diff --git a/client/util/releasecontainer.go b/client/util/releasecontainer.go deleted file mode 100644 index ef8bbc1b..00000000 --- a/client/util/releasecontainer.go +++ /dev/null @@ -1,6 +0,0 @@ -package util - -type ReleaseContainer[T any] struct { - Object T - Release func() -} diff --git a/common/commonspace/cache/treecache.go b/common/commonspace/cache/treecache.go deleted file mode 100644 index 64c5cb28..00000000 --- a/common/commonspace/cache/treecache.go +++ /dev/null @@ -1,30 +0,0 @@ -//go:generate mockgen -destination mock_cache/mock_cache.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache TreeCache -package cache - -import ( - "context" - "errors" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" -) - -const CName = "commonspace.cache" - -var ErrSpaceNotFound = errors.New("space not found") - -type TreeContainer interface { - Tree() tree.ObjectTree -} - -type TreeResult struct { - Release func() - TreeContainer TreeContainer -} - -type BuildFunc = func(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree.ObjectTree, error) - -type TreeCache interface { - app.ComponentRunnable - GetTree(ctx context.Context, spaceId, treeId string) (TreeResult, error) -} diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index c452f19c..a6199f04 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -3,10 +3,10 @@ package diffservice import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "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" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" "go.uber.org/zap" @@ -38,7 +38,7 @@ func NewDiffService( syncPeriod int, storage storage.SpaceStorage, confConnector nodeconf.ConfConnector, - cache cache.TreeCache, + cache treegetter.TreeGetter, log *zap.Logger) DiffService { diff := ldiff.New(16, 16) diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index dded0e64..28385791 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -2,10 +2,10 @@ package diffservice import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "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/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpcerr" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" @@ -22,7 +22,7 @@ func newDiffSyncer( spaceId string, diff ldiff.Diff, confConnector nodeconf.ConfConnector, - cache cache.TreeCache, + cache treegetter.TreeGetter, storage storage.SpaceStorage, clientFactory spacesyncproto.ClientFactory, log *zap.Logger) DiffSyncer { @@ -41,7 +41,7 @@ type diffSyncer struct { spaceId string diff ldiff.Diff confConnector nodeconf.ConfConnector - cache cache.TreeCache + cache treegetter.TreeGetter storage storage.SpaceStorage clientFactory spacesyncproto.ClientFactory log *zap.Logger diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index a83999a4..68eadc78 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -4,12 +4,11 @@ import ( "context" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache/mock_cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/remotediff" "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/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" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf/mock_nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" @@ -89,7 +88,7 @@ func TestDiffSyncer_Sync(t *testing.T) { diffMock := mock_ldiff.NewMockDiff(ctrl) connectorMock := mock_nodeconf.NewMockConfConnector(ctrl) - cacheMock := mock_cache.NewMockTreeCache(ctrl) + cacheMock := mock_treegetter.NewMockTreeGetter(ctrl) stMock := mock_storage.NewMockSpaceStorage(ctrl) clientMock := mock_spacesyncproto.NewMockDRPCSpaceClient(ctrl) factory := spacesyncproto.ClientFactoryFunc(func(cc drpc.Conn) spacesyncproto.DRPCSpaceClient { @@ -109,7 +108,7 @@ func TestDiffSyncer_Sync(t *testing.T) { for _, arg := range []string{"new", "changed"} { cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, arg). - Return(cache.TreeResult{}, nil) + Return(nil, nil) } require.NoError(t, diffSyncer.Sync(ctx)) }) diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 8d94a29e..61a44b25 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -4,10 +4,10 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice" "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" config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" @@ -32,7 +32,7 @@ type service struct { config config2.Space configurationService nodeconf.Service storageProvider storage.SpaceStorageProvider - cache cache.TreeCache + cache treegetter.TreeGetter pool pool.Pool } @@ -40,7 +40,7 @@ func (s *service) Init(a *app.App) (err error) { s.config = a.MustComponent(config2.CName).(*config2.Config).Space s.storageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) - s.cache = a.MustComponent(cache.CName).(cache.TreeCache) + s.cache = a.MustComponent(treegetter.CName).(treegetter.TreeGetter) s.pool = a.MustComponent(pool.CName).(pool.Pool) return nil } diff --git a/common/commonspace/space.go b/common/commonspace/space.go index fb815a67..57eedb75 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -2,22 +2,27 @@ package commonspace import ( "context" + "errors" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "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/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" tree2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "sync" + "sync/atomic" + "time" ) +var ErrSpaceClosed = errors.New("space is closed") + type SpaceCreatePayload struct { // SigningKey is the signing key of the owner SigningKey signingkey.PrivKey @@ -64,8 +69,14 @@ type space struct { syncService syncservice.SyncService diffService diffservice.DiffService storage storage.SpaceStorage - cache cache.TreeCache + cache treegetter.TreeGetter aclList list.ACLList + + isClosed atomic.Bool +} + +func (s *space) LastUsage() time.Time { + return s.syncService.LastUsage() } func (s *space) Id() string { @@ -99,15 +110,27 @@ func (s *space) StoredIds() []string { return s.diffService.AllIds() } -func (s *space) DeriveTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree2.ObjectTree, error) { +func (s *space) DeriveTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tr tree2.ObjectTree, err error) { + if s.isClosed.Load() { + err = ErrSpaceClosed + return + } return synctree.DeriveSyncTree(ctx, payload, s.syncService.SyncClient(), listener, s.aclList, s.storage.CreateTreeStorage) } -func (s *space) CreateTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree2.ObjectTree, error) { +func (s *space) CreateTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tr tree2.ObjectTree, err error) { + if s.isClosed.Load() { + err = ErrSpaceClosed + return + } return synctree.CreateSyncTree(ctx, payload, s.syncService.SyncClient(), listener, s.aclList, s.storage.CreateTreeStorage) } func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t tree2.ObjectTree, err error) { + if s.isClosed.Load() { + err = ErrSpaceClosed + return + } getTreeRemote := func() (*spacesyncproto.ObjectSyncMessage, error) { // TODO: add empty context handling (when this is not happening due to head update) peerId, err := syncservice.GetPeerIdFromStreamContext(ctx) @@ -155,6 +178,9 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene } func (s *space) Close() error { + defer func() { + s.isClosed.Store(true) + }() s.diffService.Close() s.syncService.Close() return s.storage.Close() diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index cf9d4e93..1764e6e3 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -408,11 +408,11 @@ func (m *ObjectSyncMessage) GetTrackingId() string { // ObjectSyncContentValue provides different types for object sync type ObjectSyncContentValue struct { // Types that are valid to be assigned to Value: - // *ObjectSyncContentValueValueOfHeadUpdate - // *ObjectSyncContentValueValueOfFullSyncRequest - // *ObjectSyncContentValueValueOfFullSyncResponse - // *ObjectSyncContentValueValueOfErrorResponse - Value IsObjectSyncContentValueValue `protobuf_oneof:"value"` + // *ObjectSyncContentValue_HeadUpdate + // *ObjectSyncContentValue_FullSyncRequest + // *ObjectSyncContentValue_FullSyncResponse + // *ObjectSyncContentValue_ErrorResponse + Value isObjectSyncContentValue_Value `protobuf_oneof:"value"` } func (m *ObjectSyncContentValue) Reset() { *m = ObjectSyncContentValue{} } @@ -448,31 +448,31 @@ func (m *ObjectSyncContentValue) XXX_DiscardUnknown() { var xxx_messageInfo_ObjectSyncContentValue proto.InternalMessageInfo -type IsObjectSyncContentValueValue interface { - IsObjectSyncContentValueValue() +type isObjectSyncContentValue_Value interface { + isObjectSyncContentValue_Value() MarshalTo([]byte) (int, error) Size() int } -type ObjectSyncContentValueValueOfHeadUpdate struct { +type ObjectSyncContentValue_HeadUpdate struct { HeadUpdate *ObjectHeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` } -type ObjectSyncContentValueValueOfFullSyncRequest struct { +type ObjectSyncContentValue_FullSyncRequest struct { FullSyncRequest *ObjectFullSyncRequest `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` } -type ObjectSyncContentValueValueOfFullSyncResponse struct { +type ObjectSyncContentValue_FullSyncResponse struct { FullSyncResponse *ObjectFullSyncResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` } -type ObjectSyncContentValueValueOfErrorResponse struct { +type ObjectSyncContentValue_ErrorResponse struct { ErrorResponse *ObjectErrorResponse `protobuf:"bytes,4,opt,name=errorResponse,proto3,oneof" json:"errorResponse,omitempty"` } -func (*ObjectSyncContentValueValueOfHeadUpdate) IsObjectSyncContentValueValue() {} -func (*ObjectSyncContentValueValueOfFullSyncRequest) IsObjectSyncContentValueValue() {} -func (*ObjectSyncContentValueValueOfFullSyncResponse) IsObjectSyncContentValueValue() {} -func (*ObjectSyncContentValueValueOfErrorResponse) IsObjectSyncContentValueValue() {} +func (*ObjectSyncContentValue_HeadUpdate) isObjectSyncContentValue_Value() {} +func (*ObjectSyncContentValue_FullSyncRequest) isObjectSyncContentValue_Value() {} +func (*ObjectSyncContentValue_FullSyncResponse) isObjectSyncContentValue_Value() {} +func (*ObjectSyncContentValue_ErrorResponse) isObjectSyncContentValue_Value() {} -func (m *ObjectSyncContentValue) GetValue() IsObjectSyncContentValueValue { +func (m *ObjectSyncContentValue) GetValue() isObjectSyncContentValue_Value { if m != nil { return m.Value } @@ -480,28 +480,28 @@ func (m *ObjectSyncContentValue) GetValue() IsObjectSyncContentValueValue { } func (m *ObjectSyncContentValue) GetHeadUpdate() *ObjectHeadUpdate { - if x, ok := m.GetValue().(*ObjectSyncContentValueValueOfHeadUpdate); ok { + if x, ok := m.GetValue().(*ObjectSyncContentValue_HeadUpdate); ok { return x.HeadUpdate } return nil } func (m *ObjectSyncContentValue) GetFullSyncRequest() *ObjectFullSyncRequest { - if x, ok := m.GetValue().(*ObjectSyncContentValueValueOfFullSyncRequest); ok { + if x, ok := m.GetValue().(*ObjectSyncContentValue_FullSyncRequest); ok { return x.FullSyncRequest } return nil } func (m *ObjectSyncContentValue) GetFullSyncResponse() *ObjectFullSyncResponse { - if x, ok := m.GetValue().(*ObjectSyncContentValueValueOfFullSyncResponse); ok { + if x, ok := m.GetValue().(*ObjectSyncContentValue_FullSyncResponse); ok { return x.FullSyncResponse } return nil } func (m *ObjectSyncContentValue) GetErrorResponse() *ObjectErrorResponse { - if x, ok := m.GetValue().(*ObjectSyncContentValueValueOfErrorResponse); ok { + if x, ok := m.GetValue().(*ObjectSyncContentValue_ErrorResponse); ok { return x.ErrorResponse } return nil @@ -510,10 +510,10 @@ func (m *ObjectSyncContentValue) GetErrorResponse() *ObjectErrorResponse { // XXX_OneofWrappers is for the internal use of the proto package. func (*ObjectSyncContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*ObjectSyncContentValueValueOfHeadUpdate)(nil), - (*ObjectSyncContentValueValueOfFullSyncRequest)(nil), - (*ObjectSyncContentValueValueOfFullSyncResponse)(nil), - (*ObjectSyncContentValueValueOfErrorResponse)(nil), + (*ObjectSyncContentValue_HeadUpdate)(nil), + (*ObjectSyncContentValue_FullSyncRequest)(nil), + (*ObjectSyncContentValue_FullSyncResponse)(nil), + (*ObjectSyncContentValue_ErrorResponse)(nil), } } @@ -1410,12 +1410,12 @@ func (m *ObjectSyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *ObjectSyncContentValueValueOfHeadUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValue_HeadUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ObjectSyncContentValueValueOfHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValue_HeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.HeadUpdate != nil { { @@ -1431,12 +1431,12 @@ func (m *ObjectSyncContentValueValueOfHeadUpdate) MarshalToSizedBuffer(dAtA []by } return len(dAtA) - i, nil } -func (m *ObjectSyncContentValueValueOfFullSyncRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValue_FullSyncRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ObjectSyncContentValueValueOfFullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValue_FullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.FullSyncRequest != nil { { @@ -1452,12 +1452,12 @@ func (m *ObjectSyncContentValueValueOfFullSyncRequest) MarshalToSizedBuffer(dAtA } return len(dAtA) - i, nil } -func (m *ObjectSyncContentValueValueOfFullSyncResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValue_FullSyncResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ObjectSyncContentValueValueOfFullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValue_FullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.FullSyncResponse != nil { { @@ -1473,12 +1473,12 @@ func (m *ObjectSyncContentValueValueOfFullSyncResponse) MarshalToSizedBuffer(dAt } return len(dAtA) - i, nil } -func (m *ObjectSyncContentValueValueOfErrorResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValue_ErrorResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ObjectSyncContentValueValueOfErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ObjectSyncContentValue_ErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.ErrorResponse != nil { { @@ -2030,7 +2030,7 @@ func (m *ObjectSyncContentValue) Size() (n int) { return n } -func (m *ObjectSyncContentValueValueOfHeadUpdate) Size() (n int) { +func (m *ObjectSyncContentValue_HeadUpdate) Size() (n int) { if m == nil { return 0 } @@ -2042,7 +2042,7 @@ func (m *ObjectSyncContentValueValueOfHeadUpdate) Size() (n int) { } return n } -func (m *ObjectSyncContentValueValueOfFullSyncRequest) Size() (n int) { +func (m *ObjectSyncContentValue_FullSyncRequest) Size() (n int) { if m == nil { return 0 } @@ -2054,7 +2054,7 @@ func (m *ObjectSyncContentValueValueOfFullSyncRequest) Size() (n int) { } return n } -func (m *ObjectSyncContentValueValueOfFullSyncResponse) Size() (n int) { +func (m *ObjectSyncContentValue_FullSyncResponse) Size() (n int) { if m == nil { return 0 } @@ -2066,7 +2066,7 @@ func (m *ObjectSyncContentValueValueOfFullSyncResponse) Size() (n int) { } return n } -func (m *ObjectSyncContentValueValueOfErrorResponse) Size() (n int) { +func (m *ObjectSyncContentValue_ErrorResponse) Size() (n int) { if m == nil { return 0 } @@ -3103,7 +3103,7 @@ func (m *ObjectSyncContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ObjectSyncContentValueValueOfHeadUpdate{v} + m.Value = &ObjectSyncContentValue_HeadUpdate{v} iNdEx = postIndex case 2: if wireType != 2 { @@ -3138,7 +3138,7 @@ func (m *ObjectSyncContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ObjectSyncContentValueValueOfFullSyncRequest{v} + m.Value = &ObjectSyncContentValue_FullSyncRequest{v} iNdEx = postIndex case 3: if wireType != 2 { @@ -3173,7 +3173,7 @@ func (m *ObjectSyncContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ObjectSyncContentValueValueOfFullSyncResponse{v} + m.Value = &ObjectSyncContentValue_FullSyncResponse{v} iNdEx = postIndex case 4: if wireType != 2 { @@ -3208,7 +3208,7 @@ func (m *ObjectSyncContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ObjectSyncContentValueValueOfErrorResponse{v} + m.Value = &ObjectSyncContentValue_ErrorResponse{v} iNdEx = postIndex default: iNdEx = preIndex diff --git a/common/commonspace/storage/mock_storage/mock_storage.go b/common/commonspace/storage/mock_storage/mock_storage.go index d18cd24d..422af081 100644 --- a/common/commonspace/storage/mock_storage/mock_storage.go +++ b/common/commonspace/storage/mock_storage/mock_storage.go @@ -5,12 +5,12 @@ package mock_storage import ( - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" reflect "reflect" app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + storage0 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" gomock "github.com/golang/mock/gomock" ) @@ -119,10 +119,10 @@ func (m *MockSpaceStorage) EXPECT() *MockSpaceStorageMockRecorder { } // ACLStorage mocks base method. -func (m *MockSpaceStorage) ACLStorage() (storage2.ListStorage, error) { +func (m *MockSpaceStorage) ACLStorage() (storage0.ListStorage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ACLStorage") - ret0, _ := ret[0].(storage2.ListStorage) + ret0, _ := ret[0].(storage0.ListStorage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -148,10 +148,10 @@ func (mr *MockSpaceStorageMockRecorder) Close() *gomock.Call { } // CreateTreeStorage mocks base method. -func (m *MockSpaceStorage) CreateTreeStorage(arg0 storage2.TreeStorageCreatePayload) (storage2.TreeStorage, error) { +func (m *MockSpaceStorage) CreateTreeStorage(arg0 storage0.TreeStorageCreatePayload) (storage0.TreeStorage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateTreeStorage", arg0) - ret0, _ := ret[0].(storage2.TreeStorage) + ret0, _ := ret[0].(storage0.TreeStorage) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -208,10 +208,10 @@ func (mr *MockSpaceStorageMockRecorder) StoredIds() *gomock.Call { } // TreeStorage mocks base method. -func (m *MockSpaceStorage) TreeStorage(arg0 string) (storage2.TreeStorage, error) { +func (m *MockSpaceStorage) TreeStorage(arg0 string) (storage0.TreeStorage, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "TreeStorage", arg0) - ret0, _ := ret[0].(storage2.TreeStorage) + ret0, _ := ret[0].(storage0.TreeStorage) ret1, _ := ret[1].(error) return ret0, ret1 } diff --git a/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go b/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go index 064ebf50..de665c88 100644 --- a/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go +++ b/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go @@ -5,11 +5,12 @@ package mock_syncservice import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" reflect "reflect" + time "time" spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" gomock "github.com/golang/mock/gomock" ) @@ -176,6 +177,20 @@ func (mr *MockSyncClientMockRecorder) HasActiveStream(arg0 interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasActiveStream", reflect.TypeOf((*MockSyncClient)(nil).HasActiveStream), arg0) } +// LastUsage mocks base method. +func (m *MockSyncClient) LastUsage() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LastUsage") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// LastUsage indicates an expected call of LastUsage. +func (mr *MockSyncClientMockRecorder) LastUsage() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LastUsage", reflect.TypeOf((*MockSyncClient)(nil).LastUsage)) +} + // SendAsync mocks base method. func (m *MockSyncClient) SendAsync(arg0 []string, arg1 *spacesyncproto.ObjectSyncMessage) error { m.ctrl.T.Helper() diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index bf457374..7247f73d 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -5,10 +5,12 @@ import ( "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "github.com/libp2p/go-libp2p-core/sec" "storj.io/drpc/drpcctx" "sync" "sync/atomic" + "time" ) var ErrEmptyPeer = errors.New("don't have such a peer") @@ -19,6 +21,7 @@ const maxSimultaneousOperationsPerStream = 10 // StreamPool can be made generic to work with different streams type StreamPool interface { Sender + ocache.ObjectLastUsage AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) HasActiveStream(peerId string) bool @@ -44,7 +47,8 @@ type streamPool struct { wg *sync.WaitGroup waiters map[string]responseWaiter waitersMx sync.Mutex - counter uint64 + counter atomic.Uint64 + lastUsage atomic.Int64 } func newStreamPool(messageHandler MessageHandler) StreamPool { @@ -55,6 +59,10 @@ func newStreamPool(messageHandler MessageHandler) StreamPool { } } +func (s *streamPool) LastUsage() time.Time { + return time.Unix(s.lastUsage.Load(), 0) +} + func (s *streamPool) HasActiveStream(peerId string) (res bool) { s.Lock() defer s.Unlock() @@ -65,7 +73,7 @@ func (s *streamPool) HasActiveStream(peerId string) (res bool) { func (s *streamPool) SendSync( peerId string, msg *spacesyncproto.ObjectSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error) { - newCounter := atomic.AddUint64(&s.counter, 1) + newCounter := s.counter.Add(1) msg.TrackingId = genStreamPoolKey(peerId, msg.TreeId, newCounter) s.waitersMx.Lock() @@ -85,6 +93,7 @@ func (s *streamPool) SendSync( } func (s *streamPool) SendAsync(peers []string, message *spacesyncproto.ObjectSyncMessage) (err error) { + s.lastUsage.Store(time.Now().Unix()) getStreams := func() (streams []spacesyncproto.SpaceStream) { for _, pId := range peers { stream, err := s.getOrDeleteStream(pId) @@ -101,9 +110,10 @@ func (s *streamPool) SendAsync(peers []string, message *spacesyncproto.ObjectSyn s.Unlock() for _, s := range streams { - if len(peers) == 1 { - err = s.Send(message) - } + err = s.Send(message) + } + if len(peers) != 1 { + err = nil } return err } @@ -191,6 +201,7 @@ func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStre } process := func(msg *spacesyncproto.ObjectSyncMessage) { + s.lastUsage.Store(time.Now().Unix()) if msg.TrackingId == "" { s.messageHandler(stream.Context(), peerId, msg) return @@ -213,6 +224,7 @@ func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStre Loop: for { msg, err := stream.Recv() + s.lastUsage.Store(time.Now().Unix()) if err != nil { break } diff --git a/common/commonspace/syncservice/syncclient.go b/common/commonspace/syncservice/syncclient.go index 12c25164..cd018453 100644 --- a/common/commonspace/syncservice/syncclient.go +++ b/common/commonspace/syncservice/syncclient.go @@ -3,11 +3,14 @@ package syncservice import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" + "time" ) type SyncClient interface { StreamPool RequestFactory + ocache.ObjectLastUsage BroadcastAsyncOrSendResponsible(message *spacesyncproto.ObjectSyncMessage) (err error) } @@ -29,6 +32,10 @@ func newSyncClient(spaceId string, pool StreamPool, notifiable HeadNotifiable, f } } +func (s *syncClient) LastUsage() time.Time { + return s.StreamPool.LastUsage() +} + func (s *syncClient) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) { s.notifyIfNeeded(message) return s.BroadcastAsync(message) diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index 6ac153b1..deb0788a 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -2,15 +2,15 @@ package syncservice import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice" ) type syncHandler struct { spaceId string - treeCache cache.TreeCache + treeCache treegetter.TreeGetter syncClient SyncClient } @@ -18,7 +18,7 @@ type SyncHandler interface { HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) } -func newSyncHandler(spaceId string, treeCache cache.TreeCache, syncClient SyncClient) *syncHandler { +func newSyncHandler(spaceId string, treeCache treegetter.TreeGetter, syncClient SyncClient) *syncHandler { return &syncHandler{ spaceId: spaceId, treeCache: treeCache, @@ -49,15 +49,13 @@ func (s *syncHandler) handleHeadUpdate( fullRequest *spacesyncproto.ObjectSyncMessage isEmptyUpdate = len(update.Changes) == 0 ) - res, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) + objTree, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) if err != nil { return } err = func() error { - objTree := res.TreeContainer.Tree() objTree.Lock() - defer res.Release() defer objTree.Unlock() // isEmptyUpdate is sent when the tree is brought up from cache @@ -108,15 +106,13 @@ func (s *syncHandler) handleFullSyncRequest( } }() - res, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) + objTree, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) if err != nil { return } err = func() error { - objTree := res.TreeContainer.Tree() objTree.Lock() - defer res.Release() defer objTree.Unlock() if header == nil { @@ -145,15 +141,13 @@ func (s *syncHandler) handleFullSyncResponse( senderId string, response *spacesyncproto.ObjectFullSyncResponse, msg *spacesyncproto.ObjectSyncMessage) (err error) { - res, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) + objTree, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) if err != nil { return } err = func() error { - objTree := res.TreeContainer.Tree() objTree.Lock() - defer res.Release() defer objTree.Unlock() if s.alreadyHasHeads(objTree, response.Heads) { diff --git a/common/commonspace/syncservice/synchandler_test.go b/common/commonspace/syncservice/synchandler_test.go index a3d7a0dc..a0f2fdd9 100644 --- a/common/commonspace/syncservice/synchandler_test.go +++ b/common/commonspace/syncservice/synchandler_test.go @@ -3,10 +3,9 @@ package syncservice import ( "context" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache/mock_cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/mock_syncservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter/mock_treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree/mock_objecttree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" @@ -49,7 +48,7 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { ctx := context.Background() spaceId := "spaceId" - cacheMock := mock_cache.NewMockTreeCache(ctrl) + cacheMock := mock_treegetter.NewMockTreeGetter(ctrl) syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) @@ -66,10 +65,7 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{ - Release: func() {}, - TreeContainer: treeContainer{objectTreeMock}, - }, nil) + Return(objectTreeMock, nil) objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) @@ -103,10 +99,7 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{ - Release: func() {}, - TreeContainer: treeContainer{objectTreeMock}, - }, nil) + Return(objectTreeMock, nil) objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) @@ -143,10 +136,7 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{ - Release: func() {}, - TreeContainer: treeContainer{objectTreeMock}, - }, nil) + Return(objectTreeMock, nil) objectTreeMock.EXPECT(). Heads(). Return([]string{"h1"}) @@ -168,10 +158,7 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{ - Release: func() {}, - TreeContainer: treeContainer{objectTreeMock}, - }, nil) + Return(objectTreeMock, nil) objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) @@ -196,10 +183,7 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{ - Release: func() {}, - TreeContainer: treeContainer{objectTreeMock}, - }, nil) + Return(objectTreeMock, nil) objectTreeMock.EXPECT(). Heads(). @@ -216,7 +200,7 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) { ctx := context.Background() spaceId := "spaceId" - cacheMock := mock_cache.NewMockTreeCache(ctrl) + cacheMock := mock_treegetter.NewMockTreeGetter(ctrl) syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) @@ -234,10 +218,7 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) { cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{ - Release: func() {}, - TreeContainer: treeContainer{objectTreeMock}, - }, nil) + Return(objectTreeMock, nil) objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) @@ -269,10 +250,7 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) { cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{ - Release: func() {}, - TreeContainer: treeContainer{objectTreeMock}, - }, nil) + Return(objectTreeMock, nil) objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) @@ -297,10 +275,7 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) { cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{ - Release: func() {}, - TreeContainer: treeContainer{objectTreeMock}, - }, nil) + Return(objectTreeMock, nil) syncClientMock.EXPECT(). CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"}), gomock.Eq("")). Return(fullRequest, nil) @@ -321,7 +296,7 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) { cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{}, fmt.Errorf("some")) + Return(nil, fmt.Errorf("some")) syncClientMock.EXPECT(). SendAsync(gomock.Eq([]string{senderId}), gomock.Any()) @@ -336,7 +311,7 @@ func TestSyncHandler_HandleFullSyncResponse(t *testing.T) { ctx := context.Background() spaceId := "spaceId" - cacheMock := mock_cache.NewMockTreeCache(ctrl) + cacheMock := mock_treegetter.NewMockTreeGetter(ctrl) syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) @@ -353,10 +328,7 @@ func TestSyncHandler_HandleFullSyncResponse(t *testing.T) { cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{ - Release: func() {}, - TreeContainer: treeContainer{objectTreeMock}, - }, nil) + Return(objectTreeMock, nil) objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) @@ -383,10 +355,7 @@ func TestSyncHandler_HandleFullSyncResponse(t *testing.T) { cacheMock.EXPECT(). GetTree(gomock.Any(), spaceId, treeId). - Return(cache.TreeResult{ - Release: func() {}, - TreeContainer: treeContainer{objectTreeMock}, - }, nil) + Return(objectTreeMock, nil) objectTreeMock.EXPECT(). Heads(). Return([]string{"h1"}) diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index daa065b0..5142a8cc 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -4,16 +4,18 @@ package syncservice import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "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" "time" ) var log = logger.NewNamed("syncservice").Sugar() type SyncService interface { + ocache.ObjectLastUsage SyncClient() SyncClient Init() @@ -41,7 +43,7 @@ type syncService struct { func NewSyncService( spaceId string, headNotifiable HeadNotifiable, - cache cache.TreeCache, + cache treegetter.TreeGetter, configuration nodeconf.Configuration, confConnector nodeconf.ConfConnector) SyncService { var syncHandler SyncHandler @@ -58,6 +60,10 @@ func NewSyncService( confConnector) } +func (s *syncService) LastUsage() time.Time { + return s.syncClient.LastUsage() +} + func newSyncService( spaceId string, syncClient SyncClient, diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 2623ea89..41f7c16a 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -2,6 +2,7 @@ package synctree import ( "context" + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" @@ -10,11 +11,14 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" ) +var ErrSyncTreeClosed = errors.New("sync tree is closed") + // SyncTree sends head updates to sync service and also sends new changes to update listener type SyncTree struct { tree2.ObjectTree syncClient syncservice.SyncClient listener updatelistener.UpdateListener + isClosed bool } var createDerivedObjectTree = tree2.CreateDerivedObjectTree @@ -97,6 +101,10 @@ func buildSyncTree( } func (s *SyncTree) AddContent(ctx context.Context, content tree2.SignableChangeContent) (res tree2.AddResult, err error) { + if s.isClosed { + err = ErrSyncTreeClosed + return + } res, err = s.ObjectTree.AddContent(ctx, content) if err != nil { return @@ -107,6 +115,10 @@ func (s *SyncTree) AddContent(ctx context.Context, content tree2.SignableChangeC } func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeproto.RawTreeChangeWithId) (res tree2.AddResult, err error) { + if s.isClosed { + err = ErrSyncTreeClosed + return + } res, err = s.ObjectTree.AddRawChanges(ctx, changes...) if err != nil { return @@ -125,6 +137,17 @@ func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeprot return } +func (s *SyncTree) Close() (err error) { + s.Lock() + defer s.Unlock() + if s.isClosed { + err = ErrSyncTreeClosed + return + } + s.isClosed = true + return +} + func (s *SyncTree) Tree() tree2.ObjectTree { return s } diff --git a/common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go b/common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go index d9c8c9b9..c72db6e3 100644 --- a/common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go +++ b/common/commonspace/synctree/updatelistener/mock_updatelistener/mock_updatelistener.go @@ -5,9 +5,9 @@ package mock_updatelistener import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" reflect "reflect" + tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" gomock "github.com/golang/mock/gomock" ) diff --git a/common/commonspace/cache/mock_cache/mock_cache.go b/common/commonspace/treegetter/mock_treegetter/mock_treegetter.go similarity index 50% rename from common/commonspace/cache/mock_cache/mock_cache.go rename to common/commonspace/treegetter/mock_treegetter/mock_treegetter.go index fa2ed66c..a07949bc 100644 --- a/common/commonspace/cache/mock_cache/mock_cache.go +++ b/common/commonspace/treegetter/mock_treegetter/mock_treegetter.go @@ -1,43 +1,43 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache (interfaces: TreeCache) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter (interfaces: TreeGetter) -// Package mock_cache is a generated GoMock package. -package mock_cache +// Package mock_treegetter is a generated GoMock package. +package mock_treegetter import ( context "context" reflect "reflect" app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" - cache "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" gomock "github.com/golang/mock/gomock" ) -// MockTreeCache is a mock of TreeCache interface. -type MockTreeCache struct { +// MockTreeGetter is a mock of TreeGetter interface. +type MockTreeGetter struct { ctrl *gomock.Controller - recorder *MockTreeCacheMockRecorder + recorder *MockTreeGetterMockRecorder } -// MockTreeCacheMockRecorder is the mock recorder for MockTreeCache. -type MockTreeCacheMockRecorder struct { - mock *MockTreeCache +// MockTreeGetterMockRecorder is the mock recorder for MockTreeGetter. +type MockTreeGetterMockRecorder struct { + mock *MockTreeGetter } -// NewMockTreeCache creates a new mock instance. -func NewMockTreeCache(ctrl *gomock.Controller) *MockTreeCache { - mock := &MockTreeCache{ctrl: ctrl} - mock.recorder = &MockTreeCacheMockRecorder{mock} +// NewMockTreeGetter creates a new mock instance. +func NewMockTreeGetter(ctrl *gomock.Controller) *MockTreeGetter { + mock := &MockTreeGetter{ctrl: ctrl} + mock.recorder = &MockTreeGetterMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockTreeCache) EXPECT() *MockTreeCacheMockRecorder { +func (m *MockTreeGetter) EXPECT() *MockTreeGetterMockRecorder { return m.recorder } // Close mocks base method. -func (m *MockTreeCache) Close(arg0 context.Context) error { +func (m *MockTreeGetter) Close(arg0 context.Context) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Close", arg0) ret0, _ := ret[0].(error) @@ -45,28 +45,28 @@ func (m *MockTreeCache) Close(arg0 context.Context) error { } // Close indicates an expected call of Close. -func (mr *MockTreeCacheMockRecorder) Close(arg0 interface{}) *gomock.Call { +func (mr *MockTreeGetterMockRecorder) Close(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockTreeCache)(nil).Close), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockTreeGetter)(nil).Close), arg0) } // GetTree mocks base method. -func (m *MockTreeCache) GetTree(arg0 context.Context, arg1, arg2 string) (cache.TreeResult, error) { +func (m *MockTreeGetter) GetTree(arg0 context.Context, arg1, arg2 string) (tree.ObjectTree, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetTree", arg0, arg1, arg2) - ret0, _ := ret[0].(cache.TreeResult) + ret0, _ := ret[0].(tree.ObjectTree) ret1, _ := ret[1].(error) return ret0, ret1 } // GetTree indicates an expected call of GetTree. -func (mr *MockTreeCacheMockRecorder) GetTree(arg0, arg1, arg2 interface{}) *gomock.Call { +func (mr *MockTreeGetterMockRecorder) GetTree(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTree", reflect.TypeOf((*MockTreeCache)(nil).GetTree), arg0, arg1, arg2) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTree", reflect.TypeOf((*MockTreeGetter)(nil).GetTree), arg0, arg1, arg2) } // Init mocks base method. -func (m *MockTreeCache) Init(arg0 *app.App) error { +func (m *MockTreeGetter) Init(arg0 *app.App) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Init", arg0) ret0, _ := ret[0].(error) @@ -74,13 +74,13 @@ func (m *MockTreeCache) Init(arg0 *app.App) error { } // Init indicates an expected call of Init. -func (mr *MockTreeCacheMockRecorder) Init(arg0 interface{}) *gomock.Call { +func (mr *MockTreeGetterMockRecorder) Init(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockTreeCache)(nil).Init), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockTreeGetter)(nil).Init), arg0) } // Name mocks base method. -func (m *MockTreeCache) Name() string { +func (m *MockTreeGetter) Name() string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Name") ret0, _ := ret[0].(string) @@ -88,13 +88,13 @@ func (m *MockTreeCache) Name() string { } // Name indicates an expected call of Name. -func (mr *MockTreeCacheMockRecorder) Name() *gomock.Call { +func (mr *MockTreeGetterMockRecorder) Name() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockTreeCache)(nil).Name)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockTreeGetter)(nil).Name)) } // Run mocks base method. -func (m *MockTreeCache) Run(arg0 context.Context) error { +func (m *MockTreeGetter) Run(arg0 context.Context) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Run", arg0) ret0, _ := ret[0].(error) @@ -102,7 +102,7 @@ func (m *MockTreeCache) Run(arg0 context.Context) error { } // Run indicates an expected call of Run. -func (mr *MockTreeCacheMockRecorder) Run(arg0 interface{}) *gomock.Call { +func (mr *MockTreeGetterMockRecorder) Run(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockTreeCache)(nil).Run), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockTreeGetter)(nil).Run), arg0) } diff --git a/common/commonspace/treegetter/treecache.go b/common/commonspace/treegetter/treecache.go new file mode 100644 index 00000000..9047e273 --- /dev/null +++ b/common/commonspace/treegetter/treecache.go @@ -0,0 +1,18 @@ +//go:generate mockgen -destination mock_treegetter/mock_treegetter.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter TreeGetter +package treegetter + +import ( + "context" + "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" +) + +const CName = "commonspace.treeGetter" + +var ErrSpaceNotFound = errors.New("space not found") + +type TreeGetter interface { + app.ComponentRunnable + GetTree(ctx context.Context, spaceId, treeId string) (tree.ObjectTree, error) +} diff --git a/common/net/pool/pool.go b/common/net/pool/pool.go index c0cd6305..819fee23 100644 --- a/common/net/pool/pool.go +++ b/common/net/pool/pool.go @@ -54,7 +54,6 @@ func (p *pool) Init(a *app.App) (err error) { ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), ocache.WithTTL(time.Minute*5), - ocache.WithRefCounter(false), ) return nil } diff --git a/common/pkg/acl/aclrecordproto/aclrecord.pb.go b/common/pkg/acl/aclrecordproto/aclrecord.pb.go index 00b89319..e11f5209 100644 --- a/common/pkg/acl/aclrecordproto/aclrecord.pb.go +++ b/common/pkg/acl/aclrecordproto/aclrecord.pb.go @@ -324,12 +324,13 @@ func (m *ACLRoot) GetTimestamp() int64 { type ACLContentValue struct { // Types that are valid to be assigned to Value: - // *ACLContentValueValueOfUserAdd - // *ACLContentValueValueOfUserRemove - // *ACLContentValueValueOfUserPermissionChange - // *ACLContentValueValueOfUserInvite - // *ACLContentValueValueOfUserJoin - Value IsACLContentValueValue `protobuf_oneof:"value"` + // + // *ACLContentValue_UserAdd + // *ACLContentValue_UserRemove + // *ACLContentValue_UserPermissionChange + // *ACLContentValue_UserInvite + // *ACLContentValue_UserJoin + Value isACLContentValue_Value `protobuf_oneof:"value"` } func (m *ACLContentValue) Reset() { *m = ACLContentValue{} } @@ -365,35 +366,35 @@ func (m *ACLContentValue) XXX_DiscardUnknown() { var xxx_messageInfo_ACLContentValue proto.InternalMessageInfo -type IsACLContentValueValue interface { - IsACLContentValueValue() +type isACLContentValue_Value interface { + isACLContentValue_Value() MarshalTo([]byte) (int, error) Size() int } -type ACLContentValueValueOfUserAdd struct { +type ACLContentValue_UserAdd struct { UserAdd *ACLUserAdd `protobuf:"bytes,1,opt,name=userAdd,proto3,oneof" json:"userAdd,omitempty"` } -type ACLContentValueValueOfUserRemove struct { +type ACLContentValue_UserRemove struct { UserRemove *ACLUserRemove `protobuf:"bytes,2,opt,name=userRemove,proto3,oneof" json:"userRemove,omitempty"` } -type ACLContentValueValueOfUserPermissionChange struct { +type ACLContentValue_UserPermissionChange struct { UserPermissionChange *ACLUserPermissionChange `protobuf:"bytes,3,opt,name=userPermissionChange,proto3,oneof" json:"userPermissionChange,omitempty"` } -type ACLContentValueValueOfUserInvite struct { +type ACLContentValue_UserInvite struct { UserInvite *ACLUserInvite `protobuf:"bytes,4,opt,name=userInvite,proto3,oneof" json:"userInvite,omitempty"` } -type ACLContentValueValueOfUserJoin struct { +type ACLContentValue_UserJoin struct { UserJoin *ACLUserJoin `protobuf:"bytes,5,opt,name=userJoin,proto3,oneof" json:"userJoin,omitempty"` } -func (*ACLContentValueValueOfUserAdd) IsACLContentValueValue() {} -func (*ACLContentValueValueOfUserRemove) IsACLContentValueValue() {} -func (*ACLContentValueValueOfUserPermissionChange) IsACLContentValueValue() {} -func (*ACLContentValueValueOfUserInvite) IsACLContentValueValue() {} -func (*ACLContentValueValueOfUserJoin) IsACLContentValueValue() {} +func (*ACLContentValue_UserAdd) isACLContentValue_Value() {} +func (*ACLContentValue_UserRemove) isACLContentValue_Value() {} +func (*ACLContentValue_UserPermissionChange) isACLContentValue_Value() {} +func (*ACLContentValue_UserInvite) isACLContentValue_Value() {} +func (*ACLContentValue_UserJoin) isACLContentValue_Value() {} -func (m *ACLContentValue) GetValue() IsACLContentValueValue { +func (m *ACLContentValue) GetValue() isACLContentValue_Value { if m != nil { return m.Value } @@ -401,35 +402,35 @@ func (m *ACLContentValue) GetValue() IsACLContentValueValue { } func (m *ACLContentValue) GetUserAdd() *ACLUserAdd { - if x, ok := m.GetValue().(*ACLContentValueValueOfUserAdd); ok { + if x, ok := m.GetValue().(*ACLContentValue_UserAdd); ok { return x.UserAdd } return nil } func (m *ACLContentValue) GetUserRemove() *ACLUserRemove { - if x, ok := m.GetValue().(*ACLContentValueValueOfUserRemove); ok { + if x, ok := m.GetValue().(*ACLContentValue_UserRemove); ok { return x.UserRemove } return nil } func (m *ACLContentValue) GetUserPermissionChange() *ACLUserPermissionChange { - if x, ok := m.GetValue().(*ACLContentValueValueOfUserPermissionChange); ok { + if x, ok := m.GetValue().(*ACLContentValue_UserPermissionChange); ok { return x.UserPermissionChange } return nil } func (m *ACLContentValue) GetUserInvite() *ACLUserInvite { - if x, ok := m.GetValue().(*ACLContentValueValueOfUserInvite); ok { + if x, ok := m.GetValue().(*ACLContentValue_UserInvite); ok { return x.UserInvite } return nil } func (m *ACLContentValue) GetUserJoin() *ACLUserJoin { - if x, ok := m.GetValue().(*ACLContentValueValueOfUserJoin); ok { + if x, ok := m.GetValue().(*ACLContentValue_UserJoin); ok { return x.UserJoin } return nil @@ -438,11 +439,11 @@ func (m *ACLContentValue) GetUserJoin() *ACLUserJoin { // XXX_OneofWrappers is for the internal use of the proto package. func (*ACLContentValue) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*ACLContentValueValueOfUserAdd)(nil), - (*ACLContentValueValueOfUserRemove)(nil), - (*ACLContentValueValueOfUserPermissionChange)(nil), - (*ACLContentValueValueOfUserInvite)(nil), - (*ACLContentValueValueOfUserJoin)(nil), + (*ACLContentValue_UserAdd)(nil), + (*ACLContentValue_UserRemove)(nil), + (*ACLContentValue_UserPermissionChange)(nil), + (*ACLContentValue_UserInvite)(nil), + (*ACLContentValue_UserJoin)(nil), } } @@ -1303,12 +1304,12 @@ func (m *ACLContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ACLContentValueValueOfUserAdd) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserAdd) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLContentValueValueOfUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserAdd) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserAdd != nil { { @@ -1324,12 +1325,12 @@ func (m *ACLContentValueValueOfUserAdd) MarshalToSizedBuffer(dAtA []byte) (int, } return len(dAtA) - i, nil } -func (m *ACLContentValueValueOfUserRemove) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserRemove) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLContentValueValueOfUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserRemove != nil { { @@ -1345,12 +1346,12 @@ func (m *ACLContentValueValueOfUserRemove) MarshalToSizedBuffer(dAtA []byte) (in } return len(dAtA) - i, nil } -func (m *ACLContentValueValueOfUserPermissionChange) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserPermissionChange) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLContentValueValueOfUserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserPermissionChange != nil { { @@ -1366,12 +1367,12 @@ func (m *ACLContentValueValueOfUserPermissionChange) MarshalToSizedBuffer(dAtA [ } return len(dAtA) - i, nil } -func (m *ACLContentValueValueOfUserInvite) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserInvite) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLContentValueValueOfUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserInvite != nil { { @@ -1387,12 +1388,12 @@ func (m *ACLContentValueValueOfUserInvite) MarshalToSizedBuffer(dAtA []byte) (in } return len(dAtA) - i, nil } -func (m *ACLContentValueValueOfUserJoin) MarshalTo(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserJoin) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ACLContentValueValueOfUserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ACLContentValue_UserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.UserJoin != nil { { @@ -1979,7 +1980,7 @@ func (m *ACLContentValue) Size() (n int) { return n } -func (m *ACLContentValueValueOfUserAdd) Size() (n int) { +func (m *ACLContentValue_UserAdd) Size() (n int) { if m == nil { return 0 } @@ -1991,7 +1992,7 @@ func (m *ACLContentValueValueOfUserAdd) Size() (n int) { } return n } -func (m *ACLContentValueValueOfUserRemove) Size() (n int) { +func (m *ACLContentValue_UserRemove) Size() (n int) { if m == nil { return 0 } @@ -2003,7 +2004,7 @@ func (m *ACLContentValueValueOfUserRemove) Size() (n int) { } return n } -func (m *ACLContentValueValueOfUserPermissionChange) Size() (n int) { +func (m *ACLContentValue_UserPermissionChange) Size() (n int) { if m == nil { return 0 } @@ -2015,7 +2016,7 @@ func (m *ACLContentValueValueOfUserPermissionChange) Size() (n int) { } return n } -func (m *ACLContentValueValueOfUserInvite) Size() (n int) { +func (m *ACLContentValue_UserInvite) Size() (n int) { if m == nil { return 0 } @@ -2027,7 +2028,7 @@ func (m *ACLContentValueValueOfUserInvite) Size() (n int) { } return n } -func (m *ACLContentValueValueOfUserJoin) Size() (n int) { +func (m *ACLContentValue_UserJoin) Size() (n int) { if m == nil { return 0 } @@ -2996,7 +2997,7 @@ func (m *ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLContentValueValueOfUserAdd{v} + m.Value = &ACLContentValue_UserAdd{v} iNdEx = postIndex case 2: if wireType != 2 { @@ -3031,7 +3032,7 @@ func (m *ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLContentValueValueOfUserRemove{v} + m.Value = &ACLContentValue_UserRemove{v} iNdEx = postIndex case 3: if wireType != 2 { @@ -3066,7 +3067,7 @@ func (m *ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLContentValueValueOfUserPermissionChange{v} + m.Value = &ACLContentValue_UserPermissionChange{v} iNdEx = postIndex case 4: if wireType != 2 { @@ -3101,7 +3102,7 @@ func (m *ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLContentValueValueOfUserInvite{v} + m.Value = &ACLContentValue_UserInvite{v} iNdEx = postIndex case 5: if wireType != 2 { @@ -3136,7 +3137,7 @@ func (m *ACLContentValue) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &ACLContentValueValueOfUserJoin{v} + m.Value = &ACLContentValue_UserJoin{v} iNdEx = postIndex default: iNdEx = preIndex diff --git a/common/pkg/acl/list/mock_list/mock_list.go b/common/pkg/acl/list/mock_list/mock_list.go index e897882c..2c545599 100644 --- a/common/pkg/acl/list/mock_list/mock_list.go +++ b/common/pkg/acl/list/mock_list/mock_list.go @@ -5,10 +5,10 @@ package mock_list import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" - list2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" reflect "reflect" + aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + list "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" gomock "github.com/golang/mock/gomock" ) @@ -36,10 +36,10 @@ func (m *MockACLList) EXPECT() *MockACLListMockRecorder { } // ACLState mocks base method. -func (m *MockACLList) ACLState() *list2.ACLState { +func (m *MockACLList) ACLState() *list.ACLState { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ACLState") - ret0, _ := ret[0].(*list2.ACLState) + ret0, _ := ret[0].(*list.ACLState) return ret0 } @@ -64,10 +64,10 @@ func (mr *MockACLListMockRecorder) Close() *gomock.Call { } // Get mocks base method. -func (m *MockACLList) Get(arg0 string) (*list2.ACLRecord, error) { +func (m *MockACLList) Get(arg0 string) (*list.ACLRecord, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Get", arg0) - ret0, _ := ret[0].(*list2.ACLRecord) + ret0, _ := ret[0].(*list.ACLRecord) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -79,10 +79,10 @@ func (mr *MockACLListMockRecorder) Get(arg0 interface{}) *gomock.Call { } // Head mocks base method. -func (m *MockACLList) Head() *list2.ACLRecord { +func (m *MockACLList) Head() *list.ACLRecord { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Head") - ret0, _ := ret[0].(*list2.ACLRecord) + ret0, _ := ret[0].(*list.ACLRecord) return ret0 } @@ -122,7 +122,7 @@ func (mr *MockACLListMockRecorder) IsAfter(arg0, arg1 interface{}) *gomock.Call } // Iterate mocks base method. -func (m *MockACLList) Iterate(arg0 func(*list2.ACLRecord) bool) { +func (m *MockACLList) Iterate(arg0 func(*list.ACLRecord) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "Iterate", arg0) } @@ -134,7 +134,7 @@ func (mr *MockACLListMockRecorder) Iterate(arg0 interface{}) *gomock.Call { } // IterateFrom mocks base method. -func (m *MockACLList) IterateFrom(arg0 string, arg1 func(*list2.ACLRecord) bool) { +func (m *MockACLList) IterateFrom(arg0 string, arg1 func(*list.ACLRecord) bool) { m.ctrl.T.Helper() m.ctrl.Call(m, "IterateFrom", arg0, arg1) } @@ -182,10 +182,10 @@ func (mr *MockACLListMockRecorder) RUnlock() *gomock.Call { } // Records mocks base method. -func (m *MockACLList) Records() []*list2.ACLRecord { +func (m *MockACLList) Records() []*list.ACLRecord { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Records") - ret0, _ := ret[0].([]*list2.ACLRecord) + ret0, _ := ret[0].([]*list.ACLRecord) return ret0 } diff --git a/common/pkg/acl/storage/mock_storage/mock_storage.go b/common/pkg/acl/storage/mock_storage/mock_storage.go index 5e8f3b6a..bd562720 100644 --- a/common/pkg/acl/storage/mock_storage/mock_storage.go +++ b/common/pkg/acl/storage/mock_storage/mock_storage.go @@ -6,10 +6,10 @@ package mock_storage import ( context "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" reflect "reflect" + aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" gomock "github.com/golang/mock/gomock" ) diff --git a/common/pkg/acl/testutils/testchanges/proto/test.pb.go b/common/pkg/acl/testutils/testchanges/proto/test.pb.go index efe931aa..9071b091 100644 --- a/common/pkg/acl/testutils/testchanges/proto/test.pb.go +++ b/common/pkg/acl/testutils/testchanges/proto/test.pb.go @@ -24,8 +24,9 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type TextContent struct { // Types that are valid to be assigned to Value: - // *TextContentValueOfTextAppend - Value IsTextContentValue `protobuf_oneof:"value"` + // + // *TextContent_TextAppend + Value isTextContent_Value `protobuf_oneof:"value"` } func (m *TextContent) Reset() { *m = TextContent{} } @@ -61,19 +62,19 @@ func (m *TextContent) XXX_DiscardUnknown() { var xxx_messageInfo_TextContent proto.InternalMessageInfo -type IsTextContentValue interface { - IsTextContentValue() +type isTextContent_Value interface { + isTextContent_Value() MarshalTo([]byte) (int, error) Size() int } -type TextContentValueOfTextAppend struct { +type TextContent_TextAppend struct { TextAppend *TextAppend `protobuf:"bytes,1,opt,name=textAppend,proto3,oneof" json:"textAppend,omitempty"` } -func (*TextContentValueOfTextAppend) IsTextContentValue() {} +func (*TextContent_TextAppend) isTextContent_Value() {} -func (m *TextContent) GetValue() IsTextContentValue { +func (m *TextContent) GetValue() isTextContent_Value { if m != nil { return m.Value } @@ -81,7 +82,7 @@ func (m *TextContent) GetValue() IsTextContentValue { } func (m *TextContent) GetTextAppend() *TextAppend { - if x, ok := m.GetValue().(*TextContentValueOfTextAppend); ok { + if x, ok := m.GetValue().(*TextContent_TextAppend); ok { return x.TextAppend } return nil @@ -90,7 +91,7 @@ func (m *TextContent) GetTextAppend() *TextAppend { // XXX_OneofWrappers is for the internal use of the proto package. func (*TextContent) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*TextContentValueOfTextAppend)(nil), + (*TextContent_TextAppend)(nil), } } @@ -297,12 +298,12 @@ func (m *TextContent) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *TextContentValueOfTextAppend) MarshalTo(dAtA []byte) (int, error) { +func (m *TextContent_TextAppend) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TextContentValueOfTextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TextContent_TextAppend) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) if m.TextAppend != nil { { @@ -450,7 +451,7 @@ func (m *TextContent) Size() (n int) { return n } -func (m *TextContentValueOfTextAppend) Size() (n int) { +func (m *TextContent_TextAppend) Size() (n int) { if m == nil { return 0 } @@ -575,7 +576,7 @@ func (m *TextContent) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Value = &TextContentValueOfTextAppend{v} + m.Value = &TextContent_TextAppend{v} iNdEx = postIndex default: iNdEx = preIndex diff --git a/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go index 5d254a80..205fb8ce 100644 --- a/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go +++ b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go @@ -6,11 +6,11 @@ package mock_tree import ( context "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" - tree2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" reflect "reflect" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" gomock "github.com/golang/mock/gomock" ) @@ -38,10 +38,10 @@ func (m *MockObjectTree) EXPECT() *MockObjectTreeMockRecorder { } // AddContent mocks base method. -func (m *MockObjectTree) AddContent(arg0 context.Context, arg1 tree2.SignableChangeContent) (tree2.AddResult, error) { +func (m *MockObjectTree) AddContent(arg0 context.Context, arg1 tree.SignableChangeContent) (tree.AddResult, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AddContent", arg0, arg1) - ret0, _ := ret[0].(tree2.AddResult) + ret0, _ := ret[0].(tree.AddResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -53,14 +53,14 @@ func (mr *MockObjectTreeMockRecorder) AddContent(arg0, arg1 interface{}) *gomock } // AddRawChanges mocks base method. -func (m *MockObjectTree) AddRawChanges(arg0 context.Context, arg1 ...*treechangeproto.RawTreeChangeWithId) (tree2.AddResult, error) { +func (m *MockObjectTree) AddRawChanges(arg0 context.Context, arg1 ...*treechangeproto.RawTreeChangeWithId) (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...) - ret0, _ := ret[0].(tree2.AddResult) + ret0, _ := ret[0].(tree.AddResult) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -177,7 +177,7 @@ func (mr *MockObjectTreeMockRecorder) ID() *gomock.Call { } // Iterate mocks base method. -func (m *MockObjectTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*tree2.Change) bool) error { +func (m *MockObjectTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*tree.Change) bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Iterate", arg0, arg1) ret0, _ := ret[0].(error) @@ -191,7 +191,7 @@ func (mr *MockObjectTreeMockRecorder) Iterate(arg0, arg1 interface{}) *gomock.Ca } // IterateFrom mocks base method. -func (m *MockObjectTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*tree2.Change) bool) error { +func (m *MockObjectTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*tree.Change) bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IterateFrom", arg0, arg1, arg2) ret0, _ := ret[0].(error) @@ -241,10 +241,10 @@ func (mr *MockObjectTreeMockRecorder) RUnlock() *gomock.Call { } // Root mocks base method. -func (m *MockObjectTree) Root() *tree2.Change { +func (m *MockObjectTree) Root() *tree.Change { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Root") - ret0, _ := ret[0].(*tree2.Change) + ret0, _ := ret[0].(*tree.Change) return ret0 } diff --git a/common/pkg/ldiff/mock_ldiff/mock_ldiff.go b/common/pkg/ldiff/mock_ldiff/mock_ldiff.go index ae16314f..d2170600 100644 --- a/common/pkg/ldiff/mock_ldiff/mock_ldiff.go +++ b/common/pkg/ldiff/mock_ldiff/mock_ldiff.go @@ -6,9 +6,9 @@ package mock_ldiff import ( context "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" reflect "reflect" + ldiff "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" gomock "github.com/golang/mock/gomock" ) @@ -52,6 +52,34 @@ func (mr *MockDiffMockRecorder) Diff(arg0, arg1 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Diff", reflect.TypeOf((*MockDiff)(nil).Diff), arg0, arg1) } +// Elements mocks base method. +func (m *MockDiff) Elements() []ldiff.Element { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Elements") + ret0, _ := ret[0].([]ldiff.Element) + return ret0 +} + +// Elements indicates an expected call of Elements. +func (mr *MockDiffMockRecorder) Elements() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Elements", reflect.TypeOf((*MockDiff)(nil).Elements)) +} + +// Ids mocks base method. +func (m *MockDiff) Ids() []string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Ids") + ret0, _ := ret[0].([]string) + return ret0 +} + +// Ids indicates an expected call of Ids. +func (mr *MockDiffMockRecorder) Ids() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Ids", reflect.TypeOf((*MockDiff)(nil).Ids)) +} + // Ranges mocks base method. func (m *MockDiff) Ranges(arg0 context.Context, arg1 []ldiff.Range, arg2 []ldiff.RangeResult) ([]ldiff.RangeResult, error) { m.ctrl.T.Helper() diff --git a/common/pkg/ocache/ocache.go b/common/pkg/ocache/ocache.go index 0f69529d..41555e42 100644 --- a/common/pkg/ocache/ocache.go +++ b/common/pkg/ocache/ocache.go @@ -46,7 +46,7 @@ var WithGCPeriod = func(gcPeriod time.Duration) Option { var WithRefCounter = func(enable bool) Option { return func(cache *oCache) { - cache.noRefCounter = !enable + cache.refCounter = enable } } @@ -131,17 +131,17 @@ type OCache interface { } type oCache struct { - mu sync.Mutex - data map[string]*entry - loadFunc LoadFunc - timeNow func() time.Time - ttl time.Duration - gc time.Duration - closed bool - closeCh chan struct{} - log *zap.SugaredLogger - metrics *metrics - noRefCounter bool + mu sync.Mutex + data map[string]*entry + loadFunc LoadFunc + timeNow func() time.Time + ttl time.Duration + gc time.Duration + closed bool + closeCh chan struct{} + log *zap.SugaredLogger + metrics *metrics + refCounter bool } func (c *oCache) Get(ctx context.Context, id string) (value Object, err error) { @@ -167,7 +167,7 @@ Load: closing := e.isClosing if !e.isClosing { e.lastUsage = c.timeNow() - if !c.noRefCounter { + if c.refCounter { e.refCount++ } } @@ -237,7 +237,7 @@ func (c *oCache) Release(id string) bool { return false } if e, ok := c.data[id]; ok { - if !c.noRefCounter && e.refCount > 0 { + if c.refCounter && e.refCount > 0 { e.refCount-- return true } diff --git a/consensus/stream/service.go b/consensus/stream/service.go index 0aa407f1..ff4f597b 100644 --- a/consensus/stream/service.go +++ b/consensus/stream/service.go @@ -51,7 +51,6 @@ func (s *service) Init(a *app.App) (err error) { cacheOpts := []ocache2.Option{ ocache2.WithTTL(cacheTTL), - ocache2.WithRefCounter(false), ocache2.WithLogger(log.Named("cache").Sugar()), } if ms := a.Component(metric.CName); ms != nil { diff --git a/node/nodespace/nodecache/treecache.go b/node/nodespace/nodecache/treecache.go index 5b72d1e2..79d3ac01 100644 --- a/node/nodespace/nodecache/treecache.go +++ b/node/nodespace/nodecache/treecache.go @@ -5,7 +5,8 @@ import ( "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace" "time" @@ -24,7 +25,7 @@ type treeCache struct { nodeService nodespace.Service } -func New(ttl int) cache.TreeCache { +func New(ttl int) treegetter.TreeGetter { return &treeCache{ gcttl: ttl, } @@ -52,34 +53,20 @@ func (c *treeCache) Init(a *app.App) (err error) { ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), ocache.WithTTL(time.Duration(c.gcttl)*time.Second), - ocache.WithRefCounter(false), ) return nil } func (c *treeCache) Name() (name string) { - return cache.CName + return treegetter.CName } -func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (res cache.TreeResult, err error) { - var cacheRes ocache.Object +func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (tr tree.ObjectTree, err error) { ctx = context.WithValue(ctx, spaceKey, spaceId) - cacheRes, err = c.cache.Get(ctx, id) + value, err := c.cache.Get(ctx, id) if err != nil { - return cache.TreeResult{}, err - } - - treeContainer, ok := cacheRes.(cache.TreeContainer) - if !ok { - err = ErrCacheObjectWithoutTree return } - - res = cache.TreeResult{ - Release: func() { - c.cache.Release(id) - }, - TreeContainer: treeContainer, - } + tr = value.(tree.ObjectTree) return } diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go index 019c48af..f64f068b 100644 --- a/node/nodespace/rpchandler.go +++ b/node/nodespace/rpchandler.go @@ -2,9 +2,9 @@ package nodespace import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/cache" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" ) type rpcHandler struct { @@ -17,7 +17,7 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac err = spacesyncproto.ErrSpaceExists return } - if err != cache.ErrSpaceNotFound { + if err != treegetter.ErrSpaceNotFound { err = spacesyncproto.ErrUnexpected return } diff --git a/node/nodespace/service.go b/node/nodespace/service.go index 69d07917..3b4f8896 100644 --- a/node/nodespace/service.go +++ b/node/nodespace/service.go @@ -44,7 +44,6 @@ func (s *service) Init(a *app.App) (err error) { ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), ocache.WithTTL(time.Duration(s.conf.GCTTL)*time.Second), - ocache.WithRefCounter(false), ) return spacesyncproto.DRPCRegisterSpace(a.MustComponent(server.CName).(server.DRPCServer), &rpcHandler{s}) } From ad8f90d12e9eddd7005645f1599cb591a338bbb9 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 19 Oct 2022 12:48:55 +0200 Subject: [PATCH 159/219] Add controller which calls different api methods --- client/api/controller.go | 83 +++++++++++++++++++++++--------- client/clientspace/service.go | 4 -- client/document/service.go | 4 +- client/document/textdocument.go | 2 +- client/storage/keys.go | 14 +++++- client/storage/storageservice.go | 36 ++++++++++++-- 6 files changed, 108 insertions(+), 35 deletions(-) diff --git a/client/api/controller.go b/client/api/controller.go index 7df3e356..281bceb8 100644 --- a/client/api/controller.go +++ b/client/api/controller.go @@ -1,40 +1,79 @@ package api +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" + "golang.org/x/exp/rand" +) + type Controller interface { // DeriveSpace derives the space from current account DeriveSpace() (id string, err error) // CreateSpace creates new space with random data CreateSpace() (id string, err error) - GetAllSpacesIds() (ids []string, err error) + // AllSpaceIds returns ids of all spaces + AllSpaceIds(spaceId string) (ids []string, err error) // LoadSpace asks node to load a particular space LoadSpace(id string) (err error) + // CreateDocument creates new document in space CreateDocument(spaceId string) (id string, err error) - GetAllDocumentIds(spaceId string) (ids []string, err error) - AddText(documentId, text string) (err error) - DumpDocumentTree(documentId string) (err error) + // AllDocumentIds gets all ids of documents in space + AllDocumentIds(spaceId string) (ids []string, err error) + // AddText adds text to space document + AddText(spaceId, documentId, text string) (err error) + // DumpDocumentTree dumps the tree data into string + DumpDocumentTree(spaceId, documentId string) (dump string, err error) - GetValidInvites(spaceId string) (invites []string, err error) + ValidInvites(spaceId string) (invites []string, err error) GenerateInvite(spaceId string) (invite string, err error) JoinSpace(invite string) (err error) } type controller struct { + spaceService clientspace.Service + storageService storage.ClientStorage + docService document.Service + account account.Service } func (c *controller) DeriveSpace() (id string, err error) { - //TODO implement me - panic("implement me") + sp, err := c.spaceService.DeriveSpace(context.Background(), commonspace.SpaceDerivePayload{ + SigningKey: c.account.Account().SignKey, + EncryptionKey: c.account.Account().EncKey, + }) + if err != nil { + return + } + id = sp.Id() + return } func (c *controller) CreateSpace() (id string, err error) { - //TODO implement me - panic("implement me") + key, err := symmetric.NewRandom() + if err != nil { + return + } + sp, err := c.spaceService.CreateSpace(context.Background(), commonspace.SpaceCreatePayload{ + SigningKey: c.account.Account().SignKey, + EncryptionKey: c.account.Account().EncKey, + ReadKey: key.Bytes(), + ReplicationKey: rand.Uint64(), + }) + if err != nil { + return + } + id = sp.Id() + return } -func (c *controller) GetAllSpacesIds() (ids []string, err error) { - //TODO implement me - panic("implement me") +func (c *controller) AllSpaceIds(spaceId string) (ids []string, err error) { + return c.storageService.AllSpaceIds() } func (c *controller) LoadSpace(id string) (err error) { @@ -43,26 +82,22 @@ func (c *controller) LoadSpace(id string) (err error) { } func (c *controller) CreateDocument(spaceId string) (id string, err error) { - //TODO implement me - panic("implement me") + return c.docService.CreateDocument(spaceId) } -func (c *controller) GetAllDocumentIds(spaceId string) (ids []string, err error) { - //TODO implement me - panic("implement me") +func (c *controller) AllDocumentIds(spaceId string) (ids []string, err error) { + return c.docService.AllDocumentIds(spaceId) } -func (c *controller) AddText(documentId, text string) (err error) { - //TODO implement me - panic("implement me") +func (c *controller) AddText(spaceId, documentId, text string) (err error) { + return c.docService.AddText(spaceId, documentId, text) } -func (c *controller) DumpDocumentTree(documentId string) (err error) { - //TODO implement me - panic("implement me") +func (c *controller) DumpDocumentTree(spaceId, documentId string) (dump string, err error) { + return c.docService.DumpDocumentTree(spaceId, documentId) } -func (c *controller) GetValidInvites(spaceId string) (invites []string, err error) { +func (c *controller) ValidInvites(spaceId string) (invites []string, err error) { //TODO implement me panic("implement me") } diff --git a/client/clientspace/service.go b/client/clientspace/service.go index bb0bd1b3..876dcd3f 100644 --- a/client/clientspace/service.go +++ b/client/clientspace/service.go @@ -55,10 +55,6 @@ func (s *service) Name() (name string) { } func (s *service) Run(ctx context.Context) (err error) { - go func() { - time.Sleep(time.Second * 5) - _, _ = s.GetSpace(ctx, "testDSpace") - }() return } diff --git a/client/document/service.go b/client/document/service.go index 514bac94..47c2d250 100644 --- a/client/document/service.go +++ b/client/document/service.go @@ -17,7 +17,7 @@ type Service interface { app.Component updatelistener.UpdateListener CreateDocument(spaceId string) (id string, err error) - GetAllDocumentIds(spaceId string) (ids []string, err error) + AllDocumentIds(spaceId string) (ids []string, err error) AddText(spaceId, documentId, text string) (err error) DumpDocumentTree(spaceId, documentId string) (dump string, err error) } @@ -60,7 +60,7 @@ func (s *service) CreateDocument(spaceId string) (id string, err error) { return } -func (s *service) GetAllDocumentIds(spaceId string) (ids []string, err error) { +func (s *service) AllDocumentIds(spaceId string) (ids []string, err error) { space, err := s.spaceService.GetSpace(context.Background(), spaceId) if err != nil { return diff --git a/client/document/textdocument.go b/client/document/textdocument.go index 8f8633f3..1d6d3238 100644 --- a/client/document/textdocument.go +++ b/client/document/textdocument.go @@ -58,7 +58,7 @@ func (t *textDocument) Tree() tree.ObjectTree { } func (t *textDocument) AddText(text string) (err error) { - content := &testchanges.TextContentValueOfTextAppend{ + content := &testchanges.TextContent_TextAppend{ TextAppend: &testchanges.TextAppend{Text: text}, } change := &testchanges.TextData{ diff --git a/client/storage/keys.go b/client/storage/keys.go index 81ee43c6..05bf7e7f 100644 --- a/client/storage/keys.go +++ b/client/storage/keys.go @@ -65,7 +65,7 @@ type spaceKeys struct { func newSpaceKeys(spaceId string) spaceKeys { return spaceKeys{ - headerKey: storage.JoinStringsToBytes("space", spaceId), + headerKey: storage.JoinStringsToBytes("space", "header", spaceId), treePrefixKey: storage.JoinStringsToBytes("space", spaceId, "t", "rootId"), } } @@ -77,3 +77,15 @@ func (s spaceKeys) HeaderKey() []byte { func (s spaceKeys) TreeRootPrefix() []byte { return s.treePrefixKey } + +type storageServiceKeys struct { + spacePrefix []byte +} + +func newStorageServiceKeys() storageServiceKeys { + return storageServiceKeys{spacePrefix: []byte("space/header")} +} + +func (s storageServiceKeys) SpacePrefix() []byte { + return s.spacePrefix +} diff --git a/client/storage/storageservice.go b/client/storage/storageservice.go index 29082c92..57a8cc11 100644 --- a/client/storage/storageservice.go +++ b/client/storage/storageservice.go @@ -1,23 +1,30 @@ package storage import ( - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" "github.com/dgraph-io/badger/v3" ) type storageService struct { - db *badger.DB + keys storageServiceKeys + db *badger.DB } -func New() storage.SpaceStorageProvider { +type ClientStorage interface { + storage.SpaceStorageProvider + AllSpaceIds() (ids []string, err error) +} + +func New() ClientStorage { return &storageService{} } func (s *storageService) Init(a *app.App) (err error) { provider := a.MustComponent(badgerprovider.CName).(badgerprovider.BadgerProvider) s.db = provider.Badger() + s.keys = newStorageServiceKeys() return } @@ -32,3 +39,26 @@ func (s *storageService) SpaceStorage(id string) (storage.SpaceStorage, error) { func (s *storageService) CreateSpaceStorage(payload storage.SpaceStorageCreatePayload) (storage.SpaceStorage, error) { return createSpaceStorage(s.db, payload) } + +func (s *storageService) AllSpaceIds() (ids []string, err error) { + err = s.db.View(func(txn *badger.Txn) error { + opts := badger.DefaultIteratorOptions + opts.PrefetchValues = false + opts.Prefix = s.keys.SpacePrefix() + + it := txn.NewIterator(opts) + defer it.Close() + + for it.Rewind(); it.Valid(); it.Next() { + item := it.Item() + id := item.Key() + if len(id) <= len(s.keys.SpacePrefix())+1 { + continue + } + id = id[len(s.keys.SpacePrefix())+1:] + ids = append(ids, string(id)) + } + return nil + }) + return +} From a89d6dc468c31439d3a6d14a1b81e7c0d72cffd5 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 19 Oct 2022 13:38:20 +0200 Subject: [PATCH 160/219] Add API service --- client/api/controller.go | 16 +++- client/api/service.go | 169 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 client/api/service.go diff --git a/client/api/controller.go b/client/api/controller.go index 281bceb8..090e43a9 100644 --- a/client/api/controller.go +++ b/client/api/controller.go @@ -17,7 +17,7 @@ type Controller interface { // CreateSpace creates new space with random data CreateSpace() (id string, err error) // AllSpaceIds returns ids of all spaces - AllSpaceIds(spaceId string) (ids []string, err error) + AllSpaceIds() (ids []string, err error) // LoadSpace asks node to load a particular space LoadSpace(id string) (err error) @@ -42,6 +42,18 @@ type controller struct { account account.Service } +func newController(spaceService clientspace.Service, + storageService storage.ClientStorage, + docService document.Service, + account account.Service) Controller { + return &controller{ + spaceService: spaceService, + storageService: storageService, + docService: docService, + account: account, + } +} + func (c *controller) DeriveSpace() (id string, err error) { sp, err := c.spaceService.DeriveSpace(context.Background(), commonspace.SpaceDerivePayload{ SigningKey: c.account.Account().SignKey, @@ -72,7 +84,7 @@ func (c *controller) CreateSpace() (id string, err error) { return } -func (c *controller) AllSpaceIds(spaceId string) (ids []string, err error) { +func (c *controller) AllSpaceIds() (ids []string, err error) { return c.storageService.AllSpaceIds() } diff --git a/client/api/service.go b/client/api/service.go new file mode 100644 index 00000000..0ce5dcc0 --- /dev/null +++ b/client/api/service.go @@ -0,0 +1,169 @@ +package api + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document" + clientstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "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/config" + "go.uber.org/zap" + "io" + "net/http" + "strings" +) + +const CName = "api.service" + +var log = logger.NewNamed("api") + +func New() Service { + return &service{} +} + +type Service interface { + app.ComponentRunnable +} + +type service struct { + controller Controller + srv *http.Server + cfg *config.Config +} + +func (s *service) Init(a *app.App) (err error) { + s.controller = newController( + a.MustComponent(clientspace.CName).(clientspace.Service), + a.MustComponent(storage.CName).(clientstorage.ClientStorage), + a.MustComponent(document.CName).(document.Service), + a.MustComponent(account.CName).(account.Service)) + s.cfg = a.MustComponent(config.CName).(*config.Config) + return nil +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) Run(ctx context.Context) (err error) { + defer func() { + if err == nil { + log.With(zap.String("port", s.cfg.APIServer.Port)).Info("api server started running") + } + }() + + s.srv = &http.Server{ + Addr: fmt.Sprintf(":%s", s.cfg.APIServer.Port), + } + mux := http.NewServeMux() + mux.HandleFunc("/deriveSpace", s.deriveSpace) + mux.HandleFunc("/createSpace", s.createSpace) + mux.HandleFunc("/allSpaceIds", s.allSpaceIds) + mux.HandleFunc("/createDocument", s.createDocument) + mux.HandleFunc("/allDocumentIds", s.allDocumentIds) + mux.HandleFunc("/addText", s.addText) + mux.HandleFunc("/dumpDocumentTree", s.dumpDocumentTree) + s.srv.Handler = mux + + go s.runServer() + return nil +} + +func (s *service) runServer() { + err := s.srv.ListenAndServe() + if err != nil { + log.With(zap.Error(err)).Error("could not run api server") + } +} + +func (s *service) Close(ctx context.Context) (err error) { + return s.srv.Shutdown(ctx) +} + +func (s *service) deriveSpace(w http.ResponseWriter, req *http.Request) { + id, err := s.controller.DeriveSpace() + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, id) +} + +func (s *service) createSpace(w http.ResponseWriter, req *http.Request) { + id, err := s.controller.CreateSpace() + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, id) +} + +func (s *service) allSpaceIds(w http.ResponseWriter, req *http.Request) { + ids, err := s.controller.AllSpaceIds() + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, strings.Join(ids, "\n")) +} + +func (s *service) createDocument(w http.ResponseWriter, req *http.Request) { + query := req.URL.Query() + spaceId := query.Get("spaceId") + id, err := s.controller.CreateDocument(spaceId) + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, id) +} + +func (s *service) allDocumentIds(w http.ResponseWriter, req *http.Request) { + query := req.URL.Query() + spaceId := query.Get("spaceId") + ids, err := s.controller.AllDocumentIds(spaceId) + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, strings.Join(ids, "\n")) +} + +func (s *service) addText(w http.ResponseWriter, req *http.Request) { + query := req.URL.Query() + spaceId := query.Get("spaceId") + documentId := query.Get("documentId") + text := query.Get("text") + err := s.controller.AddText(spaceId, documentId, text) + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, "Text added") +} + +func (s *service) dumpDocumentTree(w http.ResponseWriter, req *http.Request) { + query := req.URL.Query() + spaceId := query.Get("spaceId") + documentId := query.Get("documentId") + dump, err := s.controller.DumpDocumentTree(spaceId, documentId) + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, dump) +} + +func sendText(r http.ResponseWriter, code int, body string) { + r.Header().Set("Content-Type", "text/plain") + r.WriteHeader(code) + + _, err := io.WriteString(r, fmt.Sprintf("%s\n", body)) + if err != nil { + log.Error("writing response failed", zap.Error(err)) + } +} From a3814f644c22be07f8c2c846fe160a2c03ae6fae Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 19 Oct 2022 14:03:40 +0200 Subject: [PATCH 161/219] Add client configs to nodegen --- client/cmd/client.go | 10 ++- .../{treecache.go => treegetter.go} | 0 etc/client.yml | 36 ++++++++ etc/config.yml | 45 ++++------ etc/configs/client1.yml | 36 ++++++++ etc/configs/client2.yml | 36 ++++++++ etc/configs/cons1.yml | 6 +- etc/configs/cons2.yml | 6 +- etc/configs/cons3.yml | 6 +- etc/configs/node1.yml | 39 +++------ etc/configs/node2.yml | 39 +++------ etc/configs/node3.yml | 39 +++------ node/cmd/node.go | 8 +- util/cmd/nodesgen/gen.go | 87 ++++++++++++++++--- util/cmd/nodesgen/nodemap.yml | 7 ++ 15 files changed, 265 insertions(+), 135 deletions(-) rename common/commonspace/treegetter/{treecache.go => treegetter.go} (100%) create mode 100644 etc/client.yml create mode 100755 etc/configs/client1.yml create mode 100755 etc/configs/client2.yml diff --git a/client/cmd/client.go b/client/cmd/client.go index b21214ce..e529c4f9 100644 --- a/client/cmd/client.go +++ b/client/cmd/client.go @@ -5,6 +5,7 @@ import ( "flag" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/api" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache" @@ -14,10 +15,12 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "go.uber.org/zap" "net/http" _ "net/http/pprof" @@ -30,7 +33,7 @@ import ( var log = logger.NewNamed("main") var ( - flagConfigFile = flag.String("c", "etc/config.yml", "path to config file") + flagConfigFile = flag.String("c", "etc/client.yml", "path to config file") flagVersion = flag.Bool("v", false, "show version and exit") flagHelp = flag.Bool("h", false, "show help and exit") ) @@ -92,6 +95,8 @@ func main() { func Bootstrap(a *app.App) { a.Register(account.New()). + Register(nodeconf.New()). + Register(metric.New()). Register(badgerprovider.New()). Register(storage.New()). Register(clientcache.New(200)). @@ -101,5 +106,6 @@ func Bootstrap(a *app.App) { Register(commonspace.New()). Register(clientspace.New()). Register(server.New()). - Register(document.New()) + Register(document.New()). + Register(api.New()) } diff --git a/common/commonspace/treegetter/treecache.go b/common/commonspace/treegetter/treegetter.go similarity index 100% rename from common/commonspace/treegetter/treecache.go rename to common/commonspace/treegetter/treegetter.go diff --git a/etc/client.yml b/etc/client.yml new file mode 100644 index 00000000..a7949a41 --- /dev/null +++ b/etc/client.yml @@ -0,0 +1,36 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4630 + tls: false +account: + peerId: 12D3KooWC2SctmKSLWqmzsKCpQBo4iqNzbZhWivM3jbhovB4JFug + signingKey: Maen+w6qwWuS79RZyMbuW7wnWAox0+rMinAb/gsOSl8gz2BLCfMlwXjlo8NLKfFFZFNUzl0ANTxbrK45Be7CPw== + encryptionKey: MIIEowIBAAKCAQEAonOsG0DzAzGlR7cd0u31DS0xoHihxdfJwut5JMtLKqGwkUC5RM+/eTa96hKYp8ED6B8Q4ZBhmt2gQnOUQJpoAnJ6uU/HgQVVhsJD7uMQcyVWr2KZbRK2GAohxOiW8JaB8pLiIRJbOxaeIu8dGRTrTTxYnh4IbIUgMu5x3iPW1/6YT/LCN1r/CBgHnPLtxMjAdUYzz9+LC13sZJsanUot83MTgl+5unEPh+ogbrSJ6P8FAAWW8HHD5lUSSb2l8NFRafYWP4o3vF9fqtmpt5I2nK6PaNh+4YXB7CX8Nak3AYuSO/aLGUtZMGYv9Qqwewjk/ewEGNWz33D/Hve8+hctXQIDAQABAoIBAQCNY7/XuJ/Jl9wSnv4GJ7Ww0jTvRg8G8tlYHTpDG+1AHZpf0cVubqJoDY0dvTHAT+3miaNXryJEd8CUFaRi1gDQoHLP9u/dC5d0wn/92wLmNQlNfLOsiyyRn7/kccttepF/XvgRcLiWpQjdvt/EhMCHaI54kAsk6Hkt2vqgLPFA66MH/5AMyf+8RmouYvc1m8jPUVmkIZVkoO4/6kh0tZS+rGdjxB65zDaoBx6CcXAMkTWe27Ce87vfGwCRySGVGRg7RuTJQR8VO3oSmsPVIZ8A48fKPQvryrl/5ztvE35lL4i3pdIbd/CJ9zTKIEM4nyPWSmxsaxs1yIllsj3BFpDBAoGBAMzWUEBYm5FH6wG2GXigkou4VSUBAoKCi5XmA2bwCUZx6CaG4uk43cbYpkbLpIRchfLHAeVCiaOYe5VFvYMth6o+OICEKfXWEwGqjtWeHkyIQIZ1Yo+BKk1rbzkYa/n3a7Mw+C6HsweFq1v01eTChmMr/PF6trFQiJJhTGkGKS2/AoGBAMsHKMEmgw1/hRqiEai73AVLSzXGoHSUWsM1vV05EzDyoxkk8Q/+sJR/BOp4HvJidXiM9B0hSOBhkPZjP3TZSQTKXwMGY+Hcs0XhwGxV5Eb9XdbD5rhCT6eVUeQeP9W9J34RdobJauG1Ld9E1U0nKEI+ls6VZf6/k+ixDOa3TaPjAoGADI+7/iYw7Bjf9YvoRfh65CyatBk6wSwmSTwAy2g++V304Z/1/F1rZE1W7RKB9UgDQt8nY5rP/ANW2NGdDJVXM357Uo5IUHYfVkPSXJFExGa6pkQ+lhRStsq22GaCAKNGrId9QMU7mmN9HbeHAm9XdG93JIvk9jy9E1T6LZqeHdsCgYAXsvQ856PwlWwSGcz550PdklZrJo5gTVjy5HkAQsNMuWX0b218MnymONV4ESF7paaUtc9g/xukpX7oY9lqaFqvpnfEwKA0IzEB/UIa40PMTZMAmMl7xLHLnBB9ElLdPkE35A3z2dsSEbYTE9PaN7HpWaj84E+RlwdK6C/bVpZHhQKBgBv8Up6nOfQyW4jiRo5CPOzXPYu+tXfsV0lKbYAjlp3rcczsi/BPXF6tLZ74/f5Cp2NJxx1GIitjqGzZ1mhkB8Eimuw1o+uNRBRh5BcmQTXPTxrrbOsYzjBJNb7n9HcHlGivcmDooxP7TgRJydEiFdpoBhjU+7yGJTJk7YdDLI3I +apiServer: + port: "8090" +nodes: + - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + address: 127.0.0.1:4430 + signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== + encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy + - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y + address: 127.0.0.1:4431 + signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== + encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= + - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd + address: 127.0.0.1:4432 + signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== + encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== +space: + gcTTL: 60 + syncPeriod: 10 +storage: + path: db +metric: + addr: "" +log: + production: false + defaultLevel: "" + namedLevels: {} diff --git a/etc/config.yml b/etc/config.yml index a95316f6..7e211552 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -5,41 +5,32 @@ grpcServer: - 127.0.0.1:4430 tls: false account: - peerId: 12D3KooWNGRznbh4RCYY1hDnG1RLCtWviWwVnZGjKHtsXVgPckNk - signingKey: buHKTg4VF6lskoFWDdjtjWNj2c/fz0zAxKrOW05pRRu4+aw/tClrubW5wpeCOJxPSMHJBTj/8bJ8icwKfe7yMQ== - encryptionKey: MIIEpAIBAAKCAQEAtoc/5YBUSzPUISHv/COa2wTeWpsuxuLGOd+IYLXe8xXIry0GHCqCN7orZq5iz7BFs2i6o0ttK2PpRa5xz/GnKtTkQowmfDNwh/f+jIlMo+CcL54Qq4sURexChBCg6z3XbSQK1C9yGA4QaNFRDgSzAs1IC8BCRFf7XDbK06zxWw/As7D3Bo1V3TO0LWi/URkV1PBZdQxX6unt5VplhTQ92o22xczb15zfBQW59qEZYyPa2apwUfmhZgjoAbSOIQm96U7P+HrLa8va1h9q9o+eYefco2N7wv40MYsDXll09Tfc/VhDEfmuKfwmSe5AEnpsg1gD94fX/4KVt7Usb7u6gwIDAQABAoIBAC7POqS5p2Rt0z33/RqVavY2JmvoFjPtHlbjK49ZtOZ0NLYv/rwkbqap+M1pdW+7zfQ3rH2KL2IMSluTZB6m428Jj8w9MvVxH6/O+pnB8ESqqoNPrwi/LyDLeTdzKEGL535W2uwVitX+bVjkLTxCGkJisNJKqPPr+EtqxdNJK9BlJ9VdOLFLi67mOsu3F6AtDtBC3VFXZJa8Wbocu0A7hm8QWa23AL7+EZdV9kJ8Dw2qEYXyYRwmhExuZWNsPsnMvNhlCj8By9IPuICDzW87SfcsIQd7vjSg3y60mmGvl9WGxJbpEkSa+MxCA175k3E30KP1tYMOBQyhlCr7qRYWpdkCgYEA4a7CJGqtdMB8KByzrfGazm8koI0Y+qcriYaOWeoZayoxshwmemqJQTEP29D5SumxOcobKnKRHhKBhhlJenc5xNwppgMIgexZtLLAB2pZzLZ/bIy39T+lAEVOQWIEWDUQ0MwqaGNvaZ2bXyM1Xq6Bovurs8gSwmRIQspskeD/fy8CgYEAzwxpLa/W+BcRPH7VpLSkwSPgsAXW+TCoxWuCMj/W7MmCplyohW8a8wc42RFwKCH4ULpyNbv0VWdCM910/U1sf+0s7B3+IeW/0oMlLIPOd/Z39Legm+h0o1l3rD7deWdL7AMnaJIJsMBOUp0DRBSE5Bj6iUr1MnIEMX/3zFqdxO0CgYEAo4FSZMHpA3JFQWZyAy7M4o0Bc1RmaYrd7xhOX/RMECkUsh7U/dHbuSCLhc1kH5Mp9F1pyxoP60KrFnWRl6lzcB22CvGdo0uSPmlW2MiDYN5DeWiGCqfeqlCL/rC9xw5DLZMNkm2gFVu7anT+wKcbgvJlFq54cN/ovoMbn6DsWr8CgYEAgUVIbgP5fdA5LMIr9bfrncMeyAf9XnwpA4nKMkF1mUV/UwtLFHR4KQB7V9vxYL1E4nJmWHJPbPsZdHRyVKyAb6bPg2R+hP+DMpY7IX3x7ShvYNU9a9pI6Kw1cc+WS/RYjLSzaDC16CtJO39YyKrfBeMqmYm5aZOSVq2FM4voMUkCgYBudtWqqwKvA/Ig32hPBa/pqh+R11LeN8F/NsjrCA3geo8MlDqD0To+r9FTv14AksR7BsAfhoGglbvpddTL+CqHgtA4igNWp2/UCaomfnCgnFl/rvo+OGiVR5DgaC4ALw9onsdfeNgrQ5PkqCCi2crb3txdRWGA2QyGvsBmb1u8+A== + peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== + encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy apiServer: port: "8080" nodes: - - peerId: 12D3KooWNGRznbh4RCYY1hDnG1RLCtWviWwVnZGjKHtsXVgPckNk + - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz address: 127.0.0.1:4430 - signingKey: buHKTg4VF6lskoFWDdjtjWNj2c/fz0zAxKrOW05pRRu4+aw/tClrubW5wpeCOJxPSMHJBTj/8bJ8icwKfe7yMQ== - encryptionKey: MIIEpAIBAAKCAQEAtoc/5YBUSzPUISHv/COa2wTeWpsuxuLGOd+IYLXe8xXIry0GHCqCN7orZq5iz7BFs2i6o0ttK2PpRa5xz/GnKtTkQowmfDNwh/f+jIlMo+CcL54Qq4sURexChBCg6z3XbSQK1C9yGA4QaNFRDgSzAs1IC8BCRFf7XDbK06zxWw/As7D3Bo1V3TO0LWi/URkV1PBZdQxX6unt5VplhTQ92o22xczb15zfBQW59qEZYyPa2apwUfmhZgjoAbSOIQm96U7P+HrLa8va1h9q9o+eYefco2N7wv40MYsDXll09Tfc/VhDEfmuKfwmSe5AEnpsg1gD94fX/4KVt7Usb7u6gwIDAQABAoIBAC7POqS5p2Rt0z33/RqVavY2JmvoFjPtHlbjK49ZtOZ0NLYv/rwkbqap+M1pdW+7zfQ3rH2KL2IMSluTZB6m428Jj8w9MvVxH6/O+pnB8ESqqoNPrwi/LyDLeTdzKEGL535W2uwVitX+bVjkLTxCGkJisNJKqPPr+EtqxdNJK9BlJ9VdOLFLi67mOsu3F6AtDtBC3VFXZJa8Wbocu0A7hm8QWa23AL7+EZdV9kJ8Dw2qEYXyYRwmhExuZWNsPsnMvNhlCj8By9IPuICDzW87SfcsIQd7vjSg3y60mmGvl9WGxJbpEkSa+MxCA175k3E30KP1tYMOBQyhlCr7qRYWpdkCgYEA4a7CJGqtdMB8KByzrfGazm8koI0Y+qcriYaOWeoZayoxshwmemqJQTEP29D5SumxOcobKnKRHhKBhhlJenc5xNwppgMIgexZtLLAB2pZzLZ/bIy39T+lAEVOQWIEWDUQ0MwqaGNvaZ2bXyM1Xq6Bovurs8gSwmRIQspskeD/fy8CgYEAzwxpLa/W+BcRPH7VpLSkwSPgsAXW+TCoxWuCMj/W7MmCplyohW8a8wc42RFwKCH4ULpyNbv0VWdCM910/U1sf+0s7B3+IeW/0oMlLIPOd/Z39Legm+h0o1l3rD7deWdL7AMnaJIJsMBOUp0DRBSE5Bj6iUr1MnIEMX/3zFqdxO0CgYEAo4FSZMHpA3JFQWZyAy7M4o0Bc1RmaYrd7xhOX/RMECkUsh7U/dHbuSCLhc1kH5Mp9F1pyxoP60KrFnWRl6lzcB22CvGdo0uSPmlW2MiDYN5DeWiGCqfeqlCL/rC9xw5DLZMNkm2gFVu7anT+wKcbgvJlFq54cN/ovoMbn6DsWr8CgYEAgUVIbgP5fdA5LMIr9bfrncMeyAf9XnwpA4nKMkF1mUV/UwtLFHR4KQB7V9vxYL1E4nJmWHJPbPsZdHRyVKyAb6bPg2R+hP+DMpY7IX3x7ShvYNU9a9pI6Kw1cc+WS/RYjLSzaDC16CtJO39YyKrfBeMqmYm5aZOSVq2FM4voMUkCgYBudtWqqwKvA/Ig32hPBa/pqh+R11LeN8F/NsjrCA3geo8MlDqD0To+r9FTv14AksR7BsAfhoGglbvpddTL+CqHgtA4igNWp2/UCaomfnCgnFl/rvo+OGiVR5DgaC4ALw9onsdfeNgrQ5PkqCCi2crb3txdRWGA2QyGvsBmb1u8+A== - - peerId: 12D3KooWKtsepiMYrDtok7AU4itPcmHQaLuwzzfYYyjEW1KoLeXp + signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== + encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy + - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y address: 127.0.0.1:4431 - signingKey: bqnCY+BB93A2nTM59zyP1CGZg5seSIeoGM/ATCOMy4+VvIfB1kwEK2VM5QVx3ub8zV/kqND8xuuQCC2NIrAFxw== - encryptionKey: MIIEowIBAAKCAQEAxaNDIGlEwkYRtcw6eoM1wRReJJUgHbEPTGSazEHTIp9Vza0Ob5GqT0yTFbWQWec1+vfCCVj49Z0usKiIa78iViiZxN/EZtdbimM2b2LTOPPkHTBNM3KawuBtVd34CYOLyFFhc+m4dtquGTsOGC0q2YQlS/XF+vGNWO/j8LnriF47Vv3Vr2YDfYeLo3aMexjzLKDiL1TC8fxtcSHqwrJnhgkFEHV/BIadPBlCpVukTPPMusEaoMshHVViS2emStf7j7Iq6KDdbIMGRCTAKhLNMOnHDwmDlBo/RSS/iYtEXFEADDfiYPOeIKIExPnAfdbku5I1y3/IaxeSpk+jQDFfMQIDAQABAoIBACLEgsWL3z2x5+GsaMkuleE+fQVAeqLeiAtvU1AFcGgR0Z1aCUUVQfmrReC2zQsTwopA1ZChZ0KGATWwoDccK6UuhUZ9+uYAkqj4pRXZM8E8HnAIFDytt436vyEw6DZ8PrXhoxwqDHpUI/ZqTiNwpq4XMhx3wvlPTwdLRDUP7+BQK7EmmZLZPiU+oq7f8Fo3ag2gkRKakatPIjwKRDSXcLNW+Rz2YrxUOAdEir2KiK0CKYAkqmcZy/O1xBjQ0YgQpYgxgBXRHTgd5iIFjGG/bCIHsLyV+FkpMpgO7oFw0aJa6zISFeoZ3Zekpf0qqSQNrI+Tpc3uStSE8/95nIo+fxUCgYEAxuvt8VRl1W16ddYpGAFO7ytTdzFSg4e07rKPLvZbvQ4M21CASluNPPKn/S9KFaLZDagBM2jl2cjGYdHVfVlVu/fmM8nlTCIhxkjU9iHkyspJWXNxzUcnh12GEjcNb1i7Oc1QTof7HFjEG4TrsRmGdAee4ZjXYyIEPAHCgxAdc7sCgYEA/lkGdggdLfw6HkXceLaiuq8FA7asJ0JK7L5XCptAXZ9ci10oQuwC+58S8eFVkOUmnVwFovc7CF5EtWjUkSdI+AIL3WCnj2Xjm/S/ASNL1Urw7Q7A7QKu0kGawadUQ00/oSRApEC3f3XK0rdkRlryp8mj2WRfUyBEjh+NgLzgzAMCgYBHQK1Le3K6n2t1GBBCM/3FN9y+3iDzUkHiGn2lUcOMlaLPUCeT+vU9dqHr0+uSknFzLdG4S4PBneRJl7MEImLOYL7JoDENM1CryNzXiU59wTXC39JMuIcVOs/SaHvcfYka7EsuxhCRl84vGU6fckgx+aTUpD3KmZ2wrOSys6wJDwKBgC+VrjzE1di1mJXzUgUPfjBY8CI6uch6gZP7JEOqugcJ+oFkQ1UJ3KEAqMWx95UtGeVUwwUzJcsx/77ExwgFBoTHtTqMi6yrTkLuLhHjbZuQ8rQXD4cH+ncBqRdT29Lfj+jw5FsWdH4XJoP3pX34I++6LLpOKfteTRUd2BZev9vLAoGBAL24XaIkqAECCqdGLiID3PEIRLGacnjEoAqS7fT5A8CV0Cle1KKZzkJlJvxU/pzSgp5AjI1TwIiH4jYE/Xtc2+61Kx1C7jqK5tNK4lJ3BkHUY9d1Etr+HdnDZYKZ32XdGfh4nUU7dx+OI965oQJISsLVVmu2GBllsbg6sA+w3LnK - - peerId: 12D3KooWJ2259GQZxf1PBkLBR8J37QN4PMiLedBU9h5PNbUwfaXE + signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== + encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= + - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd address: 127.0.0.1:4432 - signingKey: RHl/cHYoPtAGXgJl7F3upI2OAnD4hd9aJztiqo08w/V52b3qKvFr2TWnpbNvBlXSxeyXpo4WB1jH+pMslW0irQ== - encryptionKey: MIIEpAIBAAKCAQEA2vHQaQ5U/PzvNFTk3G9t/IMELaxM5OBFV0/HcjDnF3jtc/ADtqG4zsr/VCs7/tiXiEIxn5aMFrvS7APh2/EHLlAnyrjYLyyxvgwqUtV06Gf5K2V7HmFTLch7VFc5HckU4Zg1B61EYAtnWu5JTmsZAmP1v3afsnfpdwTA3LEH65oOyEAXqCeNUtrrwZXYnt77gk1zC0NSdtE4Hf25OJ5to0kckmQf+TMxj5seA5+u55Bg/Hd9sorFl0X0JrAkIxnVcWYt9lCNZk4frPHl1deX9BwOJ5KKrz1Af/617rl8b8H5F+KzkHXpgpJfxtMLWUnUuaX7qm+R3qe1HeMCIAmOLQIDAQABAoIBAGPVHT25/kC5KG1JRG3LFXCtYOtehFVceeG9C+liqQzH5CYYS+krxrPsVg5QBHRI2JeV70CgidIX5K4few4p0ido/yvtqw2fqJBKxcWtdTg/qJsEE+afZCkdIDct6mpNdQsEtzF/7QyKRp9sxdpO9UFkyPp7oYfkK31MmpBG3KCtb57dyIKqfBoIrp9E54X+MtHHQsqpVo7wgdSufUAWA5OtrebqrUGhWrZCRVT5l+BbPp5WliTN12jVU3jdA6rkUzrdyt5jyZQZ1eIm89mBi3wQod3arUx+DnXeICroyWW7eumXqvPdYO9Y2eaGpXY9sjXioGARi97vD/qCB9qB/sECgYEA8L169WaUBfPU6qlD+qZN1Be6PprjBqoTYu3clQikYhF1HGcXT4ri1/8CT8gf9QsUt2NHzNf0vkhyqJ3bD+mxG/c62C7ff4mhLRR2MRiDnqFaYKJL4snFG6eachD7IqgXEJ8Uw8s+LUqljhMa3NlXgDyCdrazVto/J3iDx6/B2/ECgYEA6NKniFEFrJBEVr7neEsMzKSuu8S7VT8bZGNY5yLIHM7+E1YeyJko1BtaQ2f+x9nnRzRPpjO5H+oVLeRWj496retGmvQ24K6VPCq8b7I9QUdYOvhzgo+go6sCM4dzfespIi932EAHGFA0frZ29o9W9a8rgFZUoigde9KAYxVLQf0CgYEAlfUBfZFLDTYoX4/WV3B2NHIfQlYKqqEQeGRALdl3Q9sp/uo8fADActlXIElBlsszOVSvaervegP44A2MYiood4oV7omsEG6zpjgDs2tYuVw6xszxxi/3BtXs/7aSKLFZxLHDJn8YmO/RlmFSL1V3CtsmTTpbFfPWuQh51c4mTJECgYBQEhqR9CN6bIdEOhWLNmxpeP2rEAbJU5HNHam2nCysU7fn2Idvv9Td1aZeZkamXtd+kowOAd3aDvxHsy7d4p9zbuXyZqj07rXeYmg6FdehOrMqXMYFEfZSM37nT981YAneeurBkYufHf5f0crqEvP6PMs+MPKcbiVtr0B+UxV11QKBgQCmNz/q1pPxEltFBOZmsyfmplKgeDyexB8nb0z1NNc00tpKtWL+hvLqGQwYnECJ7kcJDNetKM1J6rDCoLg6hObf/Ze6/BFXTZF8bM6Xqz1elQPYgHl5P+vlJ7yVI5FClVG8RgI73vxr67CZk+4zsZbvTLscaZ1ZPkPR9m+YMJWUrA== - - peerId: 12D3KooWNJdqtKLZAxT3szMrWoSLS1F1JkyKgJ4YQ1rAKfeVPMm6 - address: 127.0.0.1:4530 - signingKey: BwEWqy5XqOeEUy4BmMzv1WltI5TvLPfP2l2mtioxb+a5ijq4aSATKZSFfcm2hpbGDObWOzeyi06BarLOfQsTnQ== - encryptionKey: MIIEpQIBAAKCAQEA2sTIJSgwRRwPVINYyC5lHtZGsBth87wV+mwMVHkt1/Er8WVstudDFj7dvpO4wHE9vzOQi8+VobNT+xZSB1hlLbOuyBMDzdg+0vs1rMmYruKWb12VZ4+ir1xhnqpm5sKhPuPylZFp+m2GuyEeMHjUNnbQDgPSxkh9jNnTnlwG86h8r5BlhbiISZUs0Jh+IiAbgf55xTdYp0UmVREJYpmk8SBOQS4HfkWM7ih85zMrA0lzi6bfghN7CSABpAMYSgLJc9XeP3le8iMSKQsT+RRvXgUAniPT7ftbWg0tZMNjJ9CXF12Mp0ElC95UIwOnJJydgrLMLvQ0Lggie/WdN0PpCwIDAQABAoIBAQCvg37bqLGJUKjP8gzxlZ9VLS5LLbzZUgYEAlmmEA6CmB/cLLYay9Fb8JXwxw1Lf869Ln6CXMm8kGYJJPAsqnOKRgUsyWyc4igNFrQKazbO4EU3Fcq+6lLoA+Lh6+5gpre9AB5oduCipOqaCUjyNI51H79t7w1UPWZU8ZHBFC4TnpanTYTqyYwUThqDR/PExyV7mhYN5gEi3cg4W0cA7qlDaGgwaKBrMphRt2xwNlAlYAhdkwdgRmbnB/zrWb0FHqJAsz6biqqNh0N0EgIsF0ZMO0ZFGRt+Ou36500Z1cRpGurbO1zrpNV2R2Gg0Ssun2tfjoYJN22HqwwLY71s/xXRAoGBAOx5KeiD07zkRCUzfVa9oHd9CxFSpStz0mCauFDpW0nhzgonjSaOmEotGvVRLDF1eqbtji2QOx3WSPXdnNlncyYAsWFJMyupygqsxBxnVBX3yFFicOE6PCaZocwDVmdKNNfg/52U13qS4pxFFclUPHlVvEcovR1VAPP08MvyV4x5AoGBAOzVW7FmVgzAUc9E8ro6pXD4dFyNkE6Hasq5ApQzFbqcaHSUjbS2lF5dKhvur4OABy6XO/wgD78b/bC+vMryxC+yHm4FP+ANpQ+/DSrn+g2X80J0wqC2tIIVqYMOzn3L+gSfRnhW+28vEx5SSofa7aZl/NOoXtXD47amJELwYzijAoGAVH9vJDCG5oZCe3CMpwQXZNr/q272qjI2yGJA3likUCApuaMsYsytSkQXz/Tzb7Dk5OUZ2tog5aZ+Z6yKsXyvvrKcr4CykjWXhnz5jpS1jSv/HmWopDJk7/4RvI6svzfa7hDuBeb7oEcARorBIDHDci/amSrLeMG5F3M84AN2mTECgYEAvx+PV6JWXwP1AWeK2m7phDl87hPwGO9/ZwnW4vI23tnKEgqwMN4G7gARM2lzipOPODIj3luhWYClQjUq9jzjxfngRLlHyvA3/HUZkz6RtNajIUZIqpnHIhOJMJKKYUpzAbfnjsXjMt6ydw3Bx9ENZ/N2DPkbTzc+VO/O45ZK/DECgYEAvhovek7Jk4ZmC1OsxedqudrgQugNGTMnc6gFZR/CUXrtBs1vq4zKe003Nx5WPGaYooySVraSgBplamtsL+dUsVRqWjCyuUrSkuv7XtP6rdSuRJEHTs7vumnGsF2pp+I08W1Bg0zUFToGy0PqFX9pVeR1f63COI4Ca1Vy6+BIw1Q= - isConsensus: true - - peerId: 12D3KooWP2cwtzkokAGAr8UzdW1pmU4NS2D4dvHJtK2q75TBEeKq - address: 127.0.0.1:4531 - signingKey: RyKkgbAlAmo+suhJf1mYau3uneQD93XO9Dks/a8lpXDES5wfPb3dO/8oefEFllI+c/m3bTVkAYBdTHtCZq7lYA== - encryptionKey: MIIEowIBAAKCAQEA6Dhjs/8s/uiTFIopCjoYLTq8JGIM3otbUktYXSnqpBVVUU4TwSJonpyeRCgcYy9FlDWrUPfCNEv/kG6ruNUZQs2UuPbaOMZ1Z5TZRokwZF26rlkmaTlwJLKmKy0wwT9koZT/e5G4NkRO4rOLK/O4NyDlZ/HvWaZPxQtcC4en0CDaaIcDSSKaL5OMz0fcXayQlWKiOsuuP7cSUYlBDybbJPLSPMVYUjGjzIBqZkV6nBgjKGIIBGlknqZpRwX1mgq4vG0UYTfGCOFF1iHQ4TiLM2EiiZw203PVA4ifSyvkZOkMngItBfYcnD5MRYtLXlps2LWW6auN6olAkyUwFQeHLwIDAQABAoIBAGq7kEfo3xuCdieYoOhMb1RKjLMERfn7f0vByal4XJpyG7a09itszz0nqy6UaQfFcGuAh289kQtMavhNhav8dhHYP6UMAJzbypaDOaJL5+wZkHYWD6uJdNvJKMrriF8p7ey+ePaosUxv9PoJn8vhxye/fPFbp7FC2aMtZ279OMpVjyhbBekWlHfAnRbmDaFjMH+7wHfaAArpYsmRaOJ+/ckqhHSWSCXHO7dOyTcRNx4J0NoZ+192J6VsD1bbGxfHEgtVac/3+fj0Uia3mjkA+e9+oe7kfiGAheLs7G+kC0rEht1VLkviwjM0oCPd3zcu50HjqSrQ1q+i4vKJLrPWQFECgYEA8Uz+PlwghCWcJ7c+TYL1Y4UpYMXavRYi+XCHyn5x2PtxLDgK9j38CbLtIJFDY739RxEDLsOAkC3ba5p71EAx2ZF8i4ylmw0ekTe8BhEo/PHhCmLL+12zUrDbmUqsb1/NJBRDVZ9975nqWiT1KWqm3XKrwfBRTvgiP3+dC3XrtiMCgYEA9l3KBUK0oc6RWftNQTbehrwMuG0M4wv05peTHHqlMsYV0b5nKCr1FWU+gA4zhEDNPcs7PkZRl+HHMalkKH/aLpxeafN5a4PkMsQD6ZK5Mz88IENzXbFswBjCI8s5NyAAK+aI4JqXiRoia6fRnWVp+VrC4A1o2dvD6GaZAta3bYUCgYALFhF8RflMePnirT2UjBbAGsca5hw1ocW7lhr3B7YtVOgPMwf15kUlIO5aF7Jz66+uSy7NQDgw55p0KCXWS5i+uTtyoeSd6g1keJ4P3Uv3yxkexAlBJD3v56Y/NboUZ99h7/hj/67mijjFKXuGCpteAz227Faf/TB9oFxTwXgx5wKBgEMOeCRCacP445soSXjMpHjrylKQbAeIg5oX+5Su1TQismGqf41xU9AFBKP6OY9vy+1b2b4ziZXbgEpGHtrfIdW5/gC8onnfJkejDqWOqBYIyibF9Sq1VjJbCsyPTf1xGlrYnrzzlvdcQ64luWor5lJWn+A4Bif2JzakZlVdeAO5AoGBAMynKpkB8vqTLU31yt5SzBroQj8TgZKGbzB2apO1a+2XE8WfmtFOxnS1/iQ67sMkv6Rh/N5SUxMnBLXjsYJFpuNkKjvE+RqO9f4PzklTIJuT49pexheAMKBA9zWv5YPEmMV8xGbqXooSuEP0ixlM07DiqaC7aBzSyIfGdTOvI5w/ - isConsensus: true - - peerId: 12D3KooWMg5c9wHkuXQ48qyHVa72UKerKWAVZRC2dc1ibSadYxTQ - address: 127.0.0.1:4532 - signingKey: gSyxSnCL8NsewJmdFwgVpjQ2hDwDvrbZrLnA1007ymCwLN67/Xd/42q4vsvZAovsXBrv4PuWuoQUqmXhX7OJrw== - encryptionKey: MIIEowIBAAKCAQEAptyiobOzgLUuVfUQetYQD638+kOUAjf+V7uny+9Qhtt0LZM5v4lsJ8DK+NIbJU6fo9sMNJ8Mc2A7QNEZ6iyppI4zszUIMfF9Ixhew8g5zBlaDzieAf1XSGuEd89vj1ikM3Nhp8AXzxxoFOTsgUCMlnAzsHalcVyqXRzN/glAA1Ob6R0pIEIz4LchvMpnjhSLi5XEmBMy3b3XHu+T5nYyLzLxxMpO2fHH41/GpWmOEVrjoT1qP1JSv+ehuXiuMW0rM1833os6jMHCZijfDGh8blWI2nthjOLbr/KQKQhkIqOXKwdkVLY5x4/c78L8dV3eZ647SqurWC/N8kr5r4LvfwIDAQABAoIBABTPHSUHURJzBeVIW5bGDVi3PP5E4Tdpnjl4uJNRM/ytb46jdqcxTyCiBW4EXchIRtZbYelKEHZvANSzfwTaLwnLhh0KNwxrbkyrJF5MIREX9EhDqkjbPEBW0D1UzDfXORsFf5848H8urrg0WF5CG4ZDVd7i3P0HLmPQTMwqgSYo2pLexcj0LtiZZqJ6ta9kxAiJniZyoNshRJnAZMMnFYRhy/eDF+L6sJPHieYgwiQFU5e0CK9UgsLmmOQWCKWtPgvxOhqlbcTz1pJAqkyzOC0wK/ydJpVAh9RUqf46rEDFzL/l90ZOir3AMlYJIHf4PX0TWchXjFW7bbHn5Zvk1xECgYEAzpuGDfaerUl8QziD6F/OoIz1/EZwSumErCH2NXYMBcCyzKu4fBqVqj5tcLsNx42v6kAGaERAQqaC5ZZ9ZNhXiWasHAermQqv8DtlYVCUih4e87dX1/xTF5TzR8RhLwHPADd1rRafCKJMD9X6Qquer5LmSST8ej3mJ4mrflw837cCgYEAzsCoqFenGlCvAZoQrekxS1VmGJDCKBQ7LlbOwQaUkD4I23rjbAHG8J51jmaQQ4epm6lU0JLSma/LKp8dl9oDEP09vcgKj6xuHMZV+EmsA5c181zMrGoH+tSZiWQZjSmJVhd5T147vnbUunTbGKlOQByD0tWM913Dm2dqB3goXnkCgYBZax4dtPr/7KoHPdJ5I939xoQ/5wx6n454IUq54JlbdAbuZfO2Ypsbz2D2RT61ezEDpSogvklBj2dfjj4/AxL/uJwMlZVC60kyI8LA12syS88Bk/xE0kP0FNcl3GxjN9krMtWPUBcMWZGp2OYzLKvFOULJrWRIU7nkqsS6L5l5CQKBgBa/tg8HzfgkRo1LkWhBT041sE0lqGdWioh3vroYakJQwRK9O8bHj0cseEzZ1ifIBo59HDry3L9SS21+Inhx4YJ+CswV9auHUnpSDGWMXaPrgGEtpcuWwxgDSn2GiRUyK81QOeXUvYggdRmq/+x/vH9rY8nP+3nAVGSGBXGa8/4pAoGBAMB7EOk/RnsgQ+SotHbvgv18S0lbJuWsLYGnNp8EcuPxDIxz29fOFH94qzVOwAkk5cbHvAl3/5sl3SelmKM9LXhcOT+1zxoavyAYyVeAGZsrbBmbzj9yeZON0gHtpF3dMWxiguyWuiiHM/pL92gKzlyIXryC3andL/y8/6VpWbtt - isConsensus: true + signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== + encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== space: gcTTL: 60 syncPeriod: 10 storage: path: db +metric: + addr: "" +log: + production: false + defaultLevel: "" + namedLevels: {} diff --git a/etc/configs/client1.yml b/etc/configs/client1.yml new file mode 100755 index 00000000..2daba25c --- /dev/null +++ b/etc/configs/client1.yml @@ -0,0 +1,36 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4630 + tls: false +account: + peerId: 12D3KooWC2SctmKSLWqmzsKCpQBo4iqNzbZhWivM3jbhovB4JFug + signingKey: Maen+w6qwWuS79RZyMbuW7wnWAox0+rMinAb/gsOSl8gz2BLCfMlwXjlo8NLKfFFZFNUzl0ANTxbrK45Be7CPw== + encryptionKey: MIIEowIBAAKCAQEAonOsG0DzAzGlR7cd0u31DS0xoHihxdfJwut5JMtLKqGwkUC5RM+/eTa96hKYp8ED6B8Q4ZBhmt2gQnOUQJpoAnJ6uU/HgQVVhsJD7uMQcyVWr2KZbRK2GAohxOiW8JaB8pLiIRJbOxaeIu8dGRTrTTxYnh4IbIUgMu5x3iPW1/6YT/LCN1r/CBgHnPLtxMjAdUYzz9+LC13sZJsanUot83MTgl+5unEPh+ogbrSJ6P8FAAWW8HHD5lUSSb2l8NFRafYWP4o3vF9fqtmpt5I2nK6PaNh+4YXB7CX8Nak3AYuSO/aLGUtZMGYv9Qqwewjk/ewEGNWz33D/Hve8+hctXQIDAQABAoIBAQCNY7/XuJ/Jl9wSnv4GJ7Ww0jTvRg8G8tlYHTpDG+1AHZpf0cVubqJoDY0dvTHAT+3miaNXryJEd8CUFaRi1gDQoHLP9u/dC5d0wn/92wLmNQlNfLOsiyyRn7/kccttepF/XvgRcLiWpQjdvt/EhMCHaI54kAsk6Hkt2vqgLPFA66MH/5AMyf+8RmouYvc1m8jPUVmkIZVkoO4/6kh0tZS+rGdjxB65zDaoBx6CcXAMkTWe27Ce87vfGwCRySGVGRg7RuTJQR8VO3oSmsPVIZ8A48fKPQvryrl/5ztvE35lL4i3pdIbd/CJ9zTKIEM4nyPWSmxsaxs1yIllsj3BFpDBAoGBAMzWUEBYm5FH6wG2GXigkou4VSUBAoKCi5XmA2bwCUZx6CaG4uk43cbYpkbLpIRchfLHAeVCiaOYe5VFvYMth6o+OICEKfXWEwGqjtWeHkyIQIZ1Yo+BKk1rbzkYa/n3a7Mw+C6HsweFq1v01eTChmMr/PF6trFQiJJhTGkGKS2/AoGBAMsHKMEmgw1/hRqiEai73AVLSzXGoHSUWsM1vV05EzDyoxkk8Q/+sJR/BOp4HvJidXiM9B0hSOBhkPZjP3TZSQTKXwMGY+Hcs0XhwGxV5Eb9XdbD5rhCT6eVUeQeP9W9J34RdobJauG1Ld9E1U0nKEI+ls6VZf6/k+ixDOa3TaPjAoGADI+7/iYw7Bjf9YvoRfh65CyatBk6wSwmSTwAy2g++V304Z/1/F1rZE1W7RKB9UgDQt8nY5rP/ANW2NGdDJVXM357Uo5IUHYfVkPSXJFExGa6pkQ+lhRStsq22GaCAKNGrId9QMU7mmN9HbeHAm9XdG93JIvk9jy9E1T6LZqeHdsCgYAXsvQ856PwlWwSGcz550PdklZrJo5gTVjy5HkAQsNMuWX0b218MnymONV4ESF7paaUtc9g/xukpX7oY9lqaFqvpnfEwKA0IzEB/UIa40PMTZMAmMl7xLHLnBB9ElLdPkE35A3z2dsSEbYTE9PaN7HpWaj84E+RlwdK6C/bVpZHhQKBgBv8Up6nOfQyW4jiRo5CPOzXPYu+tXfsV0lKbYAjlp3rcczsi/BPXF6tLZ74/f5Cp2NJxx1GIitjqGzZ1mhkB8Eimuw1o+uNRBRh5BcmQTXPTxrrbOsYzjBJNb7n9HcHlGivcmDooxP7TgRJydEiFdpoBhjU+7yGJTJk7YdDLI3I +apiServer: + port: "8090" +nodes: + - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + address: 127.0.0.1:4430 + signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== + encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy + - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y + address: 127.0.0.1:4431 + signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== + encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= + - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd + address: 127.0.0.1:4432 + signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== + encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== +space: + gcTTL: 60 + syncPeriod: 10 +storage: + path: db +metric: + addr: "" +log: + production: false + defaultLevel: "" + namedLevels: {} diff --git a/etc/configs/client2.yml b/etc/configs/client2.yml new file mode 100755 index 00000000..da9cf18e --- /dev/null +++ b/etc/configs/client2.yml @@ -0,0 +1,36 @@ +anytype: + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec +grpcServer: + listenAddrs: + - 127.0.0.1:4631 + tls: false +account: + peerId: 12D3KooWEycQPaaTbsZJ2rfZ7cKNFB57o44kKukwKkb7mUCo4Agh + signingKey: 2Lxt8Qy52wZHC1T/5zYvT3o4LhZY++4d0Km2gOj5R1hMqMH+Knnt+8cBGONe9r0QdtiXom/AxzWFFf0ol0bBOg== + encryptionKey: MIIEpQIBAAKCAQEAwsGthwrb3RDzzmnbgQ4OubKCYEfTWSor0Q3Q9R+atV5llOivw7OGoXZ9c2W51oqlSIfwkWPLb1MPq+sE3pUsLeU09lmpBIBWKVg+MMEMXbBKMV/8qvVjr6HLNCMgKqBf4Nvfpv7Cgy1QoXrE4YjGzRTAlyREJoSQVAGHT9hpy/QDlW0VdwAvHpWrxRcd+Ro8dY87wWFIS2tEhjWMSra9sSFeOOaelSfPwki33beqZog0p22s4pIONrU4EoZvvs/43LrxxaoqWwX15u8+Agh1Z62llDDPke9tul80lW8x+UIiuXjcUkvdaAd0xJ85rrmwCCeLrjQ1yoJmqk5idgysKwIDAQABAoIBAGV+Gxk57nQZBoU2Iz7w/XmGbm0QYTKhSG5Mfe2QB8amp9dfH2GkJ+/y2NOPWrZUUGgo95Q85mJgbdVQx5vbL0fHn78V4H/JBZ3ML7SmlfQpD7EFbZ4F/WokrcnA2F1+cBi1XKshLmq/7boJSZqi9b8gJnFdY+qSwMgWd9aDWDcBTMVmtjpnxdp9AH1vC1pF8IjOM8SG+z3Wln0CX7dKeeB8xMohqNDd5/nWIXgjKyhUNZL7hKz+H27UzGMidF3W5CHi5u6BYqzkAvagQF+1+tVwjgRUp3pZdf/7Nlw9rImACPXi2kA3zpjRxnBNZWnjmPxt+6ISIzi3ZAmmpA5YmbECgYEA0ewToWwF2kHnUFCh/rm1lsH+jKR1McyuNhTM2gx1LO+IJ+GCHd5POMjBzdowbLv0BgTT7ncARwfryznkbJM/SZ+Llf5oDfsuRmf/8AnatLv9Yt/YYg3Uk+s9Wl6FG2I+Hb0WcLLAWBpV0ZhH5JI/dZepsRezoTnWnC4t98g3cpkCgYEA7YFqk4JFiKH7xdZ9UQJS2p2Ho9OWG00Yi9ddwxp+JtuHWRWo2zaRKiHBamXWPFQPmWrNURHB+NtjXMLQahVrxqg88SoKnIiRo7U1m0e6TNBzsSlkmD+2+co0u0ECxe9gxIBJkE56kR6Wl06VKLJ7HwcK6DjeMRN3UrIyBM4qE2MCgYEAhdKctRQ7KudGgfHVQ6C5/XCQSLJyr5uPF5Ts/rhgXpQY1WuyWj4lfMqmmgdVRYwQRWIAhQ3B1IZdMAIo93prJxEZmDZFuVv+JQ4Zn7l4fi01nDmdJO0yLlYRl7GX41wewzCOxKt/aOro+KO+eR0ubVWQ7P9yGP7ZLFlYHpS5nEkCgYEAxWnO9nFP7rQFnHoei9lMmR5bglb67BJ3FrWa3/MDbLUImYmhYyTGIKkSJagkHN0aYkEeDAagnoNs4cukhKjtfqCUlziEvXve4p5awokqV3Lk1xs63DoJkzL6BbOR5IiGfI7Nlr9ErZ8pOPc+kCdao32tGT07ors1cW1gmhHrc1UCgYEAn3pEkmfJL+ufWYZ/t685mrdUqhp/HcwXTByPLSIr+nP6xXod94uusufVTuMXfYzKgnmsIlt8zk1wu2kSJJUcQjL5Q5rK8suYnJB0Z+x5wa2XTwajThPK29DSpjTY4qjOx7ZCgaZuwJNIFzxp0QrV6QA/0y1CmvhpPYiW2wesug0= +apiServer: + port: "8091" +nodes: + - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + address: 127.0.0.1:4430 + signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== + encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy + - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y + address: 127.0.0.1:4431 + signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== + encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= + - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd + address: 127.0.0.1:4432 + signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== + encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== +space: + gcTTL: 60 + syncPeriod: 10 +storage: + path: db +metric: + addr: "" +log: + production: false + defaultLevel: "" + namedLevels: {} diff --git a/etc/configs/cons1.yml b/etc/configs/cons1.yml index ad573de0..fa8d4430 100755 --- a/etc/configs/cons1.yml +++ b/etc/configs/cons1.yml @@ -3,9 +3,9 @@ grpcServer: - 127.0.0.1:4530 tls: false account: - peerId: 12D3KooWJpE9AtG4RX4Dwm4vhrCGqiUhKj6Mvbqj2V4rV4diyksT - signingKey: 6tA9VizrAMtsZlzBXXnsg+LzwSwBLU7oiVP1qOHN4PaFsBslV0nt2aKBXfcfxp17V/bvydNfyYbGu50F6spLCg== - encryptionKey: MIIEowIBAAKCAQEAtsYet7J4bNo9zSPFZVFkkInUoAW7os8PtZH6qMUEOKcLAi1PDbkBBCmzHdfuzik8H8DgQl36/0gCqRPM6nhQlbF59mV7brI8/kH3Eiw0rxqWAe0+C6CzDyEqtKC7pJyC3FJe0MZRRtDXiDYlVurHrsW22fA03rJY5++eW6bXiqL7WB44zxMrztkvPljlhDf2XTAcrZWI10oXKjSZMW051Figbhdl06R1ZiW1F1LmUEd3ufiYoevpq8jAHWIToTZrYNX0sfrdNaf/CPCq9ZDSqISf8CZ/bE1VxYRPEnjmX1hZQ132S1KCEQwpBWxpcvePonEMPGp+5F7h4k+46f16vQIDAQABAoIBAEa8np7Rv7HBNTHzqi3wNk+KSHQ2Q8xa/uVyveQbe+rBG42YI4RYGYCW8u+V5qJ7av2PFDwbS00JfZ4aP7BvKCEHMwCdfgv1h42P0iOCYFF0pKHSQ7UUWLh+SZzmqDipKixC5NdAKaySnxfkfMcKzoVhl8b5JD0cITSClHM8Oyc4DR5DeB9MlgrVqV/fcdzR10J6TeEPyJjs7CF+Y4OFUEf8FnNxfx5btWm8dIxRMiFUqdI1SVHmOJo0wO2z36RKZ2f8eHApafpJ/1MWccCCSB34Kry4WjDLn8yfOZ5GavXKDVKnE2won5ZhpZGTaLVHLR8QzvkzuBHDk1j1kSi2RjECgYEAzwjnJc5F8XdOkNNPKpftnUVlijhEx0lSknL/j1wIE7bdqbGvIhW+OlIP3bc6O5h0QGSoB71cAiurzro9rsZnSZ4qqjyeGh55j8I4RoZHGDu8BoUOXzrIL1nw3JWxrsNxu5hV9bcYAOJDG9BOcm7F9g00+f+p2zR7BvZMYm3d0vsCgYEA4gBSbChHTMHs15wppaTqV5iQEbfAU/oweRBnflQTHVdezMDt85BpZv0ik2vTuhMJuiaISMvb5l2fHI+LIKoZgCBfymQ50Yv6dZqOMeY5XwUQiQ8DtVtoetYBwwPIS3hSntTu/a4Q9tZbmmWYG6rZ7X58UrtVHY5DfFMS8MOrO6cCgYEAgDkGV57KKMN4cC+/DyUrL8VEHve8eSSLNFJuvs4D3pnZ7Pgz/Es1Fo+ubeXF9hT0otD0VF7NtjZv4Mft3enZHHoN+IM0c/690PA7xEnzjCmqyOrtPMN+Kf1tNGCtvAwly0aMrnKoNhvr7jTz8OF0T3BciBz0iOOW8nfmVOuwf7MCgYB9va4eDR72XuMWZwVo6uOTTwfBQ9oXHxk/ElhymfZ0mbrd8u2xWQS7z1UgbprDaXo8/tlOn1W+yxIOwvKmft1nQxvosHDW3KnCKva4Xp5G9rtndloa2ju8NDuQtBcJnm1hf5lkvSclHsiik6nYoutTTs9+/El0A0Ya8uGT4Vnw+wKBgDq6yliV5g56J3+gHB4w8yQSoIx4AjHoGkYbaVNiCNLfH02VVIGINnlBk+6xurHUwBg68cAsMSAPWqky3BMvhpAAoyPDBycrWEYKHvKvVsH5R0JRDymVJ3UHJVzCp49+CHIoOElnR+IueVluljtxTrB4JgJj0NOLKOHiTNHW6emJ + peerId: 12D3KooWAB7hjh7KWdLz1nxkb8VQ4BU9ZfMwjAFNyBB9NnJCw7AP + signingKey: vE+fJjNKXf7y8hW7IXerySK+Fr8b/9WRThM5/tBxww4FUNczjvzd67XXrdvOdZtYQ+QTDfwItNbLwbzLTEMOeA== + encryptionKey: MIIEowIBAAKCAQEAtYh4UPVQGLUx9sGYEbItTysmrM/MIpNHnZQaGhEROw6n3Uta5NI6nUCQ7IvqGB9ewNKOsED+7zY2QjZ0RGB/qn7cdRbizxDydx+UxFZy18J2aN4zbK2eoxwn16pGVk6asatzChcfYnI11Is3T9p+5/+gqqfhb2NYA2xU09g4V1nnsyZYWCj4mHcz+AHjhCjFrp53XXp/A8KkBC/gzPH1ic4sRxtjAXG5De/d3YpSD7ejnc/YeifilOJj7wPBo+DkpEZHGu/tRYQgDBWlVIc3oQ+KygXsC/inGODrhg0tLlVSLYFdTsktweKyCA9LKR1y/JNC6F8HbqN9ke/ENsvlSQIDAQABAoIBADmHWyHE7DI4UfIyHeAVyDgbo7EGVVnrtLlicvcpy30cwuPlepOjcAHfsU3VdUVZw6x1zdRbdK8YTg+jtCrrLeo5M+JDc3NNmplXv8yM3O41aVMIf+GEEA7+4D1/b7TwSiPeAqIC++Y17YtC5y9+PdOF9kO+2jlzkTPcg/Fyx0Ae7CIXnfZNZwsZo6fyhstYH6bKe1pJuJeWxQmSMXZO34Nz1qXpTu/E8cevu0iQtAOfyXEzB90i0+JdEe7Ckp3Pv9iCBTMVEZJgNRfXHdyuTr6e0/Tjl5ezUJg3IE7tlP2B251j8cC8nUNuXL34aZ1FPwLKf+OUkTJp+7cGdA8BMwECgYEA1NcKU7/wgT+vfv8i+ENrz75DCRt6MJ1R5agkApjed5T1ExYk7Y/qVBVNOCZeK37z9ehCJ7zft711g4o9XB4FZF8gJFD7TBbK9XzljuIcYartPdRYuugv5T0/xTb3xKQp20xPBmgLO/ZazPrRq83dEISwBXsx3o2t2leQLUm/bmkCgYEA2lg5QTPuZQYplDCeiwmH3C2wo5VMwQQyfT/EfMJ8wkBKoe1ndCLNxPvFramD7gJs6iG4nwynOcdBCpmlxvSm4qQo8AEWNcexRZPVCenw6dgjOvRswfeodZcM++HHByaAy9PtSX6YM70py6GbjV1DKreR9BkFT/C1wyosxKZno+ECgYEAoVr1RVC58AJr9YdO54+VaEUBZSIjnD9oGwdBZYanAVk4AmRDUqZMK7qKdAsCUU9JfB+8J4wUvqMvN63RnshTpihHocCTArg03a72CUB568E9YiZdrjTgOpYYhlaJt9YMtWhAcMbn3WmCpOtxkSHcee1d1In04JfgOSsw7mR+cCECgYBUbu9dDnburA5iFtcITxwxgZ2f9Hkk3rmjg4g48oCKIZB6w7JQz7CgrvfHaxjwbhGuDHI3Vw5Hooy9S6M2p57tX6vQ+6qaC2m6zSsB1WxrEUC2aJSyAVIsfsfvk2SCmFoP+Bj3ZbP3tfu2mfzsEpeJqkkPiqlqO1weZ22+cdb8IQKBgA0hmqgzYG3X7/BifZfrm57xNU7d7B/ffjbQwKHMV3Op7VQiCcGc87Da1IJiKmm/lk7lgWNDTxFnkQhqUEYo1/ty9JmNeq/OClTkomYiUE+4xs1H1f3oZ1kT8iJga03dS3XvxJOux8UDjJymqFfs8xBsbvBP0i1grc/fZNLkEtfa mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/cons2.yml b/etc/configs/cons2.yml index 439d7eea..d02439b6 100755 --- a/etc/configs/cons2.yml +++ b/etc/configs/cons2.yml @@ -3,9 +3,9 @@ grpcServer: - 127.0.0.1:4531 tls: false account: - peerId: 12D3KooWCeSDwgmdmLMweWKf1avCqaBYuzEo5GpMGa8MBBskBmen - signingKey: N8fkrWmuf1wVxL72XE4Di8pSyTaQpev/9NV4eznVcfoqB9Z+urz0kg1NKJjWisC/nUGdJP9EB5ZhgPyuQfqIvw== - encryptionKey: MIIEowIBAAKCAQEAx9vwNRbEUtOuJ+UxXsvepKC1VY76RNv+SnnUIQE2/fXo/1iUEevydpWWD+V4n0DjxMsCViOv/kIOuXArIntFqr5xyRdIFE1nbiSW20IppRZO2Vw2fZwN+5DOl1Z3MfiZsqD2dbdtVLuUP9On1lqPWgW/ZHzweCcVMz2ZZ/txubSBE889bbSoZcNlgXS0fJSaw/6XApgtL++sZBqxwp2lkf918ZM3SFuAVHYU56tAOnZrCbyHcbDk4OOJ1q7NzrxWg71S02yqesuDSjIW6BzIXbDVjS2yvhKRJrrKXSIYepIczPwHPPCs7/pCPE7XQ6sYB9d8BL9/U+doLTJToAhHwwIDAQABAoIBAEZwU9bCMWtnw8e31ZCtlci8A20mOTqvto4VJhiDzxfu5bGpTHaMjCYTTpJHtB2cxyoCys4FQfAA5COjTvCWNdWZzYysMfFF3qBJMQoR5Y+TrzKYd3QJ3ju9q7JW/SeVkMYOSQ7wGQ52FifwtwSrYj6+K9iE2FPgom4u1bR6QHjMcAf9+eDJMUJk6Jg62SATPmiiN3b3OktNSsqvAf06I2K3ob1xIai0aTVcNsEoLbdDTejgFkkU3BHIzY9IXYkfipHV9+51cpRFb8q/Hl4boolgSPUSfe+pC11sm56QZZ7Gt0CF2ejhWyJKiyV50B1enKeeVN50KIMdtQn3VpTN65ECgYEA4wiKX/72Ca9wld+moywqexXNuh0a0gS/cWX4gFRv27jUScR7KTDM2jSPUxUK7F/hONOBBevfA7DMxsNNoPHoK9U2iwCO5fI9n1oWrUUjq9srJvrvsz2n2RmQ2deqmosLs0Gbb/I13+qEkunS7pfIIdul0LFE28PK5BhCDRdOUe8CgYEA4VvSWswkXQP4eNDTe78+GItQ78TluU26b+HOnkPRQlA2lUyxkUZT3VJQcgIptJJ20K13NZypJazJm6QELZPd/WcUAWKZqTSQxXUBwPVuoW5Aw0glXCfUOEG+LU+Ue8tvNCdqrAJopuYkYniT1LsQAOYMbJvL9PGkJosJfq4X620CgYARmgLoaGL440IuTHWl5vGwM0OM716586ZIC2jVwjYd6dmDkpkd22u2aybFgTckllZmyncRV3Ul2xo1OsUU+kxOwawF4NgzWbGPXjOt4VNfqpFQ51mYIuqVeVbynLbcXnVcw3RinHuyzYLTxQ8WcmwQu+/CG0xEYYykXIEadLkcvwKBgQCB5RovicFf99ztTnjHuCjDnvGs8lHzaDERMheVM8PXNELx9X3YHbBTPpHt1P9S/KUNjR7MQRtiAuFGG9joqHVpDVQDpGCrngfgOJwlK5Jz7AfaR6h5IN/6+TH0Dg2o+U6Ewj+DG/RUVw0b0SJsmNIVooQAyiBadDnImZWEdjaFVQKBgDnrnvtTMZFvJofnDNSQfOsDru5Mc9c/WRfegq58ocf8XaMMJyFCZGw90TLgQgWkxDCjQ4qnigFRWRCJ3sWB9LS8uFW5Gif0GtP6foL9rWlsQpCUqVApJRnVFFqW5f5FC4MZHtDTlZUk5lDQuvZjvQjJ+3vmusxEUIP0IS74Gr5+ + peerId: 12D3KooWG3ZrWs8Q3kQhQeXp8RWw8FKb2cThTFwD1nbRMMNzf2xW + signingKey: P3a0z3Um1QJ2lEwqcaNkVXwMaFz/Xmb2na4RqO79Lw5ch+KZVitiA6jifmRQkPm4z8e1wIf7Eel1VnhuhRuZVw== + encryptionKey: MIIEowIBAAKCAQEAmi8Yvv3F9/ddTHj4GscR37pr38/NbbDfOtqoervlG1SE7zJglpnwEI6ThhjiAPaXr9UgzvIne8uyGk3ioQz0zDO7X0Omq8wPc1rPDmy4E8mcJyaLyQD4RiTDIuiOKO9+sfWzOwK8zGfPEmBqnfccGOlRelBuREvm4IZnP6HXKetRxxdIexe+W4ZRZN+AuaD5+k3+CPs1l52cIEuBWJ27piiX8oL8indy5gVdNyFPKoTeysJb6pCDYoMoe2EobovSX7hK/28okyJa5SGAVzJpSZCAzn+VljXu4UDMMiWOntiOElsvHuekySg5dAs/LO3lohDdPo9ITAs54P63MHN5cwIDAQABAoIBABDaEu9VF10p2TWxhxSOK4LzgjTdJovVqCBro7x+auUY0MrAC9SKELYOj0s5zwHh8eRS/BoCV5RtSBMd7iZCH0NuaA1afI4MaKfoBfeCpH/tKjcRPHgEth4ciIN5PYh13Lggra1GeFIzCmvsw9puFtEWN0SSI+stDJf/uKs4yiaXmU8xgKplOx97hpTXYLV007mQ2AAZ9ZB3xvUAfADHTtOI46yeO9HMkjoQP2noHyFtKoPXzvra9HBq9M83ohPEE7bew8FAzgxeuiJ+CNU0MSvrW4JVPVcxQbxqsbWJSY+y4HZ6bqFRx9xz6e4iQqVH/XiQWQkET25/iJ+PPi0PP0kCgYEAzF4pY/F8nFnDmi3H4v3p2g8xlLknJaQmvMP0o2L0elZSFJ6YPvL0iOVM1T/5nFjThDOXtux0lSis3C5CZK7LRGQLut8G/5OC290vkwKr+BqqZZ3KIPjBO+RWsOUD2+MBBjQBGQQBy35oQ1Gv+MEUjar7gXRYRhqOY3epQROp0YUCgYEAwSM1cprDtsyqKRpcAFf72D9K0P5F3i/Q0BuitJmV+FaIBa+y1C2H2FxW1rqqScw2zmKeTYz/L4s8paShM8b3SjkzK5dvJ33BN0tqJGVSW06LffLjkh7GVIFQGhPy8qLPDgVY3goDphrnMH6g3gH3ewqRWispu7jwxW6Xn8YIlJcCgYALg1J5muUWOchXKzUTiJJgAnMcmcGm0TSNdcyWV8DGE47UMosJIM69140Yhl4dfLONwwpM980pif0S+lgrK92voKM4h8/xHfJFSJShh4kAlR/8UYNNkDXylc58cKpi/MrV+qAFNMCVIi3lfPiY3ue1g2hfxpoieOSEnf0e+WibsQKBgQCB4tXM7vvz8Yv1/H4m1QTPlzEPgBEorWt2qT8wyaEr07XCbTiMrNoQzXixC/P9kVLCVVw0tz/ej3sHwsGOep5P0kvxYvQj0NSiBRuqwmEyeo4g87nLyNqEdjqSbxwRxSAOQ9ZR7NYrXShhWqeA5j2zB5Zc125HisaRYCCkGKAonQKBgB5CGTP982bbrlmh7bwJFQjQFD6ufXhEr6X8O90yw15sdktp2+bwr+pd85602kqfyN0Ksdm2w43AeV08OxJBQDDSvI6LspS/v3aLXhWT6LPqEtH/Qq8KH4I5UTUsoa2rT/iyAZZ3zjT5W1D63RbPsMsr2ZMTC0bRrCvaCVKfX8ys mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/cons3.yml b/etc/configs/cons3.yml index 86b7f07b..7afa6877 100755 --- a/etc/configs/cons3.yml +++ b/etc/configs/cons3.yml @@ -3,9 +3,9 @@ grpcServer: - 127.0.0.1:4532 tls: false account: - peerId: 12D3KooWGqsXf6No926wTb2eZdauqDcEkoAdKCeYkNzT6yrL3YDE - signingKey: fSLDcrMD0v+yzQwHG+KWdCkuZ5HPvx3vIb+5MecREc5oZJZfrN9P2z8gBU8HqZH/noB4aJRjXRVZsy4M5jPcwQ== - encryptionKey: MIIEowIBAAKCAQEAtM7k4K2spm+GZa13SkRbDuFpPVAdPmR1+aN8IAtmSAISxw2vb4ET47Ck8vDfNtQ9rAvoAn2c3GxJb5Sb0pL9rofeIYYN/qS08zFVP2+FRM5CfuBbfVbwMZ2WvBJD02LzDrHRm0blc8JZDs3xFi5o+mWfeM2SZXVCJHFSNS+v1TRgVfQzu0uKlTD00CLPNz+uzDG6VntlzzEzkF4jVRA59BmkzqAI2ZgtB0cG5ztMnUhnZCX8I0b9CCb0UHjq9j97Xuot/hMAEGVQhNY3iyJx5gAR0t5PipgQZz5j0EXBGPy9T2+VA1QFLHVsUDmd2iV5fmTZziOWn7988Co+ZVMB4wIDAQABAoIBADbQ5ukLHmXTN/7JiXn1oVmwkzRofoU09eN6Yh5g9mBsaH76si5vBrWoD0osJrA7xnrLnUpsBMt69QSkHF3J/KkWPg0R1FpYWxfD5CF4UQIcOmK26GXmnqmcKl/YdcG3pRLWbELUSqo+yLtJSoc8CM2pU6DPSkwCMcxUouTHEVrkpL+Ic6RNGVFjX7E/HjfX9U/BKH0bzwj9CEPQEm9bqc3Zq+EmcE/CHXfRnHdG1cSp65qNHDfyEBjudR4ddItzwpmxLsW6+2Ywlg2pG/vfvRkGvwtAySkVs05J0vrpwSJlPy0NvKAbHAnmNBnmRH4E/myXf5MFcl/nz55J+yJs6QECgYEA1b6fp4FeIBfhvrRseLJeAepZhvmXkRegT61No5632SpcHymz3WnO+EsrL5O6+Ldpa8Gv/LmiVBQjvQeTvx97kINXKPLxmvdxRo+i7YUCAec8AZH7WEkxa0vvi3FLVoZZ8/P5fjvUscwxBeOvwhXnyXsFB9pJduYu6wzuMJe7HmMCgYEA2I1k0YjcTCqOk2Vp1lvHLtnMcmpm4FDMl9uws0HX4UO8i9tXlLZmWqDvPpvhxZVY+1hXOEid67712q1fiei440AGGNxc/xbq8Htw1GBzKyTd9dCQCVwWGX3VUO8EKAKVXdVIyqW+YUqD5PXUcPA41ll+nJdx5Z/liSNJvpxCJoECgYBv2P5GcuXEOXsBhfw09HFI407R2I29ePWEfBVih02BMC9ghzv9or6RIxSIIu/18lQR9RqYTrNo99jzs6FWo6zPJEtZvDc9djoqSENjsvQn9s5pq/AwdKyNjwDcoP5hWpB7nbFyovBb0ZPdlxWDpF7UCbHKOCm1NCJdETka6GscLQKBgQCGh8CcU5PYVY/hjd0kaDvjpTbX1bY3oLqZlMe/dSYyMayOjiNopbAMmXJHyPuHjfKLoyP8OVCyRh3iTlbODB/gPcQL6cp0Rr6Jy4YayhiCMxMZRQpWZjjseTnuX66LVJ+KfZgNHM6bDnnF4dqqlvIYZ9y6V3NQnfcxLRUBL34BAQKBgElDMZD0rP/u6Xch33udIlzdai30QUNWS9MgSrPBz1s8+u1e0g3UnbfCH7e5q0ofSmd+Ot21i03cLgUgJAFmoVmoJ794aveBo/bPbDrlbolxOUX4dFODvvOKzCcUHeOJzc9JE/Ci3LuHyEcqv49uRIe4BFc8c/ssDpj9h7Cyx+qq + peerId: 12D3KooWS6PKUYH6Jedkjsut9ajgWSvn53Qz1LLACoPJX6dUbtCg + signingKey: 11vXVlqQr2e/XMKALUPhMgnJEtZ1HKaDerxXvhNvYfXx1ZWt16PoEMpy/+ZHA1gw3ErI9+2/6auhjGC9InHskQ== + encryptionKey: MIIEpAIBAAKCAQEAy4PQ8dL0gUmtumZQ3GBmHW7CHsuu/VIMWZSmfEIWgMDqrUDkIQxOZ0+hEDUbtCbAdbklgVmvFWUL/F9frBp14gqyMQG3sG/2l9UsQ3p5Z/jRM/peFCtnUj8Xa4ktsOcKFrjEDuBylqanBCpVXGKMDN5Tx+c8ODaXgdRj4x9vY3BN3w+vxXBXIYDyN6H4SesD988VobW42mveVKl3vaOFDf38LRZUe5T0SUDt4wdeAN/pzpFnH4RR//HYujarhF1yIrs3eVu2ltwrHBQoPTboIW+n13B5eqLVTJcXMAsIM+jA3XNu2ZrgmBLEKn0NZNhAgVvGPwMuUpgFz79rvJvrIwIDAQABAoIBAErRKdZNBGAnUvvMs3tg4Ql+91RU8v7j0/B2yoGx1g39XgjVa0iO+p/WUVLhA09GU8iziQs1ij0mSbK86TIfBClWX03O4NW3Q4Nr9frUop9LhLVEHKPzlOdSlGyPIMIBHd9ei40gjF+/4nSQj5MIE46DiW9bHfNYdnhfOV185/k430Ojm12gi6MMlm9CTysNSdleUlO0udmm5JxkvhosPENLG37Wm8JpbesmPiYZiT+jyu8YOaawAXZeGc8NSDBwovzjAAJ++/yRoKKPcsQUV6EYx47PGibV7aXEwbZ+2133C5tm7KDDfvS7sEQjVBXh9Iea4tmdAu3q/0wn+L5ACpkCgYEA5aIIUDdRUERJly9z0eD+iBA2DRNxi6Lpl/wERMkNWrUhnIVV2wDuKiJK80D5DDbszT/gXvY5oj2diKaakGMkj4UCGyFVRy1/2nvjVUugK5ABf2acWbFrgH00UUuUUwFf4UAjypIsJ4Ue52/l8YTVLAfDWXCw1Bh3h9XznS43gvUCgYEA4uIOAOaZwlLI8OKJcJJsDgJEFfm18tCq3zvC7z1z31CcjG6C30ggE35q5hceznom2gLZBLAMQpwthyLjZoVGESEDBdK6d+qtTN95qz3DBtijVOQ8VuP1q9YLMU2IfFeftlRnaR6eYZpAMh3+/fDXpjKaIYImJQalrivfB4nTVrcCgYEAvheAIkdovLWK5eiWTCuhCSnCVNi/qgRWs0YgkoCM2YYQKO4HwJ/oiGCTAwPKJt5g8RfruTDDTRcMjc69LMGlxlkpASR6380+hbMA4d8U3Hr9gmWDEIzanScIZDPYuU3t/R2Hg221t5Fvn8713xVDEovqnuO2vhzy9jOa04cq1PECgYEAhzuEa0cICQq9GM9+amnsHCF/obWYnOWBo9OEKoNviIEM/qt0OFBORjBI2WKYiyvF8pZV8nRYqm9at7y03Eu96sHJgnQLjySDLVnatJX4pCEGobf0uznfGhBX1YhIPQ0hdlUy2jZU4wpFD1pPvd8LOtXYhvaDc/hVUs51fpHJNVsCgYBUZ9fVCoSni9m/eTlDSsWtk+sL/0LkHT0/ym41wTdeFgefCdZMGFBu91z8Td5ol0yclJjxNr3tGUvINCuSzsM4WRh2f9zSjOka+M841WK31DCUmlhekjmKmYw8Ie147d0P2waVmEIdUs40aCiJW/hcV0ld+H5jg7Od+Yb0rDIWPg== mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/node1.yml b/etc/configs/node1.yml index ecdf4f37..055c93f1 100755 --- a/etc/configs/node1.yml +++ b/etc/configs/node1.yml @@ -5,39 +5,24 @@ grpcServer: - 127.0.0.1:4430 tls: false account: - peerId: 12D3KooWRqbgXAdsP9zzBeKv6qjqmW9qfo7TbQfTi4eYYCcpFBwT - signingKey: 4JPubXZ2chIF3SFYiEGHvdTs7/B+IbrdUCHWYkNH/E7uC9nsnBle8q/FaG/7b6pNKjXukTGaXnDrSixZw343/g== - encryptionKey: MIIEpAIBAAKCAQEA3xGRPt9EXpes27462scV4Wm71KUZ/mqf6re/x8LW+ZPvuuq1R5bj2AhUYj7oamVvqnpO8N3UxOSQB0N3eKtmi/I4M2OdLhkZHKBdGi/XG+eGRcCaM5kGBdot52dgFkqXunnU1h2khCk8XeWrJL2mnm9eSgSzvxExkQQfx3nCwYLq/ZmgGT+wBHZECxIlzxjpcgGjnCCIthb409YUitF/tnkwkcM9KBZJFJyJxTAmPaISrcpb30xNfxjuI4khst/s55XYsptyqRLzWMvr3fKUg2qN+GUCv4uAEQYLOGde0nVLq7zqofkH3jqXta13q1zi5OBiW75dCXmjtCtdBeMcNwIDAQABAoIBABV/b+wLQF+NZo9W6f0jqqwqsHtx3etzAy5vvv/VezpaU4REEmxv0k2Dn/5H6cY3OGfJmcoE1viSvn60tdLfUeay1U++jetfZ9gmbFKVwbliusIGKdZHLRlrSXk/sTb0wWKrUyO/f5dtEfBKrg/AZ0plmUSw51HGqmw7ZYSn62kSstB3VKEiM0nWQAh2D9R4APMaaBEo3XPJ+l706T+VPK07rD9oBdQmEkhA2Dks1jYzWVGeMY1aNhndPPVKy34BcYJa+z8X41bwUDsE4mNFId2nPVofgaGJiby4A/3adlvLzosBC5kYxj/V9icNH/iEYtwVV2rIjPLXgt54k1L8SQECgYEA5OWewIuAluIIt7RnClmpd6LPQAc24NsfaC+edGj63b1m9VPV1Vyve/+Mp642FUbp1zmFeTfTBOg+577rnrlI2Arfy1vRrHrSRFLEXfyGA6SSpssvDrHmJtJBh/H3kUgLeqsQlX+ov8mtZEelUF2oWSbmP9k5JaoXoN67gGVrAiECgYEA+XtHB2sZOWV8jOCN6ZU4GfjjymNtCRsH2jWs1fBJ5Sfpei9TK/ZemJ7n+vnANiFLycNoQ00EFlOYaTBCCig+vc6/jX+Ecmh4fUb/ZAuYx+GOA1TltcD+OWBrUEqNdrXwICtUWo8/m+As+ntbCmDSZRUIGRny/N549sGEipufA1cCgYEAsA6NlLu4JFWnLuVre+KLHqHzluP1qe3gslouHovAqV1NG9Vn27x2nYFpxm+Q2by5j/mGWD4/6L5Z5BZNVMBe7w0uJVRyaZ/uqu6ea0wYKCUlR3VwtHTQ+XsvPEk4il5Htgptrw+J1DpjS4Zv+OiQ3EG3R9Tkx7uUgP/QaGmZbQECgYAT2xvsGzoGt20SSU0CKj4s0wJOOVuUPfKCC4OWA2neMy8B6oJUHWep/fu4negOZtgBVuwVbyvEGyMmPBEFfe6AbNQSDvQbpvTwA5aP/9xJDEqhOUCPFq0lI+dmnIhlylUyOkCcdIo7fbwWs3qreMlGAkaCuO398jbubLh/z6L4QQKBgQDKUzTECIr75cLiFbUFxcseYFZEc1weYtlp3E28H0rceSD1GakQfu0osi294lLFzWbc4JfZ29F2rFnOAeZ55f4AtFh5xxoY2robre7C5pOklG5zTcHXakvqdWXPtYfi0o2dI/JBRNnS14ZDJqVmROGmMXsdm1et/qARKBI86wORUw== + peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== + encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy apiServer: port: "8080" nodes: - - peerId: 12D3KooWRqbgXAdsP9zzBeKv6qjqmW9qfo7TbQfTi4eYYCcpFBwT + - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz address: 127.0.0.1:4430 - signingKey: 4JPubXZ2chIF3SFYiEGHvdTs7/B+IbrdUCHWYkNH/E7uC9nsnBle8q/FaG/7b6pNKjXukTGaXnDrSixZw343/g== - encryptionKey: MIIEpAIBAAKCAQEA3xGRPt9EXpes27462scV4Wm71KUZ/mqf6re/x8LW+ZPvuuq1R5bj2AhUYj7oamVvqnpO8N3UxOSQB0N3eKtmi/I4M2OdLhkZHKBdGi/XG+eGRcCaM5kGBdot52dgFkqXunnU1h2khCk8XeWrJL2mnm9eSgSzvxExkQQfx3nCwYLq/ZmgGT+wBHZECxIlzxjpcgGjnCCIthb409YUitF/tnkwkcM9KBZJFJyJxTAmPaISrcpb30xNfxjuI4khst/s55XYsptyqRLzWMvr3fKUg2qN+GUCv4uAEQYLOGde0nVLq7zqofkH3jqXta13q1zi5OBiW75dCXmjtCtdBeMcNwIDAQABAoIBABV/b+wLQF+NZo9W6f0jqqwqsHtx3etzAy5vvv/VezpaU4REEmxv0k2Dn/5H6cY3OGfJmcoE1viSvn60tdLfUeay1U++jetfZ9gmbFKVwbliusIGKdZHLRlrSXk/sTb0wWKrUyO/f5dtEfBKrg/AZ0plmUSw51HGqmw7ZYSn62kSstB3VKEiM0nWQAh2D9R4APMaaBEo3XPJ+l706T+VPK07rD9oBdQmEkhA2Dks1jYzWVGeMY1aNhndPPVKy34BcYJa+z8X41bwUDsE4mNFId2nPVofgaGJiby4A/3adlvLzosBC5kYxj/V9icNH/iEYtwVV2rIjPLXgt54k1L8SQECgYEA5OWewIuAluIIt7RnClmpd6LPQAc24NsfaC+edGj63b1m9VPV1Vyve/+Mp642FUbp1zmFeTfTBOg+577rnrlI2Arfy1vRrHrSRFLEXfyGA6SSpssvDrHmJtJBh/H3kUgLeqsQlX+ov8mtZEelUF2oWSbmP9k5JaoXoN67gGVrAiECgYEA+XtHB2sZOWV8jOCN6ZU4GfjjymNtCRsH2jWs1fBJ5Sfpei9TK/ZemJ7n+vnANiFLycNoQ00EFlOYaTBCCig+vc6/jX+Ecmh4fUb/ZAuYx+GOA1TltcD+OWBrUEqNdrXwICtUWo8/m+As+ntbCmDSZRUIGRny/N549sGEipufA1cCgYEAsA6NlLu4JFWnLuVre+KLHqHzluP1qe3gslouHovAqV1NG9Vn27x2nYFpxm+Q2by5j/mGWD4/6L5Z5BZNVMBe7w0uJVRyaZ/uqu6ea0wYKCUlR3VwtHTQ+XsvPEk4il5Htgptrw+J1DpjS4Zv+OiQ3EG3R9Tkx7uUgP/QaGmZbQECgYAT2xvsGzoGt20SSU0CKj4s0wJOOVuUPfKCC4OWA2neMy8B6oJUHWep/fu4negOZtgBVuwVbyvEGyMmPBEFfe6AbNQSDvQbpvTwA5aP/9xJDEqhOUCPFq0lI+dmnIhlylUyOkCcdIo7fbwWs3qreMlGAkaCuO398jbubLh/z6L4QQKBgQDKUzTECIr75cLiFbUFxcseYFZEc1weYtlp3E28H0rceSD1GakQfu0osi294lLFzWbc4JfZ29F2rFnOAeZ55f4AtFh5xxoY2robre7C5pOklG5zTcHXakvqdWXPtYfi0o2dI/JBRNnS14ZDJqVmROGmMXsdm1et/qARKBI86wORUw== - - peerId: 12D3KooWFYTh59WMXGLDqS8EXfTjHvrS9uXrcYJuE6yDyL1hh45R + signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== + encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy + - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y address: 127.0.0.1:4431 - signingKey: g673H1+gh/KSbRat4m+E+UBTxEmcbxNJ2ZEwdBnQKiFVExLIU7FUXhx7F7xw2QJOw4CInWK6tNZZRNAzOWcD7A== - encryptionKey: MIIEpgIBAAKCAQEAwrKCiqwW7ZGgxfG/t/GgPZ/shmbXEtZjDiZKuLugfSOedERYdsPZ4PmPZkVxo1rIoZjZOnoo7qeC5LWk1A0N33LudQF7Qg50O0QyiV5QTRxkv9IUvAeXyUR5TrxD5oRdFKuCbyDUQYaoAOYCBeqSI1ub5HdFt1fDMqgHXVW/p9kMwHEXpHM7ZaARFf5ri9/FIIodb5+IkduSK3/qBPlvt6dy2MlKlHRkzHef4q8YFKuDyzsyF7fdtjhhHk6p86JBnMaQpP+mi3e+qUxhdWEIY1s7Jo1Yal+GDQ0NtRrZp4GdlpFT7Kgp1Sm5OzSrtEQduluc0GWJFAVpolHg8e7QlQIDAQABAoIBAQCTZjIOalqxYR8mvO84g2WdQgX/erw5NrWncLYBRYsrMlw0Ccovn/bDrCw0cT6nPYPHU8Ch1PpIM+mU3S/8miV2lbySOJzoVakJdYgNF6oTtvtPfezUrarsZTqxsTZ2vp75lx8YovIO6bMnevrtH7mjqydKwEG3nGnbX/qzXsfKeeZgd4kvnjlxGTDUen12Pl0kPLcBgyckZLDJmXYtvxuK1sZTjifyHoeGVYpOOLYi3rRSEoZnVS4z/fM1sG5aUM6eA/7HaXDAe5sT0rgmPt0mu6Mo13dF3rWkP/MCqEVdBLfQLXEfqKp/9QuZ7szdsM0b0WPDXP/YXDLALLvL5/vBAoGBAOPeOrG+JyyS85//wKy+ZRZND5IdxBWoPDfItKnQJtMzOMiYcpwF0J0j3VqdulQlz4zX0Zly0iEYtFtNozVLStDn4IPrqg/vJI+vkikDrY/r1lseVFGR0euVtpRth3BybzhR9llfqK1tuR7cCg7NaxnoIkwtbZDumKDPRoXSQmAvAoGBANq76w8ZMdduxQhroE4Hs4uP5g3Yx9bDlimwGBwX0afGoO82kvgxpol4Z/3sXC7dAKoBqLTTpVDq44AkMhSXgT/CGALsebRxqc45orafe3s+rTFoQsR8eXu9pRw6TxjwATMMxZHjIkV2DeQuKIOTZcvd9E1PVmUB3VSwihje7oZ7AoGBAJGSi1S58jTbvKBetyykhdf1axkhwv9C9xV8N061F9idRI2CNtXOMTPykZsuYLcZYLrNta2eWPej3LTnqHiHnUhQmnIsv/xl/ql8tJdXLi5fsBWODrf9vGoQvw+b2YbQ1JTaZ9M49X22Nymr0REb0mw+jIq2CuUoSIGTaa5cYOMpAoGBAK6tnZUsKKqDsmP8F0PZUKAmpbDvKwAup8/Y6hgdSXfz3vfKHGqKtBVai6mzxRZDtdEOjB0EXCQXwODHhxr8tuIk7aoAEV1x3Apt6qxvBlyw+/zV52Qkh5uzIpU9V4dxu3N6Qpkzy12vXn6YAhC5eHTrZrsKndMCPy/v4Ajml5PbAoGBAKugn3Gh4BLUOW9Tvnc9UIwITp8p8+Dx9yQJugHSDzBFGuAZ1FUciCrK8SGarDCyyzY+XBKVuNZEj7D4P2+JiTKv8nweRVj0DdXYUwIsX6cWgPF5i8dm0Nl5PbsR27L+TxficuO4IQRHMz+Loho5itbSuDY9Y07PvKLKJfu7Cd9l - - peerId: 12D3KooWHgeiz7EyY59t5fEZnkdg2gJxk3YvJmxpVibEcX2EtUcp + signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== + encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= + - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd address: 127.0.0.1:4432 - signingKey: Tr1OaCpnYVkdeuyoBHAETn3DHWbQZELK2x5xuvd5301045GYTnQdWWT/05UB61dmu1NcY4yznm90baj36GrgUQ== - encryptionKey: MIIEpAIBAAKCAQEA6FzTxWImBPJL+dhVbCUWqcuxBmbR7npbgHNOTJFh38InqxEkGwrulenCyy7bewIQXLMfzxroxm17GpWWV3hMcAzQUOojUSylJPguhrWOOtsJyxxDXyG7MEleaFX51MF+SNEo9ivBYbbwJiFrGv9tGW6D4dGSMl1Xf8yKyKWCJVBah0Pzc57I8e93qOZjaCHRmsgC7DdzD8FyIPnAuxYxNs8iSaYPP/UjcZT/SA+Ldu0vyNxdnHCSs/+3FwbmPyhYrn+uBOUUidfzraVn9ra/xtcCZQXbf4fhJ6iwfp0wJoaDU5akN40910XGQqbF6FLfqZZx220vIcJkHc3McbtiaQIDAQABAoIBAQDjTLMIOduxKQgzTnE5igpibNQty/T+UQkjXSgx9GGGzlmZmPn1zjrXwUUBF0QyTzGMTNkH8m3UdZJfzga0aAR188Lv9Co6JO8je/efZQjOACjTXEF3VPrU4GCOtdPfUKxlNN3Z+bGBEcBXvIcWcNjbcOVnyGc4B2Eprf/xCR6Hufa289Awnf1ixe33VdlBMsuua7qc+gydRF9BNpvTop7n4bGkrPJkpuNp1063QEh6Gi9Za5gM+bd573FsYMhHdECcSWS1ogtTTNsVyLPo+x/Naj1pC3UTmAFXyiseeVJ82ibMCOBywr13I0WlknNoxGevU/een4sxX4K3CFH0YGZRAoGBAPVz2qhTDSplq0EVnUVEINfvNTEDLgUMBbdrwpO6FeMR/QBohGB+Yzoen4rBNqnLOOSsetaWYN1u2XgyA9RyL6wnO7hOhlpgY9m5+CCKOwKhPwIBGOOsaFwKLzwDcACK8rg5S/EGDRYCT2SfKv2bSdyLxVt4bXjvMZBQ0lt86R8tAoGBAPJY+Yb5vwiyMlQk16spB/KoQ/hZmjuWUt6tIDf/B9/LM/vMfguJJRq+tmBa2JxvYmUj3lIt7Sg5RiFECIiZ9MW3H7rCu+SHRN5HaDjKOkFX8qTTPJJu5LyBcCnHHxQBi4t5bVTAbKfpBXTi7lr5aAhUIztUVc9Poyz9mm410TWtAoGBAPCaOnLZxoQS2UaZW2r0l4VUNL3wsgG8gTYFadzJgn7tuSXXTjwQaFAmiJnJQD48uW5fLKKBEj69VGugC2UK8XQ9mSrXvpeE+RwKUhIDrkirq0nZrX4wGLRwP1ECxZ2ilr7DW4/OMLGsXgryg3/J4yNP14wMhrMPNXST5UBNN2+ZAoGAcfb7aMjbWBiMaFtm/DtwXGFajVh9mhXn5IVfiFWq+0fQq1GP2Jbm1vvmQcuW34HVsKA8dULZqre8TfpzVOGpZKzoA+h9eUtPTIQh88rNuFrGZVJcwrPZZvgrqcnUyJCtcappiphuwEtpYH0y/58XmAsRAl53d+UIZCjiTX+LYYUCgYBWuUASFeKBWp8/jRO6xgcKT7DErnMZr3TRYkduH9miIlqhx4NH+K/hkgkIFk77ov1swj2XrPL/rMMtWDRsn8fvwhRYkU25FCNAdmSg3G2iaW3Pd99d/fsdJtE+VjVQv58R6nxp5aiVH2rX9l/tspdUsupoYdFDDHYDkL+lIu2ZIA== - - peerId: 12D3KooWJpE9AtG4RX4Dwm4vhrCGqiUhKj6Mvbqj2V4rV4diyksT - address: 127.0.0.1:4530 - signingKey: 6tA9VizrAMtsZlzBXXnsg+LzwSwBLU7oiVP1qOHN4PaFsBslV0nt2aKBXfcfxp17V/bvydNfyYbGu50F6spLCg== - encryptionKey: MIIEowIBAAKCAQEAtsYet7J4bNo9zSPFZVFkkInUoAW7os8PtZH6qMUEOKcLAi1PDbkBBCmzHdfuzik8H8DgQl36/0gCqRPM6nhQlbF59mV7brI8/kH3Eiw0rxqWAe0+C6CzDyEqtKC7pJyC3FJe0MZRRtDXiDYlVurHrsW22fA03rJY5++eW6bXiqL7WB44zxMrztkvPljlhDf2XTAcrZWI10oXKjSZMW051Figbhdl06R1ZiW1F1LmUEd3ufiYoevpq8jAHWIToTZrYNX0sfrdNaf/CPCq9ZDSqISf8CZ/bE1VxYRPEnjmX1hZQ132S1KCEQwpBWxpcvePonEMPGp+5F7h4k+46f16vQIDAQABAoIBAEa8np7Rv7HBNTHzqi3wNk+KSHQ2Q8xa/uVyveQbe+rBG42YI4RYGYCW8u+V5qJ7av2PFDwbS00JfZ4aP7BvKCEHMwCdfgv1h42P0iOCYFF0pKHSQ7UUWLh+SZzmqDipKixC5NdAKaySnxfkfMcKzoVhl8b5JD0cITSClHM8Oyc4DR5DeB9MlgrVqV/fcdzR10J6TeEPyJjs7CF+Y4OFUEf8FnNxfx5btWm8dIxRMiFUqdI1SVHmOJo0wO2z36RKZ2f8eHApafpJ/1MWccCCSB34Kry4WjDLn8yfOZ5GavXKDVKnE2won5ZhpZGTaLVHLR8QzvkzuBHDk1j1kSi2RjECgYEAzwjnJc5F8XdOkNNPKpftnUVlijhEx0lSknL/j1wIE7bdqbGvIhW+OlIP3bc6O5h0QGSoB71cAiurzro9rsZnSZ4qqjyeGh55j8I4RoZHGDu8BoUOXzrIL1nw3JWxrsNxu5hV9bcYAOJDG9BOcm7F9g00+f+p2zR7BvZMYm3d0vsCgYEA4gBSbChHTMHs15wppaTqV5iQEbfAU/oweRBnflQTHVdezMDt85BpZv0ik2vTuhMJuiaISMvb5l2fHI+LIKoZgCBfymQ50Yv6dZqOMeY5XwUQiQ8DtVtoetYBwwPIS3hSntTu/a4Q9tZbmmWYG6rZ7X58UrtVHY5DfFMS8MOrO6cCgYEAgDkGV57KKMN4cC+/DyUrL8VEHve8eSSLNFJuvs4D3pnZ7Pgz/Es1Fo+ubeXF9hT0otD0VF7NtjZv4Mft3enZHHoN+IM0c/690PA7xEnzjCmqyOrtPMN+Kf1tNGCtvAwly0aMrnKoNhvr7jTz8OF0T3BciBz0iOOW8nfmVOuwf7MCgYB9va4eDR72XuMWZwVo6uOTTwfBQ9oXHxk/ElhymfZ0mbrd8u2xWQS7z1UgbprDaXo8/tlOn1W+yxIOwvKmft1nQxvosHDW3KnCKva4Xp5G9rtndloa2ju8NDuQtBcJnm1hf5lkvSclHsiik6nYoutTTs9+/El0A0Ya8uGT4Vnw+wKBgDq6yliV5g56J3+gHB4w8yQSoIx4AjHoGkYbaVNiCNLfH02VVIGINnlBk+6xurHUwBg68cAsMSAPWqky3BMvhpAAoyPDBycrWEYKHvKvVsH5R0JRDymVJ3UHJVzCp49+CHIoOElnR+IueVluljtxTrB4JgJj0NOLKOHiTNHW6emJ - isConsensus: true - - peerId: 12D3KooWCeSDwgmdmLMweWKf1avCqaBYuzEo5GpMGa8MBBskBmen - address: 127.0.0.1:4531 - signingKey: N8fkrWmuf1wVxL72XE4Di8pSyTaQpev/9NV4eznVcfoqB9Z+urz0kg1NKJjWisC/nUGdJP9EB5ZhgPyuQfqIvw== - encryptionKey: MIIEowIBAAKCAQEAx9vwNRbEUtOuJ+UxXsvepKC1VY76RNv+SnnUIQE2/fXo/1iUEevydpWWD+V4n0DjxMsCViOv/kIOuXArIntFqr5xyRdIFE1nbiSW20IppRZO2Vw2fZwN+5DOl1Z3MfiZsqD2dbdtVLuUP9On1lqPWgW/ZHzweCcVMz2ZZ/txubSBE889bbSoZcNlgXS0fJSaw/6XApgtL++sZBqxwp2lkf918ZM3SFuAVHYU56tAOnZrCbyHcbDk4OOJ1q7NzrxWg71S02yqesuDSjIW6BzIXbDVjS2yvhKRJrrKXSIYepIczPwHPPCs7/pCPE7XQ6sYB9d8BL9/U+doLTJToAhHwwIDAQABAoIBAEZwU9bCMWtnw8e31ZCtlci8A20mOTqvto4VJhiDzxfu5bGpTHaMjCYTTpJHtB2cxyoCys4FQfAA5COjTvCWNdWZzYysMfFF3qBJMQoR5Y+TrzKYd3QJ3ju9q7JW/SeVkMYOSQ7wGQ52FifwtwSrYj6+K9iE2FPgom4u1bR6QHjMcAf9+eDJMUJk6Jg62SATPmiiN3b3OktNSsqvAf06I2K3ob1xIai0aTVcNsEoLbdDTejgFkkU3BHIzY9IXYkfipHV9+51cpRFb8q/Hl4boolgSPUSfe+pC11sm56QZZ7Gt0CF2ejhWyJKiyV50B1enKeeVN50KIMdtQn3VpTN65ECgYEA4wiKX/72Ca9wld+moywqexXNuh0a0gS/cWX4gFRv27jUScR7KTDM2jSPUxUK7F/hONOBBevfA7DMxsNNoPHoK9U2iwCO5fI9n1oWrUUjq9srJvrvsz2n2RmQ2deqmosLs0Gbb/I13+qEkunS7pfIIdul0LFE28PK5BhCDRdOUe8CgYEA4VvSWswkXQP4eNDTe78+GItQ78TluU26b+HOnkPRQlA2lUyxkUZT3VJQcgIptJJ20K13NZypJazJm6QELZPd/WcUAWKZqTSQxXUBwPVuoW5Aw0glXCfUOEG+LU+Ue8tvNCdqrAJopuYkYniT1LsQAOYMbJvL9PGkJosJfq4X620CgYARmgLoaGL440IuTHWl5vGwM0OM716586ZIC2jVwjYd6dmDkpkd22u2aybFgTckllZmyncRV3Ul2xo1OsUU+kxOwawF4NgzWbGPXjOt4VNfqpFQ51mYIuqVeVbynLbcXnVcw3RinHuyzYLTxQ8WcmwQu+/CG0xEYYykXIEadLkcvwKBgQCB5RovicFf99ztTnjHuCjDnvGs8lHzaDERMheVM8PXNELx9X3YHbBTPpHt1P9S/KUNjR7MQRtiAuFGG9joqHVpDVQDpGCrngfgOJwlK5Jz7AfaR6h5IN/6+TH0Dg2o+U6Ewj+DG/RUVw0b0SJsmNIVooQAyiBadDnImZWEdjaFVQKBgDnrnvtTMZFvJofnDNSQfOsDru5Mc9c/WRfegq58ocf8XaMMJyFCZGw90TLgQgWkxDCjQ4qnigFRWRCJ3sWB9LS8uFW5Gif0GtP6foL9rWlsQpCUqVApJRnVFFqW5f5FC4MZHtDTlZUk5lDQuvZjvQjJ+3vmusxEUIP0IS74Gr5+ - isConsensus: true - - peerId: 12D3KooWGqsXf6No926wTb2eZdauqDcEkoAdKCeYkNzT6yrL3YDE - address: 127.0.0.1:4532 - signingKey: fSLDcrMD0v+yzQwHG+KWdCkuZ5HPvx3vIb+5MecREc5oZJZfrN9P2z8gBU8HqZH/noB4aJRjXRVZsy4M5jPcwQ== - encryptionKey: MIIEowIBAAKCAQEAtM7k4K2spm+GZa13SkRbDuFpPVAdPmR1+aN8IAtmSAISxw2vb4ET47Ck8vDfNtQ9rAvoAn2c3GxJb5Sb0pL9rofeIYYN/qS08zFVP2+FRM5CfuBbfVbwMZ2WvBJD02LzDrHRm0blc8JZDs3xFi5o+mWfeM2SZXVCJHFSNS+v1TRgVfQzu0uKlTD00CLPNz+uzDG6VntlzzEzkF4jVRA59BmkzqAI2ZgtB0cG5ztMnUhnZCX8I0b9CCb0UHjq9j97Xuot/hMAEGVQhNY3iyJx5gAR0t5PipgQZz5j0EXBGPy9T2+VA1QFLHVsUDmd2iV5fmTZziOWn7988Co+ZVMB4wIDAQABAoIBADbQ5ukLHmXTN/7JiXn1oVmwkzRofoU09eN6Yh5g9mBsaH76si5vBrWoD0osJrA7xnrLnUpsBMt69QSkHF3J/KkWPg0R1FpYWxfD5CF4UQIcOmK26GXmnqmcKl/YdcG3pRLWbELUSqo+yLtJSoc8CM2pU6DPSkwCMcxUouTHEVrkpL+Ic6RNGVFjX7E/HjfX9U/BKH0bzwj9CEPQEm9bqc3Zq+EmcE/CHXfRnHdG1cSp65qNHDfyEBjudR4ddItzwpmxLsW6+2Ywlg2pG/vfvRkGvwtAySkVs05J0vrpwSJlPy0NvKAbHAnmNBnmRH4E/myXf5MFcl/nz55J+yJs6QECgYEA1b6fp4FeIBfhvrRseLJeAepZhvmXkRegT61No5632SpcHymz3WnO+EsrL5O6+Ldpa8Gv/LmiVBQjvQeTvx97kINXKPLxmvdxRo+i7YUCAec8AZH7WEkxa0vvi3FLVoZZ8/P5fjvUscwxBeOvwhXnyXsFB9pJduYu6wzuMJe7HmMCgYEA2I1k0YjcTCqOk2Vp1lvHLtnMcmpm4FDMl9uws0HX4UO8i9tXlLZmWqDvPpvhxZVY+1hXOEid67712q1fiei440AGGNxc/xbq8Htw1GBzKyTd9dCQCVwWGX3VUO8EKAKVXdVIyqW+YUqD5PXUcPA41ll+nJdx5Z/liSNJvpxCJoECgYBv2P5GcuXEOXsBhfw09HFI407R2I29ePWEfBVih02BMC9ghzv9or6RIxSIIu/18lQR9RqYTrNo99jzs6FWo6zPJEtZvDc9djoqSENjsvQn9s5pq/AwdKyNjwDcoP5hWpB7nbFyovBb0ZPdlxWDpF7UCbHKOCm1NCJdETka6GscLQKBgQCGh8CcU5PYVY/hjd0kaDvjpTbX1bY3oLqZlMe/dSYyMayOjiNopbAMmXJHyPuHjfKLoyP8OVCyRh3iTlbODB/gPcQL6cp0Rr6Jy4YayhiCMxMZRQpWZjjseTnuX66LVJ+KfZgNHM6bDnnF4dqqlvIYZ9y6V3NQnfcxLRUBL34BAQKBgElDMZD0rP/u6Xch33udIlzdai30QUNWS9MgSrPBz1s8+u1e0g3UnbfCH7e5q0ofSmd+Ot21i03cLgUgJAFmoVmoJ794aveBo/bPbDrlbolxOUX4dFODvvOKzCcUHeOJzc9JE/Ci3LuHyEcqv49uRIe4BFc8c/ssDpj9h7Cyx+qq - isConsensus: true + signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== + encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== space: gcTTL: 60 syncPeriod: 10 diff --git a/etc/configs/node2.yml b/etc/configs/node2.yml index aff7ddf0..b4168434 100755 --- a/etc/configs/node2.yml +++ b/etc/configs/node2.yml @@ -5,39 +5,24 @@ grpcServer: - 127.0.0.1:4431 tls: false account: - peerId: 12D3KooWFYTh59WMXGLDqS8EXfTjHvrS9uXrcYJuE6yDyL1hh45R - signingKey: g673H1+gh/KSbRat4m+E+UBTxEmcbxNJ2ZEwdBnQKiFVExLIU7FUXhx7F7xw2QJOw4CInWK6tNZZRNAzOWcD7A== - encryptionKey: MIIEpgIBAAKCAQEAwrKCiqwW7ZGgxfG/t/GgPZ/shmbXEtZjDiZKuLugfSOedERYdsPZ4PmPZkVxo1rIoZjZOnoo7qeC5LWk1A0N33LudQF7Qg50O0QyiV5QTRxkv9IUvAeXyUR5TrxD5oRdFKuCbyDUQYaoAOYCBeqSI1ub5HdFt1fDMqgHXVW/p9kMwHEXpHM7ZaARFf5ri9/FIIodb5+IkduSK3/qBPlvt6dy2MlKlHRkzHef4q8YFKuDyzsyF7fdtjhhHk6p86JBnMaQpP+mi3e+qUxhdWEIY1s7Jo1Yal+GDQ0NtRrZp4GdlpFT7Kgp1Sm5OzSrtEQduluc0GWJFAVpolHg8e7QlQIDAQABAoIBAQCTZjIOalqxYR8mvO84g2WdQgX/erw5NrWncLYBRYsrMlw0Ccovn/bDrCw0cT6nPYPHU8Ch1PpIM+mU3S/8miV2lbySOJzoVakJdYgNF6oTtvtPfezUrarsZTqxsTZ2vp75lx8YovIO6bMnevrtH7mjqydKwEG3nGnbX/qzXsfKeeZgd4kvnjlxGTDUen12Pl0kPLcBgyckZLDJmXYtvxuK1sZTjifyHoeGVYpOOLYi3rRSEoZnVS4z/fM1sG5aUM6eA/7HaXDAe5sT0rgmPt0mu6Mo13dF3rWkP/MCqEVdBLfQLXEfqKp/9QuZ7szdsM0b0WPDXP/YXDLALLvL5/vBAoGBAOPeOrG+JyyS85//wKy+ZRZND5IdxBWoPDfItKnQJtMzOMiYcpwF0J0j3VqdulQlz4zX0Zly0iEYtFtNozVLStDn4IPrqg/vJI+vkikDrY/r1lseVFGR0euVtpRth3BybzhR9llfqK1tuR7cCg7NaxnoIkwtbZDumKDPRoXSQmAvAoGBANq76w8ZMdduxQhroE4Hs4uP5g3Yx9bDlimwGBwX0afGoO82kvgxpol4Z/3sXC7dAKoBqLTTpVDq44AkMhSXgT/CGALsebRxqc45orafe3s+rTFoQsR8eXu9pRw6TxjwATMMxZHjIkV2DeQuKIOTZcvd9E1PVmUB3VSwihje7oZ7AoGBAJGSi1S58jTbvKBetyykhdf1axkhwv9C9xV8N061F9idRI2CNtXOMTPykZsuYLcZYLrNta2eWPej3LTnqHiHnUhQmnIsv/xl/ql8tJdXLi5fsBWODrf9vGoQvw+b2YbQ1JTaZ9M49X22Nymr0REb0mw+jIq2CuUoSIGTaa5cYOMpAoGBAK6tnZUsKKqDsmP8F0PZUKAmpbDvKwAup8/Y6hgdSXfz3vfKHGqKtBVai6mzxRZDtdEOjB0EXCQXwODHhxr8tuIk7aoAEV1x3Apt6qxvBlyw+/zV52Qkh5uzIpU9V4dxu3N6Qpkzy12vXn6YAhC5eHTrZrsKndMCPy/v4Ajml5PbAoGBAKugn3Gh4BLUOW9Tvnc9UIwITp8p8+Dx9yQJugHSDzBFGuAZ1FUciCrK8SGarDCyyzY+XBKVuNZEj7D4P2+JiTKv8nweRVj0DdXYUwIsX6cWgPF5i8dm0Nl5PbsR27L+TxficuO4IQRHMz+Loho5itbSuDY9Y07PvKLKJfu7Cd9l + peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y + signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== + encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= apiServer: port: "8081" nodes: - - peerId: 12D3KooWRqbgXAdsP9zzBeKv6qjqmW9qfo7TbQfTi4eYYCcpFBwT + - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz address: 127.0.0.1:4430 - signingKey: 4JPubXZ2chIF3SFYiEGHvdTs7/B+IbrdUCHWYkNH/E7uC9nsnBle8q/FaG/7b6pNKjXukTGaXnDrSixZw343/g== - encryptionKey: MIIEpAIBAAKCAQEA3xGRPt9EXpes27462scV4Wm71KUZ/mqf6re/x8LW+ZPvuuq1R5bj2AhUYj7oamVvqnpO8N3UxOSQB0N3eKtmi/I4M2OdLhkZHKBdGi/XG+eGRcCaM5kGBdot52dgFkqXunnU1h2khCk8XeWrJL2mnm9eSgSzvxExkQQfx3nCwYLq/ZmgGT+wBHZECxIlzxjpcgGjnCCIthb409YUitF/tnkwkcM9KBZJFJyJxTAmPaISrcpb30xNfxjuI4khst/s55XYsptyqRLzWMvr3fKUg2qN+GUCv4uAEQYLOGde0nVLq7zqofkH3jqXta13q1zi5OBiW75dCXmjtCtdBeMcNwIDAQABAoIBABV/b+wLQF+NZo9W6f0jqqwqsHtx3etzAy5vvv/VezpaU4REEmxv0k2Dn/5H6cY3OGfJmcoE1viSvn60tdLfUeay1U++jetfZ9gmbFKVwbliusIGKdZHLRlrSXk/sTb0wWKrUyO/f5dtEfBKrg/AZ0plmUSw51HGqmw7ZYSn62kSstB3VKEiM0nWQAh2D9R4APMaaBEo3XPJ+l706T+VPK07rD9oBdQmEkhA2Dks1jYzWVGeMY1aNhndPPVKy34BcYJa+z8X41bwUDsE4mNFId2nPVofgaGJiby4A/3adlvLzosBC5kYxj/V9icNH/iEYtwVV2rIjPLXgt54k1L8SQECgYEA5OWewIuAluIIt7RnClmpd6LPQAc24NsfaC+edGj63b1m9VPV1Vyve/+Mp642FUbp1zmFeTfTBOg+577rnrlI2Arfy1vRrHrSRFLEXfyGA6SSpssvDrHmJtJBh/H3kUgLeqsQlX+ov8mtZEelUF2oWSbmP9k5JaoXoN67gGVrAiECgYEA+XtHB2sZOWV8jOCN6ZU4GfjjymNtCRsH2jWs1fBJ5Sfpei9TK/ZemJ7n+vnANiFLycNoQ00EFlOYaTBCCig+vc6/jX+Ecmh4fUb/ZAuYx+GOA1TltcD+OWBrUEqNdrXwICtUWo8/m+As+ntbCmDSZRUIGRny/N549sGEipufA1cCgYEAsA6NlLu4JFWnLuVre+KLHqHzluP1qe3gslouHovAqV1NG9Vn27x2nYFpxm+Q2by5j/mGWD4/6L5Z5BZNVMBe7w0uJVRyaZ/uqu6ea0wYKCUlR3VwtHTQ+XsvPEk4il5Htgptrw+J1DpjS4Zv+OiQ3EG3R9Tkx7uUgP/QaGmZbQECgYAT2xvsGzoGt20SSU0CKj4s0wJOOVuUPfKCC4OWA2neMy8B6oJUHWep/fu4negOZtgBVuwVbyvEGyMmPBEFfe6AbNQSDvQbpvTwA5aP/9xJDEqhOUCPFq0lI+dmnIhlylUyOkCcdIo7fbwWs3qreMlGAkaCuO398jbubLh/z6L4QQKBgQDKUzTECIr75cLiFbUFxcseYFZEc1weYtlp3E28H0rceSD1GakQfu0osi294lLFzWbc4JfZ29F2rFnOAeZ55f4AtFh5xxoY2robre7C5pOklG5zTcHXakvqdWXPtYfi0o2dI/JBRNnS14ZDJqVmROGmMXsdm1et/qARKBI86wORUw== - - peerId: 12D3KooWFYTh59WMXGLDqS8EXfTjHvrS9uXrcYJuE6yDyL1hh45R + signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== + encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy + - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y address: 127.0.0.1:4431 - signingKey: g673H1+gh/KSbRat4m+E+UBTxEmcbxNJ2ZEwdBnQKiFVExLIU7FUXhx7F7xw2QJOw4CInWK6tNZZRNAzOWcD7A== - encryptionKey: MIIEpgIBAAKCAQEAwrKCiqwW7ZGgxfG/t/GgPZ/shmbXEtZjDiZKuLugfSOedERYdsPZ4PmPZkVxo1rIoZjZOnoo7qeC5LWk1A0N33LudQF7Qg50O0QyiV5QTRxkv9IUvAeXyUR5TrxD5oRdFKuCbyDUQYaoAOYCBeqSI1ub5HdFt1fDMqgHXVW/p9kMwHEXpHM7ZaARFf5ri9/FIIodb5+IkduSK3/qBPlvt6dy2MlKlHRkzHef4q8YFKuDyzsyF7fdtjhhHk6p86JBnMaQpP+mi3e+qUxhdWEIY1s7Jo1Yal+GDQ0NtRrZp4GdlpFT7Kgp1Sm5OzSrtEQduluc0GWJFAVpolHg8e7QlQIDAQABAoIBAQCTZjIOalqxYR8mvO84g2WdQgX/erw5NrWncLYBRYsrMlw0Ccovn/bDrCw0cT6nPYPHU8Ch1PpIM+mU3S/8miV2lbySOJzoVakJdYgNF6oTtvtPfezUrarsZTqxsTZ2vp75lx8YovIO6bMnevrtH7mjqydKwEG3nGnbX/qzXsfKeeZgd4kvnjlxGTDUen12Pl0kPLcBgyckZLDJmXYtvxuK1sZTjifyHoeGVYpOOLYi3rRSEoZnVS4z/fM1sG5aUM6eA/7HaXDAe5sT0rgmPt0mu6Mo13dF3rWkP/MCqEVdBLfQLXEfqKp/9QuZ7szdsM0b0WPDXP/YXDLALLvL5/vBAoGBAOPeOrG+JyyS85//wKy+ZRZND5IdxBWoPDfItKnQJtMzOMiYcpwF0J0j3VqdulQlz4zX0Zly0iEYtFtNozVLStDn4IPrqg/vJI+vkikDrY/r1lseVFGR0euVtpRth3BybzhR9llfqK1tuR7cCg7NaxnoIkwtbZDumKDPRoXSQmAvAoGBANq76w8ZMdduxQhroE4Hs4uP5g3Yx9bDlimwGBwX0afGoO82kvgxpol4Z/3sXC7dAKoBqLTTpVDq44AkMhSXgT/CGALsebRxqc45orafe3s+rTFoQsR8eXu9pRw6TxjwATMMxZHjIkV2DeQuKIOTZcvd9E1PVmUB3VSwihje7oZ7AoGBAJGSi1S58jTbvKBetyykhdf1axkhwv9C9xV8N061F9idRI2CNtXOMTPykZsuYLcZYLrNta2eWPej3LTnqHiHnUhQmnIsv/xl/ql8tJdXLi5fsBWODrf9vGoQvw+b2YbQ1JTaZ9M49X22Nymr0REb0mw+jIq2CuUoSIGTaa5cYOMpAoGBAK6tnZUsKKqDsmP8F0PZUKAmpbDvKwAup8/Y6hgdSXfz3vfKHGqKtBVai6mzxRZDtdEOjB0EXCQXwODHhxr8tuIk7aoAEV1x3Apt6qxvBlyw+/zV52Qkh5uzIpU9V4dxu3N6Qpkzy12vXn6YAhC5eHTrZrsKndMCPy/v4Ajml5PbAoGBAKugn3Gh4BLUOW9Tvnc9UIwITp8p8+Dx9yQJugHSDzBFGuAZ1FUciCrK8SGarDCyyzY+XBKVuNZEj7D4P2+JiTKv8nweRVj0DdXYUwIsX6cWgPF5i8dm0Nl5PbsR27L+TxficuO4IQRHMz+Loho5itbSuDY9Y07PvKLKJfu7Cd9l - - peerId: 12D3KooWHgeiz7EyY59t5fEZnkdg2gJxk3YvJmxpVibEcX2EtUcp + signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== + encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= + - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd address: 127.0.0.1:4432 - signingKey: Tr1OaCpnYVkdeuyoBHAETn3DHWbQZELK2x5xuvd5301045GYTnQdWWT/05UB61dmu1NcY4yznm90baj36GrgUQ== - encryptionKey: MIIEpAIBAAKCAQEA6FzTxWImBPJL+dhVbCUWqcuxBmbR7npbgHNOTJFh38InqxEkGwrulenCyy7bewIQXLMfzxroxm17GpWWV3hMcAzQUOojUSylJPguhrWOOtsJyxxDXyG7MEleaFX51MF+SNEo9ivBYbbwJiFrGv9tGW6D4dGSMl1Xf8yKyKWCJVBah0Pzc57I8e93qOZjaCHRmsgC7DdzD8FyIPnAuxYxNs8iSaYPP/UjcZT/SA+Ldu0vyNxdnHCSs/+3FwbmPyhYrn+uBOUUidfzraVn9ra/xtcCZQXbf4fhJ6iwfp0wJoaDU5akN40910XGQqbF6FLfqZZx220vIcJkHc3McbtiaQIDAQABAoIBAQDjTLMIOduxKQgzTnE5igpibNQty/T+UQkjXSgx9GGGzlmZmPn1zjrXwUUBF0QyTzGMTNkH8m3UdZJfzga0aAR188Lv9Co6JO8je/efZQjOACjTXEF3VPrU4GCOtdPfUKxlNN3Z+bGBEcBXvIcWcNjbcOVnyGc4B2Eprf/xCR6Hufa289Awnf1ixe33VdlBMsuua7qc+gydRF9BNpvTop7n4bGkrPJkpuNp1063QEh6Gi9Za5gM+bd573FsYMhHdECcSWS1ogtTTNsVyLPo+x/Naj1pC3UTmAFXyiseeVJ82ibMCOBywr13I0WlknNoxGevU/een4sxX4K3CFH0YGZRAoGBAPVz2qhTDSplq0EVnUVEINfvNTEDLgUMBbdrwpO6FeMR/QBohGB+Yzoen4rBNqnLOOSsetaWYN1u2XgyA9RyL6wnO7hOhlpgY9m5+CCKOwKhPwIBGOOsaFwKLzwDcACK8rg5S/EGDRYCT2SfKv2bSdyLxVt4bXjvMZBQ0lt86R8tAoGBAPJY+Yb5vwiyMlQk16spB/KoQ/hZmjuWUt6tIDf/B9/LM/vMfguJJRq+tmBa2JxvYmUj3lIt7Sg5RiFECIiZ9MW3H7rCu+SHRN5HaDjKOkFX8qTTPJJu5LyBcCnHHxQBi4t5bVTAbKfpBXTi7lr5aAhUIztUVc9Poyz9mm410TWtAoGBAPCaOnLZxoQS2UaZW2r0l4VUNL3wsgG8gTYFadzJgn7tuSXXTjwQaFAmiJnJQD48uW5fLKKBEj69VGugC2UK8XQ9mSrXvpeE+RwKUhIDrkirq0nZrX4wGLRwP1ECxZ2ilr7DW4/OMLGsXgryg3/J4yNP14wMhrMPNXST5UBNN2+ZAoGAcfb7aMjbWBiMaFtm/DtwXGFajVh9mhXn5IVfiFWq+0fQq1GP2Jbm1vvmQcuW34HVsKA8dULZqre8TfpzVOGpZKzoA+h9eUtPTIQh88rNuFrGZVJcwrPZZvgrqcnUyJCtcappiphuwEtpYH0y/58XmAsRAl53d+UIZCjiTX+LYYUCgYBWuUASFeKBWp8/jRO6xgcKT7DErnMZr3TRYkduH9miIlqhx4NH+K/hkgkIFk77ov1swj2XrPL/rMMtWDRsn8fvwhRYkU25FCNAdmSg3G2iaW3Pd99d/fsdJtE+VjVQv58R6nxp5aiVH2rX9l/tspdUsupoYdFDDHYDkL+lIu2ZIA== - - peerId: 12D3KooWJpE9AtG4RX4Dwm4vhrCGqiUhKj6Mvbqj2V4rV4diyksT - address: 127.0.0.1:4530 - signingKey: 6tA9VizrAMtsZlzBXXnsg+LzwSwBLU7oiVP1qOHN4PaFsBslV0nt2aKBXfcfxp17V/bvydNfyYbGu50F6spLCg== - encryptionKey: MIIEowIBAAKCAQEAtsYet7J4bNo9zSPFZVFkkInUoAW7os8PtZH6qMUEOKcLAi1PDbkBBCmzHdfuzik8H8DgQl36/0gCqRPM6nhQlbF59mV7brI8/kH3Eiw0rxqWAe0+C6CzDyEqtKC7pJyC3FJe0MZRRtDXiDYlVurHrsW22fA03rJY5++eW6bXiqL7WB44zxMrztkvPljlhDf2XTAcrZWI10oXKjSZMW051Figbhdl06R1ZiW1F1LmUEd3ufiYoevpq8jAHWIToTZrYNX0sfrdNaf/CPCq9ZDSqISf8CZ/bE1VxYRPEnjmX1hZQ132S1KCEQwpBWxpcvePonEMPGp+5F7h4k+46f16vQIDAQABAoIBAEa8np7Rv7HBNTHzqi3wNk+KSHQ2Q8xa/uVyveQbe+rBG42YI4RYGYCW8u+V5qJ7av2PFDwbS00JfZ4aP7BvKCEHMwCdfgv1h42P0iOCYFF0pKHSQ7UUWLh+SZzmqDipKixC5NdAKaySnxfkfMcKzoVhl8b5JD0cITSClHM8Oyc4DR5DeB9MlgrVqV/fcdzR10J6TeEPyJjs7CF+Y4OFUEf8FnNxfx5btWm8dIxRMiFUqdI1SVHmOJo0wO2z36RKZ2f8eHApafpJ/1MWccCCSB34Kry4WjDLn8yfOZ5GavXKDVKnE2won5ZhpZGTaLVHLR8QzvkzuBHDk1j1kSi2RjECgYEAzwjnJc5F8XdOkNNPKpftnUVlijhEx0lSknL/j1wIE7bdqbGvIhW+OlIP3bc6O5h0QGSoB71cAiurzro9rsZnSZ4qqjyeGh55j8I4RoZHGDu8BoUOXzrIL1nw3JWxrsNxu5hV9bcYAOJDG9BOcm7F9g00+f+p2zR7BvZMYm3d0vsCgYEA4gBSbChHTMHs15wppaTqV5iQEbfAU/oweRBnflQTHVdezMDt85BpZv0ik2vTuhMJuiaISMvb5l2fHI+LIKoZgCBfymQ50Yv6dZqOMeY5XwUQiQ8DtVtoetYBwwPIS3hSntTu/a4Q9tZbmmWYG6rZ7X58UrtVHY5DfFMS8MOrO6cCgYEAgDkGV57KKMN4cC+/DyUrL8VEHve8eSSLNFJuvs4D3pnZ7Pgz/Es1Fo+ubeXF9hT0otD0VF7NtjZv4Mft3enZHHoN+IM0c/690PA7xEnzjCmqyOrtPMN+Kf1tNGCtvAwly0aMrnKoNhvr7jTz8OF0T3BciBz0iOOW8nfmVOuwf7MCgYB9va4eDR72XuMWZwVo6uOTTwfBQ9oXHxk/ElhymfZ0mbrd8u2xWQS7z1UgbprDaXo8/tlOn1W+yxIOwvKmft1nQxvosHDW3KnCKva4Xp5G9rtndloa2ju8NDuQtBcJnm1hf5lkvSclHsiik6nYoutTTs9+/El0A0Ya8uGT4Vnw+wKBgDq6yliV5g56J3+gHB4w8yQSoIx4AjHoGkYbaVNiCNLfH02VVIGINnlBk+6xurHUwBg68cAsMSAPWqky3BMvhpAAoyPDBycrWEYKHvKvVsH5R0JRDymVJ3UHJVzCp49+CHIoOElnR+IueVluljtxTrB4JgJj0NOLKOHiTNHW6emJ - isConsensus: true - - peerId: 12D3KooWCeSDwgmdmLMweWKf1avCqaBYuzEo5GpMGa8MBBskBmen - address: 127.0.0.1:4531 - signingKey: N8fkrWmuf1wVxL72XE4Di8pSyTaQpev/9NV4eznVcfoqB9Z+urz0kg1NKJjWisC/nUGdJP9EB5ZhgPyuQfqIvw== - encryptionKey: MIIEowIBAAKCAQEAx9vwNRbEUtOuJ+UxXsvepKC1VY76RNv+SnnUIQE2/fXo/1iUEevydpWWD+V4n0DjxMsCViOv/kIOuXArIntFqr5xyRdIFE1nbiSW20IppRZO2Vw2fZwN+5DOl1Z3MfiZsqD2dbdtVLuUP9On1lqPWgW/ZHzweCcVMz2ZZ/txubSBE889bbSoZcNlgXS0fJSaw/6XApgtL++sZBqxwp2lkf918ZM3SFuAVHYU56tAOnZrCbyHcbDk4OOJ1q7NzrxWg71S02yqesuDSjIW6BzIXbDVjS2yvhKRJrrKXSIYepIczPwHPPCs7/pCPE7XQ6sYB9d8BL9/U+doLTJToAhHwwIDAQABAoIBAEZwU9bCMWtnw8e31ZCtlci8A20mOTqvto4VJhiDzxfu5bGpTHaMjCYTTpJHtB2cxyoCys4FQfAA5COjTvCWNdWZzYysMfFF3qBJMQoR5Y+TrzKYd3QJ3ju9q7JW/SeVkMYOSQ7wGQ52FifwtwSrYj6+K9iE2FPgom4u1bR6QHjMcAf9+eDJMUJk6Jg62SATPmiiN3b3OktNSsqvAf06I2K3ob1xIai0aTVcNsEoLbdDTejgFkkU3BHIzY9IXYkfipHV9+51cpRFb8q/Hl4boolgSPUSfe+pC11sm56QZZ7Gt0CF2ejhWyJKiyV50B1enKeeVN50KIMdtQn3VpTN65ECgYEA4wiKX/72Ca9wld+moywqexXNuh0a0gS/cWX4gFRv27jUScR7KTDM2jSPUxUK7F/hONOBBevfA7DMxsNNoPHoK9U2iwCO5fI9n1oWrUUjq9srJvrvsz2n2RmQ2deqmosLs0Gbb/I13+qEkunS7pfIIdul0LFE28PK5BhCDRdOUe8CgYEA4VvSWswkXQP4eNDTe78+GItQ78TluU26b+HOnkPRQlA2lUyxkUZT3VJQcgIptJJ20K13NZypJazJm6QELZPd/WcUAWKZqTSQxXUBwPVuoW5Aw0glXCfUOEG+LU+Ue8tvNCdqrAJopuYkYniT1LsQAOYMbJvL9PGkJosJfq4X620CgYARmgLoaGL440IuTHWl5vGwM0OM716586ZIC2jVwjYd6dmDkpkd22u2aybFgTckllZmyncRV3Ul2xo1OsUU+kxOwawF4NgzWbGPXjOt4VNfqpFQ51mYIuqVeVbynLbcXnVcw3RinHuyzYLTxQ8WcmwQu+/CG0xEYYykXIEadLkcvwKBgQCB5RovicFf99ztTnjHuCjDnvGs8lHzaDERMheVM8PXNELx9X3YHbBTPpHt1P9S/KUNjR7MQRtiAuFGG9joqHVpDVQDpGCrngfgOJwlK5Jz7AfaR6h5IN/6+TH0Dg2o+U6Ewj+DG/RUVw0b0SJsmNIVooQAyiBadDnImZWEdjaFVQKBgDnrnvtTMZFvJofnDNSQfOsDru5Mc9c/WRfegq58ocf8XaMMJyFCZGw90TLgQgWkxDCjQ4qnigFRWRCJ3sWB9LS8uFW5Gif0GtP6foL9rWlsQpCUqVApJRnVFFqW5f5FC4MZHtDTlZUk5lDQuvZjvQjJ+3vmusxEUIP0IS74Gr5+ - isConsensus: true - - peerId: 12D3KooWGqsXf6No926wTb2eZdauqDcEkoAdKCeYkNzT6yrL3YDE - address: 127.0.0.1:4532 - signingKey: fSLDcrMD0v+yzQwHG+KWdCkuZ5HPvx3vIb+5MecREc5oZJZfrN9P2z8gBU8HqZH/noB4aJRjXRVZsy4M5jPcwQ== - encryptionKey: MIIEowIBAAKCAQEAtM7k4K2spm+GZa13SkRbDuFpPVAdPmR1+aN8IAtmSAISxw2vb4ET47Ck8vDfNtQ9rAvoAn2c3GxJb5Sb0pL9rofeIYYN/qS08zFVP2+FRM5CfuBbfVbwMZ2WvBJD02LzDrHRm0blc8JZDs3xFi5o+mWfeM2SZXVCJHFSNS+v1TRgVfQzu0uKlTD00CLPNz+uzDG6VntlzzEzkF4jVRA59BmkzqAI2ZgtB0cG5ztMnUhnZCX8I0b9CCb0UHjq9j97Xuot/hMAEGVQhNY3iyJx5gAR0t5PipgQZz5j0EXBGPy9T2+VA1QFLHVsUDmd2iV5fmTZziOWn7988Co+ZVMB4wIDAQABAoIBADbQ5ukLHmXTN/7JiXn1oVmwkzRofoU09eN6Yh5g9mBsaH76si5vBrWoD0osJrA7xnrLnUpsBMt69QSkHF3J/KkWPg0R1FpYWxfD5CF4UQIcOmK26GXmnqmcKl/YdcG3pRLWbELUSqo+yLtJSoc8CM2pU6DPSkwCMcxUouTHEVrkpL+Ic6RNGVFjX7E/HjfX9U/BKH0bzwj9CEPQEm9bqc3Zq+EmcE/CHXfRnHdG1cSp65qNHDfyEBjudR4ddItzwpmxLsW6+2Ywlg2pG/vfvRkGvwtAySkVs05J0vrpwSJlPy0NvKAbHAnmNBnmRH4E/myXf5MFcl/nz55J+yJs6QECgYEA1b6fp4FeIBfhvrRseLJeAepZhvmXkRegT61No5632SpcHymz3WnO+EsrL5O6+Ldpa8Gv/LmiVBQjvQeTvx97kINXKPLxmvdxRo+i7YUCAec8AZH7WEkxa0vvi3FLVoZZ8/P5fjvUscwxBeOvwhXnyXsFB9pJduYu6wzuMJe7HmMCgYEA2I1k0YjcTCqOk2Vp1lvHLtnMcmpm4FDMl9uws0HX4UO8i9tXlLZmWqDvPpvhxZVY+1hXOEid67712q1fiei440AGGNxc/xbq8Htw1GBzKyTd9dCQCVwWGX3VUO8EKAKVXdVIyqW+YUqD5PXUcPA41ll+nJdx5Z/liSNJvpxCJoECgYBv2P5GcuXEOXsBhfw09HFI407R2I29ePWEfBVih02BMC9ghzv9or6RIxSIIu/18lQR9RqYTrNo99jzs6FWo6zPJEtZvDc9djoqSENjsvQn9s5pq/AwdKyNjwDcoP5hWpB7nbFyovBb0ZPdlxWDpF7UCbHKOCm1NCJdETka6GscLQKBgQCGh8CcU5PYVY/hjd0kaDvjpTbX1bY3oLqZlMe/dSYyMayOjiNopbAMmXJHyPuHjfKLoyP8OVCyRh3iTlbODB/gPcQL6cp0Rr6Jy4YayhiCMxMZRQpWZjjseTnuX66LVJ+KfZgNHM6bDnnF4dqqlvIYZ9y6V3NQnfcxLRUBL34BAQKBgElDMZD0rP/u6Xch33udIlzdai30QUNWS9MgSrPBz1s8+u1e0g3UnbfCH7e5q0ofSmd+Ot21i03cLgUgJAFmoVmoJ794aveBo/bPbDrlbolxOUX4dFODvvOKzCcUHeOJzc9JE/Ci3LuHyEcqv49uRIe4BFc8c/ssDpj9h7Cyx+qq - isConsensus: true + signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== + encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== space: gcTTL: 60 syncPeriod: 10 diff --git a/etc/configs/node3.yml b/etc/configs/node3.yml index 3fab7b48..26c460fc 100755 --- a/etc/configs/node3.yml +++ b/etc/configs/node3.yml @@ -5,39 +5,24 @@ grpcServer: - 127.0.0.1:4432 tls: false account: - peerId: 12D3KooWHgeiz7EyY59t5fEZnkdg2gJxk3YvJmxpVibEcX2EtUcp - signingKey: Tr1OaCpnYVkdeuyoBHAETn3DHWbQZELK2x5xuvd5301045GYTnQdWWT/05UB61dmu1NcY4yznm90baj36GrgUQ== - encryptionKey: MIIEpAIBAAKCAQEA6FzTxWImBPJL+dhVbCUWqcuxBmbR7npbgHNOTJFh38InqxEkGwrulenCyy7bewIQXLMfzxroxm17GpWWV3hMcAzQUOojUSylJPguhrWOOtsJyxxDXyG7MEleaFX51MF+SNEo9ivBYbbwJiFrGv9tGW6D4dGSMl1Xf8yKyKWCJVBah0Pzc57I8e93qOZjaCHRmsgC7DdzD8FyIPnAuxYxNs8iSaYPP/UjcZT/SA+Ldu0vyNxdnHCSs/+3FwbmPyhYrn+uBOUUidfzraVn9ra/xtcCZQXbf4fhJ6iwfp0wJoaDU5akN40910XGQqbF6FLfqZZx220vIcJkHc3McbtiaQIDAQABAoIBAQDjTLMIOduxKQgzTnE5igpibNQty/T+UQkjXSgx9GGGzlmZmPn1zjrXwUUBF0QyTzGMTNkH8m3UdZJfzga0aAR188Lv9Co6JO8je/efZQjOACjTXEF3VPrU4GCOtdPfUKxlNN3Z+bGBEcBXvIcWcNjbcOVnyGc4B2Eprf/xCR6Hufa289Awnf1ixe33VdlBMsuua7qc+gydRF9BNpvTop7n4bGkrPJkpuNp1063QEh6Gi9Za5gM+bd573FsYMhHdECcSWS1ogtTTNsVyLPo+x/Naj1pC3UTmAFXyiseeVJ82ibMCOBywr13I0WlknNoxGevU/een4sxX4K3CFH0YGZRAoGBAPVz2qhTDSplq0EVnUVEINfvNTEDLgUMBbdrwpO6FeMR/QBohGB+Yzoen4rBNqnLOOSsetaWYN1u2XgyA9RyL6wnO7hOhlpgY9m5+CCKOwKhPwIBGOOsaFwKLzwDcACK8rg5S/EGDRYCT2SfKv2bSdyLxVt4bXjvMZBQ0lt86R8tAoGBAPJY+Yb5vwiyMlQk16spB/KoQ/hZmjuWUt6tIDf/B9/LM/vMfguJJRq+tmBa2JxvYmUj3lIt7Sg5RiFECIiZ9MW3H7rCu+SHRN5HaDjKOkFX8qTTPJJu5LyBcCnHHxQBi4t5bVTAbKfpBXTi7lr5aAhUIztUVc9Poyz9mm410TWtAoGBAPCaOnLZxoQS2UaZW2r0l4VUNL3wsgG8gTYFadzJgn7tuSXXTjwQaFAmiJnJQD48uW5fLKKBEj69VGugC2UK8XQ9mSrXvpeE+RwKUhIDrkirq0nZrX4wGLRwP1ECxZ2ilr7DW4/OMLGsXgryg3/J4yNP14wMhrMPNXST5UBNN2+ZAoGAcfb7aMjbWBiMaFtm/DtwXGFajVh9mhXn5IVfiFWq+0fQq1GP2Jbm1vvmQcuW34HVsKA8dULZqre8TfpzVOGpZKzoA+h9eUtPTIQh88rNuFrGZVJcwrPZZvgrqcnUyJCtcappiphuwEtpYH0y/58XmAsRAl53d+UIZCjiTX+LYYUCgYBWuUASFeKBWp8/jRO6xgcKT7DErnMZr3TRYkduH9miIlqhx4NH+K/hkgkIFk77ov1swj2XrPL/rMMtWDRsn8fvwhRYkU25FCNAdmSg3G2iaW3Pd99d/fsdJtE+VjVQv58R6nxp5aiVH2rX9l/tspdUsupoYdFDDHYDkL+lIu2ZIA== + peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd + signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== + encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== apiServer: port: "8082" nodes: - - peerId: 12D3KooWRqbgXAdsP9zzBeKv6qjqmW9qfo7TbQfTi4eYYCcpFBwT + - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz address: 127.0.0.1:4430 - signingKey: 4JPubXZ2chIF3SFYiEGHvdTs7/B+IbrdUCHWYkNH/E7uC9nsnBle8q/FaG/7b6pNKjXukTGaXnDrSixZw343/g== - encryptionKey: MIIEpAIBAAKCAQEA3xGRPt9EXpes27462scV4Wm71KUZ/mqf6re/x8LW+ZPvuuq1R5bj2AhUYj7oamVvqnpO8N3UxOSQB0N3eKtmi/I4M2OdLhkZHKBdGi/XG+eGRcCaM5kGBdot52dgFkqXunnU1h2khCk8XeWrJL2mnm9eSgSzvxExkQQfx3nCwYLq/ZmgGT+wBHZECxIlzxjpcgGjnCCIthb409YUitF/tnkwkcM9KBZJFJyJxTAmPaISrcpb30xNfxjuI4khst/s55XYsptyqRLzWMvr3fKUg2qN+GUCv4uAEQYLOGde0nVLq7zqofkH3jqXta13q1zi5OBiW75dCXmjtCtdBeMcNwIDAQABAoIBABV/b+wLQF+NZo9W6f0jqqwqsHtx3etzAy5vvv/VezpaU4REEmxv0k2Dn/5H6cY3OGfJmcoE1viSvn60tdLfUeay1U++jetfZ9gmbFKVwbliusIGKdZHLRlrSXk/sTb0wWKrUyO/f5dtEfBKrg/AZ0plmUSw51HGqmw7ZYSn62kSstB3VKEiM0nWQAh2D9R4APMaaBEo3XPJ+l706T+VPK07rD9oBdQmEkhA2Dks1jYzWVGeMY1aNhndPPVKy34BcYJa+z8X41bwUDsE4mNFId2nPVofgaGJiby4A/3adlvLzosBC5kYxj/V9icNH/iEYtwVV2rIjPLXgt54k1L8SQECgYEA5OWewIuAluIIt7RnClmpd6LPQAc24NsfaC+edGj63b1m9VPV1Vyve/+Mp642FUbp1zmFeTfTBOg+577rnrlI2Arfy1vRrHrSRFLEXfyGA6SSpssvDrHmJtJBh/H3kUgLeqsQlX+ov8mtZEelUF2oWSbmP9k5JaoXoN67gGVrAiECgYEA+XtHB2sZOWV8jOCN6ZU4GfjjymNtCRsH2jWs1fBJ5Sfpei9TK/ZemJ7n+vnANiFLycNoQ00EFlOYaTBCCig+vc6/jX+Ecmh4fUb/ZAuYx+GOA1TltcD+OWBrUEqNdrXwICtUWo8/m+As+ntbCmDSZRUIGRny/N549sGEipufA1cCgYEAsA6NlLu4JFWnLuVre+KLHqHzluP1qe3gslouHovAqV1NG9Vn27x2nYFpxm+Q2by5j/mGWD4/6L5Z5BZNVMBe7w0uJVRyaZ/uqu6ea0wYKCUlR3VwtHTQ+XsvPEk4il5Htgptrw+J1DpjS4Zv+OiQ3EG3R9Tkx7uUgP/QaGmZbQECgYAT2xvsGzoGt20SSU0CKj4s0wJOOVuUPfKCC4OWA2neMy8B6oJUHWep/fu4negOZtgBVuwVbyvEGyMmPBEFfe6AbNQSDvQbpvTwA5aP/9xJDEqhOUCPFq0lI+dmnIhlylUyOkCcdIo7fbwWs3qreMlGAkaCuO398jbubLh/z6L4QQKBgQDKUzTECIr75cLiFbUFxcseYFZEc1weYtlp3E28H0rceSD1GakQfu0osi294lLFzWbc4JfZ29F2rFnOAeZ55f4AtFh5xxoY2robre7C5pOklG5zTcHXakvqdWXPtYfi0o2dI/JBRNnS14ZDJqVmROGmMXsdm1et/qARKBI86wORUw== - - peerId: 12D3KooWFYTh59WMXGLDqS8EXfTjHvrS9uXrcYJuE6yDyL1hh45R + signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== + encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy + - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y address: 127.0.0.1:4431 - signingKey: g673H1+gh/KSbRat4m+E+UBTxEmcbxNJ2ZEwdBnQKiFVExLIU7FUXhx7F7xw2QJOw4CInWK6tNZZRNAzOWcD7A== - encryptionKey: MIIEpgIBAAKCAQEAwrKCiqwW7ZGgxfG/t/GgPZ/shmbXEtZjDiZKuLugfSOedERYdsPZ4PmPZkVxo1rIoZjZOnoo7qeC5LWk1A0N33LudQF7Qg50O0QyiV5QTRxkv9IUvAeXyUR5TrxD5oRdFKuCbyDUQYaoAOYCBeqSI1ub5HdFt1fDMqgHXVW/p9kMwHEXpHM7ZaARFf5ri9/FIIodb5+IkduSK3/qBPlvt6dy2MlKlHRkzHef4q8YFKuDyzsyF7fdtjhhHk6p86JBnMaQpP+mi3e+qUxhdWEIY1s7Jo1Yal+GDQ0NtRrZp4GdlpFT7Kgp1Sm5OzSrtEQduluc0GWJFAVpolHg8e7QlQIDAQABAoIBAQCTZjIOalqxYR8mvO84g2WdQgX/erw5NrWncLYBRYsrMlw0Ccovn/bDrCw0cT6nPYPHU8Ch1PpIM+mU3S/8miV2lbySOJzoVakJdYgNF6oTtvtPfezUrarsZTqxsTZ2vp75lx8YovIO6bMnevrtH7mjqydKwEG3nGnbX/qzXsfKeeZgd4kvnjlxGTDUen12Pl0kPLcBgyckZLDJmXYtvxuK1sZTjifyHoeGVYpOOLYi3rRSEoZnVS4z/fM1sG5aUM6eA/7HaXDAe5sT0rgmPt0mu6Mo13dF3rWkP/MCqEVdBLfQLXEfqKp/9QuZ7szdsM0b0WPDXP/YXDLALLvL5/vBAoGBAOPeOrG+JyyS85//wKy+ZRZND5IdxBWoPDfItKnQJtMzOMiYcpwF0J0j3VqdulQlz4zX0Zly0iEYtFtNozVLStDn4IPrqg/vJI+vkikDrY/r1lseVFGR0euVtpRth3BybzhR9llfqK1tuR7cCg7NaxnoIkwtbZDumKDPRoXSQmAvAoGBANq76w8ZMdduxQhroE4Hs4uP5g3Yx9bDlimwGBwX0afGoO82kvgxpol4Z/3sXC7dAKoBqLTTpVDq44AkMhSXgT/CGALsebRxqc45orafe3s+rTFoQsR8eXu9pRw6TxjwATMMxZHjIkV2DeQuKIOTZcvd9E1PVmUB3VSwihje7oZ7AoGBAJGSi1S58jTbvKBetyykhdf1axkhwv9C9xV8N061F9idRI2CNtXOMTPykZsuYLcZYLrNta2eWPej3LTnqHiHnUhQmnIsv/xl/ql8tJdXLi5fsBWODrf9vGoQvw+b2YbQ1JTaZ9M49X22Nymr0REb0mw+jIq2CuUoSIGTaa5cYOMpAoGBAK6tnZUsKKqDsmP8F0PZUKAmpbDvKwAup8/Y6hgdSXfz3vfKHGqKtBVai6mzxRZDtdEOjB0EXCQXwODHhxr8tuIk7aoAEV1x3Apt6qxvBlyw+/zV52Qkh5uzIpU9V4dxu3N6Qpkzy12vXn6YAhC5eHTrZrsKndMCPy/v4Ajml5PbAoGBAKugn3Gh4BLUOW9Tvnc9UIwITp8p8+Dx9yQJugHSDzBFGuAZ1FUciCrK8SGarDCyyzY+XBKVuNZEj7D4P2+JiTKv8nweRVj0DdXYUwIsX6cWgPF5i8dm0Nl5PbsR27L+TxficuO4IQRHMz+Loho5itbSuDY9Y07PvKLKJfu7Cd9l - - peerId: 12D3KooWHgeiz7EyY59t5fEZnkdg2gJxk3YvJmxpVibEcX2EtUcp + signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== + encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= + - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd address: 127.0.0.1:4432 - signingKey: Tr1OaCpnYVkdeuyoBHAETn3DHWbQZELK2x5xuvd5301045GYTnQdWWT/05UB61dmu1NcY4yznm90baj36GrgUQ== - encryptionKey: MIIEpAIBAAKCAQEA6FzTxWImBPJL+dhVbCUWqcuxBmbR7npbgHNOTJFh38InqxEkGwrulenCyy7bewIQXLMfzxroxm17GpWWV3hMcAzQUOojUSylJPguhrWOOtsJyxxDXyG7MEleaFX51MF+SNEo9ivBYbbwJiFrGv9tGW6D4dGSMl1Xf8yKyKWCJVBah0Pzc57I8e93qOZjaCHRmsgC7DdzD8FyIPnAuxYxNs8iSaYPP/UjcZT/SA+Ldu0vyNxdnHCSs/+3FwbmPyhYrn+uBOUUidfzraVn9ra/xtcCZQXbf4fhJ6iwfp0wJoaDU5akN40910XGQqbF6FLfqZZx220vIcJkHc3McbtiaQIDAQABAoIBAQDjTLMIOduxKQgzTnE5igpibNQty/T+UQkjXSgx9GGGzlmZmPn1zjrXwUUBF0QyTzGMTNkH8m3UdZJfzga0aAR188Lv9Co6JO8je/efZQjOACjTXEF3VPrU4GCOtdPfUKxlNN3Z+bGBEcBXvIcWcNjbcOVnyGc4B2Eprf/xCR6Hufa289Awnf1ixe33VdlBMsuua7qc+gydRF9BNpvTop7n4bGkrPJkpuNp1063QEh6Gi9Za5gM+bd573FsYMhHdECcSWS1ogtTTNsVyLPo+x/Naj1pC3UTmAFXyiseeVJ82ibMCOBywr13I0WlknNoxGevU/een4sxX4K3CFH0YGZRAoGBAPVz2qhTDSplq0EVnUVEINfvNTEDLgUMBbdrwpO6FeMR/QBohGB+Yzoen4rBNqnLOOSsetaWYN1u2XgyA9RyL6wnO7hOhlpgY9m5+CCKOwKhPwIBGOOsaFwKLzwDcACK8rg5S/EGDRYCT2SfKv2bSdyLxVt4bXjvMZBQ0lt86R8tAoGBAPJY+Yb5vwiyMlQk16spB/KoQ/hZmjuWUt6tIDf/B9/LM/vMfguJJRq+tmBa2JxvYmUj3lIt7Sg5RiFECIiZ9MW3H7rCu+SHRN5HaDjKOkFX8qTTPJJu5LyBcCnHHxQBi4t5bVTAbKfpBXTi7lr5aAhUIztUVc9Poyz9mm410TWtAoGBAPCaOnLZxoQS2UaZW2r0l4VUNL3wsgG8gTYFadzJgn7tuSXXTjwQaFAmiJnJQD48uW5fLKKBEj69VGugC2UK8XQ9mSrXvpeE+RwKUhIDrkirq0nZrX4wGLRwP1ECxZ2ilr7DW4/OMLGsXgryg3/J4yNP14wMhrMPNXST5UBNN2+ZAoGAcfb7aMjbWBiMaFtm/DtwXGFajVh9mhXn5IVfiFWq+0fQq1GP2Jbm1vvmQcuW34HVsKA8dULZqre8TfpzVOGpZKzoA+h9eUtPTIQh88rNuFrGZVJcwrPZZvgrqcnUyJCtcappiphuwEtpYH0y/58XmAsRAl53d+UIZCjiTX+LYYUCgYBWuUASFeKBWp8/jRO6xgcKT7DErnMZr3TRYkduH9miIlqhx4NH+K/hkgkIFk77ov1swj2XrPL/rMMtWDRsn8fvwhRYkU25FCNAdmSg3G2iaW3Pd99d/fsdJtE+VjVQv58R6nxp5aiVH2rX9l/tspdUsupoYdFDDHYDkL+lIu2ZIA== - - peerId: 12D3KooWJpE9AtG4RX4Dwm4vhrCGqiUhKj6Mvbqj2V4rV4diyksT - address: 127.0.0.1:4530 - signingKey: 6tA9VizrAMtsZlzBXXnsg+LzwSwBLU7oiVP1qOHN4PaFsBslV0nt2aKBXfcfxp17V/bvydNfyYbGu50F6spLCg== - encryptionKey: MIIEowIBAAKCAQEAtsYet7J4bNo9zSPFZVFkkInUoAW7os8PtZH6qMUEOKcLAi1PDbkBBCmzHdfuzik8H8DgQl36/0gCqRPM6nhQlbF59mV7brI8/kH3Eiw0rxqWAe0+C6CzDyEqtKC7pJyC3FJe0MZRRtDXiDYlVurHrsW22fA03rJY5++eW6bXiqL7WB44zxMrztkvPljlhDf2XTAcrZWI10oXKjSZMW051Figbhdl06R1ZiW1F1LmUEd3ufiYoevpq8jAHWIToTZrYNX0sfrdNaf/CPCq9ZDSqISf8CZ/bE1VxYRPEnjmX1hZQ132S1KCEQwpBWxpcvePonEMPGp+5F7h4k+46f16vQIDAQABAoIBAEa8np7Rv7HBNTHzqi3wNk+KSHQ2Q8xa/uVyveQbe+rBG42YI4RYGYCW8u+V5qJ7av2PFDwbS00JfZ4aP7BvKCEHMwCdfgv1h42P0iOCYFF0pKHSQ7UUWLh+SZzmqDipKixC5NdAKaySnxfkfMcKzoVhl8b5JD0cITSClHM8Oyc4DR5DeB9MlgrVqV/fcdzR10J6TeEPyJjs7CF+Y4OFUEf8FnNxfx5btWm8dIxRMiFUqdI1SVHmOJo0wO2z36RKZ2f8eHApafpJ/1MWccCCSB34Kry4WjDLn8yfOZ5GavXKDVKnE2won5ZhpZGTaLVHLR8QzvkzuBHDk1j1kSi2RjECgYEAzwjnJc5F8XdOkNNPKpftnUVlijhEx0lSknL/j1wIE7bdqbGvIhW+OlIP3bc6O5h0QGSoB71cAiurzro9rsZnSZ4qqjyeGh55j8I4RoZHGDu8BoUOXzrIL1nw3JWxrsNxu5hV9bcYAOJDG9BOcm7F9g00+f+p2zR7BvZMYm3d0vsCgYEA4gBSbChHTMHs15wppaTqV5iQEbfAU/oweRBnflQTHVdezMDt85BpZv0ik2vTuhMJuiaISMvb5l2fHI+LIKoZgCBfymQ50Yv6dZqOMeY5XwUQiQ8DtVtoetYBwwPIS3hSntTu/a4Q9tZbmmWYG6rZ7X58UrtVHY5DfFMS8MOrO6cCgYEAgDkGV57KKMN4cC+/DyUrL8VEHve8eSSLNFJuvs4D3pnZ7Pgz/Es1Fo+ubeXF9hT0otD0VF7NtjZv4Mft3enZHHoN+IM0c/690PA7xEnzjCmqyOrtPMN+Kf1tNGCtvAwly0aMrnKoNhvr7jTz8OF0T3BciBz0iOOW8nfmVOuwf7MCgYB9va4eDR72XuMWZwVo6uOTTwfBQ9oXHxk/ElhymfZ0mbrd8u2xWQS7z1UgbprDaXo8/tlOn1W+yxIOwvKmft1nQxvosHDW3KnCKva4Xp5G9rtndloa2ju8NDuQtBcJnm1hf5lkvSclHsiik6nYoutTTs9+/El0A0Ya8uGT4Vnw+wKBgDq6yliV5g56J3+gHB4w8yQSoIx4AjHoGkYbaVNiCNLfH02VVIGINnlBk+6xurHUwBg68cAsMSAPWqky3BMvhpAAoyPDBycrWEYKHvKvVsH5R0JRDymVJ3UHJVzCp49+CHIoOElnR+IueVluljtxTrB4JgJj0NOLKOHiTNHW6emJ - isConsensus: true - - peerId: 12D3KooWCeSDwgmdmLMweWKf1avCqaBYuzEo5GpMGa8MBBskBmen - address: 127.0.0.1:4531 - signingKey: N8fkrWmuf1wVxL72XE4Di8pSyTaQpev/9NV4eznVcfoqB9Z+urz0kg1NKJjWisC/nUGdJP9EB5ZhgPyuQfqIvw== - encryptionKey: MIIEowIBAAKCAQEAx9vwNRbEUtOuJ+UxXsvepKC1VY76RNv+SnnUIQE2/fXo/1iUEevydpWWD+V4n0DjxMsCViOv/kIOuXArIntFqr5xyRdIFE1nbiSW20IppRZO2Vw2fZwN+5DOl1Z3MfiZsqD2dbdtVLuUP9On1lqPWgW/ZHzweCcVMz2ZZ/txubSBE889bbSoZcNlgXS0fJSaw/6XApgtL++sZBqxwp2lkf918ZM3SFuAVHYU56tAOnZrCbyHcbDk4OOJ1q7NzrxWg71S02yqesuDSjIW6BzIXbDVjS2yvhKRJrrKXSIYepIczPwHPPCs7/pCPE7XQ6sYB9d8BL9/U+doLTJToAhHwwIDAQABAoIBAEZwU9bCMWtnw8e31ZCtlci8A20mOTqvto4VJhiDzxfu5bGpTHaMjCYTTpJHtB2cxyoCys4FQfAA5COjTvCWNdWZzYysMfFF3qBJMQoR5Y+TrzKYd3QJ3ju9q7JW/SeVkMYOSQ7wGQ52FifwtwSrYj6+K9iE2FPgom4u1bR6QHjMcAf9+eDJMUJk6Jg62SATPmiiN3b3OktNSsqvAf06I2K3ob1xIai0aTVcNsEoLbdDTejgFkkU3BHIzY9IXYkfipHV9+51cpRFb8q/Hl4boolgSPUSfe+pC11sm56QZZ7Gt0CF2ejhWyJKiyV50B1enKeeVN50KIMdtQn3VpTN65ECgYEA4wiKX/72Ca9wld+moywqexXNuh0a0gS/cWX4gFRv27jUScR7KTDM2jSPUxUK7F/hONOBBevfA7DMxsNNoPHoK9U2iwCO5fI9n1oWrUUjq9srJvrvsz2n2RmQ2deqmosLs0Gbb/I13+qEkunS7pfIIdul0LFE28PK5BhCDRdOUe8CgYEA4VvSWswkXQP4eNDTe78+GItQ78TluU26b+HOnkPRQlA2lUyxkUZT3VJQcgIptJJ20K13NZypJazJm6QELZPd/WcUAWKZqTSQxXUBwPVuoW5Aw0glXCfUOEG+LU+Ue8tvNCdqrAJopuYkYniT1LsQAOYMbJvL9PGkJosJfq4X620CgYARmgLoaGL440IuTHWl5vGwM0OM716586ZIC2jVwjYd6dmDkpkd22u2aybFgTckllZmyncRV3Ul2xo1OsUU+kxOwawF4NgzWbGPXjOt4VNfqpFQ51mYIuqVeVbynLbcXnVcw3RinHuyzYLTxQ8WcmwQu+/CG0xEYYykXIEadLkcvwKBgQCB5RovicFf99ztTnjHuCjDnvGs8lHzaDERMheVM8PXNELx9X3YHbBTPpHt1P9S/KUNjR7MQRtiAuFGG9joqHVpDVQDpGCrngfgOJwlK5Jz7AfaR6h5IN/6+TH0Dg2o+U6Ewj+DG/RUVw0b0SJsmNIVooQAyiBadDnImZWEdjaFVQKBgDnrnvtTMZFvJofnDNSQfOsDru5Mc9c/WRfegq58ocf8XaMMJyFCZGw90TLgQgWkxDCjQ4qnigFRWRCJ3sWB9LS8uFW5Gif0GtP6foL9rWlsQpCUqVApJRnVFFqW5f5FC4MZHtDTlZUk5lDQuvZjvQjJ+3vmusxEUIP0IS74Gr5+ - isConsensus: true - - peerId: 12D3KooWGqsXf6No926wTb2eZdauqDcEkoAdKCeYkNzT6yrL3YDE - address: 127.0.0.1:4532 - signingKey: fSLDcrMD0v+yzQwHG+KWdCkuZ5HPvx3vIb+5MecREc5oZJZfrN9P2z8gBU8HqZH/noB4aJRjXRVZsy4M5jPcwQ== - encryptionKey: MIIEowIBAAKCAQEAtM7k4K2spm+GZa13SkRbDuFpPVAdPmR1+aN8IAtmSAISxw2vb4ET47Ck8vDfNtQ9rAvoAn2c3GxJb5Sb0pL9rofeIYYN/qS08zFVP2+FRM5CfuBbfVbwMZ2WvBJD02LzDrHRm0blc8JZDs3xFi5o+mWfeM2SZXVCJHFSNS+v1TRgVfQzu0uKlTD00CLPNz+uzDG6VntlzzEzkF4jVRA59BmkzqAI2ZgtB0cG5ztMnUhnZCX8I0b9CCb0UHjq9j97Xuot/hMAEGVQhNY3iyJx5gAR0t5PipgQZz5j0EXBGPy9T2+VA1QFLHVsUDmd2iV5fmTZziOWn7988Co+ZVMB4wIDAQABAoIBADbQ5ukLHmXTN/7JiXn1oVmwkzRofoU09eN6Yh5g9mBsaH76si5vBrWoD0osJrA7xnrLnUpsBMt69QSkHF3J/KkWPg0R1FpYWxfD5CF4UQIcOmK26GXmnqmcKl/YdcG3pRLWbELUSqo+yLtJSoc8CM2pU6DPSkwCMcxUouTHEVrkpL+Ic6RNGVFjX7E/HjfX9U/BKH0bzwj9CEPQEm9bqc3Zq+EmcE/CHXfRnHdG1cSp65qNHDfyEBjudR4ddItzwpmxLsW6+2Ywlg2pG/vfvRkGvwtAySkVs05J0vrpwSJlPy0NvKAbHAnmNBnmRH4E/myXf5MFcl/nz55J+yJs6QECgYEA1b6fp4FeIBfhvrRseLJeAepZhvmXkRegT61No5632SpcHymz3WnO+EsrL5O6+Ldpa8Gv/LmiVBQjvQeTvx97kINXKPLxmvdxRo+i7YUCAec8AZH7WEkxa0vvi3FLVoZZ8/P5fjvUscwxBeOvwhXnyXsFB9pJduYu6wzuMJe7HmMCgYEA2I1k0YjcTCqOk2Vp1lvHLtnMcmpm4FDMl9uws0HX4UO8i9tXlLZmWqDvPpvhxZVY+1hXOEid67712q1fiei440AGGNxc/xbq8Htw1GBzKyTd9dCQCVwWGX3VUO8EKAKVXdVIyqW+YUqD5PXUcPA41ll+nJdx5Z/liSNJvpxCJoECgYBv2P5GcuXEOXsBhfw09HFI407R2I29ePWEfBVih02BMC9ghzv9or6RIxSIIu/18lQR9RqYTrNo99jzs6FWo6zPJEtZvDc9djoqSENjsvQn9s5pq/AwdKyNjwDcoP5hWpB7nbFyovBb0ZPdlxWDpF7UCbHKOCm1NCJdETka6GscLQKBgQCGh8CcU5PYVY/hjd0kaDvjpTbX1bY3oLqZlMe/dSYyMayOjiNopbAMmXJHyPuHjfKLoyP8OVCyRh3iTlbODB/gPcQL6cp0Rr6Jy4YayhiCMxMZRQpWZjjseTnuX66LVJ+KfZgNHM6bDnnF4dqqlvIYZ9y6V3NQnfcxLRUBL34BAQKBgElDMZD0rP/u6Xch33udIlzdai30QUNWS9MgSrPBz1s8+u1e0g3UnbfCH7e5q0ofSmd+Ot21i03cLgUgJAFmoVmoJ794aveBo/bPbDrlbolxOUX4dFODvvOKzCcUHeOJzc9JE/Ci3LuHyEcqv49uRIe4BFc8c/ssDpj9h7Cyx+qq - isConsensus: true + signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== + encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== space: gcTTL: 60 syncPeriod: 10 diff --git a/node/cmd/node.go b/node/cmd/node.go index 6ac28724..1606ac3e 100644 --- a/node/cmd/node.go +++ b/node/cmd/node.go @@ -8,6 +8,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" @@ -91,6 +92,7 @@ func main() { func Bootstrap(a *app.App) { a.Register(account.New()). + Register(metric.New()). Register(storage.New()). Register(nodecache.New(200)). Register(nodeconf.New()). @@ -100,10 +102,4 @@ func Bootstrap(a *app.App) { Register(nodespace.New()). Register(commonspace.New()). Register(server.New()) - - //Register(document.New()). - //Register(message.New()). - //Register(requesthandler.New()). - //Register(treecache.New()). - //Register(api.New()) } diff --git a/util/cmd/nodesgen/gen.go b/util/cmd/nodesgen/gen.go index 6d69ba1e..b3d13b2b 100644 --- a/util/cmd/nodesgen/gen.go +++ b/util/cmd/nodesgen/gen.go @@ -15,7 +15,7 @@ import ( ) var ( - flagNodeMap = flag.String("n", "cmd/nodesgen/nodemap.yml", "path to nodes map file") + flagNodeMap = flag.String("n", "util/cmd/nodesgen/nodemap.yml", "path to nodes map file") flagEtcPath = flag.String("e", "etc", "path to etc directory") ) @@ -27,6 +27,10 @@ type NodesMap struct { Consensus []struct { Addresses []string `yaml:"grpcAddresses"` } + Clients []struct { + Addresses []string `yaml:"grpcAddresses"` + APIPort string `yaml:"apiPort"` + } } func main() { @@ -60,6 +64,15 @@ func main() { nodes = append(nodes, node) } + var clientConfigs []config2.Config + for _, c := range nodesMap.Clients { + cfg, err := genClientConfig(c.Addresses, c.APIPort) + if err != nil { + panic(fmt.Sprintf("could not generate the config file: %s", err.Error())) + } + clientConfigs = append(clientConfigs, cfg) + } + var consConfigs []cconfig.Config for _, n := range nodesMap.Consensus { cfg, err := genConsensusConfig(n.Addresses) @@ -67,19 +80,13 @@ func main() { panic(fmt.Sprintf("could not generate the config file: %s", err.Error())) } consConfigs = append(consConfigs, cfg) - - node := config2.Node{ - PeerId: cfg.Account.PeerId, - Address: cfg.GrpcServer.ListenAddrs[0], - SigningKey: cfg.Account.SigningKey, - EncryptionKey: cfg.Account.EncryptionKey, - IsConsensus: true, - } - nodes = append(nodes, node) } for idx := range configs { configs[idx].Nodes = nodes } + for idx := range clientConfigs { + clientConfigs[idx].Nodes = nodes + } // saving configs configsPath := fmt.Sprintf("%s/configs", *flagEtcPath) @@ -110,6 +117,18 @@ func main() { panic(fmt.Sprintf("could not write the config to file: %v", err)) } } + for idx, cfg := range clientConfigs { + path := fmt.Sprintf("%s/client%d.yml", configsPath, idx+1) + bytes, err := yaml.Marshal(cfg) + if err != nil { + panic(fmt.Sprintf("could not marshal the keys: %v", err)) + } + + err = os.WriteFile(path, bytes, os.ModePerm) + if err != nil { + panic(fmt.Sprintf("could not write the config to file: %v", err)) + } + } for idx, cfg := range consConfigs { path := fmt.Sprintf("%s/cons%d.yml", configsPath, idx+1) bytes, err := yaml.Marshal(cfg) @@ -172,6 +191,54 @@ func genNodeConfig(addresses []string, apiPort string) (config2.Config, error) { }, nil } +func genClientConfig(addresses []string, apiPort string) (config2.Config, error) { + encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) + if err != nil { + return config2.Config{}, err + } + + signKey, _, err := signingkey.GenerateRandomEd25519KeyPair() + if err != nil { + return config2.Config{}, err + } + + encEncKey, err := keys.EncodeKeyToString(encKey) + if err != nil { + return config2.Config{}, err + } + + encSignKey, err := keys.EncodeKeyToString(signKey) + if err != nil { + return config2.Config{}, err + } + + peerID, err := peer.IDFromSigningPubKey(signKey.GetPublic()) + if err != nil { + return config2.Config{}, err + } + + return config2.Config{ + Anytype: config2.Anytype{SwarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec"}, + GrpcServer: config2.GrpcServer{ + ListenAddrs: addresses, + TLS: false, + }, + Storage: config2.Storage{Path: "db"}, + Account: config2.Account{ + PeerId: peerID.String(), + SigningKey: encSignKey, + EncryptionKey: encEncKey, + }, + APIServer: config2.APIServer{ + Port: apiPort, + }, + Space: config2.Space{ + GCTTL: 60, + SyncPeriod: 10, + }, + }, nil +} + func genConsensusConfig(addresses []string) (cconfig.Config, error) { encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) if err != nil { diff --git a/util/cmd/nodesgen/nodemap.yml b/util/cmd/nodesgen/nodemap.yml index ad4e9c80..7cd1f72a 100644 --- a/util/cmd/nodesgen/nodemap.yml +++ b/util/cmd/nodesgen/nodemap.yml @@ -15,3 +15,10 @@ consensus: - "127.0.0.1:4531" - grpcAddresses: - "127.0.0.1:4532" +clients: + - grpcAddresses: + - "127.0.0.1:4630" + apiPort: "8090" + - grpcAddresses: + - "127.0.0.1:4631" + apiPort: "8091" From 6470454221be4a24a829bd8a6e46428200861c14 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 19 Oct 2022 15:07:29 +0200 Subject: [PATCH 162/219] Fix client imports --- .gitignore | 3 ++ client/api/controller.go | 2 +- client/clientspace/clientcache/treecache.go | 30 ++++++++++++++----- client/cmd/client.go | 5 ++-- client/document/service.go | 21 ++----------- .../{ => textdocument}/textdocument.go | 4 +-- client/go.mod | 2 +- common/config/config.go | 4 +++ 8 files changed, 39 insertions(+), 32 deletions(-) rename client/document/{ => textdocument}/textdocument.go (98%) diff --git a/.gitignore b/.gitignore index 97927dad..5d1bd6cc 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,9 @@ # Golang vendor folder vendor +# database +db + # Intelli-J files .idea diff --git a/client/api/controller.go b/client/api/controller.go index 090e43a9..c172603f 100644 --- a/client/api/controller.go +++ b/client/api/controller.go @@ -8,7 +8,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" - "golang.org/x/exp/rand" + "math/rand" ) type Controller interface { diff --git a/client/clientspace/clientcache/treecache.go b/client/clientspace/clientcache/treecache.go index 1a5f4df8..50319cba 100644 --- a/client/clientspace/clientcache/treecache.go +++ b/client/clientspace/clientcache/treecache.go @@ -4,12 +4,13 @@ import ( "context" "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" - "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document/textdocument" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" + "go.uber.org/zap" "time" ) @@ -23,13 +24,29 @@ const spaceKey ctxKey = 0 type treeCache struct { gcttl int cache ocache.OCache - docService document.Service clientService clientspace.Service } type TreeCache interface { treegetter.TreeGetter - GetDocument(ctx context.Context, spaceId, id string) (doc document.TextDocument, err error) + GetDocument(ctx context.Context, spaceId, id string) (doc textdocument.TextDocument, err error) +} + +type updateListener struct { +} + +func (u *updateListener) Update(tree tree.ObjectTree) { + log.With( + zap.Strings("heads", tree.Heads()), + zap.String("tree id", tree.ID())). + Debug("updating tree") +} + +func (u *updateListener) Rebuild(tree tree.ObjectTree) { + log.With( + zap.Strings("heads", tree.Heads()), + zap.String("tree id", tree.ID())). + Debug("rebuilding tree") } func New(ttl int) TreeCache { @@ -48,7 +65,6 @@ func (c *treeCache) Close(ctx context.Context) (err error) { func (c *treeCache) Init(a *app.App) (err error) { c.clientService = a.MustComponent(clientspace.CName).(clientspace.Service) - c.docService = a.MustComponent(document.CName).(document.Service) c.cache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { spaceId := ctx.Value(spaceKey).(string) @@ -56,7 +72,7 @@ func (c *treeCache) Init(a *app.App) (err error) { if err != nil { return } - return document.NewTextDocument(context.Background(), space, id, c.docService) + return textdocument.NewTextDocument(context.Background(), space, id, &updateListener{}) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), @@ -69,13 +85,13 @@ func (c *treeCache) Name() (name string) { return treegetter.CName } -func (c *treeCache) GetDocument(ctx context.Context, spaceId, id string) (doc document.TextDocument, err error) { +func (c *treeCache) GetDocument(ctx context.Context, spaceId, id string) (doc textdocument.TextDocument, err error) { ctx = context.WithValue(ctx, spaceKey, spaceId) v, err := c.cache.Get(ctx, id) if err != nil { return } - doc = v.(document.TextDocument) + doc = v.(textdocument.TextDocument) return } diff --git a/client/cmd/client.go b/client/cmd/client.go index e529c4f9..b3698842 100644 --- a/client/cmd/client.go +++ b/client/cmd/client.go @@ -34,8 +34,9 @@ var log = logger.NewNamed("main") var ( flagConfigFile = flag.String("c", "etc/client.yml", "path to config file") - flagVersion = flag.Bool("v", false, "show version and exit") - flagHelp = flag.Bool("h", false, "show help and exit") + // we can't use "v" here because of glog init (through badger) setting flag.Bool with "v" + flagVersion = flag.Bool("ver", false, "show version and exit") + flagHelp = flag.Bool("h", false, "show help and exit") ) func main() { diff --git a/client/document/service.go b/client/document/service.go index 47c2d250..399363b8 100644 --- a/client/document/service.go +++ b/client/document/service.go @@ -4,18 +4,15 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document/textdocument" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" - "go.uber.org/zap" ) type Service interface { app.Component - updatelistener.UpdateListener CreateDocument(spaceId string) (id string, err error) AllDocumentIds(spaceId string) (ids []string, err error) AddText(spaceId, documentId, text string) (err error) @@ -52,7 +49,7 @@ func (s *service) CreateDocument(spaceId string) (id string, err error) { if err != nil { return } - doc, err := createTextDocument(context.Background(), space, s.account, s) + doc, err := textdocument.CreateTextDocument(context.Background(), space, s.account, nil) if err != nil { return } @@ -84,17 +81,3 @@ func (s *service) DumpDocumentTree(spaceId, documentId string) (dump string, err } return doc.Tree().DebugDump() } - -func (s *service) Update(tree tree.ObjectTree) { - log.With( - zap.Strings("heads", tree.Heads()), - zap.String("tree id", tree.ID())). - Debug("updating tree") -} - -func (s *service) Rebuild(tree tree.ObjectTree) { - log.With( - zap.Strings("heads", tree.Heads()), - zap.String("tree id", tree.ID())). - Debug("rebuilding tree") -} diff --git a/client/document/textdocument.go b/client/document/textdocument/textdocument.go similarity index 98% rename from client/document/textdocument.go rename to client/document/textdocument/textdocument.go index 1d6d3238..b749a759 100644 --- a/client/document/textdocument.go +++ b/client/document/textdocument/textdocument.go @@ -1,4 +1,4 @@ -package document +package textdocument import ( "context" @@ -23,7 +23,7 @@ type textDocument struct { account account.Service } -func createTextDocument( +func CreateTextDocument( ctx context.Context, space commonspace.Space, account account.Service, diff --git a/client/go.mod b/client/go.mod index 5a2355fa..8aeae7af 100644 --- a/client/go.mod +++ b/client/go.mod @@ -8,6 +8,7 @@ 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 + go.uber.org/zap v1.23.0 ) require ( @@ -59,7 +60,6 @@ require ( 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-20220525230936-793ad666bf5e // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect golang.org/x/net v0.0.0-20220920183852-bf014ff85ad5 // indirect diff --git a/common/config/config.go b/common/config/config.go index cbd6b757..06168a4d 100644 --- a/common/config/config.go +++ b/common/config/config.go @@ -54,3 +54,7 @@ func (c Config) GetGRPCServer() GrpcServer { func (c Config) GetAccount() Account { return c.Account } + +func (c Config) GetMetric() Metric { + return c.Metric +} From 6cb6b91bd421972039532d4c724b7ad453c5206d Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 19 Oct 2022 17:59:12 +0200 Subject: [PATCH 163/219] Document creation fixes --- client/storage/liststorage.go | 4 ++-- client/storage/spacestorage.go | 2 +- client/storage/storageservice.go | 10 ++++++++++ common/commonspace/space.go | 8 ++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/client/storage/liststorage.go b/client/storage/liststorage.go index 3061eafd..3d784c31 100644 --- a/client/storage/liststorage.go +++ b/client/storage/liststorage.go @@ -37,7 +37,7 @@ func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls storage. ls = &listStorage{ db: db, - keys: aclKeys{}, + keys: newACLKeys(spaceId), id: stringId, root: rootWithId, } @@ -70,7 +70,7 @@ func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *acl ls = &listStorage{ db: db, - keys: aclKeys{}, + keys: newACLKeys(spaceId), id: root.Id, root: root, } diff --git a/client/storage/spacestorage.go b/client/storage/spacestorage.go index c11f1846..f0b65045 100644 --- a/client/storage/spacestorage.go +++ b/client/storage/spacestorage.go @@ -125,5 +125,5 @@ func (s *spaceStorage) StoredIds() (ids []string, err error) { } func (s *spaceStorage) Close() (err error) { - return s.objDb.Close() + return nil } diff --git a/client/storage/storageservice.go b/client/storage/storageservice.go index 57a8cc11..43b9c6f4 100644 --- a/client/storage/storageservice.go +++ b/client/storage/storageservice.go @@ -1,6 +1,7 @@ package storage import ( + "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" @@ -14,6 +15,7 @@ type storageService struct { type ClientStorage interface { storage.SpaceStorageProvider + app.ComponentRunnable AllSpaceIds() (ids []string, err error) } @@ -62,3 +64,11 @@ func (s *storageService) AllSpaceIds() (ids []string, err error) { }) return } + +func (s *storageService) Run(ctx context.Context) (err error) { + return nil +} + +func (s *storageService) Close(ctx context.Context) (err error) { + return s.db.Close() +} diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 57eedb75..02d41fa7 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -89,6 +89,14 @@ func (s *space) Init(ctx context.Context) (err error) { if err != nil { return } + aclStorage, err := s.storage.ACLStorage() + if err != nil { + return + } + s.aclList, err = list.BuildACLList(aclStorage) + if err != nil { + return + } s.diffService.Init(initialIds) s.syncService.Init() return nil From c9ded8956c0c44eb41f4614ef65246b0f4e96b08 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 19 Oct 2022 20:21:58 +0200 Subject: [PATCH 164/219] Fix bugs appearing while creating tree --- common/commonspace/service.go | 4 + common/commonspace/space.go | 4 +- common/commonspace/syncservice/syncclient.go | 2 +- common/pkg/acl/list/aclstate.go | 77 ++++++++++---------- common/pkg/acl/tree/changebuilder.go | 7 +- common/pkg/acl/tree/changevalidator.go | 4 + common/pkg/acl/tree/objecttreefactory.go | 12 +-- 7 files changed, 61 insertions(+), 49 deletions(-) diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 61a44b25..b6bfee6f 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -2,6 +2,7 @@ package commonspace import ( "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice" @@ -30,6 +31,7 @@ type Service interface { type service struct { config config2.Space + account account.Service configurationService nodeconf.Service storageProvider storage.SpaceStorageProvider cache treegetter.TreeGetter @@ -38,6 +40,7 @@ type service struct { func (s *service) Init(a *app.App) (err error) { s.config = a.MustComponent(config2.CName).(*config2.Config).Space + s.account = a.MustComponent(account.CName).(account.Service) s.storageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) s.cache = a.MustComponent(treegetter.CName).(treegetter.TreeGetter) @@ -93,6 +96,7 @@ func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { syncService: syncService, diffService: diffService, cache: s.cache, + account: s.account, storage: st, } if err := sp.Init(ctx); err != nil { diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 02d41fa7..c53ca882 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "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/storage" @@ -70,6 +71,7 @@ type space struct { diffService diffservice.DiffService storage storage.SpaceStorage cache treegetter.TreeGetter + account account.Service aclList list.ACLList isClosed atomic.Bool @@ -93,7 +95,7 @@ func (s *space) Init(ctx context.Context) (err error) { if err != nil { return } - s.aclList, err = list.BuildACLList(aclStorage) + s.aclList, err = list.BuildACLListWithIdentity(s.account.Account(), aclStorage) if err != nil { return } diff --git a/common/commonspace/syncservice/syncclient.go b/common/commonspace/syncservice/syncclient.go index cd018453..d5f0b9f3 100644 --- a/common/commonspace/syncservice/syncclient.go +++ b/common/commonspace/syncservice/syncclient.go @@ -38,7 +38,7 @@ func (s *syncClient) LastUsage() time.Time { func (s *syncClient) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) { s.notifyIfNeeded(message) - return s.BroadcastAsync(message) + return s.StreamPool.BroadcastAsync(message) } func (s *syncClient) BroadcastAsyncOrSendResponsible(message *spacesyncproto.ObjectSyncMessage) (err error) { diff --git a/common/pkg/acl/list/aclstate.go b/common/pkg/acl/list/aclstate.go index 8e9930db..f74634f3 100644 --- a/common/pkg/acl/list/aclstate.go +++ b/common/pkg/acl/list/aclstate.go @@ -5,10 +5,10 @@ import ( "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - aclrecordproto2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" - signingkey2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" "github.com/gogo/protobuf/proto" "go.uber.org/zap" @@ -30,17 +30,17 @@ var ErrIncorrectRoot = errors.New("incorrect root") type UserPermissionPair struct { Identity string - Permission aclrecordproto2.ACLUserPermissions + Permission aclrecordproto.ACLUserPermissions } type ACLState struct { id string currentReadKeyHash uint64 userReadKeys map[uint64]*symmetric.Key - userStates map[string]*aclrecordproto2.ACLUserState - userInvites map[string]*aclrecordproto2.ACLUserInvite + userStates map[string]*aclrecordproto.ACLUserState + userInvites map[string]*aclrecordproto.ACLUserInvite encryptionKey encryptionkey.PrivKey - signingKey signingkey2.PrivKey + signingKey signingkey.PrivKey identity string permissionsAtRecord map[string][]UserPermissionPair @@ -50,9 +50,9 @@ type ACLState struct { func newACLStateWithKeys( id string, - signingKey signingkey2.PrivKey, + signingKey signingkey.PrivKey, encryptionKey encryptionkey.PrivKey) (*ACLState, error) { - identity, err := signingKey.Raw() + identity, err := signingKey.GetPublic().Raw() if err != nil { return nil, err } @@ -62,8 +62,8 @@ func newACLStateWithKeys( signingKey: signingKey, encryptionKey: encryptionKey, userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclrecordproto2.ACLUserState), - userInvites: make(map[string]*aclrecordproto2.ACLUserInvite), + userStates: make(map[string]*aclrecordproto.ACLUserState), + userInvites: make(map[string]*aclrecordproto.ACLUserInvite), permissionsAtRecord: make(map[string][]UserPermissionPair), }, nil } @@ -72,8 +72,8 @@ func newACLState(id string) *ACLState { return &ACLState{ id: id, userReadKeys: make(map[uint64]*symmetric.Key), - userStates: make(map[string]*aclrecordproto2.ACLUserState), - userInvites: make(map[string]*aclrecordproto2.ACLUserInvite), + userStates: make(map[string]*aclrecordproto.ACLUserState), + userInvites: make(map[string]*aclrecordproto.ACLUserInvite), permissionsAtRecord: make(map[string][]UserPermissionPair), } } @@ -111,16 +111,19 @@ func (st *ACLState) PermissionsAtRecord(id string, identity string) (UserPermiss func (st *ACLState) applyRecord(record *ACLRecord) (err error) { if record.Id == st.id { - root, ok := record.Model.(*aclrecordproto2.ACLRoot) + root, ok := record.Model.(*aclrecordproto.ACLRoot) if !ok { return ErrIncorrectRoot } + st.permissionsAtRecord[record.Id] = []UserPermissionPair{ + {Identity: string(root.Identity), Permission: aclrecordproto.ACLUserPermissions_Admin}, + } return st.applyRoot(root) } - aclData := &aclrecordproto2.ACLData{} + aclData := &aclrecordproto.ACLData{} if record.Model != nil { - aclData = record.Model.(*aclrecordproto2.ACLData) + aclData = record.Model.(*aclrecordproto.ACLData) } else { err = proto.Unmarshal(record.Data, aclData) if err != nil { @@ -148,8 +151,8 @@ func (st *ACLState) applyRecord(record *ACLRecord) (err error) { return nil } -func (st *ACLState) applyRoot(root *aclrecordproto2.ACLRoot) (err error) { - if st.signingKey != nil && st.encryptionKey != nil { +func (st *ACLState) applyRoot(root *aclrecordproto.ACLRoot) (err error) { + if st.signingKey != nil && st.encryptionKey != nil && st.identity == string(root.Identity) { err = st.saveReadKeyFromRoot(root) if err != nil { return @@ -157,16 +160,16 @@ func (st *ACLState) applyRoot(root *aclrecordproto2.ACLRoot) (err error) { } // adding user to the list - userState := &aclrecordproto2.ACLUserState{ + userState := &aclrecordproto.ACLUserState{ Identity: root.Identity, EncryptionKey: root.EncryptionKey, - Permissions: aclrecordproto2.ACLUserPermissions_Admin, + Permissions: aclrecordproto.ACLUserPermissions_Admin, } st.userStates[string(root.Identity)] = userState return } -func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto2.ACLRoot) (err error) { +func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error) { var readKey *symmetric.Key if len(root.GetDerivationScheme()) != 0 { var encPubKey []byte @@ -175,7 +178,7 @@ func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto2.ACLRoot) (err erro return } - readKey, err = aclrecordproto2.ACLReadKeyDerive([]byte(st.identity), encPubKey) + readKey, err = aclrecordproto.ACLReadKeyDerive([]byte(st.identity), encPubKey) if err != nil { return } @@ -199,7 +202,7 @@ func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto2.ACLRoot) (err erro return } -func (st *ACLState) applyChangeData(changeData *aclrecordproto2.ACLData, hash uint64, identity []byte) (err error) { +func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uint64, identity []byte) (err error) { defer func() { if err != nil { return @@ -214,7 +217,7 @@ func (st *ACLState) applyChangeData(changeData *aclrecordproto2.ACLData, hash ui return } - if !st.hasPermission(identity, aclrecordproto2.ACLUserPermissions_Admin) { + if !st.hasPermission(identity, aclrecordproto.ACLUserPermissions_Admin) { err = fmt.Errorf("user %s must have admin permissions", identity) return } @@ -230,7 +233,7 @@ func (st *ACLState) applyChangeData(changeData *aclrecordproto2.ACLData, hash ui return nil } -func (st *ACLState) applyChangeContent(ch *aclrecordproto2.ACLContentValue) error { +func (st *ACLState) applyChangeContent(ch *aclrecordproto.ACLContentValue) error { switch { case ch.GetUserPermissionChange() != nil: return st.applyUserPermissionChange(ch.GetUserPermissionChange()) @@ -247,7 +250,7 @@ func (st *ACLState) applyChangeContent(ch *aclrecordproto2.ACLContentValue) erro } } -func (st *ACLState) applyUserPermissionChange(ch *aclrecordproto2.ACLUserPermissionChange) error { +func (st *ACLState) applyUserPermissionChange(ch *aclrecordproto.ACLUserPermissionChange) error { chIdentity := string(ch.Identity) state, exists := st.userStates[chIdentity] if !exists { @@ -258,12 +261,12 @@ func (st *ACLState) applyUserPermissionChange(ch *aclrecordproto2.ACLUserPermiss return nil } -func (st *ACLState) applyUserInvite(ch *aclrecordproto2.ACLUserInvite) error { +func (st *ACLState) applyUserInvite(ch *aclrecordproto.ACLUserInvite) error { st.userInvites[ch.InviteId] = ch return nil } -func (st *ACLState) applyUserJoin(ch *aclrecordproto2.ACLUserJoin) error { +func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error { invite, exists := st.userInvites[ch.InviteId] if !exists { return fmt.Errorf("no such invite with id %s", ch.InviteId) @@ -276,12 +279,12 @@ func (st *ACLState) applyUserJoin(ch *aclrecordproto2.ACLUserJoin) error { // validating signature signature := ch.GetAcceptSignature() - verificationKey, err := signingkey2.NewSigningEd25519PubKeyFromBytes(invite.AcceptPublicKey) + verificationKey, err := signingkey.NewSigningEd25519PubKeyFromBytes(invite.AcceptPublicKey) if err != nil { return fmt.Errorf("public key verifying invite accepts is given in incorrect format: %v", err) } - res, err := verificationKey.(signingkey2.PubKey).Verify(ch.Identity, signature) + res, err := verificationKey.(signingkey.PubKey).Verify(ch.Identity, signature) if err != nil { return fmt.Errorf("verification returned error: %w", err) } @@ -302,7 +305,7 @@ func (st *ACLState) applyUserJoin(ch *aclrecordproto2.ACLUserJoin) error { } // adding user to the list - userState := &aclrecordproto2.ACLUserState{ + userState := &aclrecordproto.ACLUserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, Permissions: invite.Permissions, @@ -311,13 +314,13 @@ func (st *ACLState) applyUserJoin(ch *aclrecordproto2.ACLUserJoin) error { return nil } -func (st *ACLState) applyUserAdd(ch *aclrecordproto2.ACLUserAdd) error { +func (st *ACLState) applyUserAdd(ch *aclrecordproto.ACLUserAdd) error { chIdentity := string(ch.Identity) if _, exists := st.userStates[chIdentity]; exists { return ErrUserAlreadyExists } - st.userStates[chIdentity] = &aclrecordproto2.ACLUserState{ + st.userStates[chIdentity] = &aclrecordproto.ACLUserState{ Identity: ch.Identity, EncryptionKey: ch.EncryptionKey, Permissions: ch.Permissions, @@ -337,7 +340,7 @@ func (st *ACLState) applyUserAdd(ch *aclrecordproto2.ACLUserAdd) error { return nil } -func (st *ACLState) applyUserRemove(ch *aclrecordproto2.ACLUserRemove) error { +func (st *ACLState) applyUserRemove(ch *aclrecordproto.ACLUserRemove) error { chIdentity := string(ch.Identity) if chIdentity == st.identity { return ErrDocumentForbidden @@ -381,7 +384,7 @@ func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, e return key, hasher.Sum64(), nil } -func (st *ACLState) hasPermission(identity []byte, permission aclrecordproto2.ACLUserPermissions) bool { +func (st *ACLState) hasPermission(identity []byte, permission aclrecordproto.ACLUserPermissions) bool { state, exists := st.userStates[string(identity)] if !exists { return false @@ -390,17 +393,17 @@ func (st *ACLState) hasPermission(identity []byte, permission aclrecordproto2.AC return state.Permissions == permission } -func (st *ACLState) isUserJoin(data *aclrecordproto2.ACLData) bool { +func (st *ACLState) isUserJoin(data *aclrecordproto.ACLData) bool { // if we have a UserJoin, then it should always be the first one applied return data.GetAclContent() != nil && data.GetAclContent()[0].GetUserJoin() != nil } -func (st *ACLState) isUserAdd(data *aclrecordproto2.ACLData, identity []byte) bool { +func (st *ACLState) isUserAdd(data *aclrecordproto.ACLData, identity []byte) bool { // if we have a UserAdd, then it should always be the first one applied userAdd := data.GetAclContent()[0].GetUserAdd() return data.GetAclContent() != nil && userAdd != nil && bytes.Compare(userAdd.GetIdentity(), identity) == 0 } -func (st *ACLState) GetUserStates() map[string]*aclrecordproto2.ACLUserState { +func (st *ACLState) GetUserStates() map[string]*aclrecordproto.ACLUserState { return st.userStates } diff --git a/common/pkg/acl/tree/changebuilder.go b/common/pkg/acl/tree/changebuilder.go index 9fd5c106..05d37721 100644 --- a/common/pkg/acl/tree/changebuilder.go +++ b/common/pkg/acl/tree/changebuilder.go @@ -71,6 +71,10 @@ func (c *changeBuilder) ConvertFromRaw(rawIdChange *treechangeproto.RawTreeChang if err != nil { return } + ch, err = c.unmarshallRawChange(raw, rawIdChange.Id) + if err != nil { + return + } if verify { var identityKey signingkey.PubKey @@ -90,8 +94,7 @@ func (c *changeBuilder) ConvertFromRaw(rawIdChange *treechangeproto.RawTreeChang return } } - - return c.unmarshallRawChange(raw, rawIdChange.Id) + return } func (c *changeBuilder) SetRootRawChange(rawIdChange *treechangeproto.RawTreeChangeWithId) { diff --git a/common/pkg/acl/tree/changevalidator.go b/common/pkg/acl/tree/changevalidator.go index cd0b1234..617e610d 100644 --- a/common/pkg/acl/tree/changevalidator.go +++ b/common/pkg/acl/tree/changevalidator.go @@ -53,6 +53,10 @@ func (v *objectTreeValidator) validateChange(tree *Tree, aclList list2.ACLList, return } + if c.Id == tree.RootId() { + return + } + // checking if the change refers to later acl heads than its previous ids for _, id := range c.PreviousIds { prevChange := tree.attached[id] diff --git a/common/pkg/acl/tree/objecttreefactory.go b/common/pkg/acl/tree/objecttreefactory.go index 72371327..94459020 100644 --- a/common/pkg/acl/tree/objecttreefactory.go +++ b/common/pkg/acl/tree/objecttreefactory.go @@ -1,6 +1,7 @@ package tree import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" @@ -54,10 +55,7 @@ func createObjectTree( aclList list.ACLList, createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { aclList.RLock() - var ( - deps = defaultObjectTreeDeps(nil, nil, aclList) - aclHeadId = aclList.Head().Id - ) + aclHeadId := aclList.Head().Id aclList.RUnlock() if err != nil { @@ -73,11 +71,10 @@ func createObjectTree( Seed: seed, } - _, raw, err := deps.changeBuilder.BuildInitialContent(cnt) + _, raw, err := newChangeBuilder(common.NewKeychain(), nil).BuildInitialContent(cnt) if err != nil { return } - deps.changeBuilder.SetRootRawChange(raw) // create storage st, err := createStorage(storage2.TreeStorageCreatePayload{ @@ -90,8 +87,7 @@ func createObjectTree( return } - deps.treeStorage = st - return buildObjectTree(deps) + return BuildObjectTree(st, aclList) } func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { From 64e0ba3b772d599bc5088fb3eb1dc5fa77de4f13 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 19 Oct 2022 22:21:44 +0200 Subject: [PATCH 165/219] Fix ocache and streampool bugs, fix push space --- common/commonspace/syncservice/streampool.go | 4 +++- common/pkg/ocache/ocache.go | 4 ++-- node/nodespace/rpchandler.go | 3 +-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 7247f73d..c1bbb009 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -52,11 +52,13 @@ type streamPool struct { } func newStreamPool(messageHandler MessageHandler) StreamPool { - return &streamPool{ + s := &streamPool{ peerStreams: make(map[string]spacesyncproto.SpaceStream), messageHandler: messageHandler, wg: &sync.WaitGroup{}, } + s.lastUsage.Store(time.Now().Unix()) + return s } func (s *streamPool) LastUsage() time.Time { diff --git a/common/pkg/ocache/ocache.go b/common/pkg/ocache/ocache.go index 41555e42..5f7d5b14 100644 --- a/common/pkg/ocache/ocache.go +++ b/common/pkg/ocache/ocache.go @@ -356,7 +356,6 @@ func (c *oCache) GC() { c.mu.Unlock() return } - deadline := c.timeNow().Add(-c.ttl) var toClose []*entry for _, e := range c.data { if e.isClosing { @@ -366,7 +365,8 @@ func (c *oCache) GC() { if lug, ok := e.value.(ObjectLastUsage); ok { lu = lug.LastUsage() } - if !e.locked() && e.refCount <= 0 && lu.Before(deadline) { + deadline := lu.Add(c.ttl) + if !e.locked() && e.refCount <= 0 && c.timeNow().After(deadline) { e.isClosing = true e.close = make(chan struct{}) toClose = append(toClose, e) diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go index f64f068b..baefafda 100644 --- a/node/nodespace/rpchandler.go +++ b/node/nodespace/rpchandler.go @@ -4,7 +4,6 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" ) type rpcHandler struct { @@ -17,7 +16,7 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac err = spacesyncproto.ErrSpaceExists return } - if err != treegetter.ErrSpaceNotFound { + if err != storage.ErrSpaceStorageMissing { err = spacesyncproto.ErrUnexpected return } From efa3acc368aeec9e75a7ab5dd6f62c62059f8c51 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 19 Oct 2022 22:57:34 +0200 Subject: [PATCH 166/219] Create waiters map --- common/commonspace/syncservice/streampool.go | 1 + 1 file changed, 1 insertion(+) diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index c1bbb009..9651d756 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -55,6 +55,7 @@ func newStreamPool(messageHandler MessageHandler) StreamPool { s := &streamPool{ peerStreams: make(map[string]spacesyncproto.SpaceStream), messageHandler: messageHandler, + waiters: make(map[string]responseWaiter), wg: &sync.WaitGroup{}, } s.lastUsage.Store(time.Now().Unix()) From 15bf4c7018b1162b9dcbc48a73d4881e7eed5fe3 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 20 Oct 2022 14:04:26 +0300 Subject: [PATCH 167/219] WIP: acl service --- node/acl/acl.go | 1 + node/acl/service.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 node/acl/acl.go create mode 100644 node/acl/service.go diff --git a/node/acl/acl.go b/node/acl/acl.go new file mode 100644 index 00000000..e564307a --- /dev/null +++ b/node/acl/acl.go @@ -0,0 +1 @@ +package acl diff --git a/node/acl/service.go b/node/acl/service.go new file mode 100644 index 00000000..9c080c48 --- /dev/null +++ b/node/acl/service.go @@ -0,0 +1,38 @@ +package acl + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient" +) + +const CName = "node.acl" + +type Service interface { + app.ComponentRunnable +} + +type aclService struct { + cons consensusclient.Service + stream consensusclient.Stream +} + +func (as *aclService) Init(a *app.App) (err error) { + as.cons = a.MustComponent(consensusclient.CName).(consensusclient.Service) + return nil +} + +func (as *aclService) Name() (name string) { + return CName +} + +func (as *aclService) Run(ctx context.Context) (err error) { + if as.stream, err = as.cons.WatchLog(ctx); err != nil { + return + } + return nil +} + +func (as *aclService) Close(ctx context.Context) (err error) { + return as.stream.Close() +} From a606e5f79ea5f080cffeb926fa156992dee93fe1 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 20 Oct 2022 14:04:59 +0300 Subject: [PATCH 168/219] consensus stream watch error --- consensus/consensus.go | 1 + consensus/consensusclient/stream.go | 7 + consensus/consensusproto/consensus.pb.go | 278 ++++++++++++++++-- .../consensusproto/protos/consensus.proto | 5 + consensus/consensusrpc/consensrpc.go | 27 +- consensus/stream/service.go | 18 +- consensus/stream/service_test.go | 181 +++++++----- consensus/stream/stream.go | 6 +- 8 files changed, 396 insertions(+), 127 deletions(-) diff --git a/consensus/consensus.go b/consensus/consensus.go index c0b99f4b..7098984e 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -5,6 +5,7 @@ import "time" type Log struct { Id []byte `bson:"_id"` Records []Record `bson:"records"` + Err error } type Record struct { diff --git a/consensus/consensusclient/stream.go b/consensus/consensusclient/stream.go index 9c18d07a..d2f1a055 100644 --- a/consensus/consensusclient/stream.go +++ b/consensus/consensusclient/stream.go @@ -9,6 +9,7 @@ type Stream interface { WatchIds(logIds [][]byte) (err error) UnwatchIds(logIds [][]byte) (err error) WaitLogs() []*consensusproto.Log + Err() error Close() error } @@ -24,6 +25,7 @@ func runStream(rpcStream consensusproto.DRPCConsensus_WatchLogClient) Stream { type stream struct { rpcStream consensusproto.DRPCConsensus_WatchLogClient mb *mb.MB[*consensusproto.Log] + err error } func (s *stream) WatchIds(logIds [][]byte) (err error) { @@ -42,11 +44,16 @@ func (s *stream) WaitLogs() []*consensusproto.Log { return s.mb.Wait() } +func (s *stream) Err() error { + return s.err +} + func (s *stream) readStream() { defer s.Close() for { event, err := s.rpcStream.Recv() if err != nil { + s.err = err return } if err = s.mb.Add(&consensusproto.Log{ diff --git a/consensus/consensusproto/consensus.pb.go b/consensus/consensusproto/consensus.pb.go index a9aa1bb3..be7fc173 100644 --- a/consensus/consensusproto/consensus.pb.go +++ b/consensus/consensusproto/consensus.pb.go @@ -363,6 +363,7 @@ func (m *WatchLogRequest) GetUnwatchIds() [][]byte { type WatchLogEvent struct { LogId []byte `protobuf:"bytes,1,opt,name=logId,proto3" json:"logId,omitempty"` Records []*Record `protobuf:"bytes,2,rep,name=records,proto3" json:"records,omitempty"` + Error *Err `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` } func (m *WatchLogEvent) Reset() { *m = WatchLogEvent{} } @@ -412,6 +413,57 @@ func (m *WatchLogEvent) GetRecords() []*Record { return nil } +func (m *WatchLogEvent) GetError() *Err { + if m != nil { + return m.Error + } + return nil +} + +type Err struct { + Error ErrCodes `protobuf:"varint,1,opt,name=error,proto3,enum=anyConsensus.ErrCodes" json:"error,omitempty"` +} + +func (m *Err) Reset() { *m = Err{} } +func (m *Err) String() string { return proto.CompactTextString(m) } +func (*Err) ProtoMessage() {} +func (*Err) Descriptor() ([]byte, []int) { + return fileDescriptor_6b92aaf7feaf5a54, []int{7} +} +func (m *Err) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Err) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Err.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 *Err) XXX_Merge(src proto.Message) { + xxx_messageInfo_Err.Merge(m, src) +} +func (m *Err) XXX_Size() int { + return m.Size() +} +func (m *Err) XXX_DiscardUnknown() { + xxx_messageInfo_Err.DiscardUnknown(m) +} + +var xxx_messageInfo_Err proto.InternalMessageInfo + +func (m *Err) GetError() ErrCodes { + if m != nil { + return m.Error + } + return ErrCodes_Unexpected +} + func init() { proto.RegisterEnum("anyConsensus.ErrCodes", ErrCodes_name, ErrCodes_value) proto.RegisterType((*Log)(nil), "anyConsensus.Log") @@ -421,6 +473,7 @@ func init() { proto.RegisterType((*AddRecordRequest)(nil), "anyConsensus.AddRecordRequest") proto.RegisterType((*WatchLogRequest)(nil), "anyConsensus.WatchLogRequest") proto.RegisterType((*WatchLogEvent)(nil), "anyConsensus.WatchLogEvent") + proto.RegisterType((*Err)(nil), "anyConsensus.Err") } func init() { @@ -428,37 +481,39 @@ func init() { } var fileDescriptor_6b92aaf7feaf5a54 = []byte{ - // 475 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x4d, 0x8b, 0xd3, 0x50, - 0x14, 0xed, 0x4b, 0xc6, 0x4e, 0x7b, 0xd3, 0x8f, 0x78, 0x19, 0x24, 0x74, 0x30, 0x84, 0x88, 0x10, - 0x45, 0x5a, 0xa9, 0x82, 0x2b, 0x17, 0x63, 0xa9, 0x50, 0xa9, 0x16, 0x02, 0x55, 0x70, 0x65, 0xcc, - 0x7b, 0x8d, 0x61, 0x42, 0x5e, 0x7d, 0x2f, 0x1d, 0x3b, 0xff, 0xc2, 0x1f, 0xe2, 0x0f, 0x71, 0xe7, - 0x2c, 0x5d, 0x4a, 0xfb, 0x47, 0xa4, 0x2f, 0x4d, 0x68, 0x9c, 0x99, 0x85, 0x9b, 0x84, 0x7b, 0xce, - 0x3d, 0xf7, 0x9e, 0xdc, 0x43, 0xe0, 0x61, 0xc8, 0x53, 0xc9, 0x52, 0xb9, 0x92, 0x4b, 0xc1, 0x33, - 0x3e, 0x50, 0x4f, 0x39, 0x28, 0xd1, 0xbe, 0x02, 0xb0, 0x15, 0xa4, 0x97, 0xa3, 0x02, 0x73, 0xc7, - 0xa0, 0x4f, 0x79, 0x84, 0x1d, 0xd0, 0x62, 0x6a, 0x11, 0x87, 0x78, 0x2d, 0x5f, 0x8b, 0x29, 0xf6, - 0xe1, 0x58, 0xb0, 0x90, 0x0b, 0x2a, 0x2d, 0xcd, 0xd1, 0x3d, 0x63, 0x78, 0xd2, 0x3f, 0x94, 0xf5, - 0x7d, 0x45, 0xfa, 0x45, 0x93, 0x9b, 0x40, 0x3d, 0x87, 0xae, 0x4d, 0xba, 0x07, 0xf5, 0xa5, 0x60, - 0x17, 0x13, 0x6a, 0x69, 0x0a, 0xdb, 0x57, 0x68, 0xc1, 0xf1, 0x32, 0xb8, 0x4c, 0x78, 0x40, 0x2d, - 0x5d, 0x11, 0x45, 0x89, 0x0e, 0x18, 0xa1, 0x60, 0x41, 0xc6, 0xe8, 0x3c, 0x8d, 0xd7, 0xd6, 0x91, - 0x43, 0xbc, 0x23, 0xff, 0x10, 0x72, 0x8f, 0x40, 0x9b, 0x9d, 0xbb, 0xcf, 0xa1, 0x7d, 0x46, 0xe9, - 0x94, 0x47, 0x3e, 0xfb, 0xba, 0x62, 0x32, 0xc3, 0x07, 0xa0, 0x27, 0x3c, 0x52, 0xbb, 0x8d, 0xe1, - 0xdd, 0xaa, 0xe1, 0x5d, 0xdb, 0x8e, 0x75, 0xdf, 0x83, 0x79, 0x46, 0xe9, 0xde, 0xff, 0x5e, 0x78, - 0x02, 0x77, 0x12, 0x1e, 0x4d, 0x0a, 0xdb, 0x79, 0x81, 0x4f, 0xa0, 0x9e, 0x7f, 0x9e, 0x72, 0x7e, - 0xdb, 0x09, 0xf6, 0x3d, 0xee, 0x5b, 0xe8, 0x7e, 0x08, 0xb2, 0xf0, 0xcb, 0x81, 0x9f, 0x1e, 0x34, - 0xbe, 0xed, 0xa0, 0x09, 0x95, 0x16, 0x71, 0x74, 0xaf, 0xe5, 0x97, 0x35, 0xda, 0x00, 0xab, 0xb4, - 0x64, 0x35, 0xc5, 0x1e, 0x20, 0xee, 0x1c, 0xda, 0xc5, 0xb8, 0xf1, 0x05, 0x4b, 0x6f, 0xf3, 0xf8, - 0x9f, 0x39, 0x3d, 0xfe, 0x04, 0x8d, 0xb1, 0x10, 0x23, 0x4e, 0x99, 0xc4, 0x0e, 0xc0, 0x3c, 0x65, - 0xeb, 0x25, 0x0b, 0x33, 0x46, 0xcd, 0x1a, 0xb6, 0xa1, 0xb9, 0xdb, 0xb6, 0x8e, 0x65, 0x26, 0x4d, - 0x82, 0x5d, 0x30, 0xa6, 0x3c, 0x7a, 0xc7, 0xb3, 0xd7, 0x7c, 0x95, 0x52, 0x53, 0x43, 0x84, 0x4e, - 0x3e, 0x6e, 0xc4, 0xd3, 0x45, 0x12, 0x87, 0x99, 0xa9, 0xa3, 0x09, 0xc6, 0x58, 0x08, 0x2e, 0x66, - 0x8b, 0x85, 0x64, 0x99, 0xf9, 0x43, 0x1b, 0xfe, 0x22, 0xd0, 0x2c, 0xf7, 0xe3, 0x0b, 0xa8, 0xe7, - 0x19, 0xe1, 0x69, 0xd5, 0x58, 0x25, 0xb9, 0x9e, 0x59, 0x25, 0x67, 0xe7, 0xf8, 0x12, 0x9a, 0x65, - 0x4c, 0x68, 0x5f, 0xd3, 0x56, 0xf2, 0xbb, 0x41, 0xfe, 0x06, 0x1a, 0xc5, 0xf9, 0xf0, 0x7e, 0x95, - 0xfd, 0x27, 0xa5, 0xde, 0xe9, 0xcd, 0xb4, 0xba, 0xba, 0x47, 0x9e, 0x92, 0x57, 0x8f, 0x7e, 0x6e, - 0x6c, 0x72, 0xb5, 0xb1, 0xc9, 0x9f, 0x8d, 0x4d, 0xbe, 0x6f, 0xed, 0xda, 0xd5, 0xd6, 0xae, 0xfd, - 0xde, 0xda, 0xb5, 0x8f, 0xdd, 0x41, 0xf5, 0x97, 0xfb, 0x5c, 0x57, 0xaf, 0x67, 0x7f, 0x03, 0x00, - 0x00, 0xff, 0xff, 0x40, 0xd0, 0xc6, 0x8e, 0x8b, 0x03, 0x00, 0x00, + // 509 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0xcd, 0x8a, 0xd3, 0x50, + 0x14, 0xee, 0x4d, 0x3a, 0x9d, 0xf6, 0xf4, 0x2f, 0x1e, 0x86, 0x21, 0x74, 0x30, 0x94, 0x88, 0x58, + 0x65, 0x68, 0xa5, 0x23, 0xb8, 0x72, 0x31, 0x96, 0x0a, 0x95, 0x6a, 0x21, 0x30, 0x0a, 0xae, 0xac, + 0xb9, 0xb7, 0x31, 0x4c, 0xc8, 0xad, 0xf7, 0xa6, 0x63, 0x67, 0xe3, 0x33, 0xf8, 0x20, 0x3e, 0x88, + 0x3b, 0x67, 0xe9, 0x52, 0xda, 0x17, 0x91, 0xdc, 0xfc, 0xd0, 0xd8, 0x99, 0x85, 0x9b, 0x96, 0xf3, + 0x7d, 0xe7, 0xe7, 0xbb, 0xe7, 0x7c, 0x81, 0x87, 0x2e, 0x0f, 0x25, 0x0b, 0xe5, 0x4a, 0x2e, 0x05, + 0x8f, 0xf8, 0x40, 0xfd, 0xca, 0x41, 0x8e, 0xf6, 0x15, 0x80, 0x8d, 0x79, 0x78, 0x3d, 0xca, 0x30, + 0x7b, 0x0c, 0xfa, 0x94, 0x7b, 0xd8, 0x02, 0xcd, 0xa7, 0x26, 0xe9, 0x92, 0x5e, 0xc3, 0xd1, 0x7c, + 0x8a, 0x7d, 0x38, 0x14, 0xcc, 0xe5, 0x82, 0x4a, 0x53, 0xeb, 0xea, 0xbd, 0xfa, 0xf0, 0xa8, 0xbf, + 0x5b, 0xd6, 0x77, 0x14, 0xe9, 0x64, 0x49, 0x76, 0x00, 0x95, 0x04, 0xda, 0xeb, 0x74, 0x0c, 0x95, + 0xa5, 0x60, 0x57, 0x13, 0x6a, 0x6a, 0x0a, 0x4b, 0x23, 0x34, 0xe1, 0x70, 0x39, 0xbf, 0x0e, 0xf8, + 0x9c, 0x9a, 0xba, 0x22, 0xb2, 0x10, 0xbb, 0x50, 0x77, 0x05, 0x9b, 0x47, 0x8c, 0x5e, 0x84, 0xfe, + 0xda, 0x2c, 0x77, 0x49, 0xaf, 0xec, 0xec, 0x42, 0x76, 0x19, 0xb4, 0xd9, 0xa5, 0xfd, 0x0c, 0x9a, + 0xe7, 0x94, 0x4e, 0xb9, 0xe7, 0xb0, 0x2f, 0x2b, 0x26, 0x23, 0x7c, 0x00, 0x7a, 0xc0, 0x3d, 0x35, + 0xbb, 0x3e, 0xbc, 0x57, 0x14, 0x1c, 0xa7, 0xc5, 0xac, 0xfd, 0x0e, 0x8c, 0x73, 0x4a, 0x53, 0xfd, + 0x69, 0xe1, 0x11, 0x1c, 0x04, 0xdc, 0x9b, 0x64, 0xb2, 0x93, 0x00, 0x4f, 0xa1, 0x92, 0x3c, 0x4f, + 0x29, 0xbf, 0x6b, 0x05, 0x69, 0x8e, 0xfd, 0x06, 0xda, 0xef, 0xe7, 0x91, 0xfb, 0x79, 0x47, 0x4f, + 0x07, 0xaa, 0x5f, 0x63, 0x68, 0x42, 0xa5, 0x49, 0xba, 0x7a, 0xaf, 0xe1, 0xe4, 0x31, 0x5a, 0x00, + 0xab, 0x30, 0x67, 0x35, 0xc5, 0xee, 0x20, 0xf6, 0x37, 0x68, 0x66, 0xed, 0xc6, 0x57, 0x2c, 0xbc, + 0x4b, 0xe3, 0x7f, 0xde, 0x09, 0x1f, 0xc1, 0x01, 0x13, 0x82, 0x0b, 0xb5, 0xf3, 0xbd, 0x25, 0x8d, + 0x85, 0x70, 0x12, 0xde, 0x3e, 0x03, 0x7d, 0x2c, 0x04, 0x9e, 0x66, 0xf9, 0xf1, 0xd4, 0xd6, 0xf0, + 0x78, 0x2f, 0x7f, 0xc4, 0x29, 0x93, 0x69, 0xd1, 0x93, 0x8f, 0x50, 0xcd, 0x20, 0x6c, 0x01, 0x5c, + 0x84, 0x6c, 0xbd, 0x64, 0x6e, 0xc4, 0xa8, 0x51, 0xc2, 0x26, 0xd4, 0xe2, 0xb7, 0xac, 0x7d, 0x19, + 0x49, 0x83, 0x60, 0x1b, 0xea, 0x53, 0xee, 0xbd, 0xe5, 0xd1, 0x2b, 0xbe, 0x0a, 0xa9, 0xa1, 0x21, + 0x42, 0x2b, 0x11, 0x3b, 0xe2, 0xe1, 0x22, 0xf0, 0xdd, 0xc8, 0xd0, 0xd1, 0x80, 0xfa, 0x38, 0x6e, + 0x3c, 0x5b, 0x2c, 0x24, 0x8b, 0x8c, 0x1f, 0xda, 0xf0, 0x17, 0x81, 0x5a, 0x3e, 0x1f, 0x9f, 0x43, + 0x25, 0x71, 0x00, 0x9e, 0x14, 0x85, 0x15, 0x7c, 0xd1, 0x31, 0x8a, 0xe4, 0xec, 0x12, 0x5f, 0x40, + 0x2d, 0x37, 0x01, 0x5a, 0x7b, 0xb5, 0x05, 0x77, 0xdc, 0x52, 0xfe, 0x1a, 0xaa, 0xd9, 0x71, 0xf0, + 0x7e, 0x91, 0xfd, 0xc7, 0x03, 0x9d, 0x93, 0xdb, 0x69, 0x75, 0xd3, 0x1e, 0x79, 0x4a, 0x5e, 0x3e, + 0xfe, 0xb9, 0xb1, 0xc8, 0xcd, 0xc6, 0x22, 0x7f, 0x36, 0x16, 0xf9, 0xbe, 0xb5, 0x4a, 0x37, 0x5b, + 0xab, 0xf4, 0x7b, 0x6b, 0x95, 0x3e, 0xb4, 0x07, 0xc5, 0x0f, 0xfa, 0x53, 0x45, 0xfd, 0x9d, 0xfd, + 0x0d, 0x00, 0x00, 0xff, 0xff, 0xaa, 0x39, 0x8f, 0xb0, 0xe9, 0x03, 0x00, 0x00, } func (m *Log) Marshal() (dAtA []byte, err error) { @@ -715,6 +770,18 @@ func (m *WatchLogEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintConsensus(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } if len(m.Records) > 0 { for iNdEx := len(m.Records) - 1; iNdEx >= 0; iNdEx-- { { @@ -739,6 +806,34 @@ func (m *WatchLogEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Err) 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 *Err) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Err) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Error != 0 { + i = encodeVarintConsensus(dAtA, i, uint64(m.Error)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintConsensus(dAtA []byte, offset int, v uint64) int { offset -= sovConsensus(v) base := offset @@ -869,6 +964,22 @@ func (m *WatchLogEvent) Size() (n int) { n += 1 + l + sovConsensus(uint64(l)) } } + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovConsensus(uint64(l)) + } + return n +} + +func (m *Err) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Error != 0 { + n += 1 + sovConsensus(uint64(m.Error)) + } return n } @@ -1634,6 +1745,111 @@ func (m *WatchLogEvent) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthConsensus + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthConsensus + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &Err{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipConsensus(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthConsensus + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Err) 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 ErrIntOverflowConsensus + } + 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: Err: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Err: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + m.Error = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowConsensus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Error |= ErrCodes(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipConsensus(dAtA[iNdEx:]) diff --git a/consensus/consensusproto/protos/consensus.proto b/consensus/consensusproto/protos/consensus.proto index e15dac05..17a1bce0 100644 --- a/consensus/consensusproto/protos/consensus.proto +++ b/consensus/consensusproto/protos/consensus.proto @@ -52,4 +52,9 @@ message WatchLogRequest { message WatchLogEvent { bytes logId = 1; repeated Record records = 2; + Err error = 3; } + +message Err { + ErrCodes error = 1; +} \ No newline at end of file diff --git a/consensus/consensusrpc/consensrpc.go b/consensus/consensusrpc/consensrpc.go index f1cafe1e..bee34062 100644 --- a/consensus/consensusrpc/consensrpc.go +++ b/consensus/consensusrpc/consensrpc.go @@ -6,8 +6,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/stream" + "storj.io/drpc/drpcerr" "time" ) @@ -57,11 +59,26 @@ func (c *consensusRpc) WatchLog(rpcStream consensusproto.DRPCConsensus_WatchLogS return rpcStream.Close() } for _, rec := range recs { - if err := rpcStream.Send(&consensusproto.WatchLogEvent{ - LogId: rec.Id, - Records: recordsToProto(rec.Records), - }); err != nil { - return err + if rec.Err == nil { + if err := rpcStream.Send(&consensusproto.WatchLogEvent{ + LogId: rec.Id, + Records: recordsToProto(rec.Records), + }); err != nil { + return err + } + } else { + errCode := consensusproto.ErrCodes(drpcerr.Code(rec.Err)) + if errCode == 0 { + errCode = consensusproto.ErrCodes(drpcerr.Code(consensuserr.ErrUnexpected)) + } + if err := rpcStream.Send(&consensusproto.WatchLogEvent{ + LogId: rec.Id, + Error: &consensusproto.Err{ + Error: errCode, + }, + }); err != nil { + return err + } } } } diff --git a/consensus/stream/service.go b/consensus/stream/service.go index 0aa407f1..807f34d7 100644 --- a/consensus/stream/service.go +++ b/consensus/stream/service.go @@ -5,7 +5,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" - ocache2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" "github.com/cheggaaa/mb/v2" @@ -42,22 +42,22 @@ type Service interface { type service struct { db db.Service - cache ocache2.OCache + cache ocache.OCache lastStreamId uint64 } func (s *service) Init(a *app.App) (err error) { s.db = a.MustComponent(db.CName).(db.Service) - cacheOpts := []ocache2.Option{ - ocache2.WithTTL(cacheTTL), - ocache2.WithRefCounter(false), - ocache2.WithLogger(log.Named("cache").Sugar()), + cacheOpts := []ocache.Option{ + ocache.WithTTL(cacheTTL), + ocache.WithRefCounter(false), + ocache.WithLogger(log.Named("cache").Sugar()), } if ms := a.Component(metric.CName); ms != nil { - cacheOpts = append(cacheOpts, ocache2.WithPrometheus(ms.(metric.Metric).Registry(), "consensus", "logcache")) + cacheOpts = append(cacheOpts, ocache.WithPrometheus(ms.(metric.Metric).Registry(), "consensus", "logcache")) } - s.cache = ocache2.New(s.loadLog, cacheOpts...) + s.cache = ocache.New(s.loadLog, cacheOpts...) return s.db.SetChangeReceiver(s.receiveChange) } @@ -99,7 +99,7 @@ func (s *service) RemoveStream(ctx context.Context, logId []byte, streamId uint6 return } -func (s *service) loadLog(ctx context.Context, id string) (value ocache2.Object, err error) { +func (s *service) loadLog(ctx context.Context, id string) (value ocache.Object, err error) { if ctxLog := ctx.Value(ctxLogKey); ctxLog != nil { return &object{ logId: ctxLog.(consensus.Log).Id, diff --git a/consensus/stream/service_test.go b/consensus/stream/service_test.go index 8b3498a9..c804b581 100644 --- a/consensus/stream/service_test.go +++ b/consensus/stream/service_test.go @@ -4,6 +4,7 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -14,93 +15,111 @@ import ( var ctx = context.Background() func TestService_NewStream(t *testing.T) { - fx := newFixture(t) - defer fx.Finish(t) + t.Run("watch/unwatch", func(t *testing.T) { + fx := newFixture(t) + defer fx.Finish(t) - var expLogId = []byte("logId") - var preloadLogId = []byte("preloadId") + var expLogId = []byte("logId") + var preloadLogId = []byte("preloadId") - fx.mockDB.fetchLog = func(ctx context.Context, logId []byte) (log consensus.Log, err error) { - require.Equal(t, expLogId, logId) - return consensus.Log{ - Id: logId, - Records: []consensus.Record{ - { - Id: []byte{'1'}, + fx.mockDB.fetchLog = func(ctx context.Context, logId []byte) (log consensus.Log, err error) { + require.Equal(t, expLogId, logId) + return consensus.Log{ + Id: logId, + Records: []consensus.Record{ + { + Id: []byte{'1'}, + }, }, - }, - }, nil - } - - fx.mockDB.receiver(preloadLogId, []consensus.Record{ - { - Id: []byte{'2'}, - PrevId: []byte{'1'}, - }, - { - Id: []byte{'1'}, - }, - }) - - st1 := fx.NewStream() - sr1 := readStream(st1) - assert.Equal(t, uint64(1), sr1.id) - st1.WatchIds(ctx, [][]byte{expLogId, preloadLogId}) - st1.UnwatchIds(ctx, [][]byte{preloadLogId}) - assert.Equal(t, [][]byte{expLogId}, st1.LogIds()) - - st2 := fx.NewStream() - sr2 := readStream(st2) - assert.Equal(t, uint64(2), sr2.id) - st2.WatchIds(ctx, [][]byte{expLogId, preloadLogId}) - - fx.mockDB.receiver(expLogId, []consensus.Record{ - { - Id: []byte{'1'}, - }, - }) - fx.mockDB.receiver(expLogId, []consensus.Record{ - { - Id: []byte{'2'}, - PrevId: []byte{'1'}, - }, - { - Id: []byte{'1'}, - }, - }) - fx.mockDB.receiver(preloadLogId, []consensus.Record{ - { - Id: []byte{'3'}, - PrevId: []byte{'4'}, - }, - { - Id: []byte{'2'}, - PrevId: []byte{'1'}, - }, - { - Id: []byte{'1'}, - }, - }) - st1.Close() - st2.Close() - - for _, sr := range []*streamReader{sr1, sr2} { - select { - case <-time.After(time.Second / 3): - require.False(t, true, "timeout") - case <-sr.finished: + }, nil } - } - require.Len(t, sr1.logs, 2) - assert.Len(t, sr1.logs[string(expLogId)].Records, 2) - assert.Equal(t, []byte{'2'}, sr1.logs[string(expLogId)].Records[0].Id) - assert.Equal(t, []byte{'2'}, sr1.logs[string(preloadLogId)].Records[0].Id) + fx.mockDB.receiver(preloadLogId, []consensus.Record{ + { + Id: []byte{'2'}, + PrevId: []byte{'1'}, + }, + { + Id: []byte{'1'}, + }, + }) - require.Len(t, sr2.logs, 2) - assert.Len(t, sr2.logs[string(expLogId)].Records, 2) - assert.Equal(t, []byte{'2'}, sr2.logs[string(expLogId)].Records[0].Id) - assert.Equal(t, []byte{'3'}, sr2.logs[string(preloadLogId)].Records[0].Id) + st1 := fx.NewStream() + sr1 := readStream(st1) + assert.Equal(t, uint64(1), sr1.id) + st1.WatchIds(ctx, [][]byte{expLogId, preloadLogId}) + st1.UnwatchIds(ctx, [][]byte{preloadLogId}) + assert.Equal(t, [][]byte{expLogId}, st1.LogIds()) + + st2 := fx.NewStream() + sr2 := readStream(st2) + assert.Equal(t, uint64(2), sr2.id) + st2.WatchIds(ctx, [][]byte{expLogId, preloadLogId}) + + fx.mockDB.receiver(expLogId, []consensus.Record{ + { + Id: []byte{'1'}, + }, + }) + fx.mockDB.receiver(expLogId, []consensus.Record{ + { + Id: []byte{'2'}, + PrevId: []byte{'1'}, + }, + { + Id: []byte{'1'}, + }, + }) + fx.mockDB.receiver(preloadLogId, []consensus.Record{ + { + Id: []byte{'3'}, + PrevId: []byte{'4'}, + }, + { + Id: []byte{'2'}, + PrevId: []byte{'1'}, + }, + { + Id: []byte{'1'}, + }, + }) + st1.Close() + st2.Close() + + for _, sr := range []*streamReader{sr1, sr2} { + select { + case <-time.After(time.Second / 3): + require.False(t, true, "timeout") + case <-sr.finished: + } + } + + require.Len(t, sr1.logs, 2) + assert.Len(t, sr1.logs[string(expLogId)].Records, 2) + assert.Equal(t, []byte{'2'}, sr1.logs[string(expLogId)].Records[0].Id) + assert.Equal(t, []byte{'2'}, sr1.logs[string(preloadLogId)].Records[0].Id) + + require.Len(t, sr2.logs, 2) + assert.Len(t, sr2.logs[string(expLogId)].Records, 2) + assert.Equal(t, []byte{'2'}, sr2.logs[string(expLogId)].Records[0].Id) + assert.Equal(t, []byte{'3'}, sr2.logs[string(preloadLogId)].Records[0].Id) + }) + t.Run("error", func(t *testing.T) { + fx := newFixture(t) + defer fx.Finish(t) + fx.mockDB.fetchLog = func(ctx context.Context, logId []byte) (log consensus.Log, err error) { + return log, consensuserr.ErrLogNotFound + } + st1 := fx.NewStream() + sr1 := readStream(st1) + id := []byte("nonExists") + assert.Equal(t, uint64(1), sr1.id) + st1.WatchIds(ctx, [][]byte{id}) + st1.Close() + <-sr1.finished + require.Len(t, sr1.logs, 1) + assert.Equal(t, consensuserr.ErrLogNotFound, sr1.logs[string(id)].Err) + }) } func newFixture(t *testing.T) *fixture { diff --git a/consensus/stream/stream.go b/consensus/stream/stream.go index 0c686290..83684677 100644 --- a/consensus/stream/stream.go +++ b/consensus/stream/stream.go @@ -48,7 +48,11 @@ func (s *Stream) WatchIds(ctx context.Context, logIds [][]byte) { if _, ok := s.logIds[logIdKey]; !ok { s.logIds[logIdKey] = struct{}{} if addErr := s.s.AddStream(ctx, logId, s); addErr != nil { - log.Warn("can't add stream for log", zap.Binary("logId", logId), zap.Error(addErr)) + log.Info("can't add stream for log", zap.Binary("logId", logId), zap.Error(addErr)) + _ = s.mb.Add(consensus.Log{ + Id: logId, + Err: addErr, + }) } } } From f21f05585ca4e5ec3ffdbe434eb2a82b5b6cf0ee Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 20 Oct 2022 16:02:16 +0200 Subject: [PATCH 169/219] Fix bugs with storage --- client/document/textdocument/textdocument.go | 3 +- .../commonspace/spacesyncproto/spacesync.go | 20 ++++++++++++ common/commonspace/syncservice/streampool.go | 8 ++++- common/commonspace/syncservice/synchandler.go | 31 +++++++++++++++++-- common/commonspace/synctree/synctree.go | 5 +++ node/storage/treestorage.go | 2 +- 6 files changed, 64 insertions(+), 5 deletions(-) diff --git a/client/document/textdocument/textdocument.go b/client/document/textdocument/textdocument.go index b749a759..03f3c151 100644 --- a/client/document/textdocument/textdocument.go +++ b/client/document/textdocument/textdocument.go @@ -71,7 +71,8 @@ func (t *textDocument) AddText(text string) (err error) { if err != nil { return } - + t.objTree.Lock() + defer t.objTree.Unlock() _, err = t.objTree.AddContent(context.Background(), tree.SignableChangeContent{ Data: res, Key: t.account.Account().SignKey, diff --git a/common/commonspace/spacesyncproto/spacesync.go b/common/commonspace/spacesyncproto/spacesync.go index 75eb3bca..c9351714 100644 --- a/common/commonspace/spacesyncproto/spacesync.go +++ b/common/commonspace/spacesyncproto/spacesync.go @@ -2,6 +2,7 @@ package spacesyncproto import ( + "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "storj.io/drpc" ) @@ -25,6 +26,7 @@ func WrapHeadUpdate(update *ObjectHeadUpdate, rootChange *treechangeproto.RawTre }, RootChange: rootChange, TreeId: treeId, + TrackingId: trackingId, } } @@ -35,6 +37,7 @@ func WrapFullRequest(request *ObjectFullSyncRequest, rootChange *treechangeproto }, RootChange: rootChange, TreeId: treeId, + TrackingId: trackingId, } } @@ -45,6 +48,7 @@ func WrapFullResponse(response *ObjectFullSyncResponse, rootChange *treechangepr }, RootChange: rootChange, TreeId: treeId, + TrackingId: trackingId, } } @@ -55,5 +59,21 @@ func WrapError(err error, rootChange *treechangeproto.RawTreeChangeWithId, treeI }, RootChange: rootChange, TreeId: treeId, + TrackingId: trackingId, } } + +func MessageDescription(msg *ObjectSyncMessage) string { + content := msg.GetContent() + switch { + case content.GetHeadUpdate() != nil: + return fmt.Sprintf("head update/%v", content.GetHeadUpdate().Heads) + case content.GetFullSyncRequest() != nil: + return fmt.Sprintf("fullsync request/%v", content.GetFullSyncRequest().Heads) + case content.GetFullSyncResponse() != nil: + return fmt.Sprintf("fullsync response/%v", content.GetFullSyncResponse().Heads) + case content.GetErrorResponse() != nil: + return fmt.Sprintf("error response/%v", content.GetErrorResponse().Error) + } + return "" +} diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 9651d756..1421839f 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -90,7 +90,7 @@ func (s *streamPool) SendSync( if err != nil { return } - + // TODO: limit wait time here and remove the waiter reply = <-waiter.ch return } @@ -112,6 +112,9 @@ func (s *streamPool) SendAsync(peers []string, message *spacesyncproto.ObjectSyn streams := getStreams() s.Unlock() + log.With("description", spacesyncproto.MessageDescription(message)). + With("treeId", message.TreeId). + Debugf("sending message to %d peers", len(streams)) for _, s := range streams { err = s.Send(message) } @@ -158,6 +161,9 @@ Loop: func (s *streamPool) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) { streams := s.getAllStreams() + log.With("description", spacesyncproto.MessageDescription(message)). + With("treeId", message.TreeId). + Debugf("broadcasting message to %d peers", len(streams)) for _, stream := range streams { if err = stream.Send(message); err != nil { // TODO: add logging diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index deb0788a..16879b36 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -44,7 +44,10 @@ func (s *syncHandler) handleHeadUpdate( senderId string, update *spacesyncproto.ObjectHeadUpdate, msg *spacesyncproto.ObjectSyncMessage) (err error) { - + log.With("senderId", senderId). + With("heads", update.Heads). + With("treeId", msg.TreeId). + Debug("received head update message") var ( fullRequest *spacesyncproto.ObjectSyncMessage isEmptyUpdate = len(update.Changes) == 0 @@ -86,8 +89,16 @@ func (s *syncHandler) handleHeadUpdate( }() if fullRequest != nil { + log.With("senderId", senderId). + With("heads", update.Heads). + With("treeId", msg.TreeId). + Debug("sending full sync request") return s.syncClient.SendAsync([]string{senderId}, fullRequest) } + log.With("senderId", senderId). + With("heads", update.Heads). + With("treeId", msg.TreeId). + Debug("head update finished correctly") return } @@ -96,6 +107,11 @@ func (s *syncHandler) handleFullSyncRequest( senderId string, request *spacesyncproto.ObjectFullSyncRequest, msg *spacesyncproto.ObjectSyncMessage) (err error) { + log.With("senderId", senderId). + With("heads", request.Heads). + With("treeId", msg.TreeId). + With("trackingId", msg.TrackingId). + Debug("received full sync request message") var ( fullResponse *spacesyncproto.ObjectSyncMessage header = msg.RootChange @@ -141,11 +157,18 @@ func (s *syncHandler) handleFullSyncResponse( senderId string, response *spacesyncproto.ObjectFullSyncResponse, msg *spacesyncproto.ObjectSyncMessage) (err error) { + log.With("senderId", senderId). + With("heads", response.Heads). + With("treeId", msg.TreeId). + Debug("received full sync response message") objTree, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) if err != nil { + log.With("senderId", senderId). + With("heads", response.Heads). + With("treeId", msg.TreeId). + Debug("failed to find the tree in full sync response") return } - err = func() error { objTree.Lock() defer objTree.Unlock() @@ -157,6 +180,10 @@ func (s *syncHandler) handleFullSyncResponse( _, err = objTree.AddRawChanges(ctx, response.Changes...) return err }() + log.With("error", err != nil). + With("heads", response.Heads). + With("treeId", msg.TreeId). + Debug("finished full sync response") return } diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 41f7c16a..4cd6e2ee 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -3,6 +3,7 @@ package synctree import ( "context" "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" @@ -21,6 +22,8 @@ type SyncTree struct { isClosed bool } +var log = logger.NewNamed("commonspace.synctree").Sugar() + var createDerivedObjectTree = tree2.CreateDerivedObjectTree var createObjectTree = tree2.CreateObjectTree var buildObjectTree = tree2.BuildObjectTree @@ -138,8 +141,10 @@ func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeprot } func (s *SyncTree) Close() (err error) { + log.With("id", s.ID()).Debug("closing sync tree") s.Lock() defer s.Unlock() + log.With("id", s.ID()).Debug("taken lock on sync tree") if s.isClosed { err = ErrSyncTreeClosed return diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index 919f2140..7ad33aa1 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -99,7 +99,7 @@ func (t *treeStorage) Heads() (heads []string, err error) { if err != nil { return } - if heads == nil { + if headsBytes == nil { err = storage2.ErrUnknownTreeId return } From 4da28bcd861649481eeaf8862936f6633015b07e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 20 Oct 2022 18:56:09 +0200 Subject: [PATCH 170/219] Fix bug with head update not being sent on first receive --- common/commonspace/space.go | 28 ++++++++++--------- .../syncservice/synchandler_test.go | 8 ------ common/commonspace/synctree/synctree.go | 16 ++++++++--- common/commonspace/synctree/synctree_test.go | 2 +- 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/common/commonspace/space.go b/common/commonspace/space.go index c53ca882..3e83ee91 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -13,8 +13,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" - tree2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + aclstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "sync" @@ -54,9 +54,9 @@ type Space interface { SpaceSyncRpc() RpcHandler - DeriveTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree2.ObjectTree, error) - CreateTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree2.ObjectTree, error) - BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree2.ObjectTree, error) + DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) + CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tree.ObjectTree, error) + BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (tree.ObjectTree, error) Close() error } @@ -120,7 +120,7 @@ func (s *space) StoredIds() []string { return s.diffService.AllIds() } -func (s *space) DeriveTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tr tree2.ObjectTree, err error) { +func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tr tree.ObjectTree, err error) { if s.isClosed.Load() { err = ErrSpaceClosed return @@ -128,7 +128,7 @@ func (s *space) DeriveTree(ctx context.Context, payload tree2.ObjectTreeCreatePa return synctree.DeriveSyncTree(ctx, payload, s.syncService.SyncClient(), listener, s.aclList, s.storage.CreateTreeStorage) } -func (s *space) CreateTree(ctx context.Context, payload tree2.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tr tree2.ObjectTree, err error) { +func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tr tree.ObjectTree, err error) { if s.isClosed.Load() { err = ErrSpaceClosed return @@ -136,7 +136,7 @@ func (s *space) CreateTree(ctx context.Context, payload tree2.ObjectTreeCreatePa return synctree.CreateSyncTree(ctx, payload, s.syncService.SyncClient(), listener, s.aclList, s.storage.CreateTreeStorage) } -func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t tree2.ObjectTree, err error) { +func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t tree.ObjectTree, err error) { if s.isClosed.Load() { err = ErrSpaceClosed return @@ -154,11 +154,13 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene } store, err := s.storage.TreeStorage(id) - if err != nil && err != storage2.ErrUnknownTreeId { + if err != nil && err != aclstorage.ErrUnknownTreeId { return } - if err == storage2.ErrUnknownTreeId { + isFirstBuild := false + if err == aclstorage.ErrUnknownTreeId { + isFirstBuild = true var resp *spacesyncproto.ObjectSyncMessage resp, err = getTreeRemote() if err != nil { @@ -166,7 +168,7 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene } fullSyncResp := resp.GetContent().GetFullSyncResponse() - payload := storage2.TreeStorageCreatePayload{ + payload := aclstorage.TreeStorageCreatePayload{ TreeId: resp.TreeId, RootRawChange: resp.RootChange, Changes: fullSyncResp.Changes, @@ -174,7 +176,7 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene } // basically building tree with inmemory storage and validating that it was without errors - err = tree2.ValidateRawTree(payload, s.aclList) + err = tree.ValidateRawTree(payload, s.aclList) if err != nil { return } @@ -184,7 +186,7 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene return } } - return synctree.BuildSyncTree(ctx, s.syncService.SyncClient(), store.(storage2.TreeStorage), listener, s.aclList) + return synctree.BuildSyncTree(ctx, s.syncService.SyncClient(), store.(aclstorage.TreeStorage), listener, s.aclList, isFirstBuild) } func (s *space) Close() error { diff --git a/common/commonspace/syncservice/synchandler_test.go b/common/commonspace/syncservice/synchandler_test.go index a0f2fdd9..1b18be9f 100644 --- a/common/commonspace/syncservice/synchandler_test.go +++ b/common/commonspace/syncservice/synchandler_test.go @@ -15,14 +15,6 @@ import ( "testing" ) -type treeContainer struct { - objTree tree.ObjectTree -} - -func (t treeContainer) Tree() tree.ObjectTree { - return t.objTree -} - type testObjTreeMock struct { *mock_tree.MockObjectTree m sync.Mutex diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 4cd6e2ee..4c83cf95 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -77,8 +77,9 @@ func BuildSyncTree( syncClient syncservice.SyncClient, treeStorage storage.TreeStorage, listener updatelistener.UpdateListener, - aclList list.ACLList) (t tree2.ObjectTree, err error) { - return buildSyncTree(ctx, syncClient, treeStorage, listener, aclList) + aclList list.ACLList, + isFirstBuild bool) (t tree2.ObjectTree, err error) { + return buildSyncTree(ctx, syncClient, treeStorage, listener, aclList, isFirstBuild) } func buildSyncTree( @@ -86,7 +87,8 @@ func buildSyncTree( syncClient syncservice.SyncClient, treeStorage storage.TreeStorage, listener updatelistener.UpdateListener, - aclList list.ACLList) (t tree2.ObjectTree, err error) { + aclList list.ACLList, + isFirstBuild bool) (t tree2.ObjectTree, err error) { t, err = buildObjectTree(treeStorage, aclList) if err != nil { return @@ -99,7 +101,13 @@ func buildSyncTree( headUpdate := syncClient.CreateHeadUpdate(t, nil) // here we will have different behaviour based on who is sending this update - err = syncClient.BroadcastAsyncOrSendResponsible(headUpdate) + if isFirstBuild { + // send to everybody, because everybody should know that the node or client got new tree + err = syncClient.BroadcastAsync(headUpdate) + } else { + // send either to everybody if client or to replica set if node + err = syncClient.BroadcastAsyncOrSendResponsible(headUpdate) + } return } diff --git a/common/commonspace/synctree/synctree_test.go b/common/commonspace/synctree/synctree_test.go index 04ec069d..4f9d2ac4 100644 --- a/common/commonspace/synctree/synctree_test.go +++ b/common/commonspace/synctree/synctree_test.go @@ -104,7 +104,7 @@ func Test_BuildSyncTree(t *testing.T) { syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().BroadcastAsyncOrSendResponsible(gomock.Eq(headUpdate)).Return(nil) - tr, err := BuildSyncTree(ctx, syncClientMock, storageMock, updateListenerMock, aclListMock) + tr, err := BuildSyncTree(ctx, syncClientMock, storageMock, updateListenerMock, aclListMock, false) require.NoError(t, err) t.Run("AddRawChanges update", func(t *testing.T) { From d871c9b061d6aed33ac0da08eb930fee519c1b4a Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 20 Oct 2022 19:08:43 +0200 Subject: [PATCH 171/219] Fix add text bug --- client/clientspace/clientcache/treecache.go | 5 ++++- client/document/textdocument/textdocument.go | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/client/clientspace/clientcache/treecache.go b/client/clientspace/clientcache/treecache.go index 50319cba..e37c284c 100644 --- a/client/clientspace/clientcache/treecache.go +++ b/client/clientspace/clientcache/treecache.go @@ -5,6 +5,7 @@ import ( "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document/textdocument" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" @@ -24,6 +25,7 @@ const spaceKey ctxKey = 0 type treeCache struct { gcttl int cache ocache.OCache + account account.Service clientService clientspace.Service } @@ -65,6 +67,7 @@ func (c *treeCache) Close(ctx context.Context) (err error) { func (c *treeCache) Init(a *app.App) (err error) { c.clientService = a.MustComponent(clientspace.CName).(clientspace.Service) + c.account = a.MustComponent(account.CName).(account.Service) c.cache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { spaceId := ctx.Value(spaceKey).(string) @@ -72,7 +75,7 @@ func (c *treeCache) Init(a *app.App) (err error) { if err != nil { return } - return textdocument.NewTextDocument(context.Background(), space, id, &updateListener{}) + return textdocument.NewTextDocument(context.Background(), space, id, &updateListener{}, c.account) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), diff --git a/client/document/textdocument/textdocument.go b/client/document/textdocument/textdocument.go index 03f3c151..7b754670 100644 --- a/client/document/textdocument/textdocument.go +++ b/client/document/textdocument/textdocument.go @@ -40,16 +40,18 @@ func CreateTextDocument( return &textDocument{ objTree: t, + account: account, }, nil } -func NewTextDocument(ctx context.Context, space commonspace.Space, id string, listener updatelistener.UpdateListener) (doc TextDocument, err error) { +func NewTextDocument(ctx context.Context, space commonspace.Space, id string, listener updatelistener.UpdateListener, account account.Service) (doc TextDocument, err error) { t, err := space.BuildTree(ctx, id, listener) if err != nil { return } return &textDocument{ objTree: t, + account: account, }, nil } From 58f9e623a422157703ce615d247d6f58da46dd5d Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 20 Oct 2022 20:14:27 +0300 Subject: [PATCH 172/219] reconnection for consensus client + fixes --- common/commonspace/syncservice/streampool.go | 2 +- common/go.mod | 1 - common/go.sum | 2 - common/net/dialer/dialer.go | 2 +- common/net/peer/peer.go | 2 +- common/net/rpc/rpctest/pool.go | 98 ++++++++ common/net/rpc/rpctest/server.go | 29 +++ common/net/rpc/server/drpcserver.go | 20 +- common/net/secure/context.go | 2 +- common/net/secure/listener.go | 2 +- common/net/secure/service.go | 6 +- common/nodeconf/configuration.go | 2 +- .../nodeconf/mock_nodeconf/mock_nodeconf.go | 97 +++++++- common/nodeconf/service.go | 18 +- common/util/peer/peer.go | 4 +- consensus/consensusclient/client.go | 153 +++++++++++- consensus/consensusclient/client_test.go | 221 ++++++++++++++++++ consensus/consensusclient/stream.go | 21 +- node/acl/acl.go | 1 - node/acl/service.go | 38 --- node/go.mod | 6 +- node/go.sum | 6 +- 22 files changed, 638 insertions(+), 95 deletions(-) create mode 100644 common/net/rpc/rpctest/pool.go create mode 100644 common/net/rpc/rpctest/server.go create mode 100644 consensus/consensusclient/client_test.go delete mode 100644 node/acl/acl.go delete mode 100644 node/acl/service.go diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index bf457374..81cd58a0 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/libp2p/go-libp2p-core/sec" + "github.com/libp2p/go-libp2p/core/sec" "storj.io/drpc/drpcctx" "sync" "sync/atomic" diff --git a/common/go.mod b/common/go.mod index c80a866c..8dfec05d 100644 --- a/common/go.mod +++ b/common/go.mod @@ -12,7 +12,6 @@ require ( github.com/huandu/skiplist v1.2.0 github.com/ipfs/go-cid v0.3.2 github.com/libp2p/go-libp2p v0.23.2 - github.com/libp2p/go-libp2p-core v0.20.1 github.com/minio/sha256-simd v1.0.0 github.com/multiformats/go-multibase v0.1.1 github.com/multiformats/go-multihash v0.2.1 diff --git a/common/go.sum b/common/go.sum index 3f5b91c2..03e87801 100644 --- a/common/go.sum +++ b/common/go.sum @@ -189,8 +189,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/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= diff --git a/common/net/dialer/dialer.go b/common/net/dialer/dialer.go index 10de1176..ebef079b 100644 --- a/common/net/dialer/dialer.go +++ b/common/net/dialer/dialer.go @@ -8,7 +8,7 @@ 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/libp2p/go-libp2p-core/sec" + "github.com/libp2p/go-libp2p/core/sec" "go.uber.org/zap" "net" "storj.io/drpc" diff --git a/common/net/peer/peer.go b/common/net/peer/peer.go index d73dc596..6056b0b9 100644 --- a/common/net/peer/peer.go +++ b/common/net/peer/peer.go @@ -2,7 +2,7 @@ package peer import ( "context" - "github.com/libp2p/go-libp2p-core/sec" + "github.com/libp2p/go-libp2p/core/sec" "storj.io/drpc" "sync/atomic" "time" diff --git a/common/net/rpc/rpctest/pool.go b/common/net/rpc/rpctest/pool.go new file mode 100644 index 00000000..7e73b226 --- /dev/null +++ b/common/net/rpc/rpctest/pool.go @@ -0,0 +1,98 @@ +package rpctest + +import ( + "context" + "errors" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" + "math/rand" + "storj.io/drpc" + "sync" + "time" +) + +var ErrCantConnect = errors.New("can't connect to test server") + +func NewTestPool() *TestPool { + return &TestPool{} +} + +type TestPool struct { + ts *TesServer + mu sync.Mutex +} + +func (t *TestPool) WithServer(ts *TesServer) *TestPool { + t.mu.Lock() + defer t.mu.Unlock() + t.ts = ts + return t +} + +func (t *TestPool) Get(ctx context.Context, id string) (peer.Peer, error) { + t.mu.Lock() + defer t.mu.Unlock() + if t.ts == nil { + return nil, ErrCantConnect + } + return &testPeer{id: id, Conn: t.ts.Dial()}, nil +} + +func (t *TestPool) Dial(ctx context.Context, id string) (peer.Peer, error) { + t.mu.Lock() + defer t.mu.Unlock() + if t.ts == nil { + return nil, ErrCantConnect + } + return &testPeer{id: id, Conn: t.ts.Dial()}, nil +} + +func (t *TestPool) GetOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) { + t.mu.Lock() + defer t.mu.Unlock() + if t.ts == nil { + return nil, ErrCantConnect + } + return &testPeer{id: peerIds[rand.Intn(len(peerIds))], Conn: t.ts.Dial()}, nil +} + +func (t *TestPool) DialOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) { + t.mu.Lock() + defer t.mu.Unlock() + if t.ts == nil { + return nil, ErrCantConnect + } + return &testPeer{id: peerIds[rand.Intn(len(peerIds))], Conn: t.ts.Dial()}, nil +} + +func (t *TestPool) Init(a *app.App) (err error) { + return nil +} + +func (t *TestPool) Name() (name string) { + return pool.CName +} + +func (t *TestPool) Run(ctx context.Context) (err error) { + return nil +} + +func (t *TestPool) Close(ctx context.Context) (err error) { + return nil +} + +type testPeer struct { + id string + drpc.Conn +} + +func (t testPeer) Id() string { + return t.id +} + +func (t testPeer) LastUsage() time.Time { + return time.Now() +} + +func (t testPeer) UpdateLastUsage() {} diff --git a/common/net/rpc/rpctest/server.go b/common/net/rpc/rpctest/server.go new file mode 100644 index 00000000..270067e4 --- /dev/null +++ b/common/net/rpc/rpctest/server.go @@ -0,0 +1,29 @@ +package rpctest + +import ( + "context" + "net" + "storj.io/drpc" + "storj.io/drpc/drpcconn" + "storj.io/drpc/drpcmux" + "storj.io/drpc/drpcserver" +) + +func NewTestServer() *TesServer { + ts := &TesServer{ + Mux: drpcmux.New(), + } + ts.Server = drpcserver.New(ts.Mux) + return ts +} + +type TesServer struct { + *drpcmux.Mux + *drpcserver.Server +} + +func (ts *TesServer) Dial() drpc.Conn { + sc, cc := net.Pipe() + go ts.Server.ServeOne(context.Background(), sc) + return drpcconn.New(cc) +} diff --git a/common/net/rpc/server/drpcserver.go b/common/net/rpc/server/drpcserver.go index 74a41c0e..3d1341b6 100644 --- a/common/net/rpc/server/drpcserver.go +++ b/common/net/rpc/server/drpcserver.go @@ -4,9 +4,9 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric" - secure2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" "github.com/prometheus/client_golang/prometheus" "github.com/zeebo/errs" "go.uber.org/zap" @@ -32,22 +32,22 @@ type DRPCServer interface { } type configGetter interface { - GetGRPCServer() config2.GrpcServer + GetGRPCServer() config.GrpcServer } type drpcServer struct { - config config2.GrpcServer + config config.GrpcServer drpcServer *drpcserver.Server - transport secure2.Service - listeners []secure2.ContextListener + transport secure.Service + listeners []secure.ContextListener metric metric.Metric cancel func() *drpcmux.Mux } func (s *drpcServer) Init(a *app.App) (err error) { - s.config = a.MustComponent(config2.CName).(configGetter).GetGRPCServer() - s.transport = a.MustComponent(secure2.CName).(secure2.Service) + s.config = a.MustComponent(config.CName).(configGetter).GetGRPCServer() + s.transport = a.MustComponent(secure.CName).(secure.Service) s.metric = a.MustComponent(metric.CName).(metric.Metric) return nil } @@ -87,7 +87,7 @@ func (s *drpcServer) Run(ctx context.Context) (err error) { return } -func (s *drpcServer) serve(ctx context.Context, lis secure2.ContextListener) { +func (s *drpcServer) serve(ctx context.Context, lis secure.ContextListener) { l := log.With(zap.String("localAddr", lis.Addr().String())) l.Info("drpc listener started") defer func() { @@ -111,7 +111,7 @@ func (s *drpcServer) serve(ctx context.Context, lis secure2.ContextListener) { } continue } - if _, ok := err.(secure2.HandshakeError); ok { + if _, ok := err.(secure.HandshakeError); ok { l.Warn("listener handshake error", zap.Error(err)) continue } diff --git a/common/net/secure/context.go b/common/net/secure/context.go index c38da959..e22b3b00 100644 --- a/common/net/secure/context.go +++ b/common/net/secure/context.go @@ -3,7 +3,7 @@ package secure import ( "context" "errors" - "github.com/libp2p/go-libp2p-core/sec" + "github.com/libp2p/go-libp2p/core/sec" ) var ( diff --git a/common/net/secure/listener.go b/common/net/secure/listener.go index a0c61d56..b7c31b26 100644 --- a/common/net/secure/listener.go +++ b/common/net/secure/listener.go @@ -2,7 +2,7 @@ package secure import ( "context" - "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p/core/crypto" libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls" "net" ) diff --git a/common/net/secure/service.go b/common/net/secure/service.go index 51a92c0e..d47ebd4b 100644 --- a/common/net/secure/service.go +++ b/common/net/secure/service.go @@ -2,13 +2,13 @@ package secure import ( "context" + commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" - "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/sec" + "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/sec" libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls" "go.uber.org/zap" "net" diff --git a/common/nodeconf/configuration.go b/common/nodeconf/configuration.go index add0647e..eecc53c3 100644 --- a/common/nodeconf/configuration.go +++ b/common/nodeconf/configuration.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination mock_nodeconf/mock_nodeconf.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf Configuration,ConfConnector +//go:generate mockgen -destination mock_nodeconf/mock_nodeconf.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf Service,Configuration,ConfConnector package nodeconf import ( diff --git a/common/nodeconf/mock_nodeconf/mock_nodeconf.go b/common/nodeconf/mock_nodeconf/mock_nodeconf.go index a22e4a6e..206c2528 100644 --- a/common/nodeconf/mock_nodeconf/mock_nodeconf.go +++ b/common/nodeconf/mock_nodeconf/mock_nodeconf.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf (interfaces: Configuration,ConfConnector) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf (interfaces: Service,Configuration,ConfConnector) // Package mock_nodeconf is a generated GoMock package. package mock_nodeconf @@ -8,10 +8,105 @@ import ( context "context" reflect "reflect" + app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" peer "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" + nodeconf "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" gomock "github.com/golang/mock/gomock" ) +// MockService is a mock of Service interface. +type MockService struct { + ctrl *gomock.Controller + recorder *MockServiceMockRecorder +} + +// MockServiceMockRecorder is the mock recorder for MockService. +type MockServiceMockRecorder struct { + mock *MockService +} + +// NewMockService creates a new mock instance. +func NewMockService(ctrl *gomock.Controller) *MockService { + mock := &MockService{ctrl: ctrl} + mock.recorder = &MockServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockService) EXPECT() *MockServiceMockRecorder { + return m.recorder +} + +// ConsensusPeers mocks base method. +func (m *MockService) ConsensusPeers() []string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ConsensusPeers") + ret0, _ := ret[0].([]string) + return ret0 +} + +// ConsensusPeers indicates an expected call of ConsensusPeers. +func (mr *MockServiceMockRecorder) ConsensusPeers() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConsensusPeers", reflect.TypeOf((*MockService)(nil).ConsensusPeers)) +} + +// GetById mocks base method. +func (m *MockService) GetById(arg0 string) nodeconf.Configuration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetById", arg0) + ret0, _ := ret[0].(nodeconf.Configuration) + return ret0 +} + +// GetById indicates an expected call of GetById. +func (mr *MockServiceMockRecorder) GetById(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetById", reflect.TypeOf((*MockService)(nil).GetById), arg0) +} + +// GetLast mocks base method. +func (m *MockService) GetLast() nodeconf.Configuration { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetLast") + ret0, _ := ret[0].(nodeconf.Configuration) + return ret0 +} + +// GetLast indicates an expected call of GetLast. +func (mr *MockServiceMockRecorder) GetLast() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLast", reflect.TypeOf((*MockService)(nil).GetLast)) +} + +// Init mocks base method. +func (m *MockService) Init(arg0 *app.App) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Init", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Init indicates an expected call of Init. +func (mr *MockServiceMockRecorder) Init(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockService)(nil).Init), arg0) +} + +// Name mocks base method. +func (m *MockService) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *MockServiceMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockService)(nil).Name)) +} + // MockConfiguration is a mock of Configuration interface. type MockConfiguration struct { ctrl *gomock.Controller diff --git a/common/nodeconf/service.go b/common/nodeconf/service.go index 6684b571..babf13ba 100644 --- a/common/nodeconf/service.go +++ b/common/nodeconf/service.go @@ -3,10 +3,10 @@ package nodeconf import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" - encryptionkey2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" - signingkey2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-chash" ) @@ -36,8 +36,8 @@ type service struct { type Node struct { Address string PeerId string - SigningKey signingkey2.PubKey - EncryptionKey encryptionkey2.PubKey + SigningKey signingkey.PubKey + EncryptionKey encryptionkey.PubKey } func (n *Node) Id() string { @@ -49,7 +49,7 @@ func (n *Node) Capacity() float64 { } func (s *service) Init(a *app.App) (err error) { - conf := a.MustComponent(config2.CName).(*config2.Config) + conf := a.MustComponent(config.CName).(*config.Config) s.accountId = conf.Account.PeerId config := &configuration{ @@ -100,10 +100,10 @@ func (s *service) ConsensusPeers() []string { } func nodeFromConfigNode( - n config2.Node) (*Node, error) { + n config.Node) (*Node, error) { decodedSigningKey, err := keys.DecodeKeyFromString( n.SigningKey, - signingkey2.UnmarshalEd25519PrivateKey, + signingkey.UnmarshalEd25519PrivateKey, nil) if err != nil { return nil, err @@ -111,7 +111,7 @@ func nodeFromConfigNode( decodedEncryptionKey, err := keys.DecodeKeyFromString( n.EncryptionKey, - encryptionkey2.NewEncryptionRsaPrivKeyFromBytes, + encryptionkey.NewEncryptionRsaPrivKeyFromBytes, nil) if err != nil { return nil, err diff --git a/common/util/peer/peer.go b/common/util/peer/peer.go index 00f5d5c3..32ea21ee 100644 --- a/common/util/peer/peer.go +++ b/common/util/peer/peer.go @@ -2,8 +2,8 @@ package peer import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" - "github.com/libp2p/go-libp2p-core/crypto" - "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" ) func IDFromSigningPubKey(pubKey signingkey.PubKey) (peer.ID, error) { diff --git a/consensus/consensusclient/client.go b/consensus/consensusclient/client.go index 0df9fbdb..9d08617b 100644 --- a/consensus/consensusclient/client.go +++ b/consensus/consensusclient/client.go @@ -2,37 +2,65 @@ package consensusclient import ( "context" + "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "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/consensus/consensusproto" + _ "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" + "go.uber.org/zap" + "sync" + "time" ) const CName = "consensus.client" var log = logger.NewNamed(CName) +var ( + ErrWatcherExists = errors.New("watcher exists") + ErrWatcherNotExists = errors.New("watcher not exists") +) + func New() Service { return new(service) } +// Watcher watches new events by specified logId +type Watcher interface { + AddConsensusRecords(recs []*consensusproto.Record) + AddConsensusError(err error) +} + type Service interface { + // AddLog adds new log to consensus servers AddLog(ctx context.Context, clog *consensusproto.Log) (err error) + // AddRecord adds new record to consensus servers AddRecord(ctx context.Context, logId []byte, clog *consensusproto.Record) (err error) - WatchLog(ctx context.Context) (stream Stream, err error) - app.Component + // Watch starts watching to given logId and calls watcher when any relative event received + Watch(logId []byte, w Watcher) (err error) + // UnWatch stops watching given logId and removes watcher + UnWatch(logId []byte) (err error) + app.ComponentRunnable } type service struct { pool pool.Pool nodeconf nodeconf.Service + + watchers map[string]Watcher + stream *stream + close chan struct{} + mu sync.Mutex } func (s *service) Init(a *app.App) (err error) { s.pool = a.MustComponent(pool.CName).(pool.Pool) s.nodeconf = a.MustComponent(nodeconf.CName).(nodeconf.Service) + s.watchers = make(map[string]Watcher) + s.close = make(chan struct{}) return nil } @@ -40,6 +68,11 @@ func (s *service) Name() (name string) { return CName } +func (s *service) Run(_ context.Context) error { + go s.streamWatcher() + return nil +} + func (s *service) getClient(ctx context.Context) (consensusproto.DRPCConsensusClient, error) { peer, err := s.pool.GetOneOf(ctx, s.nodeconf.ConsensusPeers()) if err != nil { @@ -83,7 +116,37 @@ func (s *service) AddRecord(ctx context.Context, logId []byte, clog *consensuspr return } -func (s *service) WatchLog(ctx context.Context) (st Stream, err error) { +func (s *service) Watch(logId []byte, w Watcher) (err error) { + s.mu.Lock() + defer s.mu.Unlock() + if _, ok := s.watchers[string(logId)]; ok { + return ErrWatcherExists + } + s.watchers[string(logId)] = w + if s.stream != nil { + if wErr := s.stream.WatchIds([][]byte{logId}); wErr != nil { + log.Warn("WatchIds error", zap.Error(wErr)) + } + } + return +} + +func (s *service) UnWatch(logId []byte) (err error) { + s.mu.Lock() + defer s.mu.Unlock() + if _, ok := s.watchers[string(logId)]; !ok { + return ErrWatcherNotExists + } + delete(s.watchers, string(logId)) + if s.stream != nil { + if wErr := s.stream.UnwatchIds([][]byte{logId}); wErr != nil { + log.Warn("UnWatchIds error", zap.Error(wErr)) + } + } + return +} + +func (s *service) openStream(ctx context.Context) (st *stream, err error) { cl, err := s.dialClient(ctx) if err != nil { return @@ -94,3 +157,87 @@ func (s *service) WatchLog(ctx context.Context) (st Stream, err error) { } return runStream(rpcStream), nil } + +func (s *service) streamWatcher() { + var ( + err error + st *stream + i int + ) + for { + // open stream + if st, err = s.openStream(context.Background()); err != nil { + // can't open stream, we will retry until success connection or close + if i < 60 { + i++ + } + sleepTime := time.Second * time.Duration(i) + log.Error("watch log error", zap.Error(err), zap.Duration("waitTime", sleepTime)) + select { + case <-time.After(sleepTime): + continue + case <-s.close: + return + } + } + i = 0 + + // collect ids and setup stream + s.mu.Lock() + var logIds = make([][]byte, 0, len(s.watchers)) + for id := range s.watchers { + logIds = append(logIds, []byte(id)) + } + s.stream = st + s.mu.Unlock() + + // restore subscriptions + if len(logIds) > 0 { + if err = s.stream.WatchIds(logIds); err != nil { + log.Error("watch ids error", zap.Error(err)) + continue + } + } + + // read stream + if err = s.streamReader(); err != nil { + log.Error("stream read error", zap.Error(err)) + continue + } + return + } +} + +func (s *service) streamReader() error { + for { + events := s.stream.WaitLogs() + if len(events) == 0 { + return s.stream.Err() + } + for _, e := range events { + if w, ok := s.watchers[string(e.LogId)]; ok { + if e.Error == nil { + w.AddConsensusRecords(e.Records) + } else { + w.AddConsensusError(rpcerr.Err(uint64(e.Error.Error))) + } + } else { + log.Warn("received unexpected log id", zap.Binary("logId", e.LogId)) + } + } + } +} + +func (s *service) Close(_ context.Context) error { + s.mu.Lock() + if s.stream != nil { + _ = s.stream.Close() + } + s.mu.Unlock() + select { + case <-s.close: + default: + close(s.close) + } + return nil +} diff --git a/consensus/consensusclient/client_test.go b/consensus/consensusclient/client_test.go new file mode 100644 index 00000000..f27787ab --- /dev/null +++ b/consensus/consensusclient/client_test.go @@ -0,0 +1,221 @@ +package consensusclient + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpctest" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf/mock_nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +func TestService_Watch(t *testing.T) { + t.Run("not found error", func(t *testing.T) { + fx := newFixture(t).run(t) + defer fx.Finish() + var logId = []byte{'1'} + w := &testWatcher{} + require.NoError(t, fx.Watch(logId, w)) + st := fx.testServer.waitStream(t) + req, err := st.Recv() + require.NoError(t, err) + assert.Equal(t, [][]byte{logId}, req.WatchIds) + require.NoError(t, st.Send(&consensusproto.WatchLogEvent{ + LogId: logId, + Error: &consensusproto.Err{ + Error: consensusproto.ErrCodes_ErrorOffset + consensusproto.ErrCodes_LogNotFound, + }, + })) + assert.Equal(t, consensuserr.ErrLogNotFound, w.err) + fx.testServer.releaseStream <- nil + }) + t.Run("watcherExists error", func(t *testing.T) { + fx := newFixture(t).run(t) + defer fx.Finish() + var logId = []byte{'1'} + w := &testWatcher{} + require.NoError(t, fx.Watch(logId, w)) + require.Error(t, fx.Watch(logId, w)) + st := fx.testServer.waitStream(t) + st.Recv() + fx.testServer.releaseStream <- nil + }) + t.Run("watch", func(t *testing.T) { + fx := newFixture(t).run(t) + defer fx.Finish() + var logId1 = []byte{'1'} + w := &testWatcher{} + require.NoError(t, fx.Watch(logId1, w)) + st := fx.testServer.waitStream(t) + req, err := st.Recv() + require.NoError(t, err) + assert.Equal(t, [][]byte{logId1}, req.WatchIds) + + var logId2 = []byte{'2'} + w = &testWatcher{} + require.NoError(t, fx.Watch(logId2, w)) + req, err = st.Recv() + require.NoError(t, err) + assert.Equal(t, [][]byte{logId2}, req.WatchIds) + + fx.testServer.releaseStream <- nil + }) +} + +func TestService_UnWatch(t *testing.T) { + t.Run("no watcher", func(t *testing.T) { + fx := newFixture(t).run(t) + defer fx.Finish() + require.Error(t, fx.UnWatch([]byte{'1'})) + }) + t.Run("success", func(t *testing.T) { + fx := newFixture(t).run(t) + defer fx.Finish() + w := &testWatcher{} + require.NoError(t, fx.Watch([]byte{'1'}, w)) + assert.NoError(t, fx.UnWatch([]byte{'1'})) + }) +} + +func TestService_Init(t *testing.T) { + t.Run("reconnect on watch err", func(t *testing.T) { + fx := newFixture(t) + fx.testServer.watchErrOnce = true + fx.run(t) + defer fx.Finish() + fx.testServer.waitStream(t) + fx.testServer.releaseStream <- nil + }) + t.Run("reconnect on start", func(t *testing.T) { + fx := newFixture(t) + fx.a.MustComponent(pool.CName).(*rpctest.TestPool).WithServer(nil) + fx.run(t) + defer fx.Finish() + time.Sleep(time.Millisecond * 50) + fx.a.MustComponent(pool.CName).(*rpctest.TestPool).WithServer(fx.drpcTS) + fx.testServer.waitStream(t) + fx.testServer.releaseStream <- nil + }) +} + +func TestService_AddLog(t *testing.T) { + fx := newFixture(t).run(t) + defer fx.Finish() + assert.NoError(t, fx.AddLog(ctx, &consensusproto.Log{})) +} + +func TestService_AddRecord(t *testing.T) { + fx := newFixture(t).run(t) + defer fx.Finish() + assert.NoError(t, fx.AddRecord(ctx, []byte{'1'}, &consensusproto.Record{})) +} + +var ctx = context.Background() + +func newFixture(t *testing.T) *fixture { + fx := &fixture{ + Service: New(), + a: &app.App{}, + ctrl: gomock.NewController(t), + testServer: &testServer{ + stream: make(chan consensusproto.DRPCConsensus_WatchLogStream), + releaseStream: make(chan error), + }, + } + fx.nodeconf = mock_nodeconf.NewMockService(fx.ctrl) + fx.nodeconf.EXPECT().Init(gomock.Any()) + fx.nodeconf.EXPECT().Name().Return(nodeconf.CName).AnyTimes() + fx.nodeconf.EXPECT().ConsensusPeers().Return([]string{"c1", "c2"}).AnyTimes() + fx.drpcTS = rpctest.NewTestServer() + require.NoError(t, consensusproto.DRPCRegisterConsensus(fx.drpcTS.Mux, fx.testServer)) + fx.a.Register(fx.Service). + Register(fx.nodeconf). + Register(rpctest.NewTestPool().WithServer(fx.drpcTS)) + return fx +} + +type fixture struct { + Service + nodeconf *mock_nodeconf.MockService + a *app.App + ctrl *gomock.Controller + testServer *testServer + drpcTS *rpctest.TesServer +} + +func (fx *fixture) run(t *testing.T) *fixture { + require.NoError(t, fx.a.Start(ctx)) + return fx +} + +func (fx *fixture) Finish() { + assert.NoError(fx.ctrl.T, fx.a.Close(ctx)) + fx.ctrl.Finish() +} + +type testServer struct { + stream chan consensusproto.DRPCConsensus_WatchLogStream + addLog func(ctx context.Context, req *consensusproto.AddLogRequest) error + addRecord func(ctx context.Context, req *consensusproto.AddRecordRequest) error + releaseStream chan error + watchErrOnce bool +} + +func (t *testServer) AddLog(ctx context.Context, req *consensusproto.AddLogRequest) (*consensusproto.Ok, error) { + if t.addLog != nil { + if err := t.addLog(ctx, req); err != nil { + return nil, err + } + } + return &consensusproto.Ok{}, nil +} + +func (t *testServer) AddRecord(ctx context.Context, req *consensusproto.AddRecordRequest) (*consensusproto.Ok, error) { + if t.addRecord != nil { + if err := t.addRecord(ctx, req); err != nil { + return nil, err + } + } + return &consensusproto.Ok{}, nil +} + +func (t *testServer) WatchLog(stream consensusproto.DRPCConsensus_WatchLogStream) error { + fmt.Println("watchLog", t.watchErrOnce) + if t.watchErrOnce { + t.watchErrOnce = false + return fmt.Errorf("error") + } + t.stream <- stream + return <-t.releaseStream +} + +func (t *testServer) waitStream(test *testing.T) consensusproto.DRPCConsensus_WatchLogStream { + select { + case <-time.After(time.Second * 5): + test.Fatalf("waiteStream timeout") + case st := <-t.stream: + return st + } + return nil +} + +type testWatcher struct { + recs [][]*consensusproto.Record + err error +} + +func (t *testWatcher) AddConsensusRecords(recs []*consensusproto.Record) { + t.recs = append(t.recs, recs) +} + +func (t *testWatcher) AddConsensusError(err error) { + t.err = err +} diff --git a/consensus/consensusclient/stream.go b/consensus/consensusclient/stream.go index d2f1a055..d3383629 100644 --- a/consensus/consensusclient/stream.go +++ b/consensus/consensusclient/stream.go @@ -5,18 +5,10 @@ import ( "github.com/cheggaaa/mb/v2" ) -type Stream interface { - WatchIds(logIds [][]byte) (err error) - UnwatchIds(logIds [][]byte) (err error) - WaitLogs() []*consensusproto.Log - Err() error - Close() error -} - -func runStream(rpcStream consensusproto.DRPCConsensus_WatchLogClient) Stream { +func runStream(rpcStream consensusproto.DRPCConsensus_WatchLogClient) *stream { st := &stream{ rpcStream: rpcStream, - mb: mb.New((*consensusproto.Log)(nil), 100), + mb: mb.New((*consensusproto.WatchLogEvent)(nil), 100), } go st.readStream() return st @@ -24,7 +16,7 @@ func runStream(rpcStream consensusproto.DRPCConsensus_WatchLogClient) Stream { type stream struct { rpcStream consensusproto.DRPCConsensus_WatchLogClient - mb *mb.MB[*consensusproto.Log] + mb *mb.MB[*consensusproto.WatchLogEvent] err error } @@ -40,7 +32,7 @@ func (s *stream) UnwatchIds(logIds [][]byte) (err error) { }) } -func (s *stream) WaitLogs() []*consensusproto.Log { +func (s *stream) WaitLogs() []*consensusproto.WatchLogEvent { return s.mb.Wait() } @@ -56,10 +48,7 @@ func (s *stream) readStream() { s.err = err return } - if err = s.mb.Add(&consensusproto.Log{ - Id: event.LogId, - Records: event.Records, - }); err != nil { + if err = s.mb.Add(event); err != nil { return } } diff --git a/node/acl/acl.go b/node/acl/acl.go deleted file mode 100644 index e564307a..00000000 --- a/node/acl/acl.go +++ /dev/null @@ -1 +0,0 @@ -package acl diff --git a/node/acl/service.go b/node/acl/service.go deleted file mode 100644 index 9c080c48..00000000 --- a/node/acl/service.go +++ /dev/null @@ -1,38 +0,0 @@ -package acl - -import ( - "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient" -) - -const CName = "node.acl" - -type Service interface { - app.ComponentRunnable -} - -type aclService struct { - cons consensusclient.Service - stream consensusclient.Stream -} - -func (as *aclService) Init(a *app.App) (err error) { - as.cons = a.MustComponent(consensusclient.CName).(consensusclient.Service) - return nil -} - -func (as *aclService) Name() (name string) { - return CName -} - -func (as *aclService) Run(ctx context.Context) (err error) { - if as.stream, err = as.cons.WatchLog(ctx); err != nil { - return - } - return nil -} - -func (as *aclService) Close(ctx context.Context) (err error) { - return as.stream.Close() -} diff --git a/node/go.mod b/node/go.mod index a4bd1708..a65cf8f2 100644 --- a/node/go.mod +++ b/node/go.mod @@ -4,9 +4,12 @@ go 1.19 replace github.com/anytypeio/go-anytype-infrastructure-experiments/common => ../common +replace github.com/anytypeio/go-anytype-infrastructure-experiments/consensus => ../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 go.uber.org/zap v1.23.0 ) @@ -15,6 +18,7 @@ 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/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 @@ -52,7 +56,7 @@ require ( 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-20220525230936-793ad666bf5e // indirect + golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect golang.org/x/image v0.0.0-20200119044424-58c23975cae1 // indirect golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect google.golang.org/protobuf v1.28.1 // indirect diff --git a/node/go.sum b/node/go.sum index 4cbd9bb1..55067483 100644 --- a/node/go.sum +++ b/node/go.sum @@ -57,6 +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/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= @@ -310,8 +312,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= From e8353897eb0412a6c21eb2578cc9fb8b8b8ea408 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 20 Oct 2022 20:20:03 +0300 Subject: [PATCH 173/219] fix tests + remove consensus testclient --- .../cmd/testclient/consensustestclient.go | 367 ------------------ consensus/consensus.go | 2 +- 2 files changed, 1 insertion(+), 368 deletions(-) delete mode 100644 consensus/cmd/testclient/consensustestclient.go diff --git a/consensus/cmd/testclient/consensustestclient.go b/consensus/cmd/testclient/consensustestclient.go deleted file mode 100644 index 45d31152..00000000 --- a/consensus/cmd/testclient/consensustestclient.go +++ /dev/null @@ -1,367 +0,0 @@ -package main - -import ( - "bytes" - "context" - "flag" - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" - "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/account" - "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient" - "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr" - "go.uber.org/zap" - "gopkg.in/mgo.v2/bson" - "math/rand" - "net/http" - _ "net/http/pprof" - "os" - "os/signal" - "sync" - "syscall" - "time" -) - -var log = logger.NewNamed("main") - -var ( - flagConfigFile = flag.String("c", "etc/consensus-config.yml", "path to config file") - flagVersion = flag.Bool("v", false, "show version and exit") - flagHelp = flag.Bool("h", false, "show help and exit") -) - -func main() { - flag.Parse() - rand.Seed(time.Now().UnixNano()) - if *flagVersion { - fmt.Println(app.VersionDescription()) - return - } - if *flagHelp { - flag.PrintDefaults() - return - } - - if debug, ok := os.LookupEnv("ANYPROF"); ok && debug != "" { - go func() { - http.ListenAndServe(debug, nil) - }() - } - - // create app - ctx := context.Background() - a := new(app.App) - - // open config file - conf, err := config.NewFromFile(*flagConfigFile) - if err != nil { - log.Fatal("can't open config file", zap.Error(err)) - } - - // bootstrap components - a.Register(conf) - Bootstrap(a) - - // start app - if err := a.Start(ctx); err != nil { - log.Fatal("can't start app", zap.Error(err)) - } - log.Info("app started", zap.String("version", a.Version())) - - if err := testClient(a.MustComponent(consensusclient.CName).(consensusclient.Service)); err != nil { - log.Fatal("test error", zap.Error(err)) - } else { - log.Info("test success!") - } - - b := &bench{service: a.MustComponent(consensusclient.CName).(consensusclient.Service)} - b.run() - - // wait exit signal - exit := make(chan os.Signal, 1) - signal.Notify(exit, os.Interrupt, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT) - sig := <-exit - log.Info("received exit signal, stop app...", zap.String("signal", fmt.Sprint(sig))) - - // close app - ctx, cancel := context.WithTimeout(ctx, time.Minute) - defer cancel() - if err := a.Close(ctx); err != nil { - log.Fatal("close error", zap.Error(err)) - } else { - log.Info("goodbye!") - } - time.Sleep(time.Second / 3) -} - -func Bootstrap(a *app.App) { - a.Register(account.New()). - Register(secure.New()). - Register(nodeconf.New()). - Register(dialer.New()). - Register(pool.New()). - Register(consensusclient.New()) -} - -func testClient(service consensusclient.Service) (err error) { - if err = testCreateLogAndRecord(service); err != nil { - return err - } - if err = testStream(service); err != nil { - return err - } - return -} - -func testCreateLogAndRecord(service consensusclient.Service) (err error) { - ctx := context.Background() - - // create log - newLogId := []byte(bson.NewObjectId()) - st := time.Now() - lastRecId := []byte(bson.NewObjectId()) - err = service.AddLog(ctx, &consensusproto.Log{ - Id: newLogId, - Records: []*consensusproto.Record{ - { - Id: lastRecId, - Payload: []byte("test"), - CreatedUnix: uint64(time.Now().Unix()), - }, - }, - }) - if err != nil { - return err - } - log.Info("log created", zap.String("id", bson.ObjectId(newLogId).Hex()), zap.Duration("dur", time.Since(st))) - - // create log with same id - st = time.Now() - - err = service.AddLog(ctx, &consensusproto.Log{ - Id: newLogId, - Records: []*consensusproto.Record{ - { - Id: lastRecId, - Payload: []byte("test"), - CreatedUnix: uint64(time.Now().Unix()), - }, - }, - }) - if err != consensuserr.ErrLogExists { - return fmt.Errorf("unexpected error: '%v' want LogExists", zap.Error(err)) - } - err = nil - log.Info("log duplicate checked", zap.Duration("dur", time.Since(st))) - - // create record - st = time.Now() - recId := []byte(bson.NewObjectId()) - err = service.AddRecord(ctx, newLogId, &consensusproto.Record{ - Id: []byte(bson.NewObjectId()), - PrevId: lastRecId, - CreatedUnix: uint64(time.Now().Unix()), - }) - if err != nil { - return err - } - lastRecId = recId - log.Info("record created", zap.String("id", bson.ObjectId(lastRecId).Hex()), zap.Duration("dur", time.Since(st))) - - // record conflict - st = time.Now() - err = service.AddRecord(ctx, newLogId, &consensusproto.Record{ - Id: []byte(bson.NewObjectId()), - PrevId: []byte(bson.NewObjectId()), - CreatedUnix: uint64(time.Now().Unix()), - }) - if err != consensuserr.ErrConflict { - return fmt.Errorf("unexpected error: '%v' want Conflict", zap.Error(err)) - } - err = nil - log.Info("conflict record checked", zap.Duration("dur", time.Since(st))) - - return -} - -func testStream(service consensusclient.Service) (err error) { - ctx := context.Background() - - // create log - newLogId := []byte(bson.NewObjectId()) - st := time.Now() - lastRecId := []byte(bson.NewObjectId()) - err = service.AddLog(ctx, &consensusproto.Log{ - Id: newLogId, - Records: []*consensusproto.Record{ - { - Id: lastRecId, - Payload: []byte("test"), - CreatedUnix: uint64(time.Now().Unix()), - }, - }, - }) - if err != nil { - return err - } - log.Info("log created", zap.String("id", bson.ObjectId(newLogId).Hex()), zap.Duration("dur", time.Since(st))) - - stream, err := service.WatchLog(ctx) - if err != nil { - return err - } - defer stream.Close() - - st = time.Now() - if err = stream.WatchIds([][]byte{newLogId}); err != nil { - return err - } - log.Info("watch", zap.String("id", bson.ObjectId(newLogId).Hex()), zap.Duration("dur", time.Since(st))) - - sr := readStream(stream) - for i := 0; i < 10; i++ { - st = time.Now() - recId := []byte(bson.NewObjectId()) - err = service.AddRecord(ctx, newLogId, &consensusproto.Record{ - Id: recId, - PrevId: lastRecId, - CreatedUnix: uint64(time.Now().Unix()), - }) - if err != nil { - return err - } - lastRecId = recId - log.Info("record created", zap.String("id", bson.ObjectId(lastRecId).Hex()), zap.Duration("dur", time.Since(st))) - } - sr.validate() - return nil -} - -func readStream(stream consensusclient.Stream) *streamReader { - sr := &streamReader{stream: stream, logs: map[string]*consensusproto.Log{}} - go sr.read() - return sr -} - -type streamReader struct { - stream consensusclient.Stream - logs map[string]*consensusproto.Log -} - -func (sr *streamReader) read() { - for { - recs := sr.stream.WaitLogs() - if len(recs) == 0 { - return - } - for _, rec := range recs { - if el, ok := sr.logs[string(rec.Id)]; !ok { - sr.logs[string(rec.Id)] = &consensusproto.Log{ - Id: rec.Id, - Records: rec.Records, - } - } else { - el.Records = append(rec.Records, el.Records...) - sr.logs[string(rec.Id)] = el - } - } - } -} - -func (sr *streamReader) validate() { - var lc, rc int - for _, log := range sr.logs { - lc++ - rc += len(log.Records) - validateLog(log) - } - fmt.Println("logs valid; log count:", lc, "records:", rc) -} - -func validateLog(log *consensusproto.Log) { - var prevId []byte - for _, rec := range log.Records { - if len(prevId) != 0 { - if !bytes.Equal(prevId, rec.Id) { - panic(fmt.Sprintf("invalid log: %+v", log)) - } - } - prevId = rec.PrevId - } -} - -type bench struct { - service consensusclient.Service - stream consensusclient.Stream -} - -func (b *bench) run() { - var err error - b.stream, err = b.service.WatchLog(context.Background()) - if err != nil { - panic(err) - } - defer b.stream.Close() - sr := readStream(b.stream) - var wg sync.WaitGroup - for i := 0; i < 1000; i++ { - time.Sleep(time.Second / 100) - wg.Add(1) - go func() { - defer wg.Done() - b.client() - }() - fmt.Println("total streams:", i+1) - } - wg.Wait() - sr.validate() -} - -func (b *bench) client() { - ctx := context.Background() - - // create log - newLogId := []byte(bson.NewObjectId()) - lastRecId := []byte(bson.NewObjectId()) - err := b.service.AddLog(ctx, &consensusproto.Log{ - Id: newLogId, - Records: []*consensusproto.Record{ - { - Id: lastRecId, - Payload: []byte("test"), - CreatedUnix: uint64(time.Now().Unix()), - }, - }, - }) - for i := 0; i < 5; i++ { - fmt.Println("watch", bson.ObjectId(newLogId).Hex()) - if err = b.stream.WatchIds([][]byte{newLogId}); err != nil { - panic(err) - } - for i := 0; i < rand.Intn(20); i++ { - time.Sleep(time.Millisecond * time.Duration(rand.Intn(10000))) - recId := []byte(bson.NewObjectId()) - err = b.service.AddRecord(ctx, newLogId, &consensusproto.Record{ - Id: recId, - PrevId: lastRecId, - Payload: []byte("some payload 1 2 3 4 5 6 6 7 oijoj"), - CreatedUnix: uint64(time.Now().Unix()), - }) - if err != nil { - panic(err) - } - lastRecId = recId - } - if err = b.stream.UnwatchIds([][]byte{newLogId}); err != nil { - panic(err) - } - fmt.Println("unwatch", bson.ObjectId(newLogId).Hex()) - time.Sleep(time.Minute * 1) - } -} diff --git a/consensus/consensus.go b/consensus/consensus.go index 7098984e..02371b1b 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -5,7 +5,7 @@ import "time" type Log struct { Id []byte `bson:"_id"` Records []Record `bson:"records"` - Err error + Err error `bson:"-"` } type Record struct { From aa47d8ecf8569a839341c68cb24e22492e04e61f Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 20 Oct 2022 19:39:45 +0200 Subject: [PATCH 174/219] Fix listener sync tree and diff iter bug --- common/commonspace/synctree/synctree.go | 16 +++++++++------- common/pkg/ldiff/diff.go | 2 ++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 4c83cf95..4ed4e255 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -134,13 +134,15 @@ func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeprot if err != nil { return } - switch res.Mode { - case tree2.Nothing: - return - case tree2.Append: - s.listener.Update(s) - case tree2.Rebuild: - s.listener.Rebuild(s) + if s.listener != nil { + switch res.Mode { + case tree2.Nothing: + return + case tree2.Append: + s.listener.Update(s) + case tree2.Rebuild: + s.listener.Rebuild(s) + } } headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added) diff --git a/common/pkg/ldiff/diff.go b/common/pkg/ldiff/diff.go index 495f6388..840de719 100644 --- a/common/pkg/ldiff/diff.go +++ b/common/pkg/ldiff/diff.go @@ -149,6 +149,7 @@ func (d *diff) Ids() (ids []string) { for cur != nil { el := cur.Key().(*element).Element ids = append(ids, el.Id) + cur = cur.Next() } return } @@ -163,6 +164,7 @@ func (d *diff) Elements() (elements []Element) { for cur != nil { el := cur.Key().(*element).Element elements = append(elements, el) + cur = cur.Next() } return } From 3a3d21cd01ad2e6e0de8066e97a6cb3c8d45c410 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 20 Oct 2022 20:12:00 +0200 Subject: [PATCH 175/219] Raw loader and key fixes --- common/pkg/acl/tree/rawloader.go | 4 +++- node/storage/keys.go | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/common/pkg/acl/tree/rawloader.go b/common/pkg/acl/tree/rawloader.go index bc39688c..e6c556ff 100644 --- a/common/pkg/acl/tree/rawloader.go +++ b/common/pkg/acl/tree/rawloader.go @@ -73,7 +73,9 @@ func (r *rawChangeLoader) LoadFromTree(t *Tree, breakpoints []string) ([]*treech // now starting from breakpoints stack = stack[:0] for _, h := range breakpoints { - stack = append(stack, t.attached[h]) + if c, exists := t.attached[h]; exists { + stack = append(stack, c) + } } // doing another dfs to get all changes before breakpoints, we need to exclude them from results diff --git a/node/storage/keys.go b/node/storage/keys.go index 8792929a..85dd46aa 100644 --- a/node/storage/keys.go +++ b/node/storage/keys.go @@ -62,5 +62,5 @@ func (s spaceKeys) HeaderKey() []byte { } func isRootIdKey(key string) bool { - return strings.HasPrefix(key, "t/") && strings.HasSuffix(key, "rootId") + return strings.HasPrefix(key, "t/") && strings.HasSuffix(key, "heads") } From 829cfb305415c3000a5b255a74d08947b748ac70 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 20 Oct 2022 21:48:31 +0200 Subject: [PATCH 176/219] Fix bug with nested read locks in diff --- common/pkg/acl/tree/objecttree.go | 2 ++ common/pkg/ldiff/diff.go | 7 ++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/common/pkg/acl/tree/objecttree.go b/common/pkg/acl/tree/objecttree.go index b7a15e0a..a89b3a29 100644 --- a/common/pkg/acl/tree/objecttree.go +++ b/common/pkg/acl/tree/objecttree.go @@ -177,6 +177,8 @@ func (ot *objectTree) AddContent(ctx context.Context, content SignableChangeCont Added: []*treechangeproto.RawTreeChangeWithId{rawChange}, Mode: Append, } + log.With("treeId", ot.id).With("head", objChange.Id). + Debug("finished adding content") return } diff --git a/common/pkg/ldiff/diff.go b/common/pkg/ldiff/diff.go index 840de719..9ff906ff 100644 --- a/common/pkg/ldiff/diff.go +++ b/common/pkg/ldiff/diff.go @@ -217,6 +217,11 @@ func (d *diff) getRange(r Range) (rr RangeResult) { func (d *diff) Ranges(ctx context.Context, ranges []Range, resBuf []RangeResult) (results []RangeResult, err error) { d.mu.RLock() defer d.mu.RUnlock() + + return d.ranges(ranges, resBuf) +} + +func (d *diff) ranges(ranges []Range, resBuf []RangeResult) (results []RangeResult, err error) { results = resBuf[:0] for _, r := range ranges { results = append(results, d.getRange(r)) @@ -251,7 +256,7 @@ func (d *diff) Diff(ctx context.Context, dl Remote) (newIds, changedIds, removed return default: } - if dctx.myRes, err = d.Ranges(ctx, dctx.toSend, dctx.myRes); err != nil { + if dctx.myRes, err = d.ranges(dctx.toSend, dctx.myRes); err != nil { return } if dctx.otherRes, err = dl.Ranges(ctx, dctx.toSend, dctx.otherRes); err != nil { From 27b3213bace770546bfa9e2da883de6ead7b76d8 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 21 Oct 2022 11:00:38 +0200 Subject: [PATCH 177/219] Fix ranges deadlock --- common/pkg/ldiff/diff.go | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/common/pkg/ldiff/diff.go b/common/pkg/ldiff/diff.go index 9ff906ff..68b0f115 100644 --- a/common/pkg/ldiff/diff.go +++ b/common/pkg/ldiff/diff.go @@ -218,10 +218,6 @@ func (d *diff) Ranges(ctx context.Context, ranges []Range, resBuf []RangeResult) d.mu.RLock() defer d.mu.RUnlock() - return d.ranges(ranges, resBuf) -} - -func (d *diff) ranges(ranges []Range, resBuf []RangeResult) (results []RangeResult, err error) { results = resBuf[:0] for _, r := range ranges { results = append(results, d.getRange(r)) @@ -240,9 +236,6 @@ var errMismatched = errors.New("query and results mismatched") // Diff makes diff with remote container func (d *diff) Diff(ctx context.Context, dl Remote) (newIds, changedIds, removedIds []string, err error) { - d.mu.RLock() - defer d.mu.RUnlock() - dctx := &diffCtx{} dctx.toSend = append(dctx.toSend, Range{ From: 0, @@ -256,10 +249,10 @@ func (d *diff) Diff(ctx context.Context, dl Remote) (newIds, changedIds, removed return default: } - if dctx.myRes, err = d.ranges(dctx.toSend, dctx.myRes); err != nil { + if dctx.otherRes, err = dl.Ranges(ctx, dctx.toSend, dctx.otherRes); err != nil { return } - if dctx.otherRes, err = dl.Ranges(ctx, dctx.toSend, dctx.otherRes); err != nil { + if dctx.myRes, err = d.Ranges(ctx, dctx.toSend, dctx.myRes); err != nil { return } if len(dctx.otherRes) != len(dctx.toSend) || len(dctx.myRes) != len(dctx.toSend) { From 40ce73db68296f098db81fa83a189bf9d3314df0 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 21 Oct 2022 11:21:20 +0200 Subject: [PATCH 178/219] Ocache fix tests and return deadline back --- common/pkg/ocache/ocache.go | 4 ++-- common/pkg/ocache/ocache_test.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/common/pkg/ocache/ocache.go b/common/pkg/ocache/ocache.go index 5f7d5b14..41555e42 100644 --- a/common/pkg/ocache/ocache.go +++ b/common/pkg/ocache/ocache.go @@ -356,6 +356,7 @@ func (c *oCache) GC() { c.mu.Unlock() return } + deadline := c.timeNow().Add(-c.ttl) var toClose []*entry for _, e := range c.data { if e.isClosing { @@ -365,8 +366,7 @@ func (c *oCache) GC() { if lug, ok := e.value.(ObjectLastUsage); ok { lu = lug.LastUsage() } - deadline := lu.Add(c.ttl) - if !e.locked() && e.refCount <= 0 && c.timeNow().After(deadline) { + if !e.locked() && e.refCount <= 0 && lu.Before(deadline) { e.isClosing = true e.close = make(chan struct{}) toClose = append(toClose, e) diff --git a/common/pkg/ocache/ocache_test.go b/common/pkg/ocache/ocache_test.go index cebed09a..54034141 100644 --- a/common/pkg/ocache/ocache_test.go +++ b/common/pkg/ocache/ocache_test.go @@ -119,7 +119,7 @@ func TestOCache_GC(t *testing.T) { t.Run("test without close wait", func(t *testing.T) { c := New(func(ctx context.Context, id string) (value Object, err error) { return &testObject{name: id}, nil - }, WithTTL(time.Millisecond*10)) + }, WithTTL(time.Millisecond*10), WithRefCounter(true)) val, err := c.Get(context.TODO(), "id") require.NoError(t, err) require.NotNil(t, val) @@ -140,7 +140,7 @@ func TestOCache_GC(t *testing.T) { c := New(func(ctx context.Context, id string) (value Object, err error) { return NewTestObject(id, closeCh), nil - }, WithTTL(time.Millisecond*10)) + }, WithTTL(time.Millisecond*10), WithRefCounter(true)) val, err := c.Get(context.TODO(), "id") require.NoError(t, err) require.NotNil(t, val) From 38864368419e5ee43c0f7d22b6c77764c294e50e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 21 Oct 2022 20:34:37 +0200 Subject: [PATCH 179/219] Storage close and diff fixes and logs --- client/clientspace/rpchandler.go | 3 ++- common/commonspace/diffservice/diffsyncer.go | 1 + common/commonspace/space.go | 3 +++ common/commonspace/spacesyncproto/spacesync.go | 13 +++++++------ common/commonspace/syncservice/streampool.go | 14 ++++++++------ node/nodespace/rpchandler.go | 3 ++- node/storage/spacestorage.go | 7 +++++++ 7 files changed, 30 insertions(+), 14 deletions(-) diff --git a/client/clientspace/rpchandler.go b/client/clientspace/rpchandler.go index 8f291eaa..2e65adfd 100644 --- a/client/clientspace/rpchandler.go +++ b/client/clientspace/rpchandler.go @@ -26,7 +26,7 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac RecWithId: req.AclRoot, SpaceHeaderWithId: req.SpaceHeader, } - _, err = r.s.spaceStorageProvider.CreateSpaceStorage(payload) + st, err := r.s.spaceStorageProvider.CreateSpaceStorage(payload) if err != nil { err = spacesyncproto.ErrUnexpected if err == storage.ErrSpaceStorageExists { @@ -34,6 +34,7 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac } return } + st.Close() return } diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index 28385791..2638dfb4 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -77,6 +77,7 @@ func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error) d.pingTreesInCache(ctx, newIds) d.pingTreesInCache(ctx, changedIds) + d.pingTreesInCache(ctx, removedIds) d.log.Info("sync done:", zap.Int("newIds", len(newIds)), zap.Int("changedIds", len(changedIds)), diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 3e83ee91..c84dc1c1 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -17,6 +17,7 @@ import ( tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" + "go.uber.org/zap" "sync" "sync/atomic" "time" @@ -190,8 +191,10 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene } func (s *space) Close() error { + log.With(zap.String("id", s.id)).Debug("space is closing") defer func() { s.isClosed.Store(true) + log.With(zap.String("id", s.id)).Debug("space closed") }() s.diffService.Close() s.syncService.Close() diff --git a/common/commonspace/spacesyncproto/spacesync.go b/common/commonspace/spacesyncproto/spacesync.go index c9351714..952faf4b 100644 --- a/common/commonspace/spacesyncproto/spacesync.go +++ b/common/commonspace/spacesyncproto/spacesync.go @@ -63,17 +63,18 @@ func WrapError(err error, rootChange *treechangeproto.RawTreeChangeWithId, treeI } } -func MessageDescription(msg *ObjectSyncMessage) string { +func MessageDescription(msg *ObjectSyncMessage) (res string) { content := msg.GetContent() switch { case content.GetHeadUpdate() != nil: - return fmt.Sprintf("head update/%v", content.GetHeadUpdate().Heads) + res = fmt.Sprintf("head update/%v", content.GetHeadUpdate().Heads) case content.GetFullSyncRequest() != nil: - return fmt.Sprintf("fullsync request/%v", content.GetFullSyncRequest().Heads) + res = fmt.Sprintf("fullsync request/%v", content.GetFullSyncRequest().Heads) case content.GetFullSyncResponse() != nil: - return fmt.Sprintf("fullsync response/%v", content.GetFullSyncResponse().Heads) + res = fmt.Sprintf("fullsync response/%v", content.GetFullSyncResponse().Heads) case content.GetErrorResponse() != nil: - return fmt.Sprintf("error response/%v", content.GetErrorResponse().Error) + res = fmt.Sprintf("error response/%v", content.GetErrorResponse().Error) } - return "" + res = fmt.Sprintf("%s/tracking=[%s]", res, msg.TrackingId) + return res } diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 1421839f..c139845f 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -20,18 +20,16 @@ const maxSimultaneousOperationsPerStream = 10 // StreamPool can be made generic to work with different streams type StreamPool interface { - Sender ocache.ObjectLastUsage AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) - HasActiveStream(peerId string) bool - Close() (err error) -} -type Sender interface { SendSync(peerId string, message *spacesyncproto.ObjectSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error) SendAsync(peers []string, message *spacesyncproto.ObjectSyncMessage) (err error) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) + + HasActiveStream(peerId string) bool + Close() (err error) } type MessageHandler func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) @@ -90,8 +88,10 @@ func (s *streamPool) SendSync( if err != nil { return } + log.With("trackingId", msg.TrackingId).Debug("waiting for id") // TODO: limit wait time here and remove the waiter reply = <-waiter.ch + log.With("trackingId", msg.TrackingId).Debug("finished waiting for id") return } @@ -215,15 +215,17 @@ func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStre s.messageHandler(stream.Context(), peerId, msg) return } - + log.With("trackingId", msg.TrackingId).Debug("getting message with tracking id") s.waitersMx.Lock() waiter, exists := s.waiters[msg.TrackingId] if !exists { + log.With("trackingId", msg.TrackingId).Debug("tracking id not exists") s.waitersMx.Unlock() s.messageHandler(stream.Context(), peerId, msg) return } + log.With("trackingId", msg.TrackingId).Debug("tracking id exists") delete(s.waiters, msg.TrackingId) s.waitersMx.Unlock() diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go index baefafda..1145e35c 100644 --- a/node/nodespace/rpchandler.go +++ b/node/nodespace/rpchandler.go @@ -25,7 +25,7 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac RecWithId: req.AclRoot, SpaceHeaderWithId: req.SpaceHeader, } - _, err = r.s.spaceStorageProvider.CreateSpaceStorage(payload) + st, err := r.s.spaceStorageProvider.CreateSpaceStorage(payload) if err != nil { err = spacesyncproto.ErrUnexpected if err == storage.ErrSpaceStorageExists { @@ -33,6 +33,7 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac } return } + st.Close() return } diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index 9ac3bfbb..b9406fb3 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -2,9 +2,11 @@ package storage import ( "github.com/akrylysov/pogreb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "go.uber.org/zap" "path" "sync" "time" @@ -14,6 +16,8 @@ var defPogrebOptions = &pogreb.Options{ BackgroundCompactionInterval: time.Minute * 5, } +var log = logger.NewNamed("storage.spacestorage") + type spaceStorage struct { spaceId string objDb *pogreb.DB @@ -24,6 +28,7 @@ type spaceStorage struct { } func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceStorage, err error) { + log.With(zap.String("id", spaceId)).Debug("space storage opened with new") dbPath := path.Join(rootPath, spaceId) objDb, err := pogreb.Open(dbPath, defPogrebOptions) if err != nil { @@ -74,6 +79,7 @@ func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceS } func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) { + log.With(zap.String("id", payload.SpaceHeaderWithId.Id)).Debug("space storage opened with create") dbPath := path.Join(rootPath, payload.SpaceHeaderWithId.Id) db, err := pogreb.Open(dbPath, defPogrebOptions) if err != nil { @@ -165,5 +171,6 @@ func (s *spaceStorage) StoredIds() (ids []string, err error) { } func (s *spaceStorage) Close() (err error) { + log.With(zap.String("id", s.spaceId)).Debug("space storage closed") return s.objDb.Close() } From 2085e3ae406df776810c3f014b622521eb1d2d9e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 21 Oct 2022 21:32:37 +0200 Subject: [PATCH 180/219] Don't broadcast when no content added --- common/commonspace/synctree/synctree.go | 41 +++++++++++++------------ 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 4ed4e255..62a33465 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -8,7 +8,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" - tree2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" ) @@ -16,7 +16,7 @@ var ErrSyncTreeClosed = errors.New("sync tree is closed") // SyncTree sends head updates to sync service and also sends new changes to update listener type SyncTree struct { - tree2.ObjectTree + tree.ObjectTree syncClient syncservice.SyncClient listener updatelistener.UpdateListener isClosed bool @@ -24,17 +24,17 @@ type SyncTree struct { var log = logger.NewNamed("commonspace.synctree").Sugar() -var createDerivedObjectTree = tree2.CreateDerivedObjectTree -var createObjectTree = tree2.CreateObjectTree -var buildObjectTree = tree2.BuildObjectTree +var createDerivedObjectTree = tree.CreateDerivedObjectTree +var createObjectTree = tree.CreateObjectTree +var buildObjectTree = tree.BuildObjectTree func DeriveSyncTree( ctx context.Context, - payload tree2.ObjectTreeCreatePayload, + payload tree.ObjectTreeCreatePayload, syncClient syncservice.SyncClient, listener updatelistener.UpdateListener, aclList list.ACLList, - createStorage storage.TreeStorageCreatorFunc) (t tree2.ObjectTree, err error) { + createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { t, err = createDerivedObjectTree(payload, aclList, createStorage) if err != nil { return @@ -52,11 +52,11 @@ func DeriveSyncTree( func CreateSyncTree( ctx context.Context, - payload tree2.ObjectTreeCreatePayload, + payload tree.ObjectTreeCreatePayload, syncClient syncservice.SyncClient, listener updatelistener.UpdateListener, aclList list.ACLList, - createStorage storage.TreeStorageCreatorFunc) (t tree2.ObjectTree, err error) { + createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { t, err = createObjectTree(payload, aclList, createStorage) if err != nil { return @@ -78,7 +78,7 @@ func BuildSyncTree( treeStorage storage.TreeStorage, listener updatelistener.UpdateListener, aclList list.ACLList, - isFirstBuild bool) (t tree2.ObjectTree, err error) { + isFirstBuild bool) (t tree.ObjectTree, err error) { return buildSyncTree(ctx, syncClient, treeStorage, listener, aclList, isFirstBuild) } @@ -88,7 +88,7 @@ func buildSyncTree( treeStorage storage.TreeStorage, listener updatelistener.UpdateListener, aclList list.ACLList, - isFirstBuild bool) (t tree2.ObjectTree, err error) { + isFirstBuild bool) (t tree.ObjectTree, err error) { t, err = buildObjectTree(treeStorage, aclList) if err != nil { return @@ -111,7 +111,7 @@ func buildSyncTree( return } -func (s *SyncTree) AddContent(ctx context.Context, content tree2.SignableChangeContent) (res tree2.AddResult, err error) { +func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeContent) (res tree.AddResult, err error) { if s.isClosed { err = ErrSyncTreeClosed return @@ -125,7 +125,7 @@ func (s *SyncTree) AddContent(ctx context.Context, content tree2.SignableChangeC return } -func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeproto.RawTreeChangeWithId) (res tree2.AddResult, err error) { +func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeproto.RawTreeChangeWithId) (res tree.AddResult, err error) { if s.isClosed { err = ErrSyncTreeClosed return @@ -136,17 +136,18 @@ func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeprot } if s.listener != nil { switch res.Mode { - case tree2.Nothing: + case tree.Nothing: return - case tree2.Append: + case tree.Append: s.listener.Update(s) - case tree2.Rebuild: + case tree.Rebuild: s.listener.Rebuild(s) } } - - headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added) - err = s.syncClient.BroadcastAsync(headUpdate) + if res.Mode != tree.Nothing { + headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added) + err = s.syncClient.BroadcastAsync(headUpdate) + } return } @@ -163,6 +164,6 @@ func (s *SyncTree) Close() (err error) { return } -func (s *SyncTree) Tree() tree2.ObjectTree { +func (s *SyncTree) Tree() tree.ObjectTree { return s } From 5b93c78ebd299bb2a40167c25e07ee141a21340d Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 21 Oct 2022 23:50:14 +0200 Subject: [PATCH 181/219] Add timeout when waiting in streampool --- common/commonspace/syncservice/streampool.go | 25 ++++++++++++++----- common/commonspace/syncservice/synchandler.go | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index c139845f..f3d872a7 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -16,7 +16,10 @@ import ( var ErrEmptyPeer = errors.New("don't have such a peer") var ErrStreamClosed = errors.New("stream is already closed") -const maxSimultaneousOperationsPerStream = 10 +var maxSimultaneousOperationsPerStream = 10 +var syncWaitPeriod = 2 * time.Second + +var ErrSyncTimeout = errors.New("too long wait on sync receive") // StreamPool can be made generic to work with different streams type StreamPool interface { @@ -79,7 +82,7 @@ func (s *streamPool) SendSync( s.waitersMx.Lock() waiter := responseWaiter{ - ch: make(chan *spacesyncproto.ObjectSyncMessage), + ch: make(chan *spacesyncproto.ObjectSyncMessage, 1), } s.waiters[msg.TrackingId] = waiter s.waitersMx.Unlock() @@ -88,10 +91,20 @@ func (s *streamPool) SendSync( if err != nil { return } - log.With("trackingId", msg.TrackingId).Debug("waiting for id") - // TODO: limit wait time here and remove the waiter - reply = <-waiter.ch - log.With("trackingId", msg.TrackingId).Debug("finished waiting for id") + delay := time.NewTimer(syncWaitPeriod) + select { + case <-delay.C: + s.waitersMx.Lock() + delete(s.waiters, msg.TrackingId) + s.waitersMx.Unlock() + + log.With("trackingId", msg.TrackingId).Error("time elapsed when waiting") + err = ErrSyncTimeout + case reply = <-waiter.ch: + if !delay.Stop() { + <-delay.C + } + } return } diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/syncservice/synchandler.go index 16879b36..32c1b00e 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/syncservice/synchandler.go @@ -90,7 +90,7 @@ func (s *syncHandler) handleHeadUpdate( if fullRequest != nil { log.With("senderId", senderId). - With("heads", update.Heads). + With("heads", fullRequest.GetContent().GetFullSyncRequest().Heads). With("treeId", msg.TreeId). Debug("sending full sync request") return s.syncClient.SendAsync([]string{senderId}, fullRequest) From 8cc44c4a79d7292501346d467437dc1208610750 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 22 Oct 2022 13:04:58 +0200 Subject: [PATCH 182/219] WIP sync refactoring --- common/commonspace/commongetter.go | 35 +++++++ .../commonspace/objectgetter/objectgetter.go | 14 +++ common/commonspace/service.go | 3 +- common/commonspace/space.go | 35 +++++-- common/commonspace/syncacl/syncacl.go | 21 +++++ .../syncservice/synchandler/synchhandler.go | 10 ++ common/commonspace/syncservice/syncservice.go | 36 +++++--- common/commonspace/synctree/synctree.go | 92 ++++++++++--------- .../synctreehandler.go} | 47 ++++------ .../synctreehandler_test.go} | 8 +- 10 files changed, 205 insertions(+), 96 deletions(-) create mode 100644 common/commonspace/commongetter.go create mode 100644 common/commonspace/objectgetter/objectgetter.go create mode 100644 common/commonspace/syncacl/syncacl.go create mode 100644 common/commonspace/syncservice/synchandler/synchhandler.go rename common/commonspace/{syncservice/synchandler.go => synctree/synctreehandler.go} (80%) rename common/commonspace/{syncservice/synchandler_test.go => synctree/synctreehandler_test.go} (98%) diff --git a/common/commonspace/commongetter.go b/common/commonspace/commongetter.go new file mode 100644 index 00000000..da40bfff --- /dev/null +++ b/common/commonspace/commongetter.go @@ -0,0 +1,35 @@ +package commonspace + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectgetter" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncacl" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" +) + +type commonSpaceGetter struct { + spaceId string + aclList *syncacl.SyncACL + treeGetter treegetter.TreeGetter +} + +func newCommonSpaceGetter(spaceId string, aclList *syncacl.SyncACL, treeGetter treegetter.TreeGetter) objectgetter.ObjectGetter { + return &commonSpaceGetter{ + spaceId: spaceId, + aclList: aclList, + treeGetter: treeGetter, + } +} + +func (c *commonSpaceGetter) GetObject(ctx context.Context, objectId string) (obj objectgetter.Object, err error) { + if c.aclList.ID() == objectId { + obj = c.aclList + return + } + t, err := c.treeGetter.GetTree(ctx, c.spaceId, objectId) + if err != nil { + return + } + obj = t.(objectgetter.Object) + return +} diff --git a/common/commonspace/objectgetter/objectgetter.go b/common/commonspace/objectgetter/objectgetter.go new file mode 100644 index 00000000..11b9e835 --- /dev/null +++ b/common/commonspace/objectgetter/objectgetter.go @@ -0,0 +1,14 @@ +package objectgetter + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" +) + +type Object interface { + synchandler.SyncHandler +} + +type ObjectGetter interface { + GetObject(ctx context.Context, objectId string) (Object, error) +} diff --git a/common/commonspace/service.go b/common/commonspace/service.go index b6bfee6f..23794ebc 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -87,10 +87,11 @@ func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { if err != nil { return nil, err } + lastConfiguration := s.configurationService.GetLast() confConnector := nodeconf.NewConfConnector(lastConfiguration, s.pool) diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, confConnector, s.cache, log) - syncService := syncservice.NewSyncService(id, diffService, s.cache, lastConfiguration, confConnector) + syncService := syncservice.NewSyncService(id, diffService, lastConfiguration, confConnector) sp := &space{ id: id, syncService: syncService, diff --git a/common/commonspace/space.go b/common/commonspace/space.go index c84dc1c1..73b6f770 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -8,6 +8,7 @@ import ( "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/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncacl" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" @@ -73,7 +74,7 @@ type space struct { storage storage.SpaceStorage cache treegetter.TreeGetter account account.Service - aclList list.ACLList + aclList *syncacl.SyncACL isClosed atomic.Bool } @@ -96,12 +97,14 @@ func (s *space) Init(ctx context.Context) (err error) { if err != nil { return } - s.aclList, err = list.BuildACLListWithIdentity(s.account.Account(), aclStorage) + aclList, err := list.BuildACLListWithIdentity(s.account.Account(), aclStorage) if err != nil { return } + s.aclList = syncacl.NewSyncACL(aclList, s.syncService.SyncClient()) + objectGetter := newCommonSpaceGetter(s.id, s.aclList, s.cache) + s.syncService.Init(objectGetter) s.diffService.Init(initialIds) - s.syncService.Init() return nil } @@ -126,7 +129,14 @@ func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePay err = ErrSpaceClosed return } - return synctree.DeriveSyncTree(ctx, payload, s.syncService.SyncClient(), listener, s.aclList, s.storage.CreateTreeStorage) + deps := synctree.SyncTreeCreateDeps{ + Payload: payload, + SyncClient: s.syncService.SyncClient(), + Listener: listener, + AclList: s.aclList, + CreateStorage: s.storage.CreateTreeStorage, + } + return synctree.DeriveSyncTree(ctx, deps) } func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePayload, listener updatelistener.UpdateListener) (tr tree.ObjectTree, err error) { @@ -134,7 +144,14 @@ func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePay err = ErrSpaceClosed return } - return synctree.CreateSyncTree(ctx, payload, s.syncService.SyncClient(), listener, s.aclList, s.storage.CreateTreeStorage) + deps := synctree.SyncTreeCreateDeps{ + Payload: payload, + SyncClient: s.syncService.SyncClient(), + Listener: listener, + AclList: s.aclList, + CreateStorage: s.storage.CreateTreeStorage, + } + return synctree.CreateSyncTree(ctx, deps) } func (s *space) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (t tree.ObjectTree, err error) { @@ -187,7 +204,13 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene return } } - return synctree.BuildSyncTree(ctx, s.syncService.SyncClient(), store.(aclstorage.TreeStorage), listener, s.aclList, isFirstBuild) + deps := synctree.SyncTreeBuildDeps{ + SyncClient: s.syncService.SyncClient(), + Listener: listener, + AclList: s.aclList, + Storage: store, + } + return synctree.BuildSyncTree(ctx, isFirstBuild, deps) } func (s *space) Close() error { diff --git a/common/commonspace/syncacl/syncacl.go b/common/commonspace/syncacl/syncacl.go new file mode 100644 index 00000000..85d65f1a --- /dev/null +++ b/common/commonspace/syncacl/syncacl.go @@ -0,0 +1,21 @@ +package syncacl + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" +) + +type SyncACL struct { + list.ACLList + syncservice.SyncClient + synchandler.SyncHandler +} + +func NewSyncACL(aclList list.ACLList, syncClient syncservice.SyncClient) *SyncACL { + return &SyncACL{ + ACLList: aclList, + SyncClient: syncClient, + SyncHandler: nil, + } +} diff --git a/common/commonspace/syncservice/synchandler/synchhandler.go b/common/commonspace/syncservice/synchandler/synchhandler.go new file mode 100644 index 00000000..e6bed4bf --- /dev/null +++ b/common/commonspace/syncservice/synchandler/synchhandler.go @@ -0,0 +1,10 @@ +package synchandler + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" +) + +type SyncHandler interface { + HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) +} diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 5142a8cc..d11cf94f 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -4,8 +4,9 @@ package syncservice import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + "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/treegetter" + "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" @@ -16,9 +17,10 @@ var log = logger.NewNamed("syncservice").Sugar() type SyncService interface { ocache.ObjectLastUsage + synchandler.SyncHandler SyncClient() SyncClient - Init() + Init(getter objectgetter.ObjectGetter) Close() (err error) } @@ -33,6 +35,7 @@ type syncService struct { syncClient SyncClient clientFactory spacesyncproto.ClientFactory + objectGetter objectgetter.ObjectGetter streamLoopCtx context.Context stopStreamLoop context.CancelFunc @@ -43,25 +46,19 @@ type syncService struct { func NewSyncService( spaceId string, headNotifiable HeadNotifiable, - cache treegetter.TreeGetter, configuration nodeconf.Configuration, - confConnector nodeconf.ConfConnector) SyncService { - var syncHandler SyncHandler + confConnector nodeconf.ConfConnector) (syncService SyncService) { streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { - return syncHandler.HandleMessage(ctx, senderId, message) + return syncService.HandleMessage(ctx, senderId, message) }) factory := newRequestFactory() syncClient := newSyncClient(spaceId, streamPool, headNotifiable, factory, configuration) - syncHandler = newSyncHandler(spaceId, cache, syncClient) - return newSyncService( + syncService = newSyncService( spaceId, syncClient, spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient), confConnector) -} - -func (s *syncService) LastUsage() time.Time { - return s.syncClient.LastUsage() + return } func newSyncService( @@ -78,7 +75,8 @@ func newSyncService( } } -func (s *syncService) Init() { +func (s *syncService) Init(objectGetter objectgetter.ObjectGetter) { + s.objectGetter = objectGetter s.streamLoopCtx, s.stopStreamLoop = context.WithCancel(context.Background()) go s.responsibleStreamCheckLoop(s.streamLoopCtx) } @@ -89,6 +87,18 @@ func (s *syncService) Close() (err error) { return s.syncClient.Close() } +func (s *syncService) LastUsage() time.Time { + return s.syncClient.LastUsage() +} + +func (s *syncService) HandleMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { + obj, err := s.objectGetter.GetObject(ctx, message.TreeId) + if err != nil { + return + } + return obj.HandleMessage(ctx, senderId, message) +} + func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { defer close(s.streamLoopDone) checkResponsiblePeers := func() { diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 62a33465..74d0b312 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -5,6 +5,7 @@ import ( "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" @@ -17,6 +18,7 @@ var ErrSyncTreeClosed = errors.New("sync tree is closed") // SyncTree sends head updates to sync service and also sends new changes to update listener type SyncTree struct { tree.ObjectTree + synchandler.SyncHandler syncClient syncservice.SyncClient listener updatelistener.UpdateListener isClosed bool @@ -28,85 +30,89 @@ var createDerivedObjectTree = tree.CreateDerivedObjectTree var createObjectTree = tree.CreateObjectTree var buildObjectTree = tree.BuildObjectTree +type SyncTreeCreateDeps struct { + Payload tree.ObjectTreeCreatePayload + SyncClient syncservice.SyncClient + Listener updatelistener.UpdateListener + AclList list.ACLList + CreateStorage storage.TreeStorageCreatorFunc +} + +type SyncTreeBuildDeps struct { + SyncClient syncservice.SyncClient + Listener updatelistener.UpdateListener + AclList list.ACLList + Storage storage.TreeStorage +} + func DeriveSyncTree( ctx context.Context, - payload tree.ObjectTreeCreatePayload, - syncClient syncservice.SyncClient, - listener updatelistener.UpdateListener, - aclList list.ACLList, - createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { - t, err = createDerivedObjectTree(payload, aclList, createStorage) + deps SyncTreeCreateDeps) (t tree.ObjectTree, err error) { + t, err = createDerivedObjectTree(deps.Payload, deps.AclList, deps.CreateStorage) if err != nil { return } - t = &SyncTree{ + syncTree := &SyncTree{ ObjectTree: t, - syncClient: syncClient, - listener: listener, + syncClient: deps.SyncClient, + listener: deps.Listener, } + syncHandler := newSyncTreeHandler(syncTree, deps.SyncClient) + syncTree.SyncHandler = syncHandler + t = syncTree - headUpdate := syncClient.CreateHeadUpdate(t, nil) - err = syncClient.BroadcastAsync(headUpdate) + headUpdate := deps.SyncClient.CreateHeadUpdate(t, nil) + err = deps.SyncClient.BroadcastAsync(headUpdate) return } func CreateSyncTree( ctx context.Context, - payload tree.ObjectTreeCreatePayload, - syncClient syncservice.SyncClient, - listener updatelistener.UpdateListener, - aclList list.ACLList, - createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) { - t, err = createObjectTree(payload, aclList, createStorage) + deps SyncTreeCreateDeps) (t tree.ObjectTree, err error) { + t, err = createObjectTree(deps.Payload, deps.AclList, deps.CreateStorage) if err != nil { return } - t = &SyncTree{ + syncTree := &SyncTree{ ObjectTree: t, - syncClient: syncClient, - listener: listener, + syncClient: deps.SyncClient, + listener: deps.Listener, } + syncHandler := newSyncTreeHandler(syncTree, deps.SyncClient) + syncTree.SyncHandler = syncHandler + t = syncTree - headUpdate := syncClient.CreateHeadUpdate(t, nil) - err = syncClient.BroadcastAsync(headUpdate) + headUpdate := deps.SyncClient.CreateHeadUpdate(t, nil) + err = deps.SyncClient.BroadcastAsync(headUpdate) return } func BuildSyncTree( ctx context.Context, - syncClient syncservice.SyncClient, - treeStorage storage.TreeStorage, - listener updatelistener.UpdateListener, - aclList list.ACLList, - isFirstBuild bool) (t tree.ObjectTree, err error) { - return buildSyncTree(ctx, syncClient, treeStorage, listener, aclList, isFirstBuild) -} + isFirstBuild bool, + deps SyncTreeBuildDeps) (t tree.ObjectTree, err error) { -func buildSyncTree( - ctx context.Context, - syncClient syncservice.SyncClient, - treeStorage storage.TreeStorage, - listener updatelistener.UpdateListener, - aclList list.ACLList, - isFirstBuild bool) (t tree.ObjectTree, err error) { - t, err = buildObjectTree(treeStorage, aclList) + t, err = buildObjectTree(deps.Storage, deps.AclList) if err != nil { return } - t = &SyncTree{ + syncTree := &SyncTree{ ObjectTree: t, - syncClient: syncClient, - listener: listener, + syncClient: deps.SyncClient, + listener: deps.Listener, } + syncHandler := newSyncTreeHandler(syncTree, deps.SyncClient) + syncTree.SyncHandler = syncHandler + t = syncTree - headUpdate := syncClient.CreateHeadUpdate(t, nil) + headUpdate := syncTree.syncClient.CreateHeadUpdate(t, nil) // here we will have different behaviour based on who is sending this update if isFirstBuild { // send to everybody, because everybody should know that the node or client got new tree - err = syncClient.BroadcastAsync(headUpdate) + err = syncTree.syncClient.BroadcastAsync(headUpdate) } else { // send either to everybody if client or to replica set if node - err = syncClient.BroadcastAsyncOrSendResponsible(headUpdate) + err = syncTree.syncClient.BroadcastAsyncOrSendResponsible(headUpdate) } return } diff --git a/common/commonspace/syncservice/synchandler.go b/common/commonspace/synctree/synctreehandler.go similarity index 80% rename from common/commonspace/syncservice/synchandler.go rename to common/commonspace/synctree/synctreehandler.go index 32c1b00e..fb71f280 100644 --- a/common/commonspace/syncservice/synchandler.go +++ b/common/commonspace/synctree/synctreehandler.go @@ -1,32 +1,27 @@ -package syncservice +package synctree import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice" ) -type syncHandler struct { - spaceId string - treeCache treegetter.TreeGetter - syncClient SyncClient +type syncTreeHandler struct { + objTree tree.ObjectTree + syncClient syncservice.SyncClient } -type SyncHandler interface { - HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) -} - -func newSyncHandler(spaceId string, treeCache treegetter.TreeGetter, syncClient SyncClient) *syncHandler { - return &syncHandler{ - spaceId: spaceId, - treeCache: treeCache, +func newSyncTreeHandler(objTree tree.ObjectTree, syncClient syncservice.SyncClient) synchandler.SyncHandler { + return &syncTreeHandler{ + objTree: objTree, syncClient: syncClient, } } -func (s *syncHandler) HandleMessage(ctx context.Context, senderId string, msg *spacesyncproto.ObjectSyncMessage) error { +func (s *syncTreeHandler) HandleMessage(ctx context.Context, senderId string, msg *spacesyncproto.ObjectSyncMessage) error { content := msg.GetContent() switch { case content.GetFullSyncRequest() != nil: @@ -39,7 +34,7 @@ func (s *syncHandler) HandleMessage(ctx context.Context, senderId string, msg *s return nil } -func (s *syncHandler) handleHeadUpdate( +func (s *syncTreeHandler) handleHeadUpdate( ctx context.Context, senderId string, update *spacesyncproto.ObjectHeadUpdate, @@ -51,11 +46,8 @@ func (s *syncHandler) handleHeadUpdate( var ( fullRequest *spacesyncproto.ObjectSyncMessage isEmptyUpdate = len(update.Changes) == 0 + objTree = s.objTree ) - objTree, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) - if err != nil { - return - } err = func() error { objTree.Lock() @@ -63,6 +55,7 @@ func (s *syncHandler) handleHeadUpdate( // isEmptyUpdate is sent when the tree is brought up from cache if isEmptyUpdate { + log.With("treeId", msg.TreeId).Debug("is empty update") if slice.UnsortedEquals(objTree.Heads(), update.Heads) { return nil } @@ -102,7 +95,7 @@ func (s *syncHandler) handleHeadUpdate( return } -func (s *syncHandler) handleFullSyncRequest( +func (s *syncTreeHandler) handleFullSyncRequest( ctx context.Context, senderId string, request *spacesyncproto.ObjectFullSyncRequest, @@ -115,6 +108,7 @@ func (s *syncHandler) handleFullSyncRequest( var ( fullResponse *spacesyncproto.ObjectSyncMessage header = msg.RootChange + objTree = s.objTree ) defer func() { if err != nil { @@ -122,11 +116,6 @@ func (s *syncHandler) handleFullSyncRequest( } }() - objTree, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) - if err != nil { - return - } - err = func() error { objTree.Lock() defer objTree.Unlock() @@ -152,7 +141,7 @@ func (s *syncHandler) handleFullSyncRequest( return s.syncClient.SendAsync([]string{senderId}, fullResponse) } -func (s *syncHandler) handleFullSyncResponse( +func (s *syncTreeHandler) handleFullSyncResponse( ctx context.Context, senderId string, response *spacesyncproto.ObjectFullSyncResponse, @@ -161,7 +150,7 @@ func (s *syncHandler) handleFullSyncResponse( With("heads", response.Heads). With("treeId", msg.TreeId). Debug("received full sync response message") - objTree, err := s.treeCache.GetTree(ctx, s.spaceId, msg.TreeId) + objTree := s.objTree if err != nil { log.With("senderId", senderId). With("heads", response.Heads). @@ -188,6 +177,6 @@ func (s *syncHandler) handleFullSyncResponse( return } -func (s *syncHandler) alreadyHasHeads(t tree.ObjectTree, heads []string) bool { +func (s *syncTreeHandler) alreadyHasHeads(t tree.ObjectTree, heads []string) bool { return slice.UnsortedEquals(t.Heads(), heads) || t.HasChanges(heads...) } diff --git a/common/commonspace/syncservice/synchandler_test.go b/common/commonspace/synctree/synctreehandler_test.go similarity index 98% rename from common/commonspace/syncservice/synchandler_test.go rename to common/commonspace/synctree/synctreehandler_test.go index 1b18be9f..e86aedbb 100644 --- a/common/commonspace/syncservice/synchandler_test.go +++ b/common/commonspace/synctree/synctreehandler_test.go @@ -1,4 +1,4 @@ -package syncservice +package synctree import ( "context" @@ -44,7 +44,7 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) - syncHandler := newSyncHandler(spaceId, cacheMock, syncClientMock) + syncHandler := newSyncTreeHandler(spaceId, cacheMock, syncClientMock) t.Run("head update non empty all heads added", func(t *testing.T) { treeId := "treeId" senderId := "senderId" @@ -196,7 +196,7 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) { syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) - syncHandler := newSyncHandler(spaceId, cacheMock, syncClientMock) + syncHandler := newSyncTreeHandler(spaceId, cacheMock, syncClientMock) t.Run("full sync request with change", func(t *testing.T) { treeId := "treeId" senderId := "senderId" @@ -307,7 +307,7 @@ func TestSyncHandler_HandleFullSyncResponse(t *testing.T) { syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) - syncHandler := newSyncHandler(spaceId, cacheMock, syncClientMock) + syncHandler := newSyncTreeHandler(spaceId, cacheMock, syncClientMock) t.Run("full sync response with change", func(t *testing.T) { treeId := "treeId" senderId := "senderId" From d6a45cced032f9b3fdc13b850d0445c751d70271 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 22 Oct 2022 14:23:42 +0200 Subject: [PATCH 183/219] Move concrete logic to concrete packages --- common/commonspace/diffservice/diffservice.go | 2 +- .../commonspace/diffservice/headnotifiable.go | 5 ++ common/commonspace/service.go | 15 ++-- common/commonspace/space.go | 63 ++++++++------- common/commonspace/syncacl/syncacl.go | 6 +- common/commonspace/syncservice/syncservice.go | 30 +++----- .../requestfactory.go | 8 +- .../{syncservice => synctree}/syncclient.go | 17 +++-- common/commonspace/synctree/synctree.go | 76 +++++++++++++------ common/commonspace/synctree/synctree_test.go | 3 +- .../commonspace/synctree/synctreehandler.go | 5 +- 11 files changed, 136 insertions(+), 94 deletions(-) create mode 100644 common/commonspace/diffservice/headnotifiable.go rename common/commonspace/{syncservice => synctree}/requestfactory.go (96%) rename common/commonspace/{syncservice => synctree}/syncclient.go (75%) diff --git a/common/commonspace/diffservice/diffservice.go b/common/commonspace/diffservice/diffservice.go index a6199f04..71fe9bef 100644 --- a/common/commonspace/diffservice/diffservice.go +++ b/common/commonspace/diffservice/diffservice.go @@ -14,8 +14,8 @@ import ( ) type DiffService interface { + HeadNotifiable HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) - UpdateHeads(id string, heads []string) RemoveObject(id string) AllIds() []string diff --git a/common/commonspace/diffservice/headnotifiable.go b/common/commonspace/diffservice/headnotifiable.go new file mode 100644 index 00000000..80819bfe --- /dev/null +++ b/common/commonspace/diffservice/headnotifiable.go @@ -0,0 +1,5 @@ +package diffservice + +type HeadNotifiable interface { + UpdateHeads(id string, heads []string) +} diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 23794ebc..dd9c94d5 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -91,14 +91,15 @@ func (s *service) GetSpace(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.cache, log) - syncService := syncservice.NewSyncService(id, diffService, lastConfiguration, confConnector) + syncService := syncservice.NewSyncService(id, confConnector) sp := &space{ - id: id, - syncService: syncService, - diffService: diffService, - cache: s.cache, - account: s.account, - storage: st, + id: id, + syncService: syncService, + diffService: diffService, + cache: s.cache, + account: s.account, + configuration: lastConfiguration, + storage: st, } if err := sp.Init(ctx); err != nil { return nil, err diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 73b6f770..b957a515 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -13,6 +13,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" aclstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" @@ -69,12 +70,13 @@ type space struct { rpc *rpcHandler - syncService syncservice.SyncService - diffService diffservice.DiffService - storage storage.SpaceStorage - cache treegetter.TreeGetter - account account.Service - aclList *syncacl.SyncACL + syncService syncservice.SyncService + diffService diffservice.DiffService + storage storage.SpaceStorage + cache treegetter.TreeGetter + account account.Service + aclList *syncacl.SyncACL + configuration nodeconf.Configuration isClosed atomic.Bool } @@ -101,7 +103,7 @@ func (s *space) Init(ctx context.Context) (err error) { if err != nil { return } - s.aclList = syncacl.NewSyncACL(aclList, s.syncService.SyncClient()) + s.aclList = syncacl.NewSyncACL(aclList, s.syncService.StreamPool()) objectGetter := newCommonSpaceGetter(s.id, s.aclList, s.cache) s.syncService.Init(objectGetter) s.diffService.Init(initialIds) @@ -129,12 +131,15 @@ func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePay err = ErrSpaceClosed return } - deps := synctree.SyncTreeCreateDeps{ - Payload: payload, - SyncClient: s.syncService.SyncClient(), - Listener: listener, - AclList: s.aclList, - CreateStorage: s.storage.CreateTreeStorage, + deps := synctree.CreateDeps{ + SpaceId: s.id, + Payload: payload, + StreamPool: s.syncService.StreamPool(), + Configuration: s.configuration, + HeadNotifiable: s.diffService, + Listener: listener, + AclList: s.aclList, + CreateStorage: s.storage.CreateTreeStorage, } return synctree.DeriveSyncTree(ctx, deps) } @@ -144,12 +149,15 @@ func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePay err = ErrSpaceClosed return } - deps := synctree.SyncTreeCreateDeps{ - Payload: payload, - SyncClient: s.syncService.SyncClient(), - Listener: listener, - AclList: s.aclList, - CreateStorage: s.storage.CreateTreeStorage, + deps := synctree.CreateDeps{ + SpaceId: s.id, + Payload: payload, + StreamPool: s.syncService.StreamPool(), + Configuration: s.configuration, + HeadNotifiable: s.diffService, + Listener: listener, + AclList: s.aclList, + CreateStorage: s.storage.CreateTreeStorage, } return synctree.CreateSyncTree(ctx, deps) } @@ -165,9 +173,9 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene if err != nil { return nil, err } - return s.syncService.SyncClient().SendSync( + return s.syncService.StreamPool().SendSync( peerId, - s.syncService.SyncClient().CreateNewTreeRequest(id), + synctree.GetRequestFactory().CreateNewTreeRequest(id), ) } @@ -204,11 +212,14 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene return } } - deps := synctree.SyncTreeBuildDeps{ - SyncClient: s.syncService.SyncClient(), - Listener: listener, - AclList: s.aclList, - Storage: store, + deps := synctree.BuildDeps{ + SpaceId: s.id, + StreamPool: s.syncService.StreamPool(), + Configuration: s.configuration, + HeadNotifiable: s.diffService, + Listener: listener, + AclList: s.aclList, + Storage: store, } return synctree.BuildSyncTree(ctx, isFirstBuild, deps) } diff --git a/common/commonspace/syncacl/syncacl.go b/common/commonspace/syncacl/syncacl.go index 85d65f1a..c7343625 100644 --- a/common/commonspace/syncacl/syncacl.go +++ b/common/commonspace/syncacl/syncacl.go @@ -8,14 +8,14 @@ import ( type SyncACL struct { list.ACLList - syncservice.SyncClient synchandler.SyncHandler + streamPool syncservice.StreamPool } -func NewSyncACL(aclList list.ACLList, syncClient syncservice.SyncClient) *SyncACL { +func NewSyncACL(aclList list.ACLList, streamPool syncservice.StreamPool) *SyncACL { return &SyncACL{ ACLList: aclList, - SyncClient: syncClient, SyncHandler: nil, + streamPool: streamPool, } } diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index d11cf94f..d07cb1b2 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -18,22 +18,18 @@ var log = logger.NewNamed("syncservice").Sugar() type SyncService interface { ocache.ObjectLastUsage synchandler.SyncHandler - SyncClient() SyncClient + StreamPool() StreamPool Init(getter objectgetter.ObjectGetter) Close() (err error) } -type HeadNotifiable interface { - UpdateHeads(id string, heads []string) -} - const respPeersStreamCheckInterval = time.Second * 10 type syncService struct { spaceId string - syncClient SyncClient + streamPool StreamPool clientFactory spacesyncproto.ClientFactory objectGetter objectgetter.ObjectGetter @@ -45,17 +41,13 @@ type syncService struct { func NewSyncService( spaceId string, - headNotifiable HeadNotifiable, - configuration nodeconf.Configuration, confConnector nodeconf.ConfConnector) (syncService SyncService) { streamPool := newStreamPool(func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { return syncService.HandleMessage(ctx, senderId, message) }) - factory := newRequestFactory() - syncClient := newSyncClient(spaceId, streamPool, headNotifiable, factory, configuration) syncService = newSyncService( spaceId, - syncClient, + streamPool, spacesyncproto.ClientFactoryFunc(spacesyncproto.NewDRPCSpaceClient), confConnector) return @@ -63,11 +55,11 @@ func NewSyncService( func newSyncService( spaceId string, - syncClient SyncClient, + streamPool StreamPool, clientFactory spacesyncproto.ClientFactory, connector nodeconf.ConfConnector) *syncService { return &syncService{ - syncClient: syncClient, + streamPool: streamPool, connector: connector, clientFactory: clientFactory, spaceId: spaceId, @@ -84,11 +76,11 @@ func (s *syncService) Init(objectGetter objectgetter.ObjectGetter) { func (s *syncService) Close() (err error) { s.stopStreamLoop() <-s.streamLoopDone - return s.syncClient.Close() + return s.streamPool.Close() } func (s *syncService) LastUsage() time.Time { - return s.syncClient.LastUsage() + return s.streamPool.LastUsage() } func (s *syncService) HandleMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { @@ -107,7 +99,7 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { return } for _, peer := range respPeers { - if s.syncClient.HasActiveStream(peer.Id()) { + if s.streamPool.HasActiveStream(peer.Id()) { continue } stream, err := s.clientFactory.Client(peer).Stream(ctx) @@ -125,7 +117,7 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { log.With("spaceId", s.spaceId).Errorf("failed to send first message to stream: %v", err) continue } - s.syncClient.AddAndReadStreamAsync(stream) + s.streamPool.AddAndReadStreamAsync(stream) } } @@ -142,6 +134,6 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { } } -func (s *syncService) SyncClient() SyncClient { - return s.syncClient +func (s *syncService) StreamPool() StreamPool { + return s.streamPool } diff --git a/common/commonspace/syncservice/requestfactory.go b/common/commonspace/synctree/requestfactory.go similarity index 96% rename from common/commonspace/syncservice/requestfactory.go rename to common/commonspace/synctree/requestfactory.go index 08332751..f35133ae 100644 --- a/common/commonspace/syncservice/requestfactory.go +++ b/common/commonspace/synctree/requestfactory.go @@ -1,4 +1,4 @@ -package syncservice +package synctree import ( "fmt" @@ -15,8 +15,10 @@ type RequestFactory interface { CreateFullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (*spacesyncproto.ObjectSyncMessage, error) } -func newRequestFactory() RequestFactory { - return &requestFactory{} +var factory = &requestFactory{} + +func GetRequestFactory() RequestFactory { + return factory } type requestFactory struct{} diff --git a/common/commonspace/syncservice/syncclient.go b/common/commonspace/synctree/syncclient.go similarity index 75% rename from common/commonspace/syncservice/syncclient.go rename to common/commonspace/synctree/syncclient.go index d5f0b9f3..842d796b 100644 --- a/common/commonspace/syncservice/syncclient.go +++ b/common/commonspace/synctree/syncclient.go @@ -1,28 +1,35 @@ -package syncservice +package synctree import ( + "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/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "time" ) type SyncClient interface { - StreamPool + syncservice.StreamPool RequestFactory ocache.ObjectLastUsage BroadcastAsyncOrSendResponsible(message *spacesyncproto.ObjectSyncMessage) (err error) } type syncClient struct { - StreamPool + syncservice.StreamPool RequestFactory spaceId string - notifiable HeadNotifiable + notifiable diffservice.HeadNotifiable configuration nodeconf.Configuration } -func newSyncClient(spaceId string, pool StreamPool, notifiable HeadNotifiable, factory RequestFactory, configuration nodeconf.Configuration) SyncClient { +func newSyncClient( + spaceId string, + pool syncservice.StreamPool, + notifiable diffservice.HeadNotifiable, + factory RequestFactory, + configuration nodeconf.Configuration) SyncClient { return &syncClient{ StreamPool: pool, RequestFactory: factory, diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 74d0b312..fd32a06b 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -4,9 +4,11 @@ import ( "context" "errors" "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/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "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/tree" @@ -19,7 +21,7 @@ var ErrSyncTreeClosed = errors.New("sync tree is closed") type SyncTree struct { tree.ObjectTree synchandler.SyncHandler - syncClient syncservice.SyncClient + syncClient SyncClient listener updatelistener.UpdateListener isClosed bool } @@ -30,78 +32,102 @@ var createDerivedObjectTree = tree.CreateDerivedObjectTree var createObjectTree = tree.CreateObjectTree var buildObjectTree = tree.BuildObjectTree -type SyncTreeCreateDeps struct { - Payload tree.ObjectTreeCreatePayload - SyncClient syncservice.SyncClient - Listener updatelistener.UpdateListener - AclList list.ACLList - CreateStorage storage.TreeStorageCreatorFunc +type CreateDeps struct { + SpaceId string + Payload tree.ObjectTreeCreatePayload + Configuration nodeconf.Configuration + HeadNotifiable diffservice.HeadNotifiable + StreamPool syncservice.StreamPool + Listener updatelistener.UpdateListener + AclList list.ACLList + CreateStorage storage.TreeStorageCreatorFunc } -type SyncTreeBuildDeps struct { - SyncClient syncservice.SyncClient - Listener updatelistener.UpdateListener - AclList list.ACLList - Storage storage.TreeStorage +type BuildDeps struct { + SpaceId string + StreamPool syncservice.StreamPool + Configuration nodeconf.Configuration + HeadNotifiable diffservice.HeadNotifiable + Listener updatelistener.UpdateListener + AclList list.ACLList + Storage storage.TreeStorage } func DeriveSyncTree( ctx context.Context, - deps SyncTreeCreateDeps) (t tree.ObjectTree, err error) { + deps CreateDeps) (t tree.ObjectTree, err error) { t, err = createDerivedObjectTree(deps.Payload, deps.AclList, deps.CreateStorage) if err != nil { return } + syncClient := newSyncClient( + deps.SpaceId, + deps.StreamPool, + deps.HeadNotifiable, + GetRequestFactory(), + deps.Configuration) syncTree := &SyncTree{ ObjectTree: t, - syncClient: deps.SyncClient, + syncClient: syncClient, listener: deps.Listener, } - syncHandler := newSyncTreeHandler(syncTree, deps.SyncClient) + syncHandler := newSyncTreeHandler(syncTree, syncClient) syncTree.SyncHandler = syncHandler t = syncTree - headUpdate := deps.SyncClient.CreateHeadUpdate(t, nil) - err = deps.SyncClient.BroadcastAsync(headUpdate) + headUpdate := syncClient.CreateHeadUpdate(t, nil) + err = syncClient.BroadcastAsync(headUpdate) return } func CreateSyncTree( ctx context.Context, - deps SyncTreeCreateDeps) (t tree.ObjectTree, err error) { + deps CreateDeps) (t tree.ObjectTree, err error) { t, err = createObjectTree(deps.Payload, deps.AclList, deps.CreateStorage) if err != nil { return } + syncClient := newSyncClient( + deps.SpaceId, + deps.StreamPool, + deps.HeadNotifiable, + GetRequestFactory(), + deps.Configuration) syncTree := &SyncTree{ ObjectTree: t, - syncClient: deps.SyncClient, + syncClient: syncClient, listener: deps.Listener, } - syncHandler := newSyncTreeHandler(syncTree, deps.SyncClient) + syncHandler := newSyncTreeHandler(syncTree, syncClient) syncTree.SyncHandler = syncHandler t = syncTree - headUpdate := deps.SyncClient.CreateHeadUpdate(t, nil) - err = deps.SyncClient.BroadcastAsync(headUpdate) + headUpdate := syncClient.CreateHeadUpdate(t, nil) + err = syncClient.BroadcastAsync(headUpdate) return } func BuildSyncTree( ctx context.Context, isFirstBuild bool, - deps SyncTreeBuildDeps) (t tree.ObjectTree, err error) { + deps BuildDeps) (t tree.ObjectTree, err error) { t, err = buildObjectTree(deps.Storage, deps.AclList) if err != nil { return } + syncClient := newSyncClient( + deps.SpaceId, + deps.StreamPool, + deps.HeadNotifiable, + GetRequestFactory(), + deps.Configuration) syncTree := &SyncTree{ ObjectTree: t, - syncClient: deps.SyncClient, + syncClient: syncClient, listener: deps.Listener, } - syncHandler := newSyncTreeHandler(syncTree, deps.SyncClient) + syncHandler := newSyncTreeHandler(syncTree, syncClient) syncTree.SyncHandler = syncHandler t = syncTree diff --git a/common/commonspace/synctree/synctree_test.go b/common/commonspace/synctree/synctree_test.go index 4f9d2ac4..8d62f9b0 100644 --- a/common/commonspace/synctree/synctree_test.go +++ b/common/commonspace/synctree/synctree_test.go @@ -3,7 +3,6 @@ package synctree import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/mock_syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener/mock_updatelistener" @@ -21,7 +20,7 @@ import ( type syncTreeMatcher struct { objTree tree2.ObjectTree - client syncservice.SyncClient + client SyncClient listener updatelistener.UpdateListener } diff --git a/common/commonspace/synctree/synctreehandler.go b/common/commonspace/synctree/synctreehandler.go index fb71f280..441e71de 100644 --- a/common/commonspace/synctree/synctreehandler.go +++ b/common/commonspace/synctree/synctreehandler.go @@ -3,7 +3,6 @@ package synctree import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice" @@ -11,10 +10,10 @@ import ( type syncTreeHandler struct { objTree tree.ObjectTree - syncClient syncservice.SyncClient + syncClient SyncClient } -func newSyncTreeHandler(objTree tree.ObjectTree, syncClient syncservice.SyncClient) synchandler.SyncHandler { +func newSyncTreeHandler(objTree tree.ObjectTree, syncClient SyncClient) synchandler.SyncHandler { return &syncTreeHandler{ objTree: objTree, syncClient: syncClient, From 58f0cf29161a76d5f3cf41d4debaea410be1f08b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 22 Oct 2022 16:05:06 +0200 Subject: [PATCH 184/219] Change proto and generalise logic --- common/commonspace/space.go | 51 +- .../spacesyncproto/protos/spacesync.proto | 45 +- .../commonspace/spacesyncproto/spacesync.go | 62 - .../spacesyncproto/spacesync.pb.go | 1798 +--------------- common/commonspace/syncservice/streampool.go | 26 +- common/commonspace/syncservice/syncservice.go | 2 +- common/commonspace/synctree/requestfactory.go | 33 +- common/commonspace/synctree/syncclient.go | 48 +- common/commonspace/synctree/synctree.go | 67 +- .../commonspace/synctree/synctreehandler.go | 69 +- .../tree/mock_objecttree/mock_objecttree.go | 4 +- .../treechangeproto/protos/treechange.proto | 41 + common/pkg/acl/treechangeproto/treechange.go | 37 + .../pkg/acl/treechangeproto/treechange.pb.go | 1834 ++++++++++++++++- 14 files changed, 2159 insertions(+), 1958 deletions(-) create mode 100644 common/pkg/acl/treechangeproto/treechange.go diff --git a/common/commonspace/space.go b/common/commonspace/space.go index b957a515..dd2541bd 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -6,7 +6,6 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "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/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncacl" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" @@ -15,7 +14,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" - aclstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" @@ -167,51 +165,6 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene err = ErrSpaceClosed return } - getTreeRemote := func() (*spacesyncproto.ObjectSyncMessage, error) { - // TODO: add empty context handling (when this is not happening due to head update) - peerId, err := syncservice.GetPeerIdFromStreamContext(ctx) - if err != nil { - return nil, err - } - return s.syncService.StreamPool().SendSync( - peerId, - synctree.GetRequestFactory().CreateNewTreeRequest(id), - ) - } - - store, err := s.storage.TreeStorage(id) - if err != nil && err != aclstorage.ErrUnknownTreeId { - return - } - - isFirstBuild := false - if err == aclstorage.ErrUnknownTreeId { - isFirstBuild = true - var resp *spacesyncproto.ObjectSyncMessage - resp, err = getTreeRemote() - if err != nil { - return - } - fullSyncResp := resp.GetContent().GetFullSyncResponse() - - payload := aclstorage.TreeStorageCreatePayload{ - TreeId: resp.TreeId, - RootRawChange: resp.RootChange, - Changes: fullSyncResp.Changes, - Heads: fullSyncResp.Heads, - } - - // basically building tree with inmemory storage and validating that it was without errors - err = tree.ValidateRawTree(payload, s.aclList) - if err != nil { - return - } - // now we are sure that we can save it to the storage - store, err = s.storage.CreateTreeStorage(payload) - if err != nil { - return - } - } deps := synctree.BuildDeps{ SpaceId: s.id, StreamPool: s.syncService.StreamPool(), @@ -219,9 +172,9 @@ func (s *space) BuildTree(ctx context.Context, id string, listener updatelistene HeadNotifiable: s.diffService, Listener: listener, AclList: s.aclList, - Storage: store, + SpaceStorage: s.storage, } - return synctree.BuildSyncTree(ctx, isFirstBuild, deps) + return synctree.BuildSyncTreeOrGetRemote(ctx, id, deps) } func (s *space) Close() error { diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index c218b1a9..d8dc0153 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -2,7 +2,6 @@ syntax = "proto3"; package anySpace; option go_package = "commonspace/spacesyncproto"; -import "pkg/acl/treechangeproto/protos/treechange.proto"; import "pkg/acl/aclrecordproto/protos/aclrecord.proto"; enum ErrCodes { @@ -55,51 +54,13 @@ message HeadSyncResponse { // ObjectSyncMessage is a message sent on object sync message ObjectSyncMessage { string spaceId = 1; - ObjectSyncContentValue content = 2; - treechange.RawTreeChangeWithId rootChange = 3; - string treeId = 4; - string trackingId = 5; - + string replyId = 2; + bytes payload = 3; + string objectId = 4; // string identity = 5; // string peerSignature = 6; } -// ObjectSyncContentValue provides different types for object sync -message ObjectSyncContentValue { - oneof value { - ObjectHeadUpdate headUpdate = 1; - ObjectFullSyncRequest fullSyncRequest = 2; - ObjectFullSyncResponse fullSyncResponse = 3; - ObjectErrorResponse errorResponse = 4; - } -} - -// ObjectHeadUpdate is a message sent on document head update -message ObjectHeadUpdate { - repeated string heads = 1; - repeated treechange.RawTreeChangeWithId changes = 2; - repeated string snapshotPath = 3; -} - -// ObjectHeadUpdate is a message sent when document needs full sync -message ObjectFullSyncRequest { - repeated string heads = 1; - repeated treechange.RawTreeChangeWithId changes = 2; - repeated string snapshotPath = 3; -} - -// ObjectFullSyncResponse is a message sent as a response for a specific full sync -message ObjectFullSyncResponse { - repeated string heads = 1; - repeated treechange.RawTreeChangeWithId changes = 2; - repeated string snapshotPath = 3; -} - -// ObjectErrorResponse is an error sent as a response for a full sync request -message ObjectErrorResponse { - string error = 1; -} - // PushSpaceRequest is a request to add space on a node containing only one acl record message PushSpaceRequest { RawSpaceHeaderWithId spaceHeader = 2; diff --git a/common/commonspace/spacesyncproto/spacesync.go b/common/commonspace/spacesyncproto/spacesync.go index 952faf4b..7c55930f 100644 --- a/common/commonspace/spacesyncproto/spacesync.go +++ b/common/commonspace/spacesyncproto/spacesync.go @@ -2,8 +2,6 @@ package spacesyncproto import ( - "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "storj.io/drpc" ) @@ -18,63 +16,3 @@ func (c ClientFactoryFunc) Client(cc drpc.Conn) DRPCSpaceClient { type ClientFactory interface { Client(cc drpc.Conn) DRPCSpaceClient } - -func WrapHeadUpdate(update *ObjectHeadUpdate, rootChange *treechangeproto.RawTreeChangeWithId, treeId, trackingId string) *ObjectSyncMessage { - return &ObjectSyncMessage{ - Content: &ObjectSyncContentValue{ - Value: &ObjectSyncContentValue_HeadUpdate{HeadUpdate: update}, - }, - RootChange: rootChange, - TreeId: treeId, - TrackingId: trackingId, - } -} - -func WrapFullRequest(request *ObjectFullSyncRequest, rootChange *treechangeproto.RawTreeChangeWithId, treeId, trackingId string) *ObjectSyncMessage { - return &ObjectSyncMessage{ - Content: &ObjectSyncContentValue{ - Value: &ObjectSyncContentValue_FullSyncRequest{FullSyncRequest: request}, - }, - RootChange: rootChange, - TreeId: treeId, - TrackingId: trackingId, - } -} - -func WrapFullResponse(response *ObjectFullSyncResponse, rootChange *treechangeproto.RawTreeChangeWithId, treeId, trackingId string) *ObjectSyncMessage { - return &ObjectSyncMessage{ - Content: &ObjectSyncContentValue{ - Value: &ObjectSyncContentValue_FullSyncResponse{FullSyncResponse: response}, - }, - RootChange: rootChange, - TreeId: treeId, - TrackingId: trackingId, - } -} - -func WrapError(err error, rootChange *treechangeproto.RawTreeChangeWithId, treeId, trackingId string) *ObjectSyncMessage { - return &ObjectSyncMessage{ - Content: &ObjectSyncContentValue{ - Value: &ObjectSyncContentValue_ErrorResponse{ErrorResponse: &ObjectErrorResponse{Error: err.Error()}}, - }, - RootChange: rootChange, - TreeId: treeId, - TrackingId: trackingId, - } -} - -func MessageDescription(msg *ObjectSyncMessage) (res string) { - content := msg.GetContent() - switch { - case content.GetHeadUpdate() != nil: - res = fmt.Sprintf("head update/%v", content.GetHeadUpdate().Heads) - case content.GetFullSyncRequest() != nil: - res = fmt.Sprintf("fullsync request/%v", content.GetFullSyncRequest().Heads) - case content.GetFullSyncResponse() != nil: - res = fmt.Sprintf("fullsync response/%v", content.GetFullSyncResponse().Heads) - case content.GetErrorResponse() != nil: - res = fmt.Sprintf("error response/%v", content.GetErrorResponse().Error) - } - res = fmt.Sprintf("%s/tracking=[%s]", res, msg.TrackingId) - return res -} diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 1764e6e3..2c4115a3 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -6,7 +6,6 @@ package spacesyncproto import ( fmt "fmt" aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" - treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -330,11 +329,10 @@ func (m *HeadSyncResponse) GetResults() []*HeadSyncResult { // ObjectSyncMessage is a message sent on object sync type ObjectSyncMessage struct { - SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - Content *ObjectSyncContentValue `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` - RootChange *treechangeproto.RawTreeChangeWithId `protobuf:"bytes,3,opt,name=rootChange,proto3" json:"rootChange,omitempty"` - TreeId string `protobuf:"bytes,4,opt,name=treeId,proto3" json:"treeId,omitempty"` - TrackingId string `protobuf:"bytes,5,opt,name=trackingId,proto3" json:"trackingId,omitempty"` + SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` + ReplyId string `protobuf:"bytes,2,opt,name=replyId,proto3" json:"replyId,omitempty"` + Payload []byte `protobuf:"bytes,3,opt,name=payload,proto3" json:"payload,omitempty"` + ObjectId string `protobuf:"bytes,4,opt,name=objectId,proto3" json:"objectId,omitempty"` } func (m *ObjectSyncMessage) Reset() { *m = ObjectSyncMessage{} } @@ -377,370 +375,23 @@ func (m *ObjectSyncMessage) GetSpaceId() string { return "" } -func (m *ObjectSyncMessage) GetContent() *ObjectSyncContentValue { +func (m *ObjectSyncMessage) GetReplyId() string { if m != nil { - return m.Content - } - return nil -} - -func (m *ObjectSyncMessage) GetRootChange() *treechangeproto.RawTreeChangeWithId { - if m != nil { - return m.RootChange - } - return nil -} - -func (m *ObjectSyncMessage) GetTreeId() string { - if m != nil { - return m.TreeId + return m.ReplyId } return "" } -func (m *ObjectSyncMessage) GetTrackingId() string { +func (m *ObjectSyncMessage) GetPayload() []byte { if m != nil { - return m.TrackingId + return m.Payload } - return "" + return nil } -// ObjectSyncContentValue provides different types for object sync -type ObjectSyncContentValue struct { - // Types that are valid to be assigned to Value: - // *ObjectSyncContentValue_HeadUpdate - // *ObjectSyncContentValue_FullSyncRequest - // *ObjectSyncContentValue_FullSyncResponse - // *ObjectSyncContentValue_ErrorResponse - Value isObjectSyncContentValue_Value `protobuf_oneof:"value"` -} - -func (m *ObjectSyncContentValue) Reset() { *m = ObjectSyncContentValue{} } -func (m *ObjectSyncContentValue) String() string { return proto.CompactTextString(m) } -func (*ObjectSyncContentValue) ProtoMessage() {} -func (*ObjectSyncContentValue) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{6} -} -func (m *ObjectSyncContentValue) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ObjectSyncContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ObjectSyncContentValue.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 *ObjectSyncContentValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_ObjectSyncContentValue.Merge(m, src) -} -func (m *ObjectSyncContentValue) XXX_Size() int { - return m.Size() -} -func (m *ObjectSyncContentValue) XXX_DiscardUnknown() { - xxx_messageInfo_ObjectSyncContentValue.DiscardUnknown(m) -} - -var xxx_messageInfo_ObjectSyncContentValue proto.InternalMessageInfo - -type isObjectSyncContentValue_Value interface { - isObjectSyncContentValue_Value() - MarshalTo([]byte) (int, error) - Size() int -} - -type ObjectSyncContentValue_HeadUpdate struct { - HeadUpdate *ObjectHeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` -} -type ObjectSyncContentValue_FullSyncRequest struct { - FullSyncRequest *ObjectFullSyncRequest `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` -} -type ObjectSyncContentValue_FullSyncResponse struct { - FullSyncResponse *ObjectFullSyncResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` -} -type ObjectSyncContentValue_ErrorResponse struct { - ErrorResponse *ObjectErrorResponse `protobuf:"bytes,4,opt,name=errorResponse,proto3,oneof" json:"errorResponse,omitempty"` -} - -func (*ObjectSyncContentValue_HeadUpdate) isObjectSyncContentValue_Value() {} -func (*ObjectSyncContentValue_FullSyncRequest) isObjectSyncContentValue_Value() {} -func (*ObjectSyncContentValue_FullSyncResponse) isObjectSyncContentValue_Value() {} -func (*ObjectSyncContentValue_ErrorResponse) isObjectSyncContentValue_Value() {} - -func (m *ObjectSyncContentValue) GetValue() isObjectSyncContentValue_Value { +func (m *ObjectSyncMessage) GetObjectId() string { if m != nil { - return m.Value - } - return nil -} - -func (m *ObjectSyncContentValue) GetHeadUpdate() *ObjectHeadUpdate { - if x, ok := m.GetValue().(*ObjectSyncContentValue_HeadUpdate); ok { - return x.HeadUpdate - } - return nil -} - -func (m *ObjectSyncContentValue) GetFullSyncRequest() *ObjectFullSyncRequest { - if x, ok := m.GetValue().(*ObjectSyncContentValue_FullSyncRequest); ok { - return x.FullSyncRequest - } - return nil -} - -func (m *ObjectSyncContentValue) GetFullSyncResponse() *ObjectFullSyncResponse { - if x, ok := m.GetValue().(*ObjectSyncContentValue_FullSyncResponse); ok { - return x.FullSyncResponse - } - return nil -} - -func (m *ObjectSyncContentValue) GetErrorResponse() *ObjectErrorResponse { - if x, ok := m.GetValue().(*ObjectSyncContentValue_ErrorResponse); ok { - return x.ErrorResponse - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*ObjectSyncContentValue) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*ObjectSyncContentValue_HeadUpdate)(nil), - (*ObjectSyncContentValue_FullSyncRequest)(nil), - (*ObjectSyncContentValue_FullSyncResponse)(nil), - (*ObjectSyncContentValue_ErrorResponse)(nil), - } -} - -// ObjectHeadUpdate is a message sent on document head update -type ObjectHeadUpdate struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*treechangeproto.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` -} - -func (m *ObjectHeadUpdate) Reset() { *m = ObjectHeadUpdate{} } -func (m *ObjectHeadUpdate) String() string { return proto.CompactTextString(m) } -func (*ObjectHeadUpdate) ProtoMessage() {} -func (*ObjectHeadUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{7} -} -func (m *ObjectHeadUpdate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ObjectHeadUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ObjectHeadUpdate.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 *ObjectHeadUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_ObjectHeadUpdate.Merge(m, src) -} -func (m *ObjectHeadUpdate) XXX_Size() int { - return m.Size() -} -func (m *ObjectHeadUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_ObjectHeadUpdate.DiscardUnknown(m) -} - -var xxx_messageInfo_ObjectHeadUpdate proto.InternalMessageInfo - -func (m *ObjectHeadUpdate) GetHeads() []string { - if m != nil { - return m.Heads - } - return nil -} - -func (m *ObjectHeadUpdate) GetChanges() []*treechangeproto.RawTreeChangeWithId { - if m != nil { - return m.Changes - } - return nil -} - -func (m *ObjectHeadUpdate) GetSnapshotPath() []string { - if m != nil { - return m.SnapshotPath - } - return nil -} - -// ObjectHeadUpdate is a message sent when document needs full sync -type ObjectFullSyncRequest struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*treechangeproto.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` -} - -func (m *ObjectFullSyncRequest) Reset() { *m = ObjectFullSyncRequest{} } -func (m *ObjectFullSyncRequest) String() string { return proto.CompactTextString(m) } -func (*ObjectFullSyncRequest) ProtoMessage() {} -func (*ObjectFullSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{8} -} -func (m *ObjectFullSyncRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ObjectFullSyncRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ObjectFullSyncRequest.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 *ObjectFullSyncRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ObjectFullSyncRequest.Merge(m, src) -} -func (m *ObjectFullSyncRequest) XXX_Size() int { - return m.Size() -} -func (m *ObjectFullSyncRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ObjectFullSyncRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ObjectFullSyncRequest proto.InternalMessageInfo - -func (m *ObjectFullSyncRequest) GetHeads() []string { - if m != nil { - return m.Heads - } - return nil -} - -func (m *ObjectFullSyncRequest) GetChanges() []*treechangeproto.RawTreeChangeWithId { - if m != nil { - return m.Changes - } - return nil -} - -func (m *ObjectFullSyncRequest) GetSnapshotPath() []string { - if m != nil { - return m.SnapshotPath - } - return nil -} - -// ObjectFullSyncResponse is a message sent as a response for a specific full sync -type ObjectFullSyncResponse struct { - Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` - Changes []*treechangeproto.RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` - SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` -} - -func (m *ObjectFullSyncResponse) Reset() { *m = ObjectFullSyncResponse{} } -func (m *ObjectFullSyncResponse) String() string { return proto.CompactTextString(m) } -func (*ObjectFullSyncResponse) ProtoMessage() {} -func (*ObjectFullSyncResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{9} -} -func (m *ObjectFullSyncResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ObjectFullSyncResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ObjectFullSyncResponse.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 *ObjectFullSyncResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ObjectFullSyncResponse.Merge(m, src) -} -func (m *ObjectFullSyncResponse) XXX_Size() int { - return m.Size() -} -func (m *ObjectFullSyncResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ObjectFullSyncResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ObjectFullSyncResponse proto.InternalMessageInfo - -func (m *ObjectFullSyncResponse) GetHeads() []string { - if m != nil { - return m.Heads - } - return nil -} - -func (m *ObjectFullSyncResponse) GetChanges() []*treechangeproto.RawTreeChangeWithId { - if m != nil { - return m.Changes - } - return nil -} - -func (m *ObjectFullSyncResponse) GetSnapshotPath() []string { - if m != nil { - return m.SnapshotPath - } - return nil -} - -// ObjectErrorResponse is an error sent as a response for a full sync request -type ObjectErrorResponse struct { - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` -} - -func (m *ObjectErrorResponse) Reset() { *m = ObjectErrorResponse{} } -func (m *ObjectErrorResponse) String() string { return proto.CompactTextString(m) } -func (*ObjectErrorResponse) ProtoMessage() {} -func (*ObjectErrorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{10} -} -func (m *ObjectErrorResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ObjectErrorResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ObjectErrorResponse.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 *ObjectErrorResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ObjectErrorResponse.Merge(m, src) -} -func (m *ObjectErrorResponse) XXX_Size() int { - return m.Size() -} -func (m *ObjectErrorResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ObjectErrorResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ObjectErrorResponse proto.InternalMessageInfo - -func (m *ObjectErrorResponse) GetError() string { - if m != nil { - return m.Error + return m.ObjectId } return "" } @@ -755,7 +406,7 @@ func (m *PushSpaceRequest) Reset() { *m = PushSpaceRequest{} } func (m *PushSpaceRequest) String() string { return proto.CompactTextString(m) } func (*PushSpaceRequest) ProtoMessage() {} func (*PushSpaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{11} + return fileDescriptor_80e49f1f4ac27799, []int{6} } func (m *PushSpaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -806,7 +457,7 @@ func (m *PushSpaceResponse) Reset() { *m = PushSpaceResponse{} } func (m *PushSpaceResponse) String() string { return proto.CompactTextString(m) } func (*PushSpaceResponse) ProtoMessage() {} func (*PushSpaceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{12} + return fileDescriptor_80e49f1f4ac27799, []int{7} } func (m *PushSpaceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -848,7 +499,7 @@ func (m *SpaceHeader) Reset() { *m = SpaceHeader{} } func (m *SpaceHeader) String() string { return proto.CompactTextString(m) } func (*SpaceHeader) ProtoMessage() {} func (*SpaceHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{13} + return fileDescriptor_80e49f1f4ac27799, []int{8} } func (m *SpaceHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -921,7 +572,7 @@ func (m *RawSpaceHeader) Reset() { *m = RawSpaceHeader{} } func (m *RawSpaceHeader) String() string { return proto.CompactTextString(m) } func (*RawSpaceHeader) ProtoMessage() {} func (*RawSpaceHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{14} + return fileDescriptor_80e49f1f4ac27799, []int{9} } func (m *RawSpaceHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -973,7 +624,7 @@ func (m *RawSpaceHeaderWithId) Reset() { *m = RawSpaceHeaderWithId{} } func (m *RawSpaceHeaderWithId) String() string { return proto.CompactTextString(m) } func (*RawSpaceHeaderWithId) ProtoMessage() {} func (*RawSpaceHeaderWithId) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{15} + return fileDescriptor_80e49f1f4ac27799, []int{10} } func (m *RawSpaceHeaderWithId) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1024,11 +675,6 @@ func init() { proto.RegisterType((*HeadSyncRequest)(nil), "anySpace.HeadSyncRequest") proto.RegisterType((*HeadSyncResponse)(nil), "anySpace.HeadSyncResponse") proto.RegisterType((*ObjectSyncMessage)(nil), "anySpace.ObjectSyncMessage") - proto.RegisterType((*ObjectSyncContentValue)(nil), "anySpace.ObjectSyncContentValue") - proto.RegisterType((*ObjectHeadUpdate)(nil), "anySpace.ObjectHeadUpdate") - proto.RegisterType((*ObjectFullSyncRequest)(nil), "anySpace.ObjectFullSyncRequest") - proto.RegisterType((*ObjectFullSyncResponse)(nil), "anySpace.ObjectFullSyncResponse") - proto.RegisterType((*ObjectErrorResponse)(nil), "anySpace.ObjectErrorResponse") proto.RegisterType((*PushSpaceRequest)(nil), "anySpace.PushSpaceRequest") proto.RegisterType((*PushSpaceResponse)(nil), "anySpace.PushSpaceResponse") proto.RegisterType((*SpaceHeader)(nil), "anySpace.SpaceHeader") @@ -1041,68 +687,52 @@ func init() { } var fileDescriptor_80e49f1f4ac27799 = []byte{ - // 963 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0x4f, 0x8f, 0xdb, 0x44, - 0x14, 0x8f, 0xb3, 0xd9, 0x4d, 0xf2, 0x92, 0x66, 0xd3, 0xe9, 0x1f, 0x4c, 0x4a, 0xd3, 0xc8, 0x07, - 0xb4, 0x02, 0xb1, 0x81, 0x80, 0x84, 0xa0, 0x48, 0xd0, 0x6e, 0xb3, 0x4a, 0x54, 0xda, 0xae, 0x66, - 0x5b, 0x90, 0x10, 0x97, 0xa9, 0x3d, 0x9b, 0x98, 0x3a, 0x1e, 0x33, 0x33, 0x21, 0xcd, 0x27, 0xe0, - 0x02, 0x12, 0x5f, 0x81, 0xcf, 0xc2, 0x85, 0x63, 0x8f, 0x3d, 0xa2, 0xdd, 0x2f, 0x82, 0xe6, 0xd9, - 0x8e, 0xed, 0xe0, 0x2d, 0xc7, 0x5e, 0xb2, 0xf3, 0xde, 0xfc, 0xde, 0x9b, 0xdf, 0xfc, 0xde, 0x1b, - 0xbf, 0x85, 0x4f, 0x5c, 0xb1, 0x58, 0x88, 0x50, 0x45, 0xcc, 0xe5, 0x43, 0xfc, 0x55, 0xeb, 0xd0, - 0x8d, 0xa4, 0xd0, 0x62, 0x88, 0xbf, 0x2a, 0xf3, 0x1e, 0xa2, 0x83, 0x34, 0x58, 0xb8, 0x3e, 0x35, - 0xbe, 0xde, 0x30, 0x7a, 0x31, 0x1b, 0x32, 0x37, 0x18, 0x6a, 0xc9, 0xb9, 0x3b, 0x67, 0xe1, 0x8c, - 0x17, 0x22, 0x33, 0x77, 0x1c, 0xda, 0xfb, 0x28, 0x0d, 0x60, 0x6e, 0x20, 0xb9, 0x2b, 0xa4, 0x57, - 0xc0, 0x6f, 0xbc, 0x31, 0xdc, 0x99, 0xc2, 0x95, 0x09, 0x67, 0xde, 0xe9, 0x3a, 0x74, 0xa9, 0xc9, - 0x42, 0x08, 0xd4, 0xce, 0xa4, 0x58, 0xd8, 0xd6, 0xc0, 0x3a, 0xa8, 0x51, 0x5c, 0x93, 0x0e, 0x54, - 0xb5, 0xb0, 0xab, 0xe8, 0xa9, 0x6a, 0x41, 0xae, 0xc3, 0x6e, 0xe0, 0x2f, 0x7c, 0x6d, 0xef, 0x0c, - 0xac, 0x83, 0x2b, 0x34, 0x36, 0x9c, 0x15, 0x74, 0x36, 0xa9, 0xb8, 0x5a, 0x06, 0xda, 0xe4, 0x9a, - 0x33, 0x35, 0xc7, 0x5c, 0x6d, 0x8a, 0x6b, 0x72, 0x17, 0x1a, 0x3c, 0xe0, 0x0b, 0x1e, 0x6a, 0x65, - 0x57, 0x07, 0x3b, 0x07, 0xad, 0xd1, 0x9d, 0xc3, 0xf4, 0xb6, 0x87, 0xc5, 0xf8, 0x71, 0x8c, 0xa3, - 0x9b, 0x00, 0x73, 0xb0, 0x2b, 0x96, 0xe1, 0xe6, 0x60, 0x34, 0x9c, 0xbb, 0x70, 0xa3, 0x34, 0xd0, - 0xf0, 0xf6, 0x3d, 0x3c, 0xbd, 0x49, 0xab, 0xbe, 0x87, 0x7c, 0x38, 0xf3, 0xf0, 0x26, 0x4d, 0x8a, - 0x6b, 0xe7, 0x47, 0xd8, 0xcf, 0x82, 0x7f, 0x5e, 0x72, 0xa5, 0x89, 0x0d, 0x75, 0x2c, 0xc8, 0x34, - 0x8d, 0x4d, 0x4d, 0x32, 0x84, 0x3d, 0x69, 0x54, 0x4a, 0xa9, 0xbf, 0x53, 0x42, 0xdd, 0xec, 0xd3, - 0x04, 0xe6, 0x1c, 0x43, 0x37, 0x47, 0x2d, 0x12, 0xa1, 0xe2, 0x64, 0x04, 0x75, 0x89, 0x34, 0x95, - 0x6d, 0x61, 0x16, 0xfb, 0x32, 0x01, 0x68, 0x0a, 0x74, 0xce, 0x2d, 0xb8, 0xfa, 0xe4, 0xf9, 0x4f, - 0xdc, 0xd5, 0x66, 0xf7, 0x11, 0x57, 0x8a, 0xcd, 0xf8, 0x1b, 0x88, 0x7e, 0x09, 0x75, 0x57, 0x84, - 0x9a, 0x87, 0x1a, 0x2f, 0xdb, 0x1a, 0x0d, 0xb2, 0x33, 0xb2, 0x3c, 0x47, 0x31, 0xe4, 0x3b, 0x16, - 0x2c, 0x39, 0x4d, 0x03, 0xc8, 0xd7, 0x00, 0x52, 0x08, 0x7d, 0x84, 0x5d, 0x85, 0x4a, 0x9b, 0x1a, - 0xe5, 0x1a, 0x8d, 0xb2, 0xd5, 0x53, 0xc9, 0x79, 0x0c, 0xf8, 0xde, 0xd7, 0xf3, 0xa9, 0x47, 0x73, - 0x21, 0xe4, 0x26, 0xec, 0x19, 0xf4, 0xd4, 0xb3, 0x6b, 0xc8, 0x2a, 0xb1, 0x48, 0x1f, 0x40, 0x4b, - 0xe6, 0xbe, 0xf0, 0xc3, 0xd9, 0xd4, 0xb3, 0x77, 0x71, 0x2f, 0xe7, 0x71, 0xfe, 0xaa, 0xc2, 0xcd, - 0x72, 0x72, 0xe4, 0x2b, 0x00, 0x53, 0xad, 0x67, 0x91, 0xc7, 0x34, 0xc7, 0xcb, 0xb6, 0x46, 0xbd, - 0xed, 0x2b, 0x4d, 0x36, 0x88, 0x49, 0x85, 0xe6, 0xf0, 0xe4, 0x21, 0xec, 0x9f, 0x2d, 0x83, 0x20, - 0x57, 0xe3, 0x44, 0x95, 0x3b, 0xdb, 0x29, 0x8e, 0x8b, 0xb0, 0x49, 0x85, 0x6e, 0x47, 0x92, 0xc7, - 0xd0, 0xcd, 0x5c, 0x71, 0x49, 0x13, 0x91, 0x06, 0x97, 0x67, 0x8b, 0x71, 0x93, 0x0a, 0xfd, 0x4f, - 0x2c, 0x19, 0xc3, 0x15, 0x2e, 0xa5, 0x90, 0x9b, 0x64, 0x35, 0x4c, 0x76, 0x7b, 0x3b, 0xd9, 0x38, - 0x0f, 0x9a, 0x54, 0x68, 0x31, 0xea, 0x7e, 0x1d, 0x76, 0x7f, 0x31, 0x52, 0x39, 0xbf, 0x5a, 0xd0, - 0xdd, 0xd6, 0xc3, 0x3c, 0x1c, 0xa3, 0x47, 0xdc, 0x71, 0x4d, 0x1a, 0x1b, 0xe4, 0x0b, 0xa8, 0xc7, - 0x25, 0xcd, 0x9e, 0xe2, 0xff, 0x94, 0x39, 0xc5, 0x13, 0x07, 0xda, 0x2a, 0x64, 0x91, 0x9a, 0x0b, - 0x7d, 0xc2, 0xf4, 0xdc, 0xde, 0xc1, 0xbc, 0x05, 0x9f, 0xf3, 0x9b, 0x05, 0x37, 0x4a, 0x65, 0x7d, - 0x3b, 0x74, 0x7e, 0xb7, 0xd2, 0xf6, 0xda, 0xae, 0xcb, 0xdb, 0xe1, 0xf3, 0x21, 0x5c, 0x2b, 0xa9, - 0xac, 0xe1, 0x82, 0x95, 0x4d, 0x9e, 0x74, 0x6c, 0x18, 0xf2, 0xdd, 0x93, 0xa5, 0x9a, 0x63, 0x47, - 0xa4, 0x32, 0x7e, 0x03, 0x2d, 0x7c, 0xf0, 0xa6, 0xd0, 0x5c, 0x26, 0x3d, 0xdd, 0xcf, 0x1a, 0x87, - 0xb2, 0xd5, 0x69, 0xb6, 0x9f, 0x70, 0xcc, 0x87, 0x90, 0xcf, 0xa1, 0xce, 0xdc, 0x80, 0x0a, 0xa1, - 0x93, 0x1e, 0xbe, 0x7d, 0x98, 0x4d, 0x08, 0xca, 0x56, 0xf7, 0x8e, 0xbe, 0xa5, 0x68, 0xa4, 0x17, - 0x4c, 0xd0, 0xce, 0x35, 0xb8, 0x9a, 0xa3, 0x13, 0x53, 0x77, 0xfe, 0xb4, 0xa0, 0x95, 0x3b, 0x90, - 0xf4, 0xa0, 0xe1, 0x7b, 0x3c, 0xd4, 0xbe, 0x5e, 0x27, 0x33, 0x60, 0x63, 0x93, 0xf7, 0xa0, 0xa9, - 0xfd, 0x05, 0x57, 0x9a, 0x2d, 0x22, 0x64, 0xbe, 0x43, 0x33, 0x87, 0xd9, 0x45, 0x9a, 0x4f, 0xd7, - 0x51, 0xfc, 0xba, 0x9a, 0x34, 0x73, 0x90, 0xf7, 0xa1, 0x23, 0x79, 0x14, 0xf8, 0x2e, 0xd3, 0xbe, - 0x08, 0x1f, 0xf2, 0x35, 0xbe, 0x99, 0x1a, 0xdd, 0xf2, 0x9a, 0xef, 0xbd, 0xe2, 0x3c, 0xfe, 0xd4, - 0xb4, 0x29, 0xae, 0x9d, 0x13, 0xe8, 0x14, 0x65, 0x21, 0x83, 0xa2, 0x8a, 0x31, 0xd1, 0x82, 0x4a, - 0x86, 0x8d, 0x3f, 0x0b, 0x99, 0x5e, 0x4a, 0x8e, 0x5c, 0xdb, 0x34, 0x73, 0x38, 0x0f, 0xe0, 0x7a, - 0x99, 0xd0, 0x26, 0x4a, 0xb2, 0x55, 0x21, 0x6b, 0xe6, 0x48, 0x66, 0x53, 0x35, 0x9d, 0x4d, 0x1f, - 0x3c, 0x86, 0xc6, 0x58, 0xca, 0x23, 0xe1, 0x71, 0x45, 0x3a, 0x00, 0xcf, 0x42, 0xfe, 0x32, 0xe2, - 0xae, 0xe6, 0x5e, 0xb7, 0x42, 0xba, 0xd0, 0xc6, 0xf4, 0x8f, 0x7c, 0xa5, 0xfc, 0x70, 0xd6, 0xb5, - 0xc8, 0x7e, 0x22, 0xf4, 0xf8, 0xa5, 0xaf, 0xb4, 0xea, 0x56, 0x8d, 0x03, 0xdb, 0xe8, 0xc9, 0xd9, - 0x99, 0xe2, 0xba, 0xeb, 0x8d, 0x5e, 0x5b, 0xb0, 0x8b, 0x10, 0x72, 0x0f, 0x1a, 0xe9, 0x58, 0x21, - 0xef, 0x96, 0x8d, 0x1a, 0x6c, 0xa6, 0x5e, 0xaf, 0x74, 0x0a, 0xc5, 0x3d, 0xf9, 0x00, 0x9a, 0x9b, - 0x6a, 0x93, 0x1c, 0x70, 0xbb, 0x23, 0x7b, 0xb7, 0x4a, 0xf7, 0x92, 0x2c, 0xc7, 0xb0, 0x77, 0xaa, - 0x25, 0x67, 0x0b, 0x72, 0xab, 0x6c, 0x1a, 0x25, 0x53, 0xad, 0xf7, 0xa6, 0xcd, 0x03, 0xeb, 0x63, - 0xeb, 0xfe, 0x67, 0x7f, 0x9f, 0xf7, 0xad, 0x57, 0xe7, 0x7d, 0xeb, 0x9f, 0xf3, 0xbe, 0xf5, 0xc7, - 0x45, 0xbf, 0xf2, 0xea, 0xa2, 0x5f, 0x79, 0x7d, 0xd1, 0xaf, 0xfc, 0xd0, 0xbb, 0xfc, 0x5f, 0xad, - 0xe7, 0x7b, 0xf8, 0xe7, 0xd3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x39, 0x40, 0xba, 0x5d, 0x8f, - 0x09, 0x00, 0x00, + // 717 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0x4f, 0x6f, 0xda, 0x48, + 0x14, 0xc7, 0x84, 0x24, 0xf0, 0x20, 0x84, 0xcc, 0x66, 0xb5, 0x5e, 0x76, 0x97, 0x45, 0x3e, 0xac, + 0xd0, 0x4a, 0x0b, 0x5b, 0x5a, 0xa9, 0x87, 0x5c, 0x9a, 0x26, 0x44, 0x45, 0x6d, 0x9a, 0x68, 0x68, + 0x55, 0xa9, 0xea, 0x65, 0x62, 0x4f, 0xc0, 0x2d, 0xf6, 0xb8, 0x33, 0x83, 0x88, 0x0f, 0xfd, 0x08, + 0x95, 0xfa, 0x15, 0xfa, 0x6d, 0x7a, 0xcc, 0x31, 0xc7, 0x2a, 0xf9, 0x22, 0xd5, 0x3c, 0x63, 0x0c, + 0x29, 0xc9, 0x01, 0x33, 0xef, 0xcf, 0xef, 0xbd, 0xdf, 0xfc, 0xfc, 0x9e, 0xe1, 0x81, 0x2b, 0x82, + 0x40, 0x84, 0x2a, 0x62, 0x2e, 0xef, 0xe0, 0x53, 0xc5, 0xa1, 0x1b, 0x49, 0xa1, 0x45, 0x07, 0x9f, + 0x2a, 0xf3, 0xb6, 0xd1, 0x41, 0x8a, 0x2c, 0x8c, 0x07, 0xc6, 0x57, 0xff, 0x2f, 0xfa, 0x30, 0xec, + 0x30, 0x77, 0x6c, 0x7e, 0x92, 0xbb, 0x42, 0x7a, 0x4b, 0xc0, 0xb9, 0x37, 0x01, 0x3a, 0x7d, 0xd8, + 0x7a, 0xc6, 0x99, 0x37, 0x88, 0x43, 0x97, 0xb2, 0x70, 0xc8, 0x09, 0x81, 0xc2, 0xb9, 0x14, 0x81, + 0x6d, 0x35, 0xad, 0x56, 0x81, 0xe2, 0x99, 0x54, 0x21, 0xaf, 0x85, 0x9d, 0x47, 0x4f, 0x5e, 0x0b, + 0xb2, 0x0b, 0xeb, 0x63, 0x3f, 0xf0, 0xb5, 0xbd, 0xd6, 0xb4, 0x5a, 0x5b, 0x34, 0x31, 0x9c, 0x29, + 0x54, 0xe7, 0xa5, 0xb8, 0x9a, 0x8c, 0xb5, 0xa9, 0x35, 0x62, 0x6a, 0x84, 0xb5, 0x2a, 0x14, 0xcf, + 0x64, 0x0f, 0x8a, 0x7c, 0xcc, 0x03, 0x1e, 0x6a, 0x65, 0xe7, 0x9b, 0x6b, 0xad, 0x72, 0xf7, 0xef, + 0x76, 0x4a, 0xbe, 0xbd, 0x8c, 0xef, 0x25, 0x79, 0x74, 0x0e, 0x30, 0x8d, 0x5d, 0x31, 0x09, 0xe7, + 0x8d, 0xd1, 0x70, 0xf6, 0xe0, 0xd7, 0x95, 0x40, 0xc3, 0xdb, 0xf7, 0xb0, 0x7b, 0x89, 0xe6, 0x7d, + 0x0f, 0xf9, 0x70, 0xe6, 0xe1, 0x4d, 0x4a, 0x14, 0xcf, 0xce, 0x3b, 0xd8, 0xce, 0xc0, 0x1f, 0x27, + 0x5c, 0x69, 0x62, 0xc3, 0x26, 0xea, 0xdb, 0x4f, 0xb1, 0xa9, 0x49, 0x3a, 0xb0, 0x21, 0x8d, 0x4a, + 0x29, 0xf5, 0xdf, 0x56, 0x50, 0x37, 0x71, 0x3a, 0x4b, 0x73, 0x8e, 0xa0, 0xb6, 0x40, 0x2d, 0x12, + 0xa1, 0xe2, 0xa4, 0x0b, 0x9b, 0x12, 0x69, 0x2a, 0xdb, 0xc2, 0x2a, 0xf6, 0x5d, 0x02, 0xd0, 0x34, + 0xd1, 0xf9, 0x04, 0x3b, 0x27, 0x67, 0xef, 0xb9, 0xab, 0x4d, 0xf0, 0x98, 0x2b, 0xc5, 0x86, 0xfc, + 0x1e, 0x9e, 0xb6, 0x69, 0x11, 0x8d, 0xe3, 0x7e, 0x7a, 0xd7, 0xd4, 0x34, 0x91, 0x88, 0xc5, 0x63, + 0xc1, 0x3c, 0xd4, 0xb0, 0x42, 0x53, 0x93, 0xd4, 0xa1, 0x28, 0xb0, 0x45, 0xdf, 0xb3, 0x0b, 0x08, + 0x9a, 0xdb, 0xce, 0x67, 0x0b, 0x6a, 0xa7, 0x13, 0x35, 0x42, 0x92, 0xa9, 0x4c, 0x4f, 0xa0, 0x8c, + 0xfd, 0x0c, 0x67, 0x2e, 0xb1, 0x51, 0xb9, 0xdb, 0xc8, 0xee, 0x42, 0xd9, 0x74, 0x90, 0xc5, 0xdf, + 0xf8, 0x7a, 0xd4, 0xf7, 0xe8, 0x22, 0x84, 0x3c, 0x86, 0x4d, 0xe6, 0x8e, 0xa9, 0x10, 0xc9, 0x0b, + 0x2d, 0x77, 0xff, 0x6a, 0x67, 0xf3, 0x49, 0xd9, 0x74, 0xff, 0xe0, 0x05, 0x45, 0x63, 0x06, 0x4e, + 0xb3, 0x9d, 0x5f, 0x60, 0x67, 0x81, 0x4e, 0xa2, 0xab, 0xf3, 0xd5, 0x82, 0xf2, 0x42, 0x43, 0x73, + 0x21, 0xdf, 0xe3, 0xa1, 0xf6, 0x75, 0x3c, 0x9b, 0xc0, 0xb9, 0x4d, 0xfe, 0x84, 0x92, 0xf6, 0x03, + 0xae, 0x34, 0x0b, 0x22, 0x64, 0xbe, 0x46, 0x33, 0x87, 0x89, 0x22, 0xcd, 0x57, 0x71, 0xc4, 0x91, + 0x59, 0x89, 0x66, 0x0e, 0xf2, 0x0f, 0x54, 0x8d, 0x9a, 0xbe, 0xcb, 0xb4, 0x2f, 0xc2, 0xe7, 0x3c, + 0x46, 0xb9, 0x0a, 0xf4, 0x96, 0xd7, 0x4c, 0x9b, 0xe2, 0xdc, 0xb3, 0xd7, 0x93, 0xe9, 0x37, 0x67, + 0xe7, 0x14, 0xaa, 0xcb, 0xb2, 0x90, 0xe6, 0xb2, 0x8a, 0x09, 0xd1, 0x25, 0x95, 0x0c, 0x1b, 0x7f, + 0x18, 0x32, 0x3d, 0x91, 0x1c, 0xb9, 0x56, 0x68, 0xe6, 0x70, 0x0e, 0x61, 0x77, 0x95, 0xd0, 0x06, + 0x25, 0xd9, 0x74, 0xa9, 0x6a, 0xe6, 0x98, 0x6d, 0x46, 0x3e, 0xdd, 0x8c, 0x7f, 0x5f, 0x42, 0xb1, + 0x27, 0xe5, 0x81, 0xf0, 0xb8, 0x22, 0x55, 0x80, 0xd7, 0x21, 0xbf, 0x88, 0xb8, 0xab, 0xb9, 0x57, + 0xcb, 0x91, 0x1a, 0x54, 0xb0, 0xfc, 0xb1, 0xaf, 0x94, 0x1f, 0x0e, 0x6b, 0x16, 0xd9, 0x9e, 0x09, + 0xdd, 0xbb, 0xf0, 0x95, 0x56, 0xb5, 0xbc, 0x71, 0xf4, 0xa4, 0x14, 0xf2, 0xe4, 0xfc, 0x5c, 0x71, + 0x5d, 0xf3, 0xba, 0x57, 0x16, 0xac, 0x63, 0x0a, 0xd9, 0x87, 0x62, 0x3a, 0xd4, 0xe4, 0xf7, 0x55, + 0x83, 0x8e, 0xc3, 0x54, 0xaf, 0xaf, 0xdc, 0x81, 0x64, 0x61, 0x0e, 0xa1, 0x34, 0x7f, 0xdb, 0x64, + 0x21, 0xf1, 0xf6, 0x44, 0xd6, 0xff, 0x58, 0x19, 0x9b, 0x55, 0x39, 0x82, 0x8d, 0x81, 0x96, 0x9c, + 0x05, 0x64, 0x21, 0xed, 0xa7, 0xa5, 0xaa, 0xdf, 0x17, 0x6c, 0x59, 0xff, 0x5b, 0x4f, 0x1f, 0x7d, + 0xbb, 0x6e, 0x58, 0x97, 0xd7, 0x0d, 0xeb, 0xfb, 0x75, 0xc3, 0xfa, 0x72, 0xd3, 0xc8, 0x5d, 0xde, + 0x34, 0x72, 0x57, 0x37, 0x8d, 0xdc, 0xdb, 0xfa, 0xdd, 0xdf, 0xed, 0xb3, 0x0d, 0xfc, 0x7b, 0xf8, + 0x23, 0x00, 0x00, 0xff, 0xff, 0x84, 0x55, 0x32, 0xc7, 0xdc, 0x05, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { @@ -1330,41 +960,24 @@ func (m *ObjectSyncMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.TrackingId) > 0 { - i -= len(m.TrackingId) - copy(dAtA[i:], m.TrackingId) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.TrackingId))) - i-- - dAtA[i] = 0x2a - } - if len(m.TreeId) > 0 { - i -= len(m.TreeId) - copy(dAtA[i:], m.TreeId) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.TreeId))) + if len(m.ObjectId) > 0 { + i -= len(m.ObjectId) + copy(dAtA[i:], m.ObjectId) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.ObjectId))) i-- dAtA[i] = 0x22 } - if m.RootChange != nil { - { - size, err := m.RootChange.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } + if len(m.Payload) > 0 { + i -= len(m.Payload) + copy(dAtA[i:], m.Payload) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Payload))) i-- dAtA[i] = 0x1a } - if m.Content != nil { - { - size, err := m.Content.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } + if len(m.ReplyId) > 0 { + i -= len(m.ReplyId) + copy(dAtA[i:], m.ReplyId) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.ReplyId))) i-- dAtA[i] = 0x12 } @@ -1378,317 +991,6 @@ func (m *ObjectSyncMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ObjectSyncContentValue) 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 *ObjectSyncContentValue) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ObjectSyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Value != nil { - { - size := m.Value.Size() - i -= size - if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - return len(dAtA) - i, nil -} - -func (m *ObjectSyncContentValue_HeadUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ObjectSyncContentValue_HeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.HeadUpdate != nil { - { - size, err := m.HeadUpdate.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} -func (m *ObjectSyncContentValue_FullSyncRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ObjectSyncContentValue_FullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.FullSyncRequest != nil { - { - size, err := m.FullSyncRequest.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *ObjectSyncContentValue_FullSyncResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ObjectSyncContentValue_FullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.FullSyncResponse != nil { - { - size, err := m.FullSyncResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} -func (m *ObjectSyncContentValue_ErrorResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ObjectSyncContentValue_ErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.ErrorResponse != nil { - { - size, err := m.ErrorResponse.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} -func (m *ObjectHeadUpdate) 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 *ObjectHeadUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ObjectHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.SnapshotPath) > 0 { - for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.SnapshotPath[iNdEx]) - copy(dAtA[i:], m.SnapshotPath[iNdEx]) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - if len(m.Changes) > 0 { - for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Heads) > 0 { - for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Heads[iNdEx]) - copy(dAtA[i:], m.Heads[iNdEx]) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Heads[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ObjectFullSyncRequest) 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 *ObjectFullSyncRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ObjectFullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.SnapshotPath) > 0 { - for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.SnapshotPath[iNdEx]) - copy(dAtA[i:], m.SnapshotPath[iNdEx]) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - if len(m.Changes) > 0 { - for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Heads) > 0 { - for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Heads[iNdEx]) - copy(dAtA[i:], m.Heads[iNdEx]) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Heads[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ObjectFullSyncResponse) 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 *ObjectFullSyncResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ObjectFullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.SnapshotPath) > 0 { - for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.SnapshotPath[iNdEx]) - copy(dAtA[i:], m.SnapshotPath[iNdEx]) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - if len(m.Changes) > 0 { - for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Heads) > 0 { - for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Heads[iNdEx]) - copy(dAtA[i:], m.Heads[iNdEx]) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Heads[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ObjectErrorResponse) 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 *ObjectErrorResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ObjectErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Error))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *PushSpaceRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1999,173 +1301,15 @@ func (m *ObjectSyncMessage) Size() (n int) { if l > 0 { n += 1 + l + sovSpacesync(uint64(l)) } - if m.Content != nil { - l = m.Content.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - if m.RootChange != nil { - l = m.RootChange.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - l = len(m.TreeId) + l = len(m.ReplyId) if l > 0 { n += 1 + l + sovSpacesync(uint64(l)) } - l = len(m.TrackingId) + l = len(m.Payload) if l > 0 { n += 1 + l + sovSpacesync(uint64(l)) } - return n -} - -func (m *ObjectSyncContentValue) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Value != nil { - n += m.Value.Size() - } - return n -} - -func (m *ObjectSyncContentValue_HeadUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.HeadUpdate != nil { - l = m.HeadUpdate.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - return n -} -func (m *ObjectSyncContentValue_FullSyncRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.FullSyncRequest != nil { - l = m.FullSyncRequest.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - return n -} -func (m *ObjectSyncContentValue_FullSyncResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.FullSyncResponse != nil { - l = m.FullSyncResponse.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - return n -} -func (m *ObjectSyncContentValue_ErrorResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ErrorResponse != nil { - l = m.ErrorResponse.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - return n -} -func (m *ObjectHeadUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Heads) > 0 { - for _, s := range m.Heads { - l = len(s) - n += 1 + l + sovSpacesync(uint64(l)) - } - } - if len(m.Changes) > 0 { - for _, e := range m.Changes { - l = e.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - } - if len(m.SnapshotPath) > 0 { - for _, s := range m.SnapshotPath { - l = len(s) - n += 1 + l + sovSpacesync(uint64(l)) - } - } - return n -} - -func (m *ObjectFullSyncRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Heads) > 0 { - for _, s := range m.Heads { - l = len(s) - n += 1 + l + sovSpacesync(uint64(l)) - } - } - if len(m.Changes) > 0 { - for _, e := range m.Changes { - l = e.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - } - if len(m.SnapshotPath) > 0 { - for _, s := range m.SnapshotPath { - l = len(s) - n += 1 + l + sovSpacesync(uint64(l)) - } - } - return n -} - -func (m *ObjectFullSyncResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Heads) > 0 { - for _, s := range m.Heads { - l = len(s) - n += 1 + l + sovSpacesync(uint64(l)) - } - } - if len(m.Changes) > 0 { - for _, e := range m.Changes { - l = e.Size() - n += 1 + l + sovSpacesync(uint64(l)) - } - } - if len(m.SnapshotPath) > 0 { - for _, s := range m.SnapshotPath { - l = len(s) - n += 1 + l + sovSpacesync(uint64(l)) - } - } - return n -} - -func (m *ObjectErrorResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Error) + l = len(m.ObjectId) if l > 0 { n += 1 + l + sovSpacesync(uint64(l)) } @@ -2886,9 +2030,9 @@ func (m *ObjectSyncMessage) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Content", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ReplyId", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowSpacesync @@ -2898,33 +2042,29 @@ func (m *ObjectSyncMessage) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthSpacesync } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthSpacesync } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Content == nil { - m.Content = &ObjectSyncContentValue{} - } - if err := m.Content.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ReplyId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RootChange", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowSpacesync @@ -2934,31 +2074,29 @@ func (m *ObjectSyncMessage) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthSpacesync } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthSpacesync } if postIndex > l { return io.ErrUnexpectedEOF } - if m.RootChange == nil { - m.RootChange = &treechangeproto.RawTreeChangeWithId{} - } - if err := m.RootChange.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) + if m.Payload == nil { + m.Payload = []byte{} } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TreeId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ObjectId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2986,755 +2124,7 @@ func (m *ObjectSyncMessage) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.TreeId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TrackingId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TrackingId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSpacesync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSpacesync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ObjectSyncContentValue) 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 ErrIntOverflowSpacesync - } - 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: ObjectSyncContentValue: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ObjectSyncContentValue: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field HeadUpdate", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ObjectHeadUpdate{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &ObjectSyncContentValue_HeadUpdate{v} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FullSyncRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ObjectFullSyncRequest{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &ObjectSyncContentValue_FullSyncRequest{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FullSyncResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ObjectFullSyncResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &ObjectSyncContentValue_FullSyncResponse{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ErrorResponse", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &ObjectErrorResponse{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Value = &ObjectSyncContentValue_ErrorResponse{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSpacesync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSpacesync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ObjectHeadUpdate) 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 ErrIntOverflowSpacesync - } - 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: ObjectHeadUpdate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ObjectHeadUpdate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Changes = append(m.Changes, &treechangeproto.RawTreeChangeWithId{}) - if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSpacesync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSpacesync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ObjectFullSyncRequest) 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 ErrIntOverflowSpacesync - } - 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: ObjectFullSyncRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ObjectFullSyncRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Changes = append(m.Changes, &treechangeproto.RawTreeChangeWithId{}) - if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSpacesync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSpacesync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ObjectFullSyncResponse) 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 ErrIntOverflowSpacesync - } - 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: ObjectFullSyncResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ObjectFullSyncResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthSpacesync - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Changes = append(m.Changes, &treechangeproto.RawTreeChangeWithId{}) - if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipSpacesync(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthSpacesync - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ObjectErrorResponse) 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 ErrIntOverflowSpacesync - } - 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: ObjectErrorResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ObjectErrorResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSpacesync - } - 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 ErrInvalidLengthSpacesync - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSpacesync - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Error = string(dAtA[iNdEx:postIndex]) + m.ObjectId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index f3d872a7..89572992 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -78,13 +78,13 @@ func (s *streamPool) SendSync( peerId string, msg *spacesyncproto.ObjectSyncMessage) (reply *spacesyncproto.ObjectSyncMessage, err error) { newCounter := s.counter.Add(1) - msg.TrackingId = genStreamPoolKey(peerId, msg.TreeId, newCounter) + msg.ReplyId = genStreamPoolKey(peerId, msg.ObjectId, newCounter) s.waitersMx.Lock() waiter := responseWaiter{ ch: make(chan *spacesyncproto.ObjectSyncMessage, 1), } - s.waiters[msg.TrackingId] = waiter + s.waiters[msg.ReplyId] = waiter s.waitersMx.Unlock() err = s.SendAsync([]string{peerId}, msg) @@ -95,10 +95,10 @@ func (s *streamPool) SendSync( select { case <-delay.C: s.waitersMx.Lock() - delete(s.waiters, msg.TrackingId) + delete(s.waiters, msg.ReplyId) s.waitersMx.Unlock() - log.With("trackingId", msg.TrackingId).Error("time elapsed when waiting") + log.With("trackingId", msg.ReplyId).Error("time elapsed when waiting") err = ErrSyncTimeout case reply = <-waiter.ch: if !delay.Stop() { @@ -125,8 +125,7 @@ func (s *streamPool) SendAsync(peers []string, message *spacesyncproto.ObjectSyn streams := getStreams() s.Unlock() - log.With("description", spacesyncproto.MessageDescription(message)). - With("treeId", message.TreeId). + log.With("objectId", message.ObjectId). Debugf("sending message to %d peers", len(streams)) for _, s := range streams { err = s.Send(message) @@ -174,8 +173,7 @@ Loop: func (s *streamPool) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) { streams := s.getAllStreams() - log.With("description", spacesyncproto.MessageDescription(message)). - With("treeId", message.TreeId). + log.With("objectId", message.ObjectId). Debugf("broadcasting message to %d peers", len(streams)) for _, stream := range streams { if err = stream.Send(message); err != nil { @@ -224,23 +222,23 @@ func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStre process := func(msg *spacesyncproto.ObjectSyncMessage) { s.lastUsage.Store(time.Now().Unix()) - if msg.TrackingId == "" { + if msg.ReplyId == "" { s.messageHandler(stream.Context(), peerId, msg) return } - log.With("trackingId", msg.TrackingId).Debug("getting message with tracking id") + log.With("trackingId", msg.ReplyId).Debug("getting message with tracking id") s.waitersMx.Lock() - waiter, exists := s.waiters[msg.TrackingId] + waiter, exists := s.waiters[msg.ReplyId] if !exists { - log.With("trackingId", msg.TrackingId).Debug("tracking id not exists") + log.With("trackingId", msg.ReplyId).Debug("tracking id not exists") s.waitersMx.Unlock() s.messageHandler(stream.Context(), peerId, msg) return } - log.With("trackingId", msg.TrackingId).Debug("tracking id exists") + log.With("trackingId", msg.ReplyId).Debug("tracking id exists") - delete(s.waiters, msg.TrackingId) + delete(s.waiters, msg.ReplyId) s.waitersMx.Unlock() waiter.ch <- msg } diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index d07cb1b2..24eb3054 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -84,7 +84,7 @@ func (s *syncService) LastUsage() time.Time { } func (s *syncService) HandleMessage(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { - obj, err := s.objectGetter.GetObject(ctx, message.TreeId) + obj, err := s.objectGetter.GetObject(ctx, message.ObjectId) if err != nil { return } diff --git a/common/commonspace/synctree/requestfactory.go b/common/commonspace/synctree/requestfactory.go index f35133ae..8e05267a 100644 --- a/common/commonspace/synctree/requestfactory.go +++ b/common/commonspace/synctree/requestfactory.go @@ -2,17 +2,16 @@ package synctree import ( "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "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" ) type RequestFactory interface { - CreateHeadUpdate(t tree.ObjectTree, added []*treechangeproto.RawTreeChangeWithId) (msg *spacesyncproto.ObjectSyncMessage) - CreateNewTreeRequest(id string) (msg *spacesyncproto.ObjectSyncMessage) - CreateFullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (req *spacesyncproto.ObjectSyncMessage, err error) - CreateFullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (*spacesyncproto.ObjectSyncMessage, error) + CreateHeadUpdate(t tree.ObjectTree, added []*treechangeproto.RawTreeChangeWithId) (msg *treechangeproto.TreeSyncMessage) + CreateNewTreeRequest() (msg *treechangeproto.TreeSyncMessage) + CreateFullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string) (req *treechangeproto.TreeSyncMessage, err error) + CreateFullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string) (*treechangeproto.TreeSyncMessage, error) } var factory = &requestFactory{} @@ -23,20 +22,20 @@ func GetRequestFactory() RequestFactory { type requestFactory struct{} -func (r *requestFactory) CreateHeadUpdate(t tree.ObjectTree, added []*treechangeproto.RawTreeChangeWithId) (msg *spacesyncproto.ObjectSyncMessage) { - return spacesyncproto.WrapHeadUpdate(&spacesyncproto.ObjectHeadUpdate{ +func (r *requestFactory) CreateHeadUpdate(t tree.ObjectTree, added []*treechangeproto.RawTreeChangeWithId) (msg *treechangeproto.TreeSyncMessage) { + return treechangeproto.WrapHeadUpdate(&treechangeproto.TreeHeadUpdate{ Heads: t.Heads(), Changes: added, SnapshotPath: t.SnapshotPath(), - }, t.Header(), t.ID(), "") + }, t.Header()) } -func (r *requestFactory) CreateNewTreeRequest(id string) (msg *spacesyncproto.ObjectSyncMessage) { - return spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{}, nil, id, "") +func (r *requestFactory) CreateNewTreeRequest() (msg *treechangeproto.TreeSyncMessage) { + return treechangeproto.WrapFullRequest(&treechangeproto.TreeFullSyncRequest{}, nil) } -func (r *requestFactory) CreateFullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (msg *spacesyncproto.ObjectSyncMessage, err error) { - req := &spacesyncproto.ObjectFullSyncRequest{} +func (r *requestFactory) CreateFullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string) (msg *treechangeproto.TreeSyncMessage, err error) { + req := &treechangeproto.TreeFullSyncRequest{} if t == nil { return nil, fmt.Errorf("tree should not be empty") } @@ -51,17 +50,17 @@ func (r *requestFactory) CreateFullSyncRequest(t tree.ObjectTree, theirHeads, th } req.Changes = changesAfterSnapshot - msg = spacesyncproto.WrapFullRequest(req, t.Header(), t.ID(), trackingId) + msg = treechangeproto.WrapFullRequest(req, t.Header()) return } -func (r *requestFactory) CreateFullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string, trackingId string) (msg *spacesyncproto.ObjectSyncMessage, err error) { - resp := &spacesyncproto.ObjectFullSyncResponse{ +func (r *requestFactory) CreateFullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string) (msg *treechangeproto.TreeSyncMessage, err error) { + resp := &treechangeproto.TreeFullSyncResponse{ Heads: t.Heads(), SnapshotPath: t.SnapshotPath(), } if slice.UnsortedEquals(theirHeads, t.Heads()) { - msg = spacesyncproto.WrapFullResponse(resp, t.Header(), t.ID(), trackingId) + msg = treechangeproto.WrapFullResponse(resp, t.Header()) return } @@ -70,6 +69,6 @@ func (r *requestFactory) CreateFullSyncResponse(t tree.ObjectTree, theirHeads, t return } resp.Changes = ourChanges - msg = spacesyncproto.WrapFullResponse(resp, t.Header(), t.ID(), trackingId) + msg = treechangeproto.WrapFullResponse(resp, t.Header()) return } diff --git a/common/commonspace/synctree/syncclient.go b/common/commonspace/synctree/syncclient.go index 842d796b..15631c93 100644 --- a/common/commonspace/synctree/syncclient.go +++ b/common/commonspace/synctree/syncclient.go @@ -5,15 +5,17 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "time" ) type SyncClient interface { - syncservice.StreamPool RequestFactory ocache.ObjectLastUsage - BroadcastAsyncOrSendResponsible(message *spacesyncproto.ObjectSyncMessage) (err error) + BroadcastAsync(message *treechangeproto.TreeSyncMessage) (err error) + BroadcastAsyncOrSendResponsible(message *treechangeproto.TreeSyncMessage) (err error) + SendAsync(peerId string, message *treechangeproto.TreeSyncMessage, replyId string) (err error) } type syncClient struct { @@ -43,21 +45,51 @@ func (s *syncClient) LastUsage() time.Time { return s.StreamPool.LastUsage() } -func (s *syncClient) BroadcastAsync(message *spacesyncproto.ObjectSyncMessage) (err error) { +func (s *syncClient) BroadcastAsync(message *treechangeproto.TreeSyncMessage) (err error) { s.notifyIfNeeded(message) - return s.StreamPool.BroadcastAsync(message) + objMsg, err := marshallTreeMessage(message, message.RootChange.Id, "") + if err != nil { + return + } + return s.StreamPool.BroadcastAsync(objMsg) } -func (s *syncClient) BroadcastAsyncOrSendResponsible(message *spacesyncproto.ObjectSyncMessage) (err error) { +func (s *syncClient) SendAsync(peerId string, message *treechangeproto.TreeSyncMessage, replyId string) (err error) { + objMsg, err := marshallTreeMessage(message, message.RootChange.Id, replyId) + if err != nil { + return + } + return s.StreamPool.SendAsync([]string{peerId}, objMsg) +} + +func (s *syncClient) BroadcastAsyncOrSendResponsible(message *treechangeproto.TreeSyncMessage) (err error) { + s.notifyIfNeeded(message) + objMsg, err := marshallTreeMessage(message, message.RootChange.Id, "") + if err != nil { + return + } if s.configuration.IsResponsible(s.spaceId) { - return s.SendAsync(s.configuration.NodeIds(s.spaceId), message) + return s.StreamPool.SendAsync(s.configuration.NodeIds(s.spaceId), objMsg) } return s.BroadcastAsync(message) } -func (s *syncClient) notifyIfNeeded(message *spacesyncproto.ObjectSyncMessage) { +func (s *syncClient) notifyIfNeeded(message *treechangeproto.TreeSyncMessage) { if message.GetContent().GetHeadUpdate() != nil { update := message.GetContent().GetHeadUpdate() - s.notifiable.UpdateHeads(message.TreeId, update.Heads) + s.notifiable.UpdateHeads(message.RootChange.Id, update.Heads) } } + +func marshallTreeMessage(message *treechangeproto.TreeSyncMessage, id, replyId string) (objMsg *spacesyncproto.ObjectSyncMessage, err error) { + payload, err := message.Marshal() + if err != nil { + return + } + objMsg = &spacesyncproto.ObjectSyncMessage{ + ReplyId: replyId, + Payload: payload, + ObjectId: id, + } + return +} diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index fd32a06b..c8221024 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -5,6 +5,7 @@ import ( "errors" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice" + 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" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" @@ -13,6 +14,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" + "github.com/gogo/protobuf/proto" ) var ErrSyncTreeClosed = errors.New("sync tree is closed") @@ -50,7 +52,8 @@ type BuildDeps struct { HeadNotifiable diffservice.HeadNotifiable Listener updatelistener.UpdateListener AclList list.ACLList - Storage storage.TreeStorage + SpaceStorage spacestorage.SpaceStorage + TreeStorage storage.TreeStorage } func DeriveSyncTree( @@ -107,12 +110,72 @@ func CreateSyncTree( return } +func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t tree.ObjectTree, err error) { + getTreeRemote := func() (msg *treechangeproto.TreeSyncMessage, err error) { + // TODO: add empty context handling (when this is not happening due to head update) + peerId, err := syncservice.GetPeerIdFromStreamContext(ctx) + if err != nil { + return + } + newTreeRequest := GetRequestFactory().CreateNewTreeRequest() + objMsg, err := marshallTreeMessage(newTreeRequest, id, "") + if err != nil { + return + } + + resp, err := deps.StreamPool.SendSync(peerId, objMsg) + if resp != nil { + return + } + msg = &treechangeproto.TreeSyncMessage{} + err = proto.Unmarshal(resp.Payload, msg) + return + } + + store, err := deps.SpaceStorage.TreeStorage(id) + if err != nil && err != storage.ErrUnknownTreeId { + return + } + + isFirstBuild := false + if err == storage.ErrUnknownTreeId { + isFirstBuild = true + + var resp *treechangeproto.TreeSyncMessage + resp, err = getTreeRemote() + if err != nil { + return + } + fullSyncResp := resp.GetContent().GetFullSyncResponse() + + payload := storage.TreeStorageCreatePayload{ + TreeId: id, + RootRawChange: resp.RootChange, + Changes: fullSyncResp.Changes, + Heads: fullSyncResp.Heads, + } + + // basically building tree with inmemory storage and validating that it was without errors + err = tree.ValidateRawTree(payload, deps.AclList) + if err != nil { + return + } + // now we are sure that we can save it to the storage + store, err = deps.SpaceStorage.CreateTreeStorage(payload) + if err != nil { + return + } + } + deps.TreeStorage = store + return BuildSyncTree(ctx, isFirstBuild, deps) +} + func BuildSyncTree( ctx context.Context, isFirstBuild bool, deps BuildDeps) (t tree.ObjectTree, err error) { - t, err = buildObjectTree(deps.Storage, deps.AclList) + t, err = buildObjectTree(deps.TreeStorage, deps.AclList) if err != nil { return } diff --git a/common/commonspace/synctree/synctreehandler.go b/common/commonspace/synctree/synctreehandler.go index 441e71de..22792be3 100644 --- a/common/commonspace/synctree/synctreehandler.go +++ b/common/commonspace/synctree/synctreehandler.go @@ -5,7 +5,9 @@ import ( "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/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" ) type syncTreeHandler struct { @@ -20,15 +22,21 @@ func newSyncTreeHandler(objTree tree.ObjectTree, syncClient SyncClient) synchand } } -func (s *syncTreeHandler) HandleMessage(ctx context.Context, senderId string, msg *spacesyncproto.ObjectSyncMessage) error { - content := msg.GetContent() +func (s *syncTreeHandler) HandleMessage(ctx context.Context, senderId string, msg *spacesyncproto.ObjectSyncMessage) (err error) { + unmarshalled := &treechangeproto.TreeSyncMessage{} + err = proto.Unmarshal(msg.Payload, unmarshalled) + if err != nil { + return + } + + content := unmarshalled.GetContent() switch { - case content.GetFullSyncRequest() != nil: - return s.handleFullSyncRequest(ctx, senderId, content.GetFullSyncRequest(), msg) - case content.GetFullSyncResponse() != nil: - return s.handleFullSyncResponse(ctx, senderId, content.GetFullSyncResponse(), msg) case content.GetHeadUpdate() != nil: - return s.handleHeadUpdate(ctx, senderId, content.GetHeadUpdate(), msg) + return s.handleHeadUpdate(ctx, senderId, content.GetHeadUpdate(), msg.ReplyId) + case content.GetFullSyncRequest() != nil: + return s.handleFullSyncRequest(ctx, senderId, content.GetFullSyncRequest(), msg.ReplyId) + case content.GetFullSyncResponse() != nil: + return s.handleFullSyncResponse(ctx, senderId, content.GetFullSyncResponse()) } return nil } @@ -36,14 +44,14 @@ func (s *syncTreeHandler) HandleMessage(ctx context.Context, senderId string, ms func (s *syncTreeHandler) handleHeadUpdate( ctx context.Context, senderId string, - update *spacesyncproto.ObjectHeadUpdate, - msg *spacesyncproto.ObjectSyncMessage) (err error) { + update *treechangeproto.TreeHeadUpdate, + replyId string) (err error) { log.With("senderId", senderId). With("heads", update.Heads). - With("treeId", msg.TreeId). + With("treeId", s.objTree.ID()). Debug("received head update message") var ( - fullRequest *spacesyncproto.ObjectSyncMessage + fullRequest *treechangeproto.TreeSyncMessage isEmptyUpdate = len(update.Changes) == 0 objTree = s.objTree ) @@ -54,12 +62,12 @@ func (s *syncTreeHandler) handleHeadUpdate( // isEmptyUpdate is sent when the tree is brought up from cache if isEmptyUpdate { - log.With("treeId", msg.TreeId).Debug("is empty update") + 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, msg.TrackingId) + fullRequest, err = s.syncClient.CreateFullSyncRequest(objTree, update.Heads, update.SnapshotPath) return err } @@ -76,20 +84,20 @@ func (s *syncTreeHandler) handleHeadUpdate( return nil } - fullRequest, err = s.syncClient.CreateFullSyncRequest(objTree, update.Heads, update.SnapshotPath, msg.TrackingId) + fullRequest, err = s.syncClient.CreateFullSyncRequest(objTree, update.Heads, update.SnapshotPath) return err }() if fullRequest != nil { log.With("senderId", senderId). With("heads", fullRequest.GetContent().GetFullSyncRequest().Heads). - With("treeId", msg.TreeId). + With("treeId", objTree.ID()). Debug("sending full sync request") - return s.syncClient.SendAsync([]string{senderId}, fullRequest) + return s.syncClient.SendAsync(senderId, fullRequest, replyId) } log.With("senderId", senderId). With("heads", update.Heads). - With("treeId", msg.TreeId). + With("treeId", objTree.ID()). Debug("head update finished correctly") return } @@ -97,21 +105,21 @@ func (s *syncTreeHandler) handleHeadUpdate( func (s *syncTreeHandler) handleFullSyncRequest( ctx context.Context, senderId string, - request *spacesyncproto.ObjectFullSyncRequest, - msg *spacesyncproto.ObjectSyncMessage) (err error) { + request *treechangeproto.TreeFullSyncRequest, + replyId string) (err error) { log.With("senderId", senderId). With("heads", request.Heads). - With("treeId", msg.TreeId). - With("trackingId", msg.TrackingId). + With("treeId", s.objTree.ID()). + With("trackingId", replyId). Debug("received full sync request message") var ( - fullResponse *spacesyncproto.ObjectSyncMessage - header = msg.RootChange + fullResponse *treechangeproto.TreeSyncMessage + header = s.objTree.Header() objTree = s.objTree ) defer func() { if err != nil { - s.syncClient.SendAsync([]string{senderId}, spacesyncproto.WrapError(err, header, msg.TreeId, msg.TrackingId)) + s.syncClient.SendAsync(senderId, treechangeproto.WrapError(err, header), replyId) } }() @@ -130,30 +138,29 @@ func (s *syncTreeHandler) handleFullSyncRequest( } } - fullResponse, err = s.syncClient.CreateFullSyncResponse(objTree, request.Heads, request.SnapshotPath, msg.TrackingId) + fullResponse, err = s.syncClient.CreateFullSyncResponse(objTree, request.Heads, request.SnapshotPath) return err }() if err != nil { return } - return s.syncClient.SendAsync([]string{senderId}, fullResponse) + return s.syncClient.SendAsync(senderId, fullResponse, replyId) } func (s *syncTreeHandler) handleFullSyncResponse( ctx context.Context, senderId string, - response *spacesyncproto.ObjectFullSyncResponse, - msg *spacesyncproto.ObjectSyncMessage) (err error) { + response *treechangeproto.TreeFullSyncResponse) (err error) { log.With("senderId", senderId). With("heads", response.Heads). - With("treeId", msg.TreeId). + 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", msg.TreeId). + With("treeId", s.objTree.ID()). Debug("failed to find the tree in full sync response") return } @@ -170,7 +177,7 @@ func (s *syncTreeHandler) handleFullSyncResponse( }() log.With("error", err != nil). With("heads", response.Heads). - With("treeId", msg.TreeId). + With("treeId", s.objTree.ID()). Debug("finished full sync response") return diff --git a/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go index 205fb8ce..4c1925fd 100644 --- a/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go +++ b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go @@ -271,7 +271,7 @@ func (mr *MockObjectTreeMockRecorder) SnapshotPath() *gomock.Call { // Storage mocks base method. func (m *MockObjectTree) Storage() storage.TreeStorage { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Storage") + ret := m.ctrl.Call(m, "SpaceStorage") ret0, _ := ret[0].(storage.TreeStorage) return ret0 } @@ -279,7 +279,7 @@ func (m *MockObjectTree) Storage() storage.TreeStorage { // Storage indicates an expected call of Storage. func (mr *MockObjectTreeMockRecorder) Storage() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Storage", reflect.TypeOf((*MockObjectTree)(nil).Storage)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SpaceStorage", reflect.TypeOf((*MockObjectTree)(nil).Storage)) } // Unlock mocks base method. diff --git a/common/pkg/acl/treechangeproto/protos/treechange.proto b/common/pkg/acl/treechangeproto/protos/treechange.proto index 8f733a5d..3a55e031 100644 --- a/common/pkg/acl/treechangeproto/protos/treechange.proto +++ b/common/pkg/acl/treechangeproto/protos/treechange.proto @@ -53,3 +53,44 @@ message RawTreeChangeWithId { // Id is a cid made from rawChange payload string id = 2; } + +message TreeSyncMessage { + TreeSyncContentValue content = 1; + RawTreeChangeWithId rootChange = 2; +} + +// TreeSyncContentValue provides different types for tree sync +message TreeSyncContentValue { + oneof value { + TreeHeadUpdate headUpdate = 1; + TreeFullSyncRequest fullSyncRequest = 2; + TreeFullSyncResponse fullSyncResponse = 3; + TreeErrorResponse errorResponse = 4; + } +} + +// TreeHeadUpdate is a message sent on document head update +message TreeHeadUpdate { + repeated string heads = 1; + repeated RawTreeChangeWithId changes = 2; + repeated string snapshotPath = 3; +} + +// TreeHeadUpdate is a message sent when document needs full sync +message TreeFullSyncRequest { + repeated string heads = 1; + repeated RawTreeChangeWithId changes = 2; + repeated string snapshotPath = 3; +} + +// TreeFullSyncResponse is a message sent as a response for a specific full sync +message TreeFullSyncResponse { + repeated string heads = 1; + repeated RawTreeChangeWithId changes = 2; + repeated string snapshotPath = 3; +} + +// TreeErrorResponse is an error sent as a response for a full sync request +message TreeErrorResponse { + string error = 1; +} diff --git a/common/pkg/acl/treechangeproto/treechange.go b/common/pkg/acl/treechangeproto/treechange.go new file mode 100644 index 00000000..9e4f1854 --- /dev/null +++ b/common/pkg/acl/treechangeproto/treechange.go @@ -0,0 +1,37 @@ +package treechangeproto + +func WrapHeadUpdate(update *TreeHeadUpdate, rootChange *RawTreeChangeWithId) *TreeSyncMessage { + return &TreeSyncMessage{ + Content: &TreeSyncContentValue{ + Value: &TreeSyncContentValue_HeadUpdate{HeadUpdate: update}, + }, + RootChange: rootChange, + } +} + +func WrapFullRequest(request *TreeFullSyncRequest, rootChange *RawTreeChangeWithId) *TreeSyncMessage { + return &TreeSyncMessage{ + Content: &TreeSyncContentValue{ + Value: &TreeSyncContentValue_FullSyncRequest{FullSyncRequest: request}, + }, + RootChange: rootChange, + } +} + +func WrapFullResponse(response *TreeFullSyncResponse, rootChange *RawTreeChangeWithId) *TreeSyncMessage { + return &TreeSyncMessage{ + Content: &TreeSyncContentValue{ + Value: &TreeSyncContentValue_FullSyncResponse{FullSyncResponse: response}, + }, + RootChange: rootChange, + } +} + +func WrapError(err error, rootChange *RawTreeChangeWithId) *TreeSyncMessage { + return &TreeSyncMessage{ + Content: &TreeSyncContentValue{ + Value: &TreeSyncContentValue_ErrorResponse{ErrorResponse: &TreeErrorResponse{Error: err.Error()}}, + }, + RootChange: rootChange, + } +} diff --git a/common/pkg/acl/treechangeproto/treechange.pb.go b/common/pkg/acl/treechangeproto/treechange.pb.go index fd4deb8a..0c97164b 100644 --- a/common/pkg/acl/treechangeproto/treechange.pb.go +++ b/common/pkg/acl/treechangeproto/treechange.pb.go @@ -332,11 +332,410 @@ func (m *RawTreeChangeWithId) GetId() string { return "" } +type TreeSyncMessage struct { + Content *TreeSyncContentValue `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` + RootChange *RawTreeChangeWithId `protobuf:"bytes,2,opt,name=rootChange,proto3" json:"rootChange,omitempty"` +} + +func (m *TreeSyncMessage) Reset() { *m = TreeSyncMessage{} } +func (m *TreeSyncMessage) String() string { return proto.CompactTextString(m) } +func (*TreeSyncMessage) ProtoMessage() {} +func (*TreeSyncMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_f177d8514fae978f, []int{4} +} +func (m *TreeSyncMessage) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TreeSyncMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TreeSyncMessage.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 *TreeSyncMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_TreeSyncMessage.Merge(m, src) +} +func (m *TreeSyncMessage) XXX_Size() int { + return m.Size() +} +func (m *TreeSyncMessage) XXX_DiscardUnknown() { + xxx_messageInfo_TreeSyncMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_TreeSyncMessage proto.InternalMessageInfo + +func (m *TreeSyncMessage) GetContent() *TreeSyncContentValue { + if m != nil { + return m.Content + } + return nil +} + +func (m *TreeSyncMessage) GetRootChange() *RawTreeChangeWithId { + if m != nil { + return m.RootChange + } + return nil +} + +// TreeSyncContentValue provides different types for tree sync +type TreeSyncContentValue struct { + // Types that are valid to be assigned to Value: + // + // *TreeSyncContentValue_HeadUpdate + // *TreeSyncContentValue_FullSyncRequest + // *TreeSyncContentValue_FullSyncResponse + // *TreeSyncContentValue_ErrorResponse + Value isTreeSyncContentValue_Value `protobuf_oneof:"value"` +} + +func (m *TreeSyncContentValue) Reset() { *m = TreeSyncContentValue{} } +func (m *TreeSyncContentValue) String() string { return proto.CompactTextString(m) } +func (*TreeSyncContentValue) ProtoMessage() {} +func (*TreeSyncContentValue) Descriptor() ([]byte, []int) { + return fileDescriptor_f177d8514fae978f, []int{5} +} +func (m *TreeSyncContentValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TreeSyncContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TreeSyncContentValue.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 *TreeSyncContentValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_TreeSyncContentValue.Merge(m, src) +} +func (m *TreeSyncContentValue) XXX_Size() int { + return m.Size() +} +func (m *TreeSyncContentValue) XXX_DiscardUnknown() { + xxx_messageInfo_TreeSyncContentValue.DiscardUnknown(m) +} + +var xxx_messageInfo_TreeSyncContentValue proto.InternalMessageInfo + +type isTreeSyncContentValue_Value interface { + isTreeSyncContentValue_Value() + MarshalTo([]byte) (int, error) + Size() int +} + +type TreeSyncContentValue_HeadUpdate struct { + HeadUpdate *TreeHeadUpdate `protobuf:"bytes,1,opt,name=headUpdate,proto3,oneof" json:"headUpdate,omitempty"` +} +type TreeSyncContentValue_FullSyncRequest struct { + FullSyncRequest *TreeFullSyncRequest `protobuf:"bytes,2,opt,name=fullSyncRequest,proto3,oneof" json:"fullSyncRequest,omitempty"` +} +type TreeSyncContentValue_FullSyncResponse struct { + FullSyncResponse *TreeFullSyncResponse `protobuf:"bytes,3,opt,name=fullSyncResponse,proto3,oneof" json:"fullSyncResponse,omitempty"` +} +type TreeSyncContentValue_ErrorResponse struct { + ErrorResponse *TreeErrorResponse `protobuf:"bytes,4,opt,name=errorResponse,proto3,oneof" json:"errorResponse,omitempty"` +} + +func (*TreeSyncContentValue_HeadUpdate) isTreeSyncContentValue_Value() {} +func (*TreeSyncContentValue_FullSyncRequest) isTreeSyncContentValue_Value() {} +func (*TreeSyncContentValue_FullSyncResponse) isTreeSyncContentValue_Value() {} +func (*TreeSyncContentValue_ErrorResponse) isTreeSyncContentValue_Value() {} + +func (m *TreeSyncContentValue) GetValue() isTreeSyncContentValue_Value { + if m != nil { + return m.Value + } + return nil +} + +func (m *TreeSyncContentValue) GetHeadUpdate() *TreeHeadUpdate { + if x, ok := m.GetValue().(*TreeSyncContentValue_HeadUpdate); ok { + return x.HeadUpdate + } + return nil +} + +func (m *TreeSyncContentValue) GetFullSyncRequest() *TreeFullSyncRequest { + if x, ok := m.GetValue().(*TreeSyncContentValue_FullSyncRequest); ok { + return x.FullSyncRequest + } + return nil +} + +func (m *TreeSyncContentValue) GetFullSyncResponse() *TreeFullSyncResponse { + if x, ok := m.GetValue().(*TreeSyncContentValue_FullSyncResponse); ok { + return x.FullSyncResponse + } + return nil +} + +func (m *TreeSyncContentValue) GetErrorResponse() *TreeErrorResponse { + if x, ok := m.GetValue().(*TreeSyncContentValue_ErrorResponse); ok { + return x.ErrorResponse + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*TreeSyncContentValue) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*TreeSyncContentValue_HeadUpdate)(nil), + (*TreeSyncContentValue_FullSyncRequest)(nil), + (*TreeSyncContentValue_FullSyncResponse)(nil), + (*TreeSyncContentValue_ErrorResponse)(nil), + } +} + +// TreeHeadUpdate is a message sent on document head update +type TreeHeadUpdate struct { + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` +} + +func (m *TreeHeadUpdate) Reset() { *m = TreeHeadUpdate{} } +func (m *TreeHeadUpdate) String() string { return proto.CompactTextString(m) } +func (*TreeHeadUpdate) ProtoMessage() {} +func (*TreeHeadUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_f177d8514fae978f, []int{6} +} +func (m *TreeHeadUpdate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TreeHeadUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TreeHeadUpdate.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 *TreeHeadUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_TreeHeadUpdate.Merge(m, src) +} +func (m *TreeHeadUpdate) XXX_Size() int { + return m.Size() +} +func (m *TreeHeadUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_TreeHeadUpdate.DiscardUnknown(m) +} + +var xxx_messageInfo_TreeHeadUpdate proto.InternalMessageInfo + +func (m *TreeHeadUpdate) GetHeads() []string { + if m != nil { + return m.Heads + } + return nil +} + +func (m *TreeHeadUpdate) GetChanges() []*RawTreeChangeWithId { + if m != nil { + return m.Changes + } + return nil +} + +func (m *TreeHeadUpdate) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + +// TreeHeadUpdate is a message sent when document needs full sync +type TreeFullSyncRequest struct { + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` +} + +func (m *TreeFullSyncRequest) Reset() { *m = TreeFullSyncRequest{} } +func (m *TreeFullSyncRequest) String() string { return proto.CompactTextString(m) } +func (*TreeFullSyncRequest) ProtoMessage() {} +func (*TreeFullSyncRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f177d8514fae978f, []int{7} +} +func (m *TreeFullSyncRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TreeFullSyncRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TreeFullSyncRequest.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 *TreeFullSyncRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_TreeFullSyncRequest.Merge(m, src) +} +func (m *TreeFullSyncRequest) XXX_Size() int { + return m.Size() +} +func (m *TreeFullSyncRequest) XXX_DiscardUnknown() { + xxx_messageInfo_TreeFullSyncRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_TreeFullSyncRequest proto.InternalMessageInfo + +func (m *TreeFullSyncRequest) GetHeads() []string { + if m != nil { + return m.Heads + } + return nil +} + +func (m *TreeFullSyncRequest) GetChanges() []*RawTreeChangeWithId { + if m != nil { + return m.Changes + } + return nil +} + +func (m *TreeFullSyncRequest) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + +// TreeFullSyncResponse is a message sent as a response for a specific full sync +type TreeFullSyncResponse struct { + Heads []string `protobuf:"bytes,1,rep,name=heads,proto3" json:"heads,omitempty"` + Changes []*RawTreeChangeWithId `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"` + SnapshotPath []string `protobuf:"bytes,3,rep,name=snapshotPath,proto3" json:"snapshotPath,omitempty"` +} + +func (m *TreeFullSyncResponse) Reset() { *m = TreeFullSyncResponse{} } +func (m *TreeFullSyncResponse) String() string { return proto.CompactTextString(m) } +func (*TreeFullSyncResponse) ProtoMessage() {} +func (*TreeFullSyncResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_f177d8514fae978f, []int{8} +} +func (m *TreeFullSyncResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TreeFullSyncResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TreeFullSyncResponse.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 *TreeFullSyncResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_TreeFullSyncResponse.Merge(m, src) +} +func (m *TreeFullSyncResponse) XXX_Size() int { + return m.Size() +} +func (m *TreeFullSyncResponse) XXX_DiscardUnknown() { + xxx_messageInfo_TreeFullSyncResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_TreeFullSyncResponse proto.InternalMessageInfo + +func (m *TreeFullSyncResponse) GetHeads() []string { + if m != nil { + return m.Heads + } + return nil +} + +func (m *TreeFullSyncResponse) GetChanges() []*RawTreeChangeWithId { + if m != nil { + return m.Changes + } + return nil +} + +func (m *TreeFullSyncResponse) GetSnapshotPath() []string { + if m != nil { + return m.SnapshotPath + } + return nil +} + +// TreeErrorResponse is an error sent as a response for a full sync request +type TreeErrorResponse struct { + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *TreeErrorResponse) Reset() { *m = TreeErrorResponse{} } +func (m *TreeErrorResponse) String() string { return proto.CompactTextString(m) } +func (*TreeErrorResponse) ProtoMessage() {} +func (*TreeErrorResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_f177d8514fae978f, []int{9} +} +func (m *TreeErrorResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TreeErrorResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TreeErrorResponse.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 *TreeErrorResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_TreeErrorResponse.Merge(m, src) +} +func (m *TreeErrorResponse) XXX_Size() int { + return m.Size() +} +func (m *TreeErrorResponse) XXX_DiscardUnknown() { + xxx_messageInfo_TreeErrorResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_TreeErrorResponse proto.InternalMessageInfo + +func (m *TreeErrorResponse) GetError() string { + if m != nil { + return m.Error + } + return "" +} + func init() { proto.RegisterType((*RootChange)(nil), "treechange.RootChange") proto.RegisterType((*TreeChange)(nil), "treechange.TreeChange") proto.RegisterType((*RawTreeChange)(nil), "treechange.RawTreeChange") proto.RegisterType((*RawTreeChangeWithId)(nil), "treechange.RawTreeChangeWithId") + proto.RegisterType((*TreeSyncMessage)(nil), "treechange.TreeSyncMessage") + proto.RegisterType((*TreeSyncContentValue)(nil), "treechange.TreeSyncContentValue") + proto.RegisterType((*TreeHeadUpdate)(nil), "treechange.TreeHeadUpdate") + proto.RegisterType((*TreeFullSyncRequest)(nil), "treechange.TreeFullSyncRequest") + proto.RegisterType((*TreeFullSyncResponse)(nil), "treechange.TreeFullSyncResponse") + proto.RegisterType((*TreeErrorResponse)(nil), "treechange.TreeErrorResponse") } func init() { @@ -344,32 +743,48 @@ func init() { } var fileDescriptor_f177d8514fae978f = []byte{ - // 393 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xcf, 0x0e, 0x93, 0x40, - 0x10, 0x87, 0xbb, 0xb4, 0xf6, 0xcf, 0x88, 0x3d, 0xac, 0x07, 0x37, 0xc6, 0x10, 0xc2, 0xc1, 0x70, - 0x2a, 0x31, 0xbe, 0x41, 0x6b, 0x62, 0x1b, 0x6f, 0x6b, 0x13, 0x13, 0x6f, 0x23, 0x4c, 0xca, 0xc6, - 0x16, 0x08, 0xbb, 0x4d, 0xc3, 0x5b, 0xf8, 0x08, 0x3e, 0x83, 0x4f, 0xe1, 0xb1, 0x47, 0x8f, 0xa6, - 0x7d, 0x11, 0xc3, 0xd2, 0x0a, 0x34, 0x7a, 0x01, 0xe6, 0x9b, 0x30, 0xcc, 0xef, 0x63, 0x21, 0x2a, - 0xbe, 0xee, 0x22, 0x8c, 0xf7, 0x91, 0x29, 0x89, 0xe2, 0x14, 0xb3, 0x1d, 0x15, 0x65, 0x6e, 0xf2, - 0xc8, 0x5e, 0x75, 0x07, 0x2f, 0x2c, 0xe1, 0xd0, 0x92, 0xe0, 0x07, 0x03, 0x90, 0x79, 0x6e, 0x56, - 0xb6, 0xe4, 0xaf, 0x60, 0x86, 0xf1, 0x7e, 0x4d, 0x98, 0x6c, 0x12, 0xc1, 0x7c, 0x16, 0xce, 0x64, - 0x0b, 0xb8, 0x80, 0x89, 0x2e, 0x30, 0xa6, 0x4d, 0x22, 0x1c, 0xdb, 0xbb, 0x97, 0xdc, 0x03, 0x68, - 0x06, 0x6e, 0xab, 0x82, 0xc4, 0xd0, 0x36, 0x3b, 0xa4, 0x9e, 0x6b, 0xd4, 0x81, 0xb4, 0xc1, 0x43, - 0x21, 0x46, 0x3e, 0x0b, 0x87, 0xb2, 0x05, 0x9c, 0xc3, 0x48, 0x13, 0x25, 0xe2, 0x89, 0xcf, 0x42, - 0x57, 0xda, 0x67, 0xfe, 0x12, 0xa6, 0x2a, 0xa1, 0xcc, 0x28, 0x53, 0x89, 0xb1, 0xe5, 0x7f, 0xeb, - 0xe0, 0xbb, 0x03, 0xb0, 0x2d, 0x89, 0x6e, 0x4b, 0xfb, 0xf0, 0xb4, 0x4e, 0xd4, 0x2c, 0xa9, 0x05, - 0xf3, 0x87, 0xe1, 0x4c, 0x76, 0x51, 0x3f, 0x96, 0xf3, 0x18, 0xeb, 0x35, 0xcc, 0x75, 0x86, 0x85, - 0x4e, 0x73, 0xb3, 0x44, 0x5d, 0xa7, 0x6b, 0x02, 0x3c, 0xd0, 0xfa, 0x3b, 0x4d, 0x24, 0xfd, 0x0e, - 0x0d, 0xda, 0x18, 0xae, 0xec, 0x22, 0xbe, 0x00, 0x1e, 0x1f, 0xcb, 0x92, 0x32, 0x23, 0x09, 0x93, - 0x0f, 0x54, 0xad, 0x51, 0xa7, 0x36, 0xd6, 0x48, 0xfe, 0xa3, 0xd3, 0xd7, 0x32, 0x7e, 0xd4, 0xd2, - 0x55, 0x30, 0xe9, 0x2b, 0xa8, 0x85, 0x2b, 0xfd, 0xf1, 0xb6, 0x9f, 0x98, 0xfa, 0x2c, 0x9c, 0xca, - 0x0e, 0x09, 0xde, 0xc3, 0x33, 0x89, 0xa7, 0x8e, 0x24, 0x01, 0x93, 0x02, 0xab, 0x7d, 0x8e, 0xcd, - 0x7f, 0x75, 0xe5, 0xbd, 0xac, 0x97, 0xd0, 0x6a, 0x97, 0xa1, 0x39, 0x96, 0x64, 0xe5, 0xb8, 0xb2, - 0x05, 0xc1, 0x0a, 0x9e, 0xf7, 0x06, 0x7d, 0x52, 0x26, 0xdd, 0xd8, 0x97, 0x4a, 0x3c, 0x35, 0xe8, - 0x36, 0xb0, 0x05, 0x7c, 0x0e, 0x8e, 0xba, 0x8b, 0x76, 0x54, 0xb2, 0x7c, 0xf3, 0xf3, 0xe2, 0xb1, - 0xf3, 0xc5, 0x63, 0xbf, 0x2f, 0x1e, 0xfb, 0x76, 0xf5, 0x06, 0xe7, 0xab, 0x37, 0xf8, 0x75, 0xf5, - 0x06, 0x9f, 0x5f, 0xfc, 0xe7, 0xf0, 0x7e, 0x19, 0xdb, 0xdb, 0xdb, 0x3f, 0x01, 0x00, 0x00, 0xff, - 0xff, 0xa5, 0x78, 0xc6, 0x1e, 0xde, 0x02, 0x00, 0x00, + // 647 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x55, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0xf5, 0x3a, 0x69, 0xd3, 0x4e, 0xd3, 0x16, 0xb6, 0x95, 0xb0, 0x2a, 0x30, 0x96, 0x0f, 0x28, + 0x5c, 0x1a, 0x51, 0x4e, 0x20, 0x24, 0xa4, 0x96, 0x16, 0x57, 0x15, 0x08, 0x6d, 0x0b, 0x48, 0xdc, + 0x16, 0x7b, 0x48, 0x2c, 0x52, 0xdb, 0x78, 0x37, 0x54, 0xf9, 0x00, 0x2e, 0x20, 0x21, 0x3e, 0x81, + 0x6f, 0xe0, 0x0f, 0xb8, 0x71, 0xec, 0x91, 0x23, 0x6a, 0x7e, 0x04, 0xed, 0x3a, 0x4e, 0xd6, 0x6e, + 0x90, 0xb8, 0xf5, 0x92, 0x78, 0xde, 0xce, 0xbc, 0x7d, 0xf3, 0x66, 0xd7, 0x86, 0x6e, 0xf6, 0xbe, + 0xd7, 0xe5, 0xe1, 0xa0, 0x2b, 0x73, 0xc4, 0xb0, 0xcf, 0x93, 0x1e, 0x66, 0x79, 0x2a, 0xd3, 0xae, + 0xfe, 0x15, 0x06, 0xbc, 0xad, 0x11, 0x0a, 0x33, 0xc4, 0xff, 0x41, 0x00, 0x58, 0x9a, 0xca, 0x3d, + 0x1d, 0xd2, 0x9b, 0xb0, 0xcc, 0xc3, 0x41, 0x80, 0x3c, 0x3a, 0x8c, 0x1c, 0xe2, 0x91, 0xce, 0x32, + 0x9b, 0x01, 0xd4, 0x81, 0x96, 0xc8, 0x78, 0x88, 0x87, 0x91, 0x63, 0xeb, 0xb5, 0x32, 0xa4, 0x2e, + 0x40, 0x41, 0x78, 0x32, 0xca, 0xd0, 0x69, 0xe8, 0x45, 0x03, 0x51, 0xbc, 0x32, 0x3e, 0x45, 0x21, + 0xf9, 0x69, 0xe6, 0x34, 0x3d, 0xd2, 0x69, 0xb0, 0x19, 0x40, 0x29, 0x34, 0x05, 0x62, 0xe4, 0x2c, + 0x78, 0xa4, 0xd3, 0x66, 0xfa, 0x99, 0x6e, 0xc1, 0x52, 0x1c, 0x61, 0x22, 0x63, 0x39, 0x72, 0x16, + 0x35, 0x3e, 0x8d, 0xfd, 0xef, 0x36, 0xc0, 0x49, 0x8e, 0x38, 0x11, 0xed, 0xc1, 0x8a, 0xea, 0xa8, + 0x10, 0x29, 0x1c, 0xe2, 0x35, 0x3a, 0xcb, 0xcc, 0x84, 0xaa, 0x6d, 0xd9, 0xf5, 0xb6, 0xee, 0xc0, + 0x9a, 0x48, 0x78, 0x26, 0xfa, 0xa9, 0xdc, 0xe5, 0x42, 0x75, 0x57, 0x34, 0x50, 0x43, 0xd5, 0x3e, + 0x45, 0x4b, 0xe2, 0x09, 0x97, 0x5c, 0xb7, 0xd1, 0x66, 0x26, 0x44, 0xb7, 0x81, 0x86, 0xc3, 0x3c, + 0xc7, 0x44, 0x32, 0xe4, 0xd1, 0x11, 0x8e, 0x02, 0x2e, 0xfa, 0xba, 0xad, 0x26, 0x9b, 0xb3, 0x52, + 0xb5, 0x65, 0xb1, 0x6e, 0x8b, 0x69, 0x41, 0xab, 0x6a, 0x81, 0x32, 0x3c, 0x16, 0xc7, 0x13, 0x7d, + 0xce, 0x92, 0x47, 0x3a, 0x4b, 0xcc, 0x40, 0xfc, 0xa7, 0xb0, 0xca, 0xf8, 0x99, 0x61, 0x92, 0x03, + 0xad, 0x8c, 0x8f, 0x06, 0x29, 0x2f, 0xe6, 0xda, 0x66, 0x65, 0xa8, 0x44, 0x88, 0xb8, 0x97, 0x70, + 0x39, 0xcc, 0x51, 0x9b, 0xd3, 0x66, 0x33, 0xc0, 0xdf, 0x83, 0x8d, 0x0a, 0xd1, 0xeb, 0x58, 0xf6, + 0x0f, 0x75, 0x51, 0xce, 0xcf, 0x0a, 0x68, 0x42, 0x38, 0x03, 0xe8, 0x1a, 0xd8, 0x71, 0x69, 0xb4, + 0x1d, 0x47, 0xfe, 0x57, 0x02, 0xeb, 0x8a, 0xe2, 0x78, 0x94, 0x84, 0xcf, 0x50, 0x08, 0xde, 0x43, + 0xfa, 0x10, 0x5a, 0x61, 0x9a, 0x48, 0x4c, 0xa4, 0xae, 0x5f, 0xd9, 0xf1, 0xb6, 0x8d, 0x93, 0x5a, + 0x66, 0xef, 0x15, 0x29, 0xaf, 0xf8, 0x60, 0x88, 0xac, 0x2c, 0xa0, 0x8f, 0x01, 0xf2, 0xe9, 0xa1, + 0xd5, 0xfb, 0xac, 0xec, 0xdc, 0x36, 0xcb, 0xe7, 0x48, 0x66, 0x46, 0x89, 0xff, 0xd3, 0x86, 0xcd, + 0x79, 0x5b, 0xd0, 0x47, 0x00, 0x7d, 0xe4, 0xd1, 0xcb, 0x2c, 0xe2, 0x12, 0x27, 0xc2, 0xb6, 0xea, + 0xc2, 0x82, 0x69, 0x46, 0x60, 0x31, 0x23, 0x9f, 0x1e, 0xc1, 0xfa, 0xbb, 0xe1, 0x60, 0xa0, 0x58, + 0x19, 0x7e, 0x18, 0xa2, 0x90, 0xf3, 0xc4, 0x29, 0x8a, 0x83, 0x6a, 0x5a, 0x60, 0xb1, 0x7a, 0x25, + 0x7d, 0x0e, 0xd7, 0x66, 0x90, 0xc8, 0xd2, 0x44, 0x14, 0x37, 0x6b, 0x8e, 0x53, 0x07, 0xb5, 0xbc, + 0xc0, 0x62, 0x97, 0x6a, 0xe9, 0x3e, 0xac, 0x62, 0x9e, 0xa7, 0xf9, 0x94, 0xac, 0xa9, 0xc9, 0x6e, + 0xd5, 0xc9, 0xf6, 0xcd, 0xa4, 0xc0, 0x62, 0xd5, 0xaa, 0xdd, 0x16, 0x2c, 0x7c, 0x54, 0x56, 0xf9, + 0x9f, 0x08, 0xac, 0x55, 0xdd, 0xa0, 0x9b, 0xb0, 0xa0, 0xdc, 0x28, 0xef, 0x60, 0x11, 0xd0, 0x07, + 0xd0, 0x9a, 0x5c, 0x12, 0xc7, 0xf6, 0x1a, 0xff, 0x33, 0xaa, 0x32, 0x9f, 0xfa, 0xd0, 0x2e, 0x2f, + 0xe1, 0x0b, 0x2e, 0xfb, 0x4e, 0x43, 0xf3, 0x56, 0x30, 0xff, 0x33, 0x81, 0x8d, 0x39, 0x96, 0x5e, + 0x8d, 0x98, 0x2f, 0xa4, 0x38, 0x58, 0xf5, 0x89, 0x5c, 0x8d, 0x9a, 0xbb, 0x70, 0xfd, 0xd2, 0x44, + 0x95, 0x12, 0x3d, 0xd1, 0xc9, 0xfb, 0xbd, 0x08, 0x76, 0xef, 0xfd, 0xba, 0x70, 0xc9, 0xf9, 0x85, + 0x4b, 0xfe, 0x5c, 0xb8, 0xe4, 0xdb, 0xd8, 0xb5, 0xce, 0xc7, 0xae, 0xf5, 0x7b, 0xec, 0x5a, 0x6f, + 0x6e, 0xfc, 0xe3, 0xfb, 0xf2, 0x76, 0x51, 0xff, 0xdd, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xca, + 0xe3, 0xc1, 0xeb, 0x81, 0x06, 0x00, 0x00, } func (m *RootChange) Marshal() (dAtA []byte, err error) { @@ -589,6 +1004,364 @@ func (m *RawTreeChangeWithId) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *TreeSyncMessage) 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 *TreeSyncMessage) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeSyncMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.RootChange != nil { + { + size, err := m.RootChange.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTreechange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Content != nil { + { + size, err := m.Content.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTreechange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TreeSyncContentValue) 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 *TreeSyncContentValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeSyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Value != nil { + { + size := m.Value.Size() + i -= size + if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *TreeSyncContentValue_HeadUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeSyncContentValue_HeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.HeadUpdate != nil { + { + size, err := m.HeadUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTreechange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *TreeSyncContentValue_FullSyncRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeSyncContentValue_FullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.FullSyncRequest != nil { + { + size, err := m.FullSyncRequest.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTreechange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *TreeSyncContentValue_FullSyncResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeSyncContentValue_FullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.FullSyncResponse != nil { + { + size, err := m.FullSyncResponse.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTreechange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *TreeSyncContentValue_ErrorResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeSyncContentValue_ErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ErrorResponse != nil { + { + size, err := m.ErrorResponse.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTreechange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} +func (m *TreeHeadUpdate) 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 *TreeHeadUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeHeadUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTreechange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.Heads[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *TreeFullSyncRequest) 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 *TreeFullSyncRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeFullSyncRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTreechange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.Heads[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *TreeFullSyncResponse) 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 *TreeFullSyncResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeFullSyncResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SnapshotPath) > 0 { + for iNdEx := len(m.SnapshotPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.SnapshotPath[iNdEx]) + copy(dAtA[i:], m.SnapshotPath[iNdEx]) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.SnapshotPath[iNdEx]))) + i-- + dAtA[i] = 0x1a + } + } + if len(m.Changes) > 0 { + for iNdEx := len(m.Changes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Changes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTreechange(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Heads) > 0 { + for iNdEx := len(m.Heads) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Heads[iNdEx]) + copy(dAtA[i:], m.Heads[iNdEx]) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.Heads[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *TreeErrorResponse) 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 *TreeErrorResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TreeErrorResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintTreechange(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintTreechange(dAtA []byte, offset int, v uint64) int { offset -= sovTreechange(v) base := offset @@ -706,6 +1479,177 @@ func (m *RawTreeChangeWithId) Size() (n int) { return n } +func (m *TreeSyncMessage) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Content != nil { + l = m.Content.Size() + n += 1 + l + sovTreechange(uint64(l)) + } + if m.RootChange != nil { + l = m.RootChange.Size() + n += 1 + l + sovTreechange(uint64(l)) + } + return n +} + +func (m *TreeSyncContentValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != nil { + n += m.Value.Size() + } + return n +} + +func (m *TreeSyncContentValue_HeadUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.HeadUpdate != nil { + l = m.HeadUpdate.Size() + n += 1 + l + sovTreechange(uint64(l)) + } + return n +} +func (m *TreeSyncContentValue_FullSyncRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.FullSyncRequest != nil { + l = m.FullSyncRequest.Size() + n += 1 + l + sovTreechange(uint64(l)) + } + return n +} +func (m *TreeSyncContentValue_FullSyncResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.FullSyncResponse != nil { + l = m.FullSyncResponse.Size() + n += 1 + l + sovTreechange(uint64(l)) + } + return n +} +func (m *TreeSyncContentValue_ErrorResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ErrorResponse != nil { + l = m.ErrorResponse.Size() + n += 1 + l + sovTreechange(uint64(l)) + } + return n +} +func (m *TreeHeadUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, s := range m.Heads { + l = len(s) + n += 1 + l + sovTreechange(uint64(l)) + } + } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovTreechange(uint64(l)) + } + } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovTreechange(uint64(l)) + } + } + return n +} + +func (m *TreeFullSyncRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, s := range m.Heads { + l = len(s) + n += 1 + l + sovTreechange(uint64(l)) + } + } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovTreechange(uint64(l)) + } + } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovTreechange(uint64(l)) + } + } + return n +} + +func (m *TreeFullSyncResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Heads) > 0 { + for _, s := range m.Heads { + l = len(s) + n += 1 + l + sovTreechange(uint64(l)) + } + } + if len(m.Changes) > 0 { + for _, e := range m.Changes { + l = e.Size() + n += 1 + l + sovTreechange(uint64(l)) + } + } + if len(m.SnapshotPath) > 0 { + for _, s := range m.SnapshotPath { + l = len(s) + n += 1 + l + sovTreechange(uint64(l)) + } + } + return n +} + +func (m *TreeErrorResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Error) + if l > 0 { + n += 1 + l + sovTreechange(uint64(l)) + } + return n +} + func sovTreechange(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1451,6 +2395,844 @@ func (m *RawTreeChangeWithId) Unmarshal(dAtA []byte) error { } return nil } +func (m *TreeSyncMessage) 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 ErrIntOverflowTreechange + } + 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: TreeSyncMessage: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TreeSyncMessage: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Content", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Content == nil { + m.Content = &TreeSyncContentValue{} + } + if err := m.Content.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RootChange", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RootChange == nil { + m.RootChange = &RawTreeChangeWithId{} + } + if err := m.RootChange.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTreechange(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTreechange + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TreeSyncContentValue) 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 ErrIntOverflowTreechange + } + 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: TreeSyncContentValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TreeSyncContentValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HeadUpdate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &TreeHeadUpdate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &TreeSyncContentValue_HeadUpdate{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FullSyncRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &TreeFullSyncRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &TreeSyncContentValue_FullSyncRequest{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FullSyncResponse", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &TreeFullSyncResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &TreeSyncContentValue_FullSyncResponse{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ErrorResponse", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &TreeErrorResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &TreeSyncContentValue_ErrorResponse{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTreechange(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTreechange + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TreeHeadUpdate) 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 ErrIntOverflowTreechange + } + 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: TreeHeadUpdate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TreeHeadUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &RawTreeChangeWithId{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTreechange(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTreechange + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TreeFullSyncRequest) 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 ErrIntOverflowTreechange + } + 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: TreeFullSyncRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TreeFullSyncRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &RawTreeChangeWithId{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTreechange(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTreechange + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TreeFullSyncResponse) 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 ErrIntOverflowTreechange + } + 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: TreeFullSyncResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TreeFullSyncResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heads", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Heads = append(m.Heads, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Changes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTreechange + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Changes = append(m.Changes, &RawTreeChangeWithId{}) + if err := m.Changes[len(m.Changes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SnapshotPath = append(m.SnapshotPath, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTreechange(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTreechange + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TreeErrorResponse) 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 ErrIntOverflowTreechange + } + 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: TreeErrorResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TreeErrorResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTreechange + } + 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 ErrInvalidLengthTreechange + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTreechange + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTreechange(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTreechange + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTreechange(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From 09f28cf829ef6e173b8a9b24f18cebd9cc6c6757 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sat, 22 Oct 2022 16:19:47 +0200 Subject: [PATCH 185/219] Refactor synctree --- common/commonspace/synctree/synctree.go | 61 ++++++++++---------- common/commonspace/synctree/synctree_test.go | 2 +- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index c8221024..abd4fc6f 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -132,45 +132,42 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t return } - store, err := deps.SpaceStorage.TreeStorage(id) + deps.TreeStorage, err = deps.SpaceStorage.TreeStorage(id) + if err == nil { + return buildSyncTree(ctx, false, deps) + } + if err != nil && err != storage.ErrUnknownTreeId { return } - isFirstBuild := false - if err == storage.ErrUnknownTreeId { - isFirstBuild = true - - var resp *treechangeproto.TreeSyncMessage - resp, err = getTreeRemote() - if err != nil { - return - } - fullSyncResp := resp.GetContent().GetFullSyncResponse() - - payload := storage.TreeStorageCreatePayload{ - TreeId: id, - RootRawChange: resp.RootChange, - Changes: fullSyncResp.Changes, - Heads: fullSyncResp.Heads, - } - - // basically building tree with inmemory storage and validating that it was without errors - err = tree.ValidateRawTree(payload, deps.AclList) - if err != nil { - return - } - // now we are sure that we can save it to the storage - store, err = deps.SpaceStorage.CreateTreeStorage(payload) - if err != nil { - return - } + resp, err := getTreeRemote() + if err != nil { + return } - deps.TreeStorage = store - return BuildSyncTree(ctx, isFirstBuild, deps) + fullSyncResp := resp.GetContent().GetFullSyncResponse() + + payload := storage.TreeStorageCreatePayload{ + TreeId: id, + RootRawChange: resp.RootChange, + Changes: fullSyncResp.Changes, + Heads: fullSyncResp.Heads, + } + + // basically building tree with in-memory storage and validating that it was without errors + err = tree.ValidateRawTree(payload, deps.AclList) + if err != nil { + return + } + // now we are sure that we can save it to the storage + deps.TreeStorage, err = deps.SpaceStorage.CreateTreeStorage(payload) + if err != nil { + return + } + return buildSyncTree(ctx, true, deps) } -func BuildSyncTree( +func buildSyncTree( ctx context.Context, isFirstBuild bool, deps BuildDeps) (t tree.ObjectTree, err error) { diff --git a/common/commonspace/synctree/synctree_test.go b/common/commonspace/synctree/synctree_test.go index 8d62f9b0..bcb1749a 100644 --- a/common/commonspace/synctree/synctree_test.go +++ b/common/commonspace/synctree/synctree_test.go @@ -103,7 +103,7 @@ func Test_BuildSyncTree(t *testing.T) { syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().BroadcastAsyncOrSendResponsible(gomock.Eq(headUpdate)).Return(nil) - tr, err := BuildSyncTree(ctx, syncClientMock, storageMock, updateListenerMock, aclListMock, false) + tr, err := buildSyncTree(ctx, syncClientMock, storageMock, updateListenerMock, aclListMock, false) require.NoError(t, err) t.Run("AddRawChanges update", func(t *testing.T) { From bf7a8b0854bb671c4493ac8929c1e1e2dc77e85b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 23 Oct 2022 18:19:15 +0200 Subject: [PATCH 186/219] Test sync tree --- common/commonspace/rpchandler.go | 2 +- common/commonspace/syncservice/syncservice.go | 1 - .../mock_synctree/mock_synctree.go} | 122 ++++-------------- common/commonspace/synctree/requestfactory.go | 4 +- common/commonspace/synctree/syncclient.go | 1 + common/commonspace/synctree/synctree.go | 21 ++- common/commonspace/synctree/synctree_test.go | 86 ++++++------ .../tree/mock_objecttree/mock_objecttree.go | 4 +- 8 files changed, 86 insertions(+), 155 deletions(-) rename common/commonspace/{syncservice/mock_syncservice/mock_syncservice.go => synctree/mock_synctree/mock_synctree.go} (52%) diff --git a/common/commonspace/rpchandler.go b/common/commonspace/rpchandler.go index 73698856..dbc5b7aa 100644 --- a/common/commonspace/rpchandler.go +++ b/common/commonspace/rpchandler.go @@ -19,5 +19,5 @@ func (r *rpcHandler) HeadSync(ctx context.Context, req *spacesyncproto.HeadSyncR } func (r *rpcHandler) Stream(stream spacesyncproto.DRPCSpace_StreamStream) (err error) { - return r.s.SyncService().SyncClient().AddAndReadStreamSync(stream) + return r.s.SyncService().StreamPool().AddAndReadStreamSync(stream) } diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 24eb3054..38de40f8 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -1,4 +1,3 @@ -//go:generate mockgen -destination mock_syncservice/mock_syncservice.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice SyncClient package syncservice import ( diff --git a/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go b/common/commonspace/synctree/mock_synctree/mock_synctree.go similarity index 52% rename from common/commonspace/syncservice/mock_syncservice/mock_syncservice.go rename to common/commonspace/synctree/mock_synctree/mock_synctree.go index de665c88..61cf4401 100644 --- a/common/commonspace/syncservice/mock_syncservice/mock_syncservice.go +++ b/common/commonspace/synctree/mock_synctree/mock_synctree.go @@ -1,14 +1,13 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice (interfaces: SyncClient) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree (interfaces: SyncClient) -// Package mock_syncservice is a generated GoMock package. -package mock_syncservice +// Package mock_synctree is a generated GoMock package. +package mock_synctree import ( reflect "reflect" time "time" - spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" gomock "github.com/golang/mock/gomock" @@ -37,34 +36,8 @@ func (m *MockSyncClient) EXPECT() *MockSyncClientMockRecorder { return m.recorder } -// AddAndReadStreamAsync mocks base method. -func (m *MockSyncClient) AddAndReadStreamAsync(arg0 spacesyncproto.DRPCSpace_StreamStream) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AddAndReadStreamAsync", arg0) -} - -// AddAndReadStreamAsync indicates an expected call of AddAndReadStreamAsync. -func (mr *MockSyncClientMockRecorder) AddAndReadStreamAsync(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddAndReadStreamAsync", reflect.TypeOf((*MockSyncClient)(nil).AddAndReadStreamAsync), arg0) -} - -// AddAndReadStreamSync mocks base method. -func (m *MockSyncClient) AddAndReadStreamSync(arg0 spacesyncproto.DRPCSpace_StreamStream) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AddAndReadStreamSync", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// AddAndReadStreamSync indicates an expected call of AddAndReadStreamSync. -func (mr *MockSyncClientMockRecorder) AddAndReadStreamSync(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddAndReadStreamSync", reflect.TypeOf((*MockSyncClient)(nil).AddAndReadStreamSync), arg0) -} - // BroadcastAsync mocks base method. -func (m *MockSyncClient) BroadcastAsync(arg0 *spacesyncproto.ObjectSyncMessage) error { +func (m *MockSyncClient) BroadcastAsync(arg0 *treechangeproto.TreeSyncMessage) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BroadcastAsync", arg0) ret0, _ := ret[0].(error) @@ -78,7 +51,7 @@ func (mr *MockSyncClientMockRecorder) BroadcastAsync(arg0 interface{}) *gomock.C } // BroadcastAsyncOrSendResponsible mocks base method. -func (m *MockSyncClient) BroadcastAsyncOrSendResponsible(arg0 *spacesyncproto.ObjectSyncMessage) error { +func (m *MockSyncClient) BroadcastAsyncOrSendResponsible(arg0 *treechangeproto.TreeSyncMessage) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BroadcastAsyncOrSendResponsible", arg0) ret0, _ := ret[0].(error) @@ -91,55 +64,41 @@ func (mr *MockSyncClientMockRecorder) BroadcastAsyncOrSendResponsible(arg0 inter return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BroadcastAsyncOrSendResponsible", reflect.TypeOf((*MockSyncClient)(nil).BroadcastAsyncOrSendResponsible), arg0) } -// Close mocks base method. -func (m *MockSyncClient) Close() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Close") - ret0, _ := ret[0].(error) - return ret0 -} - -// Close indicates an expected call of Close. -func (mr *MockSyncClientMockRecorder) Close() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockSyncClient)(nil).Close)) -} - // CreateFullSyncRequest mocks base method. -func (m *MockSyncClient) CreateFullSyncRequest(arg0 tree.ObjectTree, arg1, arg2 []string, arg3 string) (*spacesyncproto.ObjectSyncMessage, error) { +func (m *MockSyncClient) CreateFullSyncRequest(arg0 tree.ObjectTree, arg1, arg2 []string) (*treechangeproto.TreeSyncMessage, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateFullSyncRequest", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage) + ret := m.ctrl.Call(m, "CreateFullSyncRequest", arg0, arg1, arg2) + ret0, _ := ret[0].(*treechangeproto.TreeSyncMessage) ret1, _ := ret[1].(error) return ret0, ret1 } // CreateFullSyncRequest indicates an expected call of CreateFullSyncRequest. -func (mr *MockSyncClientMockRecorder) CreateFullSyncRequest(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { +func (mr *MockSyncClientMockRecorder) CreateFullSyncRequest(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateFullSyncRequest", reflect.TypeOf((*MockSyncClient)(nil).CreateFullSyncRequest), arg0, arg1, arg2, arg3) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateFullSyncRequest", reflect.TypeOf((*MockSyncClient)(nil).CreateFullSyncRequest), arg0, arg1, arg2) } // CreateFullSyncResponse mocks base method. -func (m *MockSyncClient) CreateFullSyncResponse(arg0 tree.ObjectTree, arg1, arg2 []string, arg3 string) (*spacesyncproto.ObjectSyncMessage, error) { +func (m *MockSyncClient) CreateFullSyncResponse(arg0 tree.ObjectTree, arg1, arg2 []string) (*treechangeproto.TreeSyncMessage, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateFullSyncResponse", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage) + ret := m.ctrl.Call(m, "CreateFullSyncResponse", arg0, arg1, arg2) + ret0, _ := ret[0].(*treechangeproto.TreeSyncMessage) ret1, _ := ret[1].(error) return ret0, ret1 } // CreateFullSyncResponse indicates an expected call of CreateFullSyncResponse. -func (mr *MockSyncClientMockRecorder) CreateFullSyncResponse(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { +func (mr *MockSyncClientMockRecorder) CreateFullSyncResponse(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateFullSyncResponse", reflect.TypeOf((*MockSyncClient)(nil).CreateFullSyncResponse), arg0, arg1, arg2, arg3) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateFullSyncResponse", reflect.TypeOf((*MockSyncClient)(nil).CreateFullSyncResponse), arg0, arg1, arg2) } // CreateHeadUpdate mocks base method. -func (m *MockSyncClient) CreateHeadUpdate(arg0 tree.ObjectTree, arg1 []*treechangeproto.RawTreeChangeWithId) *spacesyncproto.ObjectSyncMessage { +func (m *MockSyncClient) CreateHeadUpdate(arg0 tree.ObjectTree, arg1 []*treechangeproto.RawTreeChangeWithId) *treechangeproto.TreeSyncMessage { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateHeadUpdate", arg0, arg1) - ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage) + ret0, _ := ret[0].(*treechangeproto.TreeSyncMessage) return ret0 } @@ -150,31 +109,17 @@ func (mr *MockSyncClientMockRecorder) CreateHeadUpdate(arg0, arg1 interface{}) * } // CreateNewTreeRequest mocks base method. -func (m *MockSyncClient) CreateNewTreeRequest(arg0 string) *spacesyncproto.ObjectSyncMessage { +func (m *MockSyncClient) CreateNewTreeRequest() *treechangeproto.TreeSyncMessage { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateNewTreeRequest", arg0) - ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage) + ret := m.ctrl.Call(m, "CreateNewTreeRequest") + ret0, _ := ret[0].(*treechangeproto.TreeSyncMessage) return ret0 } // CreateNewTreeRequest indicates an expected call of CreateNewTreeRequest. -func (mr *MockSyncClientMockRecorder) CreateNewTreeRequest(arg0 interface{}) *gomock.Call { +func (mr *MockSyncClientMockRecorder) CreateNewTreeRequest() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateNewTreeRequest", reflect.TypeOf((*MockSyncClient)(nil).CreateNewTreeRequest), arg0) -} - -// HasActiveStream mocks base method. -func (m *MockSyncClient) HasActiveStream(arg0 string) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HasActiveStream", arg0) - ret0, _ := ret[0].(bool) - return ret0 -} - -// HasActiveStream indicates an expected call of HasActiveStream. -func (mr *MockSyncClientMockRecorder) HasActiveStream(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasActiveStream", reflect.TypeOf((*MockSyncClient)(nil).HasActiveStream), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateNewTreeRequest", reflect.TypeOf((*MockSyncClient)(nil).CreateNewTreeRequest)) } // LastUsage mocks base method. @@ -192,30 +137,15 @@ func (mr *MockSyncClientMockRecorder) LastUsage() *gomock.Call { } // SendAsync mocks base method. -func (m *MockSyncClient) SendAsync(arg0 []string, arg1 *spacesyncproto.ObjectSyncMessage) error { +func (m *MockSyncClient) SendAsync(arg0 string, arg1 *treechangeproto.TreeSyncMessage, arg2 string) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SendAsync", arg0, arg1) + ret := m.ctrl.Call(m, "SendAsync", arg0, arg1, arg2) ret0, _ := ret[0].(error) return ret0 } // SendAsync indicates an expected call of SendAsync. -func (mr *MockSyncClientMockRecorder) SendAsync(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockSyncClientMockRecorder) SendAsync(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendAsync", reflect.TypeOf((*MockSyncClient)(nil).SendAsync), arg0, arg1) -} - -// SendSync mocks base method. -func (m *MockSyncClient) SendSync(arg0 string, arg1 *spacesyncproto.ObjectSyncMessage) (*spacesyncproto.ObjectSyncMessage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SendSync", arg0, arg1) - ret0, _ := ret[0].(*spacesyncproto.ObjectSyncMessage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// SendSync indicates an expected call of SendSync. -func (mr *MockSyncClientMockRecorder) SendSync(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendSync", reflect.TypeOf((*MockSyncClient)(nil).SendSync), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendAsync", reflect.TypeOf((*MockSyncClient)(nil).SendAsync), arg0, arg1, arg2) } diff --git a/common/commonspace/synctree/requestfactory.go b/common/commonspace/synctree/requestfactory.go index 8e05267a..b66a2689 100644 --- a/common/commonspace/synctree/requestfactory.go +++ b/common/commonspace/synctree/requestfactory.go @@ -14,10 +14,10 @@ type RequestFactory interface { CreateFullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string) (*treechangeproto.TreeSyncMessage, error) } -var factory = &requestFactory{} +var sharedFactory = &requestFactory{} func GetRequestFactory() RequestFactory { - return factory + return sharedFactory } type requestFactory struct{} diff --git a/common/commonspace/synctree/syncclient.go b/common/commonspace/synctree/syncclient.go index 15631c93..61bba80b 100644 --- a/common/commonspace/synctree/syncclient.go +++ b/common/commonspace/synctree/syncclient.go @@ -1,3 +1,4 @@ +//go:generate mockgen -destination mock_synctree/mock_synctree.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree SyncClient package synctree import ( diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index abd4fc6f..863c3998 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -33,6 +33,7 @@ var log = logger.NewNamed("commonspace.synctree").Sugar() var createDerivedObjectTree = tree.CreateDerivedObjectTree var createObjectTree = tree.CreateObjectTree var buildObjectTree = tree.BuildObjectTree +var createSyncClient = newSyncClient type CreateDeps struct { SpaceId string @@ -63,11 +64,11 @@ func DeriveSyncTree( if err != nil { return } - syncClient := newSyncClient( + syncClient := createSyncClient( deps.SpaceId, deps.StreamPool, deps.HeadNotifiable, - GetRequestFactory(), + sharedFactory, deps.Configuration) syncTree := &SyncTree{ ObjectTree: t, @@ -90,7 +91,7 @@ func CreateSyncTree( if err != nil { return } - syncClient := newSyncClient( + syncClient := createSyncClient( deps.SpaceId, deps.StreamPool, deps.HeadNotifiable, @@ -176,7 +177,7 @@ func buildSyncTree( if err != nil { return } - syncClient := newSyncClient( + syncClient := createSyncClient( deps.SpaceId, deps.StreamPool, deps.HeadNotifiable, @@ -236,10 +237,10 @@ func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*treechangeprot s.listener.Rebuild(s) } } - if res.Mode != tree.Nothing { - headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added) - err = s.syncClient.BroadcastAsync(headUpdate) - } + //if res.Mode != tree.Nothing { + headUpdate := s.syncClient.CreateHeadUpdate(s, res.Added) + err = s.syncClient.BroadcastAsync(headUpdate) + //} return } @@ -255,7 +256,3 @@ func (s *SyncTree) Close() (err error) { s.isClosed = true return } - -func (s *SyncTree) Tree() tree.ObjectTree { - return s -} diff --git a/common/commonspace/synctree/synctree_test.go b/common/commonspace/synctree/synctree_test.go index bcb1749a..95a3436a 100644 --- a/common/commonspace/synctree/synctree_test.go +++ b/common/commonspace/synctree/synctree_test.go @@ -2,15 +2,16 @@ package synctree import ( "context" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/mock_syncservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/diffservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener/mock_updatelistener" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list/mock_list" storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage/mock_storage" - tree2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree/mock_objecttree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/golang/mock/gomock" @@ -19,7 +20,7 @@ import ( ) type syncTreeMatcher struct { - objTree tree2.ObjectTree + objTree tree.ObjectTree client SyncClient listener updatelistener.UpdateListener } @@ -42,21 +43,25 @@ func Test_DeriveSyncTree(t *testing.T) { defer ctrl.Finish() updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl) - syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) + syncClientMock := mock_synctree.NewMockSyncClient(ctrl) aclListMock := mock_list.NewMockACLList(ctrl) - createStorage := storage2.TreeStorageCreatorFunc(func(payload storage2.TreeStorageCreatePayload) (storage2.TreeStorage, error) { - return nil, nil - }) objTreeMock := mock_tree.NewMockObjectTree(ctrl) - createDerivedObjectTree = func(payload tree2.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree2.ObjectTree, err error) { + spaceId := "spaceId" + expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId} + createDerivedObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { require.Equal(t, l, aclListMock) + require.Equal(t, expectedPayload, payload) return objTreeMock, nil } - headUpdate := &spacesyncproto.ObjectSyncMessage{} + createSyncClient = func(spaceId string, pool syncservice.StreamPool, notifiable diffservice.HeadNotifiable, factory RequestFactory, configuration nodeconf.Configuration) SyncClient { + return syncClientMock + } + headUpdate := &treechangeproto.TreeSyncMessage{} syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) + deps := CreateDeps{AclList: aclListMock, SpaceId: spaceId, Payload: expectedPayload, Listener: updateListenerMock} - _, err := DeriveSyncTree(ctx, tree2.ObjectTreeCreatePayload{}, syncClientMock, updateListenerMock, aclListMock, createStorage) + _, err := DeriveSyncTree(ctx, deps) require.NoError(t, err) } @@ -66,21 +71,25 @@ func Test_CreateSyncTree(t *testing.T) { defer ctrl.Finish() updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl) - syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) + syncClientMock := mock_synctree.NewMockSyncClient(ctrl) aclListMock := mock_list.NewMockACLList(ctrl) - createStorage := storage2.TreeStorageCreatorFunc(func(payload storage2.TreeStorageCreatePayload) (storage2.TreeStorage, error) { - return nil, nil - }) objTreeMock := mock_tree.NewMockObjectTree(ctrl) - createObjectTree = func(payload tree2.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree2.ObjectTree, err error) { + spaceId := "spaceId" + expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId} + createObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { require.Equal(t, l, aclListMock) + require.Equal(t, expectedPayload, payload) return objTreeMock, nil } - headUpdate := &spacesyncproto.ObjectSyncMessage{} + createSyncClient = func(spaceId string, pool syncservice.StreamPool, notifiable diffservice.HeadNotifiable, factory RequestFactory, configuration nodeconf.Configuration) SyncClient { + return syncClientMock + } + headUpdate := &treechangeproto.TreeSyncMessage{} syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) + deps := CreateDeps{AclList: aclListMock, SpaceId: spaceId, Payload: expectedPayload, Listener: updateListenerMock} - _, err := CreateSyncTree(ctx, tree2.ObjectTreeCreatePayload{}, syncClientMock, updateListenerMock, aclListMock, createStorage) + _, err := CreateSyncTree(ctx, deps) require.NoError(t, err) } @@ -90,27 +99,22 @@ func Test_BuildSyncTree(t *testing.T) { defer ctrl.Finish() updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl) - syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) - aclListMock := mock_list.NewMockACLList(ctrl) - storageMock := mock_storage.NewMockTreeStorage(ctrl) + syncClientMock := mock_synctree.NewMockSyncClient(ctrl) objTreeMock := mock_tree.NewMockObjectTree(ctrl) - buildObjectTree = func(store storage2.TreeStorage, l list.ACLList) (objTree tree2.ObjectTree, err error) { - require.Equal(t, aclListMock, l) - require.Equal(t, store, storageMock) - return objTreeMock, nil + tr := &SyncTree{ + ObjectTree: objTreeMock, + SyncHandler: nil, + syncClient: syncClientMock, + listener: updateListenerMock, + isClosed: false, } - headUpdate := &spacesyncproto.ObjectSyncMessage{} - syncClientMock.EXPECT().CreateHeadUpdate(syncTreeMatcher{objTreeMock, syncClientMock, updateListenerMock}, gomock.Nil()).Return(headUpdate) - syncClientMock.EXPECT().BroadcastAsyncOrSendResponsible(gomock.Eq(headUpdate)).Return(nil) - - tr, err := buildSyncTree(ctx, syncClientMock, storageMock, updateListenerMock, aclListMock, false) - require.NoError(t, err) + headUpdate := &treechangeproto.TreeSyncMessage{} t.Run("AddRawChanges update", func(t *testing.T) { changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} - expectedRes := tree2.AddResult{ + expectedRes := tree.AddResult{ Added: changes, - Mode: tree2.Append, + Mode: tree.Append, } objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). Return(expectedRes, nil) @@ -125,9 +129,9 @@ func Test_BuildSyncTree(t *testing.T) { t.Run("AddRawChanges rebuild", func(t *testing.T) { changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} - expectedRes := tree2.AddResult{ + expectedRes := tree.AddResult{ Added: changes, - Mode: tree2.Rebuild, + Mode: tree.Rebuild, } objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). Return(expectedRes, nil) @@ -142,9 +146,9 @@ func Test_BuildSyncTree(t *testing.T) { t.Run("AddRawChanges nothing", func(t *testing.T) { changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} - expectedRes := tree2.AddResult{ + expectedRes := tree.AddResult{ Added: changes, - Mode: tree2.Nothing, + Mode: tree.Nothing, } objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(changes)). Return(expectedRes, nil) @@ -156,11 +160,11 @@ func Test_BuildSyncTree(t *testing.T) { t.Run("AddContent", func(t *testing.T) { changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}} - content := tree2.SignableChangeContent{ + content := tree.SignableChangeContent{ Data: []byte("abcde"), } - expectedRes := tree2.AddResult{ - Mode: tree2.Append, + expectedRes := tree.AddResult{ + Mode: tree.Append, Added: changes, } objTreeMock.EXPECT().AddContent(gomock.Any(), gomock.Eq(content)). diff --git a/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go index 4c1925fd..205fb8ce 100644 --- a/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go +++ b/common/pkg/acl/tree/mock_objecttree/mock_objecttree.go @@ -271,7 +271,7 @@ func (mr *MockObjectTreeMockRecorder) SnapshotPath() *gomock.Call { // Storage mocks base method. func (m *MockObjectTree) Storage() storage.TreeStorage { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SpaceStorage") + ret := m.ctrl.Call(m, "Storage") ret0, _ := ret[0].(storage.TreeStorage) return ret0 } @@ -279,7 +279,7 @@ func (m *MockObjectTree) Storage() storage.TreeStorage { // Storage indicates an expected call of Storage. func (mr *MockObjectTreeMockRecorder) Storage() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SpaceStorage", reflect.TypeOf((*MockObjectTree)(nil).Storage)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Storage", reflect.TypeOf((*MockObjectTree)(nil).Storage)) } // Unlock mocks base method. From 63d353a078a45f8e66c0a7c0c1fd3831ef9e19df Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 23 Oct 2022 22:24:13 +0200 Subject: [PATCH 187/219] Add tests for sync handler --- .../commonspace/synctree/synctreehandler.go | 6 +- .../synctree/synctreehandler_test.go | 286 ++++++++++-------- 2 files changed, 154 insertions(+), 138 deletions(-) diff --git a/common/commonspace/synctree/synctreehandler.go b/common/commonspace/synctree/synctreehandler.go index 22792be3..8c119e2a 100644 --- a/common/commonspace/synctree/synctreehandler.go +++ b/common/commonspace/synctree/synctreehandler.go @@ -90,7 +90,7 @@ func (s *syncTreeHandler) handleHeadUpdate( if fullRequest != nil { log.With("senderId", senderId). - With("heads", fullRequest.GetContent().GetFullSyncRequest().Heads). + With("heads", objTree.Heads()). With("treeId", objTree.ID()). Debug("sending full sync request") return s.syncClient.SendAsync(senderId, fullRequest, replyId) @@ -127,10 +127,6 @@ func (s *syncTreeHandler) handleFullSyncRequest( objTree.Lock() defer objTree.Unlock() - if header == nil { - header = objTree.Header() - } - if len(request.Changes) != 0 && !s.alreadyHasHeads(objTree, request.Heads) { _, err = objTree.AddRawChanges(ctx, request.Changes...) if err != nil { diff --git a/common/commonspace/synctree/synctreehandler_test.go b/common/commonspace/synctree/synctreehandler_test.go index e86aedbb..72cda749 100644 --- a/common/commonspace/synctree/synctreehandler_test.go +++ b/common/commonspace/synctree/synctreehandler_test.go @@ -3,14 +3,13 @@ package synctree import ( "context" "fmt" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/mock_syncservice" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter/mock_treegetter" + "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" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" + "go.uber.org/zap" "sync" "testing" ) @@ -39,25 +38,26 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { defer ctrl.Finish() ctx := context.Background() - spaceId := "spaceId" - cacheMock := mock_treegetter.NewMockTreeGetter(ctrl) - syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) + syncClientMock := mock_synctree.NewMockSyncClient(ctrl) objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) - syncHandler := newSyncTreeHandler(spaceId, cacheMock, syncClientMock) + syncHandler := newSyncTreeHandler(objectTreeMock, syncClientMock) + log = zap.NewNop().Sugar() + t.Run("head update non empty all heads added", func(t *testing.T) { treeId := "treeId" senderId := "senderId" chWithId := &treechangeproto.RawTreeChangeWithId{} - headUpdate := &spacesyncproto.ObjectHeadUpdate{ + headUpdate := &treechangeproto.TreeHeadUpdate{ Heads: []string{"h1"}, Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, SnapshotPath: []string{"h1"}, } - msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(objectTreeMock, nil) + treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId) + objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") + + objectTreeMock.EXPECT(). + ID().AnyTimes().Return(treeId) objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) @@ -74,7 +74,7 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { HasChanges(gomock.Eq([]string{"h1"})). Return(true) - err := syncHandler.HandleMessage(ctx, senderId, msg) + err := syncHandler.HandleMessage(ctx, senderId, objectMsg) require.NoError(t, err) }) @@ -82,16 +82,17 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { treeId := "treeId" senderId := "senderId" chWithId := &treechangeproto.RawTreeChangeWithId{} - headUpdate := &spacesyncproto.ObjectHeadUpdate{ + headUpdate := &treechangeproto.TreeHeadUpdate{ Heads: []string{"h1"}, Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, SnapshotPath: []string{"h1"}, } - fullRequest := &spacesyncproto.ObjectSyncMessage{} - msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(objectTreeMock, nil) + treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId) + objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") + fullRequest := &treechangeproto.TreeSyncMessage{} + + objectTreeMock.EXPECT(). + ID().AnyTimes().Return(treeId) objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) @@ -108,11 +109,15 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { HasChanges(gomock.Eq([]string{"h1"})). Return(false) syncClientMock.EXPECT(). - CreateFullSyncRequest(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"}), gomock.Eq("")). + CreateFullSyncRequest(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})). Return(fullRequest, nil) + objectTreeMock.EXPECT(). + Heads(). + Return([]string{"h2"}) - syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) - err := syncHandler.HandleMessage(ctx, senderId, msg) + syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullRequest), gomock.Eq("")) + + err := syncHandler.HandleMessage(ctx, senderId, objectMsg) require.NoError(t, err) }) @@ -120,20 +125,21 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { treeId := "treeId" senderId := "senderId" chWithId := &treechangeproto.RawTreeChangeWithId{} - headUpdate := &spacesyncproto.ObjectHeadUpdate{ + headUpdate := &treechangeproto.TreeHeadUpdate{ Heads: []string{"h1"}, Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, SnapshotPath: []string{"h1"}, } - msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(objectTreeMock, nil) + treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId) + objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") + + objectTreeMock.EXPECT(). + ID().AnyTimes().Return(treeId) objectTreeMock.EXPECT(). Heads(). Return([]string{"h1"}) - err := syncHandler.HandleMessage(ctx, senderId, msg) + err := syncHandler.HandleMessage(ctx, senderId, objectMsg) require.NoError(t, err) }) @@ -141,25 +147,30 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { treeId := "treeId" senderId := "senderId" chWithId := &treechangeproto.RawTreeChangeWithId{} - headUpdate := &spacesyncproto.ObjectHeadUpdate{ + headUpdate := &treechangeproto.TreeHeadUpdate{ Heads: []string{"h1"}, Changes: nil, SnapshotPath: []string{"h1"}, } - fullRequest := &spacesyncproto.ObjectSyncMessage{} - msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(objectTreeMock, nil) + treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId) + objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") + fullRequest := &treechangeproto.TreeSyncMessage{} + + 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"}), gomock.Eq("")). + CreateFullSyncRequest(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})). Return(fullRequest, nil) + objectTreeMock.EXPECT(). + Heads(). + Return([]string{"h2"}) - syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) - err := syncHandler.HandleMessage(ctx, senderId, msg) + syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullRequest), gomock.Eq("")) + + err := syncHandler.HandleMessage(ctx, senderId, objectMsg) require.NoError(t, err) }) @@ -167,21 +178,21 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) { treeId := "treeId" senderId := "senderId" chWithId := &treechangeproto.RawTreeChangeWithId{} - headUpdate := &spacesyncproto.ObjectHeadUpdate{ + headUpdate := &treechangeproto.TreeHeadUpdate{ Heads: []string{"h1"}, Changes: nil, SnapshotPath: []string{"h1"}, } - msg := spacesyncproto.WrapHeadUpdate(headUpdate, chWithId, treeId, "") - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(objectTreeMock, nil) + treeMsg := treechangeproto.WrapHeadUpdate(headUpdate, chWithId) + objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") + objectTreeMock.EXPECT(). + ID().AnyTimes().Return(treeId) objectTreeMock.EXPECT(). Heads(). Return([]string{"h1"}) - err := syncHandler.HandleMessage(ctx, senderId, msg) + err := syncHandler.HandleMessage(ctx, senderId, objectMsg) require.NoError(t, err) }) } @@ -191,26 +202,26 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) { defer ctrl.Finish() ctx := context.Background() - spaceId := "spaceId" - cacheMock := mock_treegetter.NewMockTreeGetter(ctrl) - syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) + syncClientMock := mock_synctree.NewMockSyncClient(ctrl) objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) - syncHandler := newSyncTreeHandler(spaceId, cacheMock, syncClientMock) + syncHandler := newSyncTreeHandler(objectTreeMock, syncClientMock) + log = zap.NewNop().Sugar() t.Run("full sync request with change", func(t *testing.T) { treeId := "treeId" senderId := "senderId" chWithId := &treechangeproto.RawTreeChangeWithId{} - msg := spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{ + fullSyncRequest := &treechangeproto.TreeFullSyncRequest{ Heads: []string{"h1"}, Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, SnapshotPath: []string{"h1"}, - }, chWithId, treeId, "") - fullRequest := &spacesyncproto.ObjectSyncMessage{} - - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(objectTreeMock, nil) + } + 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"}) @@ -221,11 +232,10 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) { AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). Return(tree.AddResult{}, nil) syncClientMock.EXPECT(). - CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"}), gomock.Eq("")). - Return(fullRequest, nil) - - syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) - err := syncHandler.HandleMessage(ctx, senderId, msg) + CreateFullSyncResponse(gomock.Eq(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) require.NoError(t, err) }) @@ -233,66 +243,76 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) { treeId := "treeId" senderId := "senderId" chWithId := &treechangeproto.RawTreeChangeWithId{} - msg := spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{ - Heads: []string{"h2"}, + fullSyncRequest := &treechangeproto.TreeFullSyncRequest{ + Heads: []string{"h1"}, Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, - SnapshotPath: []string{"h2"}, - }, chWithId, treeId, "") - fullRequest := &spacesyncproto.ObjectSyncMessage{} + SnapshotPath: []string{"h1"}, + } + 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{"h1"}) + syncClientMock.EXPECT(). + CreateFullSyncResponse(gomock.Eq(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) + require.NoError(t, err) + }) - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(objectTreeMock, nil) + t.Run("full sync request without change but with reply id", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + replyId := "replyId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + fullSyncRequest := &treechangeproto.TreeFullSyncRequest{ + Heads: []string{"h1"}, + SnapshotPath: []string{"h1"}, + } + treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId) + objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId) + fullResponse := &treechangeproto.TreeSyncMessage{} + 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"})). + Return(fullResponse, nil) + syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Eq(fullResponse), gomock.Eq(replyId)) + err := syncHandler.HandleMessage(ctx, senderId, objectMsg) + require.NoError(t, err) + }) + + t.Run("full sync request with add raw changes error", func(t *testing.T) { + treeId := "treeId" + senderId := "senderId" + chWithId := &treechangeproto.RawTreeChangeWithId{} + fullSyncRequest := &treechangeproto.TreeFullSyncRequest{ + Heads: []string{"h1"}, + Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, + SnapshotPath: []string{"h1"}, + } + treeMsg := treechangeproto.WrapFullRequest(fullSyncRequest, chWithId) + objectMsg, _ := marshallTreeMessage(treeMsg, treeId, "") + objectTreeMock.EXPECT(). + ID().AnyTimes().Return(treeId) + objectTreeMock.EXPECT().Header().Return(nil) objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) - syncClientMock.EXPECT(). - CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h2"}), gomock.Eq([]string{"h2"}), gomock.Eq("")). - Return(fullRequest, nil) - - syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) - err := syncHandler.HandleMessage(ctx, senderId, msg) - require.NoError(t, err) - }) - - t.Run("full sync request without change", func(t *testing.T) { - treeId := "treeId" - senderId := "senderId" - chWithId := &treechangeproto.RawTreeChangeWithId{} - msg := spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{ - Heads: []string{"h1"}, - SnapshotPath: []string{"h1"}, - }, chWithId, treeId, "") - fullRequest := &spacesyncproto.ObjectSyncMessage{} - - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(objectTreeMock, nil) - syncClientMock.EXPECT(). - CreateFullSyncResponse(gomock.Eq(objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"}), gomock.Eq("")). - Return(fullRequest, nil) - - syncClientMock.EXPECT().SendAsync(gomock.Eq([]string{senderId}), gomock.Eq(fullRequest)) - err := syncHandler.HandleMessage(ctx, senderId, msg) - require.NoError(t, err) - }) - - t.Run("full sync request with get tree error", func(t *testing.T) { - treeId := "treeId" - senderId := "senderId" - chWithId := &treechangeproto.RawTreeChangeWithId{} - msg := spacesyncproto.WrapFullRequest(&spacesyncproto.ObjectFullSyncRequest{ - Heads: []string{"h1"}, - SnapshotPath: []string{"h1"}, - }, chWithId, treeId, "") - - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(nil, fmt.Errorf("some")) - - syncClientMock.EXPECT(). - SendAsync(gomock.Eq([]string{senderId}), gomock.Any()) - err := syncHandler.HandleMessage(ctx, senderId, msg) + objectTreeMock.EXPECT(). + HasChanges(gomock.Eq([]string{"h1"})). + Return(false) + objectTreeMock.EXPECT(). + AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). + Return(tree.AddResult{}, fmt.Errorf("")) + syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Any(), gomock.Eq("")) + err := syncHandler.HandleMessage(ctx, senderId, objectMsg) require.Error(t, err) }) } @@ -302,25 +322,25 @@ func TestSyncHandler_HandleFullSyncResponse(t *testing.T) { defer ctrl.Finish() ctx := context.Background() - spaceId := "spaceId" - cacheMock := mock_treegetter.NewMockTreeGetter(ctrl) - syncClientMock := mock_syncservice.NewMockSyncClient(ctrl) + syncClientMock := mock_synctree.NewMockSyncClient(ctrl) objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) - syncHandler := newSyncTreeHandler(spaceId, cacheMock, syncClientMock) + syncHandler := newSyncTreeHandler(objectTreeMock, syncClientMock) + log = zap.NewNop().Sugar() + t.Run("full sync response with change", func(t *testing.T) { treeId := "treeId" senderId := "senderId" + replyId := "replyId" chWithId := &treechangeproto.RawTreeChangeWithId{} - msg := spacesyncproto.WrapFullResponse(&spacesyncproto.ObjectFullSyncResponse{ + fullSyncResponse := &treechangeproto.TreeFullSyncResponse{ Heads: []string{"h1"}, Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, SnapshotPath: []string{"h1"}, - }, chWithId, treeId, "") - - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(objectTreeMock, nil) + } + treeMsg := treechangeproto.WrapFullResponse(fullSyncResponse, chWithId) + objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId) + objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId) objectTreeMock.EXPECT(). Heads(). Return([]string{"h2"}) @@ -331,28 +351,28 @@ func TestSyncHandler_HandleFullSyncResponse(t *testing.T) { AddRawChanges(gomock.Any(), gomock.Eq([]*treechangeproto.RawTreeChangeWithId{chWithId})). Return(tree.AddResult{}, nil) - err := syncHandler.HandleMessage(ctx, senderId, msg) + err := syncHandler.HandleMessage(ctx, senderId, objectMsg) require.NoError(t, err) }) - t.Run("full sync response same heads", func(t *testing.T) { + t.Run("full sync response with same heads", func(t *testing.T) { treeId := "treeId" senderId := "senderId" + replyId := "replyId" chWithId := &treechangeproto.RawTreeChangeWithId{} - msg := spacesyncproto.WrapFullResponse(&spacesyncproto.ObjectFullSyncResponse{ + fullSyncResponse := &treechangeproto.TreeFullSyncResponse{ Heads: []string{"h1"}, Changes: []*treechangeproto.RawTreeChangeWithId{chWithId}, SnapshotPath: []string{"h1"}, - }, chWithId, treeId, "") - - cacheMock.EXPECT(). - GetTree(gomock.Any(), spaceId, treeId). - Return(objectTreeMock, nil) + } + treeMsg := treechangeproto.WrapFullResponse(fullSyncResponse, chWithId) + objectMsg, _ := marshallTreeMessage(treeMsg, treeId, replyId) + objectTreeMock.EXPECT().ID().AnyTimes().Return(treeId) objectTreeMock.EXPECT(). Heads(). Return([]string{"h1"}) - err := syncHandler.HandleMessage(ctx, senderId, msg) + err := syncHandler.HandleMessage(ctx, senderId, objectMsg) require.NoError(t, err) }) } From 7bd593f0e5311c8e6baf3804a8978f12572a5dd6 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 24 Oct 2022 10:31:29 +0200 Subject: [PATCH 188/219] Stream pool and synctree fixes --- common/commonspace/syncservice/streampool.go | 8 ++++---- common/commonspace/synctree/synctree.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 89572992..34f2c392 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -98,7 +98,7 @@ func (s *streamPool) SendSync( delete(s.waiters, msg.ReplyId) s.waitersMx.Unlock() - log.With("trackingId", msg.ReplyId).Error("time elapsed when waiting") + log.With("replyId", msg.ReplyId).Error("time elapsed when waiting") err = ErrSyncTimeout case reply = <-waiter.ch: if !delay.Stop() { @@ -226,17 +226,17 @@ func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStre s.messageHandler(stream.Context(), peerId, msg) return } - log.With("trackingId", msg.ReplyId).Debug("getting message with tracking id") + log.With("replyId", msg.ReplyId).Debug("getting message with reply id") s.waitersMx.Lock() waiter, exists := s.waiters[msg.ReplyId] if !exists { - log.With("trackingId", msg.ReplyId).Debug("tracking id not exists") + log.With("replyId", msg.ReplyId).Debug("reply id not exists") s.waitersMx.Unlock() s.messageHandler(stream.Context(), peerId, msg) return } - log.With("trackingId", msg.ReplyId).Debug("tracking id exists") + log.With("replyId", msg.ReplyId).Debug("reply id exists") delete(s.waiters, msg.ReplyId) s.waitersMx.Unlock() diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 863c3998..c8e17602 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -125,7 +125,7 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t } resp, err := deps.StreamPool.SendSync(peerId, objMsg) - if resp != nil { + if err != nil { return } msg = &treechangeproto.TreeSyncMessage{} From e419e59f1dc1c33b56e8316de9f50f7cde12c86f Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 24 Oct 2022 11:59:37 +0200 Subject: [PATCH 189/219] Change space payload --- client/clientspace/rpchandler.go | 6 +- common/commonspace/diffservice/diffsyncer.go | 5 +- .../diffservice/diffsyncer_test.go | 15 +- common/commonspace/service.go | 8 +- .../spacesyncproto/protos/spacesync.proto | 6 +- .../spacesyncproto/spacesync.pb.go | 189 +++++++++++------- node/nodespace/rpchandler.go | 6 +- 7 files changed, 144 insertions(+), 91 deletions(-) diff --git a/client/clientspace/rpchandler.go b/client/clientspace/rpchandler.go index 2e65adfd..6c481d3f 100644 --- a/client/clientspace/rpchandler.go +++ b/client/clientspace/rpchandler.go @@ -5,6 +5,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "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/pkg/acl/aclrecordproto" ) type rpcHandler struct { @@ -23,7 +24,10 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac } payload := storage.SpaceStorageCreatePayload{ - RecWithId: req.AclRoot, + RecWithId: &aclrecordproto.RawACLRecordWithId{ + Payload: req.AclPayload, + Id: req.AclPayloadId, + }, SpaceHeaderWithId: req.SpaceHeader, } st, err := r.s.spaceStorageProvider.CreateSpaceStorage(payload) diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index 2638dfb4..33d9852b 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -108,8 +108,9 @@ func (d *diffSyncer) sendPushSpaceRequest(ctx context.Context, cl spacesyncproto } _, err = cl.PushSpace(ctx, &spacesyncproto.PushSpaceRequest{ - SpaceHeader: header, - AclRoot: root, + SpaceHeader: header, + AclPayload: root.Payload, + AclPayloadId: root.Id, }) return } diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index 68eadc78..60b52325 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -23,7 +23,7 @@ import ( type pushSpaceRequestMatcher struct { spaceId string - aclRoot *aclrecordproto.RawACLRecordWithId + aclRootId string spaceHeader *spacesyncproto.RawSpaceHeaderWithId } @@ -33,7 +33,7 @@ func (p pushSpaceRequestMatcher) Matches(x interface{}) bool { return false } - return res.AclRoot == p.aclRoot && res.SpaceHeader == p.spaceHeader + return res.AclPayloadId == p.aclRootId && res.SpaceHeader == p.spaceHeader } func (p pushSpaceRequestMatcher) String() string { @@ -71,11 +71,11 @@ func (m mockPeer) NewStream(ctx context.Context, rpc string, enc drpc.Encoding) func newPushSpaceRequestMatcher( spaceId string, - aclRoot *aclrecordproto.RawACLRecordWithId, + aclRootId string, spaceHeader *spacesyncproto.RawSpaceHeaderWithId) *pushSpaceRequestMatcher { return &pushSpaceRequestMatcher{ spaceId: spaceId, - aclRoot: aclRoot, + aclRootId: aclRootId, spaceHeader: spaceHeader, } } @@ -95,6 +95,7 @@ func TestDiffSyncer_Sync(t *testing.T) { return clientMock }) spaceId := "spaceId" + aclRootId := "aclRootId" l := logger.NewNamed(spaceId) diffSyncer := newDiffSyncer(spaceId, diffMock, connectorMock, cacheMock, stMock, factory, l) @@ -123,7 +124,9 @@ func TestDiffSyncer_Sync(t *testing.T) { t.Run("diff syncer sync space missing", func(t *testing.T) { aclStorageMock := mock_aclstorage.NewMockListStorage(ctrl) - aclRoot := &aclrecordproto.RawACLRecordWithId{} + aclRoot := &aclrecordproto.RawACLRecordWithId{ + Id: aclRootId, + } spaceHeader := &spacesyncproto.RawSpaceHeaderWithId{} connectorMock.EXPECT(). @@ -142,7 +145,7 @@ func TestDiffSyncer_Sync(t *testing.T) { Root(). Return(aclRoot, nil) clientMock.EXPECT(). - PushSpace(gomock.Any(), newPushSpaceRequestMatcher(spaceId, aclRoot, spaceHeader)). + PushSpace(gomock.Any(), newPushSpaceRequestMatcher(spaceId, aclRootId, spaceHeader)). Return(nil, nil) require.NoError(t, diffSyncer.Sync(ctx)) diff --git a/common/commonspace/service.go b/common/commonspace/service.go index dd9c94d5..53e22aee 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -34,7 +34,7 @@ type service struct { account account.Service configurationService nodeconf.Service storageProvider storage.SpaceStorageProvider - cache treegetter.TreeGetter + treeGetter treegetter.TreeGetter pool pool.Pool } @@ -43,7 +43,7 @@ func (s *service) Init(a *app.App) (err error) { s.account = a.MustComponent(account.CName).(account.Service) s.storageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) - s.cache = a.MustComponent(treegetter.CName).(treegetter.TreeGetter) + s.treeGetter = a.MustComponent(treegetter.CName).(treegetter.TreeGetter) s.pool = a.MustComponent(pool.CName).(pool.Pool) return nil } @@ -90,13 +90,13 @@ func (s *service) GetSpace(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.cache, log) + diffService := diffservice.NewDiffService(id, s.config.SyncPeriod, st, confConnector, s.treeGetter, log) syncService := syncservice.NewSyncService(id, confConnector) sp := &space{ id: id, syncService: syncService, diffService: diffService, - cache: s.cache, + cache: s.treeGetter, account: s.account, configuration: lastConfiguration, storage: st, diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index d8dc0153..52924272 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -2,7 +2,6 @@ syntax = "proto3"; package anySpace; option go_package = "commonspace/spacesyncproto"; -import "pkg/acl/aclrecordproto/protos/aclrecord.proto"; enum ErrCodes { Unexpected = 0; @@ -63,8 +62,9 @@ message ObjectSyncMessage { // PushSpaceRequest is a request to add space on a node containing only one acl record message PushSpaceRequest { - RawSpaceHeaderWithId spaceHeader = 2; - aclrecord.RawACLRecordWithId aclRoot = 3; + RawSpaceHeaderWithId spaceHeader = 1; + bytes aclPayload = 2; + string aclPayloadId = 3; } // PushSpaceResponse is an empty response diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 2c4115a3..8579814c 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -5,7 +5,6 @@ package spacesyncproto import ( fmt "fmt" - aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -398,8 +397,9 @@ func (m *ObjectSyncMessage) GetObjectId() string { // PushSpaceRequest is a request to add space on a node containing only one acl record type PushSpaceRequest struct { - SpaceHeader *RawSpaceHeaderWithId `protobuf:"bytes,2,opt,name=spaceHeader,proto3" json:"spaceHeader,omitempty"` - AclRoot *aclrecordproto.RawACLRecordWithId `protobuf:"bytes,3,opt,name=aclRoot,proto3" json:"aclRoot,omitempty"` + SpaceHeader *RawSpaceHeaderWithId `protobuf:"bytes,1,opt,name=spaceHeader,proto3" json:"spaceHeader,omitempty"` + AclPayload []byte `protobuf:"bytes,2,opt,name=aclPayload,proto3" json:"aclPayload,omitempty"` + AclPayloadId string `protobuf:"bytes,3,opt,name=aclPayloadId,proto3" json:"aclPayloadId,omitempty"` } func (m *PushSpaceRequest) Reset() { *m = PushSpaceRequest{} } @@ -442,13 +442,20 @@ func (m *PushSpaceRequest) GetSpaceHeader() *RawSpaceHeaderWithId { return nil } -func (m *PushSpaceRequest) GetAclRoot() *aclrecordproto.RawACLRecordWithId { +func (m *PushSpaceRequest) GetAclPayload() []byte { if m != nil { - return m.AclRoot + return m.AclPayload } return nil } +func (m *PushSpaceRequest) GetAclPayloadId() string { + if m != nil { + return m.AclPayloadId + } + return "" +} + // PushSpaceResponse is an empty response type PushSpaceResponse struct { } @@ -687,52 +694,50 @@ func init() { } var fileDescriptor_80e49f1f4ac27799 = []byte{ - // 717 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0x4f, 0x6f, 0xda, 0x48, - 0x14, 0xc7, 0x84, 0x24, 0xf0, 0x20, 0x84, 0xcc, 0x66, 0xb5, 0x5e, 0x76, 0x97, 0x45, 0x3e, 0xac, - 0xd0, 0x4a, 0x0b, 0x5b, 0x5a, 0xa9, 0x87, 0x5c, 0x9a, 0x26, 0x44, 0x45, 0x6d, 0x9a, 0x68, 0x68, - 0x55, 0xa9, 0xea, 0x65, 0x62, 0x4f, 0xc0, 0x2d, 0xf6, 0xb8, 0x33, 0x83, 0x88, 0x0f, 0xfd, 0x08, - 0x95, 0xfa, 0x15, 0xfa, 0x6d, 0x7a, 0xcc, 0x31, 0xc7, 0x2a, 0xf9, 0x22, 0xd5, 0x3c, 0x63, 0x0c, - 0x29, 0xc9, 0x01, 0x33, 0xef, 0xcf, 0xef, 0xbd, 0xdf, 0xfc, 0xfc, 0x9e, 0xe1, 0x81, 0x2b, 0x82, - 0x40, 0x84, 0x2a, 0x62, 0x2e, 0xef, 0xe0, 0x53, 0xc5, 0xa1, 0x1b, 0x49, 0xa1, 0x45, 0x07, 0x9f, - 0x2a, 0xf3, 0xb6, 0xd1, 0x41, 0x8a, 0x2c, 0x8c, 0x07, 0xc6, 0x57, 0xff, 0x2f, 0xfa, 0x30, 0xec, - 0x30, 0x77, 0x6c, 0x7e, 0x92, 0xbb, 0x42, 0x7a, 0x4b, 0xc0, 0xb9, 0x37, 0x01, 0x3a, 0x7d, 0xd8, - 0x7a, 0xc6, 0x99, 0x37, 0x88, 0x43, 0x97, 0xb2, 0x70, 0xc8, 0x09, 0x81, 0xc2, 0xb9, 0x14, 0x81, - 0x6d, 0x35, 0xad, 0x56, 0x81, 0xe2, 0x99, 0x54, 0x21, 0xaf, 0x85, 0x9d, 0x47, 0x4f, 0x5e, 0x0b, - 0xb2, 0x0b, 0xeb, 0x63, 0x3f, 0xf0, 0xb5, 0xbd, 0xd6, 0xb4, 0x5a, 0x5b, 0x34, 0x31, 0x9c, 0x29, - 0x54, 0xe7, 0xa5, 0xb8, 0x9a, 0x8c, 0xb5, 0xa9, 0x35, 0x62, 0x6a, 0x84, 0xb5, 0x2a, 0x14, 0xcf, - 0x64, 0x0f, 0x8a, 0x7c, 0xcc, 0x03, 0x1e, 0x6a, 0x65, 0xe7, 0x9b, 0x6b, 0xad, 0x72, 0xf7, 0xef, - 0x76, 0x4a, 0xbe, 0xbd, 0x8c, 0xef, 0x25, 0x79, 0x74, 0x0e, 0x30, 0x8d, 0x5d, 0x31, 0x09, 0xe7, - 0x8d, 0xd1, 0x70, 0xf6, 0xe0, 0xd7, 0x95, 0x40, 0xc3, 0xdb, 0xf7, 0xb0, 0x7b, 0x89, 0xe6, 0x7d, - 0x0f, 0xf9, 0x70, 0xe6, 0xe1, 0x4d, 0x4a, 0x14, 0xcf, 0xce, 0x3b, 0xd8, 0xce, 0xc0, 0x1f, 0x27, - 0x5c, 0x69, 0x62, 0xc3, 0x26, 0xea, 0xdb, 0x4f, 0xb1, 0xa9, 0x49, 0x3a, 0xb0, 0x21, 0x8d, 0x4a, - 0x29, 0xf5, 0xdf, 0x56, 0x50, 0x37, 0x71, 0x3a, 0x4b, 0x73, 0x8e, 0xa0, 0xb6, 0x40, 0x2d, 0x12, - 0xa1, 0xe2, 0xa4, 0x0b, 0x9b, 0x12, 0x69, 0x2a, 0xdb, 0xc2, 0x2a, 0xf6, 0x5d, 0x02, 0xd0, 0x34, - 0xd1, 0xf9, 0x04, 0x3b, 0x27, 0x67, 0xef, 0xb9, 0xab, 0x4d, 0xf0, 0x98, 0x2b, 0xc5, 0x86, 0xfc, - 0x1e, 0x9e, 0xb6, 0x69, 0x11, 0x8d, 0xe3, 0x7e, 0x7a, 0xd7, 0xd4, 0x34, 0x91, 0x88, 0xc5, 0x63, - 0xc1, 0x3c, 0xd4, 0xb0, 0x42, 0x53, 0x93, 0xd4, 0xa1, 0x28, 0xb0, 0x45, 0xdf, 0xb3, 0x0b, 0x08, - 0x9a, 0xdb, 0xce, 0x67, 0x0b, 0x6a, 0xa7, 0x13, 0x35, 0x42, 0x92, 0xa9, 0x4c, 0x4f, 0xa0, 0x8c, - 0xfd, 0x0c, 0x67, 0x2e, 0xb1, 0x51, 0xb9, 0xdb, 0xc8, 0xee, 0x42, 0xd9, 0x74, 0x90, 0xc5, 0xdf, - 0xf8, 0x7a, 0xd4, 0xf7, 0xe8, 0x22, 0x84, 0x3c, 0x86, 0x4d, 0xe6, 0x8e, 0xa9, 0x10, 0xc9, 0x0b, - 0x2d, 0x77, 0xff, 0x6a, 0x67, 0xf3, 0x49, 0xd9, 0x74, 0xff, 0xe0, 0x05, 0x45, 0x63, 0x06, 0x4e, - 0xb3, 0x9d, 0x5f, 0x60, 0x67, 0x81, 0x4e, 0xa2, 0xab, 0xf3, 0xd5, 0x82, 0xf2, 0x42, 0x43, 0x73, - 0x21, 0xdf, 0xe3, 0xa1, 0xf6, 0x75, 0x3c, 0x9b, 0xc0, 0xb9, 0x4d, 0xfe, 0x84, 0x92, 0xf6, 0x03, - 0xae, 0x34, 0x0b, 0x22, 0x64, 0xbe, 0x46, 0x33, 0x87, 0x89, 0x22, 0xcd, 0x57, 0x71, 0xc4, 0x91, - 0x59, 0x89, 0x66, 0x0e, 0xf2, 0x0f, 0x54, 0x8d, 0x9a, 0xbe, 0xcb, 0xb4, 0x2f, 0xc2, 0xe7, 0x3c, - 0x46, 0xb9, 0x0a, 0xf4, 0x96, 0xd7, 0x4c, 0x9b, 0xe2, 0xdc, 0xb3, 0xd7, 0x93, 0xe9, 0x37, 0x67, - 0xe7, 0x14, 0xaa, 0xcb, 0xb2, 0x90, 0xe6, 0xb2, 0x8a, 0x09, 0xd1, 0x25, 0x95, 0x0c, 0x1b, 0x7f, - 0x18, 0x32, 0x3d, 0x91, 0x1c, 0xb9, 0x56, 0x68, 0xe6, 0x70, 0x0e, 0x61, 0x77, 0x95, 0xd0, 0x06, - 0x25, 0xd9, 0x74, 0xa9, 0x6a, 0xe6, 0x98, 0x6d, 0x46, 0x3e, 0xdd, 0x8c, 0x7f, 0x5f, 0x42, 0xb1, - 0x27, 0xe5, 0x81, 0xf0, 0xb8, 0x22, 0x55, 0x80, 0xd7, 0x21, 0xbf, 0x88, 0xb8, 0xab, 0xb9, 0x57, - 0xcb, 0x91, 0x1a, 0x54, 0xb0, 0xfc, 0xb1, 0xaf, 0x94, 0x1f, 0x0e, 0x6b, 0x16, 0xd9, 0x9e, 0x09, - 0xdd, 0xbb, 0xf0, 0x95, 0x56, 0xb5, 0xbc, 0x71, 0xf4, 0xa4, 0x14, 0xf2, 0xe4, 0xfc, 0x5c, 0x71, - 0x5d, 0xf3, 0xba, 0x57, 0x16, 0xac, 0x63, 0x0a, 0xd9, 0x87, 0x62, 0x3a, 0xd4, 0xe4, 0xf7, 0x55, - 0x83, 0x8e, 0xc3, 0x54, 0xaf, 0xaf, 0xdc, 0x81, 0x64, 0x61, 0x0e, 0xa1, 0x34, 0x7f, 0xdb, 0x64, - 0x21, 0xf1, 0xf6, 0x44, 0xd6, 0xff, 0x58, 0x19, 0x9b, 0x55, 0x39, 0x82, 0x8d, 0x81, 0x96, 0x9c, - 0x05, 0x64, 0x21, 0xed, 0xa7, 0xa5, 0xaa, 0xdf, 0x17, 0x6c, 0x59, 0xff, 0x5b, 0x4f, 0x1f, 0x7d, - 0xbb, 0x6e, 0x58, 0x97, 0xd7, 0x0d, 0xeb, 0xfb, 0x75, 0xc3, 0xfa, 0x72, 0xd3, 0xc8, 0x5d, 0xde, - 0x34, 0x72, 0x57, 0x37, 0x8d, 0xdc, 0xdb, 0xfa, 0xdd, 0xdf, 0xed, 0xb3, 0x0d, 0xfc, 0x7b, 0xf8, - 0x23, 0x00, 0x00, 0xff, 0xff, 0x84, 0x55, 0x32, 0xc7, 0xdc, 0x05, 0x00, 0x00, + // 685 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xcd, 0x4e, 0xdb, 0x4a, + 0x14, 0x8e, 0x4d, 0x80, 0xe4, 0x24, 0x84, 0x30, 0x97, 0xab, 0xeb, 0x9b, 0x56, 0x6e, 0xe4, 0x45, + 0x15, 0x75, 0x01, 0x6d, 0xda, 0x1d, 0x9b, 0xfe, 0x10, 0xd4, 0xa8, 0xa2, 0xa0, 0x49, 0xab, 0x4a, + 0x55, 0x37, 0x83, 0x3d, 0x24, 0x53, 0xc5, 0x1e, 0xd7, 0x33, 0x11, 0x78, 0xd1, 0x77, 0xe8, 0xb2, + 0xdb, 0xbe, 0x4d, 0x97, 0x2c, 0x59, 0x56, 0xf0, 0x22, 0xd5, 0x9c, 0xd8, 0x71, 0x02, 0x81, 0xcd, + 0x64, 0xce, 0x77, 0xfe, 0xbe, 0xf9, 0x72, 0x8e, 0xe1, 0x99, 0x2f, 0xc3, 0x50, 0x46, 0x2a, 0x66, + 0x3e, 0xdf, 0xc5, 0x53, 0xa5, 0x91, 0x1f, 0x27, 0x52, 0xcb, 0x5d, 0x3c, 0x55, 0x81, 0xee, 0x20, + 0x40, 0x2a, 0x2c, 0x4a, 0x07, 0x06, 0xf3, 0xfa, 0xb0, 0xf1, 0x96, 0xb3, 0x60, 0x90, 0x46, 0x3e, + 0x65, 0xd1, 0x90, 0x13, 0x02, 0xe5, 0xd3, 0x44, 0x86, 0x8e, 0xd5, 0xb6, 0x3a, 0x65, 0x8a, 0x77, + 0xd2, 0x00, 0x5b, 0x4b, 0xc7, 0x46, 0xc4, 0xd6, 0x92, 0x6c, 0xc3, 0xea, 0x58, 0x84, 0x42, 0x3b, + 0x2b, 0x6d, 0xab, 0xb3, 0x41, 0xa7, 0x86, 0x77, 0x06, 0x8d, 0x59, 0x29, 0xae, 0x26, 0x63, 0x6d, + 0x6a, 0x8d, 0x98, 0x1a, 0x61, 0xad, 0x3a, 0xc5, 0x3b, 0xd9, 0x83, 0x0a, 0x1f, 0xf3, 0x90, 0x47, + 0x5a, 0x39, 0x76, 0x7b, 0xa5, 0x53, 0xeb, 0x3e, 0xda, 0xc9, 0xd9, 0xec, 0x2c, 0xe6, 0xf7, 0xa6, + 0x71, 0x74, 0x96, 0x60, 0x1a, 0xfb, 0x72, 0x12, 0xcd, 0x1a, 0xa3, 0xe1, 0xed, 0xc1, 0xbf, 0x4b, + 0x13, 0x0d, 0x6f, 0x11, 0x60, 0xf7, 0x2a, 0xb5, 0x45, 0x80, 0x7c, 0x38, 0x0b, 0xf0, 0x25, 0x55, + 0x8a, 0x77, 0xef, 0x0b, 0x6c, 0x16, 0xc9, 0xdf, 0x26, 0x5c, 0x69, 0xe2, 0xc0, 0x3a, 0x0a, 0xd6, + 0xcf, 0x73, 0x73, 0x93, 0xec, 0xc2, 0x5a, 0x62, 0x54, 0xca, 0xa9, 0xff, 0xb7, 0x84, 0xba, 0xf1, + 0xd3, 0x2c, 0xcc, 0x3b, 0x80, 0xe6, 0x1c, 0xb5, 0x58, 0x46, 0x8a, 0x93, 0x2e, 0xac, 0x27, 0x48, + 0x53, 0x39, 0x16, 0x56, 0x71, 0xee, 0x12, 0x80, 0xe6, 0x81, 0xde, 0x77, 0xd8, 0x3a, 0x3a, 0xf9, + 0xca, 0x7d, 0x6d, 0x9c, 0x87, 0x5c, 0x29, 0x36, 0xe4, 0xf7, 0xf0, 0x74, 0x4c, 0x8b, 0x78, 0x9c, + 0xf6, 0xf3, 0xb7, 0xe6, 0xa6, 0xf1, 0xc4, 0x2c, 0x1d, 0x4b, 0x16, 0xa0, 0x86, 0x75, 0x9a, 0x9b, + 0xa4, 0x05, 0x15, 0x89, 0x2d, 0xfa, 0x81, 0x53, 0xc6, 0xa4, 0x99, 0xed, 0xfd, 0xb4, 0xa0, 0x79, + 0x3c, 0x51, 0x23, 0x24, 0x99, 0xcb, 0xf4, 0x12, 0x6a, 0xd8, 0xcf, 0x70, 0xe6, 0x09, 0x52, 0xa8, + 0x75, 0xdd, 0xe2, 0x2d, 0x94, 0x9d, 0x0d, 0x0a, 0xff, 0x27, 0xa1, 0x47, 0xfd, 0x80, 0xce, 0xa7, + 0x10, 0x17, 0x80, 0xf9, 0xe3, 0xe3, 0x8c, 0x8f, 0x8d, 0x7c, 0xe6, 0x10, 0xe2, 0x41, 0xbd, 0xb0, + 0xfa, 0x53, 0xc6, 0x55, 0xba, 0x80, 0x79, 0xff, 0xc0, 0xd6, 0x1c, 0xb3, 0xa9, 0xc4, 0xde, 0x2f, + 0x0b, 0x6a, 0x73, 0xbd, 0xcd, 0xdb, 0x44, 0xc0, 0x23, 0x2d, 0x74, 0x9a, 0x0d, 0xe3, 0xcc, 0x26, + 0x0f, 0xa1, 0xaa, 0x45, 0xc8, 0x95, 0x66, 0x61, 0x8c, 0x1c, 0x56, 0x68, 0x01, 0x18, 0x2f, 0x32, + 0xfe, 0x90, 0xc6, 0x3c, 0xeb, 0x5f, 0x00, 0xe4, 0x31, 0x34, 0x8c, 0xb0, 0xc2, 0x67, 0x5a, 0xc8, + 0xe8, 0x1d, 0x4f, 0x51, 0xb9, 0x32, 0xbd, 0x81, 0x9a, 0xc1, 0x53, 0x9c, 0x07, 0xce, 0xea, 0x74, + 0x11, 0xcc, 0xdd, 0x3b, 0x86, 0xc6, 0xa2, 0x42, 0xa4, 0x7d, 0x5b, 0xd0, 0xfa, 0xa2, 0x60, 0x86, + 0x8d, 0x18, 0x46, 0x4c, 0x4f, 0x12, 0x9e, 0xe9, 0x55, 0x00, 0xde, 0x3e, 0x6c, 0x2f, 0xd3, 0xdc, + 0x64, 0x25, 0xec, 0x6c, 0xa1, 0x6a, 0x01, 0x64, 0x4b, 0x62, 0xe7, 0x4b, 0xf2, 0xe4, 0x3d, 0x54, + 0x7a, 0x49, 0xf2, 0x46, 0x06, 0x5c, 0x91, 0x06, 0xc0, 0xc7, 0x88, 0x9f, 0xc7, 0xdc, 0xd7, 0x3c, + 0x68, 0x96, 0x48, 0x13, 0xea, 0x58, 0xfe, 0x50, 0x28, 0x25, 0xa2, 0x61, 0xd3, 0x22, 0x9b, 0x99, + 0xd0, 0xbd, 0x73, 0xa1, 0xb4, 0x6a, 0xda, 0x06, 0xe8, 0x25, 0x89, 0x4c, 0x8e, 0x4e, 0x4f, 0x15, + 0xd7, 0xcd, 0xa0, 0x7b, 0x69, 0xc1, 0x2a, 0x86, 0x90, 0x57, 0x50, 0xc9, 0xe7, 0x9b, 0xfc, 0xbf, + 0x6c, 0xe6, 0x71, 0xae, 0x5a, 0xad, 0xa5, 0xeb, 0x30, 0xdd, 0x9d, 0x7d, 0xa8, 0xce, 0xfe, 0x6d, + 0x32, 0x17, 0x78, 0x73, 0x38, 0x5b, 0x0f, 0x96, 0xfa, 0xb2, 0x2a, 0x07, 0xb0, 0x36, 0xd0, 0x09, + 0x67, 0x21, 0x99, 0x0b, 0xbb, 0xb5, 0x5f, 0xad, 0xfb, 0x9c, 0x1d, 0xeb, 0xa9, 0xf5, 0xfa, 0xc5, + 0xef, 0x2b, 0xd7, 0xba, 0xb8, 0x72, 0xad, 0x3f, 0x57, 0xae, 0xf5, 0xe3, 0xda, 0x2d, 0x5d, 0x5c, + 0xbb, 0xa5, 0xcb, 0x6b, 0xb7, 0xf4, 0xb9, 0x75, 0xf7, 0x37, 0xf9, 0x64, 0x0d, 0x7f, 0x9e, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0xff, 0xc9, 0x45, 0x08, 0x76, 0xb8, 0x05, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { @@ -1011,18 +1016,20 @@ func (m *PushSpaceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.AclRoot != nil { - { - size, err := m.AclRoot.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintSpacesync(dAtA, i, uint64(size)) - } + if len(m.AclPayloadId) > 0 { + i -= len(m.AclPayloadId) + copy(dAtA[i:], m.AclPayloadId) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.AclPayloadId))) i-- dAtA[i] = 0x1a } + if len(m.AclPayload) > 0 { + i -= len(m.AclPayload) + copy(dAtA[i:], m.AclPayload) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.AclPayload))) + i-- + dAtA[i] = 0x12 + } if m.SpaceHeader != nil { { size, err := m.SpaceHeader.MarshalToSizedBuffer(dAtA[:i]) @@ -1033,7 +1040,7 @@ func (m *PushSpaceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintSpacesync(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -1326,8 +1333,12 @@ func (m *PushSpaceRequest) Size() (n int) { l = m.SpaceHeader.Size() n += 1 + l + sovSpacesync(uint64(l)) } - if m.AclRoot != nil { - l = m.AclRoot.Size() + l = len(m.AclPayload) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + l = len(m.AclPayloadId) + if l > 0 { n += 1 + l + sovSpacesync(uint64(l)) } return n @@ -2176,7 +2187,7 @@ func (m *PushSpaceRequest) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: PushSpaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 2: + case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SpaceHeader", wireType) } @@ -2212,11 +2223,11 @@ func (m *PushSpaceRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AclRoot", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AclPayload", wireType) } - var msglen int + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowSpacesync @@ -2226,27 +2237,57 @@ func (m *PushSpaceRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + if byteLen < 0 { return ErrInvalidLengthSpacesync } - postIndex := iNdEx + msglen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthSpacesync } if postIndex > l { return io.ErrUnexpectedEOF } - if m.AclRoot == nil { - m.AclRoot = &aclrecordproto.RawACLRecordWithId{} + m.AclPayload = append(m.AclPayload[:0], dAtA[iNdEx:postIndex]...) + if m.AclPayload == nil { + m.AclPayload = []byte{} } - if err := m.AclRoot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AclPayloadId", wireType) } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AclPayloadId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go index 1145e35c..f0692c8a 100644 --- a/node/nodespace/rpchandler.go +++ b/node/nodespace/rpchandler.go @@ -4,6 +4,7 @@ import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" ) type rpcHandler struct { @@ -22,7 +23,10 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac } payload := storage.SpaceStorageCreatePayload{ - RecWithId: req.AclRoot, + RecWithId: &aclrecordproto.RawACLRecordWithId{ + Payload: req.AclPayload, + Id: req.AclPayloadId, + }, SpaceHeaderWithId: req.SpaceHeader, } st, err := r.s.spaceStorageProvider.CreateSpaceStorage(payload) From 9992b1fa7e4692f1b0a41e5b9488ffa8c064e197 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Mon, 24 Oct 2022 13:05:44 +0300 Subject: [PATCH 190/219] remove debug --- consensus/consensusclient/client_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/consensus/consensusclient/client_test.go b/consensus/consensusclient/client_test.go index f27787ab..ef89d8d5 100644 --- a/consensus/consensusclient/client_test.go +++ b/consensus/consensusclient/client_test.go @@ -188,7 +188,6 @@ func (t *testServer) AddRecord(ctx context.Context, req *consensusproto.AddRecor } func (t *testServer) WatchLog(stream consensusproto.DRPCConsensus_WatchLogStream) error { - fmt.Println("watchLog", t.watchErrOnce) if t.watchErrOnce { t.watchErrOnce = false return fmt.Errorf("error") From f507e4cabd7baadff2a12d30579316b6fec7ecb4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 24 Oct 2022 12:09:59 +0200 Subject: [PATCH 191/219] Better logs in space storage --- node/storage/spacestorage.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index b9406fb3..f82d85ba 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -28,7 +28,7 @@ type spaceStorage struct { } func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceStorage, err error) { - log.With(zap.String("id", spaceId)).Debug("space storage opened with new") + log.With(zap.String("id", spaceId)).Debug("space storage opening with new") dbPath := path.Join(rootPath, spaceId) objDb, err := pogreb.Open(dbPath, defPogrebOptions) if err != nil { @@ -37,6 +37,7 @@ func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceS defer func() { if err != nil { + log.With(zap.String("id", spaceId), zap.Error(err)).Warn("failed to open storage") objDb.Close() } }() @@ -79,7 +80,7 @@ func newSpaceStorage(rootPath string, spaceId string) (store spacestorage.SpaceS } func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreatePayload) (store spacestorage.SpaceStorage, err error) { - log.With(zap.String("id", payload.SpaceHeaderWithId.Id)).Debug("space storage opened with create") + log.With(zap.String("id", payload.SpaceHeaderWithId.Id)).Debug("space storage creating") dbPath := path.Join(rootPath, payload.SpaceHeaderWithId.Id) db, err := pogreb.Open(dbPath, defPogrebOptions) if err != nil { @@ -87,6 +88,7 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate } defer func() { + log.With(zap.String("id", payload.SpaceHeaderWithId.Id), zap.Error(err)).Warn("failed to create storage") if err != nil { db.Close() } From 93bf6d4dc4a43c023968111b8592721203b084e4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 24 Oct 2022 14:44:15 +0200 Subject: [PATCH 192/219] Remove fleet artefacts --- .fleet/settings.json | 4 ---- .gitignore | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 .fleet/settings.json diff --git a/.fleet/settings.json b/.fleet/settings.json deleted file mode 100644 index 963a3020..00000000 --- a/.fleet/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "toolchains": [], - "editor.guides": [] -} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5d1bd6cc..7729a9b3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ # Test binary, built with `go test -c` *.test + # Output of the go coverage tool, specifically when used with LiteIDE *.out @@ -17,6 +18,9 @@ vendor # database db +# artefacts for Intelli-J fleet +.fleet + # Intelli-J files .idea From 305cd2d795c8b37b7ee2abee61c4ad4925be828c Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 24 Oct 2022 14:46:24 +0200 Subject: [PATCH 193/219] Remove lastusage from syncclient --- common/commonspace/synctree/syncclient.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/common/commonspace/synctree/syncclient.go b/common/commonspace/synctree/syncclient.go index 61bba80b..d8a721ec 100644 --- a/common/commonspace/synctree/syncclient.go +++ b/common/commonspace/synctree/syncclient.go @@ -7,13 +7,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" - "time" ) type SyncClient interface { RequestFactory - ocache.ObjectLastUsage BroadcastAsync(message *treechangeproto.TreeSyncMessage) (err error) BroadcastAsyncOrSendResponsible(message *treechangeproto.TreeSyncMessage) (err error) SendAsync(peerId string, message *treechangeproto.TreeSyncMessage, replyId string) (err error) @@ -42,10 +39,6 @@ func newSyncClient( } } -func (s *syncClient) LastUsage() time.Time { - return s.StreamPool.LastUsage() -} - func (s *syncClient) BroadcastAsync(message *treechangeproto.TreeSyncMessage) (err error) { s.notifyIfNeeded(message) objMsg, err := marshallTreeMessage(message, message.RootChange.Id, "") From f5b92751924d285a57d4f735ade4f0f0ee2023f0 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 24 Oct 2022 21:57:19 +0200 Subject: [PATCH 194/219] Test stream pool --- common/commonspace/syncservice/streampool.go | 6 +- .../syncservice/streampool_test.go | 339 ++++++++++++++++++ common/commonspace/syncservice/syncservice.go | 4 +- common/net/rpc/rpctest/server.go | 54 +++ 4 files changed, 399 insertions(+), 4 deletions(-) create mode 100644 common/commonspace/syncservice/streampool_test.go diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index 489d561f..e807ae14 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -245,7 +245,8 @@ func (s *streamPool) readPeerLoop(peerId string, stream spacesyncproto.SpaceStre Loop: for { - msg, err := stream.Recv() + var msg *spacesyncproto.ObjectSyncMessage + msg, err = stream.Recv() s.lastUsage.Store(time.Now().Unix()) if err != nil { break @@ -260,7 +261,8 @@ Loop: limiter <- struct{}{} }() } - return s.removePeer(peerId) + s.removePeer(peerId) + return } func (s *streamPool) removePeer(peerId string) (err error) { diff --git a/common/commonspace/syncservice/streampool_test.go b/common/commonspace/syncservice/streampool_test.go new file mode 100644 index 00000000..7540e02f --- /dev/null +++ b/common/commonspace/syncservice/streampool_test.go @@ -0,0 +1,339 @@ +package syncservice + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpctest" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/stretchr/testify/require" + "storj.io/drpc" + "testing" + "time" +) + +type testPeer struct { + id string + drpc.Conn +} + +func (t testPeer) Id() string { + return t.id +} + +func (t testPeer) LastUsage() time.Time { + return time.Now() +} + +func (t testPeer) UpdateLastUsage() {} + +type testServer struct { + stream chan spacesyncproto.DRPCSpace_StreamStream + addLog func(ctx context.Context, req *consensusproto.AddLogRequest) error + addRecord func(ctx context.Context, req *consensusproto.AddRecordRequest) error + releaseStream chan error + watchErrOnce bool +} + +func (t *testServer) HeadSync(ctx context.Context, request *spacesyncproto.HeadSyncRequest) (*spacesyncproto.HeadSyncResponse, error) { + panic("implement me") +} + +func (t *testServer) PushSpace(ctx context.Context, request *spacesyncproto.PushSpaceRequest) (*spacesyncproto.PushSpaceResponse, error) { + panic("implement me") +} + +func (t *testServer) Stream(stream spacesyncproto.DRPCSpace_StreamStream) error { + t.stream <- stream + return <-t.releaseStream +} + +func (t *testServer) waitStream(test *testing.T) spacesyncproto.DRPCSpace_StreamStream { + select { + case <-time.After(time.Second * 5): + test.Fatalf("waiteStream timeout") + case st := <-t.stream: + return st + } + return nil +} + +type fixture struct { + testServer *testServer + drpcTS *rpctest.TesServer + client spacesyncproto.DRPCSpaceClient + clientStream spacesyncproto.DRPCSpace_StreamStream + serverStream spacesyncproto.DRPCSpace_StreamStream + pool *streamPool + localId peer.ID + remoteId peer.ID +} + +func newFixture(t *testing.T, localId, remoteId peer.ID, handler MessageHandler) *fixture { + fx := &fixture{ + testServer: &testServer{}, + drpcTS: rpctest.NewTestServer(), + localId: localId, + remoteId: remoteId, + } + fx.testServer.stream = make(chan spacesyncproto.DRPCSpace_StreamStream, 1) + require.NoError(t, spacesyncproto.DRPCRegisterSpace(fx.drpcTS.Mux, fx.testServer)) + clientWrapper := rpctest.NewSecConnWrapper(nil, nil, localId, remoteId) + p := &testPeer{id: localId.String(), Conn: fx.drpcTS.DialWrapConn(nil, clientWrapper)} + fx.client = spacesyncproto.NewDRPCSpaceClient(p) + + var err error + fx.clientStream, err = fx.client.Stream(context.Background()) + require.NoError(t, err) + fx.serverStream = fx.testServer.waitStream(t) + fx.pool = newStreamPool(handler).(*streamPool) + + return fx +} + +func (fx *fixture) run(t *testing.T) chan error { + waitCh := make(chan error) + go func() { + err := fx.pool.AddAndReadStreamSync(fx.clientStream) + waitCh <- err + }() + + time.Sleep(time.Millisecond * 10) + fx.pool.Lock() + require.Equal(t, fx.pool.peerStreams[fx.remoteId.String()], fx.clientStream) + fx.pool.Unlock() + + return waitCh +} + +func TestStreamPool_AddAndReadStreamAsync(t *testing.T) { + remId := peer.ID("remoteId") + + t.Run("client close", func(t *testing.T) { + fx := newFixture(t, "", remId, nil) + waitCh := fx.run(t) + + err := fx.clientStream.Close() + require.NoError(t, err) + err = <-waitCh + + require.Error(t, err) + require.Nil(t, fx.pool.peerStreams[remId.String()]) + }) + t.Run("server close", func(t *testing.T) { + fx := newFixture(t, "", remId, nil) + waitCh := fx.run(t) + + err := fx.serverStream.Close() + require.NoError(t, err) + + err = <-waitCh + require.Error(t, err) + require.Nil(t, fx.pool.peerStreams[remId.String()]) + }) +} + +func TestStreamPool_Close(t *testing.T) { + remId := peer.ID("remoteId") + + t.Run("client 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) + }) +} + +func TestStreamPool_ReceiveMessage(t *testing.T) { + remId := peer.ID("remoteId") + t.Run("pool receive message from server", func(t *testing.T) { + objectId := "objectId" + msg := &spacesyncproto.ObjectSyncMessage{ + ObjectId: objectId, + } + recvChan := make(chan struct{}) + fx := newFixture(t, "", remId, func(ctx context.Context, senderId string, message *spacesyncproto.ObjectSyncMessage) (err error) { + require.Equal(t, msg, message) + recvChan <- struct{}{} + return nil + }) + waitCh := fx.run(t) + + err := fx.serverStream.Send(msg) + require.NoError(t, err) + <-recvChan + err = fx.clientStream.Close() + require.NoError(t, err) + err = <-waitCh + + require.Error(t, err) + require.Nil(t, fx.pool.peerStreams[remId.String()]) + }) +} + +func TestStreamPool_HasActiveStream(t *testing.T) { + remId := peer.ID("remoteId") + t.Run("pool has active stream", func(t *testing.T) { + fx := newFixture(t, "", remId, nil) + waitCh := fx.run(t) + require.True(t, fx.pool.HasActiveStream(remId.String())) + + err := fx.clientStream.Close() + require.NoError(t, err) + err = <-waitCh + + require.Error(t, err) + require.Nil(t, fx.pool.peerStreams[remId.String()]) + }) + t.Run("pool has no active stream", func(t *testing.T) { + fx := newFixture(t, "", remId, nil) + waitCh := fx.run(t) + err := fx.clientStream.Close() + require.NoError(t, err) + err = <-waitCh + require.Error(t, err) + require.False(t, fx.pool.HasActiveStream(remId.String())) + require.Nil(t, fx.pool.peerStreams[remId.String()]) + }) +} + +func TestStreamPool_SendAsync(t *testing.T) { + remId := peer.ID("remoteId") + t.Run("pool send async to server", func(t *testing.T) { + objectId := "objectId" + msg := &spacesyncproto.ObjectSyncMessage{ + ObjectId: objectId, + } + fx := newFixture(t, "", remId, nil) + recvChan := make(chan struct{}) + go func() { + message, err := fx.serverStream.Recv() + require.NoError(t, err) + require.Equal(t, msg, message) + recvChan <- struct{}{} + }() + waitCh := fx.run(t) + + err := fx.pool.SendAsync([]string{remId.String()}, msg) + require.NoError(t, err) + <-recvChan + err = fx.clientStream.Close() + require.NoError(t, err) + err = <-waitCh + + require.Error(t, err) + require.Nil(t, fx.pool.peerStreams[remId.String()]) + }) +} + +func TestStreamPool_SendSync(t *testing.T) { + remId := peer.ID("remoteId") + t.Run("pool send sync to server", func(t *testing.T) { + objectId := "objectId" + payload := []byte("payload") + msg := &spacesyncproto.ObjectSyncMessage{ + ObjectId: objectId, + } + fx := newFixture(t, "", remId, nil) + go func() { + message, err := fx.serverStream.Recv() + require.NoError(t, err) + require.Equal(t, msg.ObjectId, message.ObjectId) + require.NotEmpty(t, message.ReplyId) + message.Payload = payload + err = fx.serverStream.Send(message) + require.NoError(t, err) + }() + waitCh := fx.run(t) + res, err := fx.pool.SendSync(remId.String(), msg) + require.NoError(t, err) + require.Equal(t, payload, res.Payload) + err = fx.clientStream.Close() + require.NoError(t, err) + err = <-waitCh + + require.Error(t, err) + require.Nil(t, fx.pool.peerStreams[remId.String()]) + }) + + t.Run("pool send sync timeout", func(t *testing.T) { + objectId := "objectId" + msg := &spacesyncproto.ObjectSyncMessage{ + ObjectId: objectId, + } + fx := newFixture(t, "", remId, nil) + syncWaitPeriod = time.Millisecond * 30 + go func() { + message, err := fx.serverStream.Recv() + require.NoError(t, err) + require.Equal(t, msg.ObjectId, message.ObjectId) + require.NotEmpty(t, message.ReplyId) + }() + waitCh := fx.run(t) + _, err := fx.pool.SendSync(remId.String(), msg) + require.Equal(t, ErrSyncTimeout, err) + err = fx.clientStream.Close() + require.NoError(t, err) + err = <-waitCh + + require.Error(t, err) + require.Nil(t, fx.pool.peerStreams[remId.String()]) + }) +} + +func TestStreamPool_BroadcastAsync(t *testing.T) { + remId := peer.ID("remoteId") + t.Run("pool broadcast async to server", func(t *testing.T) { + objectId := "objectId" + msg := &spacesyncproto.ObjectSyncMessage{ + ObjectId: objectId, + } + fx := newFixture(t, "", remId, nil) + recvChan := make(chan struct{}) + go func() { + message, err := fx.serverStream.Recv() + require.NoError(t, err) + require.Equal(t, msg, message) + recvChan <- struct{}{} + }() + waitCh := fx.run(t) + + err := fx.pool.BroadcastAsync(msg) + require.NoError(t, err) + <-recvChan + err = fx.clientStream.Close() + require.NoError(t, err) + err = <-waitCh + + require.Error(t, err) + require.Nil(t, fx.pool.peerStreams[remId.String()]) + }) +} diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 38de40f8..40149b78 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -104,7 +104,7 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { stream, err := s.clientFactory.Client(peer).Stream(ctx) if err != nil { err = rpcerr.Unwrap(err) - log.With("spaceId", s.spaceId).Errorf("failed to open stream: %v", err) + log.With("spaceId", s.spaceId).Errorf("failed to open clientStream: %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 @@ -113,7 +113,7 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { err = stream.Send(&spacesyncproto.ObjectSyncMessage{SpaceId: s.spaceId}) if err != nil { err = rpcerr.Unwrap(err) - log.With("spaceId", s.spaceId).Errorf("failed to send first message to stream: %v", err) + log.With("spaceId", s.spaceId).Errorf("failed to send first message to clientStream: %v", err) continue } s.streamPool.AddAndReadStreamAsync(stream) diff --git a/common/net/rpc/rpctest/server.go b/common/net/rpc/rpctest/server.go index 270067e4..134ce6cb 100644 --- a/common/net/rpc/rpctest/server.go +++ b/common/net/rpc/rpctest/server.go @@ -2,6 +2,8 @@ package rpctest import ( "context" + "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" "net" "storj.io/drpc" "storj.io/drpc/drpcconn" @@ -9,6 +11,48 @@ import ( "storj.io/drpc/drpcserver" ) +type SecConnMock struct { + net.Conn + localPrivKey crypto.PrivKey + remotePubKey crypto.PubKey + localId peer.ID + remoteId peer.ID +} + +func (s *SecConnMock) LocalPeer() peer.ID { + return s.localId +} + +func (s *SecConnMock) LocalPrivateKey() crypto.PrivKey { + return s.localPrivKey +} + +func (s *SecConnMock) RemotePeer() peer.ID { + return s.remoteId +} + +func (s *SecConnMock) RemotePublicKey() crypto.PubKey { + return s.remotePubKey +} + +type ConnWrapper func(conn net.Conn) net.Conn + +func NewSecConnWrapper( + localPrivKey crypto.PrivKey, + remotePubKey crypto.PubKey, + localId peer.ID, + remoteId peer.ID) ConnWrapper { + return func(conn net.Conn) net.Conn { + return &SecConnMock{ + Conn: conn, + localPrivKey: localPrivKey, + remotePubKey: remotePubKey, + localId: localId, + remoteId: remoteId, + } + } +} + func NewTestServer() *TesServer { ts := &TesServer{ Mux: drpcmux.New(), @@ -23,7 +67,17 @@ type TesServer struct { } func (ts *TesServer) Dial() drpc.Conn { + return ts.DialWrapConn(nil, nil) +} + +func (ts *TesServer) DialWrapConn(serverWrapper ConnWrapper, clientWrapper ConnWrapper) drpc.Conn { sc, cc := net.Pipe() + if serverWrapper != nil { + sc = serverWrapper(sc) + } + if clientWrapper != nil { + cc = clientWrapper(cc) + } go ts.Server.ServeOne(context.Background(), sc) return drpcconn.New(cc) } From 600ae38c0fbee68861c72908369b7173c671cea2 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 25 Oct 2022 12:16:04 +0200 Subject: [PATCH 195/219] Fix ocache closing --- common/pkg/ocache/ocache.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/common/pkg/ocache/ocache.go b/common/pkg/ocache/ocache.go index 41555e42..629a5864 100644 --- a/common/pkg/ocache/ocache.go +++ b/common/pkg/ocache/ocache.go @@ -409,9 +409,13 @@ func (c *oCache) Close() (err error) { } c.closed = true close(c.closeCh) - var toClose []*entry + var toClose, alreadyClosing []*entry for _, e := range c.data { - toClose = append(toClose, e) + if e.isClosing { + alreadyClosing = append(alreadyClosing, e) + } else { + toClose = append(toClose, e) + } } c.mu.Unlock() for _, e := range toClose { @@ -422,5 +426,8 @@ func (c *oCache) Close() (err error) { } } } + for _, e := range alreadyClosing { + <-e.close + } return nil } From 7b5c51a198aaee97c591e45cb0e5866f21f3b462 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 26 Oct 2022 12:55:47 +0200 Subject: [PATCH 196/219] Change tree methods and start adding tree tests --- client/storage/liststorage.go | 4 +- client/storage/spacestorage.go | 4 +- client/storage/treestorage.go | 24 ++++----- common/commonspace/service.go | 4 +- common/commonspace/storage/storage.go | 8 +-- common/commonspace/synctree/synctree.go | 1 - common/pkg/acl/list/list.go | 12 ++--- common/pkg/acl/storage/inmemory.go | 17 +++--- common/pkg/acl/storage/liststorage.go | 2 +- common/pkg/acl/storage/provider.go | 1 - common/pkg/acl/storage/storage.go | 5 -- common/pkg/acl/storage/treestorage.go | 2 +- .../acllistbuilder/liststoragebuilder.go | 4 +- common/pkg/acl/tree/objecttree_test.go | 8 +-- common/pkg/acl/tree/objecttreefactory.go | 19 +++---- node/storage/liststorage.go | 4 +- node/storage/spacestorage.go | 4 +- node/storage/treestorage.go | 28 +++++----- node/storage/treestorage_test.go | 54 +++++++++++++++++++ 19 files changed, 120 insertions(+), 85 deletions(-) delete mode 100644 common/pkg/acl/storage/storage.go create mode 100644 node/storage/treestorage_test.go diff --git a/client/storage/liststorage.go b/client/storage/liststorage.go index 3d784c31..6fad213d 100644 --- a/client/storage/liststorage.go +++ b/client/storage/liststorage.go @@ -77,8 +77,8 @@ func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *acl return } -func (l *listStorage) ID() (string, error) { - return l.id, nil +func (l *listStorage) ID() string { + return l.id } func (l *listStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { diff --git a/client/storage/spacestorage.go b/client/storage/spacestorage.go index f0b65045..58f43482 100644 --- a/client/storage/spacestorage.go +++ b/client/storage/spacestorage.go @@ -77,8 +77,8 @@ func createSpaceStorage(db *badger.DB, payload spacestorage.SpaceStorageCreatePa return } -func (s *spaceStorage) ID() (string, error) { - return s.spaceId, nil +func (s *spaceStorage) ID() string { + return s.spaceId } func (s *spaceStorage) TreeStorage(id string) (storage2.TreeStorage, error) { diff --git a/client/storage/treestorage.go b/client/storage/treestorage.go index bede0bc5..60c74c9f 100644 --- a/client/storage/treestorage.go +++ b/client/storage/treestorage.go @@ -2,7 +2,7 @@ package storage import ( "context" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/dgraph-io/badger/v3" ) @@ -14,7 +14,7 @@ type treeStorage struct { root *treechangeproto.RawTreeChangeWithId } -func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage2.TreeStorage, err error) { +func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStorage, err error) { keys := newTreeKeys(spaceId, treeId) err = db.View(func(txn *badger.Txn) error { _, err := txn.Get(keys.RootIdKey()) @@ -43,14 +43,14 @@ func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage2.TreeStor return } -func createTreeStorage(db *badger.DB, spaceId string, payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { - keys := newTreeKeys(spaceId, payload.TreeId) +func createTreeStorage(db *badger.DB, spaceId string, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { + keys := newTreeKeys(spaceId, payload.RootRawChange.Id) if hasDB(db, keys.RootIdKey()) { - err = storage2.ErrTreeExists + err = storage.ErrTreeExists return } err = db.Update(func(txn *badger.Txn) error { - heads := storage2.CreateHeadsPayload(payload.Heads) + heads := storage.CreateHeadsPayload(payload.Heads) for _, ch := range payload.Changes { err = txn.Set(keys.RawChangeKey(ch.Id), ch.GetRawChange()) @@ -85,8 +85,8 @@ func createTreeStorage(db *badger.DB, spaceId string, payload storage2.TreeStora return } -func (t *treeStorage) ID() (string, error) { - return t.id, nil +func (t *treeStorage) ID() string { + return t.id } func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err error) { @@ -97,16 +97,16 @@ func (t *treeStorage) Heads() (heads []string, err error) { headsBytes, err := getDB(t.db, t.keys.HeadsKey()) if err != nil { if err == badger.ErrKeyNotFound { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId } return } - heads = storage2.ParseHeads(headsBytes) + heads = storage.ParseHeads(headsBytes) return } func (t *treeStorage) SetHeads(heads []string) (err error) { - payload := storage2.CreateHeadsPayload(heads) + payload := storage.CreateHeadsPayload(heads) return putDB(t.db, t.keys.HeadsKey(), payload) } @@ -118,7 +118,7 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha res, err := getDB(t.db, t.keys.RawChangeKey(id)) if err != nil { if err == badger.ErrKeyNotFound { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId } return } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 53e22aee..8ab4d9f5 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -64,7 +64,7 @@ func (s *service) CreateSpace( return } - return store.ID() + return store.ID(), nil } func (s *service) DeriveSpace( @@ -79,7 +79,7 @@ func (s *service) DeriveSpace( return } - return store.ID() + return store.ID(), nil } func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index eeee74a2..a469a4b1 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -6,7 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" ) const CName = "commonspace.storage" @@ -15,9 +15,9 @@ var ErrSpaceStorageExists = errors.New("space storage exists") var ErrSpaceStorageMissing = errors.New("space storage missing") type SpaceStorage interface { - storage2.Storage - storage2.Provider - ACLStorage() (storage2.ListStorage, error) + storage.Provider + ID() string + ACLStorage() (storage.ListStorage, error) SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) StoredIds() ([]string, error) Close() error diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 17bbcb84..f1bcbb3a 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -155,7 +155,6 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t fullSyncResp := resp.GetContent().GetFullSyncResponse() payload := storage.TreeStorageCreatePayload{ - TreeId: id, RootRawChange: resp.RootChange, Changes: fullSyncResp.Changes, Heads: fullSyncResp.Heads, diff --git a/common/pkg/acl/list/list.go b/common/pkg/acl/list/list.go index a86b2bc8..147d2224 100644 --- a/common/pkg/acl/list/list.go +++ b/common/pkg/acl/list/list.go @@ -50,20 +50,14 @@ type aclList struct { } func BuildACLListWithIdentity(acc *account.AccountData, storage storage.ListStorage) (ACLList, error) { - id, err := storage.ID() - if err != nil { - return nil, err - } + id := storage.ID() builder := newACLStateBuilderWithIdentity(acc) return build(id, builder, newACLRecordBuilder(id, common.NewKeychain()), storage) } func BuildACLList(storage storage.ListStorage) (ACLList, error) { - id, err := storage.ID() - if err != nil { - return nil, err - } - return build(id, newACLStateBuilder(), newACLRecordBuilder(id, common.NewKeychain()), storage) + id := storage.ID() + return build(storage.ID(), newACLStateBuilder(), newACLRecordBuilder(id, common.NewKeychain()), storage) } func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage storage.ListStorage) (list ACLList, err error) { diff --git a/common/pkg/acl/storage/inmemory.go b/common/pkg/acl/storage/inmemory.go index 11843de7..5c39e94d 100644 --- a/common/pkg/acl/storage/inmemory.go +++ b/common/pkg/acl/storage/inmemory.go @@ -56,10 +56,10 @@ func (i *inMemoryACLListStorage) AddRawRecord(ctx context.Context, rec *aclrecor panic("implement me") } -func (i *inMemoryACLListStorage) ID() (string, error) { +func (i *inMemoryACLListStorage) ID() string { i.RLock() defer i.RUnlock() - return i.id, nil + return i.id } type inMemoryTreeStorage struct { @@ -72,7 +72,6 @@ type inMemoryTreeStorage struct { } func NewInMemoryTreeStorage( - treeId string, root *treechangeproto.RawTreeChangeWithId, heads []string, changes []*treechangeproto.RawTreeChangeWithId) (TreeStorage, error) { @@ -80,10 +79,10 @@ func NewInMemoryTreeStorage( for _, ch := range changes { allChanges[ch.Id] = ch } - allChanges[treeId] = root + allChanges[root.Id] = root return &inMemoryTreeStorage{ - id: treeId, + id: root.Id, root: root, heads: heads, changes: allChanges, @@ -96,10 +95,10 @@ func (t *inMemoryTreeStorage) HasChange(ctx context.Context, id string) (bool, e return exists, nil } -func (t *inMemoryTreeStorage) ID() (string, error) { +func (t *inMemoryTreeStorage) ID() string { t.RLock() defer t.RUnlock() - return t.id, nil + return t.id } func (t *inMemoryTreeStorage) Root() (*treechangeproto.RawTreeChangeWithId, error) { @@ -159,12 +158,12 @@ func (i *inMemoryStorageProvider) TreeStorage(id string) (TreeStorage, error) { func (i *inMemoryStorageProvider) CreateTreeStorage(payload TreeStorageCreatePayload) (TreeStorage, error) { i.Lock() defer i.Unlock() - res, err := NewInMemoryTreeStorage(payload.TreeId, payload.RootRawChange, payload.Heads, payload.Changes) + res, err := NewInMemoryTreeStorage(payload.RootRawChange, payload.Heads, payload.Changes) if err != nil { return nil, err } - i.objects[payload.TreeId] = res + i.objects[payload.RootRawChange.Id] = res return res, nil } diff --git a/common/pkg/acl/storage/liststorage.go b/common/pkg/acl/storage/liststorage.go index 42f80110..81bb43cc 100644 --- a/common/pkg/acl/storage/liststorage.go +++ b/common/pkg/acl/storage/liststorage.go @@ -12,7 +12,7 @@ var ErrACLExists = errors.New("acl already exists") var ErrUnknownRecord = errors.New("record doesn't exist") type ListStorage interface { - Storage + ID() string Root() (*aclrecordproto.RawACLRecordWithId, error) Head() (string, error) SetHead(headId string) error diff --git a/common/pkg/acl/storage/provider.go b/common/pkg/acl/storage/provider.go index da46ab41..51b53b4f 100644 --- a/common/pkg/acl/storage/provider.go +++ b/common/pkg/acl/storage/provider.go @@ -10,7 +10,6 @@ var ErrTreeExists = errors.New("tree already exists") var ErrUnkownChange = errors.New("change doesn't exist") type TreeStorageCreatePayload struct { - TreeId string RootRawChange *treechangeproto.RawTreeChangeWithId Changes []*treechangeproto.RawTreeChangeWithId Heads []string diff --git a/common/pkg/acl/storage/storage.go b/common/pkg/acl/storage/storage.go deleted file mode 100644 index 42af1815..00000000 --- a/common/pkg/acl/storage/storage.go +++ /dev/null @@ -1,5 +0,0 @@ -package storage - -type Storage interface { - ID() (string, error) -} diff --git a/common/pkg/acl/storage/treestorage.go b/common/pkg/acl/storage/treestorage.go index 76332399..751dd1d9 100644 --- a/common/pkg/acl/storage/treestorage.go +++ b/common/pkg/acl/storage/treestorage.go @@ -6,7 +6,7 @@ import ( ) type TreeStorage interface { - Storage + ID() string Root() (*treechangeproto.RawTreeChangeWithId, error) Heads() ([]string, error) SetHeads(heads []string) error diff --git a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index cf515bfd..6777777c 100644 --- a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -120,8 +120,8 @@ func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclrecord panic("implement me") } -func (t *ACLListStorageBuilder) ID() (string, error) { - return t.id, nil +func (t *ACLListStorageBuilder) ID() string { + return t.id } func (t *ACLListStorageBuilder) GetRawRecords() []*aclrecordproto2.RawACLRecordWithId { diff --git a/common/pkg/acl/tree/objecttree_test.go b/common/pkg/acl/tree/objecttree_test.go index e2a2b028..da9f2364 100644 --- a/common/pkg/acl/tree/objecttree_test.go +++ b/common/pkg/acl/tree/objecttree_test.go @@ -3,7 +3,7 @@ package tree import ( "context" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/acllistbuilder" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/stretchr/testify/assert" @@ -53,9 +53,9 @@ func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot b } } -func (c *mockChangeCreator) createNewTreeStorage(treeId, aclHeadId string) storage2.TreeStorage { +func (c *mockChangeCreator) createNewTreeStorage(treeId, aclHeadId string) storage.TreeStorage { root := c.createRoot(treeId, aclHeadId) - treeStorage, _ := storage2.NewInMemoryTreeStorage(treeId, root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root}) + treeStorage, _ := storage.NewInMemoryTreeStorage(root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root}) return treeStorage } @@ -95,7 +95,7 @@ func (m *mockChangeValidator) ValidateFullTree(tree *Tree, aclList list.ACLList) type testTreeContext struct { aclList list.ACLList - treeStorage storage2.TreeStorage + treeStorage storage.TreeStorage changeBuilder *mockChangeBuilder changeCreator *mockChangeCreator objTree ObjectTree diff --git a/common/pkg/acl/tree/objecttreefactory.go b/common/pkg/acl/tree/objecttreefactory.go index 94459020..ca097505 100644 --- a/common/pkg/acl/tree/objecttreefactory.go +++ b/common/pkg/acl/tree/objecttreefactory.go @@ -3,7 +3,7 @@ package tree import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" @@ -20,7 +20,7 @@ type ObjectTreeCreatePayload struct { Identity []byte } -func BuildObjectTree(treeStorage storage2.TreeStorage, aclList list.ACLList) (ObjectTree, error) { +func BuildObjectTree(treeStorage storage.TreeStorage, aclList list.ACLList) (ObjectTree, error) { rootChange, err := treeStorage.Root() if err != nil { return nil, err @@ -32,14 +32,14 @@ func BuildObjectTree(treeStorage storage2.TreeStorage, aclList list.ACLList) (Ob func CreateDerivedObjectTree( payload ObjectTreeCreatePayload, aclList list.ACLList, - createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { return createObjectTree(payload, 0, nil, aclList, createStorage) } func CreateObjectTree( payload ObjectTreeCreatePayload, aclList list.ACLList, - createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { bytes := make([]byte, 32) _, err = rand.Read(bytes) if err != nil { @@ -53,7 +53,7 @@ func createObjectTree( timestamp int64, seed []byte, aclList list.ACLList, - createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { + createStorage storage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) { aclList.RLock() aclHeadId := aclList.Head().Id aclList.RUnlock() @@ -77,8 +77,7 @@ func createObjectTree( } // create storage - st, err := createStorage(storage2.TreeStorageCreatePayload{ - TreeId: raw.Id, + st, err := createStorage(storage.TreeStorageCreatePayload{ RootRawChange: raw, Changes: []*treechangeproto.RawTreeChangeWithId{raw}, Heads: []string{raw.Id}, @@ -127,11 +126,7 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { } } - objTree.id, err = objTree.treeStorage.ID() - if err != nil { - return nil, err - } - + objTree.id = objTree.treeStorage.ID() objTree.root, err = objTree.treeStorage.Root() if err != nil { return nil, err diff --git a/node/storage/liststorage.go b/node/storage/liststorage.go index c3ba4f92..1247b2e8 100644 --- a/node/storage/liststorage.go +++ b/node/storage/liststorage.go @@ -82,8 +82,8 @@ func createListStorage(db *pogreb.DB, root *aclrecordproto.RawACLRecordWithId) ( return } -func (l *listStorage) ID() (string, error) { - return l.id, nil +func (l *listStorage) ID() string { + return l.id } func (l *listStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index f82d85ba..fc2f073a 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -129,8 +129,8 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate return } -func (s *spaceStorage) ID() (string, error) { - return s.spaceId, nil +func (s *spaceStorage) ID() string { + return s.spaceId } func (s *spaceStorage) TreeStorage(id string) (storage2.TreeStorage, error) { diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index 7ad33aa1..9b92379d 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -3,7 +3,7 @@ package storage import ( "context" "github.com/akrylysov/pogreb" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" ) @@ -14,14 +14,14 @@ type treeStorage struct { root *treechangeproto.RawTreeChangeWithId } -func newTreeStorage(db *pogreb.DB, treeId string) (ts storage2.TreeStorage, err error) { +func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) { keys := newTreeKeys(treeId) heads, err := db.Get(keys.HeadsKey()) if err != nil { return } if heads == nil { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId return } @@ -30,7 +30,7 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage2.TreeStorage, err return } if root == nil { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId return } @@ -47,18 +47,18 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage2.TreeStorage, err return } -func createTreeStorage(db *pogreb.DB, payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { - keys := newTreeKeys(payload.TreeId) +func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { + keys := newTreeKeys(payload.RootRawChange.Id) has, err := db.Has(keys.HeadsKey()) if err != nil { return } if has { - err = storage2.ErrTreeExists + err = storage.ErrTreeExists return } - heads := storage2.CreateHeadsPayload(payload.Heads) + heads := storage.CreateHeadsPayload(payload.Heads) for _, ch := range payload.Changes { err = db.Put(keys.RawChangeKey(ch.Id), ch.GetRawChange()) @@ -86,8 +86,8 @@ func createTreeStorage(db *pogreb.DB, payload storage2.TreeStorageCreatePayload) return } -func (t *treeStorage) ID() (string, error) { - return t.id, nil +func (t *treeStorage) ID() string { + return t.id } func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err error) { @@ -100,15 +100,15 @@ func (t *treeStorage) Heads() (heads []string, err error) { return } if headsBytes == nil { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId return } - heads = storage2.ParseHeads(headsBytes) + heads = storage.ParseHeads(headsBytes) return } func (t *treeStorage) SetHeads(heads []string) (err error) { - payload := storage2.CreateHeadsPayload(heads) + payload := storage.CreateHeadsPayload(heads) return t.db.Put(t.keys.HeadsKey(), payload) } @@ -122,7 +122,7 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha return } if res == nil { - err = storage2.ErrUnkownChange + err = storage.ErrUnkownChange } raw = &treechangeproto.RawTreeChangeWithId{ diff --git a/node/storage/treestorage_test.go b/node/storage/treestorage_test.go new file mode 100644 index 00000000..07d33165 --- /dev/null +++ b/node/storage/treestorage_test.go @@ -0,0 +1,54 @@ +package storage + +import ( + "context" + "github.com/akrylysov/pogreb" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" + "github.com/stretchr/testify/require" + "os" + "testing" +) + +type fixture struct { + db *pogreb.DB +} + +func newFixture(t *testing.T) *fixture { + dir, err := os.MkdirTemp("", "") + require.NoError(t, err) + db, err := pogreb.Open(dir, nil) + require.NoError(t, err) + return &fixture{db: db} +} + +func (fx *fixture) stop(t *testing.T) { + require.NoError(t, fx.db.Close()) +} + +func TestTreeStorage_CreateTreeStorage(t *testing.T) { + fx := newFixture(t) + defer fx.stop(t) + + rootRawChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some"), Id: "rootId"} + otherChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some other"), Id: "otherId"} + changes := []*treechangeproto.RawTreeChangeWithId{rootRawChange, otherChange} + payload := storage.TreeStorageCreatePayload{ + RootRawChange: rootRawChange, + Changes: changes, + Heads: []string{rootRawChange.Id}, + } + store, err := createTreeStorage(fx.db, payload) + require.NoError(t, err) + require.Equal(t, payload.RootRawChange.Id, store.ID()) + + root, err := store.Root() + require.NoError(t, err) + require.Equal(t, root, rootRawChange) + + for _, ch := range changes { + dbCh, err := store.GetRawChange(context.Background(), ch.Id) + require.NoError(t, err) + require.Equal(t, ch, dbCh) + } +} From 6a6b750b4e7957afd2dc72b4e90dd6299dc0038f Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 26 Oct 2022 13:27:57 +0200 Subject: [PATCH 197/219] Add more tree tests --- node/storage/treestorage_test.go | 108 ++++++++++++++++++++++++------- 1 file changed, 85 insertions(+), 23 deletions(-) diff --git a/node/storage/treestorage_test.go b/node/storage/treestorage_test.go index 07d33165..98bc5ecd 100644 --- a/node/storage/treestorage_test.go +++ b/node/storage/treestorage_test.go @@ -10,45 +10,107 @@ import ( "testing" ) +func treeTestPayload() storage.TreeStorageCreatePayload { + rootRawChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some"), Id: "rootId"} + otherChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some other"), Id: "otherId"} + changes := []*treechangeproto.RawTreeChangeWithId{rootRawChange, otherChange} + return storage.TreeStorageCreatePayload{ + RootRawChange: rootRawChange, + Changes: changes, + Heads: []string{rootRawChange.Id}, + } +} + type fixture struct { - db *pogreb.DB + dir string + db *pogreb.DB } func newFixture(t *testing.T) *fixture { dir, err := os.MkdirTemp("", "") require.NoError(t, err) - db, err := pogreb.Open(dir, nil) + return &fixture{dir: dir} +} + +func (fx *fixture) open(t *testing.T) { + var err error + fx.db, err = pogreb.Open(fx.dir, nil) require.NoError(t, err) - return &fixture{db: db} +} + +func (fx *fixture) testPayloadInDB(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { + require.Equal(t, payload.RootRawChange.Id, store.ID()) + + root, err := store.Root() + require.NoError(t, err) + require.Equal(t, root, payload.RootRawChange) + + heads, err := store.Heads() + require.NoError(t, err) + require.Equal(t, payload.Heads, heads) + + for _, ch := range payload.Changes { + dbCh, err := store.GetRawChange(context.Background(), ch.Id) + require.NoError(t, err) + require.Equal(t, ch, dbCh) + } + return } func (fx *fixture) stop(t *testing.T) { require.NoError(t, fx.db.Close()) } -func TestTreeStorage_CreateTreeStorage(t *testing.T) { +func TestTreeStorage(t *testing.T) { fx := newFixture(t) + fx.open(t) defer fx.stop(t) - rootRawChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some"), Id: "rootId"} - otherChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some other"), Id: "otherId"} - changes := []*treechangeproto.RawTreeChangeWithId{rootRawChange, otherChange} - payload := storage.TreeStorageCreatePayload{ - RootRawChange: rootRawChange, - Changes: changes, - Heads: []string{rootRawChange.Id}, - } + payload := treeTestPayload() store, err := createTreeStorage(fx.db, payload) require.NoError(t, err) - require.Equal(t, payload.RootRawChange.Id, store.ID()) - - root, err := store.Root() - require.NoError(t, err) - require.Equal(t, root, rootRawChange) - - for _, ch := range changes { - dbCh, err := store.GetRawChange(context.Background(), ch.Id) - require.NoError(t, err) - require.Equal(t, ch, dbCh) - } + fx.testPayloadInDB(t, store, payload) +} + +func TestTreeStorage_Methods(t *testing.T) { + fx := newFixture(t) + fx.open(t) + payload := treeTestPayload() + _, err := createTreeStorage(fx.db, payload) + require.NoError(t, err) + fx.stop(t) + + fx.open(t) + defer fx.stop(t) + store, err := newTreeStorage(fx.db, payload.RootRawChange.Id) + require.NoError(t, err) + fx.testPayloadInDB(t, store, payload) + + t.Run("update heads", func(t *testing.T) { + newHeads := []string{"a", "b"} + require.NoError(t, store.SetHeads(newHeads)) + heads, err := store.Heads() + require.NoError(t, err) + require.Equal(t, newHeads, heads) + }) + + t.Run("add raw change, get change and has change", func(t *testing.T) { + newChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("ab"), Id: "newId"} + require.NoError(t, store.AddRawChange(newChange)) + rawCh, err := store.GetRawChange(context.Background(), newChange.Id) + require.NoError(t, err) + require.Equal(t, newChange, rawCh) + has, err := store.HasChange(context.Background(), newChange.Id) + require.NoError(t, err) + require.True(t, has) + }) + + t.Run("get and has for unknown change", func(t *testing.T) { + incorrectId := "incorrectId" + _, err := store.GetRawChange(context.Background(), incorrectId) + require.Error(t, err) + has, err := store.HasChange(context.Background(), incorrectId) + require.NoError(t, err) + require.False(t, has) + }) } From 6497e461bddb64215fd80953fd816cedf3f4ad01 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 26 Oct 2022 14:18:44 +0200 Subject: [PATCH 198/219] Add list storage --- node/storage/liststorage_test.go | 63 ++++++++++++++++++++++++++++++++ node/storage/treestorage_test.go | 8 ++-- 2 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 node/storage/liststorage_test.go diff --git a/node/storage/liststorage_test.go b/node/storage/liststorage_test.go new file mode 100644 index 00000000..f0a35471 --- /dev/null +++ b/node/storage/liststorage_test.go @@ -0,0 +1,63 @@ +package storage + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/stretchr/testify/require" + "testing" +) + +func (fx *fixture) testListInDB(t *testing.T, store storage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) { + require.Equal(t, store.ID(), root.Id) + + aclRoot, err := store.Root() + require.NoError(t, err) + require.Equal(t, root, aclRoot) + + aclHead, err := store.Head() + require.NoError(t, err) + require.Equal(t, head, aclHead) +} + +func TestListStorage_Create(t *testing.T) { + fx := newFixture(t) + fx.open(t) + defer fx.stop(t) + + aclRoot := &aclrecordproto.RawACLRecordWithId{Payload: []byte("root"), Id: "someRootId"} + listStore, err := createListStorage(fx.db, aclRoot) + require.NoError(t, err) + fx.testListInDB(t, listStore, aclRoot, aclRoot.Id) +} + +func TestListStorage_Methods(t *testing.T) { + fx := newFixture(t) + fx.open(t) + aclRoot := &aclrecordproto.RawACLRecordWithId{Payload: []byte("root"), Id: "someRootId"} + _, err := createListStorage(fx.db, aclRoot) + require.NoError(t, err) + fx.stop(t) + + fx.open(t) + defer fx.stop(t) + listStore, err := newListStorage(fx.db) + require.NoError(t, err) + fx.testListInDB(t, listStore, aclRoot, aclRoot.Id) + + t.Run("set head", func(t *testing.T) { + head := "newHead" + require.NoError(t, listStore.SetHead(head)) + aclHead, err := listStore.Head() + require.NoError(t, err) + require.Equal(t, head, aclHead) + }) + + t.Run("add raw record and get raw record", func(t *testing.T) { + newRec := &aclrecordproto.RawACLRecordWithId{Payload: []byte("rec"), Id: "someRecId"} + require.NoError(t, listStore.AddRawRecord(context.Background(), newRec)) + aclRec, err := listStore.GetRawRecord(context.Background(), newRec.Id) + require.NoError(t, err) + require.Equal(t, newRec, aclRec) + }) +} diff --git a/node/storage/treestorage_test.go b/node/storage/treestorage_test.go index 98bc5ecd..c5e6feca 100644 --- a/node/storage/treestorage_test.go +++ b/node/storage/treestorage_test.go @@ -38,7 +38,7 @@ func (fx *fixture) open(t *testing.T) { require.NoError(t, err) } -func (fx *fixture) testPayloadInDB(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { +func (fx *fixture) testTreePayloadInDB(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { require.Equal(t, payload.RootRawChange.Id, store.ID()) root, err := store.Root() @@ -61,7 +61,7 @@ func (fx *fixture) stop(t *testing.T) { require.NoError(t, fx.db.Close()) } -func TestTreeStorage(t *testing.T) { +func TestTreeStorage_Create(t *testing.T) { fx := newFixture(t) fx.open(t) defer fx.stop(t) @@ -69,7 +69,7 @@ func TestTreeStorage(t *testing.T) { payload := treeTestPayload() store, err := createTreeStorage(fx.db, payload) require.NoError(t, err) - fx.testPayloadInDB(t, store, payload) + fx.testTreePayloadInDB(t, store, payload) } func TestTreeStorage_Methods(t *testing.T) { @@ -84,7 +84,7 @@ func TestTreeStorage_Methods(t *testing.T) { defer fx.stop(t) store, err := newTreeStorage(fx.db, payload.RootRawChange.Id) require.NoError(t, err) - fx.testPayloadInDB(t, store, payload) + fx.testTreePayloadInDB(t, store, payload) t.Run("update heads", func(t *testing.T) { newHeads := []string{"a", "b"} From 7a2d366bddf2593e279b670cc0377ed496681529 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Wed, 26 Oct 2022 17:00:43 +0300 Subject: [PATCH 199/219] node acl service (wip), fixes --- client/storage/liststorage.go | 4 +- client/storage/spacestorage.go | 14 +- client/storage/treestorage.go | 22 +- common/commonspace/service.go | 18 +- .../storage/mock_storage/mock_storage.go | 15 +- common/commonspace/storage/storage.go | 8 +- .../synctree/mock_synctree/mock_synctree.go | 15 - common/pkg/acl/aclrecordproto/aclrecord.pb.go | 829 ++++++++++++++++-- .../acl/aclrecordproto/protos/aclrecord.proto | 130 +-- common/pkg/acl/list/list.go | 12 +- common/pkg/acl/storage/inmemory.go | 8 +- common/pkg/acl/storage/liststorage.go | 2 +- .../acl/storage/mock_storage/mock_storage.go | 30 +- common/pkg/acl/storage/storage.go | 5 - common/pkg/acl/storage/treestorage.go | 2 +- .../acllistbuilder/liststoragebuilder.go | 4 +- common/pkg/acl/tree/objecttreefactory.go | 5 +- node/acl/service.go | 111 +++ node/acl/util.go | 19 + node/acl/util_test.go | 16 + node/acl/watcher.go | 93 ++ node/storage/liststorage.go | 4 +- node/storage/spacestorage.go | 14 +- node/storage/treestorage.go | 26 +- 24 files changed, 1168 insertions(+), 238 deletions(-) delete mode 100644 common/pkg/acl/storage/storage.go create mode 100644 node/acl/service.go create mode 100644 node/acl/util.go create mode 100644 node/acl/util_test.go create mode 100644 node/acl/watcher.go diff --git a/client/storage/liststorage.go b/client/storage/liststorage.go index 3d784c31..ea6fb886 100644 --- a/client/storage/liststorage.go +++ b/client/storage/liststorage.go @@ -77,8 +77,8 @@ func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *acl return } -func (l *listStorage) ID() (string, error) { - return l.id, nil +func (l *listStorage) Id() string { + return l.id } func (l *listStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { diff --git a/client/storage/spacestorage.go b/client/storage/spacestorage.go index f0b65045..8d41b298 100644 --- a/client/storage/spacestorage.go +++ b/client/storage/spacestorage.go @@ -3,7 +3,7 @@ package storage import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/dgraph-io/badger/v3" "sync" ) @@ -12,7 +12,7 @@ type spaceStorage struct { spaceId string objDb *badger.DB keys spaceKeys - aclStorage storage2.ListStorage + aclStorage storage.ListStorage header *spacesyncproto.RawSpaceHeaderWithId mx sync.Mutex } @@ -77,15 +77,15 @@ func createSpaceStorage(db *badger.DB, payload spacestorage.SpaceStorageCreatePa return } -func (s *spaceStorage) ID() (string, error) { - return s.spaceId, nil +func (s *spaceStorage) Id() string { + return s.spaceId } -func (s *spaceStorage) TreeStorage(id string) (storage2.TreeStorage, error) { +func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) { return newTreeStorage(s.objDb, s.spaceId, id) } -func (s *spaceStorage) CreateTreeStorage(payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { +func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { // we have mutex here, so we prevent overwriting the heads of a tree on concurrent creation s.mx.Lock() defer s.mx.Unlock() @@ -93,7 +93,7 @@ func (s *spaceStorage) CreateTreeStorage(payload storage2.TreeStorageCreatePaylo return createTreeStorage(s.objDb, s.spaceId, payload) } -func (s *spaceStorage) ACLStorage() (storage2.ListStorage, error) { +func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) { return s.aclStorage, nil } diff --git a/client/storage/treestorage.go b/client/storage/treestorage.go index bede0bc5..8c11f003 100644 --- a/client/storage/treestorage.go +++ b/client/storage/treestorage.go @@ -2,7 +2,7 @@ package storage import ( "context" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" "github.com/dgraph-io/badger/v3" ) @@ -14,7 +14,7 @@ type treeStorage struct { root *treechangeproto.RawTreeChangeWithId } -func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage2.TreeStorage, err error) { +func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStorage, err error) { keys := newTreeKeys(spaceId, treeId) err = db.View(func(txn *badger.Txn) error { _, err := txn.Get(keys.RootIdKey()) @@ -43,14 +43,14 @@ func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage2.TreeStor return } -func createTreeStorage(db *badger.DB, spaceId string, payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { +func createTreeStorage(db *badger.DB, spaceId string, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { keys := newTreeKeys(spaceId, payload.TreeId) if hasDB(db, keys.RootIdKey()) { - err = storage2.ErrTreeExists + err = storage.ErrTreeExists return } err = db.Update(func(txn *badger.Txn) error { - heads := storage2.CreateHeadsPayload(payload.Heads) + heads := storage.CreateHeadsPayload(payload.Heads) for _, ch := range payload.Changes { err = txn.Set(keys.RawChangeKey(ch.Id), ch.GetRawChange()) @@ -85,8 +85,8 @@ func createTreeStorage(db *badger.DB, spaceId string, payload storage2.TreeStora return } -func (t *treeStorage) ID() (string, error) { - return t.id, nil +func (t *treeStorage) Id() string { + return t.id } func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err error) { @@ -97,16 +97,16 @@ func (t *treeStorage) Heads() (heads []string, err error) { headsBytes, err := getDB(t.db, t.keys.HeadsKey()) if err != nil { if err == badger.ErrKeyNotFound { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId } return } - heads = storage2.ParseHeads(headsBytes) + heads = storage.ParseHeads(headsBytes) return } func (t *treeStorage) SetHeads(heads []string) (err error) { - payload := storage2.CreateHeadsPayload(heads) + payload := storage.CreateHeadsPayload(heads) return putDB(t.db, t.keys.HeadsKey(), payload) } @@ -118,7 +118,7 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha res, err := getDB(t.db, t.keys.RawChangeKey(id)) if err != nil { if err == badger.ErrKeyNotFound { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId } return } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 53e22aee..19c4bd40 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -9,7 +9,7 @@ import ( "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" - config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" ) @@ -30,7 +30,7 @@ type Service interface { } type service struct { - config config2.Space + config config.Space account account.Service configurationService nodeconf.Service storageProvider storage.SpaceStorageProvider @@ -39,7 +39,7 @@ type service struct { } func (s *service) Init(a *app.App) (err error) { - s.config = a.MustComponent(config2.CName).(*config2.Config).Space + s.config = a.MustComponent(config.CName).(*config.Config).Space s.account = a.MustComponent(account.CName).(account.Service) s.storageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.configurationService = a.MustComponent(nodeconf.CName).(nodeconf.Service) @@ -52,9 +52,7 @@ func (s *service) Name() (name string) { return CName } -func (s *service) CreateSpace( - ctx context.Context, - payload SpaceCreatePayload) (id string, err error) { +func (s *service) CreateSpace(ctx context.Context, payload SpaceCreatePayload) (id string, err error) { storageCreate, err := storagePayloadForSpaceCreate(payload) if err != nil { return @@ -64,12 +62,10 @@ func (s *service) CreateSpace( return } - return store.ID() + return store.Id(), nil } -func (s *service) DeriveSpace( - ctx context.Context, - payload SpaceDerivePayload) (id string, err error) { +func (s *service) DeriveSpace(ctx context.Context, payload SpaceDerivePayload) (id string, err error) { storageCreate, err := storagePayloadForSpaceDerive(payload) if err != nil { return @@ -79,7 +75,7 @@ func (s *service) DeriveSpace( return } - return store.ID() + return store.Id(), nil } func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { diff --git a/common/commonspace/storage/mock_storage/mock_storage.go b/common/commonspace/storage/mock_storage/mock_storage.go index 422af081..419c61fa 100644 --- a/common/commonspace/storage/mock_storage/mock_storage.go +++ b/common/commonspace/storage/mock_storage/mock_storage.go @@ -162,19 +162,18 @@ func (mr *MockSpaceStorageMockRecorder) CreateTreeStorage(arg0 interface{}) *gom return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTreeStorage", reflect.TypeOf((*MockSpaceStorage)(nil).CreateTreeStorage), arg0) } -// ID mocks base method. -func (m *MockSpaceStorage) ID() (string, error) { +// Id mocks base method. +func (m *MockSpaceStorage) Id() string { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ID") + ret := m.ctrl.Call(m, "Id") ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 + return ret0 } -// ID indicates an expected call of ID. -func (mr *MockSpaceStorageMockRecorder) ID() *gomock.Call { +// Id indicates an expected call of Id. +func (mr *MockSpaceStorageMockRecorder) Id() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockSpaceStorage)(nil).ID)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Id", reflect.TypeOf((*MockSpaceStorage)(nil).Id)) } // SpaceHeader mocks base method. diff --git a/common/commonspace/storage/storage.go b/common/commonspace/storage/storage.go index eeee74a2..a18b9c16 100644 --- a/common/commonspace/storage/storage.go +++ b/common/commonspace/storage/storage.go @@ -6,7 +6,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" ) const CName = "commonspace.storage" @@ -15,9 +15,9 @@ var ErrSpaceStorageExists = errors.New("space storage exists") var ErrSpaceStorageMissing = errors.New("space storage missing") type SpaceStorage interface { - storage2.Storage - storage2.Provider - ACLStorage() (storage2.ListStorage, error) + storage.Provider + Id() string + ACLStorage() (storage.ListStorage, error) SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) StoredIds() ([]string, error) Close() error diff --git a/common/commonspace/synctree/mock_synctree/mock_synctree.go b/common/commonspace/synctree/mock_synctree/mock_synctree.go index 61cf4401..914a6ec1 100644 --- a/common/commonspace/synctree/mock_synctree/mock_synctree.go +++ b/common/commonspace/synctree/mock_synctree/mock_synctree.go @@ -6,7 +6,6 @@ package mock_synctree import ( reflect "reflect" - time "time" tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" @@ -122,20 +121,6 @@ func (mr *MockSyncClientMockRecorder) CreateNewTreeRequest() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateNewTreeRequest", reflect.TypeOf((*MockSyncClient)(nil).CreateNewTreeRequest)) } -// LastUsage mocks base method. -func (m *MockSyncClient) LastUsage() time.Time { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "LastUsage") - ret0, _ := ret[0].(time.Time) - return ret0 -} - -// LastUsage indicates an expected call of LastUsage. -func (mr *MockSyncClientMockRecorder) LastUsage() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LastUsage", reflect.TypeOf((*MockSyncClient)(nil).LastUsage)) -} - // SendAsync mocks base method. func (m *MockSyncClient) SendAsync(arg0 string, arg1 *treechangeproto.TreeSyncMessage, arg2 string) error { m.ctrl.T.Helper() diff --git a/common/pkg/acl/aclrecordproto/aclrecord.pb.go b/common/pkg/acl/aclrecordproto/aclrecord.pb.go index e11f5209..d0e583fa 100644 --- a/common/pkg/acl/aclrecordproto/aclrecord.pb.go +++ b/common/pkg/acl/aclrecordproto/aclrecord.pb.go @@ -103,8 +103,10 @@ func (m *RawACLRecord) GetSignature() []byte { } type RawACLRecordWithId struct { - Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + AcceptorIdentity []byte `protobuf:"bytes,3,opt,name=acceptorIdentity,proto3" json:"acceptorIdentity,omitempty"` + AcceptorSignature []byte `protobuf:"bytes,4,opt,name=acceptorSignature,proto3" json:"acceptorSignature,omitempty"` } func (m *RawACLRecordWithId) Reset() { *m = RawACLRecordWithId{} } @@ -154,6 +156,20 @@ func (m *RawACLRecordWithId) GetId() string { return "" } +func (m *RawACLRecordWithId) GetAcceptorIdentity() []byte { + if m != nil { + return m.AcceptorIdentity + } + return nil +} + +func (m *RawACLRecordWithId) GetAcceptorSignature() []byte { + if m != nil { + return m.AcceptorSignature + } + return nil +} + type ACLRecord struct { PrevId string `protobuf:"bytes,1,opt,name=prevId,proto3" json:"prevId,omitempty"` Identity []byte `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` @@ -680,11 +696,13 @@ func (m *ACLUserAdd) GetPermissions() ACLUserPermissions { } type ACLUserInvite struct { - AcceptPublicKey []byte `protobuf:"bytes,1,opt,name=acceptPublicKey,proto3" json:"acceptPublicKey,omitempty"` + AcceptPublicKey []byte `protobuf:"bytes,1,opt,name=acceptPublicKey,proto3" json:"acceptPublicKey,omitempty"` + // TODO: change to read key EncryptPublicKey []byte `protobuf:"bytes,2,opt,name=encryptPublicKey,proto3" json:"encryptPublicKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=aclrecord.ACLUserPermissions" json:"permissions,omitempty"` - InviteId string `protobuf:"bytes,5,opt,name=inviteId,proto3" json:"inviteId,omitempty"` + // TODO: either derive inviteId from pub keys or think if it is possible to just use ACL record id + InviteId string `protobuf:"bytes,5,opt,name=inviteId,proto3" json:"inviteId,omitempty"` } func (m *ACLUserInvite) Reset() { *m = ACLUserInvite{} } @@ -995,6 +1013,168 @@ func (m *ACLUserPermissionChange) GetPermissions() ACLUserPermissions { return ACLUserPermissions_Admin } +type ACLSyncMessage struct { + Content *ACLSyncContentValue `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` +} + +func (m *ACLSyncMessage) Reset() { *m = ACLSyncMessage{} } +func (m *ACLSyncMessage) String() string { return proto.CompactTextString(m) } +func (*ACLSyncMessage) ProtoMessage() {} +func (*ACLSyncMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_14abe0d1b4206d54, []int{14} +} +func (m *ACLSyncMessage) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ACLSyncMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ACLSyncMessage.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 *ACLSyncMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLSyncMessage.Merge(m, src) +} +func (m *ACLSyncMessage) XXX_Size() int { + return m.Size() +} +func (m *ACLSyncMessage) XXX_DiscardUnknown() { + xxx_messageInfo_ACLSyncMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_ACLSyncMessage proto.InternalMessageInfo + +func (m *ACLSyncMessage) GetContent() *ACLSyncContentValue { + if m != nil { + return m.Content + } + return nil +} + +// ACLSyncContentValue provides different types for acl sync +type ACLSyncContentValue struct { + // Types that are valid to be assigned to Value: + // + // *ACLSyncContentValue_AddRecords + Value isACLSyncContentValue_Value `protobuf_oneof:"value"` +} + +func (m *ACLSyncContentValue) Reset() { *m = ACLSyncContentValue{} } +func (m *ACLSyncContentValue) String() string { return proto.CompactTextString(m) } +func (*ACLSyncContentValue) ProtoMessage() {} +func (*ACLSyncContentValue) Descriptor() ([]byte, []int) { + return fileDescriptor_14abe0d1b4206d54, []int{15} +} +func (m *ACLSyncContentValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ACLSyncContentValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ACLSyncContentValue.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 *ACLSyncContentValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLSyncContentValue.Merge(m, src) +} +func (m *ACLSyncContentValue) XXX_Size() int { + return m.Size() +} +func (m *ACLSyncContentValue) XXX_DiscardUnknown() { + xxx_messageInfo_ACLSyncContentValue.DiscardUnknown(m) +} + +var xxx_messageInfo_ACLSyncContentValue proto.InternalMessageInfo + +type isACLSyncContentValue_Value interface { + isACLSyncContentValue_Value() + MarshalTo([]byte) (int, error) + Size() int +} + +type ACLSyncContentValue_AddRecords struct { + AddRecords *ACLAddRecords `protobuf:"bytes,1,opt,name=addRecords,proto3,oneof" json:"addRecords,omitempty"` +} + +func (*ACLSyncContentValue_AddRecords) isACLSyncContentValue_Value() {} + +func (m *ACLSyncContentValue) GetValue() isACLSyncContentValue_Value { + if m != nil { + return m.Value + } + return nil +} + +func (m *ACLSyncContentValue) GetAddRecords() *ACLAddRecords { + if x, ok := m.GetValue().(*ACLSyncContentValue_AddRecords); ok { + return x.AddRecords + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*ACLSyncContentValue) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*ACLSyncContentValue_AddRecords)(nil), + } +} + +type ACLAddRecords struct { + Records []*RawACLRecordWithId `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"` +} + +func (m *ACLAddRecords) Reset() { *m = ACLAddRecords{} } +func (m *ACLAddRecords) String() string { return proto.CompactTextString(m) } +func (*ACLAddRecords) ProtoMessage() {} +func (*ACLAddRecords) Descriptor() ([]byte, []int) { + return fileDescriptor_14abe0d1b4206d54, []int{16} +} +func (m *ACLAddRecords) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ACLAddRecords) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ACLAddRecords.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 *ACLAddRecords) XXX_Merge(src proto.Message) { + xxx_messageInfo_ACLAddRecords.Merge(m, src) +} +func (m *ACLAddRecords) XXX_Size() int { + return m.Size() +} +func (m *ACLAddRecords) XXX_DiscardUnknown() { + xxx_messageInfo_ACLAddRecords.DiscardUnknown(m) +} + +var xxx_messageInfo_ACLAddRecords proto.InternalMessageInfo + +func (m *ACLAddRecords) GetRecords() []*RawACLRecordWithId { + if m != nil { + return m.Records + } + return nil +} + func init() { proto.RegisterEnum("aclrecord.ACLUserPermissions", ACLUserPermissions_name, ACLUserPermissions_value) proto.RegisterType((*RawACLRecord)(nil), "aclrecord.RawACLRecord") @@ -1012,6 +1192,9 @@ func init() { proto.RegisterType((*ACLUserRemove)(nil), "aclrecord.ACLUserRemove") proto.RegisterType((*ACLReadKeyReplace)(nil), "aclrecord.ACLReadKeyReplace") proto.RegisterType((*ACLUserPermissionChange)(nil), "aclrecord.ACLUserPermissionChange") + proto.RegisterType((*ACLSyncMessage)(nil), "aclrecord.ACLSyncMessage") + proto.RegisterType((*ACLSyncContentValue)(nil), "aclrecord.ACLSyncContentValue") + proto.RegisterType((*ACLAddRecords)(nil), "aclrecord.ACLAddRecords") } func init() { @@ -1019,61 +1202,67 @@ func init() { } var fileDescriptor_14abe0d1b4206d54 = []byte{ - // 859 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xdf, 0x59, 0x3b, 0x71, 0xf6, 0xd9, 0x6d, 0xdc, 0x11, 0xa4, 0xab, 0xa8, 0x58, 0xd6, 0x8a, - 0x83, 0x55, 0x81, 0x0b, 0x06, 0xa9, 0x28, 0x07, 0x90, 0x6b, 0x5a, 0xd9, 0x24, 0x87, 0x6a, 0x02, - 0x14, 0x71, 0x9b, 0xee, 0x8e, 0x92, 0x51, 0xed, 0xdd, 0xd5, 0xec, 0xd8, 0xc8, 0x47, 0xce, 0x5c, - 0xe0, 0x23, 0xf0, 0x41, 0x38, 0x71, 0xe1, 0xd8, 0x0b, 0x12, 0x47, 0x94, 0x7c, 0x01, 0xee, 0x5c, - 0xd0, 0xcc, 0xfe, 0xdf, 0xb5, 0x2d, 0x2a, 0x59, 0x3d, 0x24, 0xde, 0xf7, 0xde, 0xef, 0x3d, 0xff, - 0xe6, 0xf7, 0xde, 0xbc, 0x35, 0x7c, 0x18, 0xbe, 0xba, 0x7a, 0x44, 0xdd, 0xb9, 0xfa, 0x13, 0xcc, - 0x0d, 0x84, 0x17, 0x8a, 0x40, 0x06, 0x8f, 0xf4, 0xff, 0x28, 0xf7, 0x0e, 0xb5, 0x03, 0x5b, 0x99, - 0xc3, 0x79, 0x06, 0x1d, 0x42, 0x7f, 0x18, 0x4f, 0x2e, 0x88, 0xb6, 0xb1, 0x0d, 0xad, 0x90, 0xae, - 0xe7, 0x01, 0xf5, 0x6c, 0xd4, 0x47, 0x83, 0x0e, 0x49, 0x4d, 0xfc, 0x00, 0xac, 0x88, 0x5f, 0xf9, - 0x54, 0x2e, 0x05, 0xb3, 0x4d, 0x1d, 0xcb, 0x1d, 0xce, 0xe7, 0x80, 0x8b, 0x75, 0x5e, 0x70, 0x79, - 0x3d, 0xdb, 0x55, 0xed, 0x2e, 0x98, 0xdc, 0xd3, 0x65, 0x2c, 0x62, 0x72, 0xcf, 0xf9, 0x15, 0x81, - 0x95, 0xb3, 0x38, 0x81, 0xc3, 0x50, 0xb0, 0xd5, 0x2c, 0x4e, 0xb3, 0x48, 0x62, 0xe1, 0x53, 0x38, - 0xe2, 0x1e, 0xf3, 0x25, 0x97, 0xeb, 0x84, 0x42, 0x66, 0x63, 0x0c, 0x4d, 0x8f, 0x4a, 0x6a, 0x37, - 0xb4, 0x5f, 0x3f, 0xe3, 0x21, 0x60, 0x77, 0x29, 0x04, 0xf3, 0x25, 0x61, 0xd4, 0x3b, 0x67, 0xeb, - 0x29, 0x8d, 0xae, 0xed, 0x66, 0x1f, 0x0d, 0x9a, 0x64, 0x43, 0x44, 0x9d, 0x51, 0xf2, 0x05, 0x8b, - 0x24, 0x5d, 0x84, 0xf6, 0x41, 0x1f, 0x0d, 0x1a, 0x24, 0x77, 0x38, 0x3f, 0x99, 0xd0, 0x52, 0x1c, - 0x83, 0x40, 0x96, 0x98, 0xa0, 0x0a, 0x93, 0xf7, 0xe1, 0x0e, 0xf3, 0x5d, 0xb1, 0x0e, 0x25, 0x0f, - 0xfc, 0x73, 0x96, 0x52, 0x2d, 0x3b, 0x95, 0x36, 0x51, 0x48, 0x5d, 0x36, 0xf3, 0x34, 0x65, 0x8b, - 0xa4, 0x26, 0x7e, 0x08, 0xdd, 0x04, 0xca, 0xbc, 0x84, 0x9d, 0xe6, 0xdc, 0x21, 0x35, 0xbf, 0xc2, - 0x7a, 0x4c, 0xf0, 0x15, 0x55, 0x65, 0x2f, 0xdd, 0x6b, 0xb6, 0x60, 0x9a, 0xb8, 0x45, 0x6a, 0xfe, - 0x2d, 0x6a, 0x1c, 0xfe, 0x3f, 0x35, 0x5a, 0x55, 0x35, 0xfe, 0x34, 0xe1, 0x78, 0x3c, 0xb9, 0x98, - 0x04, 0xbe, 0x64, 0xbe, 0xfc, 0x96, 0xce, 0x97, 0x0c, 0x7f, 0x0c, 0xad, 0x65, 0xc4, 0xc4, 0xd8, - 0x8b, 0x1b, 0xd7, 0x1e, 0xbd, 0x3b, 0xcc, 0x67, 0x6f, 0x3c, 0xb9, 0xf8, 0x26, 0x0e, 0x4e, 0x0d, - 0x92, 0xe2, 0xf0, 0x19, 0x80, 0x7a, 0x24, 0x6c, 0x11, 0xac, 0xe2, 0xb9, 0x6a, 0x8f, 0xec, 0x7a, - 0x56, 0x1c, 0x9f, 0x1a, 0xa4, 0x80, 0xc6, 0xdf, 0xc1, 0x3b, 0xca, 0x7a, 0xce, 0xc4, 0x82, 0x47, - 0x11, 0x0f, 0xfc, 0xc9, 0x35, 0xf5, 0xaf, 0x98, 0xd6, 0xb3, 0x3d, 0x72, 0xea, 0x55, 0xaa, 0xc8, - 0xa9, 0x41, 0x36, 0x56, 0x48, 0x59, 0xcd, 0xfc, 0x15, 0x97, 0x4c, 0x8b, 0xbf, 0x91, 0x55, 0x1c, - 0x4f, 0x59, 0xc5, 0x16, 0xfe, 0x14, 0x8e, 0x94, 0xf5, 0x55, 0xc0, 0x7d, 0xdd, 0x8a, 0xf6, 0xe8, - 0xa4, 0x9e, 0xa9, 0xa2, 0x53, 0x83, 0x64, 0xc8, 0x27, 0x2d, 0x38, 0x58, 0x29, 0x0d, 0x9d, 0xa7, - 0x7a, 0xc8, 0xbe, 0x54, 0xe3, 0x7b, 0x06, 0x40, 0xdd, 0x79, 0xa2, 0xb0, 0x8d, 0xfa, 0x8d, 0x41, - 0x7b, 0x74, 0x5a, 0xae, 0x55, 0x94, 0x9f, 0x14, 0xd0, 0xce, 0xbf, 0x08, 0x8e, 0xc6, 0x93, 0x8b, - 0x4b, 0x49, 0x25, 0x53, 0x13, 0x29, 0xf2, 0xc6, 0xb2, 0x48, 0xd7, 0x6a, 0x92, 0xb2, 0x13, 0x3f, - 0x8e, 0x0f, 0xad, 0x53, 0x22, 0xdb, 0xd4, 0x5f, 0x77, 0xbf, 0x4e, 0x5d, 0xc7, 0x49, 0x01, 0x8a, - 0xcf, 0xa0, 0xc5, 0xf5, 0xd9, 0x23, 0xbb, 0xa1, 0xb3, 0xfa, 0xe5, 0x2c, 0x0d, 0x1b, 0xc6, 0xf2, - 0x44, 0x4f, 0x7d, 0x29, 0xd6, 0x24, 0x4d, 0x38, 0xfd, 0x1a, 0x3a, 0xc5, 0x00, 0xee, 0x42, 0xe3, - 0x15, 0x5b, 0x27, 0xf7, 0x5e, 0x3d, 0xe2, 0x61, 0xa2, 0xcc, 0xf6, 0xe1, 0x88, 0x0b, 0x90, 0x18, - 0x76, 0x66, 0x7e, 0x86, 0x9c, 0x5f, 0x10, 0x74, 0x8a, 0x74, 0xf7, 0x70, 0x5f, 0xbf, 0x80, 0x76, - 0x98, 0x8d, 0x49, 0xa4, 0x67, 0xec, 0xee, 0xe8, 0xbd, 0x5d, 0x33, 0x16, 0x91, 0x62, 0x86, 0xf3, - 0x1b, 0x02, 0xc8, 0xef, 0xc0, 0x1e, 0x18, 0x7d, 0x00, 0xf7, 0xaa, 0xfb, 0x20, 0x6e, 0x40, 0x87, - 0xd4, 0x03, 0x55, 0xfe, 0xcd, 0x37, 0xe6, 0xff, 0x0f, 0x82, 0x3b, 0x25, 0xc1, 0xf1, 0x00, 0x8e, - 0xa9, 0xeb, 0xb2, 0x50, 0x3e, 0x5f, 0xbe, 0x9c, 0x73, 0xf7, 0x9c, 0xa5, 0x27, 0xa9, 0xba, 0x0b, - 0x2b, 0x2d, 0x87, 0x9a, 0xa5, 0x95, 0x96, 0x63, 0xdf, 0xee, 0xb1, 0x74, 0x1f, 0xf4, 0x71, 0x66, - 0x5e, 0xb2, 0x39, 0x33, 0xdb, 0xf9, 0x1d, 0x41, 0xbb, 0x70, 0x61, 0xf7, 0xd0, 0xb3, 0x4c, 0xb2, - 0xcb, 0xec, 0x5d, 0xda, 0x28, 0x4a, 0x96, 0xb9, 0x4b, 0xbc, 0x9a, 0x65, 0x5e, 0x9b, 0x25, 0x3a, - 0xd8, 0x22, 0x91, 0x13, 0x65, 0x7d, 0x4b, 0xf6, 0xe6, 0xae, 0x63, 0x3c, 0x83, 0xe3, 0x64, 0x2b, - 0x10, 0x16, 0xce, 0xa9, 0x9b, 0xdd, 0xe9, 0x07, 0x65, 0x4d, 0x49, 0x09, 0x44, 0xaa, 0x49, 0xce, - 0x8f, 0x08, 0xee, 0xd5, 0x60, 0x7b, 0x10, 0x70, 0xd3, 0xcb, 0xb1, 0xb1, 0xf9, 0xe5, 0xe8, 0xac, - 0xe0, 0xfe, 0x96, 0xc5, 0xbf, 0x93, 0x48, 0x65, 0xa4, 0xcc, 0x37, 0x1d, 0xa9, 0x87, 0x8f, 0x01, - 0xd7, 0x21, 0xd8, 0x82, 0x83, 0xb1, 0xb7, 0xe0, 0x7e, 0xd7, 0xc0, 0x00, 0x87, 0x2f, 0x04, 0x97, - 0x4c, 0x74, 0x91, 0x7a, 0x56, 0x7c, 0x99, 0xe8, 0x9a, 0x4f, 0x3e, 0xfa, 0xe3, 0xa6, 0x87, 0x5e, - 0xdf, 0xf4, 0xd0, 0xdf, 0x37, 0x3d, 0xf4, 0xf3, 0x6d, 0xcf, 0x78, 0x7d, 0xdb, 0x33, 0xfe, 0xba, - 0xed, 0x19, 0xdf, 0x9f, 0x6c, 0xfe, 0x85, 0xf7, 0xf2, 0x50, 0x7f, 0x7c, 0xf2, 0x5f, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x0d, 0xd2, 0xee, 0x14, 0x02, 0x0a, 0x00, 0x00, + // 959 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xcf, 0x6f, 0x1b, 0x45, + 0x14, 0xf6, 0xac, 0x9d, 0x38, 0x7e, 0x76, 0x13, 0x67, 0x80, 0xd4, 0x8a, 0x8a, 0x15, 0xad, 0x38, + 0x44, 0x55, 0x71, 0xc1, 0x20, 0xa5, 0xca, 0x05, 0xb9, 0xa6, 0x95, 0xdd, 0x04, 0xa9, 0x9a, 0x00, + 0x45, 0xbd, 0x4d, 0x77, 0x47, 0xc9, 0xa8, 0xf6, 0xee, 0x6a, 0x66, 0x6c, 0xe4, 0x23, 0x67, 0x2e, + 0x70, 0xe3, 0xca, 0x1f, 0xc2, 0x89, 0x0b, 0xc7, 0x5e, 0x90, 0x38, 0xa2, 0xe4, 0x1f, 0xe0, 0xce, + 0x05, 0xcd, 0xcc, 0xfe, 0x5e, 0x27, 0xa2, 0x52, 0xd4, 0x43, 0xe2, 0x9d, 0xf7, 0xbe, 0x79, 0xfb, + 0xbd, 0xef, 0xbd, 0x79, 0xb3, 0xf0, 0x71, 0xf4, 0xfa, 0xfc, 0x21, 0xf5, 0x66, 0xfa, 0x4f, 0x30, + 0x2f, 0x14, 0x7e, 0x24, 0x42, 0x15, 0x3e, 0x34, 0xff, 0x65, 0x66, 0x1d, 0x18, 0x03, 0x6e, 0xa5, + 0x06, 0xf7, 0x29, 0x74, 0x08, 0xfd, 0x7e, 0x34, 0x3e, 0x25, 0x66, 0x8d, 0x7b, 0xd0, 0x8c, 0xe8, + 0x6a, 0x16, 0x52, 0xbf, 0x87, 0x0e, 0xd0, 0x61, 0x87, 0x24, 0x4b, 0x7c, 0x0f, 0x5a, 0x92, 0x9f, + 0x07, 0x54, 0x2d, 0x04, 0xeb, 0x39, 0xc6, 0x97, 0x19, 0xdc, 0x5f, 0x10, 0xe0, 0x7c, 0xa0, 0x17, + 0x5c, 0x5d, 0x4c, 0x6f, 0x0a, 0xb7, 0x0d, 0x0e, 0xf7, 0x4d, 0x9c, 0x16, 0x71, 0xb8, 0x8f, 0xef, + 0x43, 0x97, 0x7a, 0x1e, 0x8b, 0x54, 0x28, 0xa6, 0x3e, 0x0b, 0x14, 0x57, 0xab, 0x5e, 0xdd, 0x6c, + 0xa9, 0xd8, 0xf1, 0x03, 0xd8, 0x4d, 0x6c, 0x67, 0x29, 0xa5, 0x86, 0x01, 0x57, 0x1d, 0xee, 0xaf, + 0x08, 0x5a, 0x59, 0x82, 0x7b, 0xb0, 0x19, 0x09, 0xb6, 0x9c, 0x5a, 0x42, 0x2d, 0x12, 0xaf, 0xf0, + 0x3e, 0x6c, 0xf1, 0xe4, 0xbd, 0x36, 0xbb, 0x74, 0x8d, 0x31, 0x34, 0x7c, 0xaa, 0x68, 0xcc, 0xc7, + 0x3c, 0xe3, 0x01, 0x60, 0x6f, 0x21, 0x04, 0x0b, 0x14, 0x61, 0xd4, 0x3f, 0x61, 0xab, 0x09, 0x95, + 0x17, 0x86, 0x44, 0x83, 0xac, 0xf1, 0x68, 0xf9, 0x14, 0x9f, 0x33, 0xa9, 0xe8, 0x3c, 0xea, 0x6d, + 0x1c, 0xa0, 0xc3, 0x3a, 0xc9, 0x0c, 0xee, 0x8f, 0x0e, 0x34, 0x35, 0xc7, 0x30, 0x54, 0x05, 0x26, + 0xa8, 0xc4, 0xe4, 0x23, 0xb8, 0xc3, 0x02, 0x4f, 0xac, 0x22, 0xc5, 0xc3, 0xe0, 0x84, 0x25, 0x54, + 0x8b, 0x46, 0xad, 0xba, 0x8c, 0xa8, 0xc7, 0xa6, 0xbe, 0xa1, 0xdc, 0x22, 0xc9, 0x52, 0xab, 0x1c, + 0x43, 0x99, 0x1f, 0xb3, 0x8b, 0x85, 0xab, 0xd8, 0x35, 0xd6, 0x67, 0x82, 0x2f, 0xa9, 0x0e, 0x7b, + 0xe6, 0x5d, 0xb0, 0x39, 0x33, 0xc4, 0x5b, 0xa4, 0x62, 0xbf, 0x46, 0x8d, 0xcd, 0xff, 0xa7, 0x46, + 0xb3, 0xac, 0xc6, 0x9f, 0x0e, 0xec, 0x8c, 0xc6, 0xa7, 0xe3, 0x30, 0x50, 0x2c, 0x50, 0xdf, 0xd2, + 0xd9, 0x82, 0xe1, 0x4f, 0xa1, 0xb9, 0x90, 0x4c, 0x8c, 0x7c, 0x5b, 0xb8, 0xf6, 0xf0, 0x83, 0x41, + 0xd6, 0xd6, 0xa3, 0xf1, 0xe9, 0x37, 0xd6, 0x39, 0xa9, 0x91, 0x04, 0x87, 0x8f, 0x01, 0xf4, 0x23, + 0x61, 0xf3, 0x70, 0x69, 0x5b, 0xb6, 0x3d, 0xec, 0x55, 0x77, 0x59, 0xff, 0xa4, 0x46, 0x72, 0x68, + 0xfc, 0x1d, 0xbc, 0xaf, 0x57, 0xcf, 0x99, 0x98, 0x73, 0x29, 0x79, 0x18, 0x8c, 0x2f, 0x68, 0x70, + 0xce, 0x8c, 0x9e, 0xed, 0xa1, 0x5b, 0x8d, 0x52, 0x46, 0x4e, 0x6a, 0x64, 0x6d, 0x84, 0x84, 0xd5, + 0x34, 0x58, 0x72, 0x65, 0xbb, 0x76, 0x2d, 0x2b, 0xeb, 0x4f, 0x58, 0xd9, 0x15, 0xfe, 0x1c, 0xb6, + 0xf4, 0xea, 0x59, 0xc8, 0x03, 0x53, 0x8a, 0xf6, 0x70, 0xaf, 0xba, 0x53, 0x7b, 0x27, 0x35, 0x92, + 0x22, 0x1f, 0x37, 0x61, 0x63, 0xa9, 0x35, 0x74, 0x9f, 0x98, 0x26, 0xfb, 0x52, 0xb7, 0xef, 0x31, + 0x00, 0xf5, 0x66, 0xb1, 0xc2, 0x3d, 0x74, 0x50, 0x3f, 0x6c, 0x0f, 0xf7, 0x8b, 0xb1, 0xf2, 0xf2, + 0x93, 0x1c, 0xda, 0xfd, 0x17, 0xc1, 0xd6, 0x68, 0x7c, 0x7a, 0xa6, 0xa8, 0x62, 0xba, 0x23, 0x45, + 0x56, 0x58, 0x26, 0x4d, 0xac, 0x06, 0x29, 0x1a, 0xf1, 0x91, 0x4d, 0xda, 0x6c, 0x91, 0x3d, 0xc7, + 0xbc, 0xee, 0x6e, 0x95, 0xba, 0xf1, 0x93, 0x1c, 0x14, 0x1f, 0x43, 0x93, 0x9b, 0xdc, 0x65, 0xaf, + 0x6e, 0x76, 0x1d, 0x14, 0x77, 0x19, 0xd8, 0xc0, 0xca, 0x23, 0x9f, 0x04, 0x4a, 0xac, 0x48, 0xb2, + 0x61, 0xff, 0x6b, 0xe8, 0xe4, 0x1d, 0xb8, 0x0b, 0xf5, 0xd7, 0x6c, 0x15, 0x9f, 0x7b, 0xfd, 0x88, + 0x07, 0xb1, 0x32, 0xd7, 0x37, 0x87, 0x0d, 0x40, 0x2c, 0xec, 0xd8, 0x79, 0x84, 0xdc, 0x9f, 0x11, + 0x74, 0xf2, 0x74, 0x6f, 0xe1, 0xbc, 0x7e, 0x01, 0xed, 0x28, 0x6d, 0x13, 0x69, 0x7a, 0x6c, 0x7b, + 0xf8, 0xe1, 0x4d, 0x3d, 0x26, 0x49, 0x7e, 0x87, 0xfb, 0x1b, 0x02, 0xc8, 0xce, 0xc0, 0x2d, 0x30, + 0x7a, 0x00, 0xbb, 0xe5, 0x79, 0x60, 0x0b, 0xd0, 0x21, 0x55, 0x47, 0x99, 0x7f, 0xe3, 0xad, 0xf9, + 0xff, 0x83, 0xe0, 0x4e, 0x41, 0x70, 0x7c, 0x08, 0x3b, 0x76, 0x92, 0x3f, 0x5f, 0xbc, 0x9a, 0x71, + 0xef, 0x84, 0x25, 0x99, 0x94, 0xcd, 0xb9, 0x91, 0x96, 0x41, 0x9d, 0xc2, 0x48, 0xcb, 0xb0, 0xef, + 0x36, 0x2d, 0x53, 0x07, 0x93, 0xce, 0xd4, 0x8f, 0x27, 0x67, 0xba, 0x76, 0x7f, 0x47, 0xd0, 0xce, + 0x1d, 0xd8, 0x5b, 0xa8, 0x59, 0x2a, 0x59, 0x76, 0x27, 0xd6, 0xf3, 0x92, 0xa5, 0xe6, 0x02, 0xaf, + 0x46, 0x91, 0xd7, 0x7a, 0x89, 0x36, 0xae, 0x91, 0xc8, 0x95, 0x69, 0xdd, 0xe2, 0xb9, 0x79, 0x53, + 0x1a, 0x4f, 0x61, 0x27, 0x9e, 0x0a, 0x84, 0x45, 0x33, 0xea, 0xa5, 0x67, 0xfa, 0x5e, 0x51, 0x53, + 0x52, 0x00, 0x91, 0xf2, 0x26, 0xf7, 0x07, 0x04, 0xbb, 0x15, 0xd8, 0x2d, 0x08, 0xb8, 0xee, 0x72, + 0xac, 0xaf, 0xbf, 0x1c, 0xdd, 0x25, 0xdc, 0xbd, 0x66, 0xf0, 0xdf, 0x48, 0xa4, 0xd4, 0x52, 0xce, + 0x5b, 0x9f, 0x94, 0x67, 0xb0, 0xad, 0xa7, 0xde, 0x2a, 0xf0, 0xbe, 0x62, 0x52, 0xd2, 0x73, 0x86, + 0x1f, 0x41, 0xd3, 0x8b, 0xc7, 0xb8, 0x9d, 0x62, 0xfd, 0xd2, 0x84, 0x5c, 0x05, 0x5e, 0x61, 0x94, + 0x27, 0x70, 0xf7, 0x25, 0xbc, 0xb7, 0xc6, 0x6f, 0xae, 0x06, 0xdf, 0xb7, 0x9f, 0x4b, 0x32, 0xbe, + 0x6c, 0x4b, 0x93, 0x71, 0x94, 0xfa, 0xf5, 0x05, 0x95, 0xa1, 0xb3, 0xab, 0x66, 0x62, 0x1a, 0x23, + 0xc3, 0xe1, 0x23, 0x68, 0x8a, 0x34, 0xa4, 0x2e, 0x7a, 0x3e, 0xeb, 0xea, 0x97, 0x23, 0x49, 0xd0, + 0xf7, 0x8f, 0x00, 0x57, 0x45, 0xc1, 0x2d, 0xd8, 0x18, 0xf9, 0x73, 0x1e, 0x74, 0x6b, 0x18, 0x60, + 0xf3, 0x85, 0xe0, 0x8a, 0x89, 0x2e, 0xd2, 0xcf, 0xba, 0x42, 0x4c, 0x74, 0x9d, 0xc7, 0x9f, 0xfc, + 0x71, 0xd9, 0x47, 0x6f, 0x2e, 0xfb, 0xe8, 0xef, 0xcb, 0x3e, 0xfa, 0xe9, 0xaa, 0x5f, 0x7b, 0x73, + 0xd5, 0xaf, 0xfd, 0x75, 0xd5, 0xaf, 0xbd, 0xdc, 0x5b, 0xff, 0xb9, 0xfc, 0x6a, 0xd3, 0xfc, 0x7c, + 0xf6, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x6d, 0x2c, 0x1d, 0x4f, 0x0b, 0x00, 0x00, } func (m *RawACLRecord) Marshal() (dAtA []byte, err error) { @@ -1133,6 +1322,20 @@ func (m *RawACLRecordWithId) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.AcceptorSignature) > 0 { + i -= len(m.AcceptorSignature) + copy(dAtA[i:], m.AcceptorSignature) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.AcceptorSignature))) + i-- + dAtA[i] = 0x22 + } + if len(m.AcceptorIdentity) > 0 { + i -= len(m.AcceptorIdentity) + copy(dAtA[i:], m.AcceptorIdentity) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.AcceptorIdentity))) + i-- + dAtA[i] = 0x1a + } if len(m.Id) > 0 { i -= len(m.Id) copy(dAtA[i:], m.Id) @@ -1861,6 +2064,131 @@ func (m *ACLUserPermissionChange) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *ACLSyncMessage) 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 *ACLSyncMessage) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ACLSyncMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Content != nil { + { + size, err := m.Content.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAclrecord(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *ACLSyncContentValue) 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 *ACLSyncContentValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ACLSyncContentValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Value != nil { + { + size := m.Value.Size() + i -= size + if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *ACLSyncContentValue_AddRecords) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ACLSyncContentValue_AddRecords) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.AddRecords != nil { + { + size, err := m.AddRecords.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAclrecord(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *ACLAddRecords) 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 *ACLAddRecords) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ACLAddRecords) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Records) > 0 { + for iNdEx := len(m.Records) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Records[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAclrecord(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintAclrecord(dAtA []byte, offset int, v uint64) int { offset -= sovAclrecord(v) base := offset @@ -1903,6 +2231,14 @@ func (m *RawACLRecordWithId) Size() (n int) { if l > 0 { n += 1 + l + sovAclrecord(uint64(l)) } + l = len(m.AcceptorIdentity) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) + } + l = len(m.AcceptorSignature) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) + } return n } @@ -2253,6 +2589,58 @@ func (m *ACLUserPermissionChange) Size() (n int) { return n } +func (m *ACLSyncMessage) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Content != nil { + l = m.Content.Size() + n += 1 + l + sovAclrecord(uint64(l)) + } + return n +} + +func (m *ACLSyncContentValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != nil { + n += m.Value.Size() + } + return n +} + +func (m *ACLSyncContentValue_AddRecords) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.AddRecords != nil { + l = m.AddRecords.Size() + n += 1 + l + sovAclrecord(uint64(l)) + } + return n +} +func (m *ACLAddRecords) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Records) > 0 { + for _, e := range m.Records { + l = e.Size() + n += 1 + l + sovAclrecord(uint64(l)) + } + } + return n +} + func sovAclrecord(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2472,6 +2860,74 @@ func (m *RawACLRecordWithId) Unmarshal(dAtA []byte) error { } m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AcceptorIdentity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AcceptorIdentity = append(m.AcceptorIdentity[:0], dAtA[iNdEx:postIndex]...) + if m.AcceptorIdentity == nil { + m.AcceptorIdentity = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AcceptorSignature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AcceptorSignature = append(m.AcceptorSignature[:0], dAtA[iNdEx:postIndex]...) + if m.AcceptorSignature == nil { + m.AcceptorSignature = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAclrecord(dAtA[iNdEx:]) @@ -4629,6 +5085,261 @@ func (m *ACLUserPermissionChange) Unmarshal(dAtA []byte) error { } return nil } +func (m *ACLSyncMessage) 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 ErrIntOverflowAclrecord + } + 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: ACLSyncMessage: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLSyncMessage: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Content", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Content == nil { + m.Content = &ACLSyncContentValue{} + } + if err := m.Content.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ACLSyncContentValue) 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 ErrIntOverflowAclrecord + } + 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: ACLSyncContentValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLSyncContentValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AddRecords", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ACLAddRecords{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Value = &ACLSyncContentValue_AddRecords{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ACLAddRecords) 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 ErrIntOverflowAclrecord + } + 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: ACLAddRecords: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ACLAddRecords: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Records", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Records = append(m.Records, &RawACLRecordWithId{}) + if err := m.Records[len(m.Records)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAclrecord(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAclrecord + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipAclrecord(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/common/pkg/acl/aclrecordproto/protos/aclrecord.proto b/common/pkg/acl/aclrecordproto/protos/aclrecord.proto index edaf1fbd..cf0afcfa 100644 --- a/common/pkg/acl/aclrecordproto/protos/aclrecord.proto +++ b/common/pkg/acl/aclrecordproto/protos/aclrecord.proto @@ -3,64 +3,66 @@ package aclrecord; option go_package = "pkg/acl/aclrecordproto"; message RawACLRecord { - bytes payload = 1; - bytes signature = 2; + bytes payload = 1; + bytes signature = 2; } message RawACLRecordWithId { - bytes payload = 1; - string id = 2; + bytes payload = 1; + string id = 2; + bytes acceptorIdentity = 3; + bytes acceptorSignature = 4; } message ACLRecord { - string prevId = 1; - bytes identity = 2; - bytes data = 3; - uint64 currentReadKeyHash = 4; - int64 timestamp = 5; + string prevId = 1; + bytes identity = 2; + bytes data = 3; + uint64 currentReadKeyHash = 4; + int64 timestamp = 5; } message ACLRoot { - bytes identity = 1; - bytes encryptionKey = 2; - string spaceId = 3; - bytes encryptedReadKey = 4; - string derivationScheme = 5; - uint64 currentReadKeyHash = 6; - int64 timestamp = 7; + bytes identity = 1; + bytes encryptionKey = 2; + string spaceId = 3; + bytes encryptedReadKey = 4; + string derivationScheme = 5; + uint64 currentReadKeyHash = 6; + int64 timestamp = 7; } message ACLContentValue { - oneof value { - ACLUserAdd userAdd = 1; - ACLUserRemove userRemove = 2; - ACLUserPermissionChange userPermissionChange = 3; - ACLUserInvite userInvite = 4; - ACLUserJoin userJoin = 5; - } + oneof value { + ACLUserAdd userAdd = 1; + ACLUserRemove userRemove = 2; + ACLUserPermissionChange userPermissionChange = 3; + ACLUserInvite userInvite = 4; + ACLUserJoin userJoin = 5; + } } message ACLData { - repeated ACLContentValue aclContent = 1; + repeated ACLContentValue aclContent = 1; } message ACLState { - repeated uint64 readKeyHashes = 1; - repeated ACLUserState userStates = 2; - map invites = 3; + repeated uint64 readKeyHashes = 1; + repeated ACLUserState userStates = 2; + map invites = 3; } message ACLUserState { - bytes identity = 1; - bytes encryptionKey = 2; - ACLUserPermissions permissions = 3; + bytes identity = 1; + bytes encryptionKey = 2; + ACLUserPermissions permissions = 3; } message ACLUserAdd { - bytes identity = 1; - bytes encryptionKey = 2; - repeated bytes encryptedReadKeys = 3; - ACLUserPermissions permissions = 4; + bytes identity = 1; + bytes encryptionKey = 2; + repeated bytes encryptedReadKeys = 3; + ACLUserPermissions permissions = 4; } // accept key, encrypt key, invite id @@ -68,41 +70,57 @@ message ACLUserAdd { // Join(ACLJoinRecord) -> Ok message ACLUserInvite { - bytes acceptPublicKey = 1; - // TODO: change to read key - bytes encryptPublicKey = 2; - repeated bytes encryptedReadKeys = 3; - ACLUserPermissions permissions = 4; - // TODO: either derive inviteId from pub keys or think if it is possible to just use ACL record id - string inviteId = 5; + bytes acceptPublicKey = 1; + // TODO: change to read key + bytes encryptPublicKey = 2; + repeated bytes encryptedReadKeys = 3; + ACLUserPermissions permissions = 4; + // TODO: either derive inviteId from pub keys or think if it is possible to just use ACL record id + string inviteId = 5; } message ACLUserJoin { - bytes identity = 1; - bytes encryptionKey = 2; - bytes acceptSignature = 3; - string inviteId = 4; - repeated bytes encryptedReadKeys = 5; + bytes identity = 1; + bytes encryptionKey = 2; + bytes acceptSignature = 3; + string inviteId = 4; + repeated bytes encryptedReadKeys = 5; } message ACLUserRemove { - bytes identity = 1; - repeated ACLReadKeyReplace readKeyReplaces = 3; + bytes identity = 1; + repeated ACLReadKeyReplace readKeyReplaces = 3; } message ACLReadKeyReplace { - bytes identity = 1; - bytes encryptionKey = 2; - bytes encryptedReadKey = 3; + bytes identity = 1; + bytes encryptionKey = 2; + bytes encryptedReadKey = 3; } message ACLUserPermissionChange { - bytes identity = 1; - ACLUserPermissions permissions = 2; + bytes identity = 1; + ACLUserPermissions permissions = 2; } enum ACLUserPermissions { - Admin = 0; - Writer = 1; - Reader = 2; + Admin = 0; + Writer = 1; + Reader = 2; } + + +message ACLSyncMessage { + ACLSyncContentValue content = 2; +} + +// ACLSyncContentValue provides different types for acl sync +message ACLSyncContentValue { + oneof value { + ACLAddRecords addRecords = 1; + } +} + +message ACLAddRecords { + repeated RawACLRecordWithId records = 1; +} \ No newline at end of file diff --git a/common/pkg/acl/list/list.go b/common/pkg/acl/list/list.go index a86b2bc8..3c91bd33 100644 --- a/common/pkg/acl/list/list.go +++ b/common/pkg/acl/list/list.go @@ -50,20 +50,12 @@ type aclList struct { } func BuildACLListWithIdentity(acc *account.AccountData, storage storage.ListStorage) (ACLList, error) { - id, err := storage.ID() - if err != nil { - return nil, err - } builder := newACLStateBuilderWithIdentity(acc) - return build(id, builder, newACLRecordBuilder(id, common.NewKeychain()), storage) + return build(storage.Id(), builder, newACLRecordBuilder(storage.Id(), common.NewKeychain()), storage) } func BuildACLList(storage storage.ListStorage) (ACLList, error) { - id, err := storage.ID() - if err != nil { - return nil, err - } - return build(id, newACLStateBuilder(), newACLRecordBuilder(id, common.NewKeychain()), storage) + return build(storage.Id(), newACLStateBuilder(), newACLRecordBuilder(storage.Id(), common.NewKeychain()), storage) } func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage storage.ListStorage) (list ACLList, err error) { diff --git a/common/pkg/acl/storage/inmemory.go b/common/pkg/acl/storage/inmemory.go index 11843de7..e9834f9a 100644 --- a/common/pkg/acl/storage/inmemory.go +++ b/common/pkg/acl/storage/inmemory.go @@ -56,10 +56,10 @@ func (i *inMemoryACLListStorage) AddRawRecord(ctx context.Context, rec *aclrecor panic("implement me") } -func (i *inMemoryACLListStorage) ID() (string, error) { +func (i *inMemoryACLListStorage) Id() string { i.RLock() defer i.RUnlock() - return i.id, nil + return i.id } type inMemoryTreeStorage struct { @@ -96,10 +96,10 @@ func (t *inMemoryTreeStorage) HasChange(ctx context.Context, id string) (bool, e return exists, nil } -func (t *inMemoryTreeStorage) ID() (string, error) { +func (t *inMemoryTreeStorage) Id() string { t.RLock() defer t.RUnlock() - return t.id, nil + return t.id } func (t *inMemoryTreeStorage) Root() (*treechangeproto.RawTreeChangeWithId, error) { diff --git a/common/pkg/acl/storage/liststorage.go b/common/pkg/acl/storage/liststorage.go index 42f80110..bfe47ab9 100644 --- a/common/pkg/acl/storage/liststorage.go +++ b/common/pkg/acl/storage/liststorage.go @@ -12,7 +12,7 @@ var ErrACLExists = errors.New("acl already exists") var ErrUnknownRecord = errors.New("record doesn't exist") type ListStorage interface { - Storage + Id() string Root() (*aclrecordproto.RawACLRecordWithId, error) Head() (string, error) SetHead(headId string) error diff --git a/common/pkg/acl/storage/mock_storage/mock_storage.go b/common/pkg/acl/storage/mock_storage/mock_storage.go index bd562720..751184a7 100644 --- a/common/pkg/acl/storage/mock_storage/mock_storage.go +++ b/common/pkg/acl/storage/mock_storage/mock_storage.go @@ -80,19 +80,18 @@ func (mr *MockListStorageMockRecorder) Head() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Head", reflect.TypeOf((*MockListStorage)(nil).Head)) } -// ID mocks base method. -func (m *MockListStorage) ID() (string, error) { +// Id mocks base method. +func (m *MockListStorage) Id() string { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ID") + ret := m.ctrl.Call(m, "Id") ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 + return ret0 } -// ID indicates an expected call of ID. -func (mr *MockListStorageMockRecorder) ID() *gomock.Call { +// Id indicates an expected call of Id. +func (mr *MockListStorageMockRecorder) Id() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockListStorage)(nil).ID)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Id", reflect.TypeOf((*MockListStorage)(nil).Id)) } // Root mocks base method. @@ -206,19 +205,18 @@ func (mr *MockTreeStorageMockRecorder) Heads() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Heads", reflect.TypeOf((*MockTreeStorage)(nil).Heads)) } -// ID mocks base method. -func (m *MockTreeStorage) ID() (string, error) { +// Id mocks base method. +func (m *MockTreeStorage) Id() string { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ID") + ret := m.ctrl.Call(m, "Id") ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 + return ret0 } -// ID indicates an expected call of ID. -func (mr *MockTreeStorageMockRecorder) ID() *gomock.Call { +// Id indicates an expected call of Id. +func (mr *MockTreeStorageMockRecorder) Id() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockTreeStorage)(nil).ID)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Id", reflect.TypeOf((*MockTreeStorage)(nil).Id)) } // Root mocks base method. diff --git a/common/pkg/acl/storage/storage.go b/common/pkg/acl/storage/storage.go deleted file mode 100644 index 42af1815..00000000 --- a/common/pkg/acl/storage/storage.go +++ /dev/null @@ -1,5 +0,0 @@ -package storage - -type Storage interface { - ID() (string, error) -} diff --git a/common/pkg/acl/storage/treestorage.go b/common/pkg/acl/storage/treestorage.go index 76332399..549e872a 100644 --- a/common/pkg/acl/storage/treestorage.go +++ b/common/pkg/acl/storage/treestorage.go @@ -6,7 +6,7 @@ import ( ) type TreeStorage interface { - Storage + Id() string Root() (*treechangeproto.RawTreeChangeWithId, error) Heads() ([]string, error) SetHeads(heads []string) error diff --git a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index cf515bfd..33703a9b 100644 --- a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -120,8 +120,8 @@ func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclrecord panic("implement me") } -func (t *ACLListStorageBuilder) ID() (string, error) { - return t.id, nil +func (t *ACLListStorageBuilder) Id() string { + return t.id } func (t *ACLListStorageBuilder) GetRawRecords() []*aclrecordproto2.RawACLRecordWithId { diff --git a/common/pkg/acl/tree/objecttreefactory.go b/common/pkg/acl/tree/objecttreefactory.go index 94459020..c148d930 100644 --- a/common/pkg/acl/tree/objecttreefactory.go +++ b/common/pkg/acl/tree/objecttreefactory.go @@ -127,10 +127,7 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) { } } - objTree.id, err = objTree.treeStorage.ID() - if err != nil { - return nil, err - } + objTree.id = objTree.treeStorage.Id() objTree.root, err = objTree.treeStorage.Root() if err != nil { diff --git a/node/acl/service.go b/node/acl/service.go new file mode 100644 index 00000000..c6099cb9 --- /dev/null +++ b/node/acl/service.go @@ -0,0 +1,111 @@ +package acl + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" + "time" +) + +const CName = "node.acl" + +var log = logger.NewNamed(CName) + +type Service interface { + app.Component +} + +type service struct { + consService consensusclient.Service + account account.Service +} + +func (s *service) Init(a *app.App) (err error) { + s.consService = a.MustComponent(consensusclient.CName).(consensusclient.Service) + s.account = a.MustComponent(account.CName).(account.Service) + return +} + +func (s *service) Name() (name string) { + return CName +} + +func (s *service) CreateLog(ctx context.Context, aclId string, rec *aclrecordproto.RawACLRecordWithId) (err error) { + logId, err := cidToByte(aclId) + if err != nil { + return + } + recId, err := cidToByte(rec.Id) + if err != nil { + return + } + acc := s.account.Account() + rec.AcceptorIdentity = acc.Identity + if rec.AcceptorSignature, err = acc.SignKey.Sign(rec.Payload); err != nil { + return + } + recPayload, err := rec.Marshal() + if err != nil { + return + } + return s.consService.AddLog(ctx, &consensusproto.Log{ + Id: logId, + Records: []*consensusproto.Record{ + { + Id: recId, + Payload: recPayload, + CreatedUnix: uint64(time.Now().Unix()), + }, + }, + }) +} + +func (s *service) AddRecord(ctx context.Context, aclId string, rec *aclrecordproto.RawACLRecordWithId) (err error) { + logId, err := cidToByte(aclId) + if err != nil { + return + } + recId, err := cidToByte(rec.Id) + if err != nil { + return + } + acc := s.account.Account() + rec.AcceptorIdentity = acc.Identity + if rec.AcceptorSignature, err = acc.SignKey.Sign(rec.Payload); err != nil { + return + } + recPayload, err := rec.Marshal() + if err != nil { + return + } + return s.consService.AddRecord(ctx, logId, &consensusproto.Record{ + Id: recId, + PrevId: nil, //TODO: + Payload: recPayload, + CreatedUnix: uint64(time.Now().Unix()), + }) +} + +func (s *service) Watch(ctx context.Context, spaceId, aclId string, h synchandler.SyncHandler) (err error) { + w, err := newWatcher(spaceId, aclId, h) + if err != nil { + return + } + if err = s.consService.Watch(w.logId, w); err != nil { + return err + } + return w.Ready(ctx) +} + +func (s *service) UnWatch(aclId string) (err error) { + logId, err := cidToByte(aclId) + if err != nil { + return + } + return s.consService.UnWatch(logId) +} diff --git a/node/acl/util.go b/node/acl/util.go new file mode 100644 index 00000000..c6784a33 --- /dev/null +++ b/node/acl/util.go @@ -0,0 +1,19 @@ +package acl + +import "github.com/ipfs/go-cid" + +func cidToString(b []byte) (s string, err error) { + rcid, err := cid.Cast(b) + if err != nil { + return + } + return rcid.String(), nil +} + +func cidToByte(s string) (b []byte, err error) { + rcid, err := cid.Decode(s) + if err != nil { + return + } + return rcid.Bytes(), nil +} diff --git a/node/acl/util_test.go b/node/acl/util_test.go new file mode 100644 index 00000000..1ebe5fcb --- /dev/null +++ b/node/acl/util_test.go @@ -0,0 +1,16 @@ +package acl + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestCIDLen(t *testing.T) { + s, _ := cid.NewCIDFromBytes([]byte("some data")) + t.Log(s, len(s)) + b, _ := cidToByte(s) + t.Log(b, len(b)) + s2, _ := cidToString(b) + assert.Equal(t, s, s2) +} diff --git a/node/acl/watcher.go b/node/acl/watcher.go new file mode 100644 index 00000000..6a88cb0e --- /dev/null +++ b/node/acl/watcher.go @@ -0,0 +1,93 @@ +package acl + +import ( + "context" + "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/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" + "go.uber.org/zap" + "sync" +) + +func newWatcher(spaceId, aclId string, h synchandler.SyncHandler) (w *watcher, err error) { + w = &watcher{ + aclId: aclId, + spaceId: spaceId, + handler: h, + ready: make(chan struct{}), + } + if w.logId, err = cidToByte(aclId); err != nil { + return nil, err + } + return +} + +type watcher struct { + spaceId string + aclId string + logId []byte + handler synchandler.SyncHandler + ready chan struct{} + isReady sync.Once + err error +} + +func (w *watcher) AddConsensusRecords(recs []*consensusproto.Record) { + w.isReady.Do(func() { + close(w.ready) + }) + records := make([]*aclrecordproto.RawACLRecordWithId, 0, len(recs)) + + for _, rec := range recs { + recId, err := cidToString(rec.Id) + if err != nil { + log.Error("received invalid id from consensus node", zap.Error(err)) + continue + } + records = append(records, &aclrecordproto.RawACLRecordWithId{ + Payload: rec.Payload, + Id: recId, + }) + } + + aclReq := &aclrecordproto.ACLSyncMessage{ + Content: &aclrecordproto.ACLSyncContentValue{ + Value: &aclrecordproto.ACLSyncContentValue_AddRecords{ + AddRecords: &aclrecordproto.ACLAddRecords{ + Records: records, + }, + }, + }, + } + payload, err := aclReq.Marshal() + if err != nil { + log.Error("acl payload marshal error", zap.Error(err)) + return + } + req := &spacesyncproto.ObjectSyncMessage{ + SpaceId: w.spaceId, + Payload: payload, + ObjectId: w.aclId, + } + + if err = w.handler.HandleMessage(context.TODO(), "", req); err != nil { + log.Warn("handle message error", zap.Error(err)) + } +} + +func (w *watcher) AddConsensusError(err error) { + w.isReady.Do(func() { + w.err = err + close(w.ready) + }) +} + +func (w *watcher) Ready(ctx context.Context) (err error) { + select { + case <-w.ready: + return w.err + case <-ctx.Done(): + return ctx.Err() + } +} diff --git a/node/storage/liststorage.go b/node/storage/liststorage.go index c3ba4f92..e7fa3aba 100644 --- a/node/storage/liststorage.go +++ b/node/storage/liststorage.go @@ -82,8 +82,8 @@ func createListStorage(db *pogreb.DB, root *aclrecordproto.RawACLRecordWithId) ( return } -func (l *listStorage) ID() (string, error) { - return l.id, nil +func (l *listStorage) Id() string { + return l.id } func (l *listStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index f82d85ba..b15e1a4d 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -5,7 +5,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "go.uber.org/zap" "path" "sync" @@ -22,7 +22,7 @@ type spaceStorage struct { spaceId string objDb *pogreb.DB keys spaceKeys - aclStorage storage2.ListStorage + aclStorage storage.ListStorage header *spacesyncproto.RawSpaceHeaderWithId mx sync.Mutex } @@ -129,15 +129,15 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate return } -func (s *spaceStorage) ID() (string, error) { - return s.spaceId, nil +func (s *spaceStorage) Id() string { + return s.spaceId } -func (s *spaceStorage) TreeStorage(id string) (storage2.TreeStorage, error) { +func (s *spaceStorage) TreeStorage(id string) (storage.TreeStorage, error) { return newTreeStorage(s.objDb, id) } -func (s *spaceStorage) CreateTreeStorage(payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { +func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { // we have mutex here, so we prevent overwriting the heads of a tree on concurrent creation s.mx.Lock() defer s.mx.Unlock() @@ -145,7 +145,7 @@ func (s *spaceStorage) CreateTreeStorage(payload storage2.TreeStorageCreatePaylo return createTreeStorage(s.objDb, payload) } -func (s *spaceStorage) ACLStorage() (storage2.ListStorage, error) { +func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) { return s.aclStorage, nil } diff --git a/node/storage/treestorage.go b/node/storage/treestorage.go index 7ad33aa1..f35872ec 100644 --- a/node/storage/treestorage.go +++ b/node/storage/treestorage.go @@ -3,7 +3,7 @@ package storage import ( "context" "github.com/akrylysov/pogreb" - storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" ) @@ -14,14 +14,14 @@ type treeStorage struct { root *treechangeproto.RawTreeChangeWithId } -func newTreeStorage(db *pogreb.DB, treeId string) (ts storage2.TreeStorage, err error) { +func newTreeStorage(db *pogreb.DB, treeId string) (ts storage.TreeStorage, err error) { keys := newTreeKeys(treeId) heads, err := db.Get(keys.HeadsKey()) if err != nil { return } if heads == nil { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId return } @@ -30,7 +30,7 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage2.TreeStorage, err return } if root == nil { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId return } @@ -47,18 +47,18 @@ func newTreeStorage(db *pogreb.DB, treeId string) (ts storage2.TreeStorage, err return } -func createTreeStorage(db *pogreb.DB, payload storage2.TreeStorageCreatePayload) (ts storage2.TreeStorage, err error) { +func createTreeStorage(db *pogreb.DB, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) { keys := newTreeKeys(payload.TreeId) has, err := db.Has(keys.HeadsKey()) if err != nil { return } if has { - err = storage2.ErrTreeExists + err = storage.ErrTreeExists return } - heads := storage2.CreateHeadsPayload(payload.Heads) + heads := storage.CreateHeadsPayload(payload.Heads) for _, ch := range payload.Changes { err = db.Put(keys.RawChangeKey(ch.Id), ch.GetRawChange()) @@ -86,8 +86,8 @@ func createTreeStorage(db *pogreb.DB, payload storage2.TreeStorageCreatePayload) return } -func (t *treeStorage) ID() (string, error) { - return t.id, nil +func (t *treeStorage) Id() string { + return t.id } func (t *treeStorage) Root() (raw *treechangeproto.RawTreeChangeWithId, err error) { @@ -100,15 +100,15 @@ func (t *treeStorage) Heads() (heads []string, err error) { return } if headsBytes == nil { - err = storage2.ErrUnknownTreeId + err = storage.ErrUnknownTreeId return } - heads = storage2.ParseHeads(headsBytes) + heads = storage.ParseHeads(headsBytes) return } func (t *treeStorage) SetHeads(heads []string) (err error) { - payload := storage2.CreateHeadsPayload(heads) + payload := storage.CreateHeadsPayload(heads) return t.db.Put(t.keys.HeadsKey(), payload) } @@ -122,7 +122,7 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha return } if res == nil { - err = storage2.ErrUnkownChange + err = storage.ErrUnkownChange } raw = &treechangeproto.RawTreeChangeWithId{ From 9c1c1e609d02725597c0b7639eed2dba0b3581c4 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 26 Oct 2022 21:00:15 +0200 Subject: [PATCH 200/219] Finish pogreb tests and fix some issues --- node/storage/keys.go | 14 +++- node/storage/liststorage_test.go | 6 +- node/storage/spacestorage.go | 8 +-- node/storage/spacestorage_test.go | 104 ++++++++++++++++++++++++++++++ node/storage/treestorage_test.go | 14 ++-- 5 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 node/storage/spacestorage_test.go diff --git a/node/storage/keys.go b/node/storage/keys.go index 85dd46aa..e21a7140 100644 --- a/node/storage/keys.go +++ b/node/storage/keys.go @@ -62,5 +62,17 @@ func (s spaceKeys) HeaderKey() []byte { } func isRootIdKey(key string) bool { - return strings.HasPrefix(key, "t/") && strings.HasSuffix(key, "heads") + return strings.HasPrefix(key, "t/") && strings.HasSuffix(key, "/heads") +} + +func getRootId(key string) string { + prefixLen := 2 // len("t/") + suffixLen := 6 // len("/heads") + rootLen := len(key) - suffixLen - prefixLen + sBuf := strings.Builder{} + sBuf.Grow(rootLen) + for i := prefixLen; i < prefixLen+rootLen; i++ { + sBuf.WriteByte(key[i]) + } + return sBuf.String() } diff --git a/node/storage/liststorage_test.go b/node/storage/liststorage_test.go index f0a35471..ad6371ab 100644 --- a/node/storage/liststorage_test.go +++ b/node/storage/liststorage_test.go @@ -8,7 +8,7 @@ import ( "testing" ) -func (fx *fixture) testListInDB(t *testing.T, store storage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) { +func testListInDB(t *testing.T, store storage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) { require.Equal(t, store.ID(), root.Id) aclRoot, err := store.Root() @@ -28,7 +28,7 @@ func TestListStorage_Create(t *testing.T) { aclRoot := &aclrecordproto.RawACLRecordWithId{Payload: []byte("root"), Id: "someRootId"} listStore, err := createListStorage(fx.db, aclRoot) require.NoError(t, err) - fx.testListInDB(t, listStore, aclRoot, aclRoot.Id) + testListInDB(t, listStore, aclRoot, aclRoot.Id) } func TestListStorage_Methods(t *testing.T) { @@ -43,7 +43,7 @@ func TestListStorage_Methods(t *testing.T) { defer fx.stop(t) listStore, err := newListStorage(fx.db) require.NoError(t, err) - fx.testListInDB(t, listStore, aclRoot, aclRoot.Id) + testListInDB(t, listStore, aclRoot, aclRoot.Id) t.Run("set head", func(t *testing.T) { head := "newHead" diff --git a/node/storage/spacestorage.go b/node/storage/spacestorage.go index fc2f073a..eed05609 100644 --- a/node/storage/spacestorage.go +++ b/node/storage/spacestorage.go @@ -88,8 +88,8 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate } defer func() { - log.With(zap.String("id", payload.SpaceHeaderWithId.Id), zap.Error(err)).Warn("failed to create storage") if err != nil { + log.With(zap.String("id", payload.SpaceHeaderWithId.Id), zap.Error(err)).Warn("failed to create storage") db.Close() } }() @@ -156,13 +156,13 @@ func (s *spaceStorage) SpaceHeader() (header *spacesyncproto.RawSpaceHeaderWithI func (s *spaceStorage) StoredIds() (ids []string, err error) { index := s.objDb.Items() - key, val, err := index.Next() + key, _, err := index.Next() for err == nil { strKey := string(key) if isRootIdKey(strKey) { - ids = append(ids, string(val)) + ids = append(ids, getRootId(strKey)) } - key, val, err = index.Next() + key, _, err = index.Next() } if err != pogreb.ErrIterationDone { diff --git a/node/storage/spacestorage_test.go b/node/storage/spacestorage_test.go new file mode 100644 index 00000000..562185ca --- /dev/null +++ b/node/storage/spacestorage_test.go @@ -0,0 +1,104 @@ +package storage + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/stretchr/testify/require" + "os" + "strconv" + "testing" +) + +func spaceTestPayload() spacestorage.SpaceStorageCreatePayload { + header := &spacesyncproto.RawSpaceHeaderWithId{ + RawHeader: []byte("header"), + Id: "headerId", + } + aclRoot := &aclrecordproto.RawACLRecordWithId{ + Payload: []byte("aclRoot"), + Id: "aclRootId", + } + return spacestorage.SpaceStorageCreatePayload{ + RecWithId: aclRoot, + SpaceHeaderWithId: header, + } +} + +func testSpaceInDB(t *testing.T, store spacestorage.SpaceStorage, payload spacestorage.SpaceStorageCreatePayload) { + header, err := store.SpaceHeader() + require.NoError(t, err) + require.Equal(t, payload.SpaceHeaderWithId, header) + + aclStorage, err := store.ACLStorage() + require.NoError(t, err) + testListInDB(t, aclStorage, payload.RecWithId, payload.RecWithId.Id) +} + +func TestSpaceStorage_Create(t *testing.T) { + dir, err := os.MkdirTemp("", "") + require.NoError(t, err) + + payload := spaceTestPayload() + store, err := createSpaceStorage(dir, payload) + require.NoError(t, err) + defer func() { + require.NoError(t, store.Close()) + }() + + testSpaceInDB(t, store, payload) +} + +func TestSpaceStorage_NewAndCreateTree(t *testing.T) { + dir, err := os.MkdirTemp("", "") + require.NoError(t, err) + + payload := spaceTestPayload() + store, err := createSpaceStorage(dir, payload) + require.NoError(t, err) + require.NoError(t, store.Close()) + + store, err = newSpaceStorage(dir, payload.SpaceHeaderWithId.Id) + require.NoError(t, err) + defer func() { + require.NoError(t, store.Close()) + }() + testSpaceInDB(t, store, payload) + + t.Run("create tree and get tree", func(t *testing.T) { + payload := treeTestPayload() + treeStore, err := store.CreateTreeStorage(payload) + require.NoError(t, err) + testTreePayloadInDB(t, treeStore, payload) + + otherStore, err := store.TreeStorage(payload.RootRawChange.Id) + require.NoError(t, err) + testTreePayloadInDB(t, otherStore, payload) + }) +} + +func TestSpaceStorage_StoredIds(t *testing.T) { + dir, err := os.MkdirTemp("", "") + require.NoError(t, err) + + payload := spaceTestPayload() + store, err := createSpaceStorage(dir, payload) + require.NoError(t, err) + defer func() { + require.NoError(t, store.Close()) + }() + + n := 5 + var ids []string + for i := 0; i < n; i++ { + treePayload := treeTestPayload() + treePayload.RootRawChange.Id += strconv.Itoa(i) + ids = append(ids, treePayload.RootRawChange.Id) + _, err := store.CreateTreeStorage(treePayload) + require.NoError(t, err) + } + + storedIds, err := store.StoredIds() + require.NoError(t, err) + require.Equal(t, ids, storedIds) +} diff --git a/node/storage/treestorage_test.go b/node/storage/treestorage_test.go index c5e6feca..c063a97e 100644 --- a/node/storage/treestorage_test.go +++ b/node/storage/treestorage_test.go @@ -38,7 +38,11 @@ func (fx *fixture) open(t *testing.T) { require.NoError(t, err) } -func (fx *fixture) testTreePayloadInDB(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { +func (fx *fixture) stop(t *testing.T) { + require.NoError(t, fx.db.Close()) +} + +func testTreePayloadInDB(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { require.Equal(t, payload.RootRawChange.Id, store.ID()) root, err := store.Root() @@ -57,10 +61,6 @@ func (fx *fixture) testTreePayloadInDB(t *testing.T, store storage.TreeStorage, return } -func (fx *fixture) stop(t *testing.T) { - require.NoError(t, fx.db.Close()) -} - func TestTreeStorage_Create(t *testing.T) { fx := newFixture(t) fx.open(t) @@ -69,7 +69,7 @@ func TestTreeStorage_Create(t *testing.T) { payload := treeTestPayload() store, err := createTreeStorage(fx.db, payload) require.NoError(t, err) - fx.testTreePayloadInDB(t, store, payload) + testTreePayloadInDB(t, store, payload) } func TestTreeStorage_Methods(t *testing.T) { @@ -84,7 +84,7 @@ func TestTreeStorage_Methods(t *testing.T) { defer fx.stop(t) store, err := newTreeStorage(fx.db, payload.RootRawChange.Id) require.NoError(t, err) - fx.testTreePayloadInDB(t, store, payload) + testTreePayloadInDB(t, store, payload) t.Run("update heads", func(t *testing.T) { newHeads := []string{"a", "b"} From b9db1881ca8ce8c2f51d9fa07507743d2c5097f5 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 26 Oct 2022 21:26:36 +0200 Subject: [PATCH 201/219] Add badger list storage and tree storage test --- client/storage/liststorage.go | 4 +- client/storage/liststorage_test.go | 61 +++++++++++++++ client/storage/treestorage_test.go | 118 +++++++++++++++++++++++++++++ 3 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 client/storage/liststorage_test.go create mode 100644 client/storage/treestorage_test.go diff --git a/client/storage/liststorage.go b/client/storage/liststorage.go index 6fad213d..40d46e38 100644 --- a/client/storage/liststorage.go +++ b/client/storage/liststorage.go @@ -37,7 +37,7 @@ func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls storage. ls = &listStorage{ db: db, - keys: newACLKeys(spaceId), + keys: keys, id: stringId, root: rootWithId, } @@ -70,7 +70,7 @@ func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *acl ls = &listStorage{ db: db, - keys: newACLKeys(spaceId), + keys: keys, id: root.Id, root: root, } diff --git a/client/storage/liststorage_test.go b/client/storage/liststorage_test.go new file mode 100644 index 00000000..4d8cf9b5 --- /dev/null +++ b/client/storage/liststorage_test.go @@ -0,0 +1,61 @@ +package storage + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" + "github.com/dgraph-io/badger/v3" + "github.com/stretchr/testify/require" + "testing" +) + +func testListInDB(t *testing.T, store storage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) { + require.Equal(t, store.ID(), root.Id) + + aclRoot, err := store.Root() + require.NoError(t, err) + require.Equal(t, root, aclRoot) + + aclHead, err := store.Head() + require.NoError(t, err) + require.Equal(t, head, aclHead) +} + +func TestListStorage(t *testing.T) { + fx := newFixture(t) + fx.open(t) + defer fx.stop(t) + spaceId := "spaceId" + aclRoot := &aclrecordproto.RawACLRecordWithId{Payload: []byte("root"), Id: "someRootId"} + + fx.db.Update(func(txn *badger.Txn) error { + _, err := createListStorage(spaceId, fx.db, txn, aclRoot) + require.NoError(t, err) + return nil + }) + + var listStore storage.ListStorage + fx.db.View(func(txn *badger.Txn) (err error) { + listStore, err = newListStorage(spaceId, fx.db, txn) + require.NoError(t, err) + testListInDB(t, listStore, aclRoot, aclRoot.Id) + + return nil + }) + + t.Run("set head", func(t *testing.T) { + head := "newHead" + require.NoError(t, listStore.SetHead(head)) + aclHead, err := listStore.Head() + require.NoError(t, err) + require.Equal(t, head, aclHead) + }) + + t.Run("add raw record and get raw record", func(t *testing.T) { + newRec := &aclrecordproto.RawACLRecordWithId{Payload: []byte("rec"), Id: "someRecId"} + require.NoError(t, listStore.AddRawRecord(context.Background(), newRec)) + aclRec, err := listStore.GetRawRecord(context.Background(), newRec.Id) + require.NoError(t, err) + require.Equal(t, newRec, aclRec) + }) +} diff --git a/client/storage/treestorage_test.go b/client/storage/treestorage_test.go new file mode 100644 index 00000000..fd6062cd --- /dev/null +++ b/client/storage/treestorage_test.go @@ -0,0 +1,118 @@ +package storage + +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/dgraph-io/badger/v3" + "github.com/stretchr/testify/require" + "os" + "testing" +) + +func treeTestPayload() storage.TreeStorageCreatePayload { + rootRawChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some"), Id: "someRootId"} + otherChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some other"), Id: "otherId"} + changes := []*treechangeproto.RawTreeChangeWithId{rootRawChange, otherChange} + return storage.TreeStorageCreatePayload{ + RootRawChange: rootRawChange, + Changes: changes, + Heads: []string{rootRawChange.Id}, + } +} + +type fixture struct { + dir string + db *badger.DB +} + +func testTreePayloadInDB(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { + require.Equal(t, payload.RootRawChange.Id, store.ID()) + + root, err := store.Root() + require.NoError(t, err) + require.Equal(t, root, payload.RootRawChange) + + heads, err := store.Heads() + require.NoError(t, err) + require.Equal(t, payload.Heads, heads) + + for _, ch := range payload.Changes { + dbCh, err := store.GetRawChange(context.Background(), ch.Id) + require.NoError(t, err) + require.Equal(t, ch, dbCh) + } + return +} + +func newFixture(t *testing.T) *fixture { + dir, err := os.MkdirTemp("", "") + require.NoError(t, err) + return &fixture{dir: dir} +} + +func (fx *fixture) open(t *testing.T) { + var err error + fx.db, err = badger.Open(badger.DefaultOptions(fx.dir)) + require.NoError(t, err) +} + +func (fx *fixture) stop(t *testing.T) { + require.NoError(t, fx.db.Close()) +} + +func TestTreeStorage_Create(t *testing.T) { + fx := newFixture(t) + fx.open(t) + defer fx.stop(t) + + spaceId := "spaceId" + payload := treeTestPayload() + store, err := createTreeStorage(fx.db, spaceId, payload) + require.NoError(t, err) + testTreePayloadInDB(t, store, payload) +} + +func TestTreeStorage_Methods(t *testing.T) { + fx := newFixture(t) + fx.open(t) + payload := treeTestPayload() + spaceId := "spaceId" + _, err := createTreeStorage(fx.db, spaceId, payload) + require.NoError(t, err) + fx.stop(t) + + fx.open(t) + defer fx.stop(t) + store, err := newTreeStorage(fx.db, spaceId, payload.RootRawChange.Id) + require.NoError(t, err) + testTreePayloadInDB(t, store, payload) + + t.Run("update heads", func(t *testing.T) { + newHeads := []string{"a", "b"} + require.NoError(t, store.SetHeads(newHeads)) + heads, err := store.Heads() + require.NoError(t, err) + require.Equal(t, newHeads, heads) + }) + + t.Run("add raw change, get change and has change", func(t *testing.T) { + newChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("ab"), Id: "newId"} + require.NoError(t, store.AddRawChange(newChange)) + rawCh, err := store.GetRawChange(context.Background(), newChange.Id) + require.NoError(t, err) + require.Equal(t, newChange, rawCh) + has, err := store.HasChange(context.Background(), newChange.Id) + require.NoError(t, err) + require.True(t, has) + }) + + t.Run("get and has for unknown change", func(t *testing.T) { + incorrectId := "incorrectId" + _, err := store.GetRawChange(context.Background(), incorrectId) + require.Error(t, err) + has, err := store.HasChange(context.Background(), incorrectId) + require.NoError(t, err) + require.False(t, has) + }) +} From 1920a190bc29cc491c55ef05327fa56317f54b4e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 26 Oct 2022 21:48:59 +0200 Subject: [PATCH 202/219] Add space storage test --- client/storage/spacestorage_test.go | 106 ++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 client/storage/spacestorage_test.go diff --git a/client/storage/spacestorage_test.go b/client/storage/spacestorage_test.go new file mode 100644 index 00000000..b8a51c7a --- /dev/null +++ b/client/storage/spacestorage_test.go @@ -0,0 +1,106 @@ +package storage + +import ( + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/stretchr/testify/require" + "strconv" + "testing" +) + +func spaceTestPayload() spacestorage.SpaceStorageCreatePayload { + header := &spacesyncproto.RawSpaceHeaderWithId{ + RawHeader: []byte("header"), + Id: "headerId", + } + aclRoot := &aclrecordproto.RawACLRecordWithId{ + Payload: []byte("aclRoot"), + Id: "aclRootId", + } + return spacestorage.SpaceStorageCreatePayload{ + RecWithId: aclRoot, + SpaceHeaderWithId: header, + } +} + +func testSpaceInDB(t *testing.T, store spacestorage.SpaceStorage, payload spacestorage.SpaceStorageCreatePayload) { + header, err := store.SpaceHeader() + require.NoError(t, err) + require.Equal(t, payload.SpaceHeaderWithId, header) + + aclStorage, err := store.ACLStorage() + require.NoError(t, err) + testListInDB(t, aclStorage, payload.RecWithId, payload.RecWithId.Id) +} + +func TestSpaceStorage_Create(t *testing.T) { + fx := newFixture(t) + fx.open(t) + defer fx.stop(t) + + payload := spaceTestPayload() + store, err := createSpaceStorage(fx.db, payload) + require.NoError(t, err) + defer func() { + require.NoError(t, store.Close()) + }() + + testSpaceInDB(t, store, payload) +} + +func TestSpaceStorage_NewAndCreateTree(t *testing.T) { + fx := newFixture(t) + fx.open(t) + + payload := spaceTestPayload() + store, err := createSpaceStorage(fx.db, payload) + require.NoError(t, err) + require.NoError(t, store.Close()) + fx.stop(t) + + fx.open(t) + defer fx.stop(t) + store, err = newSpaceStorage(fx.db, payload.SpaceHeaderWithId.Id) + require.NoError(t, err) + testSpaceInDB(t, store, payload) + + t.Run("create tree and get tree", func(t *testing.T) { + payload := treeTestPayload() + treeStore, err := store.CreateTreeStorage(payload) + require.NoError(t, err) + testTreePayloadInDB(t, treeStore, payload) + + otherStore, err := store.TreeStorage(payload.RootRawChange.Id) + require.NoError(t, err) + testTreePayloadInDB(t, otherStore, payload) + }) +} + +func TestSpaceStorage_StoredIds(t *testing.T) { + fx := newFixture(t) + fx.open(t) + defer fx.stop(t) + + payload := spaceTestPayload() + store, err := createSpaceStorage(fx.db, payload) + require.NoError(t, err) + defer func() { + require.NoError(t, store.Close()) + }() + + n := 5 + var ids []string + for i := 0; i < n; i++ { + treePayload := treeTestPayload() + treePayload.RootRawChange.Id += strconv.Itoa(i) + ids = append(ids, treePayload.RootRawChange.Id) + _, err := store.CreateTreeStorage(treePayload) + require.NoError(t, err) + } + + storedIds, err := store.StoredIds() + require.NoError(t, err) + require.Equal(t, ids, storedIds) +} + From ab4fee82296a549665cb7982f0e8e7f0296f1a8b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 26 Oct 2022 22:03:02 +0200 Subject: [PATCH 203/219] Update tests --- client/storage/liststorage_test.go | 11 +++++++++++ client/storage/spacestorage_test.go | 10 ++++++---- client/storage/treestorage_test.go | 5 +++++ node/storage/liststorage_test.go | 7 +++++++ node/storage/spacestorage_test.go | 11 +++++++---- node/storage/treestorage_test.go | 5 +++++ 6 files changed, 41 insertions(+), 8 deletions(-) diff --git a/client/storage/liststorage_test.go b/client/storage/liststorage_test.go index 4d8cf9b5..c6ac8225 100644 --- a/client/storage/liststorage_test.go +++ b/client/storage/liststorage_test.go @@ -43,6 +43,17 @@ func TestListStorage(t *testing.T) { return nil }) + t.Run("create same storage returns no error", func(t *testing.T) { + fx.db.View(func(txn *badger.Txn) error { + // this is ok, because we only create new list storage when we create space storage + listStore, err := createListStorage(spaceId, fx.db, txn, aclRoot) + require.NoError(t, err) + testListInDB(t, listStore, aclRoot, aclRoot.Id) + + return nil + }) + }) + t.Run("set head", func(t *testing.T) { head := "newHead" require.NoError(t, listStore.SetHead(head)) diff --git a/client/storage/spacestorage_test.go b/client/storage/spacestorage_test.go index b8a51c7a..fb099365 100644 --- a/client/storage/spacestorage_test.go +++ b/client/storage/spacestorage_test.go @@ -42,11 +42,14 @@ func TestSpaceStorage_Create(t *testing.T) { payload := spaceTestPayload() store, err := createSpaceStorage(fx.db, payload) require.NoError(t, err) - defer func() { - require.NoError(t, store.Close()) - }() testSpaceInDB(t, store, payload) + require.NoError(t, store.Close()) + + t.Run("create same storage returns error", func(t *testing.T) { + _, err := createSpaceStorage(fx.db, payload) + require.Error(t, err) + }) } func TestSpaceStorage_NewAndCreateTree(t *testing.T) { @@ -103,4 +106,3 @@ func TestSpaceStorage_StoredIds(t *testing.T) { require.NoError(t, err) require.Equal(t, ids, storedIds) } - diff --git a/client/storage/treestorage_test.go b/client/storage/treestorage_test.go index fd6062cd..d0fdab35 100644 --- a/client/storage/treestorage_test.go +++ b/client/storage/treestorage_test.go @@ -71,6 +71,11 @@ func TestTreeStorage_Create(t *testing.T) { store, err := createTreeStorage(fx.db, spaceId, payload) require.NoError(t, err) testTreePayloadInDB(t, store, payload) + + t.Run("create same storage returns error", func(t *testing.T) { + _, err := createTreeStorage(fx.db, spaceId, payload) + require.Error(t, err) + }) } func TestTreeStorage_Methods(t *testing.T) { diff --git a/node/storage/liststorage_test.go b/node/storage/liststorage_test.go index ad6371ab..cd563837 100644 --- a/node/storage/liststorage_test.go +++ b/node/storage/liststorage_test.go @@ -29,6 +29,13 @@ func TestListStorage_Create(t *testing.T) { listStore, err := createListStorage(fx.db, aclRoot) require.NoError(t, err) testListInDB(t, listStore, aclRoot, aclRoot.Id) + + t.Run("create same list storage returns nil", func(t *testing.T) { + // this is ok, because we only create new list storage when we create space storage + listStore, err := createListStorage(fx.db, aclRoot) + require.NoError(t, err) + testListInDB(t, listStore, aclRoot, aclRoot.Id) + }) } func TestListStorage_Methods(t *testing.T) { diff --git a/node/storage/spacestorage_test.go b/node/storage/spacestorage_test.go index 562185ca..ad29b0a7 100644 --- a/node/storage/spacestorage_test.go +++ b/node/storage/spacestorage_test.go @@ -42,11 +42,14 @@ func TestSpaceStorage_Create(t *testing.T) { payload := spaceTestPayload() store, err := createSpaceStorage(dir, payload) require.NoError(t, err) - defer func() { - require.NoError(t, store.Close()) - }() testSpaceInDB(t, store, payload) + require.NoError(t, store.Close()) + + t.Run("create same storage returns error", func(t *testing.T) { + _, err := createSpaceStorage(dir, payload) + require.Error(t, err) + }) } func TestSpaceStorage_NewAndCreateTree(t *testing.T) { @@ -97,7 +100,7 @@ func TestSpaceStorage_StoredIds(t *testing.T) { _, err := store.CreateTreeStorage(treePayload) require.NoError(t, err) } - + storedIds, err := store.StoredIds() require.NoError(t, err) require.Equal(t, ids, storedIds) diff --git a/node/storage/treestorage_test.go b/node/storage/treestorage_test.go index c063a97e..b0f3855b 100644 --- a/node/storage/treestorage_test.go +++ b/node/storage/treestorage_test.go @@ -70,6 +70,11 @@ func TestTreeStorage_Create(t *testing.T) { store, err := createTreeStorage(fx.db, payload) require.NoError(t, err) testTreePayloadInDB(t, store, payload) + + t.Run("create same storage returns error", func(t *testing.T) { + _, err := createTreeStorage(fx.db, payload) + require.Error(t, err) + }) } func TestTreeStorage_Methods(t *testing.T) { From f4027b433d406817253b137be7dd1d113301c5e0 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 26 Oct 2022 22:05:55 +0200 Subject: [PATCH 204/219] Fix mocks and formatting --- .../storage/mock_storage/mock_storage.go | 5 ++--- .../synctree/mock_synctree/mock_synctree.go | 15 --------------- common/commonspace/synctree/synctree.go | 13 +++---------- .../pkg/acl/storage/mock_storage/mock_storage.go | 10 ++++------ 4 files changed, 9 insertions(+), 34 deletions(-) diff --git a/common/commonspace/storage/mock_storage/mock_storage.go b/common/commonspace/storage/mock_storage/mock_storage.go index 422af081..fb76ad05 100644 --- a/common/commonspace/storage/mock_storage/mock_storage.go +++ b/common/commonspace/storage/mock_storage/mock_storage.go @@ -163,12 +163,11 @@ func (mr *MockSpaceStorageMockRecorder) CreateTreeStorage(arg0 interface{}) *gom } // ID mocks base method. -func (m *MockSpaceStorage) ID() (string, error) { +func (m *MockSpaceStorage) ID() string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ID") ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 + return ret0 } // ID indicates an expected call of ID. diff --git a/common/commonspace/synctree/mock_synctree/mock_synctree.go b/common/commonspace/synctree/mock_synctree/mock_synctree.go index 61cf4401..914a6ec1 100644 --- a/common/commonspace/synctree/mock_synctree/mock_synctree.go +++ b/common/commonspace/synctree/mock_synctree/mock_synctree.go @@ -6,7 +6,6 @@ package mock_synctree import ( reflect "reflect" - time "time" tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" @@ -122,20 +121,6 @@ func (mr *MockSyncClientMockRecorder) CreateNewTreeRequest() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateNewTreeRequest", reflect.TypeOf((*MockSyncClient)(nil).CreateNewTreeRequest)) } -// LastUsage mocks base method. -func (m *MockSyncClient) LastUsage() time.Time { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "LastUsage") - ret0, _ := ret[0].(time.Time) - return ret0 -} - -// LastUsage indicates an expected call of LastUsage. -func (mr *MockSyncClientMockRecorder) LastUsage() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LastUsage", reflect.TypeOf((*MockSyncClient)(nil).LastUsage)) -} - // SendAsync mocks base method. func (m *MockSyncClient) SendAsync(arg0 string, arg1 *treechangeproto.TreeSyncMessage, arg2 string) error { m.ctrl.T.Helper() diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index f1bcbb3a..ac7b5aac 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -59,9 +59,7 @@ type BuildDeps struct { TreeStorage storage.TreeStorage } -func DeriveSyncTree( - ctx context.Context, - deps CreateDeps) (t tree.ObjectTree, err error) { +func DeriveSyncTree(ctx context.Context, deps CreateDeps) (t tree.ObjectTree, err error) { t, err = createDerivedObjectTree(deps.Payload, deps.AclList, deps.CreateStorage) if err != nil { return @@ -86,9 +84,7 @@ func DeriveSyncTree( return } -func CreateSyncTree( - ctx context.Context, - deps CreateDeps) (t tree.ObjectTree, err error) { +func CreateSyncTree(ctx context.Context, deps CreateDeps) (t tree.ObjectTree, err error) { t, err = createObjectTree(deps.Payload, deps.AclList, deps.CreateStorage) if err != nil { return @@ -174,10 +170,7 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t return buildSyncTree(ctx, true, deps) } -func buildSyncTree( - ctx context.Context, - isFirstBuild bool, - deps BuildDeps) (t tree.ObjectTree, err error) { +func buildSyncTree(ctx context.Context, isFirstBuild bool, deps BuildDeps) (t tree.ObjectTree, err error) { t, err = buildObjectTree(deps.TreeStorage, deps.AclList) if err != nil { diff --git a/common/pkg/acl/storage/mock_storage/mock_storage.go b/common/pkg/acl/storage/mock_storage/mock_storage.go index bd562720..38f8a2b2 100644 --- a/common/pkg/acl/storage/mock_storage/mock_storage.go +++ b/common/pkg/acl/storage/mock_storage/mock_storage.go @@ -81,12 +81,11 @@ func (mr *MockListStorageMockRecorder) Head() *gomock.Call { } // ID mocks base method. -func (m *MockListStorage) ID() (string, error) { +func (m *MockListStorage) ID() string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ID") ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 + return ret0 } // ID indicates an expected call of ID. @@ -207,12 +206,11 @@ func (mr *MockTreeStorageMockRecorder) Heads() *gomock.Call { } // ID mocks base method. -func (m *MockTreeStorage) ID() (string, error) { +func (m *MockTreeStorage) ID() string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ID") ret0, _ := ret[0].(string) - ret1, _ := ret[1].(error) - return ret0, ret1 + return ret0 } // ID indicates an expected call of ID. From 9a202207b40be2748504313c48c2d8a9804e48af Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 27 Oct 2022 16:43:10 +0200 Subject: [PATCH 205/219] Refactor tests --- .../syncservice/streampool_test.go | 19 +------------------ common/commonspace/syncservice/syncservice.go | 4 ++-- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/common/commonspace/syncservice/streampool_test.go b/common/commonspace/syncservice/streampool_test.go index 7540e02f..47ed4ee0 100644 --- a/common/commonspace/syncservice/streampool_test.go +++ b/common/commonspace/syncservice/streampool_test.go @@ -7,26 +7,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/require" - "storj.io/drpc" "testing" "time" ) -type testPeer struct { - id string - drpc.Conn -} - -func (t testPeer) Id() string { - return t.id -} - -func (t testPeer) LastUsage() time.Time { - return time.Now() -} - -func (t testPeer) UpdateLastUsage() {} - type testServer struct { stream chan spacesyncproto.DRPCSpace_StreamStream addLog func(ctx context.Context, req *consensusproto.AddLogRequest) error @@ -79,8 +63,7 @@ func newFixture(t *testing.T, localId, remoteId peer.ID, handler MessageHandler) fx.testServer.stream = make(chan spacesyncproto.DRPCSpace_StreamStream, 1) require.NoError(t, spacesyncproto.DRPCRegisterSpace(fx.drpcTS.Mux, fx.testServer)) clientWrapper := rpctest.NewSecConnWrapper(nil, nil, localId, remoteId) - p := &testPeer{id: localId.String(), Conn: fx.drpcTS.DialWrapConn(nil, clientWrapper)} - fx.client = spacesyncproto.NewDRPCSpaceClient(p) + fx.client = spacesyncproto.NewDRPCSpaceClient(fx.drpcTS.DialWrapConn(nil, clientWrapper)) var err error fx.clientStream, err = fx.client.Stream(context.Background()) diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 40149b78..38de40f8 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -104,7 +104,7 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { stream, err := s.clientFactory.Client(peer).Stream(ctx) if err != nil { err = rpcerr.Unwrap(err) - log.With("spaceId", s.spaceId).Errorf("failed to open clientStream: %v", err) + log.With("spaceId", s.spaceId).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 @@ -113,7 +113,7 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { err = stream.Send(&spacesyncproto.ObjectSyncMessage{SpaceId: s.spaceId}) if err != nil { err = rpcerr.Unwrap(err) - log.With("spaceId", s.spaceId).Errorf("failed to send first message to clientStream: %v", err) + log.With("spaceId", s.spaceId).Errorf("failed to send first message to stream: %v", err) continue } s.streamPool.AddAndReadStreamAsync(stream) From f0b8e5ab645239ba57573cc0d5f01f3dc1d55689 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 27 Oct 2022 16:57:01 +0200 Subject: [PATCH 206/219] Further test refactoring --- client/storage/liststorage_test.go | 6 +++--- client/storage/spacestorage_test.go | 12 ++++++------ client/storage/treestorage_test.go | 6 +++--- common/pkg/acl/list/list.go | 2 +- node/storage/liststorage_test.go | 8 ++++---- node/storage/spacestorage_test.go | 12 ++++++------ node/storage/treestorage_test.go | 6 +++--- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/client/storage/liststorage_test.go b/client/storage/liststorage_test.go index c6ac8225..6afa676c 100644 --- a/client/storage/liststorage_test.go +++ b/client/storage/liststorage_test.go @@ -9,7 +9,7 @@ import ( "testing" ) -func testListInDB(t *testing.T, store storage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) { +func testList(t *testing.T, store storage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) { require.Equal(t, store.ID(), root.Id) aclRoot, err := store.Root() @@ -38,7 +38,7 @@ func TestListStorage(t *testing.T) { fx.db.View(func(txn *badger.Txn) (err error) { listStore, err = newListStorage(spaceId, fx.db, txn) require.NoError(t, err) - testListInDB(t, listStore, aclRoot, aclRoot.Id) + testList(t, listStore, aclRoot, aclRoot.Id) return nil }) @@ -48,7 +48,7 @@ func TestListStorage(t *testing.T) { // this is ok, because we only create new list storage when we create space storage listStore, err := createListStorage(spaceId, fx.db, txn, aclRoot) require.NoError(t, err) - testListInDB(t, listStore, aclRoot, aclRoot.Id) + testList(t, listStore, aclRoot, aclRoot.Id) return nil }) diff --git a/client/storage/spacestorage_test.go b/client/storage/spacestorage_test.go index fb099365..8540d338 100644 --- a/client/storage/spacestorage_test.go +++ b/client/storage/spacestorage_test.go @@ -24,14 +24,14 @@ func spaceTestPayload() spacestorage.SpaceStorageCreatePayload { } } -func testSpaceInDB(t *testing.T, store spacestorage.SpaceStorage, payload spacestorage.SpaceStorageCreatePayload) { +func testSpace(t *testing.T, store spacestorage.SpaceStorage, payload spacestorage.SpaceStorageCreatePayload) { header, err := store.SpaceHeader() require.NoError(t, err) require.Equal(t, payload.SpaceHeaderWithId, header) aclStorage, err := store.ACLStorage() require.NoError(t, err) - testListInDB(t, aclStorage, payload.RecWithId, payload.RecWithId.Id) + testList(t, aclStorage, payload.RecWithId, payload.RecWithId.Id) } func TestSpaceStorage_Create(t *testing.T) { @@ -43,7 +43,7 @@ func TestSpaceStorage_Create(t *testing.T) { store, err := createSpaceStorage(fx.db, payload) require.NoError(t, err) - testSpaceInDB(t, store, payload) + testSpace(t, store, payload) require.NoError(t, store.Close()) t.Run("create same storage returns error", func(t *testing.T) { @@ -66,17 +66,17 @@ func TestSpaceStorage_NewAndCreateTree(t *testing.T) { defer fx.stop(t) store, err = newSpaceStorage(fx.db, payload.SpaceHeaderWithId.Id) require.NoError(t, err) - testSpaceInDB(t, store, payload) + testSpace(t, store, payload) t.Run("create tree and get tree", func(t *testing.T) { payload := treeTestPayload() treeStore, err := store.CreateTreeStorage(payload) require.NoError(t, err) - testTreePayloadInDB(t, treeStore, payload) + testTreePayload(t, treeStore, payload) otherStore, err := store.TreeStorage(payload.RootRawChange.Id) require.NoError(t, err) - testTreePayloadInDB(t, otherStore, payload) + testTreePayload(t, otherStore, payload) }) } diff --git a/client/storage/treestorage_test.go b/client/storage/treestorage_test.go index d0fdab35..e2a3bcad 100644 --- a/client/storage/treestorage_test.go +++ b/client/storage/treestorage_test.go @@ -26,7 +26,7 @@ type fixture struct { db *badger.DB } -func testTreePayloadInDB(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { +func testTreePayload(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { require.Equal(t, payload.RootRawChange.Id, store.ID()) root, err := store.Root() @@ -70,7 +70,7 @@ func TestTreeStorage_Create(t *testing.T) { payload := treeTestPayload() store, err := createTreeStorage(fx.db, spaceId, payload) require.NoError(t, err) - testTreePayloadInDB(t, store, payload) + testTreePayload(t, store, payload) t.Run("create same storage returns error", func(t *testing.T) { _, err := createTreeStorage(fx.db, spaceId, payload) @@ -91,7 +91,7 @@ func TestTreeStorage_Methods(t *testing.T) { defer fx.stop(t) store, err := newTreeStorage(fx.db, spaceId, payload.RootRawChange.Id) require.NoError(t, err) - testTreePayloadInDB(t, store, payload) + testTreePayload(t, store, payload) t.Run("update heads", func(t *testing.T) { newHeads := []string{"a", "b"} diff --git a/common/pkg/acl/list/list.go b/common/pkg/acl/list/list.go index 147d2224..6e8d259e 100644 --- a/common/pkg/acl/list/list.go +++ b/common/pkg/acl/list/list.go @@ -57,7 +57,7 @@ func BuildACLListWithIdentity(acc *account.AccountData, storage storage.ListStor func BuildACLList(storage storage.ListStorage) (ACLList, error) { id := storage.ID() - return build(storage.ID(), newACLStateBuilder(), newACLRecordBuilder(id, common.NewKeychain()), storage) + return build(id, newACLStateBuilder(), newACLRecordBuilder(id, common.NewKeychain()), storage) } func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage storage.ListStorage) (list ACLList, err error) { diff --git a/node/storage/liststorage_test.go b/node/storage/liststorage_test.go index cd563837..ae04e3af 100644 --- a/node/storage/liststorage_test.go +++ b/node/storage/liststorage_test.go @@ -8,7 +8,7 @@ import ( "testing" ) -func testListInDB(t *testing.T, store storage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) { +func testList(t *testing.T, store storage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) { require.Equal(t, store.ID(), root.Id) aclRoot, err := store.Root() @@ -28,13 +28,13 @@ func TestListStorage_Create(t *testing.T) { aclRoot := &aclrecordproto.RawACLRecordWithId{Payload: []byte("root"), Id: "someRootId"} listStore, err := createListStorage(fx.db, aclRoot) require.NoError(t, err) - testListInDB(t, listStore, aclRoot, aclRoot.Id) + testList(t, listStore, aclRoot, aclRoot.Id) t.Run("create same list storage returns nil", func(t *testing.T) { // this is ok, because we only create new list storage when we create space storage listStore, err := createListStorage(fx.db, aclRoot) require.NoError(t, err) - testListInDB(t, listStore, aclRoot, aclRoot.Id) + testList(t, listStore, aclRoot, aclRoot.Id) }) } @@ -50,7 +50,7 @@ func TestListStorage_Methods(t *testing.T) { defer fx.stop(t) listStore, err := newListStorage(fx.db) require.NoError(t, err) - testListInDB(t, listStore, aclRoot, aclRoot.Id) + testList(t, listStore, aclRoot, aclRoot.Id) t.Run("set head", func(t *testing.T) { head := "newHead" diff --git a/node/storage/spacestorage_test.go b/node/storage/spacestorage_test.go index ad29b0a7..33243e0a 100644 --- a/node/storage/spacestorage_test.go +++ b/node/storage/spacestorage_test.go @@ -25,14 +25,14 @@ func spaceTestPayload() spacestorage.SpaceStorageCreatePayload { } } -func testSpaceInDB(t *testing.T, store spacestorage.SpaceStorage, payload spacestorage.SpaceStorageCreatePayload) { +func testSpace(t *testing.T, store spacestorage.SpaceStorage, payload spacestorage.SpaceStorageCreatePayload) { header, err := store.SpaceHeader() require.NoError(t, err) require.Equal(t, payload.SpaceHeaderWithId, header) aclStorage, err := store.ACLStorage() require.NoError(t, err) - testListInDB(t, aclStorage, payload.RecWithId, payload.RecWithId.Id) + testList(t, aclStorage, payload.RecWithId, payload.RecWithId.Id) } func TestSpaceStorage_Create(t *testing.T) { @@ -43,7 +43,7 @@ func TestSpaceStorage_Create(t *testing.T) { store, err := createSpaceStorage(dir, payload) require.NoError(t, err) - testSpaceInDB(t, store, payload) + testSpace(t, store, payload) require.NoError(t, store.Close()) t.Run("create same storage returns error", func(t *testing.T) { @@ -66,17 +66,17 @@ func TestSpaceStorage_NewAndCreateTree(t *testing.T) { defer func() { require.NoError(t, store.Close()) }() - testSpaceInDB(t, store, payload) + testSpace(t, store, payload) t.Run("create tree and get tree", func(t *testing.T) { payload := treeTestPayload() treeStore, err := store.CreateTreeStorage(payload) require.NoError(t, err) - testTreePayloadInDB(t, treeStore, payload) + testTreePayload(t, treeStore, payload) otherStore, err := store.TreeStorage(payload.RootRawChange.Id) require.NoError(t, err) - testTreePayloadInDB(t, otherStore, payload) + testTreePayload(t, otherStore, payload) }) } diff --git a/node/storage/treestorage_test.go b/node/storage/treestorage_test.go index b0f3855b..df83c118 100644 --- a/node/storage/treestorage_test.go +++ b/node/storage/treestorage_test.go @@ -42,7 +42,7 @@ func (fx *fixture) stop(t *testing.T) { require.NoError(t, fx.db.Close()) } -func testTreePayloadInDB(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { +func testTreePayload(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) { require.Equal(t, payload.RootRawChange.Id, store.ID()) root, err := store.Root() @@ -69,7 +69,7 @@ func TestTreeStorage_Create(t *testing.T) { payload := treeTestPayload() store, err := createTreeStorage(fx.db, payload) require.NoError(t, err) - testTreePayloadInDB(t, store, payload) + testTreePayload(t, store, payload) t.Run("create same storage returns error", func(t *testing.T) { _, err := createTreeStorage(fx.db, payload) @@ -89,7 +89,7 @@ func TestTreeStorage_Methods(t *testing.T) { defer fx.stop(t) store, err := newTreeStorage(fx.db, payload.RootRawChange.Id) require.NoError(t, err) - testTreePayloadInDB(t, store, payload) + testTreePayload(t, store, payload) t.Run("update heads", func(t *testing.T) { newHeads := []string{"a", "b"} From 08b8ecba3284981c8dd93c895a94f8bf0ec3f3ad Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Thu, 27 Oct 2022 17:09:07 +0200 Subject: [PATCH 207/219] Change invite logic --- common/pkg/acl/aclrecordproto/aclrecord.pb.go | 235 +++++++----------- .../acl/aclrecordproto/protos/aclrecord.proto | 11 +- common/pkg/acl/list/aclrecordbuilder.go | 65 +++++ common/pkg/acl/list/aclstate.go | 45 +++- common/pkg/acl/list/list_test.go | 12 +- .../acllistbuilder/liststoragebuilder.go | 38 ++- .../testutils/acllistbuilder/ymlentities.go | 4 +- .../testutils/yamltests/userjoinexample.yml | 8 +- .../testutils/yamltests/userremoveexample.yml | 8 +- 9 files changed, 228 insertions(+), 198 deletions(-) diff --git a/common/pkg/acl/aclrecordproto/aclrecord.pb.go b/common/pkg/acl/aclrecordproto/aclrecord.pb.go index e11f5209..385d7df5 100644 --- a/common/pkg/acl/aclrecordproto/aclrecord.pb.go +++ b/common/pkg/acl/aclrecordproto/aclrecord.pb.go @@ -681,10 +681,9 @@ func (m *ACLUserAdd) GetPermissions() ACLUserPermissions { type ACLUserInvite struct { AcceptPublicKey []byte `protobuf:"bytes,1,opt,name=acceptPublicKey,proto3" json:"acceptPublicKey,omitempty"` - EncryptPublicKey []byte `protobuf:"bytes,2,opt,name=encryptPublicKey,proto3" json:"encryptPublicKey,omitempty"` + EncryptSymKeyHash uint64 `protobuf:"varint,2,opt,name=encryptSymKeyHash,proto3" json:"encryptSymKeyHash,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,3,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` Permissions ACLUserPermissions `protobuf:"varint,4,opt,name=permissions,proto3,enum=aclrecord.ACLUserPermissions" json:"permissions,omitempty"` - InviteId string `protobuf:"bytes,5,opt,name=inviteId,proto3" json:"inviteId,omitempty"` } func (m *ACLUserInvite) Reset() { *m = ACLUserInvite{} } @@ -727,11 +726,11 @@ func (m *ACLUserInvite) GetAcceptPublicKey() []byte { return nil } -func (m *ACLUserInvite) GetEncryptPublicKey() []byte { +func (m *ACLUserInvite) GetEncryptSymKeyHash() uint64 { if m != nil { - return m.EncryptPublicKey + return m.EncryptSymKeyHash } - return nil + return 0 } func (m *ACLUserInvite) GetEncryptedReadKeys() [][]byte { @@ -748,18 +747,11 @@ func (m *ACLUserInvite) GetPermissions() ACLUserPermissions { return ACLUserPermissions_Admin } -func (m *ACLUserInvite) GetInviteId() string { - if m != nil { - return m.InviteId - } - return "" -} - type ACLUserJoin struct { Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` EncryptionKey []byte `protobuf:"bytes,2,opt,name=encryptionKey,proto3" json:"encryptionKey,omitempty"` AcceptSignature []byte `protobuf:"bytes,3,opt,name=acceptSignature,proto3" json:"acceptSignature,omitempty"` - InviteId string `protobuf:"bytes,4,opt,name=inviteId,proto3" json:"inviteId,omitempty"` + AcceptPubKey []byte `protobuf:"bytes,4,opt,name=acceptPubKey,proto3" json:"acceptPubKey,omitempty"` EncryptedReadKeys [][]byte `protobuf:"bytes,5,rep,name=encryptedReadKeys,proto3" json:"encryptedReadKeys,omitempty"` } @@ -817,11 +809,11 @@ func (m *ACLUserJoin) GetAcceptSignature() []byte { return nil } -func (m *ACLUserJoin) GetInviteId() string { +func (m *ACLUserJoin) GetAcceptPubKey() []byte { if m != nil { - return m.InviteId + return m.AcceptPubKey } - return "" + return nil } func (m *ACLUserJoin) GetEncryptedReadKeys() [][]byte { @@ -1019,61 +1011,61 @@ func init() { } var fileDescriptor_14abe0d1b4206d54 = []byte{ - // 859 bytes of a gzipped FileDescriptorProto + // 854 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x6f, 0x1b, 0x45, 0x14, 0xdf, 0x59, 0x3b, 0x71, 0xf6, 0xd9, 0x6d, 0xdc, 0x11, 0xa4, 0xab, 0xa8, 0x58, 0xd6, 0x8a, - 0x83, 0x55, 0x81, 0x0b, 0x06, 0xa9, 0x28, 0x07, 0x90, 0x6b, 0x5a, 0xd9, 0x24, 0x87, 0x6a, 0x02, - 0x14, 0x71, 0x9b, 0xee, 0x8e, 0x92, 0x51, 0xed, 0xdd, 0xd5, 0xec, 0xd8, 0xc8, 0x47, 0xce, 0x5c, - 0xe0, 0x23, 0xf0, 0x41, 0x38, 0x71, 0xe1, 0xd8, 0x0b, 0x12, 0x47, 0x94, 0x7c, 0x01, 0xee, 0x5c, - 0xd0, 0xcc, 0xfe, 0xdf, 0xb5, 0x2d, 0x2a, 0x59, 0x3d, 0x24, 0xde, 0xf7, 0xde, 0xef, 0x3d, 0xff, - 0xe6, 0xf7, 0xde, 0xbc, 0x35, 0x7c, 0x18, 0xbe, 0xba, 0x7a, 0x44, 0xdd, 0xb9, 0xfa, 0x13, 0xcc, - 0x0d, 0x84, 0x17, 0x8a, 0x40, 0x06, 0x8f, 0xf4, 0xff, 0x28, 0xf7, 0x0e, 0xb5, 0x03, 0x5b, 0x99, - 0xc3, 0x79, 0x06, 0x1d, 0x42, 0x7f, 0x18, 0x4f, 0x2e, 0x88, 0xb6, 0xb1, 0x0d, 0xad, 0x90, 0xae, - 0xe7, 0x01, 0xf5, 0x6c, 0xd4, 0x47, 0x83, 0x0e, 0x49, 0x4d, 0xfc, 0x00, 0xac, 0x88, 0x5f, 0xf9, - 0x54, 0x2e, 0x05, 0xb3, 0x4d, 0x1d, 0xcb, 0x1d, 0xce, 0xe7, 0x80, 0x8b, 0x75, 0x5e, 0x70, 0x79, - 0x3d, 0xdb, 0x55, 0xed, 0x2e, 0x98, 0xdc, 0xd3, 0x65, 0x2c, 0x62, 0x72, 0xcf, 0xf9, 0x15, 0x81, - 0x95, 0xb3, 0x38, 0x81, 0xc3, 0x50, 0xb0, 0xd5, 0x2c, 0x4e, 0xb3, 0x48, 0x62, 0xe1, 0x53, 0x38, - 0xe2, 0x1e, 0xf3, 0x25, 0x97, 0xeb, 0x84, 0x42, 0x66, 0x63, 0x0c, 0x4d, 0x8f, 0x4a, 0x6a, 0x37, - 0xb4, 0x5f, 0x3f, 0xe3, 0x21, 0x60, 0x77, 0x29, 0x04, 0xf3, 0x25, 0x61, 0xd4, 0x3b, 0x67, 0xeb, - 0x29, 0x8d, 0xae, 0xed, 0x66, 0x1f, 0x0d, 0x9a, 0x64, 0x43, 0x44, 0x9d, 0x51, 0xf2, 0x05, 0x8b, - 0x24, 0x5d, 0x84, 0xf6, 0x41, 0x1f, 0x0d, 0x1a, 0x24, 0x77, 0x38, 0x3f, 0x99, 0xd0, 0x52, 0x1c, - 0x83, 0x40, 0x96, 0x98, 0xa0, 0x0a, 0x93, 0xf7, 0xe1, 0x0e, 0xf3, 0x5d, 0xb1, 0x0e, 0x25, 0x0f, - 0xfc, 0x73, 0x96, 0x52, 0x2d, 0x3b, 0x95, 0x36, 0x51, 0x48, 0x5d, 0x36, 0xf3, 0x34, 0x65, 0x8b, - 0xa4, 0x26, 0x7e, 0x08, 0xdd, 0x04, 0xca, 0xbc, 0x84, 0x9d, 0xe6, 0xdc, 0x21, 0x35, 0xbf, 0xc2, - 0x7a, 0x4c, 0xf0, 0x15, 0x55, 0x65, 0x2f, 0xdd, 0x6b, 0xb6, 0x60, 0x9a, 0xb8, 0x45, 0x6a, 0xfe, - 0x2d, 0x6a, 0x1c, 0xfe, 0x3f, 0x35, 0x5a, 0x55, 0x35, 0xfe, 0x34, 0xe1, 0x78, 0x3c, 0xb9, 0x98, - 0x04, 0xbe, 0x64, 0xbe, 0xfc, 0x96, 0xce, 0x97, 0x0c, 0x7f, 0x0c, 0xad, 0x65, 0xc4, 0xc4, 0xd8, - 0x8b, 0x1b, 0xd7, 0x1e, 0xbd, 0x3b, 0xcc, 0x67, 0x6f, 0x3c, 0xb9, 0xf8, 0x26, 0x0e, 0x4e, 0x0d, - 0x92, 0xe2, 0xf0, 0x19, 0x80, 0x7a, 0x24, 0x6c, 0x11, 0xac, 0xe2, 0xb9, 0x6a, 0x8f, 0xec, 0x7a, - 0x56, 0x1c, 0x9f, 0x1a, 0xa4, 0x80, 0xc6, 0xdf, 0xc1, 0x3b, 0xca, 0x7a, 0xce, 0xc4, 0x82, 0x47, - 0x11, 0x0f, 0xfc, 0xc9, 0x35, 0xf5, 0xaf, 0x98, 0xd6, 0xb3, 0x3d, 0x72, 0xea, 0x55, 0xaa, 0xc8, - 0xa9, 0x41, 0x36, 0x56, 0x48, 0x59, 0xcd, 0xfc, 0x15, 0x97, 0x4c, 0x8b, 0xbf, 0x91, 0x55, 0x1c, - 0x4f, 0x59, 0xc5, 0x16, 0xfe, 0x14, 0x8e, 0x94, 0xf5, 0x55, 0xc0, 0x7d, 0xdd, 0x8a, 0xf6, 0xe8, - 0xa4, 0x9e, 0xa9, 0xa2, 0x53, 0x83, 0x64, 0xc8, 0x27, 0x2d, 0x38, 0x58, 0x29, 0x0d, 0x9d, 0xa7, - 0x7a, 0xc8, 0xbe, 0x54, 0xe3, 0x7b, 0x06, 0x40, 0xdd, 0x79, 0xa2, 0xb0, 0x8d, 0xfa, 0x8d, 0x41, - 0x7b, 0x74, 0x5a, 0xae, 0x55, 0x94, 0x9f, 0x14, 0xd0, 0xce, 0xbf, 0x08, 0x8e, 0xc6, 0x93, 0x8b, - 0x4b, 0x49, 0x25, 0x53, 0x13, 0x29, 0xf2, 0xc6, 0xb2, 0x48, 0xd7, 0x6a, 0x92, 0xb2, 0x13, 0x3f, - 0x8e, 0x0f, 0xad, 0x53, 0x22, 0xdb, 0xd4, 0x5f, 0x77, 0xbf, 0x4e, 0x5d, 0xc7, 0x49, 0x01, 0x8a, - 0xcf, 0xa0, 0xc5, 0xf5, 0xd9, 0x23, 0xbb, 0xa1, 0xb3, 0xfa, 0xe5, 0x2c, 0x0d, 0x1b, 0xc6, 0xf2, - 0x44, 0x4f, 0x7d, 0x29, 0xd6, 0x24, 0x4d, 0x38, 0xfd, 0x1a, 0x3a, 0xc5, 0x00, 0xee, 0x42, 0xe3, - 0x15, 0x5b, 0x27, 0xf7, 0x5e, 0x3d, 0xe2, 0x61, 0xa2, 0xcc, 0xf6, 0xe1, 0x88, 0x0b, 0x90, 0x18, - 0x76, 0x66, 0x7e, 0x86, 0x9c, 0x5f, 0x10, 0x74, 0x8a, 0x74, 0xf7, 0x70, 0x5f, 0xbf, 0x80, 0x76, - 0x98, 0x8d, 0x49, 0xa4, 0x67, 0xec, 0xee, 0xe8, 0xbd, 0x5d, 0x33, 0x16, 0x91, 0x62, 0x86, 0xf3, - 0x1b, 0x02, 0xc8, 0xef, 0xc0, 0x1e, 0x18, 0x7d, 0x00, 0xf7, 0xaa, 0xfb, 0x20, 0x6e, 0x40, 0x87, - 0xd4, 0x03, 0x55, 0xfe, 0xcd, 0x37, 0xe6, 0xff, 0x0f, 0x82, 0x3b, 0x25, 0xc1, 0xf1, 0x00, 0x8e, - 0xa9, 0xeb, 0xb2, 0x50, 0x3e, 0x5f, 0xbe, 0x9c, 0x73, 0xf7, 0x9c, 0xa5, 0x27, 0xa9, 0xba, 0x0b, - 0x2b, 0x2d, 0x87, 0x9a, 0xa5, 0x95, 0x96, 0x63, 0xdf, 0xee, 0xb1, 0x74, 0x1f, 0xf4, 0x71, 0x66, - 0x5e, 0xb2, 0x39, 0x33, 0xdb, 0xf9, 0x1d, 0x41, 0xbb, 0x70, 0x61, 0xf7, 0xd0, 0xb3, 0x4c, 0xb2, - 0xcb, 0xec, 0x5d, 0xda, 0x28, 0x4a, 0x96, 0xb9, 0x4b, 0xbc, 0x9a, 0x65, 0x5e, 0x9b, 0x25, 0x3a, - 0xd8, 0x22, 0x91, 0x13, 0x65, 0x7d, 0x4b, 0xf6, 0xe6, 0xae, 0x63, 0x3c, 0x83, 0xe3, 0x64, 0x2b, - 0x10, 0x16, 0xce, 0xa9, 0x9b, 0xdd, 0xe9, 0x07, 0x65, 0x4d, 0x49, 0x09, 0x44, 0xaa, 0x49, 0xce, - 0x8f, 0x08, 0xee, 0xd5, 0x60, 0x7b, 0x10, 0x70, 0xd3, 0xcb, 0xb1, 0xb1, 0xf9, 0xe5, 0xe8, 0xac, - 0xe0, 0xfe, 0x96, 0xc5, 0xbf, 0x93, 0x48, 0x65, 0xa4, 0xcc, 0x37, 0x1d, 0xa9, 0x87, 0x8f, 0x01, - 0xd7, 0x21, 0xd8, 0x82, 0x83, 0xb1, 0xb7, 0xe0, 0x7e, 0xd7, 0xc0, 0x00, 0x87, 0x2f, 0x04, 0x97, - 0x4c, 0x74, 0x91, 0x7a, 0x56, 0x7c, 0x99, 0xe8, 0x9a, 0x4f, 0x3e, 0xfa, 0xe3, 0xa6, 0x87, 0x5e, - 0xdf, 0xf4, 0xd0, 0xdf, 0x37, 0x3d, 0xf4, 0xf3, 0x6d, 0xcf, 0x78, 0x7d, 0xdb, 0x33, 0xfe, 0xba, - 0xed, 0x19, 0xdf, 0x9f, 0x6c, 0xfe, 0x85, 0xf7, 0xf2, 0x50, 0x7f, 0x7c, 0xf2, 0x5f, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x0d, 0xd2, 0xee, 0x14, 0x02, 0x0a, 0x00, 0x00, + 0x83, 0x55, 0x81, 0x0b, 0x06, 0xa9, 0x28, 0x07, 0x90, 0x6b, 0x5a, 0x39, 0x24, 0x87, 0x6a, 0x02, + 0x14, 0x71, 0x9b, 0xee, 0x8e, 0xe2, 0x51, 0xed, 0xdd, 0xd5, 0xec, 0xd8, 0xc8, 0x47, 0xce, 0x5c, + 0xe0, 0x23, 0xf0, 0x41, 0xb8, 0x23, 0x71, 0xe9, 0x05, 0xc4, 0x11, 0x25, 0x1f, 0x83, 0x0b, 0x9a, + 0xd9, 0xff, 0xbb, 0xb6, 0x45, 0x25, 0xab, 0x87, 0xc4, 0xf3, 0xde, 0xfb, 0xbd, 0xe7, 0xdf, 0xfc, + 0xe6, 0xcd, 0x1b, 0xc3, 0x87, 0xe1, 0xab, 0xeb, 0x47, 0xd4, 0x9d, 0xab, 0x3f, 0xc1, 0xdc, 0x40, + 0x78, 0xa1, 0x08, 0x64, 0xf0, 0x48, 0xff, 0x8f, 0x72, 0xef, 0x50, 0x3b, 0xb0, 0x95, 0x39, 0x9c, + 0x67, 0xd0, 0x21, 0xf4, 0x87, 0xf1, 0xe4, 0x92, 0x68, 0x1b, 0xdb, 0xd0, 0x0a, 0xe9, 0x7a, 0x1e, + 0x50, 0xcf, 0x46, 0x7d, 0x34, 0xe8, 0x90, 0xd4, 0xc4, 0x0f, 0xc0, 0x8a, 0xf8, 0xb5, 0x4f, 0xe5, + 0x52, 0x30, 0xdb, 0xd4, 0xb1, 0xdc, 0xe1, 0x7c, 0x0e, 0xb8, 0x58, 0xe7, 0x05, 0x97, 0xb3, 0xf3, + 0x5d, 0xd5, 0xee, 0x82, 0xc9, 0x3d, 0x5d, 0xc6, 0x22, 0x26, 0xf7, 0x9c, 0x5f, 0x11, 0x58, 0x39, + 0x8b, 0x13, 0x38, 0x0c, 0x05, 0x5b, 0x9d, 0xc7, 0x69, 0x16, 0x49, 0x2c, 0x7c, 0x0a, 0x47, 0xdc, + 0x63, 0xbe, 0xe4, 0x72, 0x9d, 0x50, 0xc8, 0x6c, 0x8c, 0xa1, 0xe9, 0x51, 0x49, 0xed, 0x86, 0xf6, + 0xeb, 0x35, 0x1e, 0x02, 0x76, 0x97, 0x42, 0x30, 0x5f, 0x12, 0x46, 0xbd, 0x0b, 0xb6, 0x9e, 0xd2, + 0x68, 0x66, 0x37, 0xfb, 0x68, 0xd0, 0x24, 0x1b, 0x22, 0x6a, 0x8f, 0x92, 0x2f, 0x58, 0x24, 0xe9, + 0x22, 0xb4, 0x0f, 0xfa, 0x68, 0xd0, 0x20, 0xb9, 0xc3, 0xf9, 0xc9, 0x84, 0x96, 0xe2, 0x18, 0x04, + 0xb2, 0xc4, 0x04, 0x55, 0x98, 0xbc, 0x0f, 0x77, 0x98, 0xef, 0x8a, 0x75, 0x28, 0x79, 0xe0, 0x5f, + 0xb0, 0x94, 0x6a, 0xd9, 0xa9, 0xb4, 0x89, 0x42, 0xea, 0xb2, 0x73, 0x4f, 0x53, 0xb6, 0x48, 0x6a, + 0xe2, 0x87, 0xd0, 0x4d, 0xa0, 0xcc, 0x4b, 0xd8, 0x69, 0xce, 0x1d, 0x52, 0xf3, 0x2b, 0xac, 0xc7, + 0x04, 0x5f, 0x51, 0x55, 0xf6, 0xca, 0x9d, 0xb1, 0x05, 0xd3, 0xc4, 0x2d, 0x52, 0xf3, 0x6f, 0x51, + 0xe3, 0xf0, 0xff, 0xa9, 0xd1, 0xaa, 0xaa, 0xf1, 0xa7, 0x09, 0xc7, 0xe3, 0xc9, 0xe5, 0x24, 0xf0, + 0x25, 0xf3, 0xe5, 0xb7, 0x74, 0xbe, 0x64, 0xf8, 0x63, 0x68, 0x2d, 0x23, 0x26, 0xc6, 0x5e, 0x7c, + 0x70, 0xed, 0xd1, 0xbb, 0xc3, 0xbc, 0xf7, 0xc6, 0x93, 0xcb, 0x6f, 0xe2, 0xe0, 0xd4, 0x20, 0x29, + 0x0e, 0x9f, 0x01, 0xa8, 0x25, 0x61, 0x8b, 0x60, 0x15, 0xf7, 0x55, 0x7b, 0x64, 0xd7, 0xb3, 0xe2, + 0xf8, 0xd4, 0x20, 0x05, 0x34, 0xfe, 0x0e, 0xde, 0x51, 0xd6, 0x73, 0x26, 0x16, 0x3c, 0x8a, 0x78, + 0xe0, 0x4f, 0x66, 0xd4, 0xbf, 0x66, 0x5a, 0xcf, 0xf6, 0xc8, 0xa9, 0x57, 0xa9, 0x22, 0xa7, 0x06, + 0xd9, 0x58, 0x21, 0x65, 0x75, 0xee, 0xaf, 0xb8, 0x64, 0x5a, 0xfc, 0x8d, 0xac, 0xe2, 0x78, 0xca, + 0x2a, 0xb6, 0xf0, 0xa7, 0x70, 0xa4, 0xac, 0xaf, 0x02, 0xee, 0xeb, 0xa3, 0x68, 0x8f, 0x4e, 0xea, + 0x99, 0x2a, 0x3a, 0x35, 0x48, 0x86, 0x7c, 0xd2, 0x82, 0x83, 0x95, 0xd2, 0xd0, 0x79, 0xaa, 0x9b, + 0xec, 0x4b, 0xd5, 0xbe, 0x67, 0x00, 0xd4, 0x9d, 0x27, 0x0a, 0xdb, 0xa8, 0xdf, 0x18, 0xb4, 0x47, + 0xa7, 0xe5, 0x5a, 0x45, 0xf9, 0x49, 0x01, 0xed, 0xfc, 0x8b, 0xe0, 0x68, 0x3c, 0xb9, 0xbc, 0x92, + 0x54, 0x32, 0xd5, 0x91, 0x22, 0x3f, 0x58, 0x16, 0xe9, 0x5a, 0x4d, 0x52, 0x76, 0xe2, 0xc7, 0xf1, + 0xa6, 0x75, 0x4a, 0x64, 0x9b, 0xfa, 0xeb, 0xee, 0xd7, 0xa9, 0xeb, 0x38, 0x29, 0x40, 0xf1, 0x19, + 0xb4, 0xb8, 0xde, 0x7b, 0x64, 0x37, 0x74, 0x56, 0xbf, 0x9c, 0xa5, 0x61, 0xc3, 0x58, 0x9e, 0xe8, + 0xa9, 0x2f, 0xc5, 0x9a, 0xa4, 0x09, 0xa7, 0x5f, 0x43, 0xa7, 0x18, 0xc0, 0x5d, 0x68, 0xbc, 0x62, + 0xeb, 0xe4, 0xde, 0xab, 0x25, 0x1e, 0x26, 0xca, 0x6c, 0x6f, 0x8e, 0xb8, 0x00, 0x89, 0x61, 0x67, + 0xe6, 0x67, 0xc8, 0xf9, 0x05, 0x41, 0xa7, 0x48, 0x77, 0x0f, 0xf7, 0xf5, 0x0b, 0x68, 0x87, 0x59, + 0x9b, 0x44, 0xba, 0xc7, 0xee, 0x8e, 0xde, 0xdb, 0xd5, 0x63, 0x11, 0x29, 0x66, 0x38, 0xbf, 0x21, + 0x80, 0xfc, 0x0e, 0xec, 0x81, 0xd1, 0x07, 0x70, 0xaf, 0x3a, 0x0f, 0xe2, 0x03, 0xe8, 0x90, 0x7a, + 0xa0, 0xca, 0xbf, 0xf9, 0xc6, 0xfc, 0xff, 0x42, 0x70, 0xa7, 0x24, 0x38, 0x1e, 0xc0, 0x31, 0x75, + 0x5d, 0x16, 0xca, 0xe7, 0xcb, 0x97, 0x73, 0xee, 0x5e, 0xb0, 0x74, 0x27, 0x55, 0x77, 0x81, 0xea, + 0xd5, 0x7a, 0x91, 0x4e, 0x1e, 0x53, 0x4f, 0x9e, 0x7a, 0xe0, 0x6d, 0x6f, 0xec, 0x0f, 0x04, 0xed, + 0xc2, 0xb5, 0xdc, 0xc3, 0xc9, 0x64, 0xc2, 0x5c, 0x65, 0x2f, 0x66, 0xa3, 0x28, 0x4c, 0xe6, 0xc6, + 0x0e, 0x74, 0x32, 0xad, 0xf2, 0x39, 0x5f, 0xf2, 0x6d, 0x96, 0xe3, 0x60, 0x8b, 0x1c, 0x4e, 0x94, + 0x9d, 0x52, 0x32, 0x25, 0x77, 0x6d, 0xe7, 0x19, 0x1c, 0x27, 0x33, 0x80, 0xb0, 0x70, 0x4e, 0xdd, + 0xec, 0x06, 0x3f, 0x28, 0xeb, 0x47, 0x4a, 0x20, 0x52, 0x4d, 0x72, 0x7e, 0x44, 0x70, 0xaf, 0x06, + 0xdb, 0x83, 0x90, 0x9b, 0x9e, 0xc2, 0xc6, 0xe6, 0xa7, 0xd0, 0x59, 0xc1, 0xfd, 0x2d, 0x63, 0x7e, + 0x27, 0x91, 0x4a, 0xfb, 0x98, 0x6f, 0xda, 0x3e, 0x0f, 0x1f, 0x03, 0xae, 0x43, 0xb0, 0x05, 0x07, + 0x63, 0x6f, 0xc1, 0xfd, 0xae, 0x81, 0x01, 0x0e, 0x5f, 0x08, 0x2e, 0x99, 0xe8, 0x22, 0xb5, 0x56, + 0x7c, 0x99, 0xe8, 0x9a, 0x4f, 0x3e, 0xfa, 0xfd, 0xa6, 0x87, 0x5e, 0xdf, 0xf4, 0xd0, 0x3f, 0x37, + 0x3d, 0xf4, 0xf3, 0x6d, 0xcf, 0x78, 0x7d, 0xdb, 0x33, 0xfe, 0xbe, 0xed, 0x19, 0xdf, 0x9f, 0x6c, + 0xfe, 0x3d, 0xf7, 0xf2, 0x50, 0x7f, 0x7c, 0xf2, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa5, 0x4a, + 0x77, 0x11, 0xf0, 0x09, 0x00, 0x00, } func (m *RawACLRecord) Marshal() (dAtA []byte, err error) { @@ -1640,13 +1632,6 @@ func (m *ACLUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.InviteId) > 0 { - i -= len(m.InviteId) - copy(dAtA[i:], m.InviteId) - i = encodeVarintAclrecord(dAtA, i, uint64(len(m.InviteId))) - i-- - dAtA[i] = 0x2a - } if m.Permissions != 0 { i = encodeVarintAclrecord(dAtA, i, uint64(m.Permissions)) i-- @@ -1661,12 +1646,10 @@ func (m *ACLUserInvite) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x1a } } - if len(m.EncryptPublicKey) > 0 { - i -= len(m.EncryptPublicKey) - copy(dAtA[i:], m.EncryptPublicKey) - i = encodeVarintAclrecord(dAtA, i, uint64(len(m.EncryptPublicKey))) + if m.EncryptSymKeyHash != 0 { + i = encodeVarintAclrecord(dAtA, i, uint64(m.EncryptSymKeyHash)) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x10 } if len(m.AcceptPublicKey) > 0 { i -= len(m.AcceptPublicKey) @@ -1707,10 +1690,10 @@ func (m *ACLUserJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x2a } } - if len(m.InviteId) > 0 { - i -= len(m.InviteId) - copy(dAtA[i:], m.InviteId) - i = encodeVarintAclrecord(dAtA, i, uint64(len(m.InviteId))) + if len(m.AcceptPubKey) > 0 { + i -= len(m.AcceptPubKey) + copy(dAtA[i:], m.AcceptPubKey) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.AcceptPubKey))) i-- dAtA[i] = 0x22 } @@ -2146,9 +2129,8 @@ func (m *ACLUserInvite) Size() (n int) { if l > 0 { n += 1 + l + sovAclrecord(uint64(l)) } - l = len(m.EncryptPublicKey) - if l > 0 { - n += 1 + l + sovAclrecord(uint64(l)) + if m.EncryptSymKeyHash != 0 { + n += 1 + sovAclrecord(uint64(m.EncryptSymKeyHash)) } if len(m.EncryptedReadKeys) > 0 { for _, b := range m.EncryptedReadKeys { @@ -2159,10 +2141,6 @@ func (m *ACLUserInvite) Size() (n int) { if m.Permissions != 0 { n += 1 + sovAclrecord(uint64(m.Permissions)) } - l = len(m.InviteId) - if l > 0 { - n += 1 + l + sovAclrecord(uint64(l)) - } return n } @@ -2184,7 +2162,7 @@ func (m *ACLUserJoin) Size() (n int) { if l > 0 { n += 1 + l + sovAclrecord(uint64(l)) } - l = len(m.InviteId) + l = len(m.AcceptPubKey) if l > 0 { n += 1 + l + sovAclrecord(uint64(l)) } @@ -3903,10 +3881,10 @@ func (m *ACLUserInvite) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EncryptPublicKey", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EncryptSymKeyHash", wireType) } - var byteLen int + m.EncryptSymKeyHash = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclrecord @@ -3916,26 +3894,11 @@ func (m *ACLUserInvite) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + m.EncryptSymKeyHash |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { - return ErrInvalidLengthAclrecord - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclrecord - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EncryptPublicKey = append(m.EncryptPublicKey[:0], dAtA[iNdEx:postIndex]...) - if m.EncryptPublicKey == nil { - m.EncryptPublicKey = []byte{} - } - iNdEx = postIndex case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field EncryptedReadKeys", wireType) @@ -3987,38 +3950,6 @@ func (m *ACLUserInvite) Unmarshal(dAtA []byte) error { break } } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InviteId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclrecord - } - 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 ErrInvalidLengthAclrecord - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAclrecord - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.InviteId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAclrecord(dAtA[iNdEx:]) @@ -4173,9 +4104,9 @@ func (m *ACLUserJoin) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InviteId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AcceptPubKey", wireType) } - var stringLen uint64 + var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAclrecord @@ -4185,23 +4116,25 @@ func (m *ACLUserJoin) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + byteLen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if byteLen < 0 { return ErrInvalidLengthAclrecord } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + byteLen if postIndex < 0 { return ErrInvalidLengthAclrecord } if postIndex > l { return io.ErrUnexpectedEOF } - m.InviteId = string(dAtA[iNdEx:postIndex]) + m.AcceptPubKey = append(m.AcceptPubKey[:0], dAtA[iNdEx:postIndex]...) + if m.AcceptPubKey == nil { + m.AcceptPubKey = []byte{} + } iNdEx = postIndex case 5: if wireType != 2 { diff --git a/common/pkg/acl/aclrecordproto/protos/aclrecord.proto b/common/pkg/acl/aclrecordproto/protos/aclrecord.proto index edaf1fbd..954796ed 100644 --- a/common/pkg/acl/aclrecordproto/protos/aclrecord.proto +++ b/common/pkg/acl/aclrecordproto/protos/aclrecord.proto @@ -63,25 +63,18 @@ message ACLUserAdd { ACLUserPermissions permissions = 4; } -// accept key, encrypt key, invite id -// GetSpace(id) -> ... (space header + acl root) -> diff -// Join(ACLJoinRecord) -> Ok - message ACLUserInvite { bytes acceptPublicKey = 1; - // TODO: change to read key - bytes encryptPublicKey = 2; + uint64 encryptSymKeyHash = 2; repeated bytes encryptedReadKeys = 3; ACLUserPermissions permissions = 4; - // TODO: either derive inviteId from pub keys or think if it is possible to just use ACL record id - string inviteId = 5; } message ACLUserJoin { bytes identity = 1; bytes encryptionKey = 2; bytes acceptSignature = 3; - string inviteId = 4; + bytes acceptPubKey = 4; repeated bytes encryptedReadKeys = 5; } diff --git a/common/pkg/acl/list/aclrecordbuilder.go b/common/pkg/acl/list/aclrecordbuilder.go index 64013f4a..07d6e6a8 100644 --- a/common/pkg/acl/list/aclrecordbuilder.go +++ b/common/pkg/acl/list/aclrecordbuilder.go @@ -4,6 +4,8 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" "github.com/gogo/protobuf/proto" ) @@ -23,6 +25,69 @@ func newACLRecordBuilder(id string, keychain *common.Keychain) ACLRecordBuilder } } +func (a *aclRecordBuilder) BuildUserJoin(acceptPrivKeyBytes []byte, encSymKeyBytes []byte, state *ACLState) (rec *aclrecordproto.RawACLRecord, err error) { + acceptPrivKey, err := signingkey.NewSigningEd25519PrivKeyFromBytes(acceptPrivKeyBytes) + if err != nil { + return + } + acceptPubKeyBytes, err := acceptPrivKey.GetPublic().Raw() + if err != nil { + return + } + encSymKey, err := symmetric.DeriveFromBytes(encSymKeyBytes) + if err != nil { + return + } + + invite, err := state.Invite(acceptPubKeyBytes) + if err != nil { + return + } + + encPrivKey, signPrivKey := state.UserKeys() + var symKeys [][]byte + for _, rk := range invite.EncryptedReadKeys { + dec, err := encSymKey.Decrypt(rk) + if err != nil { + return nil, err + } + newEnc, err := encPrivKey.GetPublic().Encrypt(dec) + if err != nil { + return nil, err + } + symKeys = append(symKeys, newEnc) + } + idSignature, err := acceptPrivKey.Sign(state.Identity()) + if err != nil { + return + } + encPubKeyBytes, err := encPrivKey.GetPublic().Raw() + if err != nil { + return + } + + userJoin := &aclrecordproto.ACLUserJoin{ + Identity: state.Identity(), + EncryptionKey: encPubKeyBytes, + AcceptSignature: idSignature, + AcceptPubKey: acceptPubKeyBytes, + EncryptedReadKeys: symKeys, + } + marshalledJoin, err := userJoin.Marshal() + if err != nil { + return + } + joinSignature, err := signPrivKey.Sign(marshalledJoin) + if err != nil { + return + } + rec = &aclrecordproto.RawACLRecord{ + Payload: marshalledJoin, + Signature: joinSignature, + } + return +} + func (a *aclRecordBuilder) ConvertFromRaw(rawIdRecord *aclrecordproto.RawACLRecordWithId) (rec *ACLRecord, err error) { rawRec := &aclrecordproto.RawACLRecord{} err = proto.Unmarshal(rawIdRecord.Payload, rawRec) diff --git a/common/pkg/acl/list/aclstate.go b/common/pkg/acl/list/aclstate.go index f74634f3..0bdcc853 100644 --- a/common/pkg/acl/list/aclstate.go +++ b/common/pkg/acl/list/aclstate.go @@ -7,6 +7,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" @@ -23,6 +24,8 @@ var ErrUserRemoved = errors.New("user was removed from the document") var ErrDocumentForbidden = errors.New("your user was forbidden access to the document") var ErrUserAlreadyExists = errors.New("user already exists") var ErrNoSuchRecord = errors.New("no such record") +var ErrNoSuchInvite = errors.New("no such invite") +var ErrOldInvite = errors.New("invite is too old") var ErrInsufficientPermissions = errors.New("insufficient permissions") var ErrNoReadKey = errors.New("acl state doesn't have a read key") var ErrInvalidSignature = errors.New("signature is invalid") @@ -41,6 +44,7 @@ type ACLState struct { userInvites map[string]*aclrecordproto.ACLUserInvite encryptionKey encryptionkey.PrivKey signingKey signingkey.PrivKey + totalReadKeys int identity string permissionsAtRecord map[string][]UserPermissionPair @@ -199,6 +203,8 @@ func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error } st.currentReadKeyHash = root.CurrentReadKeyHash st.userReadKeys[root.CurrentReadKeyHash] = readKey + st.totalReadKeys++ + return } @@ -207,7 +213,10 @@ func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uin if err != nil { return } - st.currentReadKeyHash = hash + if hash != st.currentReadKeyHash { + st.totalReadKeys++ + st.currentReadKeyHash = hash + } }() if !st.isUserJoin(changeData) { @@ -262,14 +271,14 @@ func (st *ACLState) applyUserPermissionChange(ch *aclrecordproto.ACLUserPermissi } func (st *ACLState) applyUserInvite(ch *aclrecordproto.ACLUserInvite) error { - st.userInvites[ch.InviteId] = ch + st.userInvites[string(ch.AcceptPublicKey)] = ch return nil } func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error { - invite, exists := st.userInvites[ch.InviteId] + invite, exists := st.userInvites[string(ch.AcceptPubKey)] if !exists { - return fmt.Errorf("no such invite with id %s", ch.InviteId) + return fmt.Errorf("no such invite with such public key %s", keys.EncodeBytesToString(ch.AcceptPubKey)) } chIdentity := string(ch.Identity) @@ -284,7 +293,7 @@ func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error { return fmt.Errorf("public key verifying invite accepts is given in incorrect format: %v", err) } - res, err := verificationKey.(signingkey.PubKey).Verify(ch.Identity, signature) + res, err := verificationKey.Verify(ch.Identity, signature) if err != nil { return fmt.Errorf("verification returned error: %w", err) } @@ -361,8 +370,8 @@ func (st *ACLState) applyUserRemove(ch *aclrecordproto.ACLUserRemove) error { return ErrFailedToDecrypt } - st.currentReadKeyHash = hash - st.userReadKeys[st.currentReadKeyHash] = key + st.userReadKeys[hash] = key + break } } return nil @@ -404,6 +413,26 @@ func (st *ACLState) isUserAdd(data *aclrecordproto.ACLData, identity []byte) boo return data.GetAclContent() != nil && userAdd != nil && bytes.Compare(userAdd.GetIdentity(), identity) == 0 } -func (st *ACLState) GetUserStates() map[string]*aclrecordproto.ACLUserState { +func (st *ACLState) UserStates() map[string]*aclrecordproto.ACLUserState { return st.userStates } + +func (st *ACLState) Invite(acceptPubKey []byte) (invite *aclrecordproto.ACLUserInvite, err error) { + invite, exists := st.userInvites[string(acceptPubKey)] + if !exists { + err = ErrNoSuchInvite + return + } + if len(invite.EncryptedReadKeys) != st.totalReadKeys { + err = ErrOldInvite + } + return +} + +func (st *ACLState) UserKeys() (encKey encryptionkey.PrivKey, signKey signingkey.PrivKey) { + return st.encryptionKey, st.signingKey +} + +func (st *ACLState) Identity() []byte { + return []byte(st.identity) +} diff --git a/common/pkg/acl/list/list_test.go b/common/pkg/acl/list/list_test.go index 668c2d5f..c4effdae 100644 --- a/common/pkg/acl/list/list_test.go +++ b/common/pkg/acl/list/list_test.go @@ -22,9 +22,9 @@ func TestAclList_ACLState_UserInviteAndJoin(t *testing.T) { idC := keychain.GetIdentity("C") // checking final state - assert.Equal(t, aclrecordproto.ACLUserPermissions_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) - assert.Equal(t, aclrecordproto.ACLUserPermissions_Writer, aclList.ACLState().GetUserStates()[idB].Permissions) - assert.Equal(t, aclrecordproto.ACLUserPermissions_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) + assert.Equal(t, aclrecordproto.ACLUserPermissions_Admin, aclList.ACLState().UserStates()[idA].Permissions) + assert.Equal(t, aclrecordproto.ACLUserPermissions_Writer, aclList.ACLState().UserStates()[idB].Permissions) + assert.Equal(t, aclrecordproto.ACLUserPermissions_Reader, aclList.ACLState().UserStates()[idC].Permissions) assert.Equal(t, aclList.Head().CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) var records []*ACLRecord @@ -61,11 +61,11 @@ func TestAclList_ACLState_UserJoinAndRemove(t *testing.T) { idC := keychain.GetIdentity("C") // checking final state - assert.Equal(t, aclrecordproto.ACLUserPermissions_Admin, aclList.ACLState().GetUserStates()[idA].Permissions) - assert.Equal(t, aclrecordproto.ACLUserPermissions_Reader, aclList.ACLState().GetUserStates()[idC].Permissions) + assert.Equal(t, aclrecordproto.ACLUserPermissions_Admin, aclList.ACLState().UserStates()[idA].Permissions) + assert.Equal(t, aclrecordproto.ACLUserPermissions_Reader, aclList.ACLState().UserStates()[idC].Permissions) assert.Equal(t, aclList.Head().CurrentReadKeyHash, aclList.ACLState().CurrentReadKeyHash()) - _, exists := aclList.ACLState().GetUserStates()[idB] + _, exists := aclList.ACLState().UserStates()[idB] assert.Equal(t, false, exists) var records []*ACLRecord diff --git a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index 6777777c..dad7271b 100644 --- a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -9,6 +9,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" "hash/fnv" "io/ioutil" "path" @@ -183,7 +184,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord UserAdd: &aclrecordproto2.ACLUserAdd{ Identity: []byte(t.keychain.GetIdentity(add.Identity)), EncryptionKey: rawKey, - EncryptedReadKeys: t.encryptReadKeys(add.EncryptedReadKeys, encKey), + EncryptedReadKeys: t.encryptReadKeysWithPubKey(add.EncryptedReadKeys, encKey), Permissions: t.convertPermission(add.Permission), }, }, @@ -191,16 +192,16 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord case ch.UserJoin != nil: join := ch.UserJoin - encKey := t.keychain. - GetKey(join.EncryptionKey).(encryptionkey.PrivKey) + encKey := t.keychain.GetKey(join.EncryptionKey).(encryptionkey.PrivKey) rawKey, _ := encKey.GetPublic().Raw() idKey, _ := t.keychain.SigningKeysByYAMLIdentity[join.Identity].GetPublic().Raw() - signKey := t.keychain.GetKey(join.AcceptSignature).(signingkey.PrivKey) + signKey := t.keychain.GetKey(join.AcceptKey).(signingkey.PrivKey) signature, err := signKey.Sign(idKey) if err != nil { panic(err) } + acceptPubKey, _ := signKey.GetPublic().Raw() convCh = &aclrecordproto2.ACLContentValue{ Value: &aclrecordproto2.ACLContentValue_UserJoin{ @@ -208,26 +209,24 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord Identity: []byte(t.keychain.GetIdentity(join.Identity)), EncryptionKey: rawKey, AcceptSignature: signature, - InviteId: join.InviteId, - EncryptedReadKeys: t.encryptReadKeys(join.EncryptedReadKeys, encKey), + AcceptPubKey: acceptPubKey, + EncryptedReadKeys: t.encryptReadKeysWithPubKey(join.EncryptedReadKeys, encKey), }, }, } case ch.UserInvite != nil: invite := ch.UserInvite rawAcceptKey, _ := t.keychain.GetKey(invite.AcceptKey).(signingkey.PrivKey).GetPublic().Raw() - encKey := t.keychain. - GetKey(invite.EncryptionKey).(encryptionkey.PrivKey) - rawEncKey, _ := encKey.GetPublic().Raw() + hash := t.keychain.GetKey(invite.EncryptionKey).(*SymKey).Hash + encKey := t.keychain.ReadKeysByHash[hash] convCh = &aclrecordproto2.ACLContentValue{ Value: &aclrecordproto2.ACLContentValue_UserInvite{ UserInvite: &aclrecordproto2.ACLUserInvite{ AcceptPublicKey: rawAcceptKey, - EncryptPublicKey: rawEncKey, - EncryptedReadKeys: t.encryptReadKeys(invite.EncryptedReadKeys, encKey), + EncryptSymKeyHash: hash, + EncryptedReadKeys: t.encryptReadKeysWithSymKey(invite.EncryptedReadKeys, encKey.Key), Permissions: t.convertPermission(invite.Permissions), - InviteId: invite.InviteId, }, }, } @@ -278,7 +277,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord return convCh } -func (t *ACLListStorageBuilder) encryptReadKeys(keys []string, encKey encryptionkey.PrivKey) (enc [][]byte) { +func (t *ACLListStorageBuilder) encryptReadKeysWithPubKey(keys []string, encKey encryptionkey.PrivKey) (enc [][]byte) { for _, k := range keys { realKey := t.keychain.GetKey(k).(*SymKey).Key.Bytes() res, err := encKey.GetPublic().Encrypt(realKey) @@ -291,6 +290,19 @@ func (t *ACLListStorageBuilder) encryptReadKeys(keys []string, encKey encryption return } +func (t *ACLListStorageBuilder) encryptReadKeysWithSymKey(keys []string, key *symmetric.Key) (enc [][]byte) { + for _, k := range keys { + realKey := t.keychain.GetKey(k).(*SymKey).Key.Bytes() + res, err := key.Encrypt(realKey) + if err != nil { + panic(err) + } + + enc = append(enc, res) + } + return +} + func (t *ACLListStorageBuilder) convertPermission(perm string) aclrecordproto2.ACLUserPermissions { switch perm { case "admin": diff --git a/common/pkg/acl/testutils/acllistbuilder/ymlentities.go b/common/pkg/acl/testutils/acllistbuilder/ymlentities.go index df1e43c6..ccdfd295 100644 --- a/common/pkg/acl/testutils/acllistbuilder/ymlentities.go +++ b/common/pkg/acl/testutils/acllistbuilder/ymlentities.go @@ -23,8 +23,7 @@ type ACLChange struct { UserJoin *struct { Identity string `yaml:"identity"` EncryptionKey string `yaml:"encryptionKey"` - AcceptSignature string `yaml:"acceptSignature"` - InviteId string `yaml:"inviteId"` + AcceptKey string `yaml:"acceptKey"` EncryptedReadKeys []string `yaml:"encryptedReadKeys"` } `yaml:"userJoin"` @@ -33,7 +32,6 @@ type ACLChange struct { EncryptionKey string `yaml:"encryptionKey"` EncryptedReadKeys []string `yaml:"encryptedReadKeys"` Permissions string `yaml:"permissions"` - InviteId string `yaml:"inviteId"` } `yaml:"userInvite"` UserRemove *struct { diff --git a/common/pkg/acl/testutils/yamltests/userjoinexample.yml b/common/pkg/acl/testutils/yamltests/userjoinexample.yml index 6d7bb48e..c78670e6 100644 --- a/common/pkg/acl/testutils/yamltests/userjoinexample.yml +++ b/common/pkg/acl/testutils/yamltests/userjoinexample.yml @@ -6,10 +6,9 @@ records: aclChanges: - userInvite: acceptKey: key.Sign.Onetime1 - encryptionKey: key.Enc.Onetime1 + encryptionKey: key.Read.EncKey encryptedReadKeys: [key.Read.1] permissions: writer - inviteId: A.1.2 - userAdd: identity: C permission: reader @@ -21,8 +20,7 @@ records: - userJoin: identity: B encryptionKey: key.Enc.B - acceptSignature: key.Sign.Onetime1 - inviteId: A.1.2 + acceptKey: key.Sign.Onetime1 encryptedReadKeys: [key.Read.1] readKey: key.Read.1 keys: @@ -48,3 +46,5 @@ keys: Read: - name: 1 value: derived + - name: EncKey + value: generated diff --git a/common/pkg/acl/testutils/yamltests/userremoveexample.yml b/common/pkg/acl/testutils/yamltests/userremoveexample.yml index 6cf51b84..9335f839 100644 --- a/common/pkg/acl/testutils/yamltests/userremoveexample.yml +++ b/common/pkg/acl/testutils/yamltests/userremoveexample.yml @@ -6,10 +6,9 @@ records: aclChanges: - userInvite: acceptKey: key.Sign.Onetime1 - encryptionKey: key.Enc.Onetime1 + encryptionKey: key.Read.EncKey encryptedReadKeys: [key.Read.1] permissions: writer - inviteId: A.1.2 - userAdd: identity: C permission: reader @@ -21,8 +20,7 @@ records: - userJoin: identity: B encryptionKey: key.Enc.B - acceptSignature: key.Sign.Onetime1 - inviteId: A.1.2 + acceptKey: key.Sign.Onetime1 encryptedReadKeys: [key.Read.1] readKey: key.Read.1 - identity: A @@ -57,3 +55,5 @@ keys: value: derived - name: 2 value: generated + - name: EncKey + value: generated From 994ffe3d5f448674258f9dfbc5a926f7df9f5f4d Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 28 Oct 2022 11:26:39 +0200 Subject: [PATCH 208/219] Change lisstoragebuilder to use inmemorystorage --- common/pkg/acl/storage/inmemory.go | 79 +++++---- .../acllistbuilder/liststoragebuilder.go | 153 ++++++------------ 2 files changed, 101 insertions(+), 131 deletions(-) diff --git a/common/pkg/acl/storage/inmemory.go b/common/pkg/acl/storage/inmemory.go index 5c39e94d..d3d42b1e 100644 --- a/common/pkg/acl/storage/inmemory.go +++ b/common/pkg/acl/storage/inmemory.go @@ -9,8 +9,10 @@ import ( ) type inMemoryACLListStorage struct { - records []*aclrecordproto.RawACLRecordWithId id string + root *aclrecordproto.RawACLRecordWithId + head string + records map[string]*aclrecordproto.RawACLRecordWithId sync.RWMutex } @@ -18,48 +20,63 @@ type inMemoryACLListStorage struct { func NewInMemoryACLListStorage( id string, records []*aclrecordproto.RawACLRecordWithId) (ListStorage, error) { + + allRecords := make(map[string]*aclrecordproto.RawACLRecordWithId) + for _, ch := range records { + allRecords[ch.Id] = ch + } + root := records[0] + head := records[len(records)-1] + return &inMemoryACLListStorage{ - id: id, - records: records, + id: root.Id, + root: root, + head: head.Id, + records: allRecords, RWMutex: sync.RWMutex{}, }, nil } -func (i *inMemoryACLListStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { - i.RLock() - defer i.RUnlock() - return i.records[0], nil +func (t *inMemoryACLListStorage) ID() string { + t.RLock() + defer t.RUnlock() + return t.id } -func (i *inMemoryACLListStorage) SetHead(headId string) error { - panic("implement me") +func (t *inMemoryACLListStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) { + t.RLock() + defer t.RUnlock() + return t.root, nil } -func (i *inMemoryACLListStorage) Head() (string, error) { - i.RLock() - defer i.RUnlock() - return i.records[len(i.records)-1].Id, nil +func (t *inMemoryACLListStorage) Head() (string, error) { + t.RLock() + defer t.RUnlock() + return t.head, nil } -func (i *inMemoryACLListStorage) GetRawRecord(ctx context.Context, id string) (*aclrecordproto.RawACLRecordWithId, error) { - i.RLock() - defer i.RUnlock() - for _, rec := range i.records { - if rec.Id == id { - return rec, nil - } +func (t *inMemoryACLListStorage) SetHead(head string) error { + t.Lock() + defer t.Unlock() + t.head = head + return nil +} + +func (t *inMemoryACLListStorage) AddRawRecord(ctx context.Context, record *aclrecordproto.RawACLRecordWithId) error { + t.Lock() + defer t.Unlock() + // TODO: better to do deep copy + t.records[record.Id] = record + return nil +} + +func (t *inMemoryACLListStorage) GetRawRecord(ctx context.Context, recordId string) (*aclrecordproto.RawACLRecordWithId, error) { + t.RLock() + defer t.RUnlock() + if res, exists := t.records[recordId]; exists { + return res, nil } - return nil, fmt.Errorf("no such record") -} - -func (i *inMemoryACLListStorage) AddRawRecord(ctx context.Context, rec *aclrecordproto.RawACLRecordWithId) error { - panic("implement me") -} - -func (i *inMemoryACLListStorage) ID() string { - i.RLock() - defer i.RUnlock() - return i.id + return nil, fmt.Errorf("could not get record with id: %s", recordId) } type inMemoryTreeStorage struct { diff --git a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index dad7271b..25542e93 100644 --- a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -3,7 +3,7 @@ package acllistbuilder import ( "context" "fmt" - aclrecordproto2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/yamltests" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid" @@ -20,20 +20,12 @@ import ( ) type ACLListStorageBuilder struct { - aclList string - records []*aclrecordproto2.ACLRecord - rawRecords []*aclrecordproto2.RawACLRecordWithId - indexes map[string]int - keychain *YAMLKeychain - rawRoot *aclrecordproto2.RawACLRecordWithId - root *aclrecordproto2.ACLRoot - id string + storage.ListStorage + keychain *YAMLKeychain } func NewACLListStorageBuilder(keychain *YAMLKeychain) *ACLListStorageBuilder { return &ACLListStorageBuilder{ - records: make([]*aclrecordproto2.ACLRecord, 0), - indexes: make(map[string]int), keychain: keychain, } } @@ -61,7 +53,7 @@ func NewACLListStorageBuilderFromFile(file string) (*ACLListStorageBuilder, erro return tb, nil } -func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) *aclrecordproto2.RawACLRecordWithId { +func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) *aclrecordproto.RawACLRecordWithId { protoMarshalled, err := rec.Marshal() if err != nil { panic("should be able to marshal final acl message!") @@ -72,7 +64,7 @@ func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) panic("should be able to sign final acl message!") } - rawRec := &aclrecordproto2.RawACLRecord{ + rawRec := &aclrecordproto.RawACLRecord{ Payload: protoMarshalled, Signature: signature, } @@ -84,85 +76,53 @@ func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) id, _ := cid.NewCIDFromBytes(rawMarshalled) - return &aclrecordproto2.RawACLRecordWithId{ + return &aclrecordproto.RawACLRecordWithId{ Payload: rawMarshalled, Id: id, } } -func (t *ACLListStorageBuilder) Head() (string, error) { - l := len(t.records) - if l > 0 { - return t.rawRecords[l-1].Id, nil - } - return t.rawRoot.Id, nil -} - -func (t *ACLListStorageBuilder) SetHead(headId string) error { - panic("SetHead is not implemented") -} - -func (t *ACLListStorageBuilder) Root() (*aclrecordproto2.RawACLRecordWithId, error) { - return t.rawRoot, nil -} - -func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*aclrecordproto2.RawACLRecordWithId, error) { - recIdx, ok := t.indexes[id] - if !ok { - if id == t.rawRoot.Id { - return t.rawRoot, nil - } - return nil, fmt.Errorf("no such record") - } - return t.rawRecords[recIdx], nil -} - -func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclrecordproto2.RawACLRecordWithId) error { - panic("implement me") -} - -func (t *ACLListStorageBuilder) ID() string { - return t.id -} - -func (t *ACLListStorageBuilder) GetRawRecords() []*aclrecordproto2.RawACLRecordWithId { - return t.rawRecords -} - func (t *ACLListStorageBuilder) GetKeychain() *YAMLKeychain { return t.keychain } -func (t *ACLListStorageBuilder) Parse(tree *YMLList) { +func (t *ACLListStorageBuilder) Parse(l *YMLList) { // Just to clarify - we are generating new identities for the ones that // are specified in the yml file, because our identities should be Ed25519 // the same thing is happening for the encryption keys - t.keychain.ParseKeys(&tree.Keys) - t.parseRoot(tree.Root) - prevId := t.id - for idx, rec := range tree.Records { + t.keychain.ParseKeys(&l.Keys) + rawRoot := t.parseRoot(l.Root) + var err error + t.ListStorage, err = storage.NewInMemoryACLListStorage(rawRoot.Id, []*aclrecordproto.RawACLRecordWithId{rawRoot}) + if err != nil { + panic(err) + } + prevId := rawRoot.Id + for _, rec := range l.Records { newRecord := t.parseRecord(rec, prevId) rawRecord := t.createRaw(newRecord, newRecord.Identity) - t.records = append(t.records, newRecord) - t.rawRecords = append(t.rawRecords, rawRecord) - t.indexes[rawRecord.Id] = idx + err = t.AddRawRecord(context.Background(), rawRecord) + if err != nil { + panic(err) + } prevId = rawRecord.Id } + t.SetHead(prevId) } -func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclrecordproto2.ACLRecord { +func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclrecordproto.ACLRecord { k := t.keychain.GetKey(rec.ReadKey).(*SymKey) - var aclChangeContents []*aclrecordproto2.ACLContentValue + var aclChangeContents []*aclrecordproto.ACLContentValue for _, ch := range rec.AclChanges { aclChangeContent := t.parseACLChange(ch) aclChangeContents = append(aclChangeContents, aclChangeContent) } - data := &aclrecordproto2.ACLData{ + data := &aclrecordproto.ACLData{ AclContent: aclChangeContents, } bytes, _ := data.Marshal() - return &aclrecordproto2.ACLRecord{ + return &aclrecordproto.ACLRecord{ PrevId: prevId, Identity: []byte(t.keychain.GetIdentity(rec.Identity)), Data: bytes, @@ -171,7 +131,7 @@ func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclreco } } -func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecordproto2.ACLContentValue) { +func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecordproto.ACLContentValue) { switch { case ch.UserAdd != nil: add := ch.UserAdd @@ -179,9 +139,9 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord encKey := t.keychain.GetKey(add.EncryptionKey).(encryptionkey.PrivKey) rawKey, _ := encKey.GetPublic().Raw() - convCh = &aclrecordproto2.ACLContentValue{ - Value: &aclrecordproto2.ACLContentValue_UserAdd{ - UserAdd: &aclrecordproto2.ACLUserAdd{ + convCh = &aclrecordproto.ACLContentValue{ + Value: &aclrecordproto.ACLContentValue_UserAdd{ + UserAdd: &aclrecordproto.ACLUserAdd{ Identity: []byte(t.keychain.GetIdentity(add.Identity)), EncryptionKey: rawKey, EncryptedReadKeys: t.encryptReadKeysWithPubKey(add.EncryptedReadKeys, encKey), @@ -203,9 +163,9 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord } acceptPubKey, _ := signKey.GetPublic().Raw() - convCh = &aclrecordproto2.ACLContentValue{ - Value: &aclrecordproto2.ACLContentValue_UserJoin{ - UserJoin: &aclrecordproto2.ACLUserJoin{ + convCh = &aclrecordproto.ACLContentValue{ + Value: &aclrecordproto.ACLContentValue_UserJoin{ + UserJoin: &aclrecordproto.ACLUserJoin{ Identity: []byte(t.keychain.GetIdentity(join.Identity)), EncryptionKey: rawKey, AcceptSignature: signature, @@ -220,9 +180,9 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord hash := t.keychain.GetKey(invite.EncryptionKey).(*SymKey).Hash encKey := t.keychain.ReadKeysByHash[hash] - convCh = &aclrecordproto2.ACLContentValue{ - Value: &aclrecordproto2.ACLContentValue_UserInvite{ - UserInvite: &aclrecordproto2.ACLUserInvite{ + convCh = &aclrecordproto.ACLContentValue{ + Value: &aclrecordproto.ACLContentValue_UserInvite{ + UserInvite: &aclrecordproto.ACLUserInvite{ AcceptPublicKey: rawAcceptKey, EncryptSymKeyHash: hash, EncryptedReadKeys: t.encryptReadKeysWithSymKey(invite.EncryptedReadKeys, encKey.Key), @@ -233,9 +193,9 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord case ch.UserPermissionChange != nil: permissionChange := ch.UserPermissionChange - convCh = &aclrecordproto2.ACLContentValue{ - Value: &aclrecordproto2.ACLContentValue_UserPermissionChange{ - UserPermissionChange: &aclrecordproto2.ACLUserPermissionChange{ + convCh = &aclrecordproto.ACLContentValue{ + Value: &aclrecordproto.ACLContentValue_UserPermissionChange{ + UserPermissionChange: &aclrecordproto.ACLUserPermissionChange{ Identity: []byte(t.keychain.GetIdentity(permissionChange.Identity)), Permissions: t.convertPermission(permissionChange.Permission), }, @@ -246,7 +206,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord newReadKey := t.keychain.GetKey(remove.NewReadKey).(*SymKey) - var replaces []*aclrecordproto2.ACLReadKeyReplace + var replaces []*aclrecordproto.ACLReadKeyReplace for _, id := range remove.IdentitiesLeft { encKey := t.keychain.EncryptionKeysByYAMLIdentity[id] rawEncKey, _ := encKey.GetPublic().Raw() @@ -254,16 +214,16 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord if err != nil { panic(err) } - replaces = append(replaces, &aclrecordproto2.ACLReadKeyReplace{ + replaces = append(replaces, &aclrecordproto.ACLReadKeyReplace{ Identity: []byte(t.keychain.GetIdentity(id)), EncryptionKey: rawEncKey, EncryptedReadKey: encReadKey, }) } - convCh = &aclrecordproto2.ACLContentValue{ - Value: &aclrecordproto2.ACLContentValue_UserRemove{ - UserRemove: &aclrecordproto2.ACLUserRemove{ + convCh = &aclrecordproto.ACLContentValue{ + Value: &aclrecordproto.ACLContentValue_UserRemove{ + UserRemove: &aclrecordproto.ACLUserRemove{ Identity: []byte(t.keychain.GetIdentity(remove.RemovedIdentity)), ReadKeyReplaces: replaces, }, @@ -303,36 +263,30 @@ func (t *ACLListStorageBuilder) encryptReadKeysWithSymKey(keys []string, key *sy return } -func (t *ACLListStorageBuilder) convertPermission(perm string) aclrecordproto2.ACLUserPermissions { +func (t *ACLListStorageBuilder) convertPermission(perm string) aclrecordproto.ACLUserPermissions { switch perm { case "admin": - return aclrecordproto2.ACLUserPermissions_Admin + return aclrecordproto.ACLUserPermissions_Admin case "writer": - return aclrecordproto2.ACLUserPermissions_Writer + return aclrecordproto.ACLUserPermissions_Writer case "reader": - return aclrecordproto2.ACLUserPermissions_Reader + return aclrecordproto.ACLUserPermissions_Reader default: panic(fmt.Sprintf("incorrect permission: %s", perm)) } } -func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclrecordproto2.ACLRecord, id string) error) (err error) { - for i := len(t.records) - 1; i >= 0; i-- { - err = f(t.records[i], t.rawRecords[i].Id) - if err != nil { - return err - } - } - return nil +func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclrecordproto.ACLRecord, id string) error) (err error) { + panic("this was removed, add if needed") } -func (t *ACLListStorageBuilder) parseRoot(root *Root) { +func (t *ACLListStorageBuilder) parseRoot(root *Root) (rawRoot *aclrecordproto.RawACLRecordWithId) { rawSignKey, _ := t.keychain.SigningKeysByYAMLIdentity[root.Identity].GetPublic().Raw() rawEncKey, _ := t.keychain.EncryptionKeysByYAMLIdentity[root.Identity].GetPublic().Raw() - readKey, _ := aclrecordproto2.ACLReadKeyDerive(rawSignKey, rawEncKey) + readKey, _ := aclrecordproto.ACLReadKeyDerive(rawSignKey, rawEncKey) hasher := fnv.New64() hasher.Write(readKey.Bytes()) - t.root = &aclrecordproto2.ACLRoot{ + aclRoot := &aclrecordproto.ACLRoot{ Identity: rawSignKey, EncryptionKey: rawEncKey, SpaceId: root.SpaceId, @@ -340,6 +294,5 @@ func (t *ACLListStorageBuilder) parseRoot(root *Root) { DerivationScheme: "scheme", CurrentReadKeyHash: hasher.Sum64(), } - t.rawRoot = t.createRaw(t.root, rawSignKey) - t.id = t.rawRoot.Id + return t.createRaw(aclRoot, rawSignKey) } From 36b80c25d4ea4b120d78e4e3716b9a28f2cda7d7 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 28 Oct 2022 12:04:23 +0200 Subject: [PATCH 209/219] Add raw record to list --- common/pkg/acl/list/aclrecordbuilder.go | 1 + common/pkg/acl/list/aclstate.go | 21 ++++++-- common/pkg/acl/list/aclstatebuilder.go | 10 ++++ common/pkg/acl/list/list.go | 59 ++++++++++++++++++---- common/pkg/acl/list/mock_list/mock_list.go | 15 ++++++ 5 files changed, 93 insertions(+), 13 deletions(-) diff --git a/common/pkg/acl/list/aclrecordbuilder.go b/common/pkg/acl/list/aclrecordbuilder.go index 07d6e6a8..ac435a73 100644 --- a/common/pkg/acl/list/aclrecordbuilder.go +++ b/common/pkg/acl/list/aclrecordbuilder.go @@ -11,6 +11,7 @@ import ( type ACLRecordBuilder interface { ConvertFromRaw(rawIdRecord *aclrecordproto.RawACLRecordWithId) (rec *ACLRecord, err error) + BuildUserJoin(acceptPrivKeyBytes []byte, encSymKeyBytes []byte, state *ACLState) (rec *aclrecordproto.RawACLRecord, err error) } type aclRecordBuilder struct { diff --git a/common/pkg/acl/list/aclstate.go b/common/pkg/acl/list/aclstate.go index 0bdcc853..ec2bd7b7 100644 --- a/common/pkg/acl/list/aclstate.go +++ b/common/pkg/acl/list/aclstate.go @@ -30,6 +30,7 @@ var ErrInsufficientPermissions = errors.New("insufficient permissions") var ErrNoReadKey = errors.New("acl state doesn't have a read key") var ErrInvalidSignature = errors.New("signature is invalid") var ErrIncorrectRoot = errors.New("incorrect root") +var ErrIncorrectRecordSequence = errors.New("incorrect prev id of a record") type UserPermissionPair struct { Identity string @@ -48,6 +49,7 @@ type ACLState struct { identity string permissionsAtRecord map[string][]UserPermissionPair + lastRecordId string keychain *common.Keychain } @@ -114,15 +116,28 @@ func (st *ACLState) PermissionsAtRecord(id string, identity string) (UserPermiss } func (st *ACLState) applyRecord(record *ACLRecord) (err error) { + defer func() { + if err == nil { + st.lastRecordId = record.Id + } + }() + if st.lastRecordId != record.PrevId { + err = ErrIncorrectRecordSequence + return + } if record.Id == st.id { root, ok := record.Model.(*aclrecordproto.ACLRoot) if !ok { return ErrIncorrectRoot } + err = st.applyRoot(root) + if err != nil { + return + } st.permissionsAtRecord[record.Id] = []UserPermissionPair{ {Identity: string(root.Identity), Permission: aclrecordproto.ACLUserPermissions_Admin}, } - return st.applyRoot(root) + return } aclData := &aclrecordproto.ACLData{} @@ -152,7 +167,7 @@ func (st *ACLState) applyRecord(record *ACLRecord) (err error) { } st.permissionsAtRecord[record.Id] = permissions - return nil + return } func (st *ACLState) applyRoot(root *aclrecordproto.ACLRoot) (err error) { @@ -170,6 +185,7 @@ func (st *ACLState) applyRoot(root *aclrecordproto.ACLRoot) (err error) { Permissions: aclrecordproto.ACLUserPermissions_Admin, } st.userStates[string(root.Identity)] = userState + st.totalReadKeys++ return } @@ -203,7 +219,6 @@ func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error } st.currentReadKeyHash = root.CurrentReadKeyHash st.userReadKeys[root.CurrentReadKeyHash] = readKey - st.totalReadKeys++ return } diff --git a/common/pkg/acl/list/aclstatebuilder.go b/common/pkg/acl/list/aclstatebuilder.go index 1b847865..2ef79cd5 100644 --- a/common/pkg/acl/list/aclstatebuilder.go +++ b/common/pkg/acl/list/aclstatebuilder.go @@ -45,3 +45,13 @@ func (sb *aclStateBuilder) Build(records []*ACLRecord) (state *ACLState, err err return state, err } + +func (sb *aclStateBuilder) Append(state *ACLState, records []*ACLRecord) (err error) { + for _, rec := range records { + err = state.applyRecord(rec) + if err != nil { + return + } + } + return +} diff --git a/common/pkg/acl/list/list.go b/common/pkg/acl/list/list.go index 6e8d259e..ccbe120c 100644 --- a/common/pkg/acl/list/list.go +++ b/common/pkg/acl/list/list.go @@ -29,6 +29,7 @@ type ACLList interface { Records() []*ACLRecord ACLState() *ACLState IsAfter(first string, second string) (bool, error) + AddRawRecords(ctx context.Context, rec []*aclrecordproto.RawACLRecordWithId) (err error) Head() *ACLRecord Get(id string) (*ACLRecord, error) Iterate(iterFunc IterFunc) @@ -42,9 +43,11 @@ type aclList struct { indexes map[string]int id string - builder *aclStateBuilder - aclState *ACLState - keychain *common.Keychain + stateBuilder *aclStateBuilder + recordBuilder ACLRecordBuilder + aclState *ACLState + keychain *common.Keychain + storage storage.ListStorage sync.RWMutex } @@ -120,13 +123,15 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder } list = &aclList{ - root: aclRecRoot.Model.(*aclrecordproto.ACLRoot), - records: records, - indexes: indexes, - builder: stateBuilder, - aclState: state, - id: id, - RWMutex: sync.RWMutex{}, + root: aclRecRoot.Model.(*aclrecordproto.ACLRoot), + records: records, + indexes: indexes, + stateBuilder: stateBuilder, + recordBuilder: recBuilder, + aclState: state, + storage: storage, + id: id, + RWMutex: sync.RWMutex{}, } return } @@ -143,6 +148,40 @@ func (a *aclList) Root() *aclrecordproto.ACLRoot { return a.root } +func (a *aclList) AddRawRecords(ctx context.Context, records []*aclrecordproto.RawACLRecordWithId) (err error) { + if len(records) == 0 { + return + } + // converting and verifying + var aclRecords []*ACLRecord + for _, rec := range records { + var record *ACLRecord + record, err = a.recordBuilder.ConvertFromRaw(rec) + if err != nil { + return + } + aclRecords = append(aclRecords, record) + } + + // trying to append them to state + err = a.stateBuilder.Append(a.aclState, aclRecords) + if err != nil { + return + } + + // saving to storage + for _, rec := range records { + err = a.storage.AddRawRecord(ctx, rec) + if err != nil { + return + } + } + + // setting new head + err = a.storage.SetHead(records[len(records)-1].Id) + return +} + func (a *aclList) ACLState() *ACLState { return a.aclState } diff --git a/common/pkg/acl/list/mock_list/mock_list.go b/common/pkg/acl/list/mock_list/mock_list.go index 2c545599..a4aeb396 100644 --- a/common/pkg/acl/list/mock_list/mock_list.go +++ b/common/pkg/acl/list/mock_list/mock_list.go @@ -5,6 +5,7 @@ package mock_list import ( + context "context" reflect "reflect" aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" @@ -49,6 +50,20 @@ func (mr *MockACLListMockRecorder) ACLState() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ACLState", reflect.TypeOf((*MockACLList)(nil).ACLState)) } +// AddRawRecords mocks base method. +func (m *MockACLList) AddRawRecords(arg0 context.Context, arg1 []*aclrecordproto.RawACLRecordWithId) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddRawRecords", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddRawRecords indicates an expected call of AddRawRecords. +func (mr *MockACLListMockRecorder) AddRawRecords(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawRecords", reflect.TypeOf((*MockACLList)(nil).AddRawRecords), arg0, arg1) +} + // Close mocks base method. func (m *MockACLList) Close() error { m.ctrl.T.Helper() From 59048159082639cc0bc79c4d2cb343b1d541589d Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 28 Oct 2022 13:01:20 +0200 Subject: [PATCH 210/219] Add test for user join build and fix bugs --- common/pkg/acl/aclrecordproto/aclrecord.pb.go | 12 ++--- .../acl/aclrecordproto/protos/aclrecord.proto | 2 +- common/pkg/acl/list/aclrecordbuilder.go | 25 ++++++++-- common/pkg/acl/list/aclrecordbuilder_test.go | 50 +++++++++++++++++++ common/pkg/acl/list/aclstate.go | 17 +++++-- .../acl/testutils/acllistbuilder/keychain.go | 48 +++++++++--------- .../acllistbuilder/liststoragebuilder.go | 17 +++---- .../testutils/yamltests/userjoinexample.yml | 17 ++++--- .../testutils/yamltests/userremoveexample.yml | 13 +++-- 9 files changed, 136 insertions(+), 65 deletions(-) create mode 100644 common/pkg/acl/list/aclrecordbuilder_test.go diff --git a/common/pkg/acl/aclrecordproto/aclrecord.pb.go b/common/pkg/acl/aclrecordproto/aclrecord.pb.go index 385d7df5..bca4e5d8 100644 --- a/common/pkg/acl/aclrecordproto/aclrecord.pb.go +++ b/common/pkg/acl/aclrecordproto/aclrecord.pb.go @@ -825,7 +825,7 @@ func (m *ACLUserJoin) GetEncryptedReadKeys() [][]byte { type ACLUserRemove struct { Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` - ReadKeyReplaces []*ACLReadKeyReplace `protobuf:"bytes,3,rep,name=readKeyReplaces,proto3" json:"readKeyReplaces,omitempty"` + ReadKeyReplaces []*ACLReadKeyReplace `protobuf:"bytes,2,rep,name=readKeyReplaces,proto3" json:"readKeyReplaces,omitempty"` } func (m *ACLUserRemove) Reset() { *m = ACLUserRemove{} } @@ -1058,14 +1058,14 @@ var fileDescriptor_14abe0d1b4206d54 = []byte{ 0xc2, 0xb5, 0xdc, 0xc3, 0xc9, 0x64, 0xc2, 0x5c, 0x65, 0x2f, 0x66, 0xa3, 0x28, 0x4c, 0xe6, 0xc6, 0x0e, 0x74, 0x32, 0xad, 0xf2, 0x39, 0x5f, 0xf2, 0x6d, 0x96, 0xe3, 0x60, 0x8b, 0x1c, 0x4e, 0x94, 0x9d, 0x52, 0x32, 0x25, 0x77, 0x6d, 0xe7, 0x19, 0x1c, 0x27, 0x33, 0x80, 0xb0, 0x70, 0x4e, 0xdd, - 0xec, 0x06, 0x3f, 0x28, 0xeb, 0x47, 0x4a, 0x20, 0x52, 0x4d, 0x72, 0x7e, 0x44, 0x70, 0xaf, 0x06, + 0xec, 0xde, 0x3f, 0x28, 0xeb, 0x47, 0x4a, 0x20, 0x52, 0x4d, 0x72, 0x7e, 0x44, 0x70, 0xaf, 0x06, 0xdb, 0x83, 0x90, 0x9b, 0x9e, 0xc2, 0xc6, 0xe6, 0xa7, 0xd0, 0x59, 0xc1, 0xfd, 0x2d, 0x63, 0x7e, 0x27, 0x91, 0x4a, 0xfb, 0x98, 0x6f, 0xda, 0x3e, 0x0f, 0x1f, 0x03, 0xae, 0x43, 0xb0, 0x05, 0x07, 0x63, 0x6f, 0xc1, 0xfd, 0xae, 0x81, 0x01, 0x0e, 0x5f, 0x08, 0x2e, 0x99, 0xe8, 0x22, 0xb5, 0x56, 0x7c, 0x99, 0xe8, 0x9a, 0x4f, 0x3e, 0xfa, 0xfd, 0xa6, 0x87, 0x5e, 0xdf, 0xf4, 0xd0, 0x3f, 0x37, 0x3d, 0xf4, 0xf3, 0x6d, 0xcf, 0x78, 0x7d, 0xdb, 0x33, 0xfe, 0xbe, 0xed, 0x19, 0xdf, 0x9f, 0x6c, - 0xfe, 0x3d, 0xf7, 0xf2, 0x50, 0x7f, 0x7c, 0xf2, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa5, 0x4a, - 0x77, 0x11, 0xf0, 0x09, 0x00, 0x00, + 0xfe, 0x3d, 0xf7, 0xf2, 0x50, 0x7f, 0x7c, 0xf2, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0xdf, + 0xf6, 0x6c, 0xf0, 0x09, 0x00, 0x00, } func (m *RawACLRecord) Marshal() (dAtA []byte, err error) { @@ -1752,7 +1752,7 @@ func (m *ACLUserRemove) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintAclrecord(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x12 } } if len(m.Identity) > 0 { @@ -4252,7 +4252,7 @@ func (m *ACLUserRemove) Unmarshal(dAtA []byte) error { m.Identity = []byte{} } iNdEx = postIndex - case 3: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ReadKeyReplaces", wireType) } diff --git a/common/pkg/acl/aclrecordproto/protos/aclrecord.proto b/common/pkg/acl/aclrecordproto/protos/aclrecord.proto index 954796ed..bca03cd6 100644 --- a/common/pkg/acl/aclrecordproto/protos/aclrecord.proto +++ b/common/pkg/acl/aclrecordproto/protos/aclrecord.proto @@ -80,7 +80,7 @@ message ACLUserJoin { message ACLUserRemove { bytes identity = 1; - repeated ACLReadKeyReplace readKeyReplaces = 3; + repeated ACLReadKeyReplace readKeyReplaces = 2; } message ACLReadKeyReplace { diff --git a/common/pkg/acl/list/aclrecordbuilder.go b/common/pkg/acl/list/aclrecordbuilder.go index ac435a73..1448d460 100644 --- a/common/pkg/acl/list/aclrecordbuilder.go +++ b/common/pkg/acl/list/aclrecordbuilder.go @@ -7,6 +7,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" "github.com/gogo/protobuf/proto" + "time" ) type ACLRecordBuilder interface { @@ -35,7 +36,7 @@ func (a *aclRecordBuilder) BuildUserJoin(acceptPrivKeyBytes []byte, encSymKeyByt if err != nil { return } - encSymKey, err := symmetric.DeriveFromBytes(encSymKeyBytes) + encSymKey, err := symmetric.FromBytes(encSymKeyBytes) if err != nil { return } @@ -74,17 +75,31 @@ func (a *aclRecordBuilder) BuildUserJoin(acceptPrivKeyBytes []byte, encSymKeyByt AcceptPubKey: acceptPubKeyBytes, EncryptedReadKeys: symKeys, } - marshalledJoin, err := userJoin.Marshal() + aclData := &aclrecordproto.ACLData{AclContent: []*aclrecordproto.ACLContentValue{ + {Value: &aclrecordproto.ACLContentValue_UserJoin{UserJoin: userJoin}}, + }} + marshalledJoin, err := aclData.Marshal() if err != nil { return } - joinSignature, err := signPrivKey.Sign(marshalledJoin) + aclRecord := &aclrecordproto.ACLRecord{ + PrevId: state.LastRecordId(), + Identity: state.Identity(), + Data: marshalledJoin, + CurrentReadKeyHash: state.CurrentReadKeyHash(), + Timestamp: time.Now().UnixNano(), + } + marshalledRecord, err := aclRecord.Marshal() + if err != nil { + return + } + recSignature, err := signPrivKey.Sign(marshalledRecord) if err != nil { return } rec = &aclrecordproto.RawACLRecord{ - Payload: marshalledJoin, - Signature: joinSignature, + Payload: marshalledRecord, + Signature: recSignature, } return } diff --git a/common/pkg/acl/list/aclrecordbuilder_test.go b/common/pkg/acl/list/aclrecordbuilder_test.go new file mode 100644 index 00000000..42a9cbb7 --- /dev/null +++ b/common/pkg/acl/list/aclrecordbuilder_test.go @@ -0,0 +1,50 @@ +package list + +import ( + "context" + account "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/acllistbuilder" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" + "github.com/stretchr/testify/require" + "testing" +) + +func TestAclRecordBuilder_BuildUserJoin(t *testing.T) { + st, err := acllistbuilder.NewListStorageWithTestName("userjoinexample.yml") + require.NoError(t, err, "building storage should not result in error") + + keychain := st.(*acllistbuilder.ACLListStorageBuilder).GetKeychain() + identity := keychain.GeneratedIdentities["D"] + signPrivKey := keychain.SigningKeysByYAMLName["D"] + encPrivKey := keychain.EncryptionKeysByYAMLName["D"] + acc := &account.AccountData{ + Identity: []byte(identity), + SignKey: signPrivKey, + EncKey: encPrivKey, + } + + aclList, err := BuildACLListWithIdentity(acc, st) + require.NoError(t, err, "building acl list should be without error") + recordBuilder := newACLRecordBuilder(aclList.ID(), common.NewKeychain()) + rk, err := keychain.GetKey("key.Read.EncKey").(*acllistbuilder.SymKey).Key.Raw() + require.NoError(t, err) + privKey, err := keychain.GetKey("key.Sign.Onetime1").(signingkey.PrivKey).Raw() + require.NoError(t, err) + + userJoin, err := recordBuilder.BuildUserJoin(privKey, rk, aclList.ACLState()) + require.NoError(t, err) + marshalledJoin, err := userJoin.Marshal() + require.NoError(t, err) + id, err := cid.NewCIDFromBytes(marshalledJoin) + require.NoError(t, err) + rawRec := &aclrecordproto.RawACLRecordWithId{ + Payload: marshalledJoin, + Id: id, + } + err = aclList.AddRawRecords(context.Background(), []*aclrecordproto.RawACLRecordWithId{rawRec}) + require.NoError(t, err) + require.Equal(t, aclrecordproto.ACLUserPermissions_Writer, aclList.ACLState().UserStates()[identity].Permissions) +} diff --git a/common/pkg/acl/list/aclstate.go b/common/pkg/acl/list/aclstate.go index ec2bd7b7..94754aba 100644 --- a/common/pkg/acl/list/aclstate.go +++ b/common/pkg/acl/list/aclstate.go @@ -184,6 +184,7 @@ func (st *ACLState) applyRoot(root *aclrecordproto.ACLRoot) (err error) { EncryptionKey: root.EncryptionKey, Permissions: aclrecordproto.ACLUserPermissions_Admin, } + st.currentReadKeyHash = root.CurrentReadKeyHash st.userStates[string(root.Identity)] = userState st.totalReadKeys++ return @@ -192,13 +193,18 @@ func (st *ACLState) applyRoot(root *aclrecordproto.ACLRoot) (err error) { func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error) { var readKey *symmetric.Key if len(root.GetDerivationScheme()) != 0 { - var encPubKey []byte - encPubKey, err = st.encryptionKey.GetPublic().Raw() + var encPrivKey []byte + encPrivKey, err = st.encryptionKey.Raw() + if err != nil { + return + } + var signPrivKey []byte + signPrivKey, err = st.signingKey.Raw() if err != nil { return } - readKey, err = aclrecordproto.ACLReadKeyDerive([]byte(st.identity), encPubKey) + readKey, err = aclrecordproto.ACLReadKeyDerive(signPrivKey, encPrivKey) if err != nil { return } @@ -217,7 +223,6 @@ func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error if hasher.Sum64() != root.CurrentReadKeyHash { return ErrIncorrectRoot } - st.currentReadKeyHash = root.CurrentReadKeyHash st.userReadKeys[root.CurrentReadKeyHash] = readKey return @@ -451,3 +456,7 @@ func (st *ACLState) UserKeys() (encKey encryptionkey.PrivKey, signKey signingkey func (st *ACLState) Identity() []byte { return []byte(st.identity) } + +func (st *ACLState) LastRecordId() string { + return st.lastRecordId +} diff --git a/common/pkg/acl/testutils/acllistbuilder/keychain.go b/common/pkg/acl/testutils/acllistbuilder/keychain.go index db7fb0a6..ff0b9b04 100644 --- a/common/pkg/acl/testutils/acllistbuilder/keychain.go +++ b/common/pkg/acl/testutils/acllistbuilder/keychain.go @@ -16,28 +16,26 @@ type SymKey struct { } type YAMLKeychain struct { - SigningKeysByYAMLIdentity map[string]signingkey2.PrivKey - SigningKeysByRealIdentity map[string]signingkey2.PrivKey - EncryptionKeysByYAMLIdentity map[string]encryptionkey2.PrivKey - ReadKeysByYAMLIdentity map[string]*SymKey - ReadKeysByHash map[uint64]*SymKey - GeneratedIdentities map[string]string - DerivedIdentity string + SigningKeysByYAMLName map[string]signingkey2.PrivKey + SigningKeysByRealIdentity map[string]signingkey2.PrivKey + EncryptionKeysByYAMLName map[string]encryptionkey2.PrivKey + ReadKeysByYAMLName map[string]*SymKey + ReadKeysByHash map[uint64]*SymKey + GeneratedIdentities map[string]string } func NewKeychain() *YAMLKeychain { return &YAMLKeychain{ - SigningKeysByYAMLIdentity: map[string]signingkey2.PrivKey{}, - SigningKeysByRealIdentity: map[string]signingkey2.PrivKey{}, - EncryptionKeysByYAMLIdentity: map[string]encryptionkey2.PrivKey{}, - GeneratedIdentities: map[string]string{}, - ReadKeysByYAMLIdentity: map[string]*SymKey{}, - ReadKeysByHash: map[uint64]*SymKey{}, + SigningKeysByYAMLName: map[string]signingkey2.PrivKey{}, + SigningKeysByRealIdentity: map[string]signingkey2.PrivKey{}, + EncryptionKeysByYAMLName: map[string]encryptionkey2.PrivKey{}, + GeneratedIdentities: map[string]string{}, + ReadKeysByYAMLName: map[string]*SymKey{}, + ReadKeysByHash: map[uint64]*SymKey{}, } } func (k *YAMLKeychain) ParseKeys(keys *Keys) { - k.DerivedIdentity = keys.Derived for _, encKey := range keys.Enc { k.AddEncryptionKey(encKey) } @@ -52,7 +50,7 @@ func (k *YAMLKeychain) ParseKeys(keys *Keys) { } func (k *YAMLKeychain) AddEncryptionKey(key *Key) { - if _, exists := k.EncryptionKeysByYAMLIdentity[key.Name]; exists { + if _, exists := k.EncryptionKeysByYAMLName[key.Name]; exists { return } var ( @@ -70,11 +68,11 @@ func (k *YAMLKeychain) AddEncryptionKey(key *Key) { panic(err) } } - k.EncryptionKeysByYAMLIdentity[key.Name] = newPrivKey + k.EncryptionKeysByYAMLName[key.Name] = newPrivKey } func (k *YAMLKeychain) AddSigningKey(key *Key) { - if _, exists := k.SigningKeysByYAMLIdentity[key.Name]; exists { + if _, exists := k.SigningKeysByYAMLName[key.Name]; exists { return } var ( @@ -95,7 +93,7 @@ func (k *YAMLKeychain) AddSigningKey(key *Key) { pubKey = newPrivKey.GetPublic() } - k.SigningKeysByYAMLIdentity[key.Name] = newPrivKey + k.SigningKeysByYAMLName[key.Name] = newPrivKey rawPubKey, err := pubKey.Raw() if err != nil { panic(err) @@ -107,7 +105,7 @@ func (k *YAMLKeychain) AddSigningKey(key *Key) { } func (k *YAMLKeychain) AddReadKey(key *Key) { - if _, exists := k.ReadKeysByYAMLIdentity[key.Name]; exists { + if _, exists := k.ReadKeysByYAMLName[key.Name]; exists { return } @@ -121,8 +119,8 @@ func (k *YAMLKeychain) AddReadKey(key *Key) { panic("should be able to generate symmetric key") } } else if key.Value == "derived" { - signKey, _ := k.SigningKeysByYAMLIdentity[k.DerivedIdentity].Raw() - encKey, _ := k.EncryptionKeysByYAMLIdentity[k.DerivedIdentity].Raw() + signKey, _ := k.SigningKeysByYAMLName[key.Name].Raw() + encKey, _ := k.EncryptionKeysByYAMLName[key.Name].Raw() rkey, err = aclrecordproto.ACLReadKeyDerive(signKey, encKey) if err != nil { panic("should be able to derive symmetric key") @@ -137,7 +135,7 @@ func (k *YAMLKeychain) AddReadKey(key *Key) { hasher := fnv.New64() hasher.Write(rkey.Bytes()) - k.ReadKeysByYAMLIdentity[key.Name] = &SymKey{ + k.ReadKeysByYAMLName[key.Name] = &SymKey{ Hash: hasher.Sum64(), Key: rkey, } @@ -174,15 +172,15 @@ func (k *YAMLKeychain) GetKey(key string) interface{} { switch parts[1] { case "Sign": - if key, exists := k.SigningKeysByYAMLIdentity[name]; exists { + if key, exists := k.SigningKeysByYAMLName[name]; exists { return key } case "Enc": - if key, exists := k.EncryptionKeysByYAMLIdentity[name]; exists { + if key, exists := k.EncryptionKeysByYAMLName[name]; exists { return key } case "Read": - if key, exists := k.ReadKeysByYAMLIdentity[name]; exists { + if key, exists := k.ReadKeysByYAMLName[name]; exists { return key } default: diff --git a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go index 25542e93..a1309073 100644 --- a/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go +++ b/common/pkg/acl/testutils/acllistbuilder/liststoragebuilder.go @@ -10,7 +10,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric" - "hash/fnv" "io/ioutil" "path" "time" @@ -127,7 +126,7 @@ func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclreco Identity: []byte(t.keychain.GetIdentity(rec.Identity)), Data: bytes, CurrentReadKeyHash: k.Hash, - Timestamp: time.Now().Unix(), + Timestamp: time.Now().UnixNano(), } } @@ -155,7 +154,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord encKey := t.keychain.GetKey(join.EncryptionKey).(encryptionkey.PrivKey) rawKey, _ := encKey.GetPublic().Raw() - idKey, _ := t.keychain.SigningKeysByYAMLIdentity[join.Identity].GetPublic().Raw() + idKey, _ := t.keychain.SigningKeysByYAMLName[join.Identity].GetPublic().Raw() signKey := t.keychain.GetKey(join.AcceptKey).(signingkey.PrivKey) signature, err := signKey.Sign(idKey) if err != nil { @@ -208,7 +207,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord var replaces []*aclrecordproto.ACLReadKeyReplace for _, id := range remove.IdentitiesLeft { - encKey := t.keychain.EncryptionKeysByYAMLIdentity[id] + encKey := t.keychain.EncryptionKeysByYAMLName[id] rawEncKey, _ := encKey.GetPublic().Raw() encReadKey, err := encKey.GetPublic().Encrypt(newReadKey.Key.Bytes()) if err != nil { @@ -281,18 +280,16 @@ func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclrecordproto.ACLR } func (t *ACLListStorageBuilder) parseRoot(root *Root) (rawRoot *aclrecordproto.RawACLRecordWithId) { - rawSignKey, _ := t.keychain.SigningKeysByYAMLIdentity[root.Identity].GetPublic().Raw() - rawEncKey, _ := t.keychain.EncryptionKeysByYAMLIdentity[root.Identity].GetPublic().Raw() - readKey, _ := aclrecordproto.ACLReadKeyDerive(rawSignKey, rawEncKey) - hasher := fnv.New64() - hasher.Write(readKey.Bytes()) + rawSignKey, _ := t.keychain.SigningKeysByYAMLName[root.Identity].GetPublic().Raw() + rawEncKey, _ := t.keychain.EncryptionKeysByYAMLName[root.Identity].GetPublic().Raw() + readKey := t.keychain.ReadKeysByYAMLName[root.Identity] aclRoot := &aclrecordproto.ACLRoot{ Identity: rawSignKey, EncryptionKey: rawEncKey, SpaceId: root.SpaceId, EncryptedReadKey: nil, DerivationScheme: "scheme", - CurrentReadKeyHash: hasher.Sum64(), + CurrentReadKeyHash: readKey.Hash, } return t.createRaw(aclRoot, rawSignKey) } diff --git a/common/pkg/acl/testutils/yamltests/userjoinexample.yml b/common/pkg/acl/testutils/yamltests/userjoinexample.yml index c78670e6..fd90c063 100644 --- a/common/pkg/acl/testutils/yamltests/userjoinexample.yml +++ b/common/pkg/acl/testutils/yamltests/userjoinexample.yml @@ -7,24 +7,23 @@ records: - userInvite: acceptKey: key.Sign.Onetime1 encryptionKey: key.Read.EncKey - encryptedReadKeys: [key.Read.1] + encryptedReadKeys: [key.Read.A] permissions: writer - userAdd: identity: C permission: reader encryptionKey: key.Enc.C - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 + encryptedReadKeys: [key.Read.A] + readKey: key.Read.A - identity: B aclChanges: - userJoin: identity: B encryptionKey: key.Enc.B acceptKey: key.Sign.Onetime1 - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 + encryptedReadKeys: [key.Read.A] + readKey: key.Read.A keys: - Derived: A Enc: - name: A value: generated @@ -32,6 +31,8 @@ keys: value: generated - name: C value: generated + - name: D + value: generated - name: Onetime1 value: generated Sign: @@ -41,10 +42,12 @@ keys: value: generated - name: C value: generated + - name: D + value: generated - name: Onetime1 value: generated Read: - - name: 1 + - name: A value: derived - name: EncKey value: generated diff --git a/common/pkg/acl/testutils/yamltests/userremoveexample.yml b/common/pkg/acl/testutils/yamltests/userremoveexample.yml index 9335f839..cc6d817e 100644 --- a/common/pkg/acl/testutils/yamltests/userremoveexample.yml +++ b/common/pkg/acl/testutils/yamltests/userremoveexample.yml @@ -7,22 +7,22 @@ records: - userInvite: acceptKey: key.Sign.Onetime1 encryptionKey: key.Read.EncKey - encryptedReadKeys: [key.Read.1] + encryptedReadKeys: [key.Read.A] permissions: writer - userAdd: identity: C permission: reader encryptionKey: key.Enc.C - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 + encryptedReadKeys: [key.Read.A] + readKey: key.Read.A - identity: B aclChanges: - userJoin: identity: B encryptionKey: key.Enc.B acceptKey: key.Sign.Onetime1 - encryptedReadKeys: [key.Read.1] - readKey: key.Read.1 + encryptedReadKeys: [key.Read.A] + readKey: key.Read.A - identity: A aclChanges: - userRemove: @@ -31,7 +31,6 @@ records: identitiesLeft: [A, C] readKey: key.Read.2 keys: - Derived: A Enc: - name: A value: generated @@ -51,7 +50,7 @@ keys: - name: Onetime1 value: generated Read: - - name: 1 + - name: A value: derived - name: 2 value: generated From 8f862fd1a16edf88788712eeb1a1bb704d17109e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Fri, 28 Oct 2022 13:24:05 +0200 Subject: [PATCH 211/219] Fix building list --- common/pkg/acl/list/list.go | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/common/pkg/acl/list/list.go b/common/pkg/acl/list/list.go index ccbe120c..50a7b59a 100644 --- a/common/pkg/acl/list/list.go +++ b/common/pkg/acl/list/list.go @@ -64,16 +64,6 @@ func BuildACLList(storage storage.ListStorage) (ACLList, error) { } func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage storage.ListStorage) (list ACLList, err error) { - // TODO: need to add context here - rootWithId, err := storage.Root() - if err != nil { - return - } - aclRecRoot, err := recBuilder.ConvertFromRaw(rootWithId) - if err != nil { - return - } - head, err := storage.Head() if err != nil { return @@ -90,7 +80,7 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder } records := []*ACLRecord{record} - for record.PrevId != "" && record.PrevId != id { + for record.PrevId != "" { rawRecordWithId, err = storage.GetRawRecord(context.Background(), record.PrevId) if err != nil { return @@ -102,8 +92,6 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder } records = append(records, record) } - // adding root in the end, because we already parsed it - records = append(records, aclRecRoot) indexes := make(map[string]int) for i, j := 0, len(records)-1; i < j; i, j = i+1, j-1 { @@ -122,6 +110,15 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder return } + rootWithId, err := storage.Root() + if err != nil { + return + } + aclRecRoot, err := recBuilder.ConvertFromRaw(rootWithId) + if err != nil { + return + } + list = &aclList{ root: aclRecRoot.Model.(*aclrecordproto.ACLRoot), records: records, From 25f30cacc2bfb291f652eef2d434235e397526af Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Mon, 31 Oct 2022 11:25:58 +0300 Subject: [PATCH 212/219] acl service wip --- client/clientspace/service.go | 2 +- common/commonspace/service.go | 7 +- common/commonspace/space.go | 22 +- common/commonspace/synctree/synctree.go | 4 +- common/pkg/acl/aclrecordproto/aclrecord.pb.go | 332 +++++++++--------- .../acl/aclrecordproto/protos/aclrecord.proto | 4 +- common/pkg/acl/tree/changevalidator.go | 16 +- node/acl/service.go | 11 +- node/nodespace/rpchandler.go | 2 +- node/nodespace/service.go | 25 +- node/nodespace/space.go | 24 ++ 11 files changed, 243 insertions(+), 206 deletions(-) create mode 100644 node/nodespace/space.go diff --git a/client/clientspace/service.go b/client/clientspace/service.go index 876dcd3f..2f7ada82 100644 --- a/client/clientspace/service.go +++ b/client/clientspace/service.go @@ -41,7 +41,7 @@ func (s *service) Init(a *app.App) (err error) { s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.spaceCache = ocache.New( func(ctx context.Context, id string) (value ocache.Object, err error) { - return s.commonSpace.GetSpace(ctx, id) + return s.commonSpace.NewSpace(ctx, id) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 19c4bd40..e8b7b4a4 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -25,7 +25,7 @@ func New() Service { type Service interface { DeriveSpace(ctx context.Context, payload SpaceDerivePayload) (string, error) CreateSpace(ctx context.Context, payload SpaceCreatePayload) (string, error) - GetSpace(ctx context.Context, id string) (sp Space, err error) + NewSpace(ctx context.Context, id string) (sp Space, err error) app.Component } @@ -78,7 +78,7 @@ func (s *service) DeriveSpace(ctx context.Context, payload SpaceDerivePayload) ( return store.Id(), nil } -func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { +func (s *service) NewSpace(ctx context.Context, id string) (Space, error) { st, err := s.storageProvider.SpaceStorage(id) if err != nil { return nil, err @@ -97,8 +97,5 @@ func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { configuration: lastConfiguration, storage: st, } - if err := sp.Init(ctx); err != nil { - return nil, err - } return sp, nil } diff --git a/common/commonspace/space.go b/common/commonspace/space.go index dd2541bd..6e4bf495 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -14,9 +14,10 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" - tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" + "github.com/zeebo/errs" "go.uber.org/zap" "sync" "sync/atomic" @@ -51,6 +52,8 @@ func NewSpaceId(id string, repKey uint64) string { type Space interface { Id() string + Init(ctx context.Context) error + StoredIds() []string SpaceSyncRpc() RpcHandler @@ -183,7 +186,18 @@ func (s *space) Close() error { s.isClosed.Store(true) log.With(zap.String("id", s.id)).Debug("space closed") }() - s.diffService.Close() - s.syncService.Close() - return s.storage.Close() + var mError errs.Group + if err := s.diffService.Close(); err != nil { + mError.Add(err) + } + if err := s.syncService.Close(); err != nil { + mError.Add(err) + } + if err := s.aclList.Close(); err != nil { + mError.Add(err) + } + if err := s.storage.Close(); err != nil { + mError.Add(err) + } + return mError.Err() } diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 17bbcb84..a3aba77c 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -86,9 +86,7 @@ func DeriveSyncTree( return } -func CreateSyncTree( - ctx context.Context, - deps CreateDeps) (t tree.ObjectTree, err error) { +func CreateSyncTree(ctx context.Context, deps CreateDeps) (t tree.ObjectTree, err error) { t, err = createObjectTree(deps.Payload, deps.AclList, deps.CreateStorage) if err != nil { return diff --git a/common/pkg/acl/aclrecordproto/aclrecord.pb.go b/common/pkg/acl/aclrecordproto/aclrecord.pb.go index d0e583fa..ab92d212 100644 --- a/common/pkg/acl/aclrecordproto/aclrecord.pb.go +++ b/common/pkg/acl/aclrecordproto/aclrecord.pb.go @@ -51,8 +51,10 @@ func (ACLUserPermissions) EnumDescriptor() ([]byte, []int) { } type RawACLRecord struct { - Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + AcceptorIdentity []byte `protobuf:"bytes,3,opt,name=acceptorIdentity,proto3" json:"acceptorIdentity,omitempty"` + AcceptorSignature []byte `protobuf:"bytes,4,opt,name=acceptorSignature,proto3" json:"acceptorSignature,omitempty"` } func (m *RawACLRecord) Reset() { *m = RawACLRecord{} } @@ -102,11 +104,23 @@ func (m *RawACLRecord) GetSignature() []byte { return nil } +func (m *RawACLRecord) GetAcceptorIdentity() []byte { + if m != nil { + return m.AcceptorIdentity + } + return nil +} + +func (m *RawACLRecord) GetAcceptorSignature() []byte { + if m != nil { + return m.AcceptorSignature + } + return nil +} + type RawACLRecordWithId struct { - Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - AcceptorIdentity []byte `protobuf:"bytes,3,opt,name=acceptorIdentity,proto3" json:"acceptorIdentity,omitempty"` - AcceptorSignature []byte `protobuf:"bytes,4,opt,name=acceptorSignature,proto3" json:"acceptorSignature,omitempty"` + Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } func (m *RawACLRecordWithId) Reset() { *m = RawACLRecordWithId{} } @@ -156,20 +170,6 @@ func (m *RawACLRecordWithId) GetId() string { return "" } -func (m *RawACLRecordWithId) GetAcceptorIdentity() []byte { - if m != nil { - return m.AcceptorIdentity - } - return nil -} - -func (m *RawACLRecordWithId) GetAcceptorSignature() []byte { - if m != nil { - return m.AcceptorSignature - } - return nil -} - type ACLRecord struct { PrevId string `protobuf:"bytes,1,opt,name=prevId,proto3" json:"prevId,omitempty"` Identity []byte `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"` @@ -1203,66 +1203,66 @@ func init() { var fileDescriptor_14abe0d1b4206d54 = []byte{ // 959 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xcf, 0x6f, 0x1b, 0x45, - 0x14, 0xf6, 0xac, 0x9d, 0x38, 0x7e, 0x76, 0x13, 0x67, 0x80, 0xd4, 0x8a, 0x8a, 0x15, 0xad, 0x38, - 0x44, 0x55, 0x71, 0xc1, 0x20, 0xa5, 0xca, 0x05, 0xb9, 0xa6, 0x95, 0xdd, 0x04, 0xa9, 0x9a, 0x00, - 0x45, 0xbd, 0x4d, 0x77, 0x47, 0xc9, 0xa8, 0xf6, 0xee, 0x6a, 0x66, 0x6c, 0xe4, 0x23, 0x67, 0x2e, - 0x70, 0xe3, 0xca, 0x1f, 0xc2, 0x89, 0x0b, 0xc7, 0x5e, 0x90, 0x38, 0xa2, 0xe4, 0x1f, 0xe0, 0xce, - 0x05, 0xcd, 0xcc, 0xfe, 0x5e, 0x27, 0xa2, 0x52, 0xd4, 0x43, 0xe2, 0x9d, 0xf7, 0xbe, 0x79, 0xfb, - 0xbd, 0xef, 0xbd, 0x79, 0xb3, 0xf0, 0x71, 0xf4, 0xfa, 0xfc, 0x21, 0xf5, 0x66, 0xfa, 0x4f, 0x30, - 0x2f, 0x14, 0x7e, 0x24, 0x42, 0x15, 0x3e, 0x34, 0xff, 0x65, 0x66, 0x1d, 0x18, 0x03, 0x6e, 0xa5, - 0x06, 0xf7, 0x29, 0x74, 0x08, 0xfd, 0x7e, 0x34, 0x3e, 0x25, 0x66, 0x8d, 0x7b, 0xd0, 0x8c, 0xe8, - 0x6a, 0x16, 0x52, 0xbf, 0x87, 0x0e, 0xd0, 0x61, 0x87, 0x24, 0x4b, 0x7c, 0x0f, 0x5a, 0x92, 0x9f, - 0x07, 0x54, 0x2d, 0x04, 0xeb, 0x39, 0xc6, 0x97, 0x19, 0xdc, 0x5f, 0x10, 0xe0, 0x7c, 0xa0, 0x17, - 0x5c, 0x5d, 0x4c, 0x6f, 0x0a, 0xb7, 0x0d, 0x0e, 0xf7, 0x4d, 0x9c, 0x16, 0x71, 0xb8, 0x8f, 0xef, - 0x43, 0x97, 0x7a, 0x1e, 0x8b, 0x54, 0x28, 0xa6, 0x3e, 0x0b, 0x14, 0x57, 0xab, 0x5e, 0xdd, 0x6c, - 0xa9, 0xd8, 0xf1, 0x03, 0xd8, 0x4d, 0x6c, 0x67, 0x29, 0xa5, 0x86, 0x01, 0x57, 0x1d, 0xee, 0xaf, - 0x08, 0x5a, 0x59, 0x82, 0x7b, 0xb0, 0x19, 0x09, 0xb6, 0x9c, 0x5a, 0x42, 0x2d, 0x12, 0xaf, 0xf0, - 0x3e, 0x6c, 0xf1, 0xe4, 0xbd, 0x36, 0xbb, 0x74, 0x8d, 0x31, 0x34, 0x7c, 0xaa, 0x68, 0xcc, 0xc7, - 0x3c, 0xe3, 0x01, 0x60, 0x6f, 0x21, 0x04, 0x0b, 0x14, 0x61, 0xd4, 0x3f, 0x61, 0xab, 0x09, 0x95, - 0x17, 0x86, 0x44, 0x83, 0xac, 0xf1, 0x68, 0xf9, 0x14, 0x9f, 0x33, 0xa9, 0xe8, 0x3c, 0xea, 0x6d, - 0x1c, 0xa0, 0xc3, 0x3a, 0xc9, 0x0c, 0xee, 0x8f, 0x0e, 0x34, 0x35, 0xc7, 0x30, 0x54, 0x05, 0x26, - 0xa8, 0xc4, 0xe4, 0x23, 0xb8, 0xc3, 0x02, 0x4f, 0xac, 0x22, 0xc5, 0xc3, 0xe0, 0x84, 0x25, 0x54, - 0x8b, 0x46, 0xad, 0xba, 0x8c, 0xa8, 0xc7, 0xa6, 0xbe, 0xa1, 0xdc, 0x22, 0xc9, 0x52, 0xab, 0x1c, - 0x43, 0x99, 0x1f, 0xb3, 0x8b, 0x85, 0xab, 0xd8, 0x35, 0xd6, 0x67, 0x82, 0x2f, 0xa9, 0x0e, 0x7b, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xf7, 0xac, 0x9d, 0x38, 0x7e, 0x76, 0x13, 0x67, 0x80, 0xd4, 0x8a, 0x8a, 0x15, 0xad, 0x38, + 0x44, 0x55, 0x71, 0xc1, 0x20, 0xa5, 0xca, 0x01, 0xe4, 0x9a, 0x22, 0xbb, 0x09, 0x52, 0x35, 0x01, + 0x8a, 0x7a, 0x9b, 0xee, 0x8e, 0x92, 0x51, 0xed, 0xdd, 0xd5, 0xcc, 0xd8, 0xc8, 0x47, 0xce, 0x5c, + 0xe0, 0x1b, 0xc0, 0x07, 0xe1, 0xc4, 0x85, 0x63, 0x2f, 0x48, 0x1c, 0x51, 0xf2, 0x05, 0xb8, 0x73, + 0x41, 0x33, 0xb3, 0xff, 0xd7, 0x89, 0xa8, 0x14, 0xf5, 0x90, 0x64, 0xe6, 0xbd, 0xdf, 0x9b, 0xfc, + 0xde, 0xef, 0xbd, 0x79, 0xb3, 0xf0, 0x61, 0xf4, 0xea, 0xfc, 0x21, 0xf5, 0x66, 0xfa, 0x47, 0x30, + 0x2f, 0x14, 0x7e, 0x24, 0x42, 0x15, 0x3e, 0x34, 0xbf, 0x65, 0x66, 0x1d, 0x18, 0x03, 0x6e, 0xa5, + 0x06, 0xf7, 0x17, 0x04, 0x1d, 0x42, 0xbf, 0x1f, 0x8d, 0x4f, 0x89, 0x31, 0xe0, 0x1e, 0x34, 0x23, + 0xba, 0x9a, 0x85, 0xd4, 0xef, 0xa1, 0x03, 0x74, 0xd8, 0x21, 0xc9, 0x16, 0xdf, 0x83, 0x96, 0xe4, + 0xe7, 0x01, 0x55, 0x0b, 0xc1, 0x7a, 0x8e, 0xf1, 0x65, 0x06, 0x7c, 0x1f, 0xba, 0xd4, 0xf3, 0x58, + 0xa4, 0x42, 0x31, 0xf5, 0x59, 0xa0, 0xb8, 0x5a, 0xf5, 0xea, 0x06, 0x54, 0xb1, 0xe3, 0x07, 0xb0, + 0x9b, 0xd8, 0xce, 0xd2, 0x13, 0x1b, 0x06, 0x5c, 0x75, 0xb8, 0x9f, 0x01, 0xce, 0x33, 0x7c, 0xce, + 0xd5, 0xc5, 0xf4, 0x26, 0x9e, 0xdb, 0xe0, 0x70, 0xdf, 0x10, 0x6c, 0x11, 0x87, 0xfb, 0xee, 0xaf, + 0x08, 0x5a, 0x59, 0x7e, 0x7b, 0xb0, 0x19, 0x09, 0xb6, 0x9c, 0xda, 0xb0, 0x16, 0x89, 0x77, 0x78, + 0x1f, 0xb6, 0x78, 0xc2, 0xdb, 0x26, 0x97, 0xee, 0x31, 0x86, 0x86, 0x4f, 0x15, 0x8d, 0xf3, 0x31, + 0x6b, 0x3c, 0x00, 0xec, 0x2d, 0x84, 0x60, 0x81, 0x22, 0x8c, 0xfa, 0x27, 0x6c, 0x35, 0xa1, 0xf2, + 0xc2, 0x24, 0xd1, 0x20, 0x6b, 0x3c, 0x5a, 0x3d, 0xc5, 0xe7, 0x4c, 0x2a, 0x3a, 0x8f, 0x7a, 0x1b, + 0x07, 0xe8, 0xb0, 0x4e, 0x32, 0x83, 0xfb, 0xa3, 0x03, 0x4d, 0xcd, 0x31, 0x0c, 0x55, 0x81, 0x09, + 0x2a, 0x31, 0xf9, 0x00, 0xee, 0xb0, 0xc0, 0x13, 0xab, 0x48, 0xf1, 0x30, 0x38, 0x61, 0x09, 0xd5, + 0xa2, 0x51, 0x6b, 0x23, 0x23, 0xea, 0xb1, 0xa9, 0x6f, 0x28, 0xb7, 0x48, 0xb2, 0xd5, 0x55, 0x8a, + 0xa1, 0xcc, 0x8f, 0xd9, 0xc5, 0xc2, 0x57, 0xec, 0x1a, 0xeb, 0x33, 0xc1, 0x97, 0x54, 0x1f, 0x7b, 0xe6, 0x5d, 0xb0, 0x39, 0x33, 0xc4, 0x5b, 0xa4, 0x62, 0xbf, 0x46, 0x8d, 0xcd, 0xff, 0xa7, 0x46, 0xb3, 0xac, 0xc6, 0x9f, 0x0e, 0xec, 0x8c, 0xc6, 0xa7, 0xe3, 0x30, 0x50, 0x2c, 0x50, 0xdf, 0xd2, - 0xd9, 0x82, 0xe1, 0x4f, 0xa1, 0xb9, 0x90, 0x4c, 0x8c, 0x7c, 0x5b, 0xb8, 0xf6, 0xf0, 0x83, 0x41, - 0xd6, 0xd6, 0xa3, 0xf1, 0xe9, 0x37, 0xd6, 0x39, 0xa9, 0x91, 0x04, 0x87, 0x8f, 0x01, 0xf4, 0x23, - 0x61, 0xf3, 0x70, 0x69, 0x5b, 0xb6, 0x3d, 0xec, 0x55, 0x77, 0x59, 0xff, 0xa4, 0x46, 0x72, 0x68, - 0xfc, 0x1d, 0xbc, 0xaf, 0x57, 0xcf, 0x99, 0x98, 0x73, 0x29, 0x79, 0x18, 0x8c, 0x2f, 0x68, 0x70, - 0xce, 0x8c, 0x9e, 0xed, 0xa1, 0x5b, 0x8d, 0x52, 0x46, 0x4e, 0x6a, 0x64, 0x6d, 0x84, 0x84, 0xd5, - 0x34, 0x58, 0x72, 0x65, 0xbb, 0x76, 0x2d, 0x2b, 0xeb, 0x4f, 0x58, 0xd9, 0x15, 0xfe, 0x1c, 0xb6, - 0xf4, 0xea, 0x59, 0xc8, 0x03, 0x53, 0x8a, 0xf6, 0x70, 0xaf, 0xba, 0x53, 0x7b, 0x27, 0x35, 0x92, - 0x22, 0x1f, 0x37, 0x61, 0x63, 0xa9, 0x35, 0x74, 0x9f, 0x98, 0x26, 0xfb, 0x52, 0xb7, 0xef, 0x31, - 0x00, 0xf5, 0x66, 0xb1, 0xc2, 0x3d, 0x74, 0x50, 0x3f, 0x6c, 0x0f, 0xf7, 0x8b, 0xb1, 0xf2, 0xf2, + 0xd9, 0x82, 0xe1, 0x8f, 0xa1, 0xb9, 0x90, 0x4c, 0x8c, 0x7c, 0x5b, 0xb8, 0xf6, 0xf0, 0xbd, 0x41, + 0xd6, 0xd6, 0xa3, 0xf1, 0xe9, 0x37, 0xd6, 0x39, 0xa9, 0x91, 0x04, 0x87, 0x8f, 0x01, 0xf4, 0x92, + 0xb0, 0x79, 0xb8, 0xb4, 0x1d, 0xdb, 0x1e, 0xf6, 0xaa, 0x51, 0xd6, 0x3f, 0xa9, 0x91, 0x1c, 0x1a, + 0x7f, 0x07, 0xef, 0xea, 0xdd, 0x33, 0x26, 0xe6, 0x5c, 0x4a, 0x1e, 0x06, 0xe3, 0x0b, 0x1a, 0x9c, + 0x33, 0xa3, 0x67, 0x7b, 0xe8, 0x56, 0x4f, 0x29, 0x23, 0x27, 0x35, 0xb2, 0xf6, 0x84, 0x84, 0xd5, + 0x34, 0x58, 0x72, 0x65, 0xbb, 0x7e, 0x2d, 0x2b, 0xeb, 0x4f, 0x58, 0xd9, 0x1d, 0xfe, 0x14, 0xb6, + 0xf4, 0xee, 0x69, 0xc8, 0x03, 0x53, 0x8a, 0xf6, 0x70, 0xaf, 0x1a, 0xa9, 0xbd, 0x93, 0x1a, 0x49, + 0x91, 0x8f, 0x9b, 0xb0, 0xb1, 0xd4, 0x1a, 0xba, 0x4f, 0x4c, 0x93, 0x7d, 0xa1, 0xdb, 0xf7, 0x18, + 0x80, 0x7a, 0xb3, 0x58, 0xe1, 0x1e, 0x3a, 0xa8, 0x1f, 0xb6, 0x87, 0xfb, 0xc5, 0xb3, 0xf2, 0xf2, 0x93, 0x1c, 0xda, 0xfd, 0x17, 0xc1, 0xd6, 0x68, 0x7c, 0x7a, 0xa6, 0xa8, 0x62, 0xba, 0x23, 0x45, - 0x56, 0x58, 0x26, 0x4d, 0xac, 0x06, 0x29, 0x1a, 0xf1, 0x91, 0x4d, 0xda, 0x6c, 0x91, 0x3d, 0xc7, - 0xbc, 0xee, 0x6e, 0x95, 0xba, 0xf1, 0x93, 0x1c, 0x14, 0x1f, 0x43, 0x93, 0x9b, 0xdc, 0x65, 0xaf, - 0x6e, 0x76, 0x1d, 0x14, 0x77, 0x19, 0xd8, 0xc0, 0xca, 0x23, 0x9f, 0x04, 0x4a, 0xac, 0x48, 0xb2, - 0x61, 0xff, 0x6b, 0xe8, 0xe4, 0x1d, 0xb8, 0x0b, 0xf5, 0xd7, 0x6c, 0x15, 0x9f, 0x7b, 0xfd, 0x88, - 0x07, 0xb1, 0x32, 0xd7, 0x37, 0x87, 0x0d, 0x40, 0x2c, 0xec, 0xd8, 0x79, 0x84, 0xdc, 0x9f, 0x11, - 0x74, 0xf2, 0x74, 0x6f, 0xe1, 0xbc, 0x7e, 0x01, 0xed, 0x28, 0x6d, 0x13, 0x69, 0x7a, 0x6c, 0x7b, - 0xf8, 0xe1, 0x4d, 0x3d, 0x26, 0x49, 0x7e, 0x87, 0xfb, 0x1b, 0x02, 0xc8, 0xce, 0xc0, 0x2d, 0x30, - 0x7a, 0x00, 0xbb, 0xe5, 0x79, 0x60, 0x0b, 0xd0, 0x21, 0x55, 0x47, 0x99, 0x7f, 0xe3, 0xad, 0xf9, - 0xff, 0x83, 0xe0, 0x4e, 0x41, 0x70, 0x7c, 0x08, 0x3b, 0x76, 0x92, 0x3f, 0x5f, 0xbc, 0x9a, 0x71, - 0xef, 0x84, 0x25, 0x99, 0x94, 0xcd, 0xb9, 0x91, 0x96, 0x41, 0x9d, 0xc2, 0x48, 0xcb, 0xb0, 0xef, - 0x36, 0x2d, 0x53, 0x07, 0x93, 0xce, 0xd4, 0x8f, 0x27, 0x67, 0xba, 0x76, 0x7f, 0x47, 0xd0, 0xce, - 0x1d, 0xd8, 0x5b, 0xa8, 0x59, 0x2a, 0x59, 0x76, 0x27, 0xd6, 0xf3, 0x92, 0xa5, 0xe6, 0x02, 0xaf, - 0x46, 0x91, 0xd7, 0x7a, 0x89, 0x36, 0xae, 0x91, 0xc8, 0x95, 0x69, 0xdd, 0xe2, 0xb9, 0x79, 0x53, - 0x1a, 0x4f, 0x61, 0x27, 0x9e, 0x0a, 0x84, 0x45, 0x33, 0xea, 0xa5, 0x67, 0xfa, 0x5e, 0x51, 0x53, - 0x52, 0x00, 0x91, 0xf2, 0x26, 0xf7, 0x07, 0x04, 0xbb, 0x15, 0xd8, 0x2d, 0x08, 0xb8, 0xee, 0x72, - 0xac, 0xaf, 0xbf, 0x1c, 0xdd, 0x25, 0xdc, 0xbd, 0x66, 0xf0, 0xdf, 0x48, 0xa4, 0xd4, 0x52, 0xce, - 0x5b, 0x9f, 0x94, 0x67, 0xb0, 0xad, 0xa7, 0xde, 0x2a, 0xf0, 0xbe, 0x62, 0x52, 0xd2, 0x73, 0x86, - 0x1f, 0x41, 0xd3, 0x8b, 0xc7, 0xb8, 0x9d, 0x62, 0xfd, 0xd2, 0x84, 0x5c, 0x05, 0x5e, 0x61, 0x94, - 0x27, 0x70, 0xf7, 0x25, 0xbc, 0xb7, 0xc6, 0x6f, 0xae, 0x06, 0xdf, 0xb7, 0x9f, 0x4b, 0x32, 0xbe, - 0x6c, 0x4b, 0x93, 0x71, 0x94, 0xfa, 0xf5, 0x05, 0x95, 0xa1, 0xb3, 0xab, 0x66, 0x62, 0x1a, 0x23, - 0xc3, 0xe1, 0x23, 0x68, 0x8a, 0x34, 0xa4, 0x2e, 0x7a, 0x3e, 0xeb, 0xea, 0x97, 0x23, 0x49, 0xd0, + 0x56, 0x58, 0x26, 0xcd, 0x59, 0x0d, 0x52, 0x34, 0xe2, 0x23, 0x9b, 0xb4, 0x09, 0x91, 0x3d, 0xc7, + 0xfc, 0xbb, 0xbb, 0x55, 0xea, 0xc6, 0x4f, 0x72, 0x50, 0x7c, 0x0c, 0x4d, 0x6e, 0x72, 0x97, 0xbd, + 0xba, 0x89, 0x3a, 0x28, 0x46, 0x19, 0xd8, 0xc0, 0xca, 0x23, 0x9f, 0x04, 0x4a, 0xac, 0x48, 0x12, + 0xb0, 0xff, 0x35, 0x74, 0xf2, 0x0e, 0xdc, 0x85, 0xfa, 0x2b, 0xb6, 0x8a, 0xef, 0xbd, 0x5e, 0xe2, + 0x41, 0xac, 0xcc, 0xf5, 0xcd, 0x61, 0x0f, 0x20, 0x16, 0x76, 0xec, 0x3c, 0x42, 0xee, 0xcf, 0x08, + 0x3a, 0x79, 0xba, 0xb7, 0x70, 0x5f, 0x3f, 0x87, 0x76, 0x94, 0xb6, 0x89, 0x34, 0x3d, 0xb6, 0x3d, + 0x7c, 0xff, 0xa6, 0x1e, 0x93, 0x24, 0x1f, 0xe1, 0xfe, 0x86, 0x00, 0xb2, 0x3b, 0x70, 0x0b, 0x8c, + 0x1e, 0xc0, 0x6e, 0x79, 0x1e, 0xd8, 0x02, 0x74, 0x48, 0xd5, 0x51, 0xe6, 0xdf, 0x78, 0x63, 0xfe, + 0xff, 0x20, 0xb8, 0x53, 0x10, 0x1c, 0x1f, 0xc2, 0x8e, 0x7d, 0x09, 0x9e, 0x2d, 0x5e, 0xce, 0xb8, + 0x77, 0xc2, 0x92, 0x4c, 0xca, 0xe6, 0xdc, 0x48, 0xcb, 0xa0, 0x4e, 0x61, 0xa4, 0x65, 0xd8, 0xb7, + 0x9b, 0x96, 0xa9, 0x83, 0x49, 0x67, 0xea, 0xc7, 0x93, 0x33, 0xdd, 0xbb, 0xbf, 0x23, 0x68, 0xe7, + 0x2e, 0xec, 0x2d, 0xd4, 0x2c, 0x95, 0x2c, 0x7b, 0x53, 0xeb, 0x79, 0xc9, 0x52, 0x73, 0x81, 0x57, + 0xa3, 0xc8, 0x6b, 0xbd, 0x44, 0x1b, 0xd7, 0x48, 0xe4, 0xca, 0xb4, 0x6e, 0xf1, 0xdc, 0xbc, 0x29, + 0x8d, 0x2f, 0x61, 0x27, 0x9e, 0x0a, 0x84, 0x45, 0x33, 0xea, 0xa5, 0x77, 0xfa, 0x5e, 0x51, 0x53, + 0x52, 0x00, 0x91, 0x72, 0x90, 0xfb, 0x03, 0x82, 0xdd, 0x0a, 0xec, 0x16, 0x04, 0x5c, 0xf7, 0x38, + 0xd6, 0xd7, 0x3f, 0x8e, 0xee, 0x12, 0xee, 0x5e, 0x33, 0xf8, 0x6f, 0x24, 0x52, 0x6a, 0x29, 0xe7, + 0x8d, 0x6f, 0xca, 0x53, 0xd8, 0xd6, 0x53, 0x6f, 0x15, 0x78, 0x5f, 0x31, 0x29, 0xe9, 0x39, 0xc3, + 0x8f, 0xa0, 0xe9, 0xc5, 0x63, 0xdc, 0x4e, 0xb1, 0x7e, 0x69, 0x42, 0xae, 0x02, 0xaf, 0x30, 0xca, + 0x13, 0xb8, 0xfb, 0x02, 0xde, 0x59, 0xe3, 0x37, 0x4f, 0x83, 0xef, 0xdb, 0xcf, 0x25, 0x19, 0x3f, + 0xb6, 0xa5, 0xc9, 0x38, 0x4a, 0xfd, 0xfa, 0x81, 0xca, 0xd0, 0xd9, 0x53, 0x33, 0x31, 0x8d, 0x91, + 0xe1, 0xf0, 0x11, 0x34, 0x45, 0x7a, 0xa4, 0x2e, 0x7a, 0x3e, 0xeb, 0xea, 0xf7, 0x1d, 0x49, 0xd0, 0xf7, 0x8f, 0x00, 0x57, 0x45, 0xc1, 0x2d, 0xd8, 0x18, 0xf9, 0x73, 0x1e, 0x74, 0x6b, 0x18, 0x60, - 0xf3, 0x85, 0xe0, 0x8a, 0x89, 0x2e, 0xd2, 0xcf, 0xba, 0x42, 0x4c, 0x74, 0x9d, 0xc7, 0x9f, 0xfc, - 0x71, 0xd9, 0x47, 0x6f, 0x2e, 0xfb, 0xe8, 0xef, 0xcb, 0x3e, 0xfa, 0xe9, 0xaa, 0x5f, 0x7b, 0x73, - 0xd5, 0xaf, 0xfd, 0x75, 0xd5, 0xaf, 0xbd, 0xdc, 0x5b, 0xff, 0xb9, 0xfc, 0x6a, 0xd3, 0xfc, 0x7c, - 0xf6, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x6d, 0x2c, 0x1d, 0x4f, 0x0b, 0x00, 0x00, + 0xf3, 0xb9, 0xe0, 0x8a, 0x89, 0x2e, 0xd2, 0x6b, 0x5d, 0x21, 0x26, 0xba, 0xce, 0xe3, 0x8f, 0xfe, + 0xb8, 0xec, 0xa3, 0xd7, 0x97, 0x7d, 0xf4, 0xf7, 0x65, 0x1f, 0xfd, 0x74, 0xd5, 0xaf, 0xbd, 0xbe, + 0xea, 0xd7, 0xfe, 0xba, 0xea, 0xd7, 0x5e, 0xec, 0xad, 0xff, 0x5c, 0x7e, 0xb9, 0x69, 0xfe, 0x7c, + 0xf2, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x9d, 0x20, 0x5d, 0x4f, 0x0b, 0x00, 0x00, } func (m *RawACLRecord) Marshal() (dAtA []byte, err error) { @@ -1285,6 +1285,20 @@ func (m *RawACLRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.AcceptorSignature) > 0 { + i -= len(m.AcceptorSignature) + copy(dAtA[i:], m.AcceptorSignature) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.AcceptorSignature))) + i-- + dAtA[i] = 0x22 + } + if len(m.AcceptorIdentity) > 0 { + i -= len(m.AcceptorIdentity) + copy(dAtA[i:], m.AcceptorIdentity) + i = encodeVarintAclrecord(dAtA, i, uint64(len(m.AcceptorIdentity))) + i-- + dAtA[i] = 0x1a + } if len(m.Signature) > 0 { i -= len(m.Signature) copy(dAtA[i:], m.Signature) @@ -1322,20 +1336,6 @@ func (m *RawACLRecordWithId) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.AcceptorSignature) > 0 { - i -= len(m.AcceptorSignature) - copy(dAtA[i:], m.AcceptorSignature) - i = encodeVarintAclrecord(dAtA, i, uint64(len(m.AcceptorSignature))) - i-- - dAtA[i] = 0x22 - } - if len(m.AcceptorIdentity) > 0 { - i -= len(m.AcceptorIdentity) - copy(dAtA[i:], m.AcceptorIdentity) - i = encodeVarintAclrecord(dAtA, i, uint64(len(m.AcceptorIdentity))) - i-- - dAtA[i] = 0x1a - } if len(m.Id) > 0 { i -= len(m.Id) copy(dAtA[i:], m.Id) @@ -2214,6 +2214,14 @@ func (m *RawACLRecord) Size() (n int) { if l > 0 { n += 1 + l + sovAclrecord(uint64(l)) } + l = len(m.AcceptorIdentity) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) + } + l = len(m.AcceptorSignature) + if l > 0 { + n += 1 + l + sovAclrecord(uint64(l)) + } return n } @@ -2231,14 +2239,6 @@ func (m *RawACLRecordWithId) Size() (n int) { if l > 0 { n += 1 + l + sovAclrecord(uint64(l)) } - l = len(m.AcceptorIdentity) - if l > 0 { - n += 1 + l + sovAclrecord(uint64(l)) - } - l = len(m.AcceptorSignature) - if l > 0 { - n += 1 + l + sovAclrecord(uint64(l)) - } return n } @@ -2744,6 +2744,74 @@ func (m *RawACLRecord) Unmarshal(dAtA []byte) error { m.Signature = []byte{} } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AcceptorIdentity", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AcceptorIdentity = append(m.AcceptorIdentity[:0], dAtA[iNdEx:postIndex]...) + if m.AcceptorIdentity == nil { + m.AcceptorIdentity = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AcceptorSignature", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAclrecord + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAclrecord + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAclrecord + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AcceptorSignature = append(m.AcceptorSignature[:0], dAtA[iNdEx:postIndex]...) + if m.AcceptorSignature == nil { + m.AcceptorSignature = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAclrecord(dAtA[iNdEx:]) @@ -2860,74 +2928,6 @@ func (m *RawACLRecordWithId) Unmarshal(dAtA []byte) error { } m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AcceptorIdentity", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclrecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclrecord - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclrecord - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AcceptorIdentity = append(m.AcceptorIdentity[:0], dAtA[iNdEx:postIndex]...) - if m.AcceptorIdentity == nil { - m.AcceptorIdentity = []byte{} - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AcceptorSignature", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAclrecord - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthAclrecord - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthAclrecord - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AcceptorSignature = append(m.AcceptorSignature[:0], dAtA[iNdEx:postIndex]...) - if m.AcceptorSignature == nil { - m.AcceptorSignature = []byte{} - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAclrecord(dAtA[iNdEx:]) diff --git a/common/pkg/acl/aclrecordproto/protos/aclrecord.proto b/common/pkg/acl/aclrecordproto/protos/aclrecord.proto index cf0afcfa..ca527e04 100644 --- a/common/pkg/acl/aclrecordproto/protos/aclrecord.proto +++ b/common/pkg/acl/aclrecordproto/protos/aclrecord.proto @@ -5,13 +5,13 @@ option go_package = "pkg/acl/aclrecordproto"; message RawACLRecord { bytes payload = 1; bytes signature = 2; + bytes acceptorIdentity = 3; + bytes acceptorSignature = 4; } message RawACLRecordWithId { bytes payload = 1; string id = 2; - bytes acceptorIdentity = 3; - bytes acceptorSignature = 4; } message ACLRecord { diff --git a/common/pkg/acl/tree/changevalidator.go b/common/pkg/acl/tree/changevalidator.go index 617e610d..b4d63ea9 100644 --- a/common/pkg/acl/tree/changevalidator.go +++ b/common/pkg/acl/tree/changevalidator.go @@ -3,14 +3,14 @@ package tree import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" - list2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" ) type ObjectTreeValidator interface { // ValidateFullTree should always be entered while holding a read lock on ACLList - ValidateFullTree(tree *Tree, aclList list2.ACLList) error + ValidateFullTree(tree *Tree, aclList list.ACLList) error // ValidateNewChanges should always be entered while holding a read lock on ACLList - ValidateNewChanges(tree *Tree, aclList list2.ACLList, newChanges []*Change) error + ValidateNewChanges(tree *Tree, aclList list.ACLList, newChanges []*Change) error } type objectTreeValidator struct{} @@ -19,7 +19,7 @@ func newTreeValidator() ObjectTreeValidator { return &objectTreeValidator{} } -func (v *objectTreeValidator) ValidateFullTree(tree *Tree, aclList list2.ACLList) (err error) { +func (v *objectTreeValidator) ValidateFullTree(tree *Tree, aclList list.ACLList) (err error) { tree.Iterate(tree.RootId(), func(c *Change) (isContinue bool) { err = v.validateChange(tree, aclList, c) return err == nil @@ -27,7 +27,7 @@ func (v *objectTreeValidator) ValidateFullTree(tree *Tree, aclList list2.ACLList return err } -func (v *objectTreeValidator) ValidateNewChanges(tree *Tree, aclList list2.ACLList, newChanges []*Change) (err error) { +func (v *objectTreeValidator) ValidateNewChanges(tree *Tree, aclList list.ACLList, newChanges []*Change) (err error) { for _, c := range newChanges { err = v.validateChange(tree, aclList, c) if err != nil { @@ -37,9 +37,9 @@ func (v *objectTreeValidator) ValidateNewChanges(tree *Tree, aclList list2.ACLLi return } -func (v *objectTreeValidator) validateChange(tree *Tree, aclList list2.ACLList, c *Change) (err error) { +func (v *objectTreeValidator) validateChange(tree *Tree, aclList list.ACLList, c *Change) (err error) { var ( - perm list2.UserPermissionPair + perm list.UserPermissionPair state = aclList.ACLState() ) // checking if the user could write @@ -49,7 +49,7 @@ func (v *objectTreeValidator) validateChange(tree *Tree, aclList list2.ACLList, } if perm.Permission != aclrecordproto.ACLUserPermissions_Writer && perm.Permission != aclrecordproto.ACLUserPermissions_Admin { - err = list2.ErrInsufficientPermissions + err = list.ErrInsufficientPermissions return } diff --git a/node/acl/service.go b/node/acl/service.go index c6099cb9..5227a8ab 100644 --- a/node/acl/service.go +++ b/node/acl/service.go @@ -44,11 +44,6 @@ func (s *service) CreateLog(ctx context.Context, aclId string, rec *aclrecordpro if err != nil { return } - acc := s.account.Account() - rec.AcceptorIdentity = acc.Identity - if rec.AcceptorSignature, err = acc.SignKey.Sign(rec.Payload); err != nil { - return - } recPayload, err := rec.Marshal() if err != nil { return @@ -74,11 +69,7 @@ func (s *service) AddRecord(ctx context.Context, aclId string, rec *aclrecordpro if err != nil { return } - acc := s.account.Account() - rec.AcceptorIdentity = acc.Identity - if rec.AcceptorSignature, err = acc.SignKey.Sign(rec.Payload); err != nil { - return - } + recPayload, err := rec.Marshal() if err != nil { return diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go index f0692c8a..a05b5efc 100644 --- a/node/nodespace/rpchandler.go +++ b/node/nodespace/rpchandler.go @@ -37,7 +37,7 @@ func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpac } return } - st.Close() + err = st.Close() return } diff --git a/node/nodespace/service.go b/node/nodespace/service.go index 25d08985..82faa71f 100644 --- a/node/nodespace/service.go +++ b/node/nodespace/service.go @@ -7,7 +7,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" - config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache" "time" @@ -27,20 +27,18 @@ type Service interface { } type service struct { - conf config2.Space + conf config.Space spaceCache ocache.OCache commonSpace commonspace.Service spaceStorageProvider storage.SpaceStorageProvider } func (s *service) Init(a *app.App) (err error) { - s.conf = a.MustComponent(config2.CName).(*config2.Config).Space + s.conf = a.MustComponent(config.CName).(*config.Config).Space s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service) s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.spaceCache = ocache.New( - func(ctx context.Context, id string) (value ocache.Object, err error) { - return s.commonSpace.GetSpace(ctx, id) - }, + s.loadSpace, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), ocache.WithTTL(time.Duration(s.conf.GCTTL)*time.Second), @@ -64,6 +62,21 @@ func (s *service) GetSpace(ctx context.Context, id string) (commonspace.Space, e return v.(commonspace.Space), nil } +func (s *service) loadSpace(ctx context.Context, id string) (value ocache.Object, err error) { + cc, err := s.commonSpace.NewSpace(ctx, id) + if err != nil { + return + } + ns, err := newNodeSpace(cc) + if err != nil { + return + } + if err = ns.Init(ctx); err != nil { + return + } + return ns, nil +} + func (s *service) Close(ctx context.Context) (err error) { return s.spaceCache.Close() } diff --git a/node/nodespace/space.go b/node/nodespace/space.go new file mode 100644 index 00000000..a1ffe43f --- /dev/null +++ b/node/nodespace/space.go @@ -0,0 +1,24 @@ +package nodespace + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" +) + +func newNodeSpace(cc commonspace.Space) (commonspace.Space, error) { + return &nodeSpace{cc}, nil +} + +type nodeSpace struct { + commonspace.Space +} + +func (s *nodeSpace) Init(ctx context.Context) (err error) { + // try to push acl to consensus node + // + return s.Space.Init(ctx) +} + +func (s *nodeSpace) Close() (err error) { + return s.Space.Close() +} From 37035bfacd4e25589376fe1f6c539e8018676134 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Wed, 2 Nov 2022 13:54:57 +0300 Subject: [PATCH 213/219] node acl service --- common/testutil/testaccount/service.go | 44 ++++ consensus/consensusclient/client.go | 1 + consensus/consensusclient/client_test.go | 16 +- .../mock_consensusclient.go | 150 ++++++++++++++ consensus/consensusclient/stream.go | 6 + node/acl/service.go | 70 +++++-- node/acl/service_test.go | 195 ++++++++++++++++++ 7 files changed, 460 insertions(+), 22 deletions(-) create mode 100644 common/testutil/testaccount/service.go create mode 100644 consensus/consensusclient/mock_consensusclient/mock_consensusclient.go create mode 100644 node/acl/service_test.go diff --git a/common/testutil/testaccount/service.go b/common/testutil/testaccount/service.go new file mode 100644 index 00000000..7995621d --- /dev/null +++ b/common/testutil/testaccount/service.go @@ -0,0 +1,44 @@ +package testaccount + +import ( + accountService "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" +) + +// AccountTestService provides service for test purposes, generates new random account every Init +type AccountTestService struct { + acc *account.AccountData +} + +func (s *AccountTestService) Init(a *app.App) (err error) { + encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) + if err != nil { + return + } + + signKey, _, err := signingkey.GenerateRandomEd25519KeyPair() + if err != nil { + return + } + ident, err := signKey.GetPublic().Raw() + if err != nil { + return + } + s.acc = &account.AccountData{ + Identity: ident, + SignKey: signKey, + EncKey: encKey, + } + return nil +} + +func (s *AccountTestService) Name() (name string) { + return accountService.CName +} + +func (s *AccountTestService) Account() *account.AccountData { + return s.acc +} diff --git a/consensus/consensusclient/client.go b/consensus/consensusclient/client.go index 9d08617b..48576dd4 100644 --- a/consensus/consensusclient/client.go +++ b/consensus/consensusclient/client.go @@ -1,3 +1,4 @@ +//go:generate mockgen -destination mock_consensusclient/mock_consensusclient.go github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient Service package consensusclient import ( diff --git a/consensus/consensusclient/client_test.go b/consensus/consensusclient/client_test.go index ef89d8d5..e7557d0d 100644 --- a/consensus/consensusclient/client_test.go +++ b/consensus/consensusclient/client_test.go @@ -13,6 +13,7 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "sync" "testing" "time" ) @@ -22,7 +23,7 @@ func TestService_Watch(t *testing.T) { fx := newFixture(t).run(t) defer fx.Finish() var logId = []byte{'1'} - w := &testWatcher{} + w := &testWatcher{ready: make(chan struct{})} require.NoError(t, fx.Watch(logId, w)) st := fx.testServer.waitStream(t) req, err := st.Recv() @@ -34,6 +35,7 @@ func TestService_Watch(t *testing.T) { Error: consensusproto.ErrCodes_ErrorOffset + consensusproto.ErrCodes_LogNotFound, }, })) + <-w.ready assert.Equal(t, consensuserr.ErrLogNotFound, w.err) fx.testServer.releaseStream <- nil }) @@ -207,14 +209,22 @@ func (t *testServer) waitStream(test *testing.T) consensusproto.DRPCConsensus_Wa } type testWatcher struct { - recs [][]*consensusproto.Record - err error + recs [][]*consensusproto.Record + err error + ready chan struct{} + once sync.Once } func (t *testWatcher) AddConsensusRecords(recs []*consensusproto.Record) { t.recs = append(t.recs, recs) + t.once.Do(func() { + close(t.ready) + }) } func (t *testWatcher) AddConsensusError(err error) { t.err = err + t.once.Do(func() { + close(t.ready) + }) } diff --git a/consensus/consensusclient/mock_consensusclient/mock_consensusclient.go b/consensus/consensusclient/mock_consensusclient/mock_consensusclient.go new file mode 100644 index 00000000..356cb927 --- /dev/null +++ b/consensus/consensusclient/mock_consensusclient/mock_consensusclient.go @@ -0,0 +1,150 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient (interfaces: Service) + +// Package mock_consensusclient is a generated GoMock package. +package mock_consensusclient + +import ( + context "context" + reflect "reflect" + + app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + consensusclient "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient" + consensusproto "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" + gomock "github.com/golang/mock/gomock" +) + +// MockService is a mock of Service interface. +type MockService struct { + ctrl *gomock.Controller + recorder *MockServiceMockRecorder +} + +// MockServiceMockRecorder is the mock recorder for MockService. +type MockServiceMockRecorder struct { + mock *MockService +} + +// NewMockService creates a new mock instance. +func NewMockService(ctrl *gomock.Controller) *MockService { + mock := &MockService{ctrl: ctrl} + mock.recorder = &MockServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockService) EXPECT() *MockServiceMockRecorder { + return m.recorder +} + +// AddLog mocks base method. +func (m *MockService) AddLog(arg0 context.Context, arg1 *consensusproto.Log) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddLog", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddLog indicates an expected call of AddLog. +func (mr *MockServiceMockRecorder) AddLog(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddLog", reflect.TypeOf((*MockService)(nil).AddLog), arg0, arg1) +} + +// AddRecord mocks base method. +func (m *MockService) AddRecord(arg0 context.Context, arg1 []byte, arg2 *consensusproto.Record) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddRecord", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddRecord indicates an expected call of AddRecord. +func (mr *MockServiceMockRecorder) AddRecord(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRecord", reflect.TypeOf((*MockService)(nil).AddRecord), arg0, arg1, arg2) +} + +// Close mocks base method. +func (m *MockService) Close(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close. +func (mr *MockServiceMockRecorder) Close(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockService)(nil).Close), arg0) +} + +// Init mocks base method. +func (m *MockService) Init(arg0 *app.App) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Init", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Init indicates an expected call of Init. +func (mr *MockServiceMockRecorder) Init(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockService)(nil).Init), arg0) +} + +// Name mocks base method. +func (m *MockService) Name() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) + return ret0 +} + +// Name indicates an expected call of Name. +func (mr *MockServiceMockRecorder) Name() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockService)(nil).Name)) +} + +// Run mocks base method. +func (m *MockService) Run(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Run", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Run indicates an expected call of Run. +func (mr *MockServiceMockRecorder) Run(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Run", reflect.TypeOf((*MockService)(nil).Run), arg0) +} + +// UnWatch mocks base method. +func (m *MockService) UnWatch(arg0 []byte) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UnWatch", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// UnWatch indicates an expected call of UnWatch. +func (mr *MockServiceMockRecorder) UnWatch(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnWatch", reflect.TypeOf((*MockService)(nil).UnWatch), arg0) +} + +// Watch mocks base method. +func (m *MockService) Watch(arg0 []byte, arg1 consensusclient.Watcher) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Watch", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Watch indicates an expected call of Watch. +func (mr *MockServiceMockRecorder) Watch(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Watch", reflect.TypeOf((*MockService)(nil).Watch), arg0, arg1) +} diff --git a/consensus/consensusclient/stream.go b/consensus/consensusclient/stream.go index d3383629..d2865326 100644 --- a/consensus/consensusclient/stream.go +++ b/consensus/consensusclient/stream.go @@ -3,6 +3,7 @@ package consensusclient import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" "github.com/cheggaaa/mb/v2" + "sync" ) func runStream(rpcStream consensusproto.DRPCConsensus_WatchLogClient) *stream { @@ -17,6 +18,7 @@ func runStream(rpcStream consensusproto.DRPCConsensus_WatchLogClient) *stream { type stream struct { rpcStream consensusproto.DRPCConsensus_WatchLogClient mb *mb.MB[*consensusproto.WatchLogEvent] + mu sync.Mutex err error } @@ -37,6 +39,8 @@ func (s *stream) WaitLogs() []*consensusproto.WatchLogEvent { } func (s *stream) Err() error { + s.mu.Lock() + defer s.mu.Unlock() return s.err } @@ -45,7 +49,9 @@ func (s *stream) readStream() { for { event, err := s.rpcStream.Recv() if err != nil { + s.mu.Lock() s.err = err + s.mu.Unlock() return } if err = s.mb.Add(event); err != nil { diff --git a/node/acl/service.go b/node/acl/service.go index 5227a8ab..a417778c 100644 --- a/node/acl/service.go +++ b/node/acl/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/syncservice/synchandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" "time" @@ -16,7 +17,15 @@ const CName = "node.acl" var log = logger.NewNamed(CName) +func New() Service { + return &service{} +} + type Service interface { + CreateLog(ctx context.Context, aclId string, rawRec *aclrecordproto.RawACLRecord) (firstRecId string, err error) + AddRecord(ctx context.Context, aclId string, rawRec *aclrecordproto.RawACLRecord) (id string, err error) + Watch(ctx context.Context, spaceId, aclId string, h synchandler.SyncHandler) (err error) + UnWatch(aclId string) (err error) app.Component } @@ -35,51 +44,49 @@ func (s *service) Name() (name string) { return CName } -func (s *service) CreateLog(ctx context.Context, aclId string, rec *aclrecordproto.RawACLRecordWithId) (err error) { +func (s *service) CreateLog(ctx context.Context, aclId string, rawRec *aclrecordproto.RawACLRecord) (firstRecId string, err error) { logId, err := cidToByte(aclId) if err != nil { return } - recId, err := cidToByte(rec.Id) + recId, _, payload, err := s.signAndMarshal(rawRec) if err != nil { return } - recPayload, err := rec.Marshal() - if err != nil { - return - } - return s.consService.AddLog(ctx, &consensusproto.Log{ + if err = s.consService.AddLog(ctx, &consensusproto.Log{ Id: logId, Records: []*consensusproto.Record{ { Id: recId, - Payload: recPayload, + Payload: payload, CreatedUnix: uint64(time.Now().Unix()), }, }, - }) + }); err != nil { + return + } + return cidToString(recId) } -func (s *service) AddRecord(ctx context.Context, aclId string, rec *aclrecordproto.RawACLRecordWithId) (err error) { +func (s *service) AddRecord(ctx context.Context, aclId string, rawRec *aclrecordproto.RawACLRecord) (id string, err error) { logId, err := cidToByte(aclId) if err != nil { return } - recId, err := cidToByte(rec.Id) - if err != nil { - return - } - recPayload, err := rec.Marshal() + recId, prevId, payload, err := s.signAndMarshal(rawRec) if err != nil { return } - return s.consService.AddRecord(ctx, logId, &consensusproto.Record{ + if err = s.consService.AddRecord(ctx, logId, &consensusproto.Record{ Id: recId, - PrevId: nil, //TODO: - Payload: recPayload, + PrevId: prevId, + Payload: payload, CreatedUnix: uint64(time.Now().Unix()), - }) + }); err != nil { + return + } + return cidToString(recId) } func (s *service) Watch(ctx context.Context, spaceId, aclId string, h synchandler.SyncHandler) (err error) { @@ -100,3 +107,28 @@ func (s *service) UnWatch(aclId string) (err error) { } return s.consService.UnWatch(logId) } + +func (s *service) signAndMarshal(rawRec *aclrecordproto.RawACLRecord) (recId, prevId, payload []byte, err error) { + var rec = &aclrecordproto.ACLRecord{} + if err = rec.Unmarshal(rawRec.Payload); err != nil { + return + } + if rec.PrevId != "" { + if prevId, err = cidToByte(rec.PrevId); err != nil { + return + } + } + rawRec.AcceptorIdentity = s.account.Account().Identity + if rawRec.AcceptorSignature, err = s.account.Account().SignKey.Sign(rawRec.Payload); err != nil { + return + } + if payload, err = rawRec.Marshal(); err != nil { + return + } + recCid, err := cid.NewCIDFromBytes(payload) + if err != nil { + return + } + recId, err = cidToByte(recCid) + return +} diff --git a/node/acl/service_test.go b/node/acl/service_test.go new file mode 100644 index 00000000..eb720d64 --- /dev/null +++ b/node/acl/service_test.go @@ -0,0 +1,195 @@ +package acl + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/testutil/testaccount" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusclient/mock_consensusclient" + "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +var ctx = context.Background() + +func TestService_CreateLog(t *testing.T) { + fx := newFixture(t) + defer fx.Finish(t) + var clog *consensusproto.Log + fx.mockClient.EXPECT().AddLog(ctx, gomock.Any()).Do(func(ctx context.Context, l *consensusproto.Log) { + clog = l + }) + + aclId, _ := cid.NewCIDFromBytes([]byte("aclId")) + + rec := &aclrecordproto.ACLRecord{ + PrevId: "", + Identity: fx.account.Account().Identity, + Data: []byte{'1', '2', '3'}, + Timestamp: time.Now().Unix(), + } + pl, _ := rec.Marshal() + + firstRecId, err := fx.CreateLog(ctx, aclId, &aclrecordproto.RawACLRecord{ + Payload: pl, + }) + require.NoError(t, err) + aclIdBytes, _ := cidToByte(aclId) + firstRecIdBytes, _ := cidToByte(firstRecId) + assert.Equal(t, aclIdBytes, clog.Id) + assert.NotEmpty(t, firstRecIdBytes) + require.Len(t, clog.Records, 1) + + var resultRawAcl = &aclrecordproto.RawACLRecord{} + require.NoError(t, resultRawAcl.Unmarshal(clog.Records[0].Payload)) + valid, err := fx.account.Account().SignKey.GetPublic().Verify(resultRawAcl.Payload, resultRawAcl.AcceptorSignature) + require.NoError(t, err) + require.True(t, valid) +} + +func TestService_AddRecord(t *testing.T) { + fx := newFixture(t) + defer fx.Finish(t) + var clog *consensusproto.Log + fx.mockClient.EXPECT().AddLog(ctx, gomock.Any()).Do(func(ctx context.Context, l *consensusproto.Log) { + clog = l + }) + + aclId, _ := cid.NewCIDFromBytes([]byte("aclId")) + + rec := &aclrecordproto.ACLRecord{ + PrevId: "", + Identity: fx.account.Account().Identity, + Data: []byte{'1', '2', '3'}, + Timestamp: time.Now().Unix(), + } + pl, _ := rec.Marshal() + + firstRecId, err := fx.CreateLog(ctx, aclId, &aclrecordproto.RawACLRecord{ + Payload: pl, + }) + require.NoError(t, err) + aclIdBytes, _ := cidToByte(aclId) + firstRecIdBytes, _ := cidToByte(firstRecId) + assert.Equal(t, aclIdBytes, clog.Id) + assert.NotEmpty(t, firstRecIdBytes) + var addRec *consensusproto.Record + fx.mockClient.EXPECT().AddRecord(ctx, aclIdBytes, gomock.Any()).Do(func(ctx context.Context, logId []byte, rec *consensusproto.Record) { + addRec = rec + }) + rec = &aclrecordproto.ACLRecord{ + PrevId: firstRecId, + Identity: fx.account.Account().Identity, + Data: []byte{'1', '2', '3', '4'}, + Timestamp: time.Now().Unix(), + } + pl, _ = rec.Marshal() + + newRecId, err := fx.AddRecord(ctx, aclId, &aclrecordproto.RawACLRecord{ + Payload: pl, + }) + require.NoError(t, err) + assert.NotEmpty(t, newRecId) + + assert.Equal(t, firstRecIdBytes, addRec.PrevId) + +} + +func TestService_Watch(t *testing.T) { + t.Run("remote error", func(t *testing.T) { + fx := newFixture(t) + defer fx.Finish(t) + var expErr = fmt.Errorf("error") + aclId, _ := cid.NewCIDFromBytes([]byte("aclId")) + aclIdBytes, _ := cidToByte(aclId) + fx.mockClient.EXPECT().Watch(aclIdBytes, gomock.Any()).Do(func(aid []byte, w consensusclient.Watcher) { + assert.Equal(t, aclIdBytes, aid) + go func() { + time.Sleep(time.Millisecond * 10) + w.AddConsensusError(expErr) + }() + }) + + th := &testHandler{} + err := fx.Watch(ctx, "123", aclId, th) + assert.Equal(t, expErr, err) + }) + t.Run("success", func(t *testing.T) { + fx := newFixture(t) + defer fx.Finish(t) + aclId, _ := cid.NewCIDFromBytes([]byte("aclId")) + aclIdBytes, _ := cidToByte(aclId) + fx.mockClient.EXPECT().Watch(aclIdBytes, gomock.Any()).Do(func(aid []byte, w consensusclient.Watcher) { + assert.Equal(t, aclIdBytes, aid) + go func() { + time.Sleep(time.Millisecond * 10) + r1cid, _ := cid.NewCIDFromBytes([]byte("r1")) + r2cid, _ := cid.NewCIDFromBytes([]byte("r2")) + r1cidB, _ := cidToByte(r1cid) + r2cidB, _ := cidToByte(r2cid) + w.AddConsensusRecords([]*consensusproto.Record{ + { + Id: r2cidB, + PrevId: r1cidB, + Payload: []byte("p1"), + }, + { + Id: r1cidB, + Payload: []byte("p1"), + }, + }) + }() + }) + + th := &testHandler{} + err := fx.Watch(ctx, "123", aclId, th) + require.NoError(t, err) + }) +} + +func newFixture(t *testing.T) *fixture { + fx := &fixture{ + a: new(app.App), + ctrl: gomock.NewController(t), + account: &testaccount.AccountTestService{}, + } + fx.mockClient = mock_consensusclient.NewMockService(fx.ctrl) + fx.mockClient.EXPECT().Name().Return(consensusclient.CName).AnyTimes() + fx.mockClient.EXPECT().Init(gomock.Any()).AnyTimes() + fx.mockClient.EXPECT().Run(gomock.Any()).AnyTimes() + fx.mockClient.EXPECT().Close(gomock.Any()).AnyTimes() + fx.Service = New() + fx.a.Register(fx.account).Register(fx.mockClient).Register(fx.Service) + require.NoError(t, fx.a.Start(ctx)) + return fx +} + +type fixture struct { + Service + mockClient *mock_consensusclient.MockService + ctrl *gomock.Controller + a *app.App + account *testaccount.AccountTestService +} + +func (fx *fixture) Finish(t *testing.T) { + require.NoError(t, fx.a.Close(ctx)) + fx.ctrl.Finish() +} + +type testHandler struct { + req *spacesyncproto.ObjectSyncMessage +} + +func (t *testHandler) HandleMessage(ctx context.Context, senderId string, request *spacesyncproto.ObjectSyncMessage) (err error) { + t.req = request + return +} From 9bbb1a02e51f466cdbd6e8a59ec5df7e8b6461c1 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 6 Nov 2022 14:25:27 +0100 Subject: [PATCH 214/219] Add pull space method to proto and provide get space --- client/clientspace/rpchandler.go | 52 +- client/clientspace/service.go | 5 + common/commonspace/service.go | 79 ++- common/commonspace/space.go | 27 +- .../mock_spacesyncproto.go | 15 + .../spacesyncproto/protos/spacesync.proto | 14 + .../spacesyncproto/spacesync.pb.go | 552 ++++++++++++++++-- .../spacesyncproto/spacesync_drpc.pb.go | 42 +- .../syncservice/streampool_test.go | 4 + common/nodeconf/confconnector.go | 8 +- common/pkg/acl/list/list.go | 12 +- common/pkg/acl/list/mock_list/mock_list.go | 4 +- node/nodespace/rpchandler.go | 51 +- node/nodespace/service.go | 5 + 14 files changed, 754 insertions(+), 116 deletions(-) diff --git a/client/clientspace/rpchandler.go b/client/clientspace/rpchandler.go index 6c481d3f..8f6a7989 100644 --- a/client/clientspace/rpchandler.go +++ b/client/clientspace/rpchandler.go @@ -2,43 +2,43 @@ package clientspace import ( "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "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/pkg/acl/aclrecordproto" ) type rpcHandler struct { s *service } -func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) { - _, err = r.s.GetSpace(ctx, req.SpaceHeader.Id) - if err == nil { - err = spacesyncproto.ErrSpaceExists - return - } - if err != treegetter.ErrSpaceNotFound { - err = spacesyncproto.ErrUnexpected - return - } - - payload := storage.SpaceStorageCreatePayload{ - RecWithId: &aclrecordproto.RawACLRecordWithId{ - Payload: req.AclPayload, - Id: req.AclPayloadId, - }, - SpaceHeaderWithId: req.SpaceHeader, - } - st, err := r.s.spaceStorageProvider.CreateSpaceStorage(payload) +func (r *rpcHandler) PullSpace(ctx context.Context, request *spacesyncproto.PullSpaceRequest) (resp *spacesyncproto.PullSpaceResponse, err error) { + sp, err := r.s.GetSpace(ctx, request.Id) if err != nil { - err = spacesyncproto.ErrUnexpected - if err == storage.ErrSpaceStorageExists { - err = spacesyncproto.ErrSpaceExists + if err != spacesyncproto.ErrSpaceMissing { + err = spacesyncproto.ErrUnexpected } return } - st.Close() + + description := sp.Description() + resp = &spacesyncproto.PullSpaceResponse{ + SpaceHeader: description.SpaceHeader, + AclPayload: description.AclPayload, + AclPayloadId: description.AclId, + } + return +} + +func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) { + description := commonspace.SpaceDescription{ + SpaceHeader: req.SpaceHeader, + AclId: req.AclPayloadId, + AclPayload: req.AclPayload, + } + err = r.s.AddSpace(ctx, description) + if err != nil { + return + } + resp = &spacesyncproto.PushSpaceResponse{} return } diff --git a/client/clientspace/service.go b/client/clientspace/service.go index 876dcd3f..26497d94 100644 --- a/client/clientspace/service.go +++ b/client/clientspace/service.go @@ -23,6 +23,7 @@ func New() Service { type Service interface { GetSpace(ctx context.Context, id string) (commonspace.Space, error) + AddSpace(ctx context.Context, description commonspace.SpaceDescription) (err error) CreateSpace(ctx context.Context, payload commonspace.SpaceCreatePayload) (commonspace.Space, error) DeriveSpace(ctx context.Context, payload commonspace.SpaceDerivePayload) (commonspace.Space, error) app.ComponentRunnable @@ -92,6 +93,10 @@ func (s *service) GetSpace(ctx context.Context, id string) (container commonspac return v.(commonspace.Space), nil } +func (s *service) AddSpace(ctx context.Context, description commonspace.SpaceDescription) (err error) { + return s.commonSpace.AddSpace(ctx, description) +} + func (s *service) Close(ctx context.Context) (err error) { return s.spaceCache.Close() } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 8ab4d9f5..48d81ffc 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -6,12 +6,15 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "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/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter" config2 "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/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" ) const CName = "common.commonspace" @@ -26,6 +29,7 @@ type Service interface { DeriveSpace(ctx context.Context, payload SpaceDerivePayload) (string, error) CreateSpace(ctx context.Context, payload SpaceCreatePayload) (string, error) GetSpace(ctx context.Context, id string) (sp Space, err error) + AddSpace(ctx context.Context, spaceDescription SpaceDescription) (err error) app.Component } @@ -82,10 +86,48 @@ func (s *service) DeriveSpace( return store.ID(), nil } +func (s *service) AddSpace(ctx context.Context, spaceDescription SpaceDescription) (err error) { + _, err = s.storageProvider.SpaceStorage(spaceDescription.SpaceHeader.Id) + if err == nil { + err = spacesyncproto.ErrSpaceExists + return + } + if err != storage.ErrSpaceStorageMissing { + err = spacesyncproto.ErrUnexpected + return + } + + payload := storage.SpaceStorageCreatePayload{ + RecWithId: &aclrecordproto.RawACLRecordWithId{ + Payload: spaceDescription.AclPayload, + Id: spaceDescription.AclId, + }, + SpaceHeaderWithId: spaceDescription.SpaceHeader, + } + st, err := s.storageProvider.CreateSpaceStorage(payload) + if err != nil { + err = spacesyncproto.ErrUnexpected + if err == storage.ErrSpaceStorageExists { + err = spacesyncproto.ErrSpaceExists + } + return + } + err = st.Close() + return +} + func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { st, err := s.storageProvider.SpaceStorage(id) if err != nil { - return nil, err + if err != storage.ErrSpaceStorageMissing { + return nil, err + } + + st, err = s.getSpaceStorageFromRemote(ctx, id) + if err != nil { + err = storage.ErrSpaceStorageMissing + return nil, err + } } lastConfiguration := s.configurationService.GetLast() @@ -106,3 +148,38 @@ func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { } return sp, nil } + +func (s *service) getSpaceStorageFromRemote(ctx context.Context, id string) (st storage.SpaceStorage, err error) { + var p peer.Peer + peerId, err := syncservice.GetPeerIdFromStreamContext(ctx) + if err == nil { + p, err = s.pool.Dial(ctx, peerId) + if err != nil { + return + } + } else { + lastConfiguration := s.configurationService.GetLast() + // for nodes we always get remote space only if we have id in the context + if lastConfiguration.IsResponsible(id) { + err = spacesyncproto.ErrSpaceMissing + return + } + p, err = s.pool.DialOneOf(ctx, lastConfiguration.NodeIds(id)) + if err != nil { + return + } + } + cl := spacesyncproto.NewDRPCSpaceClient(p) + res, err := cl.PullSpace(ctx, &spacesyncproto.PullSpaceRequest{Id: id}) + if err != nil { + return + } + st, err = s.storageProvider.CreateSpaceStorage(storage.SpaceStorageCreatePayload{ + RecWithId: &aclrecordproto.RawACLRecordWithId{ + Payload: res.AclPayload, + Id: res.AclPayloadId, + }, + SpaceHeaderWithId: res.SpaceHeader, + }) + return +} diff --git a/common/commonspace/space.go b/common/commonspace/space.go index dd2541bd..367c1296 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account" "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/storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncacl" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" @@ -45,6 +46,12 @@ type SpaceDerivePayload struct { EncryptionKey encryptionkey.PrivKey } +type SpaceDescription struct { + SpaceHeader *spacesyncproto.RawSpaceHeaderWithId + AclId string + AclPayload []byte +} + func NewSpaceId(id string, repKey uint64) string { return fmt.Sprintf("%s.%d", id, repKey) } @@ -52,6 +59,7 @@ func NewSpaceId(id string, repKey uint64) string { type Space interface { Id() string StoredIds() []string + Description() SpaceDescription SpaceSyncRpc() RpcHandler @@ -63,8 +71,9 @@ type Space interface { } type space struct { - id string - mu sync.RWMutex + id string + mu sync.RWMutex + header *spacesyncproto.RawSpaceHeaderWithId rpc *rpcHandler @@ -87,7 +96,21 @@ func (s *space) Id() string { return s.id } +func (s *space) Description() SpaceDescription { + root := s.aclList.Root() + return SpaceDescription{ + SpaceHeader: s.header, + AclId: root.Id, + AclPayload: root.Payload, + } +} + func (s *space) Init(ctx context.Context) (err error) { + header, err := s.storage.SpaceHeader() + if err != nil { + return + } + s.header = header s.rpc = &rpcHandler{s: s} initialIds, err := s.storage.StoredIds() if err != nil { diff --git a/common/commonspace/spacesyncproto/mock_spacesyncproto/mock_spacesyncproto.go b/common/commonspace/spacesyncproto/mock_spacesyncproto/mock_spacesyncproto.go index 0d0d52c5..0df3a6ff 100644 --- a/common/commonspace/spacesyncproto/mock_spacesyncproto/mock_spacesyncproto.go +++ b/common/commonspace/spacesyncproto/mock_spacesyncproto/mock_spacesyncproto.go @@ -65,6 +65,21 @@ func (mr *MockDRPCSpaceClientMockRecorder) HeadSync(arg0, arg1 interface{}) *gom return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HeadSync", reflect.TypeOf((*MockDRPCSpaceClient)(nil).HeadSync), arg0, arg1) } +// PullSpace mocks base method. +func (m *MockDRPCSpaceClient) PullSpace(arg0 context.Context, arg1 *spacesyncproto.PullSpaceRequest) (*spacesyncproto.PullSpaceResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PullSpace", arg0, arg1) + ret0, _ := ret[0].(*spacesyncproto.PullSpaceResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PullSpace indicates an expected call of PullSpace. +func (mr *MockDRPCSpaceClientMockRecorder) PullSpace(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PullSpace", reflect.TypeOf((*MockDRPCSpaceClient)(nil).PullSpace), arg0, arg1) +} + // PushSpace mocks base method. func (m *MockDRPCSpaceClient) PushSpace(arg0 context.Context, arg1 *spacesyncproto.PushSpaceRequest) (*spacesyncproto.PushSpaceResponse, error) { m.ctrl.T.Helper() diff --git a/common/commonspace/spacesyncproto/protos/spacesync.proto b/common/commonspace/spacesyncproto/protos/spacesync.proto index 52924272..441c0992 100644 --- a/common/commonspace/spacesyncproto/protos/spacesync.proto +++ b/common/commonspace/spacesyncproto/protos/spacesync.proto @@ -15,6 +15,8 @@ service Space { rpc HeadSync(HeadSyncRequest) returns (HeadSyncResponse); // PushSpace sends new space to the node rpc PushSpace(PushSpaceRequest) returns (PushSpaceResponse); + // PullSpace gets space from the remote peer + rpc PullSpace(PullSpaceRequest) returns (PullSpaceResponse); // Stream opens object sync stream with node or client rpc Stream(stream ObjectSyncMessage) returns (stream ObjectSyncMessage); } @@ -70,6 +72,18 @@ message PushSpaceRequest { // PushSpaceResponse is an empty response message PushSpaceResponse {} +// PullSpaceRequest is a request to request a space on a node that doesn't have it +message PullSpaceRequest { + string id = 1; +} + +// PullSpaceResponse is a response with header and acl root +message PullSpaceResponse { + RawSpaceHeaderWithId spaceHeader = 1; + bytes aclPayload = 2; + string aclPayloadId = 3; +} + // SpaceHeader is a header for a space message SpaceHeader { bytes identity = 1; diff --git a/common/commonspace/spacesyncproto/spacesync.pb.go b/common/commonspace/spacesyncproto/spacesync.pb.go index 8579814c..9f73b956 100644 --- a/common/commonspace/spacesyncproto/spacesync.pb.go +++ b/common/commonspace/spacesyncproto/spacesync.pb.go @@ -493,6 +493,112 @@ func (m *PushSpaceResponse) XXX_DiscardUnknown() { var xxx_messageInfo_PushSpaceResponse proto.InternalMessageInfo +// PullSpaceRequest is a request to request a space on a node that doesn't have it +type PullSpaceRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (m *PullSpaceRequest) Reset() { *m = PullSpaceRequest{} } +func (m *PullSpaceRequest) String() string { return proto.CompactTextString(m) } +func (*PullSpaceRequest) ProtoMessage() {} +func (*PullSpaceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_80e49f1f4ac27799, []int{8} +} +func (m *PullSpaceRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PullSpaceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PullSpaceRequest.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 *PullSpaceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PullSpaceRequest.Merge(m, src) +} +func (m *PullSpaceRequest) XXX_Size() int { + return m.Size() +} +func (m *PullSpaceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PullSpaceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PullSpaceRequest proto.InternalMessageInfo + +func (m *PullSpaceRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +// PullSpaceResponse is a response with header and acl root +type PullSpaceResponse struct { + SpaceHeader *RawSpaceHeaderWithId `protobuf:"bytes,1,opt,name=spaceHeader,proto3" json:"spaceHeader,omitempty"` + AclPayload []byte `protobuf:"bytes,2,opt,name=aclPayload,proto3" json:"aclPayload,omitempty"` + AclPayloadId string `protobuf:"bytes,3,opt,name=aclPayloadId,proto3" json:"aclPayloadId,omitempty"` +} + +func (m *PullSpaceResponse) Reset() { *m = PullSpaceResponse{} } +func (m *PullSpaceResponse) String() string { return proto.CompactTextString(m) } +func (*PullSpaceResponse) ProtoMessage() {} +func (*PullSpaceResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_80e49f1f4ac27799, []int{9} +} +func (m *PullSpaceResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PullSpaceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PullSpaceResponse.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 *PullSpaceResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_PullSpaceResponse.Merge(m, src) +} +func (m *PullSpaceResponse) XXX_Size() int { + return m.Size() +} +func (m *PullSpaceResponse) XXX_DiscardUnknown() { + xxx_messageInfo_PullSpaceResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_PullSpaceResponse proto.InternalMessageInfo + +func (m *PullSpaceResponse) GetSpaceHeader() *RawSpaceHeaderWithId { + if m != nil { + return m.SpaceHeader + } + return nil +} + +func (m *PullSpaceResponse) GetAclPayload() []byte { + if m != nil { + return m.AclPayload + } + return nil +} + +func (m *PullSpaceResponse) GetAclPayloadId() string { + if m != nil { + return m.AclPayloadId + } + return "" +} + // SpaceHeader is a header for a space type SpaceHeader struct { Identity []byte `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"` @@ -506,7 +612,7 @@ func (m *SpaceHeader) Reset() { *m = SpaceHeader{} } func (m *SpaceHeader) String() string { return proto.CompactTextString(m) } func (*SpaceHeader) ProtoMessage() {} func (*SpaceHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{8} + return fileDescriptor_80e49f1f4ac27799, []int{10} } func (m *SpaceHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -579,7 +685,7 @@ func (m *RawSpaceHeader) Reset() { *m = RawSpaceHeader{} } func (m *RawSpaceHeader) String() string { return proto.CompactTextString(m) } func (*RawSpaceHeader) ProtoMessage() {} func (*RawSpaceHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{9} + return fileDescriptor_80e49f1f4ac27799, []int{11} } func (m *RawSpaceHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -631,7 +737,7 @@ func (m *RawSpaceHeaderWithId) Reset() { *m = RawSpaceHeaderWithId{} } func (m *RawSpaceHeaderWithId) String() string { return proto.CompactTextString(m) } func (*RawSpaceHeaderWithId) ProtoMessage() {} func (*RawSpaceHeaderWithId) Descriptor() ([]byte, []int) { - return fileDescriptor_80e49f1f4ac27799, []int{10} + return fileDescriptor_80e49f1f4ac27799, []int{12} } func (m *RawSpaceHeaderWithId) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -684,6 +790,8 @@ func init() { proto.RegisterType((*ObjectSyncMessage)(nil), "anySpace.ObjectSyncMessage") proto.RegisterType((*PushSpaceRequest)(nil), "anySpace.PushSpaceRequest") proto.RegisterType((*PushSpaceResponse)(nil), "anySpace.PushSpaceResponse") + proto.RegisterType((*PullSpaceRequest)(nil), "anySpace.PullSpaceRequest") + proto.RegisterType((*PullSpaceResponse)(nil), "anySpace.PullSpaceResponse") proto.RegisterType((*SpaceHeader)(nil), "anySpace.SpaceHeader") proto.RegisterType((*RawSpaceHeader)(nil), "anySpace.RawSpaceHeader") proto.RegisterType((*RawSpaceHeaderWithId)(nil), "anySpace.RawSpaceHeaderWithId") @@ -694,50 +802,53 @@ func init() { } var fileDescriptor_80e49f1f4ac27799 = []byte{ - // 685 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xcd, 0x4e, 0xdb, 0x4a, - 0x14, 0x8e, 0x4d, 0x80, 0xe4, 0x24, 0x84, 0x30, 0x97, 0xab, 0xeb, 0x9b, 0x56, 0x6e, 0xe4, 0x45, - 0x15, 0x75, 0x01, 0x6d, 0xda, 0x1d, 0x9b, 0xfe, 0x10, 0xd4, 0xa8, 0xa2, 0xa0, 0x49, 0xab, 0x4a, - 0x55, 0x37, 0x83, 0x3d, 0x24, 0x53, 0xc5, 0x1e, 0xd7, 0x33, 0x11, 0x78, 0xd1, 0x77, 0xe8, 0xb2, - 0xdb, 0xbe, 0x4d, 0x97, 0x2c, 0x59, 0x56, 0xf0, 0x22, 0xd5, 0x9c, 0xd8, 0x71, 0x02, 0x81, 0xcd, - 0x64, 0xce, 0x77, 0xfe, 0xbe, 0xf9, 0x72, 0x8e, 0xe1, 0x99, 0x2f, 0xc3, 0x50, 0x46, 0x2a, 0x66, - 0x3e, 0xdf, 0xc5, 0x53, 0xa5, 0x91, 0x1f, 0x27, 0x52, 0xcb, 0x5d, 0x3c, 0x55, 0x81, 0xee, 0x20, - 0x40, 0x2a, 0x2c, 0x4a, 0x07, 0x06, 0xf3, 0xfa, 0xb0, 0xf1, 0x96, 0xb3, 0x60, 0x90, 0x46, 0x3e, - 0x65, 0xd1, 0x90, 0x13, 0x02, 0xe5, 0xd3, 0x44, 0x86, 0x8e, 0xd5, 0xb6, 0x3a, 0x65, 0x8a, 0x77, - 0xd2, 0x00, 0x5b, 0x4b, 0xc7, 0x46, 0xc4, 0xd6, 0x92, 0x6c, 0xc3, 0xea, 0x58, 0x84, 0x42, 0x3b, - 0x2b, 0x6d, 0xab, 0xb3, 0x41, 0xa7, 0x86, 0x77, 0x06, 0x8d, 0x59, 0x29, 0xae, 0x26, 0x63, 0x6d, - 0x6a, 0x8d, 0x98, 0x1a, 0x61, 0xad, 0x3a, 0xc5, 0x3b, 0xd9, 0x83, 0x0a, 0x1f, 0xf3, 0x90, 0x47, - 0x5a, 0x39, 0x76, 0x7b, 0xa5, 0x53, 0xeb, 0x3e, 0xda, 0xc9, 0xd9, 0xec, 0x2c, 0xe6, 0xf7, 0xa6, - 0x71, 0x74, 0x96, 0x60, 0x1a, 0xfb, 0x72, 0x12, 0xcd, 0x1a, 0xa3, 0xe1, 0xed, 0xc1, 0xbf, 0x4b, - 0x13, 0x0d, 0x6f, 0x11, 0x60, 0xf7, 0x2a, 0xb5, 0x45, 0x80, 0x7c, 0x38, 0x0b, 0xf0, 0x25, 0x55, - 0x8a, 0x77, 0xef, 0x0b, 0x6c, 0x16, 0xc9, 0xdf, 0x26, 0x5c, 0x69, 0xe2, 0xc0, 0x3a, 0x0a, 0xd6, - 0xcf, 0x73, 0x73, 0x93, 0xec, 0xc2, 0x5a, 0x62, 0x54, 0xca, 0xa9, 0xff, 0xb7, 0x84, 0xba, 0xf1, - 0xd3, 0x2c, 0xcc, 0x3b, 0x80, 0xe6, 0x1c, 0xb5, 0x58, 0x46, 0x8a, 0x93, 0x2e, 0xac, 0x27, 0x48, - 0x53, 0x39, 0x16, 0x56, 0x71, 0xee, 0x12, 0x80, 0xe6, 0x81, 0xde, 0x77, 0xd8, 0x3a, 0x3a, 0xf9, - 0xca, 0x7d, 0x6d, 0x9c, 0x87, 0x5c, 0x29, 0x36, 0xe4, 0xf7, 0xf0, 0x74, 0x4c, 0x8b, 0x78, 0x9c, - 0xf6, 0xf3, 0xb7, 0xe6, 0xa6, 0xf1, 0xc4, 0x2c, 0x1d, 0x4b, 0x16, 0xa0, 0x86, 0x75, 0x9a, 0x9b, - 0xa4, 0x05, 0x15, 0x89, 0x2d, 0xfa, 0x81, 0x53, 0xc6, 0xa4, 0x99, 0xed, 0xfd, 0xb4, 0xa0, 0x79, - 0x3c, 0x51, 0x23, 0x24, 0x99, 0xcb, 0xf4, 0x12, 0x6a, 0xd8, 0xcf, 0x70, 0xe6, 0x09, 0x52, 0xa8, - 0x75, 0xdd, 0xe2, 0x2d, 0x94, 0x9d, 0x0d, 0x0a, 0xff, 0x27, 0xa1, 0x47, 0xfd, 0x80, 0xce, 0xa7, - 0x10, 0x17, 0x80, 0xf9, 0xe3, 0xe3, 0x8c, 0x8f, 0x8d, 0x7c, 0xe6, 0x10, 0xe2, 0x41, 0xbd, 0xb0, - 0xfa, 0x53, 0xc6, 0x55, 0xba, 0x80, 0x79, 0xff, 0xc0, 0xd6, 0x1c, 0xb3, 0xa9, 0xc4, 0xde, 0x2f, - 0x0b, 0x6a, 0x73, 0xbd, 0xcd, 0xdb, 0x44, 0xc0, 0x23, 0x2d, 0x74, 0x9a, 0x0d, 0xe3, 0xcc, 0x26, - 0x0f, 0xa1, 0xaa, 0x45, 0xc8, 0x95, 0x66, 0x61, 0x8c, 0x1c, 0x56, 0x68, 0x01, 0x18, 0x2f, 0x32, - 0xfe, 0x90, 0xc6, 0x3c, 0xeb, 0x5f, 0x00, 0xe4, 0x31, 0x34, 0x8c, 0xb0, 0xc2, 0x67, 0x5a, 0xc8, - 0xe8, 0x1d, 0x4f, 0x51, 0xb9, 0x32, 0xbd, 0x81, 0x9a, 0xc1, 0x53, 0x9c, 0x07, 0xce, 0xea, 0x74, - 0x11, 0xcc, 0xdd, 0x3b, 0x86, 0xc6, 0xa2, 0x42, 0xa4, 0x7d, 0x5b, 0xd0, 0xfa, 0xa2, 0x60, 0x86, - 0x8d, 0x18, 0x46, 0x4c, 0x4f, 0x12, 0x9e, 0xe9, 0x55, 0x00, 0xde, 0x3e, 0x6c, 0x2f, 0xd3, 0xdc, - 0x64, 0x25, 0xec, 0x6c, 0xa1, 0x6a, 0x01, 0x64, 0x4b, 0x62, 0xe7, 0x4b, 0xf2, 0xe4, 0x3d, 0x54, - 0x7a, 0x49, 0xf2, 0x46, 0x06, 0x5c, 0x91, 0x06, 0xc0, 0xc7, 0x88, 0x9f, 0xc7, 0xdc, 0xd7, 0x3c, - 0x68, 0x96, 0x48, 0x13, 0xea, 0x58, 0xfe, 0x50, 0x28, 0x25, 0xa2, 0x61, 0xd3, 0x22, 0x9b, 0x99, - 0xd0, 0xbd, 0x73, 0xa1, 0xb4, 0x6a, 0xda, 0x06, 0xe8, 0x25, 0x89, 0x4c, 0x8e, 0x4e, 0x4f, 0x15, - 0xd7, 0xcd, 0xa0, 0x7b, 0x69, 0xc1, 0x2a, 0x86, 0x90, 0x57, 0x50, 0xc9, 0xe7, 0x9b, 0xfc, 0xbf, - 0x6c, 0xe6, 0x71, 0xae, 0x5a, 0xad, 0xa5, 0xeb, 0x30, 0xdd, 0x9d, 0x7d, 0xa8, 0xce, 0xfe, 0x6d, - 0x32, 0x17, 0x78, 0x73, 0x38, 0x5b, 0x0f, 0x96, 0xfa, 0xb2, 0x2a, 0x07, 0xb0, 0x36, 0xd0, 0x09, - 0x67, 0x21, 0x99, 0x0b, 0xbb, 0xb5, 0x5f, 0xad, 0xfb, 0x9c, 0x1d, 0xeb, 0xa9, 0xf5, 0xfa, 0xc5, - 0xef, 0x2b, 0xd7, 0xba, 0xb8, 0x72, 0xad, 0x3f, 0x57, 0xae, 0xf5, 0xe3, 0xda, 0x2d, 0x5d, 0x5c, - 0xbb, 0xa5, 0xcb, 0x6b, 0xb7, 0xf4, 0xb9, 0x75, 0xf7, 0x37, 0xf9, 0x64, 0x0d, 0x7f, 0x9e, 0xff, - 0x0d, 0x00, 0x00, 0xff, 0xff, 0xc9, 0x45, 0x08, 0x76, 0xb8, 0x05, 0x00, 0x00, + // 721 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x55, 0xcd, 0x6e, 0xd3, 0x4a, + 0x14, 0x8e, 0xdd, 0xb4, 0x4d, 0x4e, 0xd2, 0x34, 0x9d, 0xdb, 0xab, 0xeb, 0x1b, 0x90, 0x89, 0xbc, + 0x40, 0x11, 0x8b, 0x16, 0x02, 0xbb, 0x6e, 0xf8, 0x69, 0x2a, 0x22, 0x54, 0x5a, 0x4d, 0x40, 0x48, + 0x88, 0xcd, 0xd4, 0x9e, 0x26, 0x46, 0xfe, 0xc3, 0x33, 0x51, 0xeb, 0x05, 0xef, 0xc0, 0x12, 0x36, + 0x48, 0xbc, 0x0d, 0xcb, 0x2e, 0x59, 0xa2, 0xf6, 0x45, 0xd0, 0x9c, 0xd8, 0xb1, 0x9d, 0xa6, 0x5d, + 0xb3, 0x71, 0xe7, 0x7c, 0xe7, 0xef, 0x9b, 0x6f, 0xce, 0x69, 0xe0, 0x91, 0x1d, 0xfa, 0x7e, 0x18, + 0x88, 0x88, 0xd9, 0x7c, 0x17, 0xbf, 0x22, 0x09, 0xec, 0x28, 0x0e, 0x65, 0xb8, 0x8b, 0x5f, 0x91, + 0xa3, 0x3b, 0x08, 0x90, 0x1a, 0x0b, 0x92, 0x91, 0xc2, 0xac, 0x21, 0x6c, 0xbc, 0xe4, 0xcc, 0x19, + 0x25, 0x81, 0x4d, 0x59, 0x30, 0xe6, 0x84, 0x40, 0xf5, 0x34, 0x0e, 0x7d, 0x43, 0xeb, 0x6a, 0xbd, + 0x2a, 0xc5, 0x33, 0x69, 0x81, 0x2e, 0x43, 0x43, 0x47, 0x44, 0x97, 0x21, 0xd9, 0x86, 0x55, 0xcf, + 0xf5, 0x5d, 0x69, 0xac, 0x74, 0xb5, 0xde, 0x06, 0x9d, 0x19, 0xd6, 0x19, 0xb4, 0xe6, 0xa5, 0xb8, + 0x98, 0x7a, 0x52, 0xd5, 0x9a, 0x30, 0x31, 0xc1, 0x5a, 0x4d, 0x8a, 0x67, 0xb2, 0x07, 0x35, 0xee, + 0x71, 0x9f, 0x07, 0x52, 0x18, 0x7a, 0x77, 0xa5, 0xd7, 0xe8, 0xdf, 0xdb, 0xc9, 0xd8, 0xec, 0x94, + 0xf3, 0x07, 0xb3, 0x38, 0x3a, 0x4f, 0x50, 0x8d, 0xed, 0x70, 0x1a, 0xcc, 0x1b, 0xa3, 0x61, 0xed, + 0xc1, 0xbf, 0x4b, 0x13, 0x15, 0x6f, 0xd7, 0xc1, 0xee, 0x75, 0xaa, 0xbb, 0x0e, 0xf2, 0xe1, 0xcc, + 0xc1, 0x9b, 0xd4, 0x29, 0x9e, 0xad, 0x0f, 0xb0, 0x99, 0x27, 0x7f, 0x9a, 0x72, 0x21, 0x89, 0x01, + 0xeb, 0x28, 0xd8, 0x30, 0xcb, 0xcd, 0x4c, 0xb2, 0x0b, 0x6b, 0xb1, 0x52, 0x29, 0xa3, 0xfe, 0xdf, + 0x12, 0xea, 0xca, 0x4f, 0xd3, 0x30, 0xeb, 0x00, 0xda, 0x05, 0x6a, 0x51, 0x18, 0x08, 0x4e, 0xfa, + 0xb0, 0x1e, 0x23, 0x4d, 0x61, 0x68, 0x58, 0xc5, 0xb8, 0x49, 0x00, 0x9a, 0x05, 0x5a, 0x9f, 0x61, + 0xeb, 0xe8, 0xe4, 0x23, 0xb7, 0xa5, 0x72, 0x1e, 0x72, 0x21, 0xd8, 0x98, 0xdf, 0xc2, 0xd3, 0x50, + 0x2d, 0x22, 0x2f, 0x19, 0x66, 0x77, 0xcd, 0x4c, 0xe5, 0x89, 0x58, 0xe2, 0x85, 0xcc, 0x41, 0x0d, + 0x9b, 0x34, 0x33, 0x49, 0x07, 0x6a, 0x21, 0xb6, 0x18, 0x3a, 0x46, 0x15, 0x93, 0xe6, 0xb6, 0xf5, + 0x55, 0x83, 0xf6, 0xf1, 0x54, 0x4c, 0x90, 0x64, 0x26, 0xd3, 0x53, 0x68, 0x60, 0x3f, 0xc5, 0x99, + 0xc7, 0x48, 0xa1, 0xd1, 0x37, 0xf3, 0xbb, 0x50, 0x76, 0x36, 0xca, 0xfd, 0xef, 0x5c, 0x39, 0x19, + 0x3a, 0xb4, 0x98, 0x42, 0x4c, 0x00, 0x66, 0x7b, 0xc7, 0x29, 0x1f, 0x1d, 0xf9, 0x14, 0x10, 0x62, + 0x41, 0x33, 0xb7, 0x86, 0x33, 0xc6, 0x75, 0x5a, 0xc2, 0xac, 0x7f, 0x60, 0xab, 0xc0, 0x6c, 0x26, + 0xb1, 0x65, 0x29, 0xba, 0x9e, 0x57, 0xa2, 0xbb, 0x30, 0x0c, 0xd6, 0x37, 0x4d, 0x65, 0xce, 0x83, + 0xd2, 0xc7, 0xf9, 0x3b, 0x2e, 0xf5, 0x43, 0x83, 0x46, 0xa1, 0x8d, 0x7a, 0x1b, 0xd7, 0xe1, 0x81, + 0x74, 0x65, 0x92, 0x2e, 0xd3, 0xdc, 0x26, 0x77, 0xa1, 0x2e, 0x5d, 0x9f, 0x0b, 0xc9, 0xfc, 0x08, + 0xdb, 0xad, 0xd0, 0x1c, 0x50, 0x5e, 0x24, 0xf7, 0x26, 0x89, 0x78, 0xda, 0x2a, 0x07, 0xc8, 0x7d, + 0x68, 0xa9, 0xc1, 0x70, 0x6d, 0x26, 0xdd, 0x30, 0x78, 0xc5, 0x13, 0x7c, 0xf9, 0x2a, 0x5d, 0x40, + 0xd5, 0xe2, 0x08, 0xce, 0x1d, 0x63, 0x75, 0xb6, 0xc8, 0xea, 0x6c, 0x1d, 0x43, 0xab, 0x2c, 0x06, + 0xe9, 0x5e, 0xd7, 0xae, 0x59, 0xd6, 0x46, 0xb1, 0x71, 0xc7, 0x01, 0x93, 0xd3, 0x98, 0xa7, 0xd2, + 0xe4, 0x80, 0xb5, 0x0f, 0xdb, 0xcb, 0xe4, 0x55, 0x59, 0x31, 0x3b, 0x2b, 0x55, 0xcd, 0x81, 0xf4, + 0x5d, 0xf5, 0xec, 0x5d, 0x1f, 0xbc, 0x86, 0xda, 0x20, 0x8e, 0x5f, 0x84, 0x0e, 0x17, 0xa4, 0x05, + 0xf0, 0x36, 0xe0, 0xe7, 0x11, 0xb7, 0x25, 0x77, 0xda, 0x15, 0xd2, 0x86, 0x26, 0x96, 0x3f, 0x74, + 0x85, 0x70, 0x83, 0x71, 0x5b, 0x23, 0x9b, 0xa9, 0xd0, 0x83, 0x73, 0x57, 0x48, 0xd1, 0xd6, 0x15, + 0x30, 0x88, 0xe3, 0x30, 0x3e, 0x3a, 0x3d, 0x15, 0x5c, 0xb6, 0x9d, 0xfe, 0x77, 0x1d, 0x56, 0x31, + 0x84, 0x3c, 0x83, 0x5a, 0xb6, 0x9f, 0xe4, 0xff, 0x65, 0x3b, 0x8b, 0x83, 0xd6, 0xe9, 0x2c, 0x5d, + 0xe7, 0xd9, 0x78, 0xed, 0x43, 0x7d, 0x3e, 0xad, 0xa4, 0x10, 0xb8, 0xb8, 0x5c, 0x9d, 0x3b, 0x4b, + 0x7d, 0xc5, 0x2a, 0xe9, 0xe4, 0x96, 0xab, 0x94, 0x67, 0xbe, 0x5c, 0x65, 0x71, 0xd4, 0x0f, 0x60, + 0x6d, 0x24, 0x63, 0xce, 0x7c, 0x52, 0x08, 0xbb, 0xf6, 0x5f, 0xa6, 0x73, 0x9b, 0xb3, 0xa7, 0x3d, + 0xd4, 0x9e, 0x3f, 0xf9, 0x79, 0x69, 0x6a, 0x17, 0x97, 0xa6, 0xf6, 0xfb, 0xd2, 0xd4, 0xbe, 0x5c, + 0x99, 0x95, 0x8b, 0x2b, 0xb3, 0xf2, 0xeb, 0xca, 0xac, 0xbc, 0xef, 0xdc, 0xfc, 0xcb, 0x74, 0xb2, + 0x86, 0x7f, 0x1e, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x95, 0x5b, 0xbc, 0xbe, 0x06, 0x00, + 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { @@ -1068,6 +1179,85 @@ func (m *PushSpaceResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PullSpaceRequest) 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 *PullSpaceRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PullSpaceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PullSpaceResponse) 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 *PullSpaceResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PullSpaceResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.AclPayloadId) > 0 { + i -= len(m.AclPayloadId) + copy(dAtA[i:], m.AclPayloadId) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.AclPayloadId))) + i-- + dAtA[i] = 0x1a + } + if len(m.AclPayload) > 0 { + i -= len(m.AclPayload) + copy(dAtA[i:], m.AclPayload) + i = encodeVarintSpacesync(dAtA, i, uint64(len(m.AclPayload))) + i-- + dAtA[i] = 0x12 + } + if m.SpaceHeader != nil { + { + size, err := m.SpaceHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSpacesync(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *SpaceHeader) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1353,6 +1543,40 @@ func (m *PushSpaceResponse) Size() (n int) { return n } +func (m *PullSpaceRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} + +func (m *PullSpaceResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SpaceHeader != nil { + l = m.SpaceHeader.Size() + n += 1 + l + sovSpacesync(uint64(l)) + } + l = len(m.AclPayload) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + l = len(m.AclPayloadId) + if l > 0 { + n += 1 + l + sovSpacesync(uint64(l)) + } + return n +} + func (m *SpaceHeader) Size() (n int) { if m == nil { return 0 @@ -2360,6 +2584,240 @@ func (m *PushSpaceResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *PullSpaceRequest) 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 ErrIntOverflowSpacesync + } + 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: PullSpaceRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PullSpaceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PullSpaceResponse) 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 ErrIntOverflowSpacesync + } + 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: PullSpaceResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PullSpaceResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpaceHeader", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SpaceHeader == nil { + m.SpaceHeader = &RawSpaceHeaderWithId{} + } + if err := m.SpaceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AclPayload", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthSpacesync + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AclPayload = append(m.AclPayload[:0], dAtA[iNdEx:postIndex]...) + if m.AclPayload == nil { + m.AclPayload = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AclPayloadId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpacesync + } + 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 ErrInvalidLengthSpacesync + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSpacesync + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AclPayloadId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSpacesync(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSpacesync + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *SpaceHeader) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/common/commonspace/spacesyncproto/spacesync_drpc.pb.go b/common/commonspace/spacesyncproto/spacesync_drpc.pb.go index c5af9cef..b1a0a929 100644 --- a/common/commonspace/spacesyncproto/spacesync_drpc.pb.go +++ b/common/commonspace/spacesyncproto/spacesync_drpc.pb.go @@ -42,6 +42,7 @@ type DRPCSpaceClient interface { HeadSync(ctx context.Context, in *HeadSyncRequest) (*HeadSyncResponse, error) PushSpace(ctx context.Context, in *PushSpaceRequest) (*PushSpaceResponse, error) + PullSpace(ctx context.Context, in *PullSpaceRequest) (*PullSpaceResponse, error) Stream(ctx context.Context) (DRPCSpace_StreamClient, error) } @@ -73,6 +74,15 @@ func (c *drpcSpaceClient) PushSpace(ctx context.Context, in *PushSpaceRequest) ( return out, nil } +func (c *drpcSpaceClient) PullSpace(ctx context.Context, in *PullSpaceRequest) (*PullSpaceResponse, error) { + out := new(PullSpaceResponse) + err := c.cc.Invoke(ctx, "/anySpace.Space/PullSpace", drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}, in, out) + if err != nil { + return nil, err + } + return out, nil +} + func (c *drpcSpaceClient) Stream(ctx context.Context) (DRPCSpace_StreamClient, error) { stream, err := c.cc.NewStream(ctx, "/anySpace.Space/Stream", drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}) if err != nil { @@ -111,6 +121,7 @@ func (x *drpcSpace_StreamClient) RecvMsg(m *ObjectSyncMessage) error { type DRPCSpaceServer interface { HeadSync(context.Context, *HeadSyncRequest) (*HeadSyncResponse, error) PushSpace(context.Context, *PushSpaceRequest) (*PushSpaceResponse, error) + PullSpace(context.Context, *PullSpaceRequest) (*PullSpaceResponse, error) Stream(DRPCSpace_StreamStream) error } @@ -124,13 +135,17 @@ func (s *DRPCSpaceUnimplementedServer) PushSpace(context.Context, *PushSpaceRequ return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) } +func (s *DRPCSpaceUnimplementedServer) PullSpace(context.Context, *PullSpaceRequest) (*PullSpaceResponse, error) { + return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) +} + func (s *DRPCSpaceUnimplementedServer) Stream(DRPCSpace_StreamStream) error { return drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented) } type DRPCSpaceDescription struct{} -func (DRPCSpaceDescription) NumMethods() int { return 3 } +func (DRPCSpaceDescription) NumMethods() int { return 4 } func (DRPCSpaceDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) { switch n { @@ -153,6 +168,15 @@ func (DRPCSpaceDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, ) }, DRPCSpaceServer.PushSpace, true case 2: + return "/anySpace.Space/PullSpace", drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}, + func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { + return srv.(DRPCSpaceServer). + PullSpace( + ctx, + in1.(*PullSpaceRequest), + ) + }, DRPCSpaceServer.PullSpace, true + case 3: return "/anySpace.Space/Stream", drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}, func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) { return nil, srv.(DRPCSpaceServer). @@ -201,6 +225,22 @@ func (x *drpcSpace_PushSpaceStream) SendAndClose(m *PushSpaceResponse) error { return x.CloseSend() } +type DRPCSpace_PullSpaceStream interface { + drpc.Stream + SendAndClose(*PullSpaceResponse) error +} + +type drpcSpace_PullSpaceStream struct { + drpc.Stream +} + +func (x *drpcSpace_PullSpaceStream) SendAndClose(m *PullSpaceResponse) error { + if err := x.MsgSend(m, drpcEncoding_File_commonspace_spacesyncproto_protos_spacesync_proto{}); err != nil { + return err + } + return x.CloseSend() +} + type DRPCSpace_StreamStream interface { drpc.Stream Send(*ObjectSyncMessage) error diff --git a/common/commonspace/syncservice/streampool_test.go b/common/commonspace/syncservice/streampool_test.go index 47ed4ee0..a9cc2bae 100644 --- a/common/commonspace/syncservice/streampool_test.go +++ b/common/commonspace/syncservice/streampool_test.go @@ -27,6 +27,10 @@ func (t *testServer) PushSpace(ctx context.Context, request *spacesyncproto.Push panic("implement me") } +func (t *testServer) PullSpace(ctx context.Context, request *spacesyncproto.PullSpaceRequest) (*spacesyncproto.PullSpaceResponse, error) { + panic("implement me") +} + func (t *testServer) Stream(stream spacesyncproto.DRPCSpace_StreamStream) error { t.stream <- stream return <-t.releaseStream diff --git a/common/nodeconf/confconnector.go b/common/nodeconf/confconnector.go index e62be926..bb2c302a 100644 --- a/common/nodeconf/confconnector.go +++ b/common/nodeconf/confconnector.go @@ -21,19 +21,19 @@ func NewConfConnector(conf Configuration, pool pool.Pool) ConfConnector { } func (s *confConnector) GetResponsiblePeers(ctx context.Context, spaceId string) ([]peer.Peer, error) { - return s.dialOrConnect(ctx, spaceId, s.pool.Get, s.pool.GetOneOf) + return s.connectOneOrMany(ctx, spaceId, s.pool.Get, s.pool.GetOneOf) } func (s *confConnector) DialResponsiblePeers(ctx context.Context, spaceId string) ([]peer.Peer, error) { - return s.dialOrConnect(ctx, spaceId, s.pool.Dial, s.pool.DialOneOf) + return s.connectOneOrMany(ctx, spaceId, s.pool.Dial, s.pool.DialOneOf) } -func (s *confConnector) dialOrConnect( +func (s *confConnector) connectOneOrMany( ctx context.Context, spaceId string, connectOne func(context.Context, string) (peer.Peer, error), connectOneOf func(context.Context, []string) (peer.Peer, error)) (peers []peer.Peer, err error) { allNodes := s.conf.NodeIds(spaceId) - if !s.conf.IsResponsible(spaceId) { + if s.conf.IsResponsible(spaceId) { for _, id := range allNodes { var p peer.Peer p, err = connectOne(ctx, id) diff --git a/common/pkg/acl/list/list.go b/common/pkg/acl/list/list.go index 50a7b59a..6045fec4 100644 --- a/common/pkg/acl/list/list.go +++ b/common/pkg/acl/list/list.go @@ -25,7 +25,7 @@ type RWLocker interface { type ACLList interface { RWLocker ID() string - Root() *aclrecordproto.ACLRoot + Root() *aclrecordproto.RawACLRecordWithId Records() []*ACLRecord ACLState() *ACLState IsAfter(first string, second string) (bool, error) @@ -38,7 +38,7 @@ type ACLList interface { } type aclList struct { - root *aclrecordproto.ACLRoot + root *aclrecordproto.RawACLRecordWithId records []*ACLRecord indexes map[string]int id string @@ -114,13 +114,9 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder if err != nil { return } - aclRecRoot, err := recBuilder.ConvertFromRaw(rootWithId) - if err != nil { - return - } list = &aclList{ - root: aclRecRoot.Model.(*aclrecordproto.ACLRoot), + root: rootWithId, records: records, indexes: indexes, stateBuilder: stateBuilder, @@ -141,7 +137,7 @@ func (a *aclList) ID() string { return a.id } -func (a *aclList) Root() *aclrecordproto.ACLRoot { +func (a *aclList) Root() *aclrecordproto.RawACLRecordWithId { return a.root } diff --git a/common/pkg/acl/list/mock_list/mock_list.go b/common/pkg/acl/list/mock_list/mock_list.go index a4aeb396..4e1c0762 100644 --- a/common/pkg/acl/list/mock_list/mock_list.go +++ b/common/pkg/acl/list/mock_list/mock_list.go @@ -211,10 +211,10 @@ func (mr *MockACLListMockRecorder) Records() *gomock.Call { } // Root mocks base method. -func (m *MockACLList) Root() *aclrecordproto.ACLRoot { +func (m *MockACLList) Root() *aclrecordproto.RawACLRecordWithId { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Root") - ret0, _ := ret[0].(*aclrecordproto.ACLRoot) + ret0, _ := ret[0].(*aclrecordproto.RawACLRecordWithId) return ret0 } diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go index f0692c8a..da8deca1 100644 --- a/node/nodespace/rpchandler.go +++ b/node/nodespace/rpchandler.go @@ -2,42 +2,43 @@ package nodespace import ( "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage" - "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" ) type rpcHandler struct { s *service } -func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) { - _, err = r.s.GetSpace(ctx, req.SpaceHeader.Id) - if err == nil { - err = spacesyncproto.ErrSpaceExists - return - } - if err != storage.ErrSpaceStorageMissing { - err = spacesyncproto.ErrUnexpected - return - } - - payload := storage.SpaceStorageCreatePayload{ - RecWithId: &aclrecordproto.RawACLRecordWithId{ - Payload: req.AclPayload, - Id: req.AclPayloadId, - }, - SpaceHeaderWithId: req.SpaceHeader, - } - st, err := r.s.spaceStorageProvider.CreateSpaceStorage(payload) +func (r *rpcHandler) PullSpace(ctx context.Context, request *spacesyncproto.PullSpaceRequest) (resp *spacesyncproto.PullSpaceResponse, err error) { + sp, err := r.s.GetSpace(ctx, request.Id) if err != nil { - err = spacesyncproto.ErrUnexpected - if err == storage.ErrSpaceStorageExists { - err = spacesyncproto.ErrSpaceExists + if err != spacesyncproto.ErrSpaceMissing { + err = spacesyncproto.ErrUnexpected } return } - st.Close() + + description := sp.Description() + resp = &spacesyncproto.PullSpaceResponse{ + SpaceHeader: description.SpaceHeader, + AclPayload: description.AclPayload, + AclPayloadId: description.AclId, + } + return +} + +func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) { + description := commonspace.SpaceDescription{ + SpaceHeader: req.SpaceHeader, + AclId: req.AclPayloadId, + AclPayload: req.AclPayload, + } + err = r.s.AddSpace(ctx, description) + if err != nil { + return + } + resp = &spacesyncproto.PushSpaceResponse{} return } diff --git a/node/nodespace/service.go b/node/nodespace/service.go index 25d08985..b5b11669 100644 --- a/node/nodespace/service.go +++ b/node/nodespace/service.go @@ -22,6 +22,7 @@ func New() Service { } type Service interface { + AddSpace(ctx context.Context, description commonspace.SpaceDescription) (err error) GetSpace(ctx context.Context, id string) (commonspace.Space, error) app.ComponentRunnable } @@ -64,6 +65,10 @@ func (s *service) GetSpace(ctx context.Context, id string) (commonspace.Space, e return v.(commonspace.Space), nil } +func (s *service) AddSpace(ctx context.Context, description commonspace.SpaceDescription) (err error) { + return s.commonSpace.AddSpace(ctx, description) +} + func (s *service) Close(ctx context.Context) (err error) { return s.spaceCache.Close() } From 7c1d449743f3519011c99d78c38e5458fa278f32 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 6 Nov 2022 18:36:25 +0100 Subject: [PATCH 215/219] Add load space command --- .gitignore | 5 ++++ client/api/controller.go | 4 +-- client/api/service.go | 12 ++++++++ common/commonspace/service.go | 2 +- etc/configs/client2.yml | 54 +++++++++++++++++------------------ 5 files changed, 47 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index 7729a9b3..26edddfa 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,11 @@ # Test binary, built with `go test -c` *.test +# playground folder for testing different clients +playground + +# .paw folder for macos paw client +.paw # Output of the go coverage tool, specifically when used with LiteIDE *.out diff --git a/client/api/controller.go b/client/api/controller.go index c172603f..9e897dac 100644 --- a/client/api/controller.go +++ b/client/api/controller.go @@ -89,8 +89,8 @@ func (c *controller) AllSpaceIds() (ids []string, err error) { } func (c *controller) LoadSpace(id string) (err error) { - //TODO implement me - panic("implement me") + _, err = c.spaceService.GetSpace(context.Background(), id) + return } func (c *controller) CreateDocument(spaceId string) (id string, err error) { diff --git a/client/api/service.go b/client/api/service.go index 0ce5dcc0..1f7ed647 100644 --- a/client/api/service.go +++ b/client/api/service.go @@ -62,6 +62,7 @@ func (s *service) Run(ctx context.Context) (err error) { mux := http.NewServeMux() mux.HandleFunc("/deriveSpace", s.deriveSpace) mux.HandleFunc("/createSpace", s.createSpace) + mux.HandleFunc("/loadSpace", s.loadSpace) mux.HandleFunc("/allSpaceIds", s.allSpaceIds) mux.HandleFunc("/createDocument", s.createDocument) mux.HandleFunc("/allDocumentIds", s.allDocumentIds) @@ -93,6 +94,17 @@ func (s *service) deriveSpace(w http.ResponseWriter, req *http.Request) { sendText(w, http.StatusOK, id) } +func (s *service) loadSpace(w http.ResponseWriter, req *http.Request) { + query := req.URL.Query() + spaceId := query.Get("spaceId") + err := s.controller.LoadSpace(query.Get("spaceId")) + if err != nil { + sendText(w, http.StatusInternalServerError, err.Error()) + return + } + sendText(w, http.StatusOK, spaceId) +} + func (s *service) createSpace(w http.ResponseWriter, req *http.Request) { id, err := s.controller.CreateSpace() if err != nil { diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 48d81ffc..c5e94298 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -119,7 +119,7 @@ func (s *service) AddSpace(ctx context.Context, spaceDescription SpaceDescriptio func (s *service) GetSpace(ctx context.Context, id string) (Space, error) { st, err := s.storageProvider.SpaceStorage(id) if err != nil { - if err != storage.ErrSpaceStorageMissing { + if err != spacesyncproto.ErrSpaceMissing { return nil, err } diff --git a/etc/configs/client2.yml b/etc/configs/client2.yml index da9cf18e..33cc9ad0 100755 --- a/etc/configs/client2.yml +++ b/etc/configs/client2.yml @@ -1,36 +1,36 @@ anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec grpcServer: - listenAddrs: - - 127.0.0.1:4631 - tls: false + listenAddrs: + - 127.0.0.1:4631 + tls: false account: - peerId: 12D3KooWEycQPaaTbsZJ2rfZ7cKNFB57o44kKukwKkb7mUCo4Agh - signingKey: 2Lxt8Qy52wZHC1T/5zYvT3o4LhZY++4d0Km2gOj5R1hMqMH+Knnt+8cBGONe9r0QdtiXom/AxzWFFf0ol0bBOg== - encryptionKey: MIIEpQIBAAKCAQEAwsGthwrb3RDzzmnbgQ4OubKCYEfTWSor0Q3Q9R+atV5llOivw7OGoXZ9c2W51oqlSIfwkWPLb1MPq+sE3pUsLeU09lmpBIBWKVg+MMEMXbBKMV/8qvVjr6HLNCMgKqBf4Nvfpv7Cgy1QoXrE4YjGzRTAlyREJoSQVAGHT9hpy/QDlW0VdwAvHpWrxRcd+Ro8dY87wWFIS2tEhjWMSra9sSFeOOaelSfPwki33beqZog0p22s4pIONrU4EoZvvs/43LrxxaoqWwX15u8+Agh1Z62llDDPke9tul80lW8x+UIiuXjcUkvdaAd0xJ85rrmwCCeLrjQ1yoJmqk5idgysKwIDAQABAoIBAGV+Gxk57nQZBoU2Iz7w/XmGbm0QYTKhSG5Mfe2QB8amp9dfH2GkJ+/y2NOPWrZUUGgo95Q85mJgbdVQx5vbL0fHn78V4H/JBZ3ML7SmlfQpD7EFbZ4F/WokrcnA2F1+cBi1XKshLmq/7boJSZqi9b8gJnFdY+qSwMgWd9aDWDcBTMVmtjpnxdp9AH1vC1pF8IjOM8SG+z3Wln0CX7dKeeB8xMohqNDd5/nWIXgjKyhUNZL7hKz+H27UzGMidF3W5CHi5u6BYqzkAvagQF+1+tVwjgRUp3pZdf/7Nlw9rImACPXi2kA3zpjRxnBNZWnjmPxt+6ISIzi3ZAmmpA5YmbECgYEA0ewToWwF2kHnUFCh/rm1lsH+jKR1McyuNhTM2gx1LO+IJ+GCHd5POMjBzdowbLv0BgTT7ncARwfryznkbJM/SZ+Llf5oDfsuRmf/8AnatLv9Yt/YYg3Uk+s9Wl6FG2I+Hb0WcLLAWBpV0ZhH5JI/dZepsRezoTnWnC4t98g3cpkCgYEA7YFqk4JFiKH7xdZ9UQJS2p2Ho9OWG00Yi9ddwxp+JtuHWRWo2zaRKiHBamXWPFQPmWrNURHB+NtjXMLQahVrxqg88SoKnIiRo7U1m0e6TNBzsSlkmD+2+co0u0ECxe9gxIBJkE56kR6Wl06VKLJ7HwcK6DjeMRN3UrIyBM4qE2MCgYEAhdKctRQ7KudGgfHVQ6C5/XCQSLJyr5uPF5Ts/rhgXpQY1WuyWj4lfMqmmgdVRYwQRWIAhQ3B1IZdMAIo93prJxEZmDZFuVv+JQ4Zn7l4fi01nDmdJO0yLlYRl7GX41wewzCOxKt/aOro+KO+eR0ubVWQ7P9yGP7ZLFlYHpS5nEkCgYEAxWnO9nFP7rQFnHoei9lMmR5bglb67BJ3FrWa3/MDbLUImYmhYyTGIKkSJagkHN0aYkEeDAagnoNs4cukhKjtfqCUlziEvXve4p5awokqV3Lk1xs63DoJkzL6BbOR5IiGfI7Nlr9ErZ8pOPc+kCdao32tGT07ors1cW1gmhHrc1UCgYEAn3pEkmfJL+ufWYZ/t685mrdUqhp/HcwXTByPLSIr+nP6xXod94uusufVTuMXfYzKgnmsIlt8zk1wu2kSJJUcQjL5Q5rK8suYnJB0Z+x5wa2XTwajThPK29DSpjTY4qjOx7ZCgaZuwJNIFzxp0QrV6QA/0y1CmvhpPYiW2wesug0= + peerId: 12D3KooWC2SctmKSLWqmzsKCpQBo4iqNzbZhWivM3jbhovB4JFug + signingKey: Maen+w6qwWuS79RZyMbuW7wnWAox0+rMinAb/gsOSl8gz2BLCfMlwXjlo8NLKfFFZFNUzl0ANTxbrK45Be7CPw== + encryptionKey: MIIEowIBAAKCAQEAonOsG0DzAzGlR7cd0u31DS0xoHihxdfJwut5JMtLKqGwkUC5RM+/eTa96hKYp8ED6B8Q4ZBhmt2gQnOUQJpoAnJ6uU/HgQVVhsJD7uMQcyVWr2KZbRK2GAohxOiW8JaB8pLiIRJbOxaeIu8dGRTrTTxYnh4IbIUgMu5x3iPW1/6YT/LCN1r/CBgHnPLtxMjAdUYzz9+LC13sZJsanUot83MTgl+5unEPh+ogbrSJ6P8FAAWW8HHD5lUSSb2l8NFRafYWP4o3vF9fqtmpt5I2nK6PaNh+4YXB7CX8Nak3AYuSO/aLGUtZMGYv9Qqwewjk/ewEGNWz33D/Hve8+hctXQIDAQABAoIBAQCNY7/XuJ/Jl9wSnv4GJ7Ww0jTvRg8G8tlYHTpDG+1AHZpf0cVubqJoDY0dvTHAT+3miaNXryJEd8CUFaRi1gDQoHLP9u/dC5d0wn/92wLmNQlNfLOsiyyRn7/kccttepF/XvgRcLiWpQjdvt/EhMCHaI54kAsk6Hkt2vqgLPFA66MH/5AMyf+8RmouYvc1m8jPUVmkIZVkoO4/6kh0tZS+rGdjxB65zDaoBx6CcXAMkTWe27Ce87vfGwCRySGVGRg7RuTJQR8VO3oSmsPVIZ8A48fKPQvryrl/5ztvE35lL4i3pdIbd/CJ9zTKIEM4nyPWSmxsaxs1yIllsj3BFpDBAoGBAMzWUEBYm5FH6wG2GXigkou4VSUBAoKCi5XmA2bwCUZx6CaG4uk43cbYpkbLpIRchfLHAeVCiaOYe5VFvYMth6o+OICEKfXWEwGqjtWeHkyIQIZ1Yo+BKk1rbzkYa/n3a7Mw+C6HsweFq1v01eTChmMr/PF6trFQiJJhTGkGKS2/AoGBAMsHKMEmgw1/hRqiEai73AVLSzXGoHSUWsM1vV05EzDyoxkk8Q/+sJR/BOp4HvJidXiM9B0hSOBhkPZjP3TZSQTKXwMGY+Hcs0XhwGxV5Eb9XdbD5rhCT6eVUeQeP9W9J34RdobJauG1Ld9E1U0nKEI+ls6VZf6/k+ixDOa3TaPjAoGADI+7/iYw7Bjf9YvoRfh65CyatBk6wSwmSTwAy2g++V304Z/1/F1rZE1W7RKB9UgDQt8nY5rP/ANW2NGdDJVXM357Uo5IUHYfVkPSXJFExGa6pkQ+lhRStsq22GaCAKNGrId9QMU7mmN9HbeHAm9XdG93JIvk9jy9E1T6LZqeHdsCgYAXsvQ856PwlWwSGcz550PdklZrJo5gTVjy5HkAQsNMuWX0b218MnymONV4ESF7paaUtc9g/xukpX7oY9lqaFqvpnfEwKA0IzEB/UIa40PMTZMAmMl7xLHLnBB9ElLdPkE35A3z2dsSEbYTE9PaN7HpWaj84E+RlwdK6C/bVpZHhQKBgBv8Up6nOfQyW4jiRo5CPOzXPYu+tXfsV0lKbYAjlp3rcczsi/BPXF6tLZ74/f5Cp2NJxx1GIitjqGzZ1mhkB8Eimuw1o+uNRBRh5BcmQTXPTxrrbOsYzjBJNb7n9HcHlGivcmDooxP7TgRJydEiFdpoBhjU+7yGJTJk7YdDLI3I apiServer: - port: "8091" + port: "8091" nodes: - - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz - address: 127.0.0.1:4430 - signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== - encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy - - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y - address: 127.0.0.1:4431 - signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== - encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= - - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd - address: 127.0.0.1:4432 - signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== - encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== + - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + address: 127.0.0.1:4430 + signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== + encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy + - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y + address: 127.0.0.1:4431 + signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== + encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= + - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd + address: 127.0.0.1:4432 + signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== + encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== space: - gcTTL: 60 - syncPeriod: 10 + gcTTL: 60 + syncPeriod: 10 storage: - path: db + path: db metric: - addr: "" + addr: "" log: - production: false - defaultLevel: "" - namedLevels: {} + production: false + defaultLevel: "" + namedLevels: {} From 16b7181ebc34bb3bbb718566423b8b7e3af2de08 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Sun, 6 Nov 2022 22:43:28 +0100 Subject: [PATCH 216/219] Fix bugs in syncer etc, add peerkey for clients --- client/account/service.go | 9 +++ client/clientspace/clientcache/treecache.go | 2 +- client/storage/treestorage.go | 3 + common/commonspace/diffservice/diffsyncer.go | 2 + .../diffservice/diffsyncer_test.go | 5 ++ common/commonspace/syncservice/streampool.go | 3 +- common/config/account.go | 1 + common/net/peer/peer.go | 5 ++ common/net/secure/service.go | 2 +- common/pkg/acl/account/accountdata.go | 1 + etc/client.yml | 25 +++--- etc/config.yml | 25 +++--- etc/configs/client1.yml | 25 +++--- etc/configs/client2.yml | 55 ++++++------- etc/configs/cons1.yml | 7 +- etc/configs/cons2.yml | 7 +- etc/configs/cons3.yml | 7 +- etc/configs/node1.yml | 25 +++--- etc/configs/node2.yml | 25 +++--- etc/configs/node3.yml | 25 +++--- node/account/service.go | 10 ++- util/cmd/nodesgen/gen.go | 81 +++++++++++-------- 22 files changed, 204 insertions(+), 146 deletions(-) diff --git a/client/account/service.go b/client/account/service.go index 6f81b4fe..d73f9c8d 100644 --- a/client/account/service.go +++ b/client/account/service.go @@ -42,6 +42,14 @@ func (s *service) Init(a *app.App) (err error) { return err } + decodedPeerKey, err := keys.DecodeKeyFromString( + acc.PeerKey, + signingkey.NewSigningEd25519PrivKeyFromBytes, + nil) + if err != nil { + return err + } + identity, err := decodedSigningKey.GetPublic().Raw() if err != nil { return err @@ -49,6 +57,7 @@ func (s *service) Init(a *app.App) (err error) { s.accountData = &account.AccountData{ Identity: identity, + PeerKey: decodedPeerKey, SignKey: decodedSigningKey, EncKey: decodedEncryptionKey, } diff --git a/client/clientspace/clientcache/treecache.go b/client/clientspace/clientcache/treecache.go index e37c284c..5422b91c 100644 --- a/client/clientspace/clientcache/treecache.go +++ b/client/clientspace/clientcache/treecache.go @@ -75,7 +75,7 @@ func (c *treeCache) Init(a *app.App) (err error) { if err != nil { return } - return textdocument.NewTextDocument(context.Background(), space, id, &updateListener{}, c.account) + return textdocument.NewTextDocument(ctx, space, id, &updateListener{}, c.account) }, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), diff --git a/client/storage/treestorage.go b/client/storage/treestorage.go index 60c74c9f..25c49192 100644 --- a/client/storage/treestorage.go +++ b/client/storage/treestorage.go @@ -40,6 +40,9 @@ func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStora } return nil }) + if err == badger.ErrKeyNotFound { + err = storage.ErrUnknownTreeId + } return } diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index 33d9852b..a30100b2 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -11,6 +11,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" "go.uber.org/zap" + "storj.io/drpc/drpcctx" "time" ) @@ -75,6 +76,7 @@ func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error) return d.sendPushSpaceRequest(ctx, cl) } + ctx = context.WithValue(ctx, drpcctx.TransportKey{}, p.Secure()) d.pingTreesInCache(ctx, newIds) d.pingTreesInCache(ctx, changedIds) d.pingTreesInCache(ctx, removedIds) diff --git a/common/commonspace/diffservice/diffsyncer_test.go b/common/commonspace/diffservice/diffsyncer_test.go index 60b52325..13001df8 100644 --- a/common/commonspace/diffservice/diffsyncer_test.go +++ b/common/commonspace/diffservice/diffsyncer_test.go @@ -15,6 +15,7 @@ import ( mock_aclstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage/mock_storage" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff/mock_ldiff" "github.com/golang/mock/gomock" + "github.com/libp2p/go-libp2p/core/sec" "github.com/stretchr/testify/require" "storj.io/drpc" "testing" @@ -50,6 +51,10 @@ func (m mockPeer) LastUsage() time.Time { return time.Time{} } +func (m mockPeer) Secure() sec.SecureConn { + return nil +} + func (m mockPeer) UpdateLastUsage() { } diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index e807ae14..f5e21a20 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -199,7 +199,7 @@ func (s *streamPool) AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (er s.peerStreams[peerId] = stream s.wg.Add(1) s.Unlock() - + log.With("peerId", peerId).Debug("reading stream from peer") return s.readPeerLoop(peerId, stream) } @@ -261,6 +261,7 @@ Loop: limiter <- struct{}{} }() } + log.With("peerId", peerId).Debug("stopped reading stream from peer") s.removePeer(peerId) return } diff --git a/common/config/account.go b/common/config/account.go index 4525b26f..1ca9a8fd 100644 --- a/common/config/account.go +++ b/common/config/account.go @@ -2,6 +2,7 @@ package config type Account struct { PeerId string `yaml:"peerId"` + PeerKey string `yaml:"peerKey"` SigningKey string `yaml:"signingKey"` EncryptionKey string `yaml:"encryptionKey"` } diff --git a/common/net/peer/peer.go b/common/net/peer/peer.go index 6056b0b9..3dfe517b 100644 --- a/common/net/peer/peer.go +++ b/common/net/peer/peer.go @@ -21,6 +21,7 @@ type Peer interface { Id() string LastUsage() time.Time UpdateLastUsage() + Secure() sec.SecureConn drpc.Conn } @@ -35,6 +36,10 @@ func (p *peer) Id() string { return p.id } +func (p *peer) Secure() sec.SecureConn { + return p.sc +} + func (p *peer) LastUsage() time.Time { select { case <-p.Closed(): diff --git a/common/net/secure/service.go b/common/net/secure/service.go index d47ebd4b..c3ba0d40 100644 --- a/common/net/secure/service.go +++ b/common/net/secure/service.go @@ -36,7 +36,7 @@ type service struct { func (s *service) Init(a *app.App) (err error) { account := a.MustComponent(config.CName).(commonaccount.ConfigGetter).GetAccount() - pkb, err := keys.DecodeBytesFromString(account.SigningKey) + pkb, err := keys.DecodeBytesFromString(account.PeerKey) if err != nil { return } diff --git a/common/pkg/acl/account/accountdata.go b/common/pkg/acl/account/accountdata.go index eea9d2f0..13bcf342 100644 --- a/common/pkg/acl/account/accountdata.go +++ b/common/pkg/acl/account/accountdata.go @@ -7,6 +7,7 @@ import ( type AccountData struct { // TODO: create a convenient constructor for this Identity []byte // public key + PeerKey signingkey.PrivKey SignKey signingkey.PrivKey EncKey encryptionkey.PrivKey } diff --git a/etc/client.yml b/etc/client.yml index a7949a41..1621ebbe 100644 --- a/etc/client.yml +++ b/etc/client.yml @@ -5,24 +5,25 @@ grpcServer: - 127.0.0.1:4630 tls: false account: - peerId: 12D3KooWC2SctmKSLWqmzsKCpQBo4iqNzbZhWivM3jbhovB4JFug - signingKey: Maen+w6qwWuS79RZyMbuW7wnWAox0+rMinAb/gsOSl8gz2BLCfMlwXjlo8NLKfFFZFNUzl0ANTxbrK45Be7CPw== - encryptionKey: MIIEowIBAAKCAQEAonOsG0DzAzGlR7cd0u31DS0xoHihxdfJwut5JMtLKqGwkUC5RM+/eTa96hKYp8ED6B8Q4ZBhmt2gQnOUQJpoAnJ6uU/HgQVVhsJD7uMQcyVWr2KZbRK2GAohxOiW8JaB8pLiIRJbOxaeIu8dGRTrTTxYnh4IbIUgMu5x3iPW1/6YT/LCN1r/CBgHnPLtxMjAdUYzz9+LC13sZJsanUot83MTgl+5unEPh+ogbrSJ6P8FAAWW8HHD5lUSSb2l8NFRafYWP4o3vF9fqtmpt5I2nK6PaNh+4YXB7CX8Nak3AYuSO/aLGUtZMGYv9Qqwewjk/ewEGNWz33D/Hve8+hctXQIDAQABAoIBAQCNY7/XuJ/Jl9wSnv4GJ7Ww0jTvRg8G8tlYHTpDG+1AHZpf0cVubqJoDY0dvTHAT+3miaNXryJEd8CUFaRi1gDQoHLP9u/dC5d0wn/92wLmNQlNfLOsiyyRn7/kccttepF/XvgRcLiWpQjdvt/EhMCHaI54kAsk6Hkt2vqgLPFA66MH/5AMyf+8RmouYvc1m8jPUVmkIZVkoO4/6kh0tZS+rGdjxB65zDaoBx6CcXAMkTWe27Ce87vfGwCRySGVGRg7RuTJQR8VO3oSmsPVIZ8A48fKPQvryrl/5ztvE35lL4i3pdIbd/CJ9zTKIEM4nyPWSmxsaxs1yIllsj3BFpDBAoGBAMzWUEBYm5FH6wG2GXigkou4VSUBAoKCi5XmA2bwCUZx6CaG4uk43cbYpkbLpIRchfLHAeVCiaOYe5VFvYMth6o+OICEKfXWEwGqjtWeHkyIQIZ1Yo+BKk1rbzkYa/n3a7Mw+C6HsweFq1v01eTChmMr/PF6trFQiJJhTGkGKS2/AoGBAMsHKMEmgw1/hRqiEai73AVLSzXGoHSUWsM1vV05EzDyoxkk8Q/+sJR/BOp4HvJidXiM9B0hSOBhkPZjP3TZSQTKXwMGY+Hcs0XhwGxV5Eb9XdbD5rhCT6eVUeQeP9W9J34RdobJauG1Ld9E1U0nKEI+ls6VZf6/k+ixDOa3TaPjAoGADI+7/iYw7Bjf9YvoRfh65CyatBk6wSwmSTwAy2g++V304Z/1/F1rZE1W7RKB9UgDQt8nY5rP/ANW2NGdDJVXM357Uo5IUHYfVkPSXJFExGa6pkQ+lhRStsq22GaCAKNGrId9QMU7mmN9HbeHAm9XdG93JIvk9jy9E1T6LZqeHdsCgYAXsvQ856PwlWwSGcz550PdklZrJo5gTVjy5HkAQsNMuWX0b218MnymONV4ESF7paaUtc9g/xukpX7oY9lqaFqvpnfEwKA0IzEB/UIa40PMTZMAmMl7xLHLnBB9ElLdPkE35A3z2dsSEbYTE9PaN7HpWaj84E+RlwdK6C/bVpZHhQKBgBv8Up6nOfQyW4jiRo5CPOzXPYu+tXfsV0lKbYAjlp3rcczsi/BPXF6tLZ74/f5Cp2NJxx1GIitjqGzZ1mhkB8Eimuw1o+uNRBRh5BcmQTXPTxrrbOsYzjBJNb7n9HcHlGivcmDooxP7TgRJydEiFdpoBhjU+7yGJTJk7YdDLI3I + peerId: 12D3KooWFqDLPcSZi74A1vVpDc8baTkGU6bd21AXcNxH8CFPMqp6 + peerKey: s6PUCRVry6ymxhyytNQcqSQVd2ECGyWNMIJB0FkyMUFZXbbOYSBb2yYPeQXrA9jdFdZDXyUSxtvzasvpSMpa6w== + signingKey: +UF/Do2KPeBLA0joKvnJj43jiH975JcHGjkLIkLR0p7FCFHnR1r/w4xLSa4RTjhEAQ3sDefjktShOJpalXnGvg== + encryptionKey: MIIEpQIBAAKCAQEA7NiHF065o9BfTTAWtAItg3KLqvFnRN2WVQMkjMZ/BukIj4UAd196ppexh2tnDvvqW53qVxFtXcW8oFqX9GmDJx61nnN/ce2FhXNB3aPMa7g3AchlVVB9RHyS8Z49HTkn3DVRi8I8EnbpWer35BjnpGOQ257O/kFpD1P5FzvxyTQ2gF50SyiwoDzibyT2VxgQqaDErr9BfFQKBZb8SEBeLACOlzjb2u0mCv7NeoZNfzl2KsqBC8tiCyfNahhauGfU9ZB7PtHMC1pJKTtPhXhNhQI8Rp39dd+Fr3kiTJl3Fe1f4bg4GDI7LbqCARVBbtCjsLEMi1BMzMS63bFPrPL9ewIDAQABAoIBAQCA261j+Oj3Pz8ad7diaGzqvz9N2dkdlpFb30HbdYNW9yI5M1t1lvTb/lwQGVcQx+5RujDs/gZKpnJhq+hQibdZaVPWyW/lRB0I5hRHyf5F/QuwZJ79M7VztXMdEcKeS6JsJHYhW6PjR97dlQEZkJM21RTS6CwmGOBX/o/fHDYICNxIqt4x7x1Hu+A9Qcs3LWvWq0qAkO48jSYBDeIFJ56BdXZacfIv9A7aCGWoVvih2vFIFEwdn+3z69FHmcW8JzVDK+WdkegtOlvuPcFGgDjS8cHq4zuKyEckur9EVm2Wer+GRdY2v7i9ypxiy/Ej4qJCqJLIa5rtWHmB9Dz7IyFBAoGBAPlIMpu9vAhAhJUeO48vsuEDdCn2ztyq2h4GwYcuNmfZUAnFdKRHHAfb48P7nR1uVCEEvnJYF9uUFkot8zljkDCoqc3J30sOd54PT2Jqn2vPhSWpjNJGW4Ku3CmZq/vfCH15z+bcr7whtlEswshE31bykbZlzCOSyW1tgfz2I+ydAoGBAPM6iEV6M74X+M4GoVCwUn9JMFRUX/JONOu4nfNT+1jDeABeXzVS3gzLSMJ/Vk/+1a/g6NFm73bt5PYHR8jG/jrT3xcTBPUiFj038w1MAM5Fsj2jSnIFRYFxwH8q0RfejWvKJRyWKUyTt7m43VRY9P01+YDfgt+VoLs94rV0PNr3AoGAahmWoL8S5xg+1hE2HG2a3zbPHIVV6oo1qA4MFPNQaMcPz/jg+oLhpV6sBOB1MO+ikyMnxBdGoEjZa90+5rA/0NYY3+QKTDHuK7IsgaEMFaEP9MXDkEQt8uNmBbbIgr2dKXrNSF+p1JMsvEQm64KU5Lb92fpd9s4lOZQgfYBuLekCgYEAwNvPg6+S6Y7edJZjQLSepVjmHmfMsDd81M/NRkx4Bvju5PPvcDul3+UsazRGvyVkUJH4aVnCVL3rB33cWIIYwZKP2R72llyR37bGXOu/088FtsQMWn59j1cf+HV91/xajHZ7mMAkPRj/3B6OOLxUfZZXoO0ZO6nMCcvXQGPLgR8CgYEA2W644EHrSwb4qsDsUmIEeKnjSejS8Vej4S5/g1YOyVzfWEr/5rtejw09Fv4U92SeYhp7Xp3C0UnRCduZKrpXIZJVPO8KgWLDtPi9KvHqDPzpQNRHMNrsXLpOLLv+bnnymWXjcyG8fRecU4sggaH4r1C/QyLPr+s/fLDyVUt7bC8= apiServer: port: "8090" nodes: - - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + - peerId: 12D3KooWLn13hDrZ6YRGM517fHf2zS6qhPNRu18inLMpRqn1YGKu address: 127.0.0.1:4430 - signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== - encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy - - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y + signingKey: 3mzfKBWtn7mitFEgq8u4eysWOJ6ySbUs49irfHwcuOmi1YMpobz9anoqd4yaT1owZiRPYXqx5k2Z4sNVRE3kXA== + encryptionKey: MIIEpQIBAAKCAQEA3U7b4w9JTKE3TLM1WQ5iqdLbvUuozMp/hDEg7S15Gr6wrtLomMSBkfmVQ3Cu+CHdxAFqUFClItYlSFgtZWIFiSiQxCeaN2dmgczd9T4TlRAw6y6uJXtT9r7FIgizPP4B0/tnzPI6yYgpdwzCV2nRSjw3mMr5Nav3QYs18kYrJ1/Np2Wob5HOoRTUD++pPrToevTb7GNL/irrC8wXSE7oU6S7ix6Nh9vzEHg/V5FONBF/wWD/ri7Gy0j0qgUQ+gjxLWKr8xPDnRAve13zzo+54lGCyVvlm/rwCY9Jx378V1IuRx+S8F/GFuVozHD4XVaoSTtpCWPBQNSKDXgaIIKDowIDAQABAoIBACpMXj6ht1LMJXOldPbWhwkKYjFl+pdZxNGRSkfKvzDbbY2chhRcyp8J4vuG2ApY/rftxVIgd8+Wun1/TP3ppEE43aKAJzubqb35WBr9iGSfOZpZy7MiRUQN5kPBAfEQY20OyiIj0hSez74PVD283eGgbMfpU4Rsn8+JOgBaZPkbPViJLJY8PyHU6vwWw60dye1iJTz9yuBtoEqY0XKxnLaVXTQaWx0Te+VYU8twxDgXFWRaXtHuk7xnxOkCZDLrzIvuOYa5lsLoT8K62LDeXbyHBPhbdW0j4ZYzAOTsaUWpjuJzef9aj3JJdfyADiqb5iu6HHksvKzkZEau34zjilECgYEA/c8ZJm62uJMHNssTJYiLRw89l5hYwIZ/1TXdFRF8+xrTin5opYjpscSTO5bY2IYqLx2xuPiJCY1eGGB9L/RtkaVh51ySzq0d+4zpPIRKFcOOgdxHwlgoCgIhQECyfJZNMFGBUIlPXZ/phvXOXRvWFzDPhqThenVG2QzF+wLP0AUCgYEA3zfviQFJ1FOKJMozYO3tUZFmsIrAcO9hfuE7uuWz0Fw2m1XiwxjuOr1RbsSsh/lKke2h4tiGrlfiFhwCpIp91NkVTFrtFOQxbDxkYLkFiWkZDkOaK9YhKMa2cgEm3p+RGawokjbm51LKf+cbYN9xGaAe3y2WzIE4kNpfWE4SXYcCgYEAoagcrrvpqZoMCDxED63ud+4fHsUsEkQYe6Z5EAg5gH5PqnBlGrofjthTpqqnpxGdILFbFyNFtU3TVtduJPMcLp4Vw5TU9MqSxDu1+pOP1FjgFZpGImSf6+/7Wb9bb7sToujm4nLymAFYblt1exxVuiOeqnWuH58+5tQZ7YyW7DkCgYEAl7WuqZEkmpiEpWh/7vsGdo+6GXbUQG2R9+gg7m+7/HsP6hc/XZYOJAIT3JLzKB84nWHCyyiasNeuI5S5/xbZWtaH8TNDOxW0uXl6R3q41qGFk/pCSFTqiIo16dn6jwgoWCh4EpgZ61KLqs5p/zcd6Wq4ULrtaOTSizC/6IZ3WPUCgYEA6xCJy3+ICCgr8/c7hfd2Ylb3aOsXIffdgALhXjDcrNUCqgB4R+S3WReAwrABemQGl4tySQE/1f3Ru7SzMMciFogGyJ/YSXqSi6Y8oDD7MqlKPiWlN6WY1nSRMlLbkUOqpA5JaDM0kcmXjZpBBQr277GOnh9uKN8zUy5xoptctxI= + - peerId: 12D3KooWLtuKtCPBYrFJV1NdejiCr2s614ppe9rmUXnkTHtAUD5U address: 127.0.0.1:4431 - signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== - encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= - - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd + signingKey: 07JMoW5cQUtGO9nNIGQo9e99b7Wf/4YvTtNEA0lt4gCkmhwB1EB9ay+kitxVJJgmdyGLxbUUlGqwXsAj0zlHWw== + encryptionKey: MIIEpAIBAAKCAQEA7cA6J/icl8wseeXkt8oJr5AeYadUAG5EdCOdHj4S/Z7ivff4MOIKAeQITpq+rqhmXxOePYXSpQXE20Y9PW9tuw4gzOuq1ylSG/MWMcLDH1eIxg66rnmUqUbdiW4GGJjVjc9jvN0Up+MfSrUF6fM0jWTFoXVJQIeQQGERCIYjFzjfBl1xYvPghdxNgei/K5ZGYRggT28143XdIH4KTXGtp51hAKoyY9eCqYMtm9wvjxazhPVxO2CsYaqMxBLshY3jfHNqJnx8u6+h4Bl4uUcdbLNUgMcEgk7ehbQp2K0CqNoKXxbCTI6V57UVcJHDIaO5B6FyR6BguzHHNPJ4yd3q9wIDAQABAoIBAQCm2Mf3VRlPzhFIWnVwJXE2q8Umcu8Yfkm712Jj3twk8GPfPS4H4Bl1yjmqMB6xI6zz/CiItGlnNe04lMpVWuV+6CNMq/ZwmKbuxmFE+pFEZYGuvJd16gzR3tGJqJTOnjMAGhK8b8oXJ+TF4NQNooe20ol/DXgiuQAargPuH3RwzjYmF3N8VI4KUc3LaG4TwVXn4LwPOxrQSnfwJlZwLml1HAKOV0qcG0mXX6ZXOpoVhEoRPdQyUHc8ZW+53Agbtind7bYh5TsMVDFUrcgNwnwTOsWjil049la1IJO2uMRluacKlrtyzEp6zqrW8ZJO7mYAO69x4WyGqf2ZgIdA6djBAoGBAPqRHWAIgPa80eXbwCYkRtUG/ONBsQGi7+wm6nyhkXvNXJeokgH2DCgLH2+fW2scfOJuZc9r5WftEjOBvNfr2LDcwdyTSTh21WYcPSZx9HDf2d5/SWTcjNcyU0b5qfWIUKi/Zm9UY7r3X7yMA5dUD/cvu1PBJ5NWFrK1Gm2ph44dAoGBAPLn+LkHweU0fbxQq/76T5yVVpMKUaE9xwrJlUxEDPAQGnLPbFg4JeUt/YPhsOV85W4c4oQE+uFZrF0uf+1fEnS6MOJ+sq668upzC2hBp1B5138wM7615v1rvXVVH6qXfFop67FdBzPHt1NAN43mEIBZHTQ5hSVXFlYSZp9mxuEjAoGBAKCzUVO2IIAeub/iIGpV+dfGk4ptJ0kVZyreCqXEObpdC3V496uqUkGcYJ0GZ2ta6f2PMFzHpmnw8it2mdchu+gyrWL6U4uTK2pB0jZF/7Ak4WaB3GCD0xBxhleO6CJBOvn/R4M/bHcNEKmsYuE7WMIAKvScfPVR0VzsKfcLM5VBAoGAVvWg32zdh1bBZLdku8WU1rPH6KAbFSRuq3f7UPBTyWWaclu7p+GB/4f1aE9V6vJJmKASn7zArAhUYo+REMOmcc9uTMea5F7dM/23qb1HTtIvycLR44ZviW4Wx3iP+5x70jOLw1VQjMME6HLm8I/afHhqshWdiv6ganPv9UTwEg0CgYBSDi2dqg8F7ij5CN+LMDLSn3b8GCw+7efGIt7imm/O2V/FlHD40IA6qGg6DXNQrnoZQt94nMb1cZEvm1dxi6rmQNrhCyoMogAaPqgFhZGq1OjmhVZiXFUWy4WAcjdzFc9wZd3/XtaofRKHLK+ngTFhhVApKypLk3Rg9bCAAjzyVg== + - peerId: 12D3KooWDCypXSyN6ppuMZGxVnBd1ZQCMV4y7Bn187S4duYmf8rA address: 127.0.0.1:4432 - signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== - encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== + signingKey: SGyNE0dFaQgtgNuzdcO7LB+TEz9VHAOtlQLk6WWkrkQyXiZV3casg8Q2/4PO1Oylc8Fu72RU001Hclj5JCbiLw== + encryptionKey: MIIEpAIBAAKCAQEA0k3mw4FyexRkLgLjHzYs4Ppeyv6r9ZrP00imNf15JTuM8ajMx5oJX7JQTm8KOLRJjUdZZAd5Gtp0ezfYAQK1ZjEWwCmfp8j8FBgJIDSLpjxl88SXMLgATXYfhklnQvKlQjs/X3Ka4zdTrav2tMH9IAo6TSNZhlPQNsUory1SGHs+KqHv4p0sG8oWuKYhfBj8rWHQdUVptkIBKgojFDeJJD04Tbf9kUakbK/8KuXB6zF5H4WN3p4rMMwkClyTGeYO4LDg5TzVn8NnUi3/b/vO/3us1G/TMoRe/6umUfpQxrwo+7S2T6A4YwetWRp6xALLhp+HfAWnn0lA/D8/w1WpKwIDAQABAoIBAQC5cdQxRa5rddm48PbSCPWeFWkNW3DLDI6CYyedqDvxZwer+QtKXzww1I4X+7ZptiC9odLjb+uMkGHyXZXtnjPTPyounQWZ8JLILUGu0mbqWYwVXp9raHVr2OOHiKaz1D+BnbkOM4L9JUZ2eJL9ZaoNXLd4WdmRp8qM4WI0xqQDzOANx2HhyL/+dJmQeIUND+pdeH+Z+fYowU3ho32txNvBnMXQhF1T5K9i1VO5W49RAjIRbENsT+paPGKbNubDHRt1j36ktK4eC4HSdgv8tccdsGyrEiIbAt1XsTZfM8ie4D3A8RhSxiTC6Fkgv6vIm+iFTLzBFZKesOBcd8sfKeyBAoGBAOts5PQQJhldPDzlbnqzxMOR98WHbkVZjCqWSkNA34vqyFuPcRuX0rHK/qpg23ilbUP0fGMDTGgFzTt51FZLL16SXyRfjNhzjdmryryeddQwbp92ta2GEgnU6t1FyCuSCtcLDKJd/D9A9dC5UI6z+ES4TOnbR3nakXK9t4cUOFthAoGBAOSu+wL+SEA5erR+m3LpOsELK68CCJQPxn3VpoVfJZawgF+fEoXVMLTERxJput1+ADomIEdNc9ex86TjKx9gJ4piNHscRPFeT/AgESOIGHLOc1gk2DPqNj6wBIarUJQ9t4KcHScboh1dTPJeqqv2NSwIiLQoqFUIhfKZLnrW3zwLAoGBAJh0hC+o5YM3ZXLqAIllMN6VACbidP5j5ukNOjojIKCzAdyJH24G+2I3WoNrBbUzK3b+NC7KTAhw+V6ynlbjiWFs2D/twH/LFOkI3tkWpKcsVfbeIPimAbhsMUvpjJ7qjCqF9UCQLHGp14W6+/ftg7C8yNIINlkquVXclaTb60MBAoGAPqmL8ogG+EJH00mWAujRxq/u6meePiQMedKfbJBj1mTK6GjIRI/kZsQZzXvXTnYGTejAk4kvov0KDDaLTG+mpg6+3rUiVxlGwj+nMptKR7s2dAK0k5UsBAVrWBN9YwF+VXW9r0etJmq4ePljvvcaHtS/0M4LQjGxsoYy7EoQpX0CgYAhnf0McB7F1MxSjB0soMNv/v5utVzVihS3re2yKNdkI/YUEMB+yU3Q4gh+OljjBM6Y5To3BsQBAx4l2CysMKFHjIE/5AtdbvIS+chZZqB3vcZXSayvX8P1Z1uFdw/saiO2cRDJmR+TxaOPa2C9SzDoNTACthwLErHfzvEvVroKmw== space: gcTTL: 60 syncPeriod: 10 diff --git a/etc/config.yml b/etc/config.yml index 7e211552..86912342 100644 --- a/etc/config.yml +++ b/etc/config.yml @@ -5,24 +5,25 @@ grpcServer: - 127.0.0.1:4430 tls: false account: - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz - signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== - encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy + peerId: 12D3KooWLn13hDrZ6YRGM517fHf2zS6qhPNRu18inLMpRqn1YGKu + peerKey: 3mzfKBWtn7mitFEgq8u4eysWOJ6ySbUs49irfHwcuOmi1YMpobz9anoqd4yaT1owZiRPYXqx5k2Z4sNVRE3kXA== + signingKey: 3mzfKBWtn7mitFEgq8u4eysWOJ6ySbUs49irfHwcuOmi1YMpobz9anoqd4yaT1owZiRPYXqx5k2Z4sNVRE3kXA== + encryptionKey: MIIEpQIBAAKCAQEA3U7b4w9JTKE3TLM1WQ5iqdLbvUuozMp/hDEg7S15Gr6wrtLomMSBkfmVQ3Cu+CHdxAFqUFClItYlSFgtZWIFiSiQxCeaN2dmgczd9T4TlRAw6y6uJXtT9r7FIgizPP4B0/tnzPI6yYgpdwzCV2nRSjw3mMr5Nav3QYs18kYrJ1/Np2Wob5HOoRTUD++pPrToevTb7GNL/irrC8wXSE7oU6S7ix6Nh9vzEHg/V5FONBF/wWD/ri7Gy0j0qgUQ+gjxLWKr8xPDnRAve13zzo+54lGCyVvlm/rwCY9Jx378V1IuRx+S8F/GFuVozHD4XVaoSTtpCWPBQNSKDXgaIIKDowIDAQABAoIBACpMXj6ht1LMJXOldPbWhwkKYjFl+pdZxNGRSkfKvzDbbY2chhRcyp8J4vuG2ApY/rftxVIgd8+Wun1/TP3ppEE43aKAJzubqb35WBr9iGSfOZpZy7MiRUQN5kPBAfEQY20OyiIj0hSez74PVD283eGgbMfpU4Rsn8+JOgBaZPkbPViJLJY8PyHU6vwWw60dye1iJTz9yuBtoEqY0XKxnLaVXTQaWx0Te+VYU8twxDgXFWRaXtHuk7xnxOkCZDLrzIvuOYa5lsLoT8K62LDeXbyHBPhbdW0j4ZYzAOTsaUWpjuJzef9aj3JJdfyADiqb5iu6HHksvKzkZEau34zjilECgYEA/c8ZJm62uJMHNssTJYiLRw89l5hYwIZ/1TXdFRF8+xrTin5opYjpscSTO5bY2IYqLx2xuPiJCY1eGGB9L/RtkaVh51ySzq0d+4zpPIRKFcOOgdxHwlgoCgIhQECyfJZNMFGBUIlPXZ/phvXOXRvWFzDPhqThenVG2QzF+wLP0AUCgYEA3zfviQFJ1FOKJMozYO3tUZFmsIrAcO9hfuE7uuWz0Fw2m1XiwxjuOr1RbsSsh/lKke2h4tiGrlfiFhwCpIp91NkVTFrtFOQxbDxkYLkFiWkZDkOaK9YhKMa2cgEm3p+RGawokjbm51LKf+cbYN9xGaAe3y2WzIE4kNpfWE4SXYcCgYEAoagcrrvpqZoMCDxED63ud+4fHsUsEkQYe6Z5EAg5gH5PqnBlGrofjthTpqqnpxGdILFbFyNFtU3TVtduJPMcLp4Vw5TU9MqSxDu1+pOP1FjgFZpGImSf6+/7Wb9bb7sToujm4nLymAFYblt1exxVuiOeqnWuH58+5tQZ7YyW7DkCgYEAl7WuqZEkmpiEpWh/7vsGdo+6GXbUQG2R9+gg7m+7/HsP6hc/XZYOJAIT3JLzKB84nWHCyyiasNeuI5S5/xbZWtaH8TNDOxW0uXl6R3q41qGFk/pCSFTqiIo16dn6jwgoWCh4EpgZ61KLqs5p/zcd6Wq4ULrtaOTSizC/6IZ3WPUCgYEA6xCJy3+ICCgr8/c7hfd2Ylb3aOsXIffdgALhXjDcrNUCqgB4R+S3WReAwrABemQGl4tySQE/1f3Ru7SzMMciFogGyJ/YSXqSi6Y8oDD7MqlKPiWlN6WY1nSRMlLbkUOqpA5JaDM0kcmXjZpBBQr277GOnh9uKN8zUy5xoptctxI= apiServer: port: "8080" nodes: - - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + - peerId: 12D3KooWLn13hDrZ6YRGM517fHf2zS6qhPNRu18inLMpRqn1YGKu address: 127.0.0.1:4430 - signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== - encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy - - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y + signingKey: 3mzfKBWtn7mitFEgq8u4eysWOJ6ySbUs49irfHwcuOmi1YMpobz9anoqd4yaT1owZiRPYXqx5k2Z4sNVRE3kXA== + encryptionKey: MIIEpQIBAAKCAQEA3U7b4w9JTKE3TLM1WQ5iqdLbvUuozMp/hDEg7S15Gr6wrtLomMSBkfmVQ3Cu+CHdxAFqUFClItYlSFgtZWIFiSiQxCeaN2dmgczd9T4TlRAw6y6uJXtT9r7FIgizPP4B0/tnzPI6yYgpdwzCV2nRSjw3mMr5Nav3QYs18kYrJ1/Np2Wob5HOoRTUD++pPrToevTb7GNL/irrC8wXSE7oU6S7ix6Nh9vzEHg/V5FONBF/wWD/ri7Gy0j0qgUQ+gjxLWKr8xPDnRAve13zzo+54lGCyVvlm/rwCY9Jx378V1IuRx+S8F/GFuVozHD4XVaoSTtpCWPBQNSKDXgaIIKDowIDAQABAoIBACpMXj6ht1LMJXOldPbWhwkKYjFl+pdZxNGRSkfKvzDbbY2chhRcyp8J4vuG2ApY/rftxVIgd8+Wun1/TP3ppEE43aKAJzubqb35WBr9iGSfOZpZy7MiRUQN5kPBAfEQY20OyiIj0hSez74PVD283eGgbMfpU4Rsn8+JOgBaZPkbPViJLJY8PyHU6vwWw60dye1iJTz9yuBtoEqY0XKxnLaVXTQaWx0Te+VYU8twxDgXFWRaXtHuk7xnxOkCZDLrzIvuOYa5lsLoT8K62LDeXbyHBPhbdW0j4ZYzAOTsaUWpjuJzef9aj3JJdfyADiqb5iu6HHksvKzkZEau34zjilECgYEA/c8ZJm62uJMHNssTJYiLRw89l5hYwIZ/1TXdFRF8+xrTin5opYjpscSTO5bY2IYqLx2xuPiJCY1eGGB9L/RtkaVh51ySzq0d+4zpPIRKFcOOgdxHwlgoCgIhQECyfJZNMFGBUIlPXZ/phvXOXRvWFzDPhqThenVG2QzF+wLP0AUCgYEA3zfviQFJ1FOKJMozYO3tUZFmsIrAcO9hfuE7uuWz0Fw2m1XiwxjuOr1RbsSsh/lKke2h4tiGrlfiFhwCpIp91NkVTFrtFOQxbDxkYLkFiWkZDkOaK9YhKMa2cgEm3p+RGawokjbm51LKf+cbYN9xGaAe3y2WzIE4kNpfWE4SXYcCgYEAoagcrrvpqZoMCDxED63ud+4fHsUsEkQYe6Z5EAg5gH5PqnBlGrofjthTpqqnpxGdILFbFyNFtU3TVtduJPMcLp4Vw5TU9MqSxDu1+pOP1FjgFZpGImSf6+/7Wb9bb7sToujm4nLymAFYblt1exxVuiOeqnWuH58+5tQZ7YyW7DkCgYEAl7WuqZEkmpiEpWh/7vsGdo+6GXbUQG2R9+gg7m+7/HsP6hc/XZYOJAIT3JLzKB84nWHCyyiasNeuI5S5/xbZWtaH8TNDOxW0uXl6R3q41qGFk/pCSFTqiIo16dn6jwgoWCh4EpgZ61KLqs5p/zcd6Wq4ULrtaOTSizC/6IZ3WPUCgYEA6xCJy3+ICCgr8/c7hfd2Ylb3aOsXIffdgALhXjDcrNUCqgB4R+S3WReAwrABemQGl4tySQE/1f3Ru7SzMMciFogGyJ/YSXqSi6Y8oDD7MqlKPiWlN6WY1nSRMlLbkUOqpA5JaDM0kcmXjZpBBQr277GOnh9uKN8zUy5xoptctxI= + - peerId: 12D3KooWLtuKtCPBYrFJV1NdejiCr2s614ppe9rmUXnkTHtAUD5U address: 127.0.0.1:4431 - signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== - encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= - - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd + signingKey: 07JMoW5cQUtGO9nNIGQo9e99b7Wf/4YvTtNEA0lt4gCkmhwB1EB9ay+kitxVJJgmdyGLxbUUlGqwXsAj0zlHWw== + encryptionKey: MIIEpAIBAAKCAQEA7cA6J/icl8wseeXkt8oJr5AeYadUAG5EdCOdHj4S/Z7ivff4MOIKAeQITpq+rqhmXxOePYXSpQXE20Y9PW9tuw4gzOuq1ylSG/MWMcLDH1eIxg66rnmUqUbdiW4GGJjVjc9jvN0Up+MfSrUF6fM0jWTFoXVJQIeQQGERCIYjFzjfBl1xYvPghdxNgei/K5ZGYRggT28143XdIH4KTXGtp51hAKoyY9eCqYMtm9wvjxazhPVxO2CsYaqMxBLshY3jfHNqJnx8u6+h4Bl4uUcdbLNUgMcEgk7ehbQp2K0CqNoKXxbCTI6V57UVcJHDIaO5B6FyR6BguzHHNPJ4yd3q9wIDAQABAoIBAQCm2Mf3VRlPzhFIWnVwJXE2q8Umcu8Yfkm712Jj3twk8GPfPS4H4Bl1yjmqMB6xI6zz/CiItGlnNe04lMpVWuV+6CNMq/ZwmKbuxmFE+pFEZYGuvJd16gzR3tGJqJTOnjMAGhK8b8oXJ+TF4NQNooe20ol/DXgiuQAargPuH3RwzjYmF3N8VI4KUc3LaG4TwVXn4LwPOxrQSnfwJlZwLml1HAKOV0qcG0mXX6ZXOpoVhEoRPdQyUHc8ZW+53Agbtind7bYh5TsMVDFUrcgNwnwTOsWjil049la1IJO2uMRluacKlrtyzEp6zqrW8ZJO7mYAO69x4WyGqf2ZgIdA6djBAoGBAPqRHWAIgPa80eXbwCYkRtUG/ONBsQGi7+wm6nyhkXvNXJeokgH2DCgLH2+fW2scfOJuZc9r5WftEjOBvNfr2LDcwdyTSTh21WYcPSZx9HDf2d5/SWTcjNcyU0b5qfWIUKi/Zm9UY7r3X7yMA5dUD/cvu1PBJ5NWFrK1Gm2ph44dAoGBAPLn+LkHweU0fbxQq/76T5yVVpMKUaE9xwrJlUxEDPAQGnLPbFg4JeUt/YPhsOV85W4c4oQE+uFZrF0uf+1fEnS6MOJ+sq668upzC2hBp1B5138wM7615v1rvXVVH6qXfFop67FdBzPHt1NAN43mEIBZHTQ5hSVXFlYSZp9mxuEjAoGBAKCzUVO2IIAeub/iIGpV+dfGk4ptJ0kVZyreCqXEObpdC3V496uqUkGcYJ0GZ2ta6f2PMFzHpmnw8it2mdchu+gyrWL6U4uTK2pB0jZF/7Ak4WaB3GCD0xBxhleO6CJBOvn/R4M/bHcNEKmsYuE7WMIAKvScfPVR0VzsKfcLM5VBAoGAVvWg32zdh1bBZLdku8WU1rPH6KAbFSRuq3f7UPBTyWWaclu7p+GB/4f1aE9V6vJJmKASn7zArAhUYo+REMOmcc9uTMea5F7dM/23qb1HTtIvycLR44ZviW4Wx3iP+5x70jOLw1VQjMME6HLm8I/afHhqshWdiv6ganPv9UTwEg0CgYBSDi2dqg8F7ij5CN+LMDLSn3b8GCw+7efGIt7imm/O2V/FlHD40IA6qGg6DXNQrnoZQt94nMb1cZEvm1dxi6rmQNrhCyoMogAaPqgFhZGq1OjmhVZiXFUWy4WAcjdzFc9wZd3/XtaofRKHLK+ngTFhhVApKypLk3Rg9bCAAjzyVg== + - peerId: 12D3KooWDCypXSyN6ppuMZGxVnBd1ZQCMV4y7Bn187S4duYmf8rA address: 127.0.0.1:4432 - signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== - encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== + signingKey: SGyNE0dFaQgtgNuzdcO7LB+TEz9VHAOtlQLk6WWkrkQyXiZV3casg8Q2/4PO1Oylc8Fu72RU001Hclj5JCbiLw== + encryptionKey: MIIEpAIBAAKCAQEA0k3mw4FyexRkLgLjHzYs4Ppeyv6r9ZrP00imNf15JTuM8ajMx5oJX7JQTm8KOLRJjUdZZAd5Gtp0ezfYAQK1ZjEWwCmfp8j8FBgJIDSLpjxl88SXMLgATXYfhklnQvKlQjs/X3Ka4zdTrav2tMH9IAo6TSNZhlPQNsUory1SGHs+KqHv4p0sG8oWuKYhfBj8rWHQdUVptkIBKgojFDeJJD04Tbf9kUakbK/8KuXB6zF5H4WN3p4rMMwkClyTGeYO4LDg5TzVn8NnUi3/b/vO/3us1G/TMoRe/6umUfpQxrwo+7S2T6A4YwetWRp6xALLhp+HfAWnn0lA/D8/w1WpKwIDAQABAoIBAQC5cdQxRa5rddm48PbSCPWeFWkNW3DLDI6CYyedqDvxZwer+QtKXzww1I4X+7ZptiC9odLjb+uMkGHyXZXtnjPTPyounQWZ8JLILUGu0mbqWYwVXp9raHVr2OOHiKaz1D+BnbkOM4L9JUZ2eJL9ZaoNXLd4WdmRp8qM4WI0xqQDzOANx2HhyL/+dJmQeIUND+pdeH+Z+fYowU3ho32txNvBnMXQhF1T5K9i1VO5W49RAjIRbENsT+paPGKbNubDHRt1j36ktK4eC4HSdgv8tccdsGyrEiIbAt1XsTZfM8ie4D3A8RhSxiTC6Fkgv6vIm+iFTLzBFZKesOBcd8sfKeyBAoGBAOts5PQQJhldPDzlbnqzxMOR98WHbkVZjCqWSkNA34vqyFuPcRuX0rHK/qpg23ilbUP0fGMDTGgFzTt51FZLL16SXyRfjNhzjdmryryeddQwbp92ta2GEgnU6t1FyCuSCtcLDKJd/D9A9dC5UI6z+ES4TOnbR3nakXK9t4cUOFthAoGBAOSu+wL+SEA5erR+m3LpOsELK68CCJQPxn3VpoVfJZawgF+fEoXVMLTERxJput1+ADomIEdNc9ex86TjKx9gJ4piNHscRPFeT/AgESOIGHLOc1gk2DPqNj6wBIarUJQ9t4KcHScboh1dTPJeqqv2NSwIiLQoqFUIhfKZLnrW3zwLAoGBAJh0hC+o5YM3ZXLqAIllMN6VACbidP5j5ukNOjojIKCzAdyJH24G+2I3WoNrBbUzK3b+NC7KTAhw+V6ynlbjiWFs2D/twH/LFOkI3tkWpKcsVfbeIPimAbhsMUvpjJ7qjCqF9UCQLHGp14W6+/ftg7C8yNIINlkquVXclaTb60MBAoGAPqmL8ogG+EJH00mWAujRxq/u6meePiQMedKfbJBj1mTK6GjIRI/kZsQZzXvXTnYGTejAk4kvov0KDDaLTG+mpg6+3rUiVxlGwj+nMptKR7s2dAK0k5UsBAVrWBN9YwF+VXW9r0etJmq4ePljvvcaHtS/0M4LQjGxsoYy7EoQpX0CgYAhnf0McB7F1MxSjB0soMNv/v5utVzVihS3re2yKNdkI/YUEMB+yU3Q4gh+OljjBM6Y5To3BsQBAx4l2CysMKFHjIE/5AtdbvIS+chZZqB3vcZXSayvX8P1Z1uFdw/saiO2cRDJmR+TxaOPa2C9SzDoNTACthwLErHfzvEvVroKmw== space: gcTTL: 60 syncPeriod: 10 diff --git a/etc/configs/client1.yml b/etc/configs/client1.yml index 2daba25c..92f7461f 100755 --- a/etc/configs/client1.yml +++ b/etc/configs/client1.yml @@ -5,24 +5,25 @@ grpcServer: - 127.0.0.1:4630 tls: false account: - peerId: 12D3KooWC2SctmKSLWqmzsKCpQBo4iqNzbZhWivM3jbhovB4JFug - signingKey: Maen+w6qwWuS79RZyMbuW7wnWAox0+rMinAb/gsOSl8gz2BLCfMlwXjlo8NLKfFFZFNUzl0ANTxbrK45Be7CPw== - encryptionKey: MIIEowIBAAKCAQEAonOsG0DzAzGlR7cd0u31DS0xoHihxdfJwut5JMtLKqGwkUC5RM+/eTa96hKYp8ED6B8Q4ZBhmt2gQnOUQJpoAnJ6uU/HgQVVhsJD7uMQcyVWr2KZbRK2GAohxOiW8JaB8pLiIRJbOxaeIu8dGRTrTTxYnh4IbIUgMu5x3iPW1/6YT/LCN1r/CBgHnPLtxMjAdUYzz9+LC13sZJsanUot83MTgl+5unEPh+ogbrSJ6P8FAAWW8HHD5lUSSb2l8NFRafYWP4o3vF9fqtmpt5I2nK6PaNh+4YXB7CX8Nak3AYuSO/aLGUtZMGYv9Qqwewjk/ewEGNWz33D/Hve8+hctXQIDAQABAoIBAQCNY7/XuJ/Jl9wSnv4GJ7Ww0jTvRg8G8tlYHTpDG+1AHZpf0cVubqJoDY0dvTHAT+3miaNXryJEd8CUFaRi1gDQoHLP9u/dC5d0wn/92wLmNQlNfLOsiyyRn7/kccttepF/XvgRcLiWpQjdvt/EhMCHaI54kAsk6Hkt2vqgLPFA66MH/5AMyf+8RmouYvc1m8jPUVmkIZVkoO4/6kh0tZS+rGdjxB65zDaoBx6CcXAMkTWe27Ce87vfGwCRySGVGRg7RuTJQR8VO3oSmsPVIZ8A48fKPQvryrl/5ztvE35lL4i3pdIbd/CJ9zTKIEM4nyPWSmxsaxs1yIllsj3BFpDBAoGBAMzWUEBYm5FH6wG2GXigkou4VSUBAoKCi5XmA2bwCUZx6CaG4uk43cbYpkbLpIRchfLHAeVCiaOYe5VFvYMth6o+OICEKfXWEwGqjtWeHkyIQIZ1Yo+BKk1rbzkYa/n3a7Mw+C6HsweFq1v01eTChmMr/PF6trFQiJJhTGkGKS2/AoGBAMsHKMEmgw1/hRqiEai73AVLSzXGoHSUWsM1vV05EzDyoxkk8Q/+sJR/BOp4HvJidXiM9B0hSOBhkPZjP3TZSQTKXwMGY+Hcs0XhwGxV5Eb9XdbD5rhCT6eVUeQeP9W9J34RdobJauG1Ld9E1U0nKEI+ls6VZf6/k+ixDOa3TaPjAoGADI+7/iYw7Bjf9YvoRfh65CyatBk6wSwmSTwAy2g++V304Z/1/F1rZE1W7RKB9UgDQt8nY5rP/ANW2NGdDJVXM357Uo5IUHYfVkPSXJFExGa6pkQ+lhRStsq22GaCAKNGrId9QMU7mmN9HbeHAm9XdG93JIvk9jy9E1T6LZqeHdsCgYAXsvQ856PwlWwSGcz550PdklZrJo5gTVjy5HkAQsNMuWX0b218MnymONV4ESF7paaUtc9g/xukpX7oY9lqaFqvpnfEwKA0IzEB/UIa40PMTZMAmMl7xLHLnBB9ElLdPkE35A3z2dsSEbYTE9PaN7HpWaj84E+RlwdK6C/bVpZHhQKBgBv8Up6nOfQyW4jiRo5CPOzXPYu+tXfsV0lKbYAjlp3rcczsi/BPXF6tLZ74/f5Cp2NJxx1GIitjqGzZ1mhkB8Eimuw1o+uNRBRh5BcmQTXPTxrrbOsYzjBJNb7n9HcHlGivcmDooxP7TgRJydEiFdpoBhjU+7yGJTJk7YdDLI3I + peerId: 12D3KooWFqDLPcSZi74A1vVpDc8baTkGU6bd21AXcNxH8CFPMqp6 + peerKey: s6PUCRVry6ymxhyytNQcqSQVd2ECGyWNMIJB0FkyMUFZXbbOYSBb2yYPeQXrA9jdFdZDXyUSxtvzasvpSMpa6w== + signingKey: +UF/Do2KPeBLA0joKvnJj43jiH975JcHGjkLIkLR0p7FCFHnR1r/w4xLSa4RTjhEAQ3sDefjktShOJpalXnGvg== + encryptionKey: MIIEpQIBAAKCAQEA7NiHF065o9BfTTAWtAItg3KLqvFnRN2WVQMkjMZ/BukIj4UAd196ppexh2tnDvvqW53qVxFtXcW8oFqX9GmDJx61nnN/ce2FhXNB3aPMa7g3AchlVVB9RHyS8Z49HTkn3DVRi8I8EnbpWer35BjnpGOQ257O/kFpD1P5FzvxyTQ2gF50SyiwoDzibyT2VxgQqaDErr9BfFQKBZb8SEBeLACOlzjb2u0mCv7NeoZNfzl2KsqBC8tiCyfNahhauGfU9ZB7PtHMC1pJKTtPhXhNhQI8Rp39dd+Fr3kiTJl3Fe1f4bg4GDI7LbqCARVBbtCjsLEMi1BMzMS63bFPrPL9ewIDAQABAoIBAQCA261j+Oj3Pz8ad7diaGzqvz9N2dkdlpFb30HbdYNW9yI5M1t1lvTb/lwQGVcQx+5RujDs/gZKpnJhq+hQibdZaVPWyW/lRB0I5hRHyf5F/QuwZJ79M7VztXMdEcKeS6JsJHYhW6PjR97dlQEZkJM21RTS6CwmGOBX/o/fHDYICNxIqt4x7x1Hu+A9Qcs3LWvWq0qAkO48jSYBDeIFJ56BdXZacfIv9A7aCGWoVvih2vFIFEwdn+3z69FHmcW8JzVDK+WdkegtOlvuPcFGgDjS8cHq4zuKyEckur9EVm2Wer+GRdY2v7i9ypxiy/Ej4qJCqJLIa5rtWHmB9Dz7IyFBAoGBAPlIMpu9vAhAhJUeO48vsuEDdCn2ztyq2h4GwYcuNmfZUAnFdKRHHAfb48P7nR1uVCEEvnJYF9uUFkot8zljkDCoqc3J30sOd54PT2Jqn2vPhSWpjNJGW4Ku3CmZq/vfCH15z+bcr7whtlEswshE31bykbZlzCOSyW1tgfz2I+ydAoGBAPM6iEV6M74X+M4GoVCwUn9JMFRUX/JONOu4nfNT+1jDeABeXzVS3gzLSMJ/Vk/+1a/g6NFm73bt5PYHR8jG/jrT3xcTBPUiFj038w1MAM5Fsj2jSnIFRYFxwH8q0RfejWvKJRyWKUyTt7m43VRY9P01+YDfgt+VoLs94rV0PNr3AoGAahmWoL8S5xg+1hE2HG2a3zbPHIVV6oo1qA4MFPNQaMcPz/jg+oLhpV6sBOB1MO+ikyMnxBdGoEjZa90+5rA/0NYY3+QKTDHuK7IsgaEMFaEP9MXDkEQt8uNmBbbIgr2dKXrNSF+p1JMsvEQm64KU5Lb92fpd9s4lOZQgfYBuLekCgYEAwNvPg6+S6Y7edJZjQLSepVjmHmfMsDd81M/NRkx4Bvju5PPvcDul3+UsazRGvyVkUJH4aVnCVL3rB33cWIIYwZKP2R72llyR37bGXOu/088FtsQMWn59j1cf+HV91/xajHZ7mMAkPRj/3B6OOLxUfZZXoO0ZO6nMCcvXQGPLgR8CgYEA2W644EHrSwb4qsDsUmIEeKnjSejS8Vej4S5/g1YOyVzfWEr/5rtejw09Fv4U92SeYhp7Xp3C0UnRCduZKrpXIZJVPO8KgWLDtPi9KvHqDPzpQNRHMNrsXLpOLLv+bnnymWXjcyG8fRecU4sggaH4r1C/QyLPr+s/fLDyVUt7bC8= apiServer: port: "8090" nodes: - - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + - peerId: 12D3KooWLn13hDrZ6YRGM517fHf2zS6qhPNRu18inLMpRqn1YGKu address: 127.0.0.1:4430 - signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== - encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy - - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y + signingKey: 3mzfKBWtn7mitFEgq8u4eysWOJ6ySbUs49irfHwcuOmi1YMpobz9anoqd4yaT1owZiRPYXqx5k2Z4sNVRE3kXA== + encryptionKey: MIIEpQIBAAKCAQEA3U7b4w9JTKE3TLM1WQ5iqdLbvUuozMp/hDEg7S15Gr6wrtLomMSBkfmVQ3Cu+CHdxAFqUFClItYlSFgtZWIFiSiQxCeaN2dmgczd9T4TlRAw6y6uJXtT9r7FIgizPP4B0/tnzPI6yYgpdwzCV2nRSjw3mMr5Nav3QYs18kYrJ1/Np2Wob5HOoRTUD++pPrToevTb7GNL/irrC8wXSE7oU6S7ix6Nh9vzEHg/V5FONBF/wWD/ri7Gy0j0qgUQ+gjxLWKr8xPDnRAve13zzo+54lGCyVvlm/rwCY9Jx378V1IuRx+S8F/GFuVozHD4XVaoSTtpCWPBQNSKDXgaIIKDowIDAQABAoIBACpMXj6ht1LMJXOldPbWhwkKYjFl+pdZxNGRSkfKvzDbbY2chhRcyp8J4vuG2ApY/rftxVIgd8+Wun1/TP3ppEE43aKAJzubqb35WBr9iGSfOZpZy7MiRUQN5kPBAfEQY20OyiIj0hSez74PVD283eGgbMfpU4Rsn8+JOgBaZPkbPViJLJY8PyHU6vwWw60dye1iJTz9yuBtoEqY0XKxnLaVXTQaWx0Te+VYU8twxDgXFWRaXtHuk7xnxOkCZDLrzIvuOYa5lsLoT8K62LDeXbyHBPhbdW0j4ZYzAOTsaUWpjuJzef9aj3JJdfyADiqb5iu6HHksvKzkZEau34zjilECgYEA/c8ZJm62uJMHNssTJYiLRw89l5hYwIZ/1TXdFRF8+xrTin5opYjpscSTO5bY2IYqLx2xuPiJCY1eGGB9L/RtkaVh51ySzq0d+4zpPIRKFcOOgdxHwlgoCgIhQECyfJZNMFGBUIlPXZ/phvXOXRvWFzDPhqThenVG2QzF+wLP0AUCgYEA3zfviQFJ1FOKJMozYO3tUZFmsIrAcO9hfuE7uuWz0Fw2m1XiwxjuOr1RbsSsh/lKke2h4tiGrlfiFhwCpIp91NkVTFrtFOQxbDxkYLkFiWkZDkOaK9YhKMa2cgEm3p+RGawokjbm51LKf+cbYN9xGaAe3y2WzIE4kNpfWE4SXYcCgYEAoagcrrvpqZoMCDxED63ud+4fHsUsEkQYe6Z5EAg5gH5PqnBlGrofjthTpqqnpxGdILFbFyNFtU3TVtduJPMcLp4Vw5TU9MqSxDu1+pOP1FjgFZpGImSf6+/7Wb9bb7sToujm4nLymAFYblt1exxVuiOeqnWuH58+5tQZ7YyW7DkCgYEAl7WuqZEkmpiEpWh/7vsGdo+6GXbUQG2R9+gg7m+7/HsP6hc/XZYOJAIT3JLzKB84nWHCyyiasNeuI5S5/xbZWtaH8TNDOxW0uXl6R3q41qGFk/pCSFTqiIo16dn6jwgoWCh4EpgZ61KLqs5p/zcd6Wq4ULrtaOTSizC/6IZ3WPUCgYEA6xCJy3+ICCgr8/c7hfd2Ylb3aOsXIffdgALhXjDcrNUCqgB4R+S3WReAwrABemQGl4tySQE/1f3Ru7SzMMciFogGyJ/YSXqSi6Y8oDD7MqlKPiWlN6WY1nSRMlLbkUOqpA5JaDM0kcmXjZpBBQr277GOnh9uKN8zUy5xoptctxI= + - peerId: 12D3KooWLtuKtCPBYrFJV1NdejiCr2s614ppe9rmUXnkTHtAUD5U address: 127.0.0.1:4431 - signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== - encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= - - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd + signingKey: 07JMoW5cQUtGO9nNIGQo9e99b7Wf/4YvTtNEA0lt4gCkmhwB1EB9ay+kitxVJJgmdyGLxbUUlGqwXsAj0zlHWw== + encryptionKey: MIIEpAIBAAKCAQEA7cA6J/icl8wseeXkt8oJr5AeYadUAG5EdCOdHj4S/Z7ivff4MOIKAeQITpq+rqhmXxOePYXSpQXE20Y9PW9tuw4gzOuq1ylSG/MWMcLDH1eIxg66rnmUqUbdiW4GGJjVjc9jvN0Up+MfSrUF6fM0jWTFoXVJQIeQQGERCIYjFzjfBl1xYvPghdxNgei/K5ZGYRggT28143XdIH4KTXGtp51hAKoyY9eCqYMtm9wvjxazhPVxO2CsYaqMxBLshY3jfHNqJnx8u6+h4Bl4uUcdbLNUgMcEgk7ehbQp2K0CqNoKXxbCTI6V57UVcJHDIaO5B6FyR6BguzHHNPJ4yd3q9wIDAQABAoIBAQCm2Mf3VRlPzhFIWnVwJXE2q8Umcu8Yfkm712Jj3twk8GPfPS4H4Bl1yjmqMB6xI6zz/CiItGlnNe04lMpVWuV+6CNMq/ZwmKbuxmFE+pFEZYGuvJd16gzR3tGJqJTOnjMAGhK8b8oXJ+TF4NQNooe20ol/DXgiuQAargPuH3RwzjYmF3N8VI4KUc3LaG4TwVXn4LwPOxrQSnfwJlZwLml1HAKOV0qcG0mXX6ZXOpoVhEoRPdQyUHc8ZW+53Agbtind7bYh5TsMVDFUrcgNwnwTOsWjil049la1IJO2uMRluacKlrtyzEp6zqrW8ZJO7mYAO69x4WyGqf2ZgIdA6djBAoGBAPqRHWAIgPa80eXbwCYkRtUG/ONBsQGi7+wm6nyhkXvNXJeokgH2DCgLH2+fW2scfOJuZc9r5WftEjOBvNfr2LDcwdyTSTh21WYcPSZx9HDf2d5/SWTcjNcyU0b5qfWIUKi/Zm9UY7r3X7yMA5dUD/cvu1PBJ5NWFrK1Gm2ph44dAoGBAPLn+LkHweU0fbxQq/76T5yVVpMKUaE9xwrJlUxEDPAQGnLPbFg4JeUt/YPhsOV85W4c4oQE+uFZrF0uf+1fEnS6MOJ+sq668upzC2hBp1B5138wM7615v1rvXVVH6qXfFop67FdBzPHt1NAN43mEIBZHTQ5hSVXFlYSZp9mxuEjAoGBAKCzUVO2IIAeub/iIGpV+dfGk4ptJ0kVZyreCqXEObpdC3V496uqUkGcYJ0GZ2ta6f2PMFzHpmnw8it2mdchu+gyrWL6U4uTK2pB0jZF/7Ak4WaB3GCD0xBxhleO6CJBOvn/R4M/bHcNEKmsYuE7WMIAKvScfPVR0VzsKfcLM5VBAoGAVvWg32zdh1bBZLdku8WU1rPH6KAbFSRuq3f7UPBTyWWaclu7p+GB/4f1aE9V6vJJmKASn7zArAhUYo+REMOmcc9uTMea5F7dM/23qb1HTtIvycLR44ZviW4Wx3iP+5x70jOLw1VQjMME6HLm8I/afHhqshWdiv6ganPv9UTwEg0CgYBSDi2dqg8F7ij5CN+LMDLSn3b8GCw+7efGIt7imm/O2V/FlHD40IA6qGg6DXNQrnoZQt94nMb1cZEvm1dxi6rmQNrhCyoMogAaPqgFhZGq1OjmhVZiXFUWy4WAcjdzFc9wZd3/XtaofRKHLK+ngTFhhVApKypLk3Rg9bCAAjzyVg== + - peerId: 12D3KooWDCypXSyN6ppuMZGxVnBd1ZQCMV4y7Bn187S4duYmf8rA address: 127.0.0.1:4432 - signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== - encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== + signingKey: SGyNE0dFaQgtgNuzdcO7LB+TEz9VHAOtlQLk6WWkrkQyXiZV3casg8Q2/4PO1Oylc8Fu72RU001Hclj5JCbiLw== + encryptionKey: MIIEpAIBAAKCAQEA0k3mw4FyexRkLgLjHzYs4Ppeyv6r9ZrP00imNf15JTuM8ajMx5oJX7JQTm8KOLRJjUdZZAd5Gtp0ezfYAQK1ZjEWwCmfp8j8FBgJIDSLpjxl88SXMLgATXYfhklnQvKlQjs/X3Ka4zdTrav2tMH9IAo6TSNZhlPQNsUory1SGHs+KqHv4p0sG8oWuKYhfBj8rWHQdUVptkIBKgojFDeJJD04Tbf9kUakbK/8KuXB6zF5H4WN3p4rMMwkClyTGeYO4LDg5TzVn8NnUi3/b/vO/3us1G/TMoRe/6umUfpQxrwo+7S2T6A4YwetWRp6xALLhp+HfAWnn0lA/D8/w1WpKwIDAQABAoIBAQC5cdQxRa5rddm48PbSCPWeFWkNW3DLDI6CYyedqDvxZwer+QtKXzww1I4X+7ZptiC9odLjb+uMkGHyXZXtnjPTPyounQWZ8JLILUGu0mbqWYwVXp9raHVr2OOHiKaz1D+BnbkOM4L9JUZ2eJL9ZaoNXLd4WdmRp8qM4WI0xqQDzOANx2HhyL/+dJmQeIUND+pdeH+Z+fYowU3ho32txNvBnMXQhF1T5K9i1VO5W49RAjIRbENsT+paPGKbNubDHRt1j36ktK4eC4HSdgv8tccdsGyrEiIbAt1XsTZfM8ie4D3A8RhSxiTC6Fkgv6vIm+iFTLzBFZKesOBcd8sfKeyBAoGBAOts5PQQJhldPDzlbnqzxMOR98WHbkVZjCqWSkNA34vqyFuPcRuX0rHK/qpg23ilbUP0fGMDTGgFzTt51FZLL16SXyRfjNhzjdmryryeddQwbp92ta2GEgnU6t1FyCuSCtcLDKJd/D9A9dC5UI6z+ES4TOnbR3nakXK9t4cUOFthAoGBAOSu+wL+SEA5erR+m3LpOsELK68CCJQPxn3VpoVfJZawgF+fEoXVMLTERxJput1+ADomIEdNc9ex86TjKx9gJ4piNHscRPFeT/AgESOIGHLOc1gk2DPqNj6wBIarUJQ9t4KcHScboh1dTPJeqqv2NSwIiLQoqFUIhfKZLnrW3zwLAoGBAJh0hC+o5YM3ZXLqAIllMN6VACbidP5j5ukNOjojIKCzAdyJH24G+2I3WoNrBbUzK3b+NC7KTAhw+V6ynlbjiWFs2D/twH/LFOkI3tkWpKcsVfbeIPimAbhsMUvpjJ7qjCqF9UCQLHGp14W6+/ftg7C8yNIINlkquVXclaTb60MBAoGAPqmL8ogG+EJH00mWAujRxq/u6meePiQMedKfbJBj1mTK6GjIRI/kZsQZzXvXTnYGTejAk4kvov0KDDaLTG+mpg6+3rUiVxlGwj+nMptKR7s2dAK0k5UsBAVrWBN9YwF+VXW9r0etJmq4ePljvvcaHtS/0M4LQjGxsoYy7EoQpX0CgYAhnf0McB7F1MxSjB0soMNv/v5utVzVihS3re2yKNdkI/YUEMB+yU3Q4gh+OljjBM6Y5To3BsQBAx4l2CysMKFHjIE/5AtdbvIS+chZZqB3vcZXSayvX8P1Z1uFdw/saiO2cRDJmR+TxaOPa2C9SzDoNTACthwLErHfzvEvVroKmw== space: gcTTL: 60 syncPeriod: 10 diff --git a/etc/configs/client2.yml b/etc/configs/client2.yml index 33cc9ad0..bb8d6fbd 100755 --- a/etc/configs/client2.yml +++ b/etc/configs/client2.yml @@ -1,36 +1,37 @@ anytype: - swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec + swarmKey: /key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec grpcServer: - listenAddrs: - - 127.0.0.1:4631 - tls: false + listenAddrs: + - 127.0.0.1:4631 + tls: false account: - peerId: 12D3KooWC2SctmKSLWqmzsKCpQBo4iqNzbZhWivM3jbhovB4JFug - signingKey: Maen+w6qwWuS79RZyMbuW7wnWAox0+rMinAb/gsOSl8gz2BLCfMlwXjlo8NLKfFFZFNUzl0ANTxbrK45Be7CPw== - encryptionKey: MIIEowIBAAKCAQEAonOsG0DzAzGlR7cd0u31DS0xoHihxdfJwut5JMtLKqGwkUC5RM+/eTa96hKYp8ED6B8Q4ZBhmt2gQnOUQJpoAnJ6uU/HgQVVhsJD7uMQcyVWr2KZbRK2GAohxOiW8JaB8pLiIRJbOxaeIu8dGRTrTTxYnh4IbIUgMu5x3iPW1/6YT/LCN1r/CBgHnPLtxMjAdUYzz9+LC13sZJsanUot83MTgl+5unEPh+ogbrSJ6P8FAAWW8HHD5lUSSb2l8NFRafYWP4o3vF9fqtmpt5I2nK6PaNh+4YXB7CX8Nak3AYuSO/aLGUtZMGYv9Qqwewjk/ewEGNWz33D/Hve8+hctXQIDAQABAoIBAQCNY7/XuJ/Jl9wSnv4GJ7Ww0jTvRg8G8tlYHTpDG+1AHZpf0cVubqJoDY0dvTHAT+3miaNXryJEd8CUFaRi1gDQoHLP9u/dC5d0wn/92wLmNQlNfLOsiyyRn7/kccttepF/XvgRcLiWpQjdvt/EhMCHaI54kAsk6Hkt2vqgLPFA66MH/5AMyf+8RmouYvc1m8jPUVmkIZVkoO4/6kh0tZS+rGdjxB65zDaoBx6CcXAMkTWe27Ce87vfGwCRySGVGRg7RuTJQR8VO3oSmsPVIZ8A48fKPQvryrl/5ztvE35lL4i3pdIbd/CJ9zTKIEM4nyPWSmxsaxs1yIllsj3BFpDBAoGBAMzWUEBYm5FH6wG2GXigkou4VSUBAoKCi5XmA2bwCUZx6CaG4uk43cbYpkbLpIRchfLHAeVCiaOYe5VFvYMth6o+OICEKfXWEwGqjtWeHkyIQIZ1Yo+BKk1rbzkYa/n3a7Mw+C6HsweFq1v01eTChmMr/PF6trFQiJJhTGkGKS2/AoGBAMsHKMEmgw1/hRqiEai73AVLSzXGoHSUWsM1vV05EzDyoxkk8Q/+sJR/BOp4HvJidXiM9B0hSOBhkPZjP3TZSQTKXwMGY+Hcs0XhwGxV5Eb9XdbD5rhCT6eVUeQeP9W9J34RdobJauG1Ld9E1U0nKEI+ls6VZf6/k+ixDOa3TaPjAoGADI+7/iYw7Bjf9YvoRfh65CyatBk6wSwmSTwAy2g++V304Z/1/F1rZE1W7RKB9UgDQt8nY5rP/ANW2NGdDJVXM357Uo5IUHYfVkPSXJFExGa6pkQ+lhRStsq22GaCAKNGrId9QMU7mmN9HbeHAm9XdG93JIvk9jy9E1T6LZqeHdsCgYAXsvQ856PwlWwSGcz550PdklZrJo5gTVjy5HkAQsNMuWX0b218MnymONV4ESF7paaUtc9g/xukpX7oY9lqaFqvpnfEwKA0IzEB/UIa40PMTZMAmMl7xLHLnBB9ElLdPkE35A3z2dsSEbYTE9PaN7HpWaj84E+RlwdK6C/bVpZHhQKBgBv8Up6nOfQyW4jiRo5CPOzXPYu+tXfsV0lKbYAjlp3rcczsi/BPXF6tLZ74/f5Cp2NJxx1GIitjqGzZ1mhkB8Eimuw1o+uNRBRh5BcmQTXPTxrrbOsYzjBJNb7n9HcHlGivcmDooxP7TgRJydEiFdpoBhjU+7yGJTJk7YdDLI3I + peerId: 12D3KooWA7AHfBCyNPQaMnffj8S7Z9kZzKG6X1apLgtyP1CgpXiJ + peerKey: +KIj+xVyg241tP2So4JmRNGFFIgtzK1PWUo8El0e5x0ETXCrCksPkLsA8s6Xww0DJy92dyISwoBoMQ7XhLbdOw== + signingKey: +UF/Do2KPeBLA0joKvnJj43jiH975JcHGjkLIkLR0p7FCFHnR1r/w4xLSa4RTjhEAQ3sDefjktShOJpalXnGvg== + encryptionKey: MIIEpQIBAAKCAQEA7NiHF065o9BfTTAWtAItg3KLqvFnRN2WVQMkjMZ/BukIj4UAd196ppexh2tnDvvqW53qVxFtXcW8oFqX9GmDJx61nnN/ce2FhXNB3aPMa7g3AchlVVB9RHyS8Z49HTkn3DVRi8I8EnbpWer35BjnpGOQ257O/kFpD1P5FzvxyTQ2gF50SyiwoDzibyT2VxgQqaDErr9BfFQKBZb8SEBeLACOlzjb2u0mCv7NeoZNfzl2KsqBC8tiCyfNahhauGfU9ZB7PtHMC1pJKTtPhXhNhQI8Rp39dd+Fr3kiTJl3Fe1f4bg4GDI7LbqCARVBbtCjsLEMi1BMzMS63bFPrPL9ewIDAQABAoIBAQCA261j+Oj3Pz8ad7diaGzqvz9N2dkdlpFb30HbdYNW9yI5M1t1lvTb/lwQGVcQx+5RujDs/gZKpnJhq+hQibdZaVPWyW/lRB0I5hRHyf5F/QuwZJ79M7VztXMdEcKeS6JsJHYhW6PjR97dlQEZkJM21RTS6CwmGOBX/o/fHDYICNxIqt4x7x1Hu+A9Qcs3LWvWq0qAkO48jSYBDeIFJ56BdXZacfIv9A7aCGWoVvih2vFIFEwdn+3z69FHmcW8JzVDK+WdkegtOlvuPcFGgDjS8cHq4zuKyEckur9EVm2Wer+GRdY2v7i9ypxiy/Ej4qJCqJLIa5rtWHmB9Dz7IyFBAoGBAPlIMpu9vAhAhJUeO48vsuEDdCn2ztyq2h4GwYcuNmfZUAnFdKRHHAfb48P7nR1uVCEEvnJYF9uUFkot8zljkDCoqc3J30sOd54PT2Jqn2vPhSWpjNJGW4Ku3CmZq/vfCH15z+bcr7whtlEswshE31bykbZlzCOSyW1tgfz2I+ydAoGBAPM6iEV6M74X+M4GoVCwUn9JMFRUX/JONOu4nfNT+1jDeABeXzVS3gzLSMJ/Vk/+1a/g6NFm73bt5PYHR8jG/jrT3xcTBPUiFj038w1MAM5Fsj2jSnIFRYFxwH8q0RfejWvKJRyWKUyTt7m43VRY9P01+YDfgt+VoLs94rV0PNr3AoGAahmWoL8S5xg+1hE2HG2a3zbPHIVV6oo1qA4MFPNQaMcPz/jg+oLhpV6sBOB1MO+ikyMnxBdGoEjZa90+5rA/0NYY3+QKTDHuK7IsgaEMFaEP9MXDkEQt8uNmBbbIgr2dKXrNSF+p1JMsvEQm64KU5Lb92fpd9s4lOZQgfYBuLekCgYEAwNvPg6+S6Y7edJZjQLSepVjmHmfMsDd81M/NRkx4Bvju5PPvcDul3+UsazRGvyVkUJH4aVnCVL3rB33cWIIYwZKP2R72llyR37bGXOu/088FtsQMWn59j1cf+HV91/xajHZ7mMAkPRj/3B6OOLxUfZZXoO0ZO6nMCcvXQGPLgR8CgYEA2W644EHrSwb4qsDsUmIEeKnjSejS8Vej4S5/g1YOyVzfWEr/5rtejw09Fv4U92SeYhp7Xp3C0UnRCduZKrpXIZJVPO8KgWLDtPi9KvHqDPzpQNRHMNrsXLpOLLv+bnnymWXjcyG8fRecU4sggaH4r1C/QyLPr+s/fLDyVUt7bC8= apiServer: - port: "8091" + port: "8091" nodes: - - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz - address: 127.0.0.1:4430 - signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== - encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy - - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y - address: 127.0.0.1:4431 - signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== - encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= - - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd - address: 127.0.0.1:4432 - signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== - encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== + - peerId: 12D3KooWLn13hDrZ6YRGM517fHf2zS6qhPNRu18inLMpRqn1YGKu + address: 127.0.0.1:4430 + signingKey: 3mzfKBWtn7mitFEgq8u4eysWOJ6ySbUs49irfHwcuOmi1YMpobz9anoqd4yaT1owZiRPYXqx5k2Z4sNVRE3kXA== + encryptionKey: MIIEpQIBAAKCAQEA3U7b4w9JTKE3TLM1WQ5iqdLbvUuozMp/hDEg7S15Gr6wrtLomMSBkfmVQ3Cu+CHdxAFqUFClItYlSFgtZWIFiSiQxCeaN2dmgczd9T4TlRAw6y6uJXtT9r7FIgizPP4B0/tnzPI6yYgpdwzCV2nRSjw3mMr5Nav3QYs18kYrJ1/Np2Wob5HOoRTUD++pPrToevTb7GNL/irrC8wXSE7oU6S7ix6Nh9vzEHg/V5FONBF/wWD/ri7Gy0j0qgUQ+gjxLWKr8xPDnRAve13zzo+54lGCyVvlm/rwCY9Jx378V1IuRx+S8F/GFuVozHD4XVaoSTtpCWPBQNSKDXgaIIKDowIDAQABAoIBACpMXj6ht1LMJXOldPbWhwkKYjFl+pdZxNGRSkfKvzDbbY2chhRcyp8J4vuG2ApY/rftxVIgd8+Wun1/TP3ppEE43aKAJzubqb35WBr9iGSfOZpZy7MiRUQN5kPBAfEQY20OyiIj0hSez74PVD283eGgbMfpU4Rsn8+JOgBaZPkbPViJLJY8PyHU6vwWw60dye1iJTz9yuBtoEqY0XKxnLaVXTQaWx0Te+VYU8twxDgXFWRaXtHuk7xnxOkCZDLrzIvuOYa5lsLoT8K62LDeXbyHBPhbdW0j4ZYzAOTsaUWpjuJzef9aj3JJdfyADiqb5iu6HHksvKzkZEau34zjilECgYEA/c8ZJm62uJMHNssTJYiLRw89l5hYwIZ/1TXdFRF8+xrTin5opYjpscSTO5bY2IYqLx2xuPiJCY1eGGB9L/RtkaVh51ySzq0d+4zpPIRKFcOOgdxHwlgoCgIhQECyfJZNMFGBUIlPXZ/phvXOXRvWFzDPhqThenVG2QzF+wLP0AUCgYEA3zfviQFJ1FOKJMozYO3tUZFmsIrAcO9hfuE7uuWz0Fw2m1XiwxjuOr1RbsSsh/lKke2h4tiGrlfiFhwCpIp91NkVTFrtFOQxbDxkYLkFiWkZDkOaK9YhKMa2cgEm3p+RGawokjbm51LKf+cbYN9xGaAe3y2WzIE4kNpfWE4SXYcCgYEAoagcrrvpqZoMCDxED63ud+4fHsUsEkQYe6Z5EAg5gH5PqnBlGrofjthTpqqnpxGdILFbFyNFtU3TVtduJPMcLp4Vw5TU9MqSxDu1+pOP1FjgFZpGImSf6+/7Wb9bb7sToujm4nLymAFYblt1exxVuiOeqnWuH58+5tQZ7YyW7DkCgYEAl7WuqZEkmpiEpWh/7vsGdo+6GXbUQG2R9+gg7m+7/HsP6hc/XZYOJAIT3JLzKB84nWHCyyiasNeuI5S5/xbZWtaH8TNDOxW0uXl6R3q41qGFk/pCSFTqiIo16dn6jwgoWCh4EpgZ61KLqs5p/zcd6Wq4ULrtaOTSizC/6IZ3WPUCgYEA6xCJy3+ICCgr8/c7hfd2Ylb3aOsXIffdgALhXjDcrNUCqgB4R+S3WReAwrABemQGl4tySQE/1f3Ru7SzMMciFogGyJ/YSXqSi6Y8oDD7MqlKPiWlN6WY1nSRMlLbkUOqpA5JaDM0kcmXjZpBBQr277GOnh9uKN8zUy5xoptctxI= + - peerId: 12D3KooWLtuKtCPBYrFJV1NdejiCr2s614ppe9rmUXnkTHtAUD5U + address: 127.0.0.1:4431 + signingKey: 07JMoW5cQUtGO9nNIGQo9e99b7Wf/4YvTtNEA0lt4gCkmhwB1EB9ay+kitxVJJgmdyGLxbUUlGqwXsAj0zlHWw== + encryptionKey: MIIEpAIBAAKCAQEA7cA6J/icl8wseeXkt8oJr5AeYadUAG5EdCOdHj4S/Z7ivff4MOIKAeQITpq+rqhmXxOePYXSpQXE20Y9PW9tuw4gzOuq1ylSG/MWMcLDH1eIxg66rnmUqUbdiW4GGJjVjc9jvN0Up+MfSrUF6fM0jWTFoXVJQIeQQGERCIYjFzjfBl1xYvPghdxNgei/K5ZGYRggT28143XdIH4KTXGtp51hAKoyY9eCqYMtm9wvjxazhPVxO2CsYaqMxBLshY3jfHNqJnx8u6+h4Bl4uUcdbLNUgMcEgk7ehbQp2K0CqNoKXxbCTI6V57UVcJHDIaO5B6FyR6BguzHHNPJ4yd3q9wIDAQABAoIBAQCm2Mf3VRlPzhFIWnVwJXE2q8Umcu8Yfkm712Jj3twk8GPfPS4H4Bl1yjmqMB6xI6zz/CiItGlnNe04lMpVWuV+6CNMq/ZwmKbuxmFE+pFEZYGuvJd16gzR3tGJqJTOnjMAGhK8b8oXJ+TF4NQNooe20ol/DXgiuQAargPuH3RwzjYmF3N8VI4KUc3LaG4TwVXn4LwPOxrQSnfwJlZwLml1HAKOV0qcG0mXX6ZXOpoVhEoRPdQyUHc8ZW+53Agbtind7bYh5TsMVDFUrcgNwnwTOsWjil049la1IJO2uMRluacKlrtyzEp6zqrW8ZJO7mYAO69x4WyGqf2ZgIdA6djBAoGBAPqRHWAIgPa80eXbwCYkRtUG/ONBsQGi7+wm6nyhkXvNXJeokgH2DCgLH2+fW2scfOJuZc9r5WftEjOBvNfr2LDcwdyTSTh21WYcPSZx9HDf2d5/SWTcjNcyU0b5qfWIUKi/Zm9UY7r3X7yMA5dUD/cvu1PBJ5NWFrK1Gm2ph44dAoGBAPLn+LkHweU0fbxQq/76T5yVVpMKUaE9xwrJlUxEDPAQGnLPbFg4JeUt/YPhsOV85W4c4oQE+uFZrF0uf+1fEnS6MOJ+sq668upzC2hBp1B5138wM7615v1rvXVVH6qXfFop67FdBzPHt1NAN43mEIBZHTQ5hSVXFlYSZp9mxuEjAoGBAKCzUVO2IIAeub/iIGpV+dfGk4ptJ0kVZyreCqXEObpdC3V496uqUkGcYJ0GZ2ta6f2PMFzHpmnw8it2mdchu+gyrWL6U4uTK2pB0jZF/7Ak4WaB3GCD0xBxhleO6CJBOvn/R4M/bHcNEKmsYuE7WMIAKvScfPVR0VzsKfcLM5VBAoGAVvWg32zdh1bBZLdku8WU1rPH6KAbFSRuq3f7UPBTyWWaclu7p+GB/4f1aE9V6vJJmKASn7zArAhUYo+REMOmcc9uTMea5F7dM/23qb1HTtIvycLR44ZviW4Wx3iP+5x70jOLw1VQjMME6HLm8I/afHhqshWdiv6ganPv9UTwEg0CgYBSDi2dqg8F7ij5CN+LMDLSn3b8GCw+7efGIt7imm/O2V/FlHD40IA6qGg6DXNQrnoZQt94nMb1cZEvm1dxi6rmQNrhCyoMogAaPqgFhZGq1OjmhVZiXFUWy4WAcjdzFc9wZd3/XtaofRKHLK+ngTFhhVApKypLk3Rg9bCAAjzyVg== + - peerId: 12D3KooWDCypXSyN6ppuMZGxVnBd1ZQCMV4y7Bn187S4duYmf8rA + address: 127.0.0.1:4432 + signingKey: SGyNE0dFaQgtgNuzdcO7LB+TEz9VHAOtlQLk6WWkrkQyXiZV3casg8Q2/4PO1Oylc8Fu72RU001Hclj5JCbiLw== + encryptionKey: MIIEpAIBAAKCAQEA0k3mw4FyexRkLgLjHzYs4Ppeyv6r9ZrP00imNf15JTuM8ajMx5oJX7JQTm8KOLRJjUdZZAd5Gtp0ezfYAQK1ZjEWwCmfp8j8FBgJIDSLpjxl88SXMLgATXYfhklnQvKlQjs/X3Ka4zdTrav2tMH9IAo6TSNZhlPQNsUory1SGHs+KqHv4p0sG8oWuKYhfBj8rWHQdUVptkIBKgojFDeJJD04Tbf9kUakbK/8KuXB6zF5H4WN3p4rMMwkClyTGeYO4LDg5TzVn8NnUi3/b/vO/3us1G/TMoRe/6umUfpQxrwo+7S2T6A4YwetWRp6xALLhp+HfAWnn0lA/D8/w1WpKwIDAQABAoIBAQC5cdQxRa5rddm48PbSCPWeFWkNW3DLDI6CYyedqDvxZwer+QtKXzww1I4X+7ZptiC9odLjb+uMkGHyXZXtnjPTPyounQWZ8JLILUGu0mbqWYwVXp9raHVr2OOHiKaz1D+BnbkOM4L9JUZ2eJL9ZaoNXLd4WdmRp8qM4WI0xqQDzOANx2HhyL/+dJmQeIUND+pdeH+Z+fYowU3ho32txNvBnMXQhF1T5K9i1VO5W49RAjIRbENsT+paPGKbNubDHRt1j36ktK4eC4HSdgv8tccdsGyrEiIbAt1XsTZfM8ie4D3A8RhSxiTC6Fkgv6vIm+iFTLzBFZKesOBcd8sfKeyBAoGBAOts5PQQJhldPDzlbnqzxMOR98WHbkVZjCqWSkNA34vqyFuPcRuX0rHK/qpg23ilbUP0fGMDTGgFzTt51FZLL16SXyRfjNhzjdmryryeddQwbp92ta2GEgnU6t1FyCuSCtcLDKJd/D9A9dC5UI6z+ES4TOnbR3nakXK9t4cUOFthAoGBAOSu+wL+SEA5erR+m3LpOsELK68CCJQPxn3VpoVfJZawgF+fEoXVMLTERxJput1+ADomIEdNc9ex86TjKx9gJ4piNHscRPFeT/AgESOIGHLOc1gk2DPqNj6wBIarUJQ9t4KcHScboh1dTPJeqqv2NSwIiLQoqFUIhfKZLnrW3zwLAoGBAJh0hC+o5YM3ZXLqAIllMN6VACbidP5j5ukNOjojIKCzAdyJH24G+2I3WoNrBbUzK3b+NC7KTAhw+V6ynlbjiWFs2D/twH/LFOkI3tkWpKcsVfbeIPimAbhsMUvpjJ7qjCqF9UCQLHGp14W6+/ftg7C8yNIINlkquVXclaTb60MBAoGAPqmL8ogG+EJH00mWAujRxq/u6meePiQMedKfbJBj1mTK6GjIRI/kZsQZzXvXTnYGTejAk4kvov0KDDaLTG+mpg6+3rUiVxlGwj+nMptKR7s2dAK0k5UsBAVrWBN9YwF+VXW9r0etJmq4ePljvvcaHtS/0M4LQjGxsoYy7EoQpX0CgYAhnf0McB7F1MxSjB0soMNv/v5utVzVihS3re2yKNdkI/YUEMB+yU3Q4gh+OljjBM6Y5To3BsQBAx4l2CysMKFHjIE/5AtdbvIS+chZZqB3vcZXSayvX8P1Z1uFdw/saiO2cRDJmR+TxaOPa2C9SzDoNTACthwLErHfzvEvVroKmw== space: - gcTTL: 60 - syncPeriod: 10 + gcTTL: 60 + syncPeriod: 10 storage: - path: db + path: db metric: - addr: "" + addr: "" log: - production: false - defaultLevel: "" - namedLevels: {} + production: false + defaultLevel: "" + namedLevels: {} diff --git a/etc/configs/cons1.yml b/etc/configs/cons1.yml index fa8d4430..eea98cc4 100755 --- a/etc/configs/cons1.yml +++ b/etc/configs/cons1.yml @@ -3,9 +3,10 @@ grpcServer: - 127.0.0.1:4530 tls: false account: - peerId: 12D3KooWAB7hjh7KWdLz1nxkb8VQ4BU9ZfMwjAFNyBB9NnJCw7AP - signingKey: vE+fJjNKXf7y8hW7IXerySK+Fr8b/9WRThM5/tBxww4FUNczjvzd67XXrdvOdZtYQ+QTDfwItNbLwbzLTEMOeA== - encryptionKey: MIIEowIBAAKCAQEAtYh4UPVQGLUx9sGYEbItTysmrM/MIpNHnZQaGhEROw6n3Uta5NI6nUCQ7IvqGB9ewNKOsED+7zY2QjZ0RGB/qn7cdRbizxDydx+UxFZy18J2aN4zbK2eoxwn16pGVk6asatzChcfYnI11Is3T9p+5/+gqqfhb2NYA2xU09g4V1nnsyZYWCj4mHcz+AHjhCjFrp53XXp/A8KkBC/gzPH1ic4sRxtjAXG5De/d3YpSD7ejnc/YeifilOJj7wPBo+DkpEZHGu/tRYQgDBWlVIc3oQ+KygXsC/inGODrhg0tLlVSLYFdTsktweKyCA9LKR1y/JNC6F8HbqN9ke/ENsvlSQIDAQABAoIBADmHWyHE7DI4UfIyHeAVyDgbo7EGVVnrtLlicvcpy30cwuPlepOjcAHfsU3VdUVZw6x1zdRbdK8YTg+jtCrrLeo5M+JDc3NNmplXv8yM3O41aVMIf+GEEA7+4D1/b7TwSiPeAqIC++Y17YtC5y9+PdOF9kO+2jlzkTPcg/Fyx0Ae7CIXnfZNZwsZo6fyhstYH6bKe1pJuJeWxQmSMXZO34Nz1qXpTu/E8cevu0iQtAOfyXEzB90i0+JdEe7Ckp3Pv9iCBTMVEZJgNRfXHdyuTr6e0/Tjl5ezUJg3IE7tlP2B251j8cC8nUNuXL34aZ1FPwLKf+OUkTJp+7cGdA8BMwECgYEA1NcKU7/wgT+vfv8i+ENrz75DCRt6MJ1R5agkApjed5T1ExYk7Y/qVBVNOCZeK37z9ehCJ7zft711g4o9XB4FZF8gJFD7TBbK9XzljuIcYartPdRYuugv5T0/xTb3xKQp20xPBmgLO/ZazPrRq83dEISwBXsx3o2t2leQLUm/bmkCgYEA2lg5QTPuZQYplDCeiwmH3C2wo5VMwQQyfT/EfMJ8wkBKoe1ndCLNxPvFramD7gJs6iG4nwynOcdBCpmlxvSm4qQo8AEWNcexRZPVCenw6dgjOvRswfeodZcM++HHByaAy9PtSX6YM70py6GbjV1DKreR9BkFT/C1wyosxKZno+ECgYEAoVr1RVC58AJr9YdO54+VaEUBZSIjnD9oGwdBZYanAVk4AmRDUqZMK7qKdAsCUU9JfB+8J4wUvqMvN63RnshTpihHocCTArg03a72CUB568E9YiZdrjTgOpYYhlaJt9YMtWhAcMbn3WmCpOtxkSHcee1d1In04JfgOSsw7mR+cCECgYBUbu9dDnburA5iFtcITxwxgZ2f9Hkk3rmjg4g48oCKIZB6w7JQz7CgrvfHaxjwbhGuDHI3Vw5Hooy9S6M2p57tX6vQ+6qaC2m6zSsB1WxrEUC2aJSyAVIsfsfvk2SCmFoP+Bj3ZbP3tfu2mfzsEpeJqkkPiqlqO1weZ22+cdb8IQKBgA0hmqgzYG3X7/BifZfrm57xNU7d7B/ffjbQwKHMV3Op7VQiCcGc87Da1IJiKmm/lk7lgWNDTxFnkQhqUEYo1/ty9JmNeq/OClTkomYiUE+4xs1H1f3oZ1kT8iJga03dS3XvxJOux8UDjJymqFfs8xBsbvBP0i1grc/fZNLkEtfa + peerId: 12D3KooWA1MZaN1U8NHDnkvbN5wsacRGvbn7dd341S4pAzXofSng + peerKey: rLHblNZKOvJxnAKrwIlxkWy70J3aXDiCYVr8iV+PyQAC0LQLKUjXGJzqOdS4tMU0UUPGNo0VQx8q4YHqqt3KLQ== + signingKey: rLHblNZKOvJxnAKrwIlxkWy70J3aXDiCYVr8iV+PyQAC0LQLKUjXGJzqOdS4tMU0UUPGNo0VQx8q4YHqqt3KLQ== + encryptionKey: MIIEowIBAAKCAQEAyzE3C3bWEdKCJ4HbBfP0psg34ZsdmiZcflOu55aLLnl2ctzWv17SO6dU6C8XEoVtJA4V+tvfsnQTro6sIy7DDcDpGMnA7HmLHzK9GFKQyC/9EzEFg6s9F4A6ZkW/hyQNNfE7NQBokJj+uvSXzw7wb1b535hvg+o+ZPdeQQfcKFIqZKQWMXOHHSseVV4JH2kJ7BNgvmRU1EEkZ/l9FmrdvDDSUv+SgLz0ogESQv3yR/bwwa07BVaMCAdwAMZAcD04KUjEGpEmHfsDERYRNGvOJ5bnJSHTI9QEow1P53CtOMVQ9Ak3YhqyycGtvaVmrY/CfnFJzUbb8IDmvgW6jw/rrQIDAQABAoIBAD38mJdFvI6ZUp1szv1k6/jJUcrggEpbc5ISQ2RhF7qo0Uq/NkARVD9gj9V5MCe1TpNWPLxXwUl2gd6Zpcfh5x1WAYZPXiyF87wjxW4bGhIIGcN2DAGcBroZozc6BfDbPbB8FBzaMAwUsHkmTv2ayByfQwFERpjOqBQzJqzeEfq2cxFovcQdyhHk3WmfH1+zrGENs4IVVmfmIG1LzXehaXJ7jHqlryyKyKpUmXOmymEtSB5It60pl+9RNNlaez9OzreWgE4bQaeQU09I8105YdIISmvZWGZ6PsBo3ma+Rj+si7zYGLF5CsbGxT+U9olpiO/DW+UbfrDHy0bAArlDOD0CgYEA5dI1b1GDwAifd4fR6Zv64AMFAFMo5hWW1EHsUtXVo1UD0IgheI0oxg4aqs93SkL7uMVrM5rKjfstFcpWfaSfzy38+8mneRsbsI4d17RR5g0F4D+2/uLRYRRU74m4ThQjfP6wf+eDAM1+rdmT86cyQab5y1VU9hqd159xCderu+8CgYEA4lZ77Ygdy2mHmfdzFyQ6eJJhsC5FoapJWnaw7LISEiJgnAun+qeIl1r3yFbuNK1Wx55qfdvz4v7X0KJV8HwFgpxzT7CoUybT3SncItWPwi80tq/lxklZvq6LUeOiNQrpGvECCUrPQ3Wdl0lcmOiUw1GXliAQEVdzBOT+0hGMZiMCgYEAtZ76O47f39LwszXS3hs2l/HK8gbGO460M+olKRF0VC/LY/ExAmQL5Pkgefya+UUWSV866P1bNflaF+5fi8udv81IMHOctkiGCXFGhEEst/Fyw1WW+LenYGEA/oyH6qxfn1hng60iCnBbvGhGVDe9r8SVg+tbyWIfe1e1rWGThmECgYBltGkBpn2E7wmw5OGBj5T6owRkj5ZYe9V0YgtEgQvfvDTfSdmUp32YTZc0HePyJcXt80B1B8ZCxTMjHB8z7fbn5vdl4sLwgm0HX4z81ixAHMg6IzZD8Kf0KCiQhpJX9Wwj4BKDLGuQK6TB24RRbYmTbvGH0yaFNF+J3oCm0p3dMwKBgA1TTXLpbL5lnBaAaWAHYSV9rtqvBkyVfcnB9/Ez9MNSBOQIbk82w9Pb892qjcNhTAfgRNrYTd6JZl8Sov98T0OJW0uMHFV04NSqo+RLQTaGjMfrWQ2ZWfSM4tFkoWA2mFh+R8VblzTJObdu1zDyuVYscfTv3sFnV/QX+zJWJipB mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/cons2.yml b/etc/configs/cons2.yml index d02439b6..48bc0bde 100755 --- a/etc/configs/cons2.yml +++ b/etc/configs/cons2.yml @@ -3,9 +3,10 @@ grpcServer: - 127.0.0.1:4531 tls: false account: - peerId: 12D3KooWG3ZrWs8Q3kQhQeXp8RWw8FKb2cThTFwD1nbRMMNzf2xW - signingKey: P3a0z3Um1QJ2lEwqcaNkVXwMaFz/Xmb2na4RqO79Lw5ch+KZVitiA6jifmRQkPm4z8e1wIf7Eel1VnhuhRuZVw== - encryptionKey: MIIEowIBAAKCAQEAmi8Yvv3F9/ddTHj4GscR37pr38/NbbDfOtqoervlG1SE7zJglpnwEI6ThhjiAPaXr9UgzvIne8uyGk3ioQz0zDO7X0Omq8wPc1rPDmy4E8mcJyaLyQD4RiTDIuiOKO9+sfWzOwK8zGfPEmBqnfccGOlRelBuREvm4IZnP6HXKetRxxdIexe+W4ZRZN+AuaD5+k3+CPs1l52cIEuBWJ27piiX8oL8indy5gVdNyFPKoTeysJb6pCDYoMoe2EobovSX7hK/28okyJa5SGAVzJpSZCAzn+VljXu4UDMMiWOntiOElsvHuekySg5dAs/LO3lohDdPo9ITAs54P63MHN5cwIDAQABAoIBABDaEu9VF10p2TWxhxSOK4LzgjTdJovVqCBro7x+auUY0MrAC9SKELYOj0s5zwHh8eRS/BoCV5RtSBMd7iZCH0NuaA1afI4MaKfoBfeCpH/tKjcRPHgEth4ciIN5PYh13Lggra1GeFIzCmvsw9puFtEWN0SSI+stDJf/uKs4yiaXmU8xgKplOx97hpTXYLV007mQ2AAZ9ZB3xvUAfADHTtOI46yeO9HMkjoQP2noHyFtKoPXzvra9HBq9M83ohPEE7bew8FAzgxeuiJ+CNU0MSvrW4JVPVcxQbxqsbWJSY+y4HZ6bqFRx9xz6e4iQqVH/XiQWQkET25/iJ+PPi0PP0kCgYEAzF4pY/F8nFnDmi3H4v3p2g8xlLknJaQmvMP0o2L0elZSFJ6YPvL0iOVM1T/5nFjThDOXtux0lSis3C5CZK7LRGQLut8G/5OC290vkwKr+BqqZZ3KIPjBO+RWsOUD2+MBBjQBGQQBy35oQ1Gv+MEUjar7gXRYRhqOY3epQROp0YUCgYEAwSM1cprDtsyqKRpcAFf72D9K0P5F3i/Q0BuitJmV+FaIBa+y1C2H2FxW1rqqScw2zmKeTYz/L4s8paShM8b3SjkzK5dvJ33BN0tqJGVSW06LffLjkh7GVIFQGhPy8qLPDgVY3goDphrnMH6g3gH3ewqRWispu7jwxW6Xn8YIlJcCgYALg1J5muUWOchXKzUTiJJgAnMcmcGm0TSNdcyWV8DGE47UMosJIM69140Yhl4dfLONwwpM980pif0S+lgrK92voKM4h8/xHfJFSJShh4kAlR/8UYNNkDXylc58cKpi/MrV+qAFNMCVIi3lfPiY3ue1g2hfxpoieOSEnf0e+WibsQKBgQCB4tXM7vvz8Yv1/H4m1QTPlzEPgBEorWt2qT8wyaEr07XCbTiMrNoQzXixC/P9kVLCVVw0tz/ej3sHwsGOep5P0kvxYvQj0NSiBRuqwmEyeo4g87nLyNqEdjqSbxwRxSAOQ9ZR7NYrXShhWqeA5j2zB5Zc125HisaRYCCkGKAonQKBgB5CGTP982bbrlmh7bwJFQjQFD6ufXhEr6X8O90yw15sdktp2+bwr+pd85602kqfyN0Ksdm2w43AeV08OxJBQDDSvI6LspS/v3aLXhWT6LPqEtH/Qq8KH4I5UTUsoa2rT/iyAZZ3zjT5W1D63RbPsMsr2ZMTC0bRrCvaCVKfX8ys + peerId: 12D3KooWKyYmekF5ongQGMwBgx4ZsPDQiyFjHtd5ZfKGsoXTYY7h + peerKey: jRWkSxzPtg8SF3rJ7oqhby6UvS6fnWGOO2GlAePHqkWW7xWHE1XC2R8Wt0E/4sFVhpam5OKqyIm9aDsWiILHmA== + signingKey: jRWkSxzPtg8SF3rJ7oqhby6UvS6fnWGOO2GlAePHqkWW7xWHE1XC2R8Wt0E/4sFVhpam5OKqyIm9aDsWiILHmA== + encryptionKey: MIIEpAIBAAKCAQEAy3UBKE5OifVxeU60KbYUQ9OFob6uixxauUVn8cn24ZX9C2qPAMLQGTYBcWp0GKILqRMgcDmDV1DXF4dNzSYQE4qFDvQ0C5ltoV9vDBAxhyDEN6nftD4K2vvn+fBVYYAXJp//I/2YcdZpOzu7KFHPst74tnFZB1+7LX0oGToGzevFKgqmvoQ1LUj7OqWnINBz4jA61h2WMp11j6/BO71kEeMdeMJyhmO+w6oFlLhd3b6Vsqd/nIc4SKh0yS3jdn+OchgQEMHvNL0KrvExPwdnzQGtU9E2nrf193loeFoCZayX29x+aDgTah2V8JlcN2do40q9h3dJJ6FCgJkk5gBz8wIDAQABAoIBADy0Ym4GP0TGaN8K7pJrc0xxdjO2UxnKkf8piEQKQJE6UU/wsU5G0hRTmsaePpmC7/u4aztQzbFlu2eXxUzqiG1sLRszHbxAQQefE+EDi+OHkUQSeV6sDE0eUC6w2KjIsR+jKVsxtSRyFt/HiKYVEuWJxaeZ1jhvBcgiya4NNC6IG/wS4JYG5iPs8QZZPDT+geR2y1jVQdttchVGxKbthMxDBPfSlG05QFhb/8frCfS+jqBHla1e3UhBfdlA6elZW+IxOoxoKvLLZtMrI5+3D162ZBsfoIGXuME3YqovMBdISnRQBbQ9gsSZlYQsosWofSd2JPxVOm7YdOmOIo4sEcECgYEA3F2W2vQLdxtJ+RaLPrGICtNTXwkP3Fi5KGT/QFGCguJpGo1Z3sGgL6dvD0iKBBCTcmyDj3eBGYW80B/2J+tRiAt/0ME413Pfa6txl7LgKNDlFgAb4/ycth0TocQQE2oL1OawHBr+BiE2b5IbIOyi8wsaQNdtORYzRLS9clieWKMCgYEA7Ft1H2/HAQMBOLeyyn2LMaPkewe5TM/6K+CoDA9orcoRmZ+B3ht2iBkcJE3Efa0c2YDDbL3GENfUzzntF91auyC/aKI3A8MxBZg/6QEiTytgcvbCSeXkwZUCJeNr+BAFLiWOE26sg8P2cJPT5JfjgPkqA4dLWvqwvMFe9LcInHECgYEArVoGSToAJvNVrthYM7puva1egX1cd8dn6OoCjjNQyuuXKOcXUo/ZFoPNbyVuRSJRC4tntx2Ydl5pmQP7nY2VdsMtCihmMb8ae9XDp0V050blX/g3+JKJKQ4YmoHk75DVu+a5lXJ6cJICA6TZKH5e9Xi/b1DIwEbBkAPqoCAseKcCgYEAxSTj5HzPeMCQ3EYdE1j0KUuS4CvpG3C+MqsIgEa6AXtygrjREfnGPG71UjKrmkgysBj+6EzCUHo2P0MJx8YST9NY1GW5jaHZ2djMNgWEIJUFtd6s4Aapb+5iBEhVXmu+ZmdcwkimDKH/hJdJPnqSgJlTue23pQNFN6vzEBs7S4ECgYBhY2YJL22+btVAYR6g/pOkn+50h8S/TtEH+NUL0SKnv8N96WvoBjUJapgNNrWPzzUgmGzS+uSweSTGM5LFeidNU4tEHZ1yNt7nrlnaJP2anGgVp3JcvNQiy1Ffwvs1efo0c8Tc+fORj9V4fhdctpSAoISETDtoGcZbQjUtB/aqYQ== mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/cons3.yml b/etc/configs/cons3.yml index 7afa6877..c6eb2d44 100755 --- a/etc/configs/cons3.yml +++ b/etc/configs/cons3.yml @@ -3,9 +3,10 @@ grpcServer: - 127.0.0.1:4532 tls: false account: - peerId: 12D3KooWS6PKUYH6Jedkjsut9ajgWSvn53Qz1LLACoPJX6dUbtCg - signingKey: 11vXVlqQr2e/XMKALUPhMgnJEtZ1HKaDerxXvhNvYfXx1ZWt16PoEMpy/+ZHA1gw3ErI9+2/6auhjGC9InHskQ== - encryptionKey: MIIEpAIBAAKCAQEAy4PQ8dL0gUmtumZQ3GBmHW7CHsuu/VIMWZSmfEIWgMDqrUDkIQxOZ0+hEDUbtCbAdbklgVmvFWUL/F9frBp14gqyMQG3sG/2l9UsQ3p5Z/jRM/peFCtnUj8Xa4ktsOcKFrjEDuBylqanBCpVXGKMDN5Tx+c8ODaXgdRj4x9vY3BN3w+vxXBXIYDyN6H4SesD988VobW42mveVKl3vaOFDf38LRZUe5T0SUDt4wdeAN/pzpFnH4RR//HYujarhF1yIrs3eVu2ltwrHBQoPTboIW+n13B5eqLVTJcXMAsIM+jA3XNu2ZrgmBLEKn0NZNhAgVvGPwMuUpgFz79rvJvrIwIDAQABAoIBAErRKdZNBGAnUvvMs3tg4Ql+91RU8v7j0/B2yoGx1g39XgjVa0iO+p/WUVLhA09GU8iziQs1ij0mSbK86TIfBClWX03O4NW3Q4Nr9frUop9LhLVEHKPzlOdSlGyPIMIBHd9ei40gjF+/4nSQj5MIE46DiW9bHfNYdnhfOV185/k430Ojm12gi6MMlm9CTysNSdleUlO0udmm5JxkvhosPENLG37Wm8JpbesmPiYZiT+jyu8YOaawAXZeGc8NSDBwovzjAAJ++/yRoKKPcsQUV6EYx47PGibV7aXEwbZ+2133C5tm7KDDfvS7sEQjVBXh9Iea4tmdAu3q/0wn+L5ACpkCgYEA5aIIUDdRUERJly9z0eD+iBA2DRNxi6Lpl/wERMkNWrUhnIVV2wDuKiJK80D5DDbszT/gXvY5oj2diKaakGMkj4UCGyFVRy1/2nvjVUugK5ABf2acWbFrgH00UUuUUwFf4UAjypIsJ4Ue52/l8YTVLAfDWXCw1Bh3h9XznS43gvUCgYEA4uIOAOaZwlLI8OKJcJJsDgJEFfm18tCq3zvC7z1z31CcjG6C30ggE35q5hceznom2gLZBLAMQpwthyLjZoVGESEDBdK6d+qtTN95qz3DBtijVOQ8VuP1q9YLMU2IfFeftlRnaR6eYZpAMh3+/fDXpjKaIYImJQalrivfB4nTVrcCgYEAvheAIkdovLWK5eiWTCuhCSnCVNi/qgRWs0YgkoCM2YYQKO4HwJ/oiGCTAwPKJt5g8RfruTDDTRcMjc69LMGlxlkpASR6380+hbMA4d8U3Hr9gmWDEIzanScIZDPYuU3t/R2Hg221t5Fvn8713xVDEovqnuO2vhzy9jOa04cq1PECgYEAhzuEa0cICQq9GM9+amnsHCF/obWYnOWBo9OEKoNviIEM/qt0OFBORjBI2WKYiyvF8pZV8nRYqm9at7y03Eu96sHJgnQLjySDLVnatJX4pCEGobf0uznfGhBX1YhIPQ0hdlUy2jZU4wpFD1pPvd8LOtXYhvaDc/hVUs51fpHJNVsCgYBUZ9fVCoSni9m/eTlDSsWtk+sL/0LkHT0/ym41wTdeFgefCdZMGFBu91z8Td5ol0yclJjxNr3tGUvINCuSzsM4WRh2f9zSjOka+M841WK31DCUmlhekjmKmYw8Ie147d0P2waVmEIdUs40aCiJW/hcV0ld+H5jg7Od+Yb0rDIWPg== + peerId: 12D3KooWLgWXJyeG869h3Awf9s7Jt7dw9ZnNg5ZFkMFKSHs6Bify + peerKey: 6DyqyTRgR35/TNWpEbqVm8NbbmOULNuQDYEk6C+ltyyhbVs1bhOkA2nigRoE6JFip83k2yVjsa2r4ST85kW0OA== + signingKey: 6DyqyTRgR35/TNWpEbqVm8NbbmOULNuQDYEk6C+ltyyhbVs1bhOkA2nigRoE6JFip83k2yVjsa2r4ST85kW0OA== + encryptionKey: MIIEogIBAAKCAQEAqCZtyjHrM7jUZNyZNchUAgYIZb27YRRsfC6ca2xgdbtIjq0ts9af1+JQcmHMjGyxUTvLjx4I4IPJzDF5KYRwiGSWM4avhfxKxVToW0j8UlqQH+nbN7/TmmQfW8+L4CsgaXcf34uE+CfnyoUnwPoWLe/6SI1m5n/99PcWa9X8monNoTSMoeSOCm/csyK+BBGW9BTOMgo+2Ceyu44KcERl/pdkBGmba1xz3SogEq1m7cpG2Y0Hmd9dyHVJU2jSFczVJQkWF6RuifRoGcjdtbRrY5E8LsF2CM8HeeAZ/0g/q7yoR6D/nCrWaejszXObi+GNEo51EdJW+7gD8g2U6vUqkQIDAQABAoIBAG010FbjhxRntiLwF94Th2RtEKUrznil8DPTfipTEG9GvUBVf/puqhBn38H6fQSzT5MoF/STGEbhsX4an8v0RbaARgGfN375NoLlu6gWRjMiuLrRg1y5DTEYWDmkGf/1Yq68/QmOr0URff1N8Fzo0ODzHQZkOHH6rTGeDYTqTY78ZfU17yGXoNSmXycAqbTGczBP1RvyDRd4mIuBg11E/+A4GBxe8QaSZzJsyfvtBi7jUqKgdDDDI5Gz4x90NZ90L6jRFNvlhuosGETQ80oyNN1soa6tVSq7UhGI7+wcJDyaXQF32/TnqIXArScH5gRLxHiP+FfTDCHzl5iZG5m/D3UCgYEAzHe6oorAELbpcRaUJQayOkMJIAI7KP5EVI2IbP1fhBaW+5BYtzGlxKZOXWZA057E0pjwO99rmVNs2rW6mU0mCfw9hP3oWv4EgszU2DEx1+iHhNF6cy/zGDh3lgDNXgRPoBRR05IS1Ffs8uEgVfhiVjtiv4FyrVE9fY2cTH+7YXcCgYEA0od8pJLXOhcj1ap/1Y0phaHv//ulSqLBtKEQTy36zDw9DfcIozB8LCIK/Q/3nr4RHmd1YQVRDoTB9pX8eUuoJvM3Do9CJiH5/0PXFgIOZZsDXtl/TmL/1diHw2isttDCQF6I+q5lRYlbA+oqc8Vko2c5LQchXE24oz9670gFFjcCgYApDSjVlZH2SSMZZ3Ua8fs6o1bjrE8Abfx+FWR8rWpN9NMfct28+iTUFKfLLMp7MndF6Rriinrp78v9JVtviAPJIXGgj/HkwvdY45MgTNA7Dx6WVhCFq+zcwgmQfly9MZRjCXFcTwmkxHp4USbS2+mycn3jATRrA9KasKHe4g5XBQKBgH/xPtp1Mr9m2Kw9FbseMqG3rDcRI36cMsQnLdYwxz3fTetyuZkTGiNn/O2WCpI6SAUGMttnc78zBv1oYSsFw4cIP+llPnoWI+vxuoDxdvZgoke+PhPRLlEzai5jKrNfYu3jhbNy0LDVrK5QXMRGrcZwMNsgfjGuOgtbxMYuKok5AoGAImYTQ6e0fliVoHO5CjClQRpj3oKsTmB4hwtMofSZ+tFVPOakVM6P4K8UzMa2jcgz3+KgLAD8awpHv0ISO+qdSwG9MgnfIxhz8jxatgRBXdhICHrnqCqwZqyV0hrVmuUeg0uXPN5AisvfGEiGpkAPsQCo3bhAqMD+4QooKCgpz+Y= mongo: connect: mongodb://localhost:27017/?w=majority database: consensus diff --git a/etc/configs/node1.yml b/etc/configs/node1.yml index 055c93f1..431d2b09 100755 --- a/etc/configs/node1.yml +++ b/etc/configs/node1.yml @@ -5,24 +5,25 @@ grpcServer: - 127.0.0.1:4430 tls: false account: - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz - signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== - encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy + peerId: 12D3KooWLn13hDrZ6YRGM517fHf2zS6qhPNRu18inLMpRqn1YGKu + peerKey: 3mzfKBWtn7mitFEgq8u4eysWOJ6ySbUs49irfHwcuOmi1YMpobz9anoqd4yaT1owZiRPYXqx5k2Z4sNVRE3kXA== + signingKey: 3mzfKBWtn7mitFEgq8u4eysWOJ6ySbUs49irfHwcuOmi1YMpobz9anoqd4yaT1owZiRPYXqx5k2Z4sNVRE3kXA== + encryptionKey: MIIEpQIBAAKCAQEA3U7b4w9JTKE3TLM1WQ5iqdLbvUuozMp/hDEg7S15Gr6wrtLomMSBkfmVQ3Cu+CHdxAFqUFClItYlSFgtZWIFiSiQxCeaN2dmgczd9T4TlRAw6y6uJXtT9r7FIgizPP4B0/tnzPI6yYgpdwzCV2nRSjw3mMr5Nav3QYs18kYrJ1/Np2Wob5HOoRTUD++pPrToevTb7GNL/irrC8wXSE7oU6S7ix6Nh9vzEHg/V5FONBF/wWD/ri7Gy0j0qgUQ+gjxLWKr8xPDnRAve13zzo+54lGCyVvlm/rwCY9Jx378V1IuRx+S8F/GFuVozHD4XVaoSTtpCWPBQNSKDXgaIIKDowIDAQABAoIBACpMXj6ht1LMJXOldPbWhwkKYjFl+pdZxNGRSkfKvzDbbY2chhRcyp8J4vuG2ApY/rftxVIgd8+Wun1/TP3ppEE43aKAJzubqb35WBr9iGSfOZpZy7MiRUQN5kPBAfEQY20OyiIj0hSez74PVD283eGgbMfpU4Rsn8+JOgBaZPkbPViJLJY8PyHU6vwWw60dye1iJTz9yuBtoEqY0XKxnLaVXTQaWx0Te+VYU8twxDgXFWRaXtHuk7xnxOkCZDLrzIvuOYa5lsLoT8K62LDeXbyHBPhbdW0j4ZYzAOTsaUWpjuJzef9aj3JJdfyADiqb5iu6HHksvKzkZEau34zjilECgYEA/c8ZJm62uJMHNssTJYiLRw89l5hYwIZ/1TXdFRF8+xrTin5opYjpscSTO5bY2IYqLx2xuPiJCY1eGGB9L/RtkaVh51ySzq0d+4zpPIRKFcOOgdxHwlgoCgIhQECyfJZNMFGBUIlPXZ/phvXOXRvWFzDPhqThenVG2QzF+wLP0AUCgYEA3zfviQFJ1FOKJMozYO3tUZFmsIrAcO9hfuE7uuWz0Fw2m1XiwxjuOr1RbsSsh/lKke2h4tiGrlfiFhwCpIp91NkVTFrtFOQxbDxkYLkFiWkZDkOaK9YhKMa2cgEm3p+RGawokjbm51LKf+cbYN9xGaAe3y2WzIE4kNpfWE4SXYcCgYEAoagcrrvpqZoMCDxED63ud+4fHsUsEkQYe6Z5EAg5gH5PqnBlGrofjthTpqqnpxGdILFbFyNFtU3TVtduJPMcLp4Vw5TU9MqSxDu1+pOP1FjgFZpGImSf6+/7Wb9bb7sToujm4nLymAFYblt1exxVuiOeqnWuH58+5tQZ7YyW7DkCgYEAl7WuqZEkmpiEpWh/7vsGdo+6GXbUQG2R9+gg7m+7/HsP6hc/XZYOJAIT3JLzKB84nWHCyyiasNeuI5S5/xbZWtaH8TNDOxW0uXl6R3q41qGFk/pCSFTqiIo16dn6jwgoWCh4EpgZ61KLqs5p/zcd6Wq4ULrtaOTSizC/6IZ3WPUCgYEA6xCJy3+ICCgr8/c7hfd2Ylb3aOsXIffdgALhXjDcrNUCqgB4R+S3WReAwrABemQGl4tySQE/1f3Ru7SzMMciFogGyJ/YSXqSi6Y8oDD7MqlKPiWlN6WY1nSRMlLbkUOqpA5JaDM0kcmXjZpBBQr277GOnh9uKN8zUy5xoptctxI= apiServer: port: "8080" nodes: - - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + - peerId: 12D3KooWLn13hDrZ6YRGM517fHf2zS6qhPNRu18inLMpRqn1YGKu address: 127.0.0.1:4430 - signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== - encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy - - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y + signingKey: 3mzfKBWtn7mitFEgq8u4eysWOJ6ySbUs49irfHwcuOmi1YMpobz9anoqd4yaT1owZiRPYXqx5k2Z4sNVRE3kXA== + encryptionKey: MIIEpQIBAAKCAQEA3U7b4w9JTKE3TLM1WQ5iqdLbvUuozMp/hDEg7S15Gr6wrtLomMSBkfmVQ3Cu+CHdxAFqUFClItYlSFgtZWIFiSiQxCeaN2dmgczd9T4TlRAw6y6uJXtT9r7FIgizPP4B0/tnzPI6yYgpdwzCV2nRSjw3mMr5Nav3QYs18kYrJ1/Np2Wob5HOoRTUD++pPrToevTb7GNL/irrC8wXSE7oU6S7ix6Nh9vzEHg/V5FONBF/wWD/ri7Gy0j0qgUQ+gjxLWKr8xPDnRAve13zzo+54lGCyVvlm/rwCY9Jx378V1IuRx+S8F/GFuVozHD4XVaoSTtpCWPBQNSKDXgaIIKDowIDAQABAoIBACpMXj6ht1LMJXOldPbWhwkKYjFl+pdZxNGRSkfKvzDbbY2chhRcyp8J4vuG2ApY/rftxVIgd8+Wun1/TP3ppEE43aKAJzubqb35WBr9iGSfOZpZy7MiRUQN5kPBAfEQY20OyiIj0hSez74PVD283eGgbMfpU4Rsn8+JOgBaZPkbPViJLJY8PyHU6vwWw60dye1iJTz9yuBtoEqY0XKxnLaVXTQaWx0Te+VYU8twxDgXFWRaXtHuk7xnxOkCZDLrzIvuOYa5lsLoT8K62LDeXbyHBPhbdW0j4ZYzAOTsaUWpjuJzef9aj3JJdfyADiqb5iu6HHksvKzkZEau34zjilECgYEA/c8ZJm62uJMHNssTJYiLRw89l5hYwIZ/1TXdFRF8+xrTin5opYjpscSTO5bY2IYqLx2xuPiJCY1eGGB9L/RtkaVh51ySzq0d+4zpPIRKFcOOgdxHwlgoCgIhQECyfJZNMFGBUIlPXZ/phvXOXRvWFzDPhqThenVG2QzF+wLP0AUCgYEA3zfviQFJ1FOKJMozYO3tUZFmsIrAcO9hfuE7uuWz0Fw2m1XiwxjuOr1RbsSsh/lKke2h4tiGrlfiFhwCpIp91NkVTFrtFOQxbDxkYLkFiWkZDkOaK9YhKMa2cgEm3p+RGawokjbm51LKf+cbYN9xGaAe3y2WzIE4kNpfWE4SXYcCgYEAoagcrrvpqZoMCDxED63ud+4fHsUsEkQYe6Z5EAg5gH5PqnBlGrofjthTpqqnpxGdILFbFyNFtU3TVtduJPMcLp4Vw5TU9MqSxDu1+pOP1FjgFZpGImSf6+/7Wb9bb7sToujm4nLymAFYblt1exxVuiOeqnWuH58+5tQZ7YyW7DkCgYEAl7WuqZEkmpiEpWh/7vsGdo+6GXbUQG2R9+gg7m+7/HsP6hc/XZYOJAIT3JLzKB84nWHCyyiasNeuI5S5/xbZWtaH8TNDOxW0uXl6R3q41qGFk/pCSFTqiIo16dn6jwgoWCh4EpgZ61KLqs5p/zcd6Wq4ULrtaOTSizC/6IZ3WPUCgYEA6xCJy3+ICCgr8/c7hfd2Ylb3aOsXIffdgALhXjDcrNUCqgB4R+S3WReAwrABemQGl4tySQE/1f3Ru7SzMMciFogGyJ/YSXqSi6Y8oDD7MqlKPiWlN6WY1nSRMlLbkUOqpA5JaDM0kcmXjZpBBQr277GOnh9uKN8zUy5xoptctxI= + - peerId: 12D3KooWLtuKtCPBYrFJV1NdejiCr2s614ppe9rmUXnkTHtAUD5U address: 127.0.0.1:4431 - signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== - encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= - - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd + signingKey: 07JMoW5cQUtGO9nNIGQo9e99b7Wf/4YvTtNEA0lt4gCkmhwB1EB9ay+kitxVJJgmdyGLxbUUlGqwXsAj0zlHWw== + encryptionKey: MIIEpAIBAAKCAQEA7cA6J/icl8wseeXkt8oJr5AeYadUAG5EdCOdHj4S/Z7ivff4MOIKAeQITpq+rqhmXxOePYXSpQXE20Y9PW9tuw4gzOuq1ylSG/MWMcLDH1eIxg66rnmUqUbdiW4GGJjVjc9jvN0Up+MfSrUF6fM0jWTFoXVJQIeQQGERCIYjFzjfBl1xYvPghdxNgei/K5ZGYRggT28143XdIH4KTXGtp51hAKoyY9eCqYMtm9wvjxazhPVxO2CsYaqMxBLshY3jfHNqJnx8u6+h4Bl4uUcdbLNUgMcEgk7ehbQp2K0CqNoKXxbCTI6V57UVcJHDIaO5B6FyR6BguzHHNPJ4yd3q9wIDAQABAoIBAQCm2Mf3VRlPzhFIWnVwJXE2q8Umcu8Yfkm712Jj3twk8GPfPS4H4Bl1yjmqMB6xI6zz/CiItGlnNe04lMpVWuV+6CNMq/ZwmKbuxmFE+pFEZYGuvJd16gzR3tGJqJTOnjMAGhK8b8oXJ+TF4NQNooe20ol/DXgiuQAargPuH3RwzjYmF3N8VI4KUc3LaG4TwVXn4LwPOxrQSnfwJlZwLml1HAKOV0qcG0mXX6ZXOpoVhEoRPdQyUHc8ZW+53Agbtind7bYh5TsMVDFUrcgNwnwTOsWjil049la1IJO2uMRluacKlrtyzEp6zqrW8ZJO7mYAO69x4WyGqf2ZgIdA6djBAoGBAPqRHWAIgPa80eXbwCYkRtUG/ONBsQGi7+wm6nyhkXvNXJeokgH2DCgLH2+fW2scfOJuZc9r5WftEjOBvNfr2LDcwdyTSTh21WYcPSZx9HDf2d5/SWTcjNcyU0b5qfWIUKi/Zm9UY7r3X7yMA5dUD/cvu1PBJ5NWFrK1Gm2ph44dAoGBAPLn+LkHweU0fbxQq/76T5yVVpMKUaE9xwrJlUxEDPAQGnLPbFg4JeUt/YPhsOV85W4c4oQE+uFZrF0uf+1fEnS6MOJ+sq668upzC2hBp1B5138wM7615v1rvXVVH6qXfFop67FdBzPHt1NAN43mEIBZHTQ5hSVXFlYSZp9mxuEjAoGBAKCzUVO2IIAeub/iIGpV+dfGk4ptJ0kVZyreCqXEObpdC3V496uqUkGcYJ0GZ2ta6f2PMFzHpmnw8it2mdchu+gyrWL6U4uTK2pB0jZF/7Ak4WaB3GCD0xBxhleO6CJBOvn/R4M/bHcNEKmsYuE7WMIAKvScfPVR0VzsKfcLM5VBAoGAVvWg32zdh1bBZLdku8WU1rPH6KAbFSRuq3f7UPBTyWWaclu7p+GB/4f1aE9V6vJJmKASn7zArAhUYo+REMOmcc9uTMea5F7dM/23qb1HTtIvycLR44ZviW4Wx3iP+5x70jOLw1VQjMME6HLm8I/afHhqshWdiv6ganPv9UTwEg0CgYBSDi2dqg8F7ij5CN+LMDLSn3b8GCw+7efGIt7imm/O2V/FlHD40IA6qGg6DXNQrnoZQt94nMb1cZEvm1dxi6rmQNrhCyoMogAaPqgFhZGq1OjmhVZiXFUWy4WAcjdzFc9wZd3/XtaofRKHLK+ngTFhhVApKypLk3Rg9bCAAjzyVg== + - peerId: 12D3KooWDCypXSyN6ppuMZGxVnBd1ZQCMV4y7Bn187S4duYmf8rA address: 127.0.0.1:4432 - signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== - encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== + signingKey: SGyNE0dFaQgtgNuzdcO7LB+TEz9VHAOtlQLk6WWkrkQyXiZV3casg8Q2/4PO1Oylc8Fu72RU001Hclj5JCbiLw== + encryptionKey: MIIEpAIBAAKCAQEA0k3mw4FyexRkLgLjHzYs4Ppeyv6r9ZrP00imNf15JTuM8ajMx5oJX7JQTm8KOLRJjUdZZAd5Gtp0ezfYAQK1ZjEWwCmfp8j8FBgJIDSLpjxl88SXMLgATXYfhklnQvKlQjs/X3Ka4zdTrav2tMH9IAo6TSNZhlPQNsUory1SGHs+KqHv4p0sG8oWuKYhfBj8rWHQdUVptkIBKgojFDeJJD04Tbf9kUakbK/8KuXB6zF5H4WN3p4rMMwkClyTGeYO4LDg5TzVn8NnUi3/b/vO/3us1G/TMoRe/6umUfpQxrwo+7S2T6A4YwetWRp6xALLhp+HfAWnn0lA/D8/w1WpKwIDAQABAoIBAQC5cdQxRa5rddm48PbSCPWeFWkNW3DLDI6CYyedqDvxZwer+QtKXzww1I4X+7ZptiC9odLjb+uMkGHyXZXtnjPTPyounQWZ8JLILUGu0mbqWYwVXp9raHVr2OOHiKaz1D+BnbkOM4L9JUZ2eJL9ZaoNXLd4WdmRp8qM4WI0xqQDzOANx2HhyL/+dJmQeIUND+pdeH+Z+fYowU3ho32txNvBnMXQhF1T5K9i1VO5W49RAjIRbENsT+paPGKbNubDHRt1j36ktK4eC4HSdgv8tccdsGyrEiIbAt1XsTZfM8ie4D3A8RhSxiTC6Fkgv6vIm+iFTLzBFZKesOBcd8sfKeyBAoGBAOts5PQQJhldPDzlbnqzxMOR98WHbkVZjCqWSkNA34vqyFuPcRuX0rHK/qpg23ilbUP0fGMDTGgFzTt51FZLL16SXyRfjNhzjdmryryeddQwbp92ta2GEgnU6t1FyCuSCtcLDKJd/D9A9dC5UI6z+ES4TOnbR3nakXK9t4cUOFthAoGBAOSu+wL+SEA5erR+m3LpOsELK68CCJQPxn3VpoVfJZawgF+fEoXVMLTERxJput1+ADomIEdNc9ex86TjKx9gJ4piNHscRPFeT/AgESOIGHLOc1gk2DPqNj6wBIarUJQ9t4KcHScboh1dTPJeqqv2NSwIiLQoqFUIhfKZLnrW3zwLAoGBAJh0hC+o5YM3ZXLqAIllMN6VACbidP5j5ukNOjojIKCzAdyJH24G+2I3WoNrBbUzK3b+NC7KTAhw+V6ynlbjiWFs2D/twH/LFOkI3tkWpKcsVfbeIPimAbhsMUvpjJ7qjCqF9UCQLHGp14W6+/ftg7C8yNIINlkquVXclaTb60MBAoGAPqmL8ogG+EJH00mWAujRxq/u6meePiQMedKfbJBj1mTK6GjIRI/kZsQZzXvXTnYGTejAk4kvov0KDDaLTG+mpg6+3rUiVxlGwj+nMptKR7s2dAK0k5UsBAVrWBN9YwF+VXW9r0etJmq4ePljvvcaHtS/0M4LQjGxsoYy7EoQpX0CgYAhnf0McB7F1MxSjB0soMNv/v5utVzVihS3re2yKNdkI/YUEMB+yU3Q4gh+OljjBM6Y5To3BsQBAx4l2CysMKFHjIE/5AtdbvIS+chZZqB3vcZXSayvX8P1Z1uFdw/saiO2cRDJmR+TxaOPa2C9SzDoNTACthwLErHfzvEvVroKmw== space: gcTTL: 60 syncPeriod: 10 diff --git a/etc/configs/node2.yml b/etc/configs/node2.yml index b4168434..dabf73a2 100755 --- a/etc/configs/node2.yml +++ b/etc/configs/node2.yml @@ -5,24 +5,25 @@ grpcServer: - 127.0.0.1:4431 tls: false account: - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y - signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== - encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= + peerId: 12D3KooWLtuKtCPBYrFJV1NdejiCr2s614ppe9rmUXnkTHtAUD5U + peerKey: 07JMoW5cQUtGO9nNIGQo9e99b7Wf/4YvTtNEA0lt4gCkmhwB1EB9ay+kitxVJJgmdyGLxbUUlGqwXsAj0zlHWw== + signingKey: 07JMoW5cQUtGO9nNIGQo9e99b7Wf/4YvTtNEA0lt4gCkmhwB1EB9ay+kitxVJJgmdyGLxbUUlGqwXsAj0zlHWw== + encryptionKey: MIIEpAIBAAKCAQEA7cA6J/icl8wseeXkt8oJr5AeYadUAG5EdCOdHj4S/Z7ivff4MOIKAeQITpq+rqhmXxOePYXSpQXE20Y9PW9tuw4gzOuq1ylSG/MWMcLDH1eIxg66rnmUqUbdiW4GGJjVjc9jvN0Up+MfSrUF6fM0jWTFoXVJQIeQQGERCIYjFzjfBl1xYvPghdxNgei/K5ZGYRggT28143XdIH4KTXGtp51hAKoyY9eCqYMtm9wvjxazhPVxO2CsYaqMxBLshY3jfHNqJnx8u6+h4Bl4uUcdbLNUgMcEgk7ehbQp2K0CqNoKXxbCTI6V57UVcJHDIaO5B6FyR6BguzHHNPJ4yd3q9wIDAQABAoIBAQCm2Mf3VRlPzhFIWnVwJXE2q8Umcu8Yfkm712Jj3twk8GPfPS4H4Bl1yjmqMB6xI6zz/CiItGlnNe04lMpVWuV+6CNMq/ZwmKbuxmFE+pFEZYGuvJd16gzR3tGJqJTOnjMAGhK8b8oXJ+TF4NQNooe20ol/DXgiuQAargPuH3RwzjYmF3N8VI4KUc3LaG4TwVXn4LwPOxrQSnfwJlZwLml1HAKOV0qcG0mXX6ZXOpoVhEoRPdQyUHc8ZW+53Agbtind7bYh5TsMVDFUrcgNwnwTOsWjil049la1IJO2uMRluacKlrtyzEp6zqrW8ZJO7mYAO69x4WyGqf2ZgIdA6djBAoGBAPqRHWAIgPa80eXbwCYkRtUG/ONBsQGi7+wm6nyhkXvNXJeokgH2DCgLH2+fW2scfOJuZc9r5WftEjOBvNfr2LDcwdyTSTh21WYcPSZx9HDf2d5/SWTcjNcyU0b5qfWIUKi/Zm9UY7r3X7yMA5dUD/cvu1PBJ5NWFrK1Gm2ph44dAoGBAPLn+LkHweU0fbxQq/76T5yVVpMKUaE9xwrJlUxEDPAQGnLPbFg4JeUt/YPhsOV85W4c4oQE+uFZrF0uf+1fEnS6MOJ+sq668upzC2hBp1B5138wM7615v1rvXVVH6qXfFop67FdBzPHt1NAN43mEIBZHTQ5hSVXFlYSZp9mxuEjAoGBAKCzUVO2IIAeub/iIGpV+dfGk4ptJ0kVZyreCqXEObpdC3V496uqUkGcYJ0GZ2ta6f2PMFzHpmnw8it2mdchu+gyrWL6U4uTK2pB0jZF/7Ak4WaB3GCD0xBxhleO6CJBOvn/R4M/bHcNEKmsYuE7WMIAKvScfPVR0VzsKfcLM5VBAoGAVvWg32zdh1bBZLdku8WU1rPH6KAbFSRuq3f7UPBTyWWaclu7p+GB/4f1aE9V6vJJmKASn7zArAhUYo+REMOmcc9uTMea5F7dM/23qb1HTtIvycLR44ZviW4Wx3iP+5x70jOLw1VQjMME6HLm8I/afHhqshWdiv6ganPv9UTwEg0CgYBSDi2dqg8F7ij5CN+LMDLSn3b8GCw+7efGIt7imm/O2V/FlHD40IA6qGg6DXNQrnoZQt94nMb1cZEvm1dxi6rmQNrhCyoMogAaPqgFhZGq1OjmhVZiXFUWy4WAcjdzFc9wZd3/XtaofRKHLK+ngTFhhVApKypLk3Rg9bCAAjzyVg== apiServer: port: "8081" nodes: - - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + - peerId: 12D3KooWLn13hDrZ6YRGM517fHf2zS6qhPNRu18inLMpRqn1YGKu address: 127.0.0.1:4430 - signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== - encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy - - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y + signingKey: 3mzfKBWtn7mitFEgq8u4eysWOJ6ySbUs49irfHwcuOmi1YMpobz9anoqd4yaT1owZiRPYXqx5k2Z4sNVRE3kXA== + encryptionKey: MIIEpQIBAAKCAQEA3U7b4w9JTKE3TLM1WQ5iqdLbvUuozMp/hDEg7S15Gr6wrtLomMSBkfmVQ3Cu+CHdxAFqUFClItYlSFgtZWIFiSiQxCeaN2dmgczd9T4TlRAw6y6uJXtT9r7FIgizPP4B0/tnzPI6yYgpdwzCV2nRSjw3mMr5Nav3QYs18kYrJ1/Np2Wob5HOoRTUD++pPrToevTb7GNL/irrC8wXSE7oU6S7ix6Nh9vzEHg/V5FONBF/wWD/ri7Gy0j0qgUQ+gjxLWKr8xPDnRAve13zzo+54lGCyVvlm/rwCY9Jx378V1IuRx+S8F/GFuVozHD4XVaoSTtpCWPBQNSKDXgaIIKDowIDAQABAoIBACpMXj6ht1LMJXOldPbWhwkKYjFl+pdZxNGRSkfKvzDbbY2chhRcyp8J4vuG2ApY/rftxVIgd8+Wun1/TP3ppEE43aKAJzubqb35WBr9iGSfOZpZy7MiRUQN5kPBAfEQY20OyiIj0hSez74PVD283eGgbMfpU4Rsn8+JOgBaZPkbPViJLJY8PyHU6vwWw60dye1iJTz9yuBtoEqY0XKxnLaVXTQaWx0Te+VYU8twxDgXFWRaXtHuk7xnxOkCZDLrzIvuOYa5lsLoT8K62LDeXbyHBPhbdW0j4ZYzAOTsaUWpjuJzef9aj3JJdfyADiqb5iu6HHksvKzkZEau34zjilECgYEA/c8ZJm62uJMHNssTJYiLRw89l5hYwIZ/1TXdFRF8+xrTin5opYjpscSTO5bY2IYqLx2xuPiJCY1eGGB9L/RtkaVh51ySzq0d+4zpPIRKFcOOgdxHwlgoCgIhQECyfJZNMFGBUIlPXZ/phvXOXRvWFzDPhqThenVG2QzF+wLP0AUCgYEA3zfviQFJ1FOKJMozYO3tUZFmsIrAcO9hfuE7uuWz0Fw2m1XiwxjuOr1RbsSsh/lKke2h4tiGrlfiFhwCpIp91NkVTFrtFOQxbDxkYLkFiWkZDkOaK9YhKMa2cgEm3p+RGawokjbm51LKf+cbYN9xGaAe3y2WzIE4kNpfWE4SXYcCgYEAoagcrrvpqZoMCDxED63ud+4fHsUsEkQYe6Z5EAg5gH5PqnBlGrofjthTpqqnpxGdILFbFyNFtU3TVtduJPMcLp4Vw5TU9MqSxDu1+pOP1FjgFZpGImSf6+/7Wb9bb7sToujm4nLymAFYblt1exxVuiOeqnWuH58+5tQZ7YyW7DkCgYEAl7WuqZEkmpiEpWh/7vsGdo+6GXbUQG2R9+gg7m+7/HsP6hc/XZYOJAIT3JLzKB84nWHCyyiasNeuI5S5/xbZWtaH8TNDOxW0uXl6R3q41qGFk/pCSFTqiIo16dn6jwgoWCh4EpgZ61KLqs5p/zcd6Wq4ULrtaOTSizC/6IZ3WPUCgYEA6xCJy3+ICCgr8/c7hfd2Ylb3aOsXIffdgALhXjDcrNUCqgB4R+S3WReAwrABemQGl4tySQE/1f3Ru7SzMMciFogGyJ/YSXqSi6Y8oDD7MqlKPiWlN6WY1nSRMlLbkUOqpA5JaDM0kcmXjZpBBQr277GOnh9uKN8zUy5xoptctxI= + - peerId: 12D3KooWLtuKtCPBYrFJV1NdejiCr2s614ppe9rmUXnkTHtAUD5U address: 127.0.0.1:4431 - signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== - encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= - - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd + signingKey: 07JMoW5cQUtGO9nNIGQo9e99b7Wf/4YvTtNEA0lt4gCkmhwB1EB9ay+kitxVJJgmdyGLxbUUlGqwXsAj0zlHWw== + encryptionKey: MIIEpAIBAAKCAQEA7cA6J/icl8wseeXkt8oJr5AeYadUAG5EdCOdHj4S/Z7ivff4MOIKAeQITpq+rqhmXxOePYXSpQXE20Y9PW9tuw4gzOuq1ylSG/MWMcLDH1eIxg66rnmUqUbdiW4GGJjVjc9jvN0Up+MfSrUF6fM0jWTFoXVJQIeQQGERCIYjFzjfBl1xYvPghdxNgei/K5ZGYRggT28143XdIH4KTXGtp51hAKoyY9eCqYMtm9wvjxazhPVxO2CsYaqMxBLshY3jfHNqJnx8u6+h4Bl4uUcdbLNUgMcEgk7ehbQp2K0CqNoKXxbCTI6V57UVcJHDIaO5B6FyR6BguzHHNPJ4yd3q9wIDAQABAoIBAQCm2Mf3VRlPzhFIWnVwJXE2q8Umcu8Yfkm712Jj3twk8GPfPS4H4Bl1yjmqMB6xI6zz/CiItGlnNe04lMpVWuV+6CNMq/ZwmKbuxmFE+pFEZYGuvJd16gzR3tGJqJTOnjMAGhK8b8oXJ+TF4NQNooe20ol/DXgiuQAargPuH3RwzjYmF3N8VI4KUc3LaG4TwVXn4LwPOxrQSnfwJlZwLml1HAKOV0qcG0mXX6ZXOpoVhEoRPdQyUHc8ZW+53Agbtind7bYh5TsMVDFUrcgNwnwTOsWjil049la1IJO2uMRluacKlrtyzEp6zqrW8ZJO7mYAO69x4WyGqf2ZgIdA6djBAoGBAPqRHWAIgPa80eXbwCYkRtUG/ONBsQGi7+wm6nyhkXvNXJeokgH2DCgLH2+fW2scfOJuZc9r5WftEjOBvNfr2LDcwdyTSTh21WYcPSZx9HDf2d5/SWTcjNcyU0b5qfWIUKi/Zm9UY7r3X7yMA5dUD/cvu1PBJ5NWFrK1Gm2ph44dAoGBAPLn+LkHweU0fbxQq/76T5yVVpMKUaE9xwrJlUxEDPAQGnLPbFg4JeUt/YPhsOV85W4c4oQE+uFZrF0uf+1fEnS6MOJ+sq668upzC2hBp1B5138wM7615v1rvXVVH6qXfFop67FdBzPHt1NAN43mEIBZHTQ5hSVXFlYSZp9mxuEjAoGBAKCzUVO2IIAeub/iIGpV+dfGk4ptJ0kVZyreCqXEObpdC3V496uqUkGcYJ0GZ2ta6f2PMFzHpmnw8it2mdchu+gyrWL6U4uTK2pB0jZF/7Ak4WaB3GCD0xBxhleO6CJBOvn/R4M/bHcNEKmsYuE7WMIAKvScfPVR0VzsKfcLM5VBAoGAVvWg32zdh1bBZLdku8WU1rPH6KAbFSRuq3f7UPBTyWWaclu7p+GB/4f1aE9V6vJJmKASn7zArAhUYo+REMOmcc9uTMea5F7dM/23qb1HTtIvycLR44ZviW4Wx3iP+5x70jOLw1VQjMME6HLm8I/afHhqshWdiv6ganPv9UTwEg0CgYBSDi2dqg8F7ij5CN+LMDLSn3b8GCw+7efGIt7imm/O2V/FlHD40IA6qGg6DXNQrnoZQt94nMb1cZEvm1dxi6rmQNrhCyoMogAaPqgFhZGq1OjmhVZiXFUWy4WAcjdzFc9wZd3/XtaofRKHLK+ngTFhhVApKypLk3Rg9bCAAjzyVg== + - peerId: 12D3KooWDCypXSyN6ppuMZGxVnBd1ZQCMV4y7Bn187S4duYmf8rA address: 127.0.0.1:4432 - signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== - encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== + signingKey: SGyNE0dFaQgtgNuzdcO7LB+TEz9VHAOtlQLk6WWkrkQyXiZV3casg8Q2/4PO1Oylc8Fu72RU001Hclj5JCbiLw== + encryptionKey: MIIEpAIBAAKCAQEA0k3mw4FyexRkLgLjHzYs4Ppeyv6r9ZrP00imNf15JTuM8ajMx5oJX7JQTm8KOLRJjUdZZAd5Gtp0ezfYAQK1ZjEWwCmfp8j8FBgJIDSLpjxl88SXMLgATXYfhklnQvKlQjs/X3Ka4zdTrav2tMH9IAo6TSNZhlPQNsUory1SGHs+KqHv4p0sG8oWuKYhfBj8rWHQdUVptkIBKgojFDeJJD04Tbf9kUakbK/8KuXB6zF5H4WN3p4rMMwkClyTGeYO4LDg5TzVn8NnUi3/b/vO/3us1G/TMoRe/6umUfpQxrwo+7S2T6A4YwetWRp6xALLhp+HfAWnn0lA/D8/w1WpKwIDAQABAoIBAQC5cdQxRa5rddm48PbSCPWeFWkNW3DLDI6CYyedqDvxZwer+QtKXzww1I4X+7ZptiC9odLjb+uMkGHyXZXtnjPTPyounQWZ8JLILUGu0mbqWYwVXp9raHVr2OOHiKaz1D+BnbkOM4L9JUZ2eJL9ZaoNXLd4WdmRp8qM4WI0xqQDzOANx2HhyL/+dJmQeIUND+pdeH+Z+fYowU3ho32txNvBnMXQhF1T5K9i1VO5W49RAjIRbENsT+paPGKbNubDHRt1j36ktK4eC4HSdgv8tccdsGyrEiIbAt1XsTZfM8ie4D3A8RhSxiTC6Fkgv6vIm+iFTLzBFZKesOBcd8sfKeyBAoGBAOts5PQQJhldPDzlbnqzxMOR98WHbkVZjCqWSkNA34vqyFuPcRuX0rHK/qpg23ilbUP0fGMDTGgFzTt51FZLL16SXyRfjNhzjdmryryeddQwbp92ta2GEgnU6t1FyCuSCtcLDKJd/D9A9dC5UI6z+ES4TOnbR3nakXK9t4cUOFthAoGBAOSu+wL+SEA5erR+m3LpOsELK68CCJQPxn3VpoVfJZawgF+fEoXVMLTERxJput1+ADomIEdNc9ex86TjKx9gJ4piNHscRPFeT/AgESOIGHLOc1gk2DPqNj6wBIarUJQ9t4KcHScboh1dTPJeqqv2NSwIiLQoqFUIhfKZLnrW3zwLAoGBAJh0hC+o5YM3ZXLqAIllMN6VACbidP5j5ukNOjojIKCzAdyJH24G+2I3WoNrBbUzK3b+NC7KTAhw+V6ynlbjiWFs2D/twH/LFOkI3tkWpKcsVfbeIPimAbhsMUvpjJ7qjCqF9UCQLHGp14W6+/ftg7C8yNIINlkquVXclaTb60MBAoGAPqmL8ogG+EJH00mWAujRxq/u6meePiQMedKfbJBj1mTK6GjIRI/kZsQZzXvXTnYGTejAk4kvov0KDDaLTG+mpg6+3rUiVxlGwj+nMptKR7s2dAK0k5UsBAVrWBN9YwF+VXW9r0etJmq4ePljvvcaHtS/0M4LQjGxsoYy7EoQpX0CgYAhnf0McB7F1MxSjB0soMNv/v5utVzVihS3re2yKNdkI/YUEMB+yU3Q4gh+OljjBM6Y5To3BsQBAx4l2CysMKFHjIE/5AtdbvIS+chZZqB3vcZXSayvX8P1Z1uFdw/saiO2cRDJmR+TxaOPa2C9SzDoNTACthwLErHfzvEvVroKmw== space: gcTTL: 60 syncPeriod: 10 diff --git a/etc/configs/node3.yml b/etc/configs/node3.yml index 26c460fc..a809a72b 100755 --- a/etc/configs/node3.yml +++ b/etc/configs/node3.yml @@ -5,24 +5,25 @@ grpcServer: - 127.0.0.1:4432 tls: false account: - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd - signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== - encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== + peerId: 12D3KooWDCypXSyN6ppuMZGxVnBd1ZQCMV4y7Bn187S4duYmf8rA + peerKey: SGyNE0dFaQgtgNuzdcO7LB+TEz9VHAOtlQLk6WWkrkQyXiZV3casg8Q2/4PO1Oylc8Fu72RU001Hclj5JCbiLw== + signingKey: SGyNE0dFaQgtgNuzdcO7LB+TEz9VHAOtlQLk6WWkrkQyXiZV3casg8Q2/4PO1Oylc8Fu72RU001Hclj5JCbiLw== + encryptionKey: MIIEpAIBAAKCAQEA0k3mw4FyexRkLgLjHzYs4Ppeyv6r9ZrP00imNf15JTuM8ajMx5oJX7JQTm8KOLRJjUdZZAd5Gtp0ezfYAQK1ZjEWwCmfp8j8FBgJIDSLpjxl88SXMLgATXYfhklnQvKlQjs/X3Ka4zdTrav2tMH9IAo6TSNZhlPQNsUory1SGHs+KqHv4p0sG8oWuKYhfBj8rWHQdUVptkIBKgojFDeJJD04Tbf9kUakbK/8KuXB6zF5H4WN3p4rMMwkClyTGeYO4LDg5TzVn8NnUi3/b/vO/3us1G/TMoRe/6umUfpQxrwo+7S2T6A4YwetWRp6xALLhp+HfAWnn0lA/D8/w1WpKwIDAQABAoIBAQC5cdQxRa5rddm48PbSCPWeFWkNW3DLDI6CYyedqDvxZwer+QtKXzww1I4X+7ZptiC9odLjb+uMkGHyXZXtnjPTPyounQWZ8JLILUGu0mbqWYwVXp9raHVr2OOHiKaz1D+BnbkOM4L9JUZ2eJL9ZaoNXLd4WdmRp8qM4WI0xqQDzOANx2HhyL/+dJmQeIUND+pdeH+Z+fYowU3ho32txNvBnMXQhF1T5K9i1VO5W49RAjIRbENsT+paPGKbNubDHRt1j36ktK4eC4HSdgv8tccdsGyrEiIbAt1XsTZfM8ie4D3A8RhSxiTC6Fkgv6vIm+iFTLzBFZKesOBcd8sfKeyBAoGBAOts5PQQJhldPDzlbnqzxMOR98WHbkVZjCqWSkNA34vqyFuPcRuX0rHK/qpg23ilbUP0fGMDTGgFzTt51FZLL16SXyRfjNhzjdmryryeddQwbp92ta2GEgnU6t1FyCuSCtcLDKJd/D9A9dC5UI6z+ES4TOnbR3nakXK9t4cUOFthAoGBAOSu+wL+SEA5erR+m3LpOsELK68CCJQPxn3VpoVfJZawgF+fEoXVMLTERxJput1+ADomIEdNc9ex86TjKx9gJ4piNHscRPFeT/AgESOIGHLOc1gk2DPqNj6wBIarUJQ9t4KcHScboh1dTPJeqqv2NSwIiLQoqFUIhfKZLnrW3zwLAoGBAJh0hC+o5YM3ZXLqAIllMN6VACbidP5j5ukNOjojIKCzAdyJH24G+2I3WoNrBbUzK3b+NC7KTAhw+V6ynlbjiWFs2D/twH/LFOkI3tkWpKcsVfbeIPimAbhsMUvpjJ7qjCqF9UCQLHGp14W6+/ftg7C8yNIINlkquVXclaTb60MBAoGAPqmL8ogG+EJH00mWAujRxq/u6meePiQMedKfbJBj1mTK6GjIRI/kZsQZzXvXTnYGTejAk4kvov0KDDaLTG+mpg6+3rUiVxlGwj+nMptKR7s2dAK0k5UsBAVrWBN9YwF+VXW9r0etJmq4ePljvvcaHtS/0M4LQjGxsoYy7EoQpX0CgYAhnf0McB7F1MxSjB0soMNv/v5utVzVihS3re2yKNdkI/YUEMB+yU3Q4gh+OljjBM6Y5To3BsQBAx4l2CysMKFHjIE/5AtdbvIS+chZZqB3vcZXSayvX8P1Z1uFdw/saiO2cRDJmR+TxaOPa2C9SzDoNTACthwLErHfzvEvVroKmw== apiServer: port: "8082" nodes: - - peerId: 12D3KooWC9DkXiYK8MiQb87ffW51ggZR4FWASadh4UENXdaa16iz + - peerId: 12D3KooWLn13hDrZ6YRGM517fHf2zS6qhPNRu18inLMpRqn1YGKu address: 127.0.0.1:4430 - signingKey: yfFJv5klknUeG8rROCNTktCk5rsBvz16aEanYBAl9oYii+Q8XwH8mVXr5hHSiP+HYxEaSSozlMAAXUjdW2vK5w== - encryptionKey: MIIEowIBAAKCAQEA5zUOQ42SFUYJyX86llYopUE4Q+RQvbCakTPd9LBKt6pBWyW3PA9sjFisxVFFwYOVwghzF8QDSRrWdkjGmRPPOSRNmNiJFGtk6wb26eihenFECdb4nJyTDZVhvayHpByCKleAl7dHLjHCIsVaaFfn5rntm47IdDSNFgZnNDrNrdS2SchXWHamcfWBJSQirdp+8kSh5RC6/J53LVa+Sff6D49BsF8VsevcjvFcdlpxG6GKhr6kzvnEwCCk8DIqjpF3geUVj/QbT9tGa12bAgDQuckW4DavIN1zT7BAUbZPcbFZ9Bd2bbKzXDFNt2mRXafDPL07KhnXSZ2YAxHf5M4s7QIDAQABAoIBABV5aQy/Lm1JZwlPBtsFv5qxtw8fOpyTtZd88MWURixO5OkZVK6AZD2Y0ts01DzIAvXVoRL5ArEcjATKd5+qJloRVB+5JOo/m0z1BaPuFmlv8bjUPZ0WMdZWJJDgYGzOtQxHukrdHABfYL+oAuCkIYbdiAMlvNqGMwBzscw5FfdqGBRwC0bus+YD103Hhc8pN0REwLZmiOvHR6b4Agwv4ruFsqthg13EwcqDVTnS1/sZyodLZaAGBUXlqUxuFakI/9CqpPuOkDgxelTYdXbS4yhfRF4zwoBGZx1462iJs4XM8TXhDcZpTRwCChM5Qf7jvvgbi7+gYTX9B1dxg7gZUyUCgYEA/cd/NqOyx7bn0twiuMEdq8bCi5Y/GvWLrQ3pf58DPanIydGPJU5/obKZw5Tv5LWbE5rUEeC2YpFleNh01oc0xHCveIR6JNGihN8u0DZPmcx2B1lwEzdYefRJfGcYXYhm/nCpzYn3VH0TfKA6qci+KLarYaeDpUCXAihZMUZxSfcCgYEA6Tr+fSXmHIYoKcewIpwSTvcFOJ6spMRSG+mxQAFit8vUQTw2e/aTESEECo24XJ/SKVK01CSoWXrw3t9eBgziyHI3GaaZ5LaXMZLLZhmGUT5kZiTR7083h+9bHt2+MzRXpaAEEc1FNgV3T2sSl1S+oKDL1MAcR42JaQtC1P2epzsCgYBKDdD9bL9ar/DuAvbO2uuBmLpkaS94+nYLxaeBajFT6RuCaPhQdpuf37Im9GscXjImgmOn497U3ICzxtYxU7r+J7PMgzvxSosWItpSP8bypks60cp2kQvsanCXMK5XfNoxHUcvhzb5HJZ3I3p62O1EjClukadErZhjNMryKhAc+QKBgFwvpUdyI3JC1L0u4L/NUK9FlBq9HSBDOPEvfY/+/DYJquveEOsOmzK6Cg7h1W1G/pq2xiLUGnbD0VFGmLNrhHgWLRFGeK2ePkSp8Rt6G00hjC2TgCdG+HwSb8HTg8pZdgtRJEqlCCZCItaRS9fk9zQmWmrNRGBD4XxTpybo2DzhAoGBAIxRN8WZc9HYVq8t20MieKP3pp5Nrl0wj9Z9EPvC60CwQRdv/FvWzDwF5/9Kg79rvbguZgjD6FNy35BGC5sN/24awWJ/mKYosctRwZVFpogoZ0qAdOwxowfAJXLRC5Chgim8vCFFdKdrMo2a6V+MQuhrTv06QAV1sYAH5P7abfPy - - peerId: 12D3KooWC6sZYJXFagZtRjY4Jc4dzBLpEgYsUhJRauYheSAGk26y + signingKey: 3mzfKBWtn7mitFEgq8u4eysWOJ6ySbUs49irfHwcuOmi1YMpobz9anoqd4yaT1owZiRPYXqx5k2Z4sNVRE3kXA== + encryptionKey: MIIEpQIBAAKCAQEA3U7b4w9JTKE3TLM1WQ5iqdLbvUuozMp/hDEg7S15Gr6wrtLomMSBkfmVQ3Cu+CHdxAFqUFClItYlSFgtZWIFiSiQxCeaN2dmgczd9T4TlRAw6y6uJXtT9r7FIgizPP4B0/tnzPI6yYgpdwzCV2nRSjw3mMr5Nav3QYs18kYrJ1/Np2Wob5HOoRTUD++pPrToevTb7GNL/irrC8wXSE7oU6S7ix6Nh9vzEHg/V5FONBF/wWD/ri7Gy0j0qgUQ+gjxLWKr8xPDnRAve13zzo+54lGCyVvlm/rwCY9Jx378V1IuRx+S8F/GFuVozHD4XVaoSTtpCWPBQNSKDXgaIIKDowIDAQABAoIBACpMXj6ht1LMJXOldPbWhwkKYjFl+pdZxNGRSkfKvzDbbY2chhRcyp8J4vuG2ApY/rftxVIgd8+Wun1/TP3ppEE43aKAJzubqb35WBr9iGSfOZpZy7MiRUQN5kPBAfEQY20OyiIj0hSez74PVD283eGgbMfpU4Rsn8+JOgBaZPkbPViJLJY8PyHU6vwWw60dye1iJTz9yuBtoEqY0XKxnLaVXTQaWx0Te+VYU8twxDgXFWRaXtHuk7xnxOkCZDLrzIvuOYa5lsLoT8K62LDeXbyHBPhbdW0j4ZYzAOTsaUWpjuJzef9aj3JJdfyADiqb5iu6HHksvKzkZEau34zjilECgYEA/c8ZJm62uJMHNssTJYiLRw89l5hYwIZ/1TXdFRF8+xrTin5opYjpscSTO5bY2IYqLx2xuPiJCY1eGGB9L/RtkaVh51ySzq0d+4zpPIRKFcOOgdxHwlgoCgIhQECyfJZNMFGBUIlPXZ/phvXOXRvWFzDPhqThenVG2QzF+wLP0AUCgYEA3zfviQFJ1FOKJMozYO3tUZFmsIrAcO9hfuE7uuWz0Fw2m1XiwxjuOr1RbsSsh/lKke2h4tiGrlfiFhwCpIp91NkVTFrtFOQxbDxkYLkFiWkZDkOaK9YhKMa2cgEm3p+RGawokjbm51LKf+cbYN9xGaAe3y2WzIE4kNpfWE4SXYcCgYEAoagcrrvpqZoMCDxED63ud+4fHsUsEkQYe6Z5EAg5gH5PqnBlGrofjthTpqqnpxGdILFbFyNFtU3TVtduJPMcLp4Vw5TU9MqSxDu1+pOP1FjgFZpGImSf6+/7Wb9bb7sToujm4nLymAFYblt1exxVuiOeqnWuH58+5tQZ7YyW7DkCgYEAl7WuqZEkmpiEpWh/7vsGdo+6GXbUQG2R9+gg7m+7/HsP6hc/XZYOJAIT3JLzKB84nWHCyyiasNeuI5S5/xbZWtaH8TNDOxW0uXl6R3q41qGFk/pCSFTqiIo16dn6jwgoWCh4EpgZ61KLqs5p/zcd6Wq4ULrtaOTSizC/6IZ3WPUCgYEA6xCJy3+ICCgr8/c7hfd2Ylb3aOsXIffdgALhXjDcrNUCqgB4R+S3WReAwrABemQGl4tySQE/1f3Ru7SzMMciFogGyJ/YSXqSi6Y8oDD7MqlKPiWlN6WY1nSRMlLbkUOqpA5JaDM0kcmXjZpBBQr277GOnh9uKN8zUy5xoptctxI= + - peerId: 12D3KooWLtuKtCPBYrFJV1NdejiCr2s614ppe9rmUXnkTHtAUD5U address: 127.0.0.1:4431 - signingKey: mLzjMshSbtOkUKZha0bNIHvW9nlqOPX6VM/mvKicx6kh8ebP2mfrkCS0qz5GwlFEqTgtuSnWsHdvGZnuan2Ahg== - encryptionKey: MIIEogIBAAKCAQEAuJcCEM4sM5I1Aj2y0HDgR/UrKEVF1iZ1CYWv4jVOt/e1avDn7XjF9ArB7lngq7lOTxpCNeLMQXeBl1gY1SBCPeTrs+tltyAUeSOZStwP9qhjUhI9TntfW3QfVlC2lB17liGa4b2F10x9vW/0f3R7m5xgz8NyqcFOZip0Ehe9UJbNFwPr00by0D4/XptkDT44wAIDlw7lgOmXWR3RpCYAYFonYeE2HK7FFNTIOJucfJ8kbK7wLp5EZRARYfCDUFq7czFu97FIrmQfS4Fyg8ESB+R28+dJIQ6G8U1MicX4Ibf9IkufK+r2fMYPv13F33omrwSGhNIWtX9WjAQ4bjmA6wIDAQABAoIBACHuaEvMimWEd8gMrWURirjPgXpqmXbPJO52K6mqYOkCWM/qrseBTuoYXCPDU8BdVN7Hleov4ZobLLA0WoQ65NJZ1VYCbHUoKXtHJvOS1kBiHbfFcI2PsiyugOAuABHkBYbIcJ8UZpj4D5kWDlyrfdlR+p3WcKpxxUaUgTeeM4evkMg2dg1/S4psgu1SKdGYMtafKBgvxxE0R/fjfP9MRD260/ydcUT0gRE+uUu6WFm92MLV72W3hoKfNqgGnQWCTG8UJGGK3KC/c9lAvLiDygo3GJLEjhnrIGkSbbd0uHtAYD8Uc+gq3z3o5Rger4P/FyWSbJ6Vz20iYHTeYUEDkKECgYEA5KK5/Z6XQHwsEGXSSCXKvUjJ7ZOV5k3D2im0F1dTtQaOjFgwZ9SPW/k7tQfcwfZLeDSm5V98FXSAu9XgT/Zrd+/RrfbgmKLMcNVet+l2OPq1cOeKE7io7wAXlkO5CmiMXMCRVcgqaENutUSTsmadFqd2NE7/gEUjeNIQLGkSsXECgYEAzq6+HtOxhfbTEC8ZUz6Y7+CphmtYiuX7G42lwv70mg+sap7mVlZzOHNNM1p9BOVEo2K1RKNWtXMgXDbt/KakBLCab9sR4R68tS7JX281I8RK/kYOLqlVE0CahujcCJATZAsDLMCpjeN85vwqJ9Cy1errf69thZwo1QI1BvRIahsCgYAkmz1GMycqZvczJOpXLN3aEpZqGHAusJLEEltIRW4clNEr/U66wRi29B+wK3MYBxQsSdnS7cfTM5UM/gBtLRol2NrsjJOHPMGY60DAF3wbQWDdk+TSpYU+xvf/0hYFaZnXm+lpH6RSj0FhenpfXPiX0PYnB+L2qZs1VATM54HbsQKBgG9nVwkMuCpqUXfuuyrYmdzqbtYKdG5h6kj+v7Nsc3G7MwdBYQx2iqKJ27nrc2m5HpcmtGgr1qf1RyMNZJgDRnNUsdnK7kc2pybN8jMjoTQHMRj/r9NM6JN5BhHj3/4pkpohKXPs4TeewAtNLnfJkSum9Yscht82vfeaufRmpcWzAoGAfxcnMvi2EhE6uNjDENqnFH9XD2zAAeKhiQumz2ts3cSUd1QOfPMeytsBML/jdmOMQNaTbMryhWPaqTewHky8P+l/7oVbMTTFnaaaZRZCSOSXe+2R3mJkRQzE+DkVhgfpEku/BVGRHRvltM+ehk3m64j5vHWC97cP52qZ0bkxKHo= - - peerId: 12D3KooWFWyDckUJBtHtARzRDTRpo4XzeKAo8oN23MXh3Xwbp2fd + signingKey: 07JMoW5cQUtGO9nNIGQo9e99b7Wf/4YvTtNEA0lt4gCkmhwB1EB9ay+kitxVJJgmdyGLxbUUlGqwXsAj0zlHWw== + encryptionKey: MIIEpAIBAAKCAQEA7cA6J/icl8wseeXkt8oJr5AeYadUAG5EdCOdHj4S/Z7ivff4MOIKAeQITpq+rqhmXxOePYXSpQXE20Y9PW9tuw4gzOuq1ylSG/MWMcLDH1eIxg66rnmUqUbdiW4GGJjVjc9jvN0Up+MfSrUF6fM0jWTFoXVJQIeQQGERCIYjFzjfBl1xYvPghdxNgei/K5ZGYRggT28143XdIH4KTXGtp51hAKoyY9eCqYMtm9wvjxazhPVxO2CsYaqMxBLshY3jfHNqJnx8u6+h4Bl4uUcdbLNUgMcEgk7ehbQp2K0CqNoKXxbCTI6V57UVcJHDIaO5B6FyR6BguzHHNPJ4yd3q9wIDAQABAoIBAQCm2Mf3VRlPzhFIWnVwJXE2q8Umcu8Yfkm712Jj3twk8GPfPS4H4Bl1yjmqMB6xI6zz/CiItGlnNe04lMpVWuV+6CNMq/ZwmKbuxmFE+pFEZYGuvJd16gzR3tGJqJTOnjMAGhK8b8oXJ+TF4NQNooe20ol/DXgiuQAargPuH3RwzjYmF3N8VI4KUc3LaG4TwVXn4LwPOxrQSnfwJlZwLml1HAKOV0qcG0mXX6ZXOpoVhEoRPdQyUHc8ZW+53Agbtind7bYh5TsMVDFUrcgNwnwTOsWjil049la1IJO2uMRluacKlrtyzEp6zqrW8ZJO7mYAO69x4WyGqf2ZgIdA6djBAoGBAPqRHWAIgPa80eXbwCYkRtUG/ONBsQGi7+wm6nyhkXvNXJeokgH2DCgLH2+fW2scfOJuZc9r5WftEjOBvNfr2LDcwdyTSTh21WYcPSZx9HDf2d5/SWTcjNcyU0b5qfWIUKi/Zm9UY7r3X7yMA5dUD/cvu1PBJ5NWFrK1Gm2ph44dAoGBAPLn+LkHweU0fbxQq/76T5yVVpMKUaE9xwrJlUxEDPAQGnLPbFg4JeUt/YPhsOV85W4c4oQE+uFZrF0uf+1fEnS6MOJ+sq668upzC2hBp1B5138wM7615v1rvXVVH6qXfFop67FdBzPHt1NAN43mEIBZHTQ5hSVXFlYSZp9mxuEjAoGBAKCzUVO2IIAeub/iIGpV+dfGk4ptJ0kVZyreCqXEObpdC3V496uqUkGcYJ0GZ2ta6f2PMFzHpmnw8it2mdchu+gyrWL6U4uTK2pB0jZF/7Ak4WaB3GCD0xBxhleO6CJBOvn/R4M/bHcNEKmsYuE7WMIAKvScfPVR0VzsKfcLM5VBAoGAVvWg32zdh1bBZLdku8WU1rPH6KAbFSRuq3f7UPBTyWWaclu7p+GB/4f1aE9V6vJJmKASn7zArAhUYo+REMOmcc9uTMea5F7dM/23qb1HTtIvycLR44ZviW4Wx3iP+5x70jOLw1VQjMME6HLm8I/afHhqshWdiv6ganPv9UTwEg0CgYBSDi2dqg8F7ij5CN+LMDLSn3b8GCw+7efGIt7imm/O2V/FlHD40IA6qGg6DXNQrnoZQt94nMb1cZEvm1dxi6rmQNrhCyoMogAaPqgFhZGq1OjmhVZiXFUWy4WAcjdzFc9wZd3/XtaofRKHLK+ngTFhhVApKypLk3Rg9bCAAjzyVg== + - peerId: 12D3KooWDCypXSyN6ppuMZGxVnBd1ZQCMV4y7Bn187S4duYmf8rA address: 127.0.0.1:4432 - signingKey: YpCGjsSuT8O6mkYTOExkdwNRODBaJ20hYJHFO/A/RUFUsUwxIME9X9FIp69VYvKuL6er973p0iG7UVVvLgLjnA== - encryptionKey: MIIEpAIBAAKCAQEA2T4/6T5etB9W7qzJ1sNfWFdOTa2koXKcQkaLBUTervApLPZtaVsbNtyVFtqqdsck1qpu+AVif19EFlYqSRtn/dxEN5/2myqVA6lZMm0Bd9mWpfoDQx20KAYwWBwzKSH1EQiTte0bw1zf0RpztxQ3nCOLCU4Y6x2lfk6Ea2XEayPxx0FDmeY3JSqUDOwx33Sz8Imx8R7+Dfjl6Og3DEqGxXoPfZ6hj9LynqNswjRIdmMZPsuEHguKXMbp+cncErGWcyzH417XYSDPoRn/3awpLfQ9F+KSjAe5cUltC7M4veSZW+t3VcJypvfRlU4ayTZMuvMHPlMcl/0jP5w0Q2+2pQIDAQABAoIBAGMvmrqBcXfHv0cluNnHRebtpaCtoTbdPx67WonDUfCJUiNnN7kckaZQu/k9SQsGDXm9QwEWZExHUKzqFlBepPIw+Sx0aoGZxYNwdHsjbcIspC2PoqGoFDMZ8ESqS2mCSYPHaLltUnm2E7JC44Y5QtKVH8vVzma6mG68ppTqV+2aGfGiPDq8cAYeH9/8Ys8/S28IwCp/M7lnXZhJ38bHD3YyPpcgbyGI/Zr5xaPd0hqHH08Z+S9V7QPJUGY0Y21s99DhkUGctb4B17d0/3Nzk/iWY1rp7A/kbdBeWonsHrTc6OnmbdiOcjC8seOIKMJ/WE3JznqnI1oydFb/dp6raNkCgYEA+pn1akGIKnVP0oFh5PZfUpuZtVV9u9xccIXyeFmCAXyFuUz1KYbfwwqZnm9r6kHAO+aBtRtVsCVle5oVWNQq1pdv117hPhRnVrDtvL80z50a5L9gEVu4Yz24Q3vs3RglcVpafSaRuyPbiYHMmQ4Ly+9nbwEbOVDbzK5A3Wrny2cCgYEA3exS3aG7+7mbSnNTYkkTgl7goLXZgEST/0EM2CvayxZ2QUS94Vq5HjGRpWnni3YttLiYlgCLe3CqeiIh6E3n6b9sory8Oy6lik/elj28kcZIuNvPU0xVcqrmGCg/KEnYkXjsGKsBDk6SV9nKH7880oIe0Rh3gc0hHHIl0Z4CshMCgYBifXHLkffPIA4AIKN11jJ+h/LwJqpk0+Vsv+gczqjepq7ztcBA0uZMhHT9pLLX/YFsyVo+8IBL21a4LkWnhLNVZW0qSvrhaCl5E85LuSYrVoaEUoaSK+ca8d3if+kGt/+3PhiESU1LLHuS3nWnzbJrMysGoHuvmgzYs7+AhgyVjwKBgQCoVgrFc1lUqIXTA4fMlgHmcnGRdl91nI9mn8FOeHWOd4tcFvixaE/jR1ZjUuIAN7ST0TJtFhy3lc66tgliXTX9aObOyrs9aTTIpa0B6fKP4QhosNOjK9PlFx1SVbUSqnFMZ50vWQeEArWfTeS0ECviwjD+CsEcBK2JFkz5pBIHYQKBgQD3zcYdYwvGkolLXNN3vbgTVnbNe2YMUBwgp5i1XGzAiG8XpwKTi4vDFIYgCZAG5wsyqUPdTOY2wyLjHwGdUfl7P3tCsHVzVh/xvuSl3nzW3OdCniKaBBdtZS6+s25Ijzdwiwnp21NWE6XU2BptIwTMHrKOc7BpZykgHsORMtptsQ== + signingKey: SGyNE0dFaQgtgNuzdcO7LB+TEz9VHAOtlQLk6WWkrkQyXiZV3casg8Q2/4PO1Oylc8Fu72RU001Hclj5JCbiLw== + encryptionKey: MIIEpAIBAAKCAQEA0k3mw4FyexRkLgLjHzYs4Ppeyv6r9ZrP00imNf15JTuM8ajMx5oJX7JQTm8KOLRJjUdZZAd5Gtp0ezfYAQK1ZjEWwCmfp8j8FBgJIDSLpjxl88SXMLgATXYfhklnQvKlQjs/X3Ka4zdTrav2tMH9IAo6TSNZhlPQNsUory1SGHs+KqHv4p0sG8oWuKYhfBj8rWHQdUVptkIBKgojFDeJJD04Tbf9kUakbK/8KuXB6zF5H4WN3p4rMMwkClyTGeYO4LDg5TzVn8NnUi3/b/vO/3us1G/TMoRe/6umUfpQxrwo+7S2T6A4YwetWRp6xALLhp+HfAWnn0lA/D8/w1WpKwIDAQABAoIBAQC5cdQxRa5rddm48PbSCPWeFWkNW3DLDI6CYyedqDvxZwer+QtKXzww1I4X+7ZptiC9odLjb+uMkGHyXZXtnjPTPyounQWZ8JLILUGu0mbqWYwVXp9raHVr2OOHiKaz1D+BnbkOM4L9JUZ2eJL9ZaoNXLd4WdmRp8qM4WI0xqQDzOANx2HhyL/+dJmQeIUND+pdeH+Z+fYowU3ho32txNvBnMXQhF1T5K9i1VO5W49RAjIRbENsT+paPGKbNubDHRt1j36ktK4eC4HSdgv8tccdsGyrEiIbAt1XsTZfM8ie4D3A8RhSxiTC6Fkgv6vIm+iFTLzBFZKesOBcd8sfKeyBAoGBAOts5PQQJhldPDzlbnqzxMOR98WHbkVZjCqWSkNA34vqyFuPcRuX0rHK/qpg23ilbUP0fGMDTGgFzTt51FZLL16SXyRfjNhzjdmryryeddQwbp92ta2GEgnU6t1FyCuSCtcLDKJd/D9A9dC5UI6z+ES4TOnbR3nakXK9t4cUOFthAoGBAOSu+wL+SEA5erR+m3LpOsELK68CCJQPxn3VpoVfJZawgF+fEoXVMLTERxJput1+ADomIEdNc9ex86TjKx9gJ4piNHscRPFeT/AgESOIGHLOc1gk2DPqNj6wBIarUJQ9t4KcHScboh1dTPJeqqv2NSwIiLQoqFUIhfKZLnrW3zwLAoGBAJh0hC+o5YM3ZXLqAIllMN6VACbidP5j5ukNOjojIKCzAdyJH24G+2I3WoNrBbUzK3b+NC7KTAhw+V6ynlbjiWFs2D/twH/LFOkI3tkWpKcsVfbeIPimAbhsMUvpjJ7qjCqF9UCQLHGp14W6+/ftg7C8yNIINlkquVXclaTb60MBAoGAPqmL8ogG+EJH00mWAujRxq/u6meePiQMedKfbJBj1mTK6GjIRI/kZsQZzXvXTnYGTejAk4kvov0KDDaLTG+mpg6+3rUiVxlGwj+nMptKR7s2dAK0k5UsBAVrWBN9YwF+VXW9r0etJmq4ePljvvcaHtS/0M4LQjGxsoYy7EoQpX0CgYAhnf0McB7F1MxSjB0soMNv/v5utVzVihS3re2yKNdkI/YUEMB+yU3Q4gh+OljjBM6Y5To3BsQBAx4l2CysMKFHjIE/5AtdbvIS+chZZqB3vcZXSayvX8P1Z1uFdw/saiO2cRDJmR+TxaOPa2C9SzDoNTACthwLErHfzvEvVroKmw== space: gcTTL: 60 syncPeriod: 10 diff --git a/node/account/service.go b/node/account/service.go index 6f81b4fe..91f237b4 100644 --- a/node/account/service.go +++ b/node/account/service.go @@ -42,6 +42,14 @@ func (s *service) Init(a *app.App) (err error) { return err } + decodedPeerKey, err := keys.DecodeKeyFromString( + acc.PeerKey, + signingkey.NewSigningEd25519PrivKeyFromBytes, + nil) + if err != nil { + return err + } + identity, err := decodedSigningKey.GetPublic().Raw() if err != nil { return err @@ -49,10 +57,10 @@ func (s *service) Init(a *app.App) (err error) { s.accountData = &account.AccountData{ Identity: identity, + PeerKey: decodedPeerKey, SignKey: decodedSigningKey, EncKey: decodedEncryptionKey, } - s.peerId = acc.PeerId return nil } diff --git a/util/cmd/nodesgen/gen.go b/util/cmd/nodesgen/gen.go index b3d13b2b..ed659e48 100644 --- a/util/cmd/nodesgen/gen.go +++ b/util/cmd/nodesgen/gen.go @@ -3,7 +3,7 @@ package main import ( "flag" "fmt" - config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" + config "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey" @@ -46,8 +46,8 @@ func main() { } flag.Parse() - var configs []config2.Config - var nodes []config2.Node + var configs []config.Config + var nodes []config.Node for _, n := range nodesMap.Nodes { cfg, err := genNodeConfig(n.Addresses, n.APIPort) if err != nil { @@ -55,7 +55,7 @@ func main() { } configs = append(configs, cfg) - node := config2.Node{ + node := config.Node{ PeerId: cfg.Account.PeerId, Address: cfg.GrpcServer.ListenAddrs[0], SigningKey: cfg.Account.SigningKey, @@ -64,7 +64,7 @@ func main() { nodes = append(nodes, node) } - var clientConfigs []config2.Config + var clientConfigs []config.Config for _, c := range nodesMap.Clients { cfg, err := genClientConfig(c.Addresses, c.APIPort) if err != nil { @@ -143,96 +143,108 @@ func main() { } } -func genNodeConfig(addresses []string, apiPort string) (config2.Config, error) { +func genNodeConfig(addresses []string, apiPort string) (config.Config, error) { encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) if err != nil { - return config2.Config{}, err + return config.Config{}, err } signKey, _, err := signingkey.GenerateRandomEd25519KeyPair() if err != nil { - return config2.Config{}, err + return config.Config{}, err } encEncKey, err := keys.EncodeKeyToString(encKey) if err != nil { - return config2.Config{}, err + return config.Config{}, err } encSignKey, err := keys.EncodeKeyToString(signKey) if err != nil { - return config2.Config{}, err + return config.Config{}, err } peerID, err := peer.IDFromSigningPubKey(signKey.GetPublic()) if err != nil { - return config2.Config{}, err + return config.Config{}, err } - return config2.Config{ - Anytype: config2.Anytype{SwarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec"}, - GrpcServer: config2.GrpcServer{ + return config.Config{ + Anytype: config.Anytype{SwarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec"}, + GrpcServer: config.GrpcServer{ ListenAddrs: addresses, TLS: false, }, - Storage: config2.Storage{Path: "db"}, - Account: config2.Account{ + Storage: config.Storage{Path: "db"}, + Account: config.Account{ PeerId: peerID.String(), + PeerKey: encSignKey, SigningKey: encSignKey, EncryptionKey: encEncKey, }, - APIServer: config2.APIServer{ + APIServer: config.APIServer{ Port: apiPort, }, - Space: config2.Space{ + Space: config.Space{ GCTTL: 60, SyncPeriod: 10, }, }, nil } -func genClientConfig(addresses []string, apiPort string) (config2.Config, error) { +func genClientConfig(addresses []string, apiPort string) (config.Config, error) { encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048) if err != nil { - return config2.Config{}, err + return config.Config{}, err } signKey, _, err := signingkey.GenerateRandomEd25519KeyPair() if err != nil { - return config2.Config{}, err + return config.Config{}, err + } + + peerKey, _, err := signingkey.GenerateRandomEd25519KeyPair() + if err != nil { + return config.Config{}, err } encEncKey, err := keys.EncodeKeyToString(encKey) if err != nil { - return config2.Config{}, err + return config.Config{}, err } encSignKey, err := keys.EncodeKeyToString(signKey) if err != nil { - return config2.Config{}, err + return config.Config{}, err } - peerID, err := peer.IDFromSigningPubKey(signKey.GetPublic()) + encPeerKey, err := keys.EncodeKeyToString(peerKey) if err != nil { - return config2.Config{}, err + return config.Config{}, err } - return config2.Config{ - Anytype: config2.Anytype{SwarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec"}, - GrpcServer: config2.GrpcServer{ + peerID, err := peer.IDFromSigningPubKey(peerKey.GetPublic()) + if err != nil { + return config.Config{}, err + } + + return config.Config{ + Anytype: config.Anytype{SwarmKey: "/key/swarm/psk/1.0.0/base16/209992e611c27d5dce8fbd2e7389f6b51da9bee980992ef60739460b536139ec"}, + GrpcServer: config.GrpcServer{ ListenAddrs: addresses, TLS: false, }, - Storage: config2.Storage{Path: "db"}, - Account: config2.Account{ + Storage: config.Storage{Path: "db"}, + Account: config.Account{ PeerId: peerID.String(), + PeerKey: encPeerKey, SigningKey: encSignKey, EncryptionKey: encEncKey, }, - APIServer: config2.APIServer{ + APIServer: config.APIServer{ Port: apiPort, }, - Space: config2.Space{ + Space: config.Space{ GCTTL: 60, SyncPeriod: 10, }, @@ -266,12 +278,13 @@ func genConsensusConfig(addresses []string) (cconfig.Config, error) { } return cconfig.Config{ - GrpcServer: config2.GrpcServer{ + GrpcServer: config.GrpcServer{ ListenAddrs: addresses, TLS: false, }, - Account: config2.Account{ + Account: config.Account{ PeerId: peerID.String(), + PeerKey: encSignKey, SigningKey: encSignKey, EncryptionKey: encEncKey, }, From 9f080b4533dfe9f11f8eb1523cb5898e2d07e72c Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Mon, 7 Nov 2022 11:22:48 +0300 Subject: [PATCH 217/219] acl sync handler [wip] --- common/commonspace/syncacl/syncaclhandler.go | 31 ++++++++++ common/pkg/acl/list/list.go | 64 ++++++++++++++++---- common/pkg/acl/list/list_test.go | 4 ++ 3 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 common/commonspace/syncacl/syncaclhandler.go diff --git a/common/commonspace/syncacl/syncaclhandler.go b/common/commonspace/syncacl/syncaclhandler.go new file mode 100644 index 00000000..feb78e07 --- /dev/null +++ b/common/commonspace/syncacl/syncaclhandler.go @@ -0,0 +1,31 @@ +package syncacl + +import ( + "context" + "fmt" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" +) + +type syncAclHandler struct { + acl list.ACLList +} + +func (s *syncAclHandler) HandleMessage(ctx context.Context, senderId string, req *spacesyncproto.ObjectSyncMessage) (err error) { + aclMsg := &aclrecordproto.ACLSyncMessage{} + if err = aclMsg.Unmarshal(req.Payload); err != nil { + return + } + content := aclMsg.GetContent() + switch { + case content.GetAddRecords() != nil: + return s.handleAddRecords(ctx, senderId, content.GetAddRecords()) + default: + return fmt.Errorf("unexpected aclSync message: %T", content.Value) + } +} + +func (s *syncAclHandler) handleAddRecords(ctx context.Context, senderId string, addRecord *aclrecordproto.ACLAddRecords) (err error) { + return +} diff --git a/common/pkg/acl/list/list.go b/common/pkg/acl/list/list.go index 3c91bd33..1078f974 100644 --- a/common/pkg/acl/list/list.go +++ b/common/pkg/acl/list/list.go @@ -14,7 +14,10 @@ import ( type IterFunc = func(record *ACLRecord) (IsContinue bool) -var ErrIncorrectCID = errors.New("incorrect CID") +var ( + ErrIncorrectCID = errors.New("incorrect CID") + ErrInconsistent = errors.New("inconsistent record") +) type RWLocker interface { sync.Locker @@ -33,6 +36,9 @@ type ACLList interface { Get(id string) (*ACLRecord, error) Iterate(iterFunc IterFunc) IterateFrom(startId string, iterFunc IterFunc) + + AddRawRecord(rawRec *aclrecordproto.RawACLRecordWithId) (added bool, err error) + Close() (err error) } @@ -42,9 +48,10 @@ type aclList struct { indexes map[string]int id string - builder *aclStateBuilder - aclState *ACLState - keychain *common.Keychain + recBuilder ACLRecordBuilder + builder *aclStateBuilder + aclState *ACLState + keychain *common.Keychain sync.RWMutex } @@ -118,13 +125,13 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder } list = &aclList{ - root: aclRecRoot.Model.(*aclrecordproto.ACLRoot), - records: records, - indexes: indexes, - builder: stateBuilder, - aclState: state, - id: id, - RWMutex: sync.RWMutex{}, + root: aclRecRoot.Model.(*aclrecordproto.ACLRoot), + records: records, + indexes: indexes, + builder: stateBuilder, + recBuilder: recBuilder, + aclState: state, + id: id, } return } @@ -133,6 +140,41 @@ func (a *aclList) Records() []*ACLRecord { return a.records } +func (a *aclList) AddRawRecord(rawRec *aclrecordproto.RawACLRecordWithId) (added bool, err error) { + if _, ok := a.indexes[rawRec.Id]; ok { + return + } + record, err := a.recBuilder.ConvertFromRaw(rawRec) + if err != nil { + return + } + var lastId string + if len(a.records) > 0 { + lastId = a.records[len(a.records)-1].Id + } + if record.PrevId != lastId { + return false, ErrInconsistent + } + a.records = append(a.records, record) + a.indexes[record.Id] = len(a.records) - 1 + return true, nil +} + +func (a *aclList) IsValidNext(rawRec *aclrecordproto.RawACLRecordWithId) (err error) { + rec, err := a.recBuilder.ConvertFromRaw(rawRec) + if err != nil { + return + } + var lastId string + if len(a.records) > 0 { + lastId = a.records[len(a.records)-1].Id + } + if rec.PrevId != lastId { + return ErrInconsistent + } + return +} + func (a *aclList) ID() string { return a.id } diff --git a/common/pkg/acl/list/list_test.go b/common/pkg/acl/list/list_test.go index 668c2d5f..1096acd8 100644 --- a/common/pkg/acl/list/list_test.go +++ b/common/pkg/acl/list/list_test.go @@ -89,3 +89,7 @@ func TestAclList_ACLState_UserJoinAndRemove(t *testing.T) { _, err = aclList.ACLState().PermissionsAtRecord(records[3].Id, idB) assert.Error(t, err, "B should have no permissions at record 3, because user should be removed") } + +func TestAclList_AddRawRecord(t *testing.T) { + +} From 925005a9de30a01fa3bd23339b9c79905103381e Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 7 Nov 2022 13:36:10 +0100 Subject: [PATCH 218/219] Fix tests and change peer id context logic --- common/commonspace/diffservice/diffsyncer.go | 3 +- common/commonspace/syncservice/streampool.go | 14 +---- .../syncservice/streampool_test.go | 61 +++++++++---------- common/commonspace/syncservice/syncservice.go | 6 +- common/commonspace/synctree/synctree.go | 4 +- common/net/peer/context.go | 32 ++++++++++ common/net/peer/peer.go | 5 -- common/net/rpc/rpctest/pool.go | 8 +-- common/net/rpc/rpctest/server.go | 58 +----------------- common/net/secure/context.go | 28 --------- common/net/secure/listener.go | 3 +- .../acl/aclrecordproto/protos/aclrecord.proto | 22 +++---- common/pkg/acl/list/aclrecordbuilder_test.go | 4 +- common/pkg/acl/list/list_test.go | 4 -- common/pkg/acl/list/mock_list/mock_list.go | 18 +++--- 15 files changed, 100 insertions(+), 170 deletions(-) create mode 100644 common/net/peer/context.go delete mode 100644 common/net/secure/context.go diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index a30100b2..f9ca9f26 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -11,7 +11,6 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff" "go.uber.org/zap" - "storj.io/drpc/drpcctx" "time" ) @@ -76,7 +75,7 @@ func (d *diffSyncer) syncWithPeer(ctx context.Context, p peer.Peer) (err error) return d.sendPushSpaceRequest(ctx, cl) } - ctx = context.WithValue(ctx, drpcctx.TransportKey{}, p.Secure()) + ctx = peer.CtxWithPeerId(ctx, p.Id()) d.pingTreesInCache(ctx, newIds) d.pingTreesInCache(ctx, changedIds) d.pingTreesInCache(ctx, removedIds) diff --git a/common/commonspace/syncservice/streampool.go b/common/commonspace/syncservice/streampool.go index f5e21a20..a2bbe4ce 100644 --- a/common/commonspace/syncservice/streampool.go +++ b/common/commonspace/syncservice/streampool.go @@ -5,9 +5,8 @@ import ( "errors" "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/pkg/ocache" - "github.com/libp2p/go-libp2p/core/sec" - "storj.io/drpc/drpcctx" "sync" "sync/atomic" "time" @@ -190,7 +189,7 @@ func (s *streamPool) AddAndReadStreamAsync(stream spacesyncproto.SpaceStream) { func (s *streamPool) AddAndReadStreamSync(stream spacesyncproto.SpaceStream) (err error) { s.Lock() - peerId, err := GetPeerIdFromStreamContext(stream.Context()) + peerId, err := peer.CtxPeerId(stream.Context()) if err != nil { s.Unlock() return @@ -277,15 +276,6 @@ func (s *streamPool) removePeer(peerId string) (err error) { return } -func GetPeerIdFromStreamContext(ctx context.Context) (string, error) { - conn, ok := ctx.Value(drpcctx.TransportKey{}).(sec.SecureConn) - if !ok { - return "", fmt.Errorf("incorrect connection type in stream") - } - - return conn.RemotePeer().String(), nil -} - func genStreamPoolKey(peerId, treeId string, counter uint64) string { return fmt.Sprintf("%s.%s.%d", peerId, treeId, counter) } diff --git a/common/commonspace/syncservice/streampool_test.go b/common/commonspace/syncservice/streampool_test.go index a9cc2bae..2d2ff512 100644 --- a/common/commonspace/syncservice/streampool_test.go +++ b/common/commonspace/syncservice/streampool_test.go @@ -3,9 +3,9 @@ package syncservice import ( "context" "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/rpctest" "github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto" - "github.com/libp2p/go-libp2p/core/peer" "github.com/stretchr/testify/require" "testing" "time" @@ -53,24 +53,23 @@ type fixture struct { clientStream spacesyncproto.DRPCSpace_StreamStream serverStream spacesyncproto.DRPCSpace_StreamStream pool *streamPool - localId peer.ID - remoteId peer.ID + clientId string + serverId string } -func newFixture(t *testing.T, localId, remoteId peer.ID, handler MessageHandler) *fixture { +func newFixture(t *testing.T, clientId, serverId string, handler MessageHandler) *fixture { fx := &fixture{ testServer: &testServer{}, drpcTS: rpctest.NewTestServer(), - localId: localId, - remoteId: remoteId, + clientId: clientId, + serverId: serverId, } fx.testServer.stream = make(chan spacesyncproto.DRPCSpace_StreamStream, 1) require.NoError(t, spacesyncproto.DRPCRegisterSpace(fx.drpcTS.Mux, fx.testServer)) - clientWrapper := rpctest.NewSecConnWrapper(nil, nil, localId, remoteId) - fx.client = spacesyncproto.NewDRPCSpaceClient(fx.drpcTS.DialWrapConn(nil, clientWrapper)) + fx.client = spacesyncproto.NewDRPCSpaceClient(fx.drpcTS.Dial(peer.CtxWithPeerId(context.Background(), clientId))) var err error - fx.clientStream, err = fx.client.Stream(context.Background()) + fx.clientStream, err = fx.client.Stream(peer.CtxWithPeerId(context.Background(), serverId)) require.NoError(t, err) fx.serverStream = fx.testServer.waitStream(t) fx.pool = newStreamPool(handler).(*streamPool) @@ -87,14 +86,14 @@ func (fx *fixture) run(t *testing.T) chan error { time.Sleep(time.Millisecond * 10) fx.pool.Lock() - require.Equal(t, fx.pool.peerStreams[fx.remoteId.String()], fx.clientStream) + require.Equal(t, fx.pool.peerStreams[fx.serverId], fx.clientStream) fx.pool.Unlock() return waitCh } func TestStreamPool_AddAndReadStreamAsync(t *testing.T) { - remId := peer.ID("remoteId") + remId := "remoteId" t.Run("client close", func(t *testing.T) { fx := newFixture(t, "", remId, nil) @@ -105,7 +104,7 @@ func TestStreamPool_AddAndReadStreamAsync(t *testing.T) { err = <-waitCh require.Error(t, err) - require.Nil(t, fx.pool.peerStreams[remId.String()]) + require.Nil(t, fx.pool.peerStreams[remId]) }) t.Run("server close", func(t *testing.T) { fx := newFixture(t, "", remId, nil) @@ -116,12 +115,12 @@ func TestStreamPool_AddAndReadStreamAsync(t *testing.T) { err = <-waitCh require.Error(t, err) - require.Nil(t, fx.pool.peerStreams[remId.String()]) + require.Nil(t, fx.pool.peerStreams[remId]) }) } func TestStreamPool_Close(t *testing.T) { - remId := peer.ID("remoteId") + remId := "remoteId" t.Run("client close", func(t *testing.T) { fx := newFixture(t, "", remId, nil) @@ -160,7 +159,7 @@ func TestStreamPool_Close(t *testing.T) { } func TestStreamPool_ReceiveMessage(t *testing.T) { - remId := peer.ID("remoteId") + remId := "remoteId" t.Run("pool receive message from server", func(t *testing.T) { objectId := "objectId" msg := &spacesyncproto.ObjectSyncMessage{ @@ -182,23 +181,23 @@ func TestStreamPool_ReceiveMessage(t *testing.T) { err = <-waitCh require.Error(t, err) - require.Nil(t, fx.pool.peerStreams[remId.String()]) + require.Nil(t, fx.pool.peerStreams[remId]) }) } func TestStreamPool_HasActiveStream(t *testing.T) { - remId := peer.ID("remoteId") + remId := "remoteId" t.Run("pool has active stream", func(t *testing.T) { fx := newFixture(t, "", remId, nil) waitCh := fx.run(t) - require.True(t, fx.pool.HasActiveStream(remId.String())) + require.True(t, fx.pool.HasActiveStream(remId)) err := fx.clientStream.Close() require.NoError(t, err) err = <-waitCh require.Error(t, err) - require.Nil(t, fx.pool.peerStreams[remId.String()]) + require.Nil(t, fx.pool.peerStreams[remId]) }) t.Run("pool has no active stream", func(t *testing.T) { fx := newFixture(t, "", remId, nil) @@ -207,13 +206,13 @@ func TestStreamPool_HasActiveStream(t *testing.T) { require.NoError(t, err) err = <-waitCh require.Error(t, err) - require.False(t, fx.pool.HasActiveStream(remId.String())) - require.Nil(t, fx.pool.peerStreams[remId.String()]) + require.False(t, fx.pool.HasActiveStream(remId)) + require.Nil(t, fx.pool.peerStreams[remId]) }) } func TestStreamPool_SendAsync(t *testing.T) { - remId := peer.ID("remoteId") + remId := "remoteId" t.Run("pool send async to server", func(t *testing.T) { objectId := "objectId" msg := &spacesyncproto.ObjectSyncMessage{ @@ -229,7 +228,7 @@ func TestStreamPool_SendAsync(t *testing.T) { }() waitCh := fx.run(t) - err := fx.pool.SendAsync([]string{remId.String()}, msg) + err := fx.pool.SendAsync([]string{remId}, msg) require.NoError(t, err) <-recvChan err = fx.clientStream.Close() @@ -237,12 +236,12 @@ func TestStreamPool_SendAsync(t *testing.T) { err = <-waitCh require.Error(t, err) - require.Nil(t, fx.pool.peerStreams[remId.String()]) + require.Nil(t, fx.pool.peerStreams[remId]) }) } func TestStreamPool_SendSync(t *testing.T) { - remId := peer.ID("remoteId") + remId := "remoteId" t.Run("pool send sync to server", func(t *testing.T) { objectId := "objectId" payload := []byte("payload") @@ -260,7 +259,7 @@ func TestStreamPool_SendSync(t *testing.T) { require.NoError(t, err) }() waitCh := fx.run(t) - res, err := fx.pool.SendSync(remId.String(), msg) + res, err := fx.pool.SendSync(remId, msg) require.NoError(t, err) require.Equal(t, payload, res.Payload) err = fx.clientStream.Close() @@ -268,7 +267,7 @@ func TestStreamPool_SendSync(t *testing.T) { err = <-waitCh require.Error(t, err) - require.Nil(t, fx.pool.peerStreams[remId.String()]) + require.Nil(t, fx.pool.peerStreams[remId]) }) t.Run("pool send sync timeout", func(t *testing.T) { @@ -285,19 +284,19 @@ func TestStreamPool_SendSync(t *testing.T) { require.NotEmpty(t, message.ReplyId) }() waitCh := fx.run(t) - _, err := fx.pool.SendSync(remId.String(), msg) + _, err := fx.pool.SendSync(remId, msg) require.Equal(t, ErrSyncTimeout, err) err = fx.clientStream.Close() require.NoError(t, err) err = <-waitCh require.Error(t, err) - require.Nil(t, fx.pool.peerStreams[remId.String()]) + require.Nil(t, fx.pool.peerStreams[remId]) }) } func TestStreamPool_BroadcastAsync(t *testing.T) { - remId := peer.ID("remoteId") + remId := "remoteId" t.Run("pool broadcast async to server", func(t *testing.T) { objectId := "objectId" msg := &spacesyncproto.ObjectSyncMessage{ @@ -321,6 +320,6 @@ func TestStreamPool_BroadcastAsync(t *testing.T) { err = <-waitCh require.Error(t, err) - require.Nil(t, fx.pool.peerStreams[remId.String()]) + require.Nil(t, fx.pool.peerStreams[remId]) }) } diff --git a/common/commonspace/syncservice/syncservice.go b/common/commonspace/syncservice/syncservice.go index 38de40f8..983f5698 100644 --- a/common/commonspace/syncservice/syncservice.go +++ b/common/commonspace/syncservice/syncservice.go @@ -97,11 +97,11 @@ func (s *syncService) responsibleStreamCheckLoop(ctx context.Context) { if err != nil { return } - for _, peer := range respPeers { - if s.streamPool.HasActiveStream(peer.Id()) { + for _, p := range respPeers { + if s.streamPool.HasActiveStream(p.Id()) { continue } - stream, err := s.clientFactory.Client(peer).Stream(ctx) + stream, err := s.clientFactory.Client(p).Stream(ctx) if err != nil { err = rpcerr.Unwrap(err) log.With("spaceId", s.spaceId).Errorf("failed to open stream: %v", err) diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index ac7b5aac..c3d09d96 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -10,6 +10,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage" @@ -111,8 +112,7 @@ func CreateSyncTree(ctx context.Context, deps CreateDeps) (t tree.ObjectTree, er func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t tree.ObjectTree, err error) { getTreeRemote := func() (msg *treechangeproto.TreeSyncMessage, err error) { - // TODO: add empty context handling (when this is not happening due to head update) - peerId, err := syncservice.GetPeerIdFromStreamContext(ctx) + peerId, err := peer.CtxPeerId(ctx) if err != nil { return } diff --git a/common/net/peer/context.go b/common/net/peer/context.go new file mode 100644 index 00000000..bf3b79f3 --- /dev/null +++ b/common/net/peer/context.go @@ -0,0 +1,32 @@ +package peer + +import ( + "context" + "errors" + "github.com/libp2p/go-libp2p/core/sec" + "storj.io/drpc/drpcctx" +) + +type contextKey uint + +const ( + contextKeyPeerId contextKey = iota +) + +var ErrPeerIdNotFoundInContext = errors.New("peer id not found in context") + +// CtxPeerId first tries to get peer id under our own key, but if it is not found tries to get through DRPC key +func CtxPeerId(ctx context.Context) (string, error) { + if peerId, ok := ctx.Value(contextKeyPeerId).(string); ok { + return peerId, nil + } + if conn, ok := ctx.Value(drpcctx.TransportKey{}).(sec.SecureConn); ok { + return conn.RemotePeer().String(), nil + } + return "", ErrPeerIdNotFoundInContext +} + +// CtxWithPeerId sets peer id in the context +func CtxWithPeerId(ctx context.Context, peerId string) context.Context { + return context.WithValue(ctx, contextKeyPeerId, peerId) +} diff --git a/common/net/peer/peer.go b/common/net/peer/peer.go index 3dfe517b..6056b0b9 100644 --- a/common/net/peer/peer.go +++ b/common/net/peer/peer.go @@ -21,7 +21,6 @@ type Peer interface { Id() string LastUsage() time.Time UpdateLastUsage() - Secure() sec.SecureConn drpc.Conn } @@ -36,10 +35,6 @@ func (p *peer) Id() string { return p.id } -func (p *peer) Secure() sec.SecureConn { - return p.sc -} - func (p *peer) LastUsage() time.Time { select { case <-p.Closed(): diff --git a/common/net/rpc/rpctest/pool.go b/common/net/rpc/rpctest/pool.go index 7e73b226..549e8712 100644 --- a/common/net/rpc/rpctest/pool.go +++ b/common/net/rpc/rpctest/pool.go @@ -36,7 +36,7 @@ func (t *TestPool) Get(ctx context.Context, id string) (peer.Peer, error) { if t.ts == nil { return nil, ErrCantConnect } - return &testPeer{id: id, Conn: t.ts.Dial()}, nil + return &testPeer{id: id, Conn: t.ts.Dial(ctx)}, nil } func (t *TestPool) Dial(ctx context.Context, id string) (peer.Peer, error) { @@ -45,7 +45,7 @@ func (t *TestPool) Dial(ctx context.Context, id string) (peer.Peer, error) { if t.ts == nil { return nil, ErrCantConnect } - return &testPeer{id: id, Conn: t.ts.Dial()}, nil + return &testPeer{id: id, Conn: t.ts.Dial(ctx)}, nil } func (t *TestPool) GetOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) { @@ -54,7 +54,7 @@ func (t *TestPool) GetOneOf(ctx context.Context, peerIds []string) (peer.Peer, e if t.ts == nil { return nil, ErrCantConnect } - return &testPeer{id: peerIds[rand.Intn(len(peerIds))], Conn: t.ts.Dial()}, nil + return &testPeer{id: peerIds[rand.Intn(len(peerIds))], Conn: t.ts.Dial(ctx)}, nil } func (t *TestPool) DialOneOf(ctx context.Context, peerIds []string) (peer.Peer, error) { @@ -63,7 +63,7 @@ func (t *TestPool) DialOneOf(ctx context.Context, peerIds []string) (peer.Peer, if t.ts == nil { return nil, ErrCantConnect } - return &testPeer{id: peerIds[rand.Intn(len(peerIds))], Conn: t.ts.Dial()}, nil + return &testPeer{id: peerIds[rand.Intn(len(peerIds))], Conn: t.ts.Dial(ctx)}, nil } func (t *TestPool) Init(a *app.App) (err error) { diff --git a/common/net/rpc/rpctest/server.go b/common/net/rpc/rpctest/server.go index 134ce6cb..9a36d288 100644 --- a/common/net/rpc/rpctest/server.go +++ b/common/net/rpc/rpctest/server.go @@ -2,8 +2,6 @@ package rpctest import ( "context" - "github.com/libp2p/go-libp2p/core/crypto" - "github.com/libp2p/go-libp2p/core/peer" "net" "storj.io/drpc" "storj.io/drpc/drpcconn" @@ -11,48 +9,6 @@ import ( "storj.io/drpc/drpcserver" ) -type SecConnMock struct { - net.Conn - localPrivKey crypto.PrivKey - remotePubKey crypto.PubKey - localId peer.ID - remoteId peer.ID -} - -func (s *SecConnMock) LocalPeer() peer.ID { - return s.localId -} - -func (s *SecConnMock) LocalPrivateKey() crypto.PrivKey { - return s.localPrivKey -} - -func (s *SecConnMock) RemotePeer() peer.ID { - return s.remoteId -} - -func (s *SecConnMock) RemotePublicKey() crypto.PubKey { - return s.remotePubKey -} - -type ConnWrapper func(conn net.Conn) net.Conn - -func NewSecConnWrapper( - localPrivKey crypto.PrivKey, - remotePubKey crypto.PubKey, - localId peer.ID, - remoteId peer.ID) ConnWrapper { - return func(conn net.Conn) net.Conn { - return &SecConnMock{ - Conn: conn, - localPrivKey: localPrivKey, - remotePubKey: remotePubKey, - localId: localId, - remoteId: remoteId, - } - } -} - func NewTestServer() *TesServer { ts := &TesServer{ Mux: drpcmux.New(), @@ -66,18 +22,8 @@ type TesServer struct { *drpcserver.Server } -func (ts *TesServer) Dial() drpc.Conn { - return ts.DialWrapConn(nil, nil) -} - -func (ts *TesServer) DialWrapConn(serverWrapper ConnWrapper, clientWrapper ConnWrapper) drpc.Conn { +func (ts *TesServer) Dial(ctx context.Context) drpc.Conn { sc, cc := net.Pipe() - if serverWrapper != nil { - sc = serverWrapper(sc) - } - if clientWrapper != nil { - cc = clientWrapper(cc) - } - go ts.Server.ServeOne(context.Background(), sc) + go ts.Server.ServeOne(ctx, sc) return drpcconn.New(cc) } diff --git a/common/net/secure/context.go b/common/net/secure/context.go deleted file mode 100644 index e22b3b00..00000000 --- a/common/net/secure/context.go +++ /dev/null @@ -1,28 +0,0 @@ -package secure - -import ( - "context" - "errors" - "github.com/libp2p/go-libp2p/core/sec" -) - -var ( - ErrSecureConnNotFoundInContext = errors.New("secure connection not found in context") -) - -type contextKey uint - -const ( - contextKeySecureConn contextKey = iota -) - -func CtxSecureConn(ctx context.Context) (sec.SecureConn, error) { - if conn, ok := ctx.Value(contextKeySecureConn).(sec.SecureConn); ok { - return conn, nil - } - return nil, ErrSecureConnNotFoundInContext -} - -func ctxWithSecureConn(ctx context.Context, conn sec.SecureConn) context.Context { - return context.WithValue(ctx, contextKeySecureConn, conn) -} diff --git a/common/net/secure/listener.go b/common/net/secure/listener.go index b7c31b26..db16470f 100644 --- a/common/net/secure/listener.go +++ b/common/net/secure/listener.go @@ -2,6 +2,7 @@ package secure import ( "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer" "github.com/libp2p/go-libp2p/core/crypto" libp2ptls "github.com/libp2p/go-libp2p/p2p/security/tls" "net" @@ -45,6 +46,6 @@ func (p *tlsListener) upgradeConn(ctx context.Context, conn net.Conn) (context.C if err != nil { return nil, nil, HandshakeError(err) } - ctx = ctxWithSecureConn(ctx, secure) + ctx = peer.CtxWithPeerId(ctx, secure.RemotePeer().String()) return ctx, secure, nil } diff --git a/common/pkg/acl/aclrecordproto/protos/aclrecord.proto b/common/pkg/acl/aclrecordproto/protos/aclrecord.proto index 7fe61b89..51f74853 100644 --- a/common/pkg/acl/aclrecordproto/protos/aclrecord.proto +++ b/common/pkg/acl/aclrecordproto/protos/aclrecord.proto @@ -66,23 +66,23 @@ message ACLUserAdd { } message ACLUserInvite { - bytes acceptPublicKey = 1; - uint64 encryptSymKeyHash = 2; - repeated bytes encryptedReadKeys = 3; - ACLUserPermissions permissions = 4; + bytes acceptPublicKey = 1; + uint64 encryptSymKeyHash = 2; + repeated bytes encryptedReadKeys = 3; + ACLUserPermissions permissions = 4; } message ACLUserJoin { - bytes identity = 1; - bytes encryptionKey = 2; - bytes acceptSignature = 3; - bytes acceptPubKey = 4; - repeated bytes encryptedReadKeys = 5; + bytes identity = 1; + bytes encryptionKey = 2; + bytes acceptSignature = 3; + bytes acceptPubKey = 4; + repeated bytes encryptedReadKeys = 5; } message ACLUserRemove { - bytes identity = 1; - repeated ACLReadKeyReplace readKeyReplaces = 2; + bytes identity = 1; + repeated ACLReadKeyReplace readKeyReplaces = 2; } message ACLReadKeyReplace { diff --git a/common/pkg/acl/list/aclrecordbuilder_test.go b/common/pkg/acl/list/aclrecordbuilder_test.go index 42a9cbb7..a804bcb4 100644 --- a/common/pkg/acl/list/aclrecordbuilder_test.go +++ b/common/pkg/acl/list/aclrecordbuilder_test.go @@ -1,7 +1,6 @@ package list import ( - "context" account "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common" @@ -44,7 +43,8 @@ func TestAclRecordBuilder_BuildUserJoin(t *testing.T) { Payload: marshalledJoin, Id: id, } - err = aclList.AddRawRecords(context.Background(), []*aclrecordproto.RawACLRecordWithId{rawRec}) + res, err := aclList.AddRawRecord(rawRec) + require.True(t, res) require.NoError(t, err) require.Equal(t, aclrecordproto.ACLUserPermissions_Writer, aclList.ACLState().UserStates()[identity].Permissions) } diff --git a/common/pkg/acl/list/list_test.go b/common/pkg/acl/list/list_test.go index 965d6221..c4effdae 100644 --- a/common/pkg/acl/list/list_test.go +++ b/common/pkg/acl/list/list_test.go @@ -89,7 +89,3 @@ func TestAclList_ACLState_UserJoinAndRemove(t *testing.T) { _, err = aclList.ACLState().PermissionsAtRecord(records[3].Id, idB) assert.Error(t, err, "B should have no permissions at record 3, because user should be removed") } - -func TestAclList_AddRawRecord(t *testing.T) { - -} diff --git a/common/pkg/acl/list/mock_list/mock_list.go b/common/pkg/acl/list/mock_list/mock_list.go index 4e1c0762..c70c183b 100644 --- a/common/pkg/acl/list/mock_list/mock_list.go +++ b/common/pkg/acl/list/mock_list/mock_list.go @@ -5,7 +5,6 @@ package mock_list import ( - context "context" reflect "reflect" aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" @@ -50,18 +49,19 @@ func (mr *MockACLListMockRecorder) ACLState() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ACLState", reflect.TypeOf((*MockACLList)(nil).ACLState)) } -// AddRawRecords mocks base method. -func (m *MockACLList) AddRawRecords(arg0 context.Context, arg1 []*aclrecordproto.RawACLRecordWithId) error { +// AddRawRecord mocks base method. +func (m *MockACLList) AddRawRecord(arg0 *aclrecordproto.RawACLRecordWithId) (bool, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AddRawRecords", arg0, arg1) - ret0, _ := ret[0].(error) - return ret0 + ret := m.ctrl.Call(m, "AddRawRecord", arg0) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// AddRawRecords indicates an expected call of AddRawRecords. -func (mr *MockACLListMockRecorder) AddRawRecords(arg0, arg1 interface{}) *gomock.Call { +// AddRawRecord indicates an expected call of AddRawRecord. +func (mr *MockACLListMockRecorder) AddRawRecord(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawRecords", reflect.TypeOf((*MockACLList)(nil).AddRawRecords), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawRecord", reflect.TypeOf((*MockACLList)(nil).AddRawRecord), arg0) } // Close mocks base method. From d5ef4f931329cfc76b1e1b31c2cb5480f60c18b5 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 7 Nov 2022 15:53:27 +0100 Subject: [PATCH 219/219] Add client space --- client/clientspace/service.go | 19 ++++++++++++++++--- client/clientspace/space.go | 22 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 client/clientspace/space.go diff --git a/client/clientspace/service.go b/client/clientspace/service.go index fdb90e51..d22ab135 100644 --- a/client/clientspace/service.go +++ b/client/clientspace/service.go @@ -41,9 +41,7 @@ func (s *service) Init(a *app.App) (err error) { s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service) s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider) s.spaceCache = ocache.New( - func(ctx context.Context, id string) (value ocache.Object, err error) { - return s.commonSpace.NewSpace(ctx, id) - }, + s.loadSpace, ocache.WithLogger(log.Sugar()), ocache.WithGCPeriod(time.Minute), ocache.WithTTL(time.Duration(s.conf.GCTTL)*time.Second), @@ -97,6 +95,21 @@ func (s *service) AddSpace(ctx context.Context, description commonspace.SpaceDes return s.commonSpace.AddSpace(ctx, description) } +func (s *service) loadSpace(ctx context.Context, id string) (value ocache.Object, err error) { + cc, err := s.commonSpace.NewSpace(ctx, id) + if err != nil { + return + } + ns, err := newClientSpace(cc) + if err != nil { + return + } + if err = ns.Init(ctx); err != nil { + return + } + return ns, nil +} + func (s *service) Close(ctx context.Context) (err error) { return s.spaceCache.Close() } diff --git a/client/clientspace/space.go b/client/clientspace/space.go new file mode 100644 index 00000000..f0e7fda3 --- /dev/null +++ b/client/clientspace/space.go @@ -0,0 +1,22 @@ +package clientspace + +import ( + "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" +) + +func newClientSpace(cc commonspace.Space) (commonspace.Space, error) { + return &clientSpace{cc}, nil +} + +type clientSpace struct { + commonspace.Space +} + +func (s *clientSpace) Init(ctx context.Context) (err error) { + return s.Space.Init(ctx) +} + +func (s *clientSpace) Close() (err error) { + return s.Space.Close() +}