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  }