mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-25 20:37:53 +08:00
94 lines
2.0 KiB
Go
94 lines
2.0 KiB
Go
package message
|
|
|
|
import (
|
|
proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto"
|
|
blocks "github.com/jbenet/go-ipfs/blocks"
|
|
netmsg "github.com/jbenet/go-ipfs/net/message"
|
|
nm "github.com/jbenet/go-ipfs/net/message"
|
|
peer "github.com/jbenet/go-ipfs/peer"
|
|
u "github.com/jbenet/go-ipfs/util"
|
|
)
|
|
|
|
type BitSwapMessage interface {
|
|
Wantlist() []u.Key
|
|
Blocks() []blocks.Block
|
|
AppendWanted(k u.Key)
|
|
AppendBlock(b blocks.Block)
|
|
Exportable
|
|
}
|
|
|
|
type Exportable interface {
|
|
ToProto() *PBMessage
|
|
ToNet(p *peer.Peer) (nm.NetMessage, error)
|
|
}
|
|
|
|
// message wraps a proto message for convenience
|
|
type message struct {
|
|
wantlist []u.Key
|
|
blocks []blocks.Block
|
|
}
|
|
|
|
func New() *message {
|
|
return new(message)
|
|
}
|
|
|
|
func newMessageFromProto(pbm PBMessage) (BitSwapMessage, error) {
|
|
m := New()
|
|
for _, s := range pbm.GetWantlist() {
|
|
m.AppendWanted(u.Key(s))
|
|
}
|
|
for _, d := range pbm.GetBlocks() {
|
|
b, err := blocks.NewBlock(d)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
m.AppendBlock(*b)
|
|
}
|
|
return m, nil
|
|
}
|
|
|
|
// TODO(brian): convert these into keys
|
|
func (m *message) Wantlist() []u.Key {
|
|
return m.wantlist
|
|
}
|
|
|
|
// TODO(brian): convert these into blocks
|
|
func (m *message) Blocks() []blocks.Block {
|
|
return m.blocks
|
|
}
|
|
|
|
func (m *message) AppendWanted(k u.Key) {
|
|
m.wantlist = append(m.wantlist, k)
|
|
}
|
|
|
|
func (m *message) AppendBlock(b blocks.Block) {
|
|
m.blocks = append(m.blocks, b)
|
|
}
|
|
|
|
func FromNet(nmsg netmsg.NetMessage) (BitSwapMessage, error) {
|
|
pb := new(PBMessage)
|
|
if err := proto.Unmarshal(nmsg.Data(), pb); err != nil {
|
|
return nil, err
|
|
}
|
|
m, err := newMessageFromProto(*pb)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return m, nil
|
|
}
|
|
|
|
func (m *message) ToProto() *PBMessage {
|
|
pb := new(PBMessage)
|
|
for _, k := range m.Wantlist() {
|
|
pb.Wantlist = append(pb.Wantlist, string(k))
|
|
}
|
|
for _, b := range m.Blocks() {
|
|
pb.Blocks = append(pb.Blocks, b.Data)
|
|
}
|
|
return pb
|
|
}
|
|
|
|
func (m *message) ToNet(p *peer.Peer) (nm.NetMessage, error) {
|
|
return nm.FromObject(p, m.ToProto())
|
|
}
|