func handshakeFromP2PMessage()

in lib/torrent/scheduler/conn/handshaker.go [97:134]


func handshakeFromP2PMessage(m *p2p.Message) (*handshake, error) {
	if m.Type != p2p.Message_BITFIELD {
		return nil, fmt.Errorf("expected bitfield message, got %s", m.Type)
	}
	bitfieldMsg := m.GetBitfield()
	if bitfieldMsg == nil {
		return nil, fmt.Errorf("empty bit field")
	}
	peerID, err := core.NewPeerID(bitfieldMsg.PeerID)
	if err != nil {
		return nil, fmt.Errorf("peer id: %s", err)
	}
	ih, err := core.NewInfoHashFromHex(bitfieldMsg.InfoHash)
	if err != nil {
		return nil, fmt.Errorf("info hash: %s", err)
	}
	d, err := core.NewSHA256DigestFromHex(bitfieldMsg.Name)
	if err != nil {
		return nil, fmt.Errorf("name: %s", err)
	}
	bitfield := bitset.New(0)
	if err := bitfield.UnmarshalBinary(bitfieldMsg.BitfieldBytes); err != nil {
		return nil, err
	}
	remoteBitfields := make(RemoteBitfields)
	if err := remoteBitfields.unmarshalBinary(bitfieldMsg.RemoteBitfieldBytes); err != nil {
		return nil, err
	}

	return &handshake{
		peerID:          peerID,
		infoHash:        ih,
		bitfield:        bitfield,
		digest:          d,
		namespace:       bitfieldMsg.Namespace,
		remoteBitfields: remoteBitfields,
	}, nil
}