/
message.go
111 lines (96 loc) · 3.14 KB
/
message.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package ipldbind
import (
_ "embed"
cid "github.com/ipfs/go-cid"
"github.com/ipld/go-ipld-prime/datamodel"
bindnoderegistry "github.com/ipld/go-ipld-prime/node/bindnode/registry"
"github.com/ipfs/go-graphsync"
"github.com/ipfs/go-graphsync/message"
)
//go:embed schema.ipldsch
var embedSchema []byte
var BindnodeRegistry = bindnoderegistry.NewRegistry()
// GraphSyncExtensions is a container for representing extension data for
// bindnode, it's converted to a graphsync.ExtensionData list by
// ToExtensionsList()
type GraphSyncExtensions struct {
Keys []string
Values map[string]*datamodel.Node
}
// NewGraphSyncExtensions creates GraphSyncExtensions from either a request or
// response object
func NewGraphSyncExtensions(part message.MessagePartWithExtensions) *GraphSyncExtensions {
names := part.ExtensionNames()
if len(names) == 0 {
return nil
}
keys := make([]string, 0, len(names))
values := make(map[string]*datamodel.Node, len(names))
for _, name := range names {
keys = append(keys, string(name))
data, _ := part.Extension(graphsync.ExtensionName(name))
if data == nil {
values[string(name)] = nil
} else {
values[string(name)] = &data
}
}
return &GraphSyncExtensions{keys, values}
}
// ToExtensionsList creates a list of graphsync.ExtensionData objects from a
// GraphSyncExtensions
func (gse GraphSyncExtensions) ToExtensionsList() []graphsync.ExtensionData {
exts := make([]graphsync.ExtensionData, 0, len(gse.Values))
for name, data := range gse.Values {
if data == nil {
exts = append(exts, graphsync.ExtensionData{Name: graphsync.ExtensionName(name), Data: nil})
} else {
exts = append(exts, graphsync.ExtensionData{Name: graphsync.ExtensionName(name), Data: *data})
}
}
return exts
}
// GraphSyncRequest is a struct to capture data on a request contained in a
// GraphSyncMessage.
type GraphSyncRequest struct {
Id []byte
RequestType graphsync.RequestType
Priority *graphsync.Priority
Root *cid.Cid
Selector *datamodel.Node
Extensions *GraphSyncExtensions
}
// GraphSyncResponse is an struct to capture data on a response sent back
// in a GraphSyncMessage.
type GraphSyncResponse struct {
Id []byte
Status graphsync.ResponseStatusCode
Metadata *[]message.GraphSyncLinkMetadatum
Extensions *GraphSyncExtensions
}
// GraphSyncBlock is a container for representing extension data for bindnode,
// it's converted to a block.Block by the message translation layer
type GraphSyncBlock struct {
Prefix []byte
Data []byte
}
// GraphSyncMessage is a container for representing extension data for bindnode,
// it's converted to a message.GraphSyncMessage by the message translation layer
type GraphSyncMessage struct {
Requests *[]GraphSyncRequest
Responses *[]GraphSyncResponse
Blocks *[]GraphSyncBlock
}
type GraphSyncMessageRoot struct {
Gs2 *GraphSyncMessage
}
// NamedExtension exists just for the purpose of the constructors
type NamedExtension struct {
Name graphsync.ExtensionName
Data datamodel.Node
}
func init() {
if err := BindnodeRegistry.RegisterType((*GraphSyncMessageRoot)(nil), string(embedSchema), "GraphSyncMessageRoot"); err != nil {
panic(err.Error())
}
}