Add inmemory thread and build logic
This commit is contained in:
parent
3424f15a02
commit
0a118c4891
32
acltree/threadutility.go
Normal file
32
acltree/threadutility.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package acltree
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/account"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/thread"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
||||||
|
)
|
||||||
|
|
||||||
|
func BuildThreadWithACL(
|
||||||
|
acc *account.AccountData,
|
||||||
|
build func(builder ChangeBuilder),
|
||||||
|
create func(change *thread.RawChange) (thread.Thread, error)) (thread.Thread, error) {
|
||||||
|
bld := newChangeBuilder()
|
||||||
|
bld.Init(
|
||||||
|
newACLState(acc.Identity, acc.EncKey, keys.NewEd25519Decoder()),
|
||||||
|
&Tree{},
|
||||||
|
acc)
|
||||||
|
build(bld)
|
||||||
|
bld.SetMakeSnapshot(true)
|
||||||
|
|
||||||
|
change, payload, err := bld.Build()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
rawChange := &thread.RawChange{
|
||||||
|
Payload: payload,
|
||||||
|
Signature: change.Signature(),
|
||||||
|
Id: change.CID(),
|
||||||
|
}
|
||||||
|
return create(rawChange)
|
||||||
|
}
|
||||||
112
thread/inmemory.go
Normal file
112
thread/inmemory.go
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
package thread
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/aclchanges"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/thread/pb"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice"
|
||||||
|
"github.com/gogo/protobuf/proto"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type inMemoryThread struct {
|
||||||
|
id string
|
||||||
|
header *pb.ThreadHeader
|
||||||
|
heads []string
|
||||||
|
orphans []string
|
||||||
|
changes map[string]*RawChange
|
||||||
|
|
||||||
|
sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewInMemoryThread(firstChange *RawChange) (Thread, error) {
|
||||||
|
header := &pb.ThreadHeader{
|
||||||
|
FirstChangeId: firstChange.Id,
|
||||||
|
IsWorkspace: false,
|
||||||
|
}
|
||||||
|
marshalledHeader, err := proto.Marshal(header)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
threadId, err := cid.NewCIDFromBytes(marshalledHeader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
changes := make(map[string]*RawChange)
|
||||||
|
changes[firstChange.Id] = firstChange
|
||||||
|
|
||||||
|
return &inMemoryThread{
|
||||||
|
id: threadId,
|
||||||
|
header: header,
|
||||||
|
heads: []string{firstChange.Id},
|
||||||
|
orphans: nil,
|
||||||
|
changes: changes,
|
||||||
|
Mutex: sync.Mutex{},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryThread) ID() string {
|
||||||
|
return t.id
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryThread) Header() *pb.ThreadHeader {
|
||||||
|
return t.header
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryThread) Heads() []string {
|
||||||
|
return t.heads
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryThread) Orphans() []string {
|
||||||
|
return t.orphans
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryThread) SetHeads(heads []string) {
|
||||||
|
t.heads = t.heads[:0]
|
||||||
|
|
||||||
|
for _, h := range heads {
|
||||||
|
t.heads = append(t.heads, h)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryThread) RemoveOrphans(orphans ...string) {
|
||||||
|
t.orphans = slice.Difference(t.orphans, orphans)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryThread) AddOrphans(orphans ...string) {
|
||||||
|
t.orphans = append(t.orphans, orphans...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryThread) AddRawChange(change *RawChange) error {
|
||||||
|
// TODO: better to do deep copy
|
||||||
|
t.changes[change.Id] = change
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryThread) AddChange(change aclchanges.Change) error {
|
||||||
|
signature := change.Signature()
|
||||||
|
id := change.CID()
|
||||||
|
aclChange := change.ProtoChange()
|
||||||
|
|
||||||
|
fullMarshalledChange, err := proto.Marshal(aclChange)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
rawChange := &RawChange{
|
||||||
|
Payload: fullMarshalledChange,
|
||||||
|
Signature: signature,
|
||||||
|
Id: id,
|
||||||
|
}
|
||||||
|
t.changes[id] = rawChange
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryThread) GetChange(ctx context.Context, changeId string) (*RawChange, error) {
|
||||||
|
if res, exists := t.changes[changeId]; exists {
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("could not get change with id: %s", changeId)
|
||||||
|
}
|
||||||
@ -3,6 +3,6 @@ package anytype;
|
|||||||
option go_package = "pb";
|
option go_package = "pb";
|
||||||
|
|
||||||
message ThreadHeader {
|
message ThreadHeader {
|
||||||
string firstRecordId = 1;
|
string firstChangeId = 1;
|
||||||
bool isWorkspace = 2;
|
bool isWorkspace = 2;
|
||||||
}
|
}
|
||||||
@ -23,7 +23,7 @@ var _ = math.Inf
|
|||||||
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
|
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
|
||||||
|
|
||||||
type ThreadHeader struct {
|
type ThreadHeader struct {
|
||||||
FirstRecordId string `protobuf:"bytes,1,opt,name=firstRecordId,proto3" json:"firstRecordId,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"`
|
IsWorkspace bool `protobuf:"varint,2,opt,name=isWorkspace,proto3" json:"isWorkspace,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,9 +60,9 @@ func (m *ThreadHeader) XXX_DiscardUnknown() {
|
|||||||
|
|
||||||
var xxx_messageInfo_ThreadHeader proto.InternalMessageInfo
|
var xxx_messageInfo_ThreadHeader proto.InternalMessageInfo
|
||||||
|
|
||||||
func (m *ThreadHeader) GetFirstRecordId() string {
|
func (m *ThreadHeader) GetFirstChangeId() string {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.FirstRecordId
|
return m.FirstChangeId
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@ -86,12 +86,12 @@ var fileDescriptor_b228ffbfd554b168 = []byte{
|
|||||||
0x4d, 0x4c, 0xd1, 0x2f, 0x48, 0xd2, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x2f, 0xd6, 0x87, 0x08, 0xe8,
|
0x4d, 0x4c, 0xd1, 0x2f, 0x48, 0xd2, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x2f, 0xd6, 0x87, 0x08, 0xe8,
|
||||||
0x81, 0x79, 0x42, 0xec, 0x89, 0x79, 0x95, 0x25, 0x95, 0x05, 0xa9, 0x4a, 0x61, 0x5c, 0x3c, 0x21,
|
0x81, 0x79, 0x42, 0xec, 0x89, 0x79, 0x95, 0x25, 0x95, 0x05, 0xa9, 0x4a, 0x61, 0x5c, 0x3c, 0x21,
|
||||||
0x60, 0x09, 0x8f, 0xd4, 0xc4, 0x94, 0xd4, 0x22, 0x21, 0x15, 0x2e, 0xde, 0xb4, 0xcc, 0xa2, 0xe2,
|
0x60, 0x09, 0x8f, 0xd4, 0xc4, 0x94, 0xd4, 0x22, 0x21, 0x15, 0x2e, 0xde, 0xb4, 0xcc, 0xa2, 0xe2,
|
||||||
0x92, 0xa0, 0xd4, 0xe4, 0xfc, 0xa2, 0x14, 0xcf, 0x14, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xce, 0x20,
|
0x12, 0xe7, 0x8c, 0xc4, 0xbc, 0xf4, 0x54, 0xcf, 0x14, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xce, 0x20,
|
||||||
0x54, 0x41, 0x21, 0x05, 0x2e, 0xee, 0xcc, 0xe2, 0xf0, 0xfc, 0xa2, 0xec, 0xe2, 0x82, 0xc4, 0xe4,
|
0x54, 0x41, 0x21, 0x05, 0x2e, 0xee, 0xcc, 0xe2, 0xf0, 0xfc, 0xa2, 0xec, 0xe2, 0x82, 0xc4, 0xe4,
|
||||||
0x54, 0x09, 0x26, 0x05, 0x46, 0x0d, 0x8e, 0x20, 0x64, 0x21, 0x27, 0x99, 0x13, 0x8f, 0xe4, 0x18,
|
0x54, 0x09, 0x26, 0x05, 0x46, 0x0d, 0x8e, 0x20, 0x64, 0x21, 0x27, 0x99, 0x13, 0x8f, 0xe4, 0x18,
|
||||||
0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5,
|
0x2f, 0x3c, 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5,
|
||||||
0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x62, 0x2a, 0x48, 0x4a, 0x62, 0x03, 0xbb, 0xc2, 0x18, 0x10,
|
0x18, 0x6e, 0x3c, 0x96, 0x63, 0x88, 0x62, 0x2a, 0x48, 0x4a, 0x62, 0x03, 0xbb, 0xc2, 0x18, 0x10,
|
||||||
0x00, 0x00, 0xff, 0xff, 0x05, 0x80, 0xf4, 0xa3, 0xa6, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0xff, 0xff, 0x2a, 0xae, 0x9d, 0xc2, 0xa6, 0x00, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ThreadHeader) Marshal() (dAtA []byte, err error) {
|
func (m *ThreadHeader) Marshal() (dAtA []byte, err error) {
|
||||||
@ -124,10 +124,10 @@ func (m *ThreadHeader) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
|||||||
i--
|
i--
|
||||||
dAtA[i] = 0x10
|
dAtA[i] = 0x10
|
||||||
}
|
}
|
||||||
if len(m.FirstRecordId) > 0 {
|
if len(m.FirstChangeId) > 0 {
|
||||||
i -= len(m.FirstRecordId)
|
i -= len(m.FirstChangeId)
|
||||||
copy(dAtA[i:], m.FirstRecordId)
|
copy(dAtA[i:], m.FirstChangeId)
|
||||||
i = encodeVarintThread(dAtA, i, uint64(len(m.FirstRecordId)))
|
i = encodeVarintThread(dAtA, i, uint64(len(m.FirstChangeId)))
|
||||||
i--
|
i--
|
||||||
dAtA[i] = 0xa
|
dAtA[i] = 0xa
|
||||||
}
|
}
|
||||||
@ -151,7 +151,7 @@ func (m *ThreadHeader) Size() (n int) {
|
|||||||
}
|
}
|
||||||
var l int
|
var l int
|
||||||
_ = l
|
_ = l
|
||||||
l = len(m.FirstRecordId)
|
l = len(m.FirstChangeId)
|
||||||
if l > 0 {
|
if l > 0 {
|
||||||
n += 1 + l + sovThread(uint64(l))
|
n += 1 + l + sovThread(uint64(l))
|
||||||
}
|
}
|
||||||
@ -198,7 +198,7 @@ func (m *ThreadHeader) Unmarshal(dAtA []byte) error {
|
|||||||
switch fieldNum {
|
switch fieldNum {
|
||||||
case 1:
|
case 1:
|
||||||
if wireType != 2 {
|
if wireType != 2 {
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field FirstRecordId", wireType)
|
return fmt.Errorf("proto: wrong wireType = %d for field FirstChangeId", wireType)
|
||||||
}
|
}
|
||||||
var stringLen uint64
|
var stringLen uint64
|
||||||
for shift := uint(0); ; shift += 7 {
|
for shift := uint(0); ; shift += 7 {
|
||||||
@ -226,7 +226,7 @@ func (m *ThreadHeader) Unmarshal(dAtA []byte) error {
|
|||||||
if postIndex > l {
|
if postIndex > l {
|
||||||
return io.ErrUnexpectedEOF
|
return io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
m.FirstRecordId = string(dAtA[iNdEx:postIndex])
|
m.FirstChangeId = string(dAtA[iNdEx:postIndex])
|
||||||
iNdEx = postIndex
|
iNdEx = postIndex
|
||||||
case 2:
|
case 2:
|
||||||
if wireType != 0 {
|
if wireType != 0 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user