/
transfer_request.go
147 lines (122 loc) · 4.22 KB
/
transfer_request.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package message1_1
import (
"io"
"github.com/ipfs/go-cid"
"github.com/ipld/go-ipld-prime/codec/dagcbor"
"github.com/ipld/go-ipld-prime/datamodel"
"github.com/ipld/go-ipld-prime/schema"
"github.com/libp2p/go-libp2p-core/protocol"
xerrors "golang.org/x/xerrors"
datatransfer "github.com/filecoin-project/go-data-transfer"
"github.com/filecoin-project/go-data-transfer/encoding"
"github.com/filecoin-project/go-data-transfer/message/types"
)
// TransferRequest1_1 is a struct for the 1.1 Data Transfer Protocol that fulfills the datatransfer.Request interface.
// its members are exported to be used by cbor-gen
type TransferRequest1_1 struct {
BaseCidPtr *cid.Cid
MessageType uint64
Pause bool
Partial bool
Pull bool
SelectorPtr *datamodel.Node
VoucherPtr *datamodel.Node
VoucherTypeIdentifier datatransfer.TypeIdentifier
TransferId uint64
RestartChannel datatransfer.ChannelID
}
func (trq *TransferRequest1_1) MessageForProtocol(targetProtocol protocol.ID) (datatransfer.Message, error) {
switch targetProtocol {
case datatransfer.ProtocolDataTransfer1_2:
return trq, nil
default:
return nil, xerrors.Errorf("protocol not supported")
}
}
// IsRequest always returns true in this case because this is a transfer request
func (trq *TransferRequest1_1) IsRequest() bool {
return true
}
func (trq *TransferRequest1_1) IsRestart() bool {
return trq.MessageType == uint64(types.RestartMessage)
}
func (trq *TransferRequest1_1) IsRestartExistingChannelRequest() bool {
return trq.MessageType == uint64(types.RestartExistingChannelRequestMessage)
}
func (trq *TransferRequest1_1) RestartChannelId() (datatransfer.ChannelID, error) {
if !trq.IsRestartExistingChannelRequest() {
return datatransfer.ChannelID{}, xerrors.New("not a restart request")
}
return trq.RestartChannel, nil
}
func (trq *TransferRequest1_1) IsNew() bool {
return trq.MessageType == uint64(types.NewMessage)
}
func (trq *TransferRequest1_1) IsUpdate() bool {
return trq.MessageType == uint64(types.UpdateMessage)
}
func (trq *TransferRequest1_1) IsVoucher() bool {
return trq.MessageType == uint64(types.VoucherMessage) || trq.MessageType == uint64(types.NewMessage)
}
func (trq *TransferRequest1_1) IsPaused() bool {
return trq.Pause
}
func (trq *TransferRequest1_1) TransferID() datatransfer.TransferID {
return datatransfer.TransferID(trq.TransferId)
}
// ========= datatransfer.Request interface
// IsPull returns true if this is a data pull request
func (trq *TransferRequest1_1) IsPull() bool {
return trq.Pull
}
// VoucherType returns the Voucher ID
func (trq *TransferRequest1_1) VoucherType() datatransfer.TypeIdentifier {
return trq.VoucherTypeIdentifier
}
// Voucher returns the Voucher bytes
func (trq *TransferRequest1_1) Voucher(decoder encoding.Decoder) (encoding.Encodable, error) {
if trq.VoucherPtr == nil {
return nil, xerrors.New("No voucher present to read")
}
return decoder.DecodeFromNode(*trq.VoucherPtr)
}
func (trq *TransferRequest1_1) EmptyVoucher() bool {
return trq.VoucherTypeIdentifier == datatransfer.EmptyTypeIdentifier
}
// BaseCid returns the Base CID
func (trq *TransferRequest1_1) BaseCid() cid.Cid {
if trq.BaseCidPtr == nil {
return cid.Undef
}
return *trq.BaseCidPtr
}
// Selector returns the message Selector bytes
func (trq *TransferRequest1_1) Selector() (datamodel.Node, error) {
if trq.SelectorPtr == nil {
return nil, xerrors.New("No selector present to read")
}
return *trq.SelectorPtr, nil
}
// IsCancel returns true if this is a cancel request
func (trq *TransferRequest1_1) IsCancel() bool {
return trq.MessageType == uint64(types.CancelMessage)
}
// IsPartial returns true if this is a partial request
func (trq *TransferRequest1_1) IsPartial() bool {
return trq.Partial
}
func (trsp *TransferRequest1_1) toIPLD() schema.TypedNode {
msg := TransferMessage1_1{
IsRequest: true,
Request: trsp,
Response: nil,
}
return msg.toIPLD()
}
func (trq *TransferRequest1_1) ToIPLD() (datamodel.Node, error) {
return trq.toIPLD().Representation(), nil
}
// ToNet serializes a transfer request.
func (trq *TransferRequest1_1) ToNet(w io.Writer) error {
return dagcbor.Encode(trq.toIPLD().Representation(), w)
}