github.com/celestiaorg/celestia-node@v0.15.0-beta.1/nodebuilder/p2p/addrs.go (about)

     1  package p2p
     2  
     3  import (
     4  	"fmt"
     5  
     6  	p2pconfig "github.com/libp2p/go-libp2p/config"
     7  	hst "github.com/libp2p/go-libp2p/core/host"
     8  	ma "github.com/multiformats/go-multiaddr"
     9  )
    10  
    11  // Listen returns invoke function that starts listening for inbound connections with libp2p.Host.
    12  func Listen(listen []string) func(h hst.Host) (err error) {
    13  	return func(h hst.Host) (err error) {
    14  		maListen := make([]ma.Multiaddr, len(listen))
    15  		for i, addr := range listen {
    16  			maListen[i], err = ma.NewMultiaddr(addr)
    17  			if err != nil {
    18  				return fmt.Errorf("failure to parse config.P2P.ListenAddresses: %s", err)
    19  			}
    20  		}
    21  		return h.Network().Listen(maListen...)
    22  	}
    23  }
    24  
    25  // addrsFactory returns a constructor for AddrsFactory.
    26  func addrsFactory(announce []string, noAnnounce []string) func() (_ p2pconfig.AddrsFactory, err error) {
    27  	return func() (_ p2pconfig.AddrsFactory, err error) {
    28  		// Convert maAnnounce strings to Multiaddresses
    29  		maAnnounce := make([]ma.Multiaddr, len(announce))
    30  		for i, addr := range announce {
    31  			maAnnounce[i], err = ma.NewMultiaddr(addr)
    32  			if err != nil {
    33  				return nil, fmt.Errorf("failure to parse config.P2P.AnnounceAddresses: %s", err)
    34  			}
    35  		}
    36  
    37  		// TODO(@Wondertan): Support filtering with network masks for noAnnounce, e.g. 255.255.255.0
    38  		// Collect all addresses that should not be announced
    39  		maNoAnnounce := make(map[string]bool, len(noAnnounce))
    40  		for _, addr := range noAnnounce {
    41  			maddr, err := ma.NewMultiaddr(addr)
    42  			if err != nil {
    43  				return nil, fmt.Errorf("failure to parse config.P2P.NoAnnounceAddresses: %s", err)
    44  			}
    45  			maNoAnnounce[string(maddr.Bytes())] = true
    46  		}
    47  
    48  		return func(maListen []ma.Multiaddr) []ma.Multiaddr {
    49  			// copy maAnnounce to out
    50  			out := make([]ma.Multiaddr, 0, len(maAnnounce)+len(maListen))
    51  			out = append(out, maAnnounce...)
    52  
    53  			// filter out unneeded
    54  			for _, maddr := range maListen {
    55  				ok := maNoAnnounce[string(maddr.Bytes())]
    56  				if !ok {
    57  					out = append(out, maddr)
    58  				}
    59  			}
    60  			return out
    61  		}, nil
    62  	}
    63  }