p2p/net: network interface Listen func
network interface now allows setting Listeners after the fact. This is useful to create the network and start listening as separate steps. And to keep the network up to date on new addresses the node might have to listen to.
Juan Batiz-Benet committed
Jan 30, 2015 at 04:13 UTC
699bf215f98f00c3c01fed49895300150d82d1c5
4 files changed
+39
-6
p2p/net/interface.go
+3
@@ -69,6 +69,9 @@ type Network interface {
69
// If there is no connection to p, attempts to create one.
70
NewStream(peer.ID) (Stream, error)
71
72
+ // Listen tells the network to start listening on given multiaddrs.
73
+ Listen(...ma.Multiaddr) error
74
+
75
// ListenAddresses returns a list of addresses at which this network listens.
76
ListenAddresses() []ma.Multiaddr
77
p2p/net/mock/mock_peernet.go
+6
@@ -305,6 +305,12 @@ func (pn *peernet) BandwidthTotals() (in uint64, out uint64) {
305
return 0, 0
306
}
307
308
+// Listen tells the network to start listening on given multiaddrs.
309
+func (pn *peernet) Listen(addrs ...ma.Multiaddr) error {
310
+ pn.Peerstore().AddAddresses(pn.LocalPeer(), addrs)
311
+ return nil
312
+}
313
+
314
// ListenAddresses returns a list of addresses at which this network listens.
315
func (pn *peernet) ListenAddresses() []ma.Multiaddr {
316
return pn.Peerstore().Addresses(pn.LocalPeer())
p2p/net/swarm/swarm.go
+25
-6
@@ -49,12 +49,9 @@ type Swarm struct {
49
func NewSwarm(ctx context.Context, listenAddrs []ma.Multiaddr,
50
local peer.ID, peers peer.Peerstore) (*Swarm, error) {
51
52
- if len(listenAddrs) > 0 {
53
- filtered := addrutil.FilterUsableAddrs(listenAddrs)
54
- if len(filtered) < 1 {
55
- return nil, fmt.Errorf("swarm cannot use any addr in: %s", listenAddrs)
56
- }
57
- listenAddrs = filtered
52
+ listenAddrs, err := filterAddrs(listenAddrs)
53
+ if err != nil {
54
+ return nil, err
55
}
56
57
s := &Swarm{
@@ -77,6 +74,28 @@ func (s *Swarm) teardown() error {
74
return s.swarm.Close()
75
}
76
77
+// CtxGroup returns the Context Group of the swarm
78
+func filterAddrs(listenAddrs []ma.Multiaddr) ([]ma.Multiaddr, error) {
79
+ if len(listenAddrs) > 0 {
80
+ filtered := addrutil.FilterUsableAddrs(listenAddrs)
81
+ if len(filtered) < 1 {
82
+ return nil, fmt.Errorf("swarm cannot use any addr in: %s", listenAddrs)
83
+ }
84
+ listenAddrs = filtered
85
+ }
86
+ return listenAddrs, nil
87
+}
88
+
89
+// CtxGroup returns the Context Group of the swarm
90
+func (s *Swarm) Listen(addrs ...ma.Multiaddr) error {
91
+ addrs, err := filterAddrs(addrs)
92
+ if err != nil {
93
+ return err
94
+ }
95
+
96
+ return s.listen(addrs)
97
+}
98
+
99
// CtxGroup returns the Context Group of the swarm
100
func (s *Swarm) CtxGroup() ctxgroup.ContextGroup {
101
return s.cg
p2p/net/swarm/swarm_net.go
+5
@@ -102,6 +102,11 @@ func (n *Network) Close() error {
102
return n.Swarm().cg.Close()
103
}
104
105
+// Listen tells the network to start listening on given multiaddrs.
106
+func (n *Network) Listen(addrs ...ma.Multiaddr) error {
107
+ return n.Swarm().Listen(addrs...)
108
+}
109
+
110
// ListenAddresses returns a list of addresses at which this network listens.
111
func (n *Network) ListenAddresses() []ma.Multiaddr {
112
return n.Swarm().ListenAddresses()