-
Notifications
You must be signed in to change notification settings - Fork 0
/
content_storage_wrapper.go
71 lines (59 loc) · 2.09 KB
/
content_storage_wrapper.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Package messagestorage defines a storage wrapper for handling PDCL messages.
package messagestorage
import (
"context"
"fmt"
"github.com/ipfs/go-cid"
"google.golang.org/protobuf/proto"
"github.com/areknoster/public-distributed-commit-log/pdcl"
"github.com/areknoster/public-distributed-commit-log/storage"
)
// contentStorageWrapper creates MessageStorage based on ContentStorage implementation
type contentStorageWrapper struct {
storage.MessageReader
storage.MessageWriter
}
func NewContentStorageWrapper(contentStorage storage.ContentStorage, codec storage.Codec) storage.MessageStorage {
return &contentStorageWrapper{
MessageReader: NewContentReaderWrapper(contentStorage, codec),
MessageWriter: NewContentWriterWrapper(contentStorage, codec),
}
}
type contentReaderWrapper struct {
reader storage.ContentReader
decoder storage.Decoder
}
func NewContentReaderWrapper(contentReader storage.ContentReader, decoder storage.Decoder) storage.MessageReader {
return &contentReaderWrapper{
reader: contentReader,
decoder: decoder,
}
}
func (p *contentReaderWrapper) Read(ctx context.Context, cid cid.Cid) (storage.ProtoDecodable, error) {
content, err := p.reader.Read(ctx, cid)
if err != nil {
return nil, fmt.Errorf("read message from content storage: %w", err)
}
return p.decoder.Decode(content), nil
}
type contentWriterWrapper struct {
writer storage.ContentWriter
encoder storage.Encoder
}
func NewContentWriterWrapper(writer storage.ContentWriter, encoder storage.Encoder) *contentWriterWrapper {
return &contentWriterWrapper{writer: writer, encoder: encoder}
}
func (p *contentWriterWrapper) Write(ctx context.Context, message proto.Message) (cid.Cid, error) {
encoded, err := p.encoder.Encode(message)
if err != nil {
return cid.Cid{}, fmt.Errorf("marshall message: %w", err)
}
messageCID, err := pdcl.CID(encoded)
if err != nil {
return cid.Cid{}, fmt.Errorf("get CID from mashalled message: %s", err)
}
if err := p.writer.Write(ctx, encoded, messageCID); err != nil {
return cid.Cid{}, fmt.Errorf("write message to content storage: %w", err)
}
return messageCID, nil
}