github.com/zignig/go-ipfs@v0.0.0-20141111235910-c9e5fdf55a52/exchange/bitswap/network/net_message_adapter.go (about) 1 package network 2 3 import ( 4 "errors" 5 6 context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" 7 "github.com/jbenet/go-ipfs/util" 8 9 bsmsg "github.com/jbenet/go-ipfs/exchange/bitswap/message" 10 inet "github.com/jbenet/go-ipfs/net" 11 netmsg "github.com/jbenet/go-ipfs/net/message" 12 peer "github.com/jbenet/go-ipfs/peer" 13 ) 14 15 var log = util.Logger("net_message_adapter") 16 17 // NetMessageAdapter wraps a NetMessage network service 18 func NetMessageAdapter(s inet.Service, n inet.Network, r Receiver) Adapter { 19 adapter := impl{ 20 nms: s, 21 net: n, 22 receiver: r, 23 } 24 s.SetHandler(&adapter) 25 return &adapter 26 } 27 28 // implements an Adapter that integrates with a NetMessage network service 29 type impl struct { 30 nms inet.Service 31 net inet.Network 32 33 // inbound messages from the network are forwarded to the receiver 34 receiver Receiver 35 } 36 37 // HandleMessage marshals and unmarshals net messages, forwarding them to the 38 // BitSwapMessage receiver 39 func (adapter *impl) HandleMessage( 40 ctx context.Context, incoming netmsg.NetMessage) netmsg.NetMessage { 41 42 if adapter.receiver == nil { 43 return nil 44 } 45 46 received, err := bsmsg.FromNet(incoming) 47 if err != nil { 48 go adapter.receiver.ReceiveError(err) 49 return nil 50 } 51 52 p, bsmsg := adapter.receiver.ReceiveMessage(ctx, incoming.Peer(), received) 53 54 // TODO(brian): put this in a helper function 55 if bsmsg == nil || p == nil { 56 adapter.receiver.ReceiveError(errors.New("ReceiveMessage returned nil peer or message")) 57 return nil 58 } 59 60 outgoing, err := bsmsg.ToNet(p) 61 if err != nil { 62 go adapter.receiver.ReceiveError(err) 63 return nil 64 } 65 66 log.Debugf("Message size: %d", len(outgoing.Data())) 67 return outgoing 68 } 69 70 func (adapter *impl) DialPeer(ctx context.Context, p peer.Peer) error { 71 return adapter.net.DialPeer(ctx, p) 72 } 73 74 func (adapter *impl) SendMessage( 75 ctx context.Context, 76 p peer.Peer, 77 outgoing bsmsg.BitSwapMessage) error { 78 79 nmsg, err := outgoing.ToNet(p) 80 if err != nil { 81 return err 82 } 83 return adapter.nms.SendMessage(ctx, nmsg) 84 } 85 86 func (adapter *impl) SendRequest( 87 ctx context.Context, 88 p peer.Peer, 89 outgoing bsmsg.BitSwapMessage) (bsmsg.BitSwapMessage, error) { 90 91 outgoingMsg, err := outgoing.ToNet(p) 92 if err != nil { 93 return nil, err 94 } 95 incomingMsg, err := adapter.nms.SendRequest(ctx, outgoingMsg) 96 if err != nil { 97 return nil, err 98 } 99 return bsmsg.FromNet(incomingMsg) 100 } 101 102 func (adapter *impl) SetDelegate(r Receiver) { 103 adapter.receiver = r 104 }